-
15/07/2008 - 16h57 Elbuey76
Accés R/W en EEPROM avec PIC16F877
Voici mon programme, certe très simple:
LIST p=16F877A ; Définition de processeur
#include <p16F877A.inc> ; fichier include
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
CBLOCK 0x20
addwrite:1
ENDC
REEPROM macro ; lire eeprom(adresse & résultat en w)
clrwdt ; reset watchdog
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEADR ; pointer sur adresse eeprom
bsf STATUS,RP0 ; passer en banque3
bcf EECON1,EEPGD ; pointer sur eeprom
bsf EECON1,RD ; ordre de lecture
bcf STATUS,RP0 ; passer en banque2
movf EEDATA,w ; charger valeur lue
bcf STATUS,RP1 ; passer en banque0
endm
WEEPROM macro addwrite ; la donnée se trouve dans W
LOCAL loop
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEDATA ; placer data dans registre
movlw addwrite ; charger adresse d'écriture
movwf EEADR ; placer dans registre
bsf STATUS,RP0 ; passer en banque3
bcf EECON1 , EEPGD ; pointer sur mémoire data
bsf EECON1 , WREN ; autoriser accès écriture
bcf INTCON , GIE ; interdire interruptions
movlw 0x55 ; charger 0x55
movwf EECON2 ; envoyer commande
movlw 0xAA ; charger 0xAA
movwf EECON2 ; envoyer commande
bsf EECON1 , WR ; lancer cycle d'écriture
bsf INTCON , GIE ; réautoriser interruptions
loop
clrwdt ; effacer watchdog
btfsc EECON1 , WR ; tester si écriture terminée
goto loop ; non, attendre
bcf EECON1 , WREN ; verrouiller prochaine écriture
bcf STATUS , RP0 ; passer en banque0
bcf STATUS , RP1
endm
goto start
start
movlw 0x02
WEEPROM 0x01
fin
goto fin
END
Ce programme est censé ecrire 02 a l'adresse 1201 dans l'EEPROM. Les macros viennent du cours de Bigonoff, mais j'ai cherché partout il n'explique pas le passage d'argument a une macro.
Ce que fait le programme, on s'en fout, je veux juste comprendre comment utilisé la macro "ecriture", si quequ'un a l'aimabilité de m'expliquer.
Merci a tous pour votre aide.
-
Poursuivez votre recherche
-
15/07/2008 - 17h59 DavidDB
Re : Accés R/W en EEPROM avec PIC16F877
Salut,
Avec ta macro, tu copies la valeur D'2' à l'adresse D'01' en EEPROM.
movlw 0x02 -> c'est la donnée que tu vas copier dans EEDATA
WEEPROM 0x01 -> 0x01 est l'adresse EEPROM où va être copié la donnée.
David.
-
15/07/2008 - 21h09 Elbuey76
Re : Accés R/W en EEPROM avec PIC16F877
Oui ca j'avais compris, en faite je me suis mal exprimé.
Je ne suis pas sur du bout de programme entre "start" et "end".
J'ai compris que l'on passe indirectement la vleur a ecrire en la metant dans le registre W et on lui passe aussi "addwrite" en tant qu'argument.
Ce programme ne marche pas et je pense que ca vient de l'argument (je n'ai jamais fait ca et je n'ai trouvé d'explication nulle part)
=> quand on donne l'adresse, on donne 0x01 ou 0x1201 ?
=> on ecrit WEEPROM 0x01 ou WEEPROM addwrite en indiquant que vaut addwrite avant ?
C'est ce genre de question que je me pose.
Merci
-
15/07/2008 - 23h52 DavidDB
Re : Accés R/W en EEPROM avec PIC16F877
=> quand on donne l'adresse, on donne 0x01 ou 0x1201 ?
A l'adresse 0x01 de l'EEPROM...
Je ne sais pas où tu vas chercher l'adresse 0x1201, qui n'existe pas pour l'eeprom (l'adresse la plus haute est de mémoire 0xFF)
=> on ecrit WEEPROM 0x01 ou WEEPROM addwrite en indiquant que vaut addwrite avant ?
Tu dois passer un paramètre à la macro WEEPROM, ce paramètre doit être soit une valeur litérale (0x01 par exemple) soit une variable quelconque (dans ce cas, ce sera le contenu de cette variable qui servira d'adresse pour écrire en EEPROM)
Donc, "addwrite" est le paramètre utilisé par la macro, et "addwrite" vaut la valeur que tu indiques lors de l'appel de la macro.
Il ne faut pas écrire "WEEPROM addwrite", sauf si tu aimes la confusion et que tu as déclaré "addwrite" dans la zone des variables.
Si tu n'as pas déclaré de variable "addwrite" en RAM, écrire "WEEPROM addwrite" ne signifie rien et génèrera une erreur par l'Assembleur.
Par contre "WEEPROM 0x10" fonctionnera, car "addwrite" sera remplacé par 0x10 lors de l'Assemblage du programme.
David.
-
16/07/2008 - 01h01 Elbuey76
Re : Accés R/W en EEPROM avec PIC16F877
Merci pour votre reponse.
[QUOTE=DavidDB;1801637]
Je ne sais pas où tu vas chercher l'adresse 0x1201QUOTE]
Bah il me semble que l'eeprom commence a l'adresse 0x1200, donc si on prend le deuxieme emplacement eeprom ca donne 0x1201...
-
16/07/2008 - 01h26 Elbuey76
Re : Accés R/W en EEPROM avec PIC16F877
LIST p=16F877A ; Définition de processeur
#include <p16F877A.inc> ; fichier include
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
REEPROM macro ; lire eeprom(adresse & résultat en w)
clrwdt ; reset watchdog
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEADR ; pointer sur adresse eeprom
bsf STATUS,RP0 ; passer en banque3
bcf EECON1,EEPGD ; pointer sur eeprom
bsf EECON1,RD ; ordre de lecture
bcf STATUS,RP0 ; passer en banque2
movf EEDATA,w ; charger valeur lue
bcf STATUS,RP1 ; passer en banque0
endm
WEEPROM macro addwrite ; la donnée se trouve dans W
LOCAL loop
bcf STATUS,RP0 ; passer en banque2
bsf STATUS,RP1
movwf EEDATA ; placer data dans registre
movlw addwrite ; charger adresse d'écriture
movwf EEADR ; placer dans registre
bsf STATUS,RP0 ; passer en banque3
bcf EECON1 , EEPGD ; pointer sur mémoire data
bsf EECON1 , WREN ; autoriser accès écriture
bcf INTCON , GIE ; interdire interruptions
movlw 0x55 ; charger 0x55
movwf EECON2 ; envoyer commande
movlw 0xAA ; charger 0xAA
movwf EECON2 ; envoyer commande
bsf EECON1 , WR ; lancer cycle d'écriture
bsf INTCON , GIE ; réautoriser interruptions
loop
clrwdt ; effacer watchdog
btfsc EECON1 , WR ; tester si écriture terminée
goto loop ; non, attendre
bcf EECON1 , WREN ; verrouiller prochaine écriture
bcf STATUS , RP0 ; passer en banque0
bcf STATUS , RP1
endm
goto start
start
movlw 0x02
WEEPROM 0x01
fin
goto fin
END
Avec ca ca ne marche pas, il ne me fit pas d'erreur a la compilation mais quand j'avance pas a pas dans le programme avec le simulateur mplab, la fleche verte reste bloquée sur la ligne WEEPROM 0x01 et le PC indique:
0x1 quand il est sur la ligne "movlw 0x02"
0x2 quand il est sur la ligne "WEEPROM 0x01"
0x12 en restant sur la ligne "WEEPROM 0x01"
0x13 en restant sur la ligne "WEEPROM 0x01"
0x11 en restant sur la ligne "WEEPROM 0x01"
0x12 en restant sur la ligne "WEEPROM 0x01"
0x13 en restant sur la ligne "WEEPROM 0x01"
0x11 en restant sur la ligne "WEEPROM 0x01"
0x12 en restant sur la ligne "WEEPROM 0x01"
etc... en restant sur la ligne "WEEPROM 0x01"
quelqu'un peut m'aider ? merci.
-
16/07/2008 - 01h52 Elbuey76
Re : Accés R/W en EEPROM avec PIC16F877
J'ai l'impression qu'il reste bloqué car dans la macro on verifie la fin de l'ecriture avant de continuer et la fin de cette ecriture ne se fait jamais...
Help please.
-
16/07/2008 - 04h02 DavidDB
Re : Accés R/W en EEPROM avec PIC16F877
Bah il me semble que l'eeprom commence a l'adresse 0x1200, donc si on prend le deuxieme emplacement eeprom ca donne 0x1201...
De souvenir, l'adresse physique pour l'EEPROM est : 0x2100
Seulement, comme EEADR est un registre sur 8bits, les adresses EEPROM vont de 0x00 à 0xFF. De plus comme l'EEPROM comporte seulement 256 octets cela facilite la vie de n'avoir qu'un registre pour adresser l'EEPROM...
Avec ca ca ne marche pas, il ne me fit pas d'erreur a la compilation mais quand j'avance pas a pas dans le programme avec le simulateur mplab, la fleche verte reste bloquée
En simulation, il me semble que le bit WR n'est pas géré...
Donc, si tu simules ton programme il faut mettre la boucle de test du bit WR en commentaire pour passer à la suite du programme.
David.
-
16/07/2008 - 13h17 Elbuey76
Re : Accés R/W en EEPROM avec PIC16F877
Oui, j'ai aussi pensé a ca, le programme passe bien a la suite mais la valeur ne s'inscrit pas en EEPROM.
Pour voir l'EEPROM il faut bien faire "view/EEPROM" dans MPLAB ?
Et avec addwrite = 0x02 et w = 0x01 je devrai avoir "01" d'affiché premiere ligne, deuxieme colonne de l'EEPROM ?
Pourquoi ca ne marche pas alors... je seche completement la...
-
16/07/2008 - 14h18 DavidDB
Re : Accés R/W en EEPROM avec PIC16F877
Salut,
Laisse la gestion de WR, et place un point d'arrêt après le test de WR.
Ensuite tu simules en mode RUN. Une fois l'écriture simulée le programme s'arrêtera sur le point d'arrêt...
L'écriture EEPROM peut durer 10mS, ce qui en mode pas à pas est une éternité.
Dans tous les cas, la routine de lecture/écriture en EEPROM est correcte.
Oui, pour visualiser les données EEPROM c'est bien la fenêtre "view EEPROM".
David.
-
16/07/2008 - 16h37 Elbuey76
Re : Accés R/W en EEPROM avec PIC16F877
C'est bon ca marche, merci encore.
Par contre il n'est pas possible de mettre de breakpoint dans la macro, donc je n'en ai pas mis.
Merci beaucoup et bonne journée.
| | |