Accés R/W en EEPROM avec PIC16F877
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Accés R/W en EEPROM avec PIC16F877



  1. #1
    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.

    -----

  2. #2
    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.

  3. #3
    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

  4. #4
    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.

  5. A voir en vidéo sur Futura
  6. #5
    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...

  7. #6
    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.

  8. #7
    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.

  9. #8
    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.

  10. #9
    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...

  11. #10
    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.

  12. #11
    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.

Discussions similaires

  1. conversion avec un pic16F877
    Par invite817b2e6f dans le forum Électronique
    Réponses: 4
    Dernier message: 06/12/2006, 21h55
  2. débuter avec PIC16f877
    Par sdow dans le forum Électronique
    Réponses: 3
    Dernier message: 03/12/2006, 15h56
  3. Accès en lecture EEPROM
    Par Toufinet dans le forum Électronique
    Réponses: 16
    Dernier message: 01/12/2006, 21h10
  4. PROGRAMMATION DES PICs: ACCES EEPROM
    Par invitee5e63da7 dans le forum Électronique
    Réponses: 1
    Dernier message: 11/06/2003, 07h56
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...