stp mr freepicbasic est ce que tu peux m aider à traduire à language assembleur de pic 16F84
-----
stp mr freepicbasic est ce que tu peux m aider à traduire à language assembleur de pic 16F84
Hello as tu pu réaliser ton code? sa marche?
salut triste80,
Je t'ai donné un exemple pour une parti de ton algorithme.
Le but est que tu progresse , et non pas de faire le travail à ta place.
Essais d'appliquer sur le post#60
en mettant le résultat sur le forum, afin de corriger si besoin.
Je te poste ici le code de gestion de feux tricolores dans les grandes lignes, cela correspond a ton utilisation.
Je n'ai pas fait ce code il est livré en exemple avec le livre "apprendre la programmation des PIC par l'expérimantation et la simulation" de Pascal Mayeux paru aux Editions ETSF.
Si il ne te plait pas, fourni moi un cailler des charges complet et je te ferai le code avec toutes les explications.
Ci-Dessous, le contenu du fichier HEX qu'il te sufi de coller dans le bloc-note, de l'enregistrer au format .hex et de l'envoyer au pic.Code:;------------ Exemple d'application avec un PIC : Les feux tricolores --------------- ; Titre : Feux tricolores ; Date : 01 JUILLET 2000 ; Auteur : P.M ; PIC utilisé : PIC 16 F 84 ; On réalise des feux tricolores sur les broches RB0 à RB5 d' un PIC 16 C 84 ; le quartz est de 4 Mhz , on effectue une tempo longue environ égale à 4 secondes et ; une tempo courte environ égale à 1.5 secondes. ; un bouton marche sur le port A permet de lancer l' application ; RB0=rouge1 RB1=orange1 RB2=vert1 ; RB3=rouge2 RB4=orange2 RB5=vert2 ;------------ Directive d' assemblage pour PLAB --------------- list p=16f84A #include p16f84A.inc __config H'3FF9' ;------------ Définition des constantes --------------- #define inter0 0 ; bouton marche #define inter1 1 ; bouton clignotement orange ;------------ Définition des registres temporaires --------------- retard1 EQU 0x0C ; le registre temporaire retard1 se trouve à l' adresse 0C retard2 EQU 0x0F ; le registre temporaire retard2 se trouve à l' adresse 0F retard3 EQU 0x10 ; le registre temporaire retard3 se trouve à l' adresse 10 ;------------ Init des ports A et B --------------- ORG 0 bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder ; à la 2eme page mémoire ( pour trisa et trisb ) MOVLW 0x00 ; on met 00 dans le registre W MOVWF TRISB ; on met 00 dans le port B il est programmé en sortie MOVLW 0x1F ; on met 1F dans le registre W MOVWF TRISA ; on met 1F dans le port A il est programmé en entrée bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder ; à la 1eme page mémoire ;------------ Init des feux ROUGE1 et ROUGE2 --------------- MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 ) MOVWF PORTB ; on met W sur le port B ( led ) ;-------------------- Programme principal ---------------------- debut MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 ) MOVWF PORTB ; on met W sur le port B ( led ) btfss PORTA,inter0 ; interrupteur 0 ( marche ) appuyé ? si oui on continu sinon ;va à debut goto debut ret_cli btfsc PORTA,inter1 ; interrupteur 1 ( clignotant ) appuyé ? si oui on ;va à clignote goto clignote MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 ) MOVWF PORTB ; on met W sur le port B ( led ) ;--------------- Chargement de la temporisation --------------------- CALL tempo ; on appel la temporisation 1 ( longue ) MOVLW B'00001100' ; on met 0C dans le registre W ( Vert1 et Rouge2 ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo ; on appel la temporisation 1 ( longue ) MOVLW B'00001010' ; on met 0A dans le registre W ( Orange1 et Rouge2 ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo2 ; on appel la temporisation courte MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo2 ; on appel la temporisation courte MOVLW B'00100001' ; on met 24 dans le registre W ( Rouge1 et Vert2 ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo ; on appel la temporisation longue MOVLW B'00010001' ; on met 14 dans le registre W ( Rouge1 et Orange2 ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo2 ; on appel la temporisation courte GOTO debut ; retour au début du programme ;------------ Programme de temporisation longue --------------- tempo MOVLW 0xFF ; on met ff dans le registre W MOVWF retard1 ; on met W dans le registre retard1 MOVWF retard2 ; on met W dans le registre retard2 MOVLW 0x12 ; on met 12 dans le registre W MOVWF retard3 ; on met W dans le registre retard3 attente DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction si GOTO attente ; le registre retard1 = 0 sinon retour à attente movlw 0xFF ; on recharge retard1 movwf retard1 DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine instruction si GOTO attente ; le registre retard2 = 0 sinon retour à attente movlw 0xFF ; on recharge retard2 movwf retard2 DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine instruction si GOTO attente ; le registre retard3 = 0 sinon retour à attente RETURN ; retour au programme principal après l 'instruction CALL ;------------ Programme de temporisation courte --------------- tempo2 MOVLW 0xFF ; on met ff dans le registre W MOVWF retard1 ; on met W dans le registre retard1 MOVWF retard2 ; on met W dans le registre retard2 MOVLW 0x07 ; on met 7 dans le registre W MOVWF retard3 ; on met W dans le registre retard3 attente2 DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction si GOTO attente2 ; le registre retard1 = 0 sinon retour à attente2 movlw 0xFF ; on recharge retard1 movwf retard1 DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine instruction si GOTO attente2 ; le registre retard2 = 0 sinon retour à attente2 movlw 0xFF ; on recharge retard2 movwf retard2 DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine instruction si GOTO attente2 ; le registre retard3 = 0 sinon retour à attente2 RETURN clignote MOVLW B'00010010' ; on met 12 dans le registre W ( Orange1 et Orange2 ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo2 ; on appel la temporisation courte MOVLW B'00000000' ; on met 00 dans le registre W ( aucune led ) MOVWF PORTB ; on met W sur le port B ( led ) CALL tempo2 ; on appel la temporisation courte goto ret_cli END
si tu est interrésée je peut t'envoyer par mail le scan du chapitre.Code::100000008316003086001F30850083120930860079 :1000100009308600051C082885184128093086000B :1000200021200C30860021200A3086003120093042 :1000300086003120213086002120113086003120B9 :100040000828FF308C008F00123090008C0B26287F :10005000FF308C008F0B2628FF308F00900B262856 :100060000800FF308C008F00073090008C0B362882 :10007000FF308C008F0B3628FF308F00900B362816 :1000800008001230860031200030860031200C2814 :060600004128C329CC20B3 :02400E00F93F78 :1042000043006C00690067006E006F00740061007D :104210006E0074002C002000760031002E0030006B :0242200000009C :00000001FF
écris moi ici
j ai feu tricolère à base de pic 16F84 ,3leds à portA et 3leds à ports B
RA0=feu vert1
RA1=feu orang1
RA2=feu roug1
les portB
RB5=feu roug2
RB6=feu orang2
RB7=feu vert2
voici ma sequence
temp 1s 9s 4s 9s 4s
VOIEA R R R v O
voieB R V 0 R R
et la nuit seul feu orang allume
voici mon organigramme de mon proget de feux tricolère ;
;debut
;congiguration et initialisation
T3_ cp=5;
i=0
T1
si rb0=1
goto sequence de nuit
;sequence de nuit
i1=0;
i1=2;
rs-T reçoit tab0[i1]
A reçoit tab[i1+1]
B reçoit tab[i1+2]
portA reçoit A
portB reçoit B
tempo(T)
incremente i
dec cpt
si cpt=0 ;no
goto rs
cpt =5
i=0
goto T1
;equenquence de jour
T reçoit tab[i]
A reçoit tab[i+1]
B reçoit tab[i+2]
portA reçoit A
portB reçoit B
tempo (T)
incr i
dec cpt
si cpt=0;
goto T3
goto T1
Si avec toutes les aides que tu as reçu, tu ne sais toujours pas écrire le programme, je ne vois qu'une solution : LAISSE TOMBER L'ELECTRONIQUE
Tu peux toujours essayer d'élever des chèvres !
Comment compte tu passer du mode nuit au mode jour?
Dans tes temps de pause, quelle période correspond a quoi?
Je le comprends comme sa:
pendant ¦ 1s ¦ 9s ¦ 4s ¦ 9s ¦ 4s
1 sur RA ¦ 2 ¦ 2 ¦ 2 ¦ 0 ¦ 1
1 sur RB ¦ 5 ¦ 7 ¦ 6 ¦ 5 ¦ 5
Tu est sûre? Il ne te manque pas des états?
A quelle fréquance clignote l'orange la nuit?
Ton ordinogramme n'est pas clairement compréhansible.
Pour une meilleure compréhantion entre nous, essaie de ne pas utiliser d'abréviations.
oui c est juste se que tu as ècrit et la tempo de la nuit d orange est pour 4s
pendant ¦ 1s ¦ 9s ¦ 4s ¦ 9s ¦ 4s
1 sur RA ¦ 2 2 2 0 1
1 sur RB ¦ 5 7 6 5 5
tempo de nuit 4s
PORTA 1
portB 6
j utilise interipteur Rbo=1 je fait la sequence de nuit au les feux oranges seulement allume peandant tempo de nuit 4s,RB0=0 je fait la sequence de jour
1s:2;5
9s:2;7
4s:2;6
9s:0;5
4s:1;5
voici mon programme il me reste que je fait tempo de 9s;1s et je sais faire
list pic=16f84
# iclude (pic16F84.inc)
_configuration _cp_off,_wdt_off,_pwrte_on,_XT _osc
equivalences de registr
esportA equ 0x0005
portB equ 0x0006
trisA equ 0x0085
trisB equ 0x0086
statut equ 0x0003
constantes
#define BP portB,4
les registres memoires
compt equ 0Ch
compt1 equ 0dh
compt2 equ 0Eh
initialisation
org 00h
goto debut
org 05h
debut
clrf portB
clrf portA
bsf statut,RP0 ;selection de bank1
movlw B'11111000'
movwf trisA
movlw B'11111000'
movwf trisB
bcf statut,RP0 ;accès à bank 0
clrf portA
clrf portB ;extintion des leds
;programme principale
Btfsc potB,0
Goto sequjour
;boucle de la nuit
;ensuite allumer les feux oranges
Bsf PORTA,1
BSF PORTB,1 Call tempo orang_on_nu
etteindres les feux oranges
bcf portA,1
bcf portB,1
call tempo_orang_nuit_off
goto boucle nuit
;sequence de jour
Bcf portA,0 ; bit0=1
Bsf portB;0
Bsf portB,1 ;bit1=2
Bsf portB,1 ;bit1=2
Bcf portB,2 ;bit2=4
Bsf portA,2 ;bit2=4
Call my tempo ;9 s
;on allume le feu roug1 et feu orang2
Bsf portA,0
Bsf portB,1
Call my tempo1 ;4s
;on allum le feu roug2 et feu vert1
Bsf portA,2
Bsf portB,0
Call mytemp1;9s
;On aluume le feu roug2 et feu orang1
Bsf portA,1
Bsf portB,2
Call my temp0;4s
;tempo de 4s
Movlw 0x0028 ; chargemt de compteur par 30
Movwf compt2
T1
Movlw 0x00c8 ; chargement par 200
Movwf compt1
T2
Movlw 0x00A5
Movwf compt
T3
Decfsz compt,1
T3 Goto
Decfsz compt1,1
Goto T3
Decfsz compt2,1
Goto T3
return
Le modif sont précédées de ";#############".
Les commentaires doivent être précédés par un ";"!
Lorsqu'on fait un goto ou un call!
L'étiquette qui est derrière doit existée !
le programme principale n'avait pas de fin ou de re-bouclage!
J'ai créé une étiquette main avec un "goto main"
différentes erreur de syntaxe corrigées
la tempo de clignotement n'existait pas !
Je l'ai créé a la fin , on change que le poids fort du compteur.
j'ai divisé 0x28 par 8 pour avoir 1/2 sec au lieu de 4s.
la tempo de 9s n'existait pas!
la seconde tempo de 9s a été ramené à 8s
afin de faire 2 call à la procédure de 4s.
Ne pas confondre 0 et o !
l'étiquette "T2" est inutile !
le bouton est "define BP" alors qu'on test PORTB,0 !
Voir le problème quelle est le bon ?
l'adresse 0x004 est l'adresse int
mettre un retfie juste au cas ou...
ça coute rien.
Je n'ai pas testé ce code ,
et je ne suis pas infaillible,
peut être reste t il des erreurs...
je n'ai pas vérifié les bcf , bsf ...
Code:List pic=16f84 # include (pic16F84.inc) _configuration _cp_off,_wdt_off,_pwrte_on,_XT _osc ;############# ;equivalences de registres portA equ 0x0005 portB equ 0x0006 trisA equ 0x0085 trisB equ 0x0086 statut equ 0x0003 ;############# ;constantes #define BP portB,4 ;############# ;les registres memoires compt equ 0Ch compt1 equ 0dh compt2 equ 0Eh initialisation org 00h goto debut ;############# org 04h retfie org 05h debut clrf portB clrf portA bsf statut,RP0 ;selection de bank1 movlw B'11111000' movwf trisA movlw B'11111000' movwf trisB bcf statut,RP0 ;accès à bank 0 clrf portA clrf portB ;extintion des leds ;programme principale ;############# main ;############# ;Btfsc potB,0 Btfsc portB,0 ;??? BOUTON??? a quoi sert le define BP ??? Goto sequjour ;boucle de la nuit ;ensuite allumer les feux oranges Bsf PORTA,1 BSF PORTB,1 ;############# Call tempo tempo_orang_nuit ;############# ;etteindres les feux oranges bcf portA,1 bcf portB,1 call tempo_orang_nuit goto boucle nuit ;############# sequjour ;sequence de jour Bcf portA,0 ; bit0=1 Bsf portB;0 Bsf portB,1 ;bit1=2 Bsf portB,1 ;bit1=2 Bcf portB,2 ;bit2=4 Bsf portA,2 ;bit2=4 ;############# Call mytempo1 ;8 s ;on allume le feu roug1 et feu orang2 Bsf portA,0 Bsf portB,1 ;############# Call mytempo ;4s ;on allum le feu roug2 et feu vert1 Bsf portA,2 Bsf portB,0 ;############# Call mytemp1;8s ;On aluume le feu roug2 et feu orang1 Bsf portA,1 Bsf portB,2 ;############# Call mytempo;4s ;############# goto main ;############# mytemp1;8s Call mytemp0;4s Call mytemp0;4s return ;############# mytemp0;4s ;tempo de 4s Movlw 0x0028 ; chargement de compteur par 30 Movwf compt2 T1 Movlw 0x00c8 ; chargement par 200 Movwf compt1 T2 Movlw 0x00A5 Movwf compt T3 ;############# Decfsz compt,1 Goto T3 Decfsz compt1,1 Goto T3 Decfsz compt2,1 Goto T3 return ;############# tempo_orang_nuit ;tempo de 500ms Movlw 0x005 ; chargement de compteur par 5 Movwf compt2 goto T1
# define BP portB,0 c est celui qui de separer entre le sequence de jour et la nuit
mais je declare que RB0 c est une interuption
Bsf portA,0 ; bit0=1
Bcf portB;0
Bcf portB,1 ;bit1=2
Bcf portB,1 ;bit1=2
Bsf portB,2 ;bit2=4
Bcf portA,2 ;bit2=4
car seulemnt le feu roug1 et feu vert2 allume
tu n as pas terminè le tempo de 500ms je le termine comme ça
tempo_orang_nuit
;tempo de 500ms
Movlw 0x005 ; chargement de compteur par 5
Movwf compt2
goto T1
Movlw 0x00c8 ; chargement par 200
Movwf compt1
T2
Movlw 0x00A5
Movwf compt
T3
;#############
Decfsz compt,1
Goto T3
Decfsz compt1,1
Goto T3
Decfsz compt2,1
Goto T3
return
quel est utilitè de T1,T2 c est une etiquet mais on rien fais d eux
List pic=16f84
# include (pic16F84.inc)
_configuration _cp_off,_wdt_off,_pwrte_on,_XT _osc
;#############
;equivalences de registres
portA equ 0x0005
portB equ 0x0006
trisA equ 0x0085
trisB equ 0x0086
statut equ 0x0003
;#############
;constantes
#define BP portB,4
;#############
;les registres memoires
compt equ 0Ch
compt1 equ 0dh
compt2 equ 0Eh
initialisation
org 00h
goto debut
;#############
org 04h
retfie
org 05h
debut
clrf portB
clrf portA
bsf statut,RP0 ;selection de bank1
movlw B'11111000'
movwf trisA
movlw B'11111000'
movwf trisB
bcf statut,RP0 ;accès à bank 0
clrf portA
clrf portB ;extintion des leds
;programme principale
;#############
main
;#############
;Btfsc potB,0
Btfsc portB,0
Goto sequjour
;boucle de la nuit
;ensuite allumer les feux oranges
Bsf PORTA,1
BSF PORTB,1
;#############
Call tempo tempo_orang_nuit
;#############
;etteindres les feux oranges
bcf portA,1
bcf portB,1
call tempo_orang_nuit
goto boucle de la nuit
;#############
sequjour
;sequence de jour
Bsf portA,0 ; bit0=1
Bcf portB,0
Bcf portB,1 ;bit1=2
Bcf portB,1 ;bit1=2
Bsf portB,2 ;bit2=4
Bcf portA,2 ;bit2=4
;#############
Call mytempo1 ;8 s
;on allume le feu roug1 et feu orang2
Bsf portA,0
Bsf portB,1
;#############
Call mytempo ;4s
;on allum le feu roug2 et feu vert1
Bsf portA,2
Bsf portB,0
;#############
Call mytemp1;8s
;On aluume le feu roug2 et feu orang1
Bsf portA,1
Bsf portB,2
;#############
Call mytempo;4s
;#############
goto main
;#############
mytemp1;8s
Call mytemp0;4s
Call mytemp0;4s
return
;#############
mytemp0;4s
;tempo de 4s
Movlw 0x0028 ; chargement de compteur par 40
Movwf compt2
T1
Movlw 0x00c8 ; chargement par 200
Movwf compt1
T2
Movlw 0x00A5
Movwf compt
T3
;#############
Decfsz compt,1
Goto T3
Decfsz compt1,1
Goto T2
Decfsz compt2,1
Goto T2
return
;#############
tempo_orang_nuit
;tempo de 500ms
Movlw 0x005 ; chargement de compteur par 5
Movwf compt2
T1
Movlw 0x00c8 ; chargement par 200
Movwf compt1
T2
Movlw 0x00A5
Movwf compt
T3
;#############
Decfsz compt,1
Goto T3
Decfsz compt1,1
Goto T3
Decfsz compt2,1
Goto T3
Return
end
tu ne peux pas utiliser 2 fois la même étiquette. (T1, T2,T3)tu n as pas terminè le tempo de 500ms je le termine comme ça
tempo_orang_nuit
;tempo de 500ms
Movlw 0x005 ; chargement de compteur par 5
Movwf compt2
goto T1
Movlw 0x00c8 ; chargement par 200
Movwf compt1
T2
Movlw 0x00A5
Movwf compt
T3
;#############
Decfsz compt,1
Goto T3
Decfsz compt1,1
Goto T3
Decfsz compt2,1
Goto T3
return
goto T1 permet d'économiser un code identique !
C'est faux !
La routine était terminé mais une parti était commune !
comme elles finissent par return , elles retournent au bon call !
si tu veux utiliser une interruption il faut une routine d'interruption !
il n'y en a pas !
un simple pooling suffit , comme ici "
Btfsc portB,0
alors suprimer le define BP inutile
suprimer les lignes inutiles aussi ...
mais quel est le role de goto etiquet T1 il n y as pas etiquet T1 et etiquet T2
mais je viens auqun utilitè de ètiquette T2
voir le dessin ci joint
le return en bleu est commun au 2 procédures.
En vert le cheminement des 2 procédures !
il y as dans le tempo etiquette T2 mais je ne vois pas go to etiquette T2 pour que je le faire
merci j ai compris le desin il sert à economiser mon programme au lieu de faire 2 fois etiquette
j ai movlw B'11111000'
movwf portB
j ai utiliser RB0 comme une sortie on mème temps comme un interpteur
qu est ce que je fait maintenant j utilise rb0 comme interpteur et je change le programme
Utilise RB3 ou RB4 comme c'était prévu avec ton define.j ai movlw B'11111000'
movwf portB
j ai utiliser RB0 comme une sortie on mème temps comme un interpteur
qu est ce que je fait maintenant j utilise rb0 comme interpteur et je change le programme
au lieu deCode:btfsc PORTB,4 Goto sequjour
Code:Btfsc portB,0 Goto sequjour
quel est utilitè de ètiquet T2 dans tempo il n y as pas goto T2
je veux comprendre le principe fonctionnement exacte de feu tricolère à base de pic 16f84
quand le oxcilateur genère des signaux vers le pic1684 ou se trouve le programme dans le ram l interface logic momorise le programme puis envois ves led qui allume ou etteint .c est ou j ai trampè