Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

PIC18F & langage C : Sauvegarder une variable dans la rom



  1. #1
    The Viking

    PIC18F & langage C : Sauvegarder une variable dans la rom


    ------

    Bonjour,

    J'utilise un PIC18F4520 que je programme en C avec le compilateur Mplab C18. Je souhaiterai sauvegarder une variable dans la rom interne du PIC afin de ne pas perdre sa valeur en cas de panne de l'alimentation.

    J'ai vu qu'il était possible de déclarer des variables dans la rom comme ceci :

    Code:
    rom int variable_rom;
    int variable_ram;
    Je voudrais pouvoir lire et écrire variable_rom de cette manière :

    Code:
    //écrire dans la rom
    variable_rom = variable_ram;
    //lire la rom
    variable_ram = variable_rom;
    Problème : le code compile mais la valeur de variable_rom ne change pas lors de l'écriture. La lecture par contre s'effectue correctement.

    Est-il possible d'écrire aussi simplement dans la rom où dois-je utiliser un code plus compliqué comme présenté à cette adresse : http://forum.microchip.com/tm.aspx?m=246435

    -----

  2. Publicité
  3. 📣 Nouveau projet éditorial de Futura
    🔥🧠 Le Mag Futura est lancé, découvrez notre 1er magazine papier

    Une belle revue de plus de 200 pages et 4 dossiers scientifiques pour tout comprendre à la science qui fera le futur. Nous avons besoin de vous 🙏 pour nous aider à le lancer...

    👉 Je découvre le projet

    Quatre questions à explorer en 2022 :
    → Quels mystères nous cache encore la Lune 🌙 ?
    → Pourra-t-on bientôt tout guérir grâce aux gènes 👩‍⚕️?
    → Comment nourrir le monde sans le détruire 🌍 ?
    → L’intelligence artificielle peut-elle devenir vraiment intelligente 🤖 ?
  4. #2
    Seb.26

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Alors avant tout : il est impossible d'ecrire dans de la ROM : Read Only Memory
    ... par contre, pour cela tu peux utiliser la Flash, ou l'EEPRom ...

    Je te conseille l'EEProm : c'est fait pour ça, et c'est assez simple ...

    Tu as quoi comme PIC ?

  5. #3
    emit-fr

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Bonjour,

    eepROM: je pense que c'est ce qu'il vous faut !
    Cette mémoire est non volatile (n'est pas effecée lorsque qu'elle n'est plus allimentée).

    Elle est assez facile a implémenter sur un PIC18F avec Mcc18

    Maintenant si vous devez stocker beaucoup de donner (> 256 Octets "Taille habituellement dispo sur les PIC18F"), il vous faudra utiliser la FLASH.

    La flash est aussi une mémoire non volatile, c'est dans la Flash qu'est stocké le programme.

    Il est plus délicat de l'utilisé pour différentes raisons:
    * Ecrire de block (on ne peut ecrire 1 octet, il faut ecrir un block; 64 octets en général sur les 18F)
    * Il faut faire attention a l'endroit ou oin ecrit pour ne pas ecraser le programme
    * En général, l'approche est moins facile

    Exemple d'ecriture EEProm 18F avec Mcc18:
    uns8 EERead(uns8 ad)
    {
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS = 0;
    EEADR = ad;
    EECON1bits.RD = 1;
    return EEDATA;
    }

    uns8 EEWrite(uns8 ad, uns8 val)
    {
    EEADRH = 0;
    EEADR = ad;
    EEDATA = val;
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS = 0;
    EECON1bits.WREN = 1;
    INTCONbits.GIE = 0;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;
    INTCONbits.GIE = 1;
    while (EECON1bits.WR)
    ;
    EECON1bits.WREN = 0;

    }
    Gaétan

  6. #4
    The Viking

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Bonjour,

    J'utilise ces deux fonctions trouvées sur le forum de Microchip qui sont très similaires aux votres :

    Code:
    void WriteEEPROM(unsigned float data)
    {
    	static unsigned char GIE_Status;
    	EEADR = memory_location;  //EEPROM memory location
    	EEDATA = data;     //Data to be writen 
    	EECON1bits.EEPGD=0;    //Enable EEPROM write
    	EECON1bits.CFGS=0;    //Enable EEPROM write
    	EECON1bits.WREN = 1;   //Enable EEPROM write
    	//GIE_Status = INTCONbits.GIE; //Save global interrupt enable bit
    	//INTCONbits.GIE=0;    //Disable global interrupts
    	EECON2 = 0x55;     //Required sequence to start write cycle
    	EECON2 = 0xAA;     //Required sequence to start write cycle
    	EECON1bits.WR = 1;    //Required sequence to start write cycle
    	//INTCONbits.GIE=GIE_Status;  //Restore the original global interrupt status
    	while(EECON1bits.WR);   //Wait for completion of write sequence
    	PIR2bits.EEIF = 0;    //Disable EEPROM write
    	EECON1bits.WREN = 0;   //Disable EEPROM write
    }
    
    unsigned float ReadEEPROM(void)
    {
    	float memory_data;
    	EEADR = memory_location;  //EEPROM memory location
    	EECON1bits.EEPGD = 0;   //Enable read sequence
    	EECON1bits.CFGS = 0;   //Enable read sequence
    	EECON1bits.RD = 1;    //Enable read sequence
    	Delay10TCYx(2);    //Delay to ensure read is completed
    	memory_data = EEDATA; 
    	return memory_data;        
    }
    L'adresse de sauvegarde est définie dans l'entête :
    Code:
    #define memory_location 0x0c
    J'ai un petit problème avec ces fonctions. Je souhaiterai sauvegarder dans l'EEPROM une valeur réelle (un unsigned float), mais seuls les chiffres situés avant la virgule se retrouvent sauvegardées avec ces fonctions. C'est comme ci une conversion vers le type int avait été effectuée.

    Comment puis-je sauvegarder aussi les chiffres après la virgule ?

  7. A voir en vidéo sur Futura
  8. #5
    Seb.26

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Il faut que tu ecrive chaque octets de ton float ( 4 si mes souvenir sont bons ... )

    par exemple, utilise un truc du style :
    float f1 = 3.14159265359;
    byte *myFloat = ((byte*)&f1);
    int i;
    for( i=0 ; i<4 ; i++ )
    EEPromWrite(BaseAdr+i,myFloat[i]);

  9. #6
    vévé_leski

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    bonjour,
    j'ai besoin de faire de la sauvegarde et de la lecture d'eeprom sur un pic18f252 : pour cela, j'utilise les même fonctions données plus haut. cepandant il y a un problème lors de l'écriture : l'ecriture en eeprom ne se fait pas. j'ai debugger mon code en pas à pas et en fait la séquence suivante ne se fait pas.
    EECON2 = 0x55;
    EECON2 = 0xAA;


    est-ce que vous pouvez m'aider svp?

  10. Publicité
  11. #7
    EmKa69

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Bonjour à tous,
    je programme un 18f4550 avec C18,
    J'essaye d'intégrer ces fonctions à mon programme a priori la syntaxe n'est pas la bonne.

    Citation Envoyé par emit-fr Voir le message
    Bonjour,

    eepROM: je pense que c'est ce qu'il vous faut !
    Cette mémoire est non volatile (n'est pas effecée lorsque qu'elle n'est plus allimentée).

    Elle est assez facile a implémenter sur un PIC18F avec Mcc18

    Maintenant si vous devez stocker beaucoup de donner (> 256 Octets "Taille habituellement dispo sur les PIC18F"), il vous faudra utiliser la FLASH.

    La flash est aussi une mémoire non volatile, c'est dans la Flash qu'est stocké le programme.

    Il est plus délicat de l'utilisé pour différentes raisons:
    * Ecrire de block (on ne peut ecrire 1 octet, il faut ecrir un block; 64 octets en général sur les 18F)
    * Il faut faire attention a l'endroit ou oin ecrit pour ne pas ecraser le programme
    * En général, l'approche est moins facile

    Exemple d'ecriture EEProm 18F avec Mcc18:
    Savez-comment adapter ce code.
    ou s'il y a une declaration à faire pour que cela marche.

  12. #8
    hoffmann

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Bonjour,
    Je fais remonter ce vieux topic...
    Le programme fonctionne bien mais je voulais me faire une petite idée sur le nombre de variable que je pouvais stoker...

    La mémoire d'EEPROM = 256 byte.
    Les "mots" écrits dans l'EEPROM sont des unsigned float.

    Combien de byte vaut un unsigned float chez les PIC ?
    Cette inconnue me bloque...
    J'aimerais connaître l'étendue du tableau d'adresse..
    Il va de 0x00 (je suppose) à ?

    Merci d'avance

    Cordialement

    PS : Vous me confirmez que lorsque je reprogramme le PIC, la mémoire EEPROM est bien effacé ?
    Hoffmann

  13. #9
    RISC

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    salut,

    Tu déclares 2 floats, tu les mets dans la watch window pour connaitre leur adresse mémoire et ensuite tu fais une soustraction ;=)
    Autre solution, tu cherches dans le manuel du compilateur...

    Concernant la taille de la mémoire E2PROM, elle n'est pas obligatoirement de 256 octets. Il existe plusieurs PIC18 qui ont 1Ko d'E2PROM. Il suffit d'utiliser MAPS et de choisir dans les critères "PIC18" et (par exemple) E2PROM entre 1Ko et 1Ko et plusieurs références de PIC18 sont listées.

    a+

  14. #10
    F1TVB

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Bonjour,
    J'ai un petit pbs avec CC18, PIC 18F4550 et la mémoire ROM (flash)
    Si je défini une fonction avec:

    void test(char *t)
    {
    char val;
    val=*t;
    }

    appel de la fonction avec test("ABC");

    j'ai un warning suspicious pointer conversion

    si je cast test( (char *) "ABC") plus de warning mais dans
    les 2 cas val=0;
    Pour que cela fonctionne il faut que je cast avec (const rom char *)
    dans les 2 fonctions.
    Je suppose que la string "ABC" n'est pas dans la RAM....
    Si vous pouvez éclairer ma lanterne ...je fait sans doute un mélange avec la RAM et la mémoire flash....
    Pour info je programme un interface pour machine CNC et cette fonction est utilisée pour gérer l'afficheur GLCD.
    Courtoisement
    Adelin F1TVB

  15. #11
    Jack
    Modérateur

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    j'ai un warning suspicious pointer conversion
    Ca me parait sensé puisque dans un cas tu pointes une chaine de caractère et dans la fonction c'est un pointeur de caractère.

    "ABC" étant une constante chaine de caractère, elle est donc en ROM et ne pourra donc pas changer, d'où le const.

    A+

  16. #12
    Seb.26

    Post Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    il faut faire 2 version de tes fonctions :

    Code:
    void test(char *t)
    {
    ...
    }
    et

    Code:
    void test_rom(const rom char *t)
    {
    ...
    }
    Un pointeur en RAM n'est pas compatible avec un pointeur en Flash (pseudo-ROM).
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  17. Publicité
  18. #13
    F1TVB

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Merci pour les réponses.
    Contrairement au compilateur C et C++ (code::blocks) que j'utilise pour Window, les arguments ne sont pas sur la pile. Il me parait bizarre qu'une chaine de caracteres ne soit pas stockée en ram et que seul le pointeur soit passé en argument.
    Je suppose que c'est spécifique au 18Fxxx.
    J'ai updaté mes sources et l'afficheur graphique est content.
    re merci pour les explications.
    Coutoisement
    Adelin F1TVB

  19. #14
    Seb.26

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Citation Envoyé par F1TVB Voir le message
    Merci pour les réponses.
    Contrairement au compilateur C et C++ (code::blocks) que j'utilise pour Window, les arguments ne sont pas sur la pile. Il me parait bizarre qu'une chaine de caracteres ne soit pas stockée en ram et que seul le pointeur soit passé en argument.
    Je suppose que c'est spécifique au 18Fxxx.
    J'ai updaté mes sources et l'afficheur graphique est content.
    re merci pour les explications.
    Coutoisement
    Adelin F1TVB
    aucun compilo C/C++ qui se respecte ne te copiera ta chaine sur la pile, tous passent un pointeur ... imagine si chaque fonction doit faire une copie de la chaine ... le moindre sprintf te prendrait 8Mo de RAM ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  20. #15
    F1TVB

    Re : PIC18F & langage C : Sauvegarder une variable dans la rom

    Mea culpa j'ai écrit une grosse bêtise.
    Quand on fait void test("chaine") on passe un pointeur de type char qui pointe
    sur la chaine stockée en mémoire ram.Je suppose que cette chaine est volatile
    et ne sert que pour l'appel de la fonction.
    Cela pourait être identique avec le PIC, dans une zone mémoire libre.
    Bon, le principal est que mon GLCD fonctionne correctement....
    Encore merci (petite info suis dans le 38)
    Cordialement
    Adelin F1TVB

Discussions similaires

  1. chercher une chaine de caractère dans un texte en Langage C
    Par lui dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 10/12/2010, 01h01
  2. Changement de variable dans une équation différentielle
    Par le fouineur dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 03/05/2008, 13h25
  3. Problème dans une fonction en Langage C
    Par lui dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 05/05/2007, 00h25
  4. changement de variable dans une integrale
    Par mermaid13 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 07/03/2007, 10h57
  5. Une variable JS dans du php ...
    Par Tix dans le forum Internet - Réseau - Sécurité générale
    Réponses: 5
    Dernier message: 14/11/2005, 21h42
Découvrez nos comparatifs produits sur l'informatique et les technologies.