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

Eeprom pic



  1. #1
    invite7a536414

    Eeprom pic


    ------

    Bonjour,
    J'utilise actuellement ce code source pour sauvegarder des variables dans mon PIC 18f4685 : (ci après)

    Je n'arrive pas a stoker ou lire (ou les deux, je ne sais pas) des valeurs supérieurs à 127.
    Auriez-vous un conseil ou une astuce pour pouvoir stoquer au moins un vrai int ?

    Un grand merci par avance !

    Ci joint le code...

    LECTURE
    Code:
    unsigned float ReadEEPROM ( unsigned int memory_location)
    {
    	float memory_data;
    	EEADR = memory_location;
    	EECON1bits.EEPGD = 0;
    	EECON1bits.CFGS = 0;
    	EECON1bits.RD = 1;
    Delay10TCYx (2);
    	memory_data = EEDATA;
    
    return memory_data;
    }
    ECRITURE
    Code:
    void WriteEEPROM (unsigned float data, unsigned int memory_location )
    {
    	static unsigned char GIE_Status;
    	EEADR = memory_location;
    	EEDATA = data;
    	EECON1bits.EEPGD=0;
    	EECON1bits.CFGS=0;
    	EECON1bits.WREN=1;
    	EECON2 = 0x55;
    	EECON2 = 0xAA;
    	EECON1bits.WR = 1;
    	while(EECON1bits.WR);
    
    	PIR2bits.EEIF = 0;
    	EECON1bits.WREN = 0;	
    }

    -----

  2. #2
    invite29971eb1

    Re : Eeprom pic

    déjà data et memory_data doivent être des unsigned char, et non des float...

  3. #3
    invite7a536414

    Re : Eeprom pic

    Modification faite !

    Merci pour l'infos !

    D'autres idées ?

  4. #4
    invite7b66e893

    Re : Eeprom pic

    La mémoire EEPROM des 18F permet de stocker des octets (char), si tu veux stocker des entiers (int), il suffit de stocker le LSByte et MSByte dans 2 octets.

    Exemple:

    MSbyte = (char)(Data >> 8);
    LSByte = (char)Data;

  5. A voir en vidéo sur Futura
  6. #5
    invite29971eb1

    Re : Eeprom pic

    Citation Envoyé par marmotte Voir le message
    La mémoire EEPROM des 18F permet de stocker des octets (char), si tu veux stocker des entiers (int), il suffit de stocker le LSByte et MSByte dans 2 octets.

    Exemple:

    MSbyte = (char)(Data >> 8);
    LSByte = (char)Data;
    Par prudence, je mettrais
    LSByte=(char)(Data & 0xFF);

    voir même unsigned char, que le compilo aille pas prendre des libertés avec le bit de signe

  7. #6
    invite7a536414

    Re : Eeprom pic

    Merci pour votre éclairage avisé !

    Pour un Float qui vaut 4 octect la meme technique peut être appliquée ?

    byte3 = (char)(Data >> 24);
    byte2 = (char)(Data >> 16);
    byte1 = (char)(Data >> 8);
    byte0 = (char)(Data & 0xFF);

    Dois je appliquer un masque pour byte1 et 2 ?

    Cordialement

  8. #7
    invite7b66e893

    Re : Eeprom pic

    Citation Envoyé par hoffmann Voir le message
    Merci pour votre éclairage avisé !

    Pour un Float qui vaut 4 octect la meme technique peut être appliquée ?

    byte3 = (char)(Data >> 24);
    byte2 = (char)(Data >> 16);
    byte1 = (char)(Data >> 8);
    byte0 = (char)(Data & 0xFF);

    Dois je appliquer un masque pour byte1 et 2 ?

    Cordialement
    Tu peux le faire avec n'importe quelle donnée, quelque soit sa dimension. C'est à toi de bien la diviser correctement, et de la "ré-assembler" en conséquence lorsque tu veux la réutiliser.

    Comme l'a justement dit ftorama, il est en effet préférable d'appliquer un masque, bien qu'en principe le compilateur se charge de ce travail. Je me demande d'ailleurs si le fait d'utiliser ces masques n'est pas une habitude prise pour assurer une sécurité supplémentaire au développeur que le transtypage sera bien effectué, ou si c'est vraiment nécessaire sur certains compilateur.

  9. #8
    invite7a536414

    Re : Eeprom pic

    Tiens d'ailleurs pour le réassemblage vous validez ?
    (je ne peux pas tester ça tout de suite)

    Code:
    int valeurfinal = 0;
    
    char MSB;
    char LSB;
    
    MSB = eeprom_read (blabla);
    LSB = eeprom_read (blabla);
    
    
    valeurfinal = MSB;
    valeurfinal = valeurfinal << 8;
    valeurfinal = valeurfinal & LSB;
    Merci d'avance

  10. #9
    invite7b66e893

    Re : Eeprom pic

    Grosse erreur sur le type d'opération logique !!! 0 & 1 = 0 !!! Ton opération permet juste de récupérer le LSB. Il faut utiliser un OU (|)

    Par contre, indispensable de mettre les masques, surtout celui qui efface l'octet de poids faible lorsque tu récupères le poids fort.

    Code:
    valeurfinal = (((unsigned int)MSB)<<8)&0xFF00;
    valeurfinal = valeurfinal | ((unsigned int)LSB & 0x00FF);

  11. #10
    invite7a536414

    Re : Eeprom pic

    Bonjour,
    Un grand merci pour votre aide, le code fonctionne très bien pour les int !

    En effet c'était une jolie erreur ; )


    ********
    Par contre et malheureusment pour moi je n'arrive pas a adapter le code pour un float... Je pense que quelque chose m'échappe...

    Cela concerne la concaténation lors de la lecture des 4 mots...

    Code:
    MMSB = ReadEEPROM (memory_location);
    MSB = ReadEEPROM (memory_location+1);
    LSB = ReadEEPROM (memory_location+2);
    LLSB = ReadEEPROM (memory_location+3);
    
    valeurfinal = (((unsigned int)MMSB)<<24)&0xFF000000;
    valeurfinal = valeurfinal | (((unsigned int)MSB)<<16)&0x00FF0000;
    valeurfinal = valeurfinal | (((unsigned int)LSB)<<8)&0x0000FF00;
    valeurfinal = valeurfinal | ((unsigned int)LLSB & 0x000000FF);
    J'obtiens l'érreur suivante :

    Error [1138] integer types required for bitwise OR operator

    Un conseil ?

    Un grand merci encore une fois !

  12. #11
    invitef52a7828

    Re : Eeprom pic

    Citation Envoyé par hoffmann Voir le message
    Bonjour,
    Un grand merci pour votre aide, le code fonctionne très bien pour les int !

    En effet c'était une jolie erreur ; )


    ********
    Par contre et malheureusment pour moi je n'arrive pas a adapter le code pour un float... Je pense que quelque chose m'échappe...

    Cela concerne la concaténation lors de la lecture des 4 mots...

    Code:
    MMSB = ReadEEPROM (memory_location);
    MSB = ReadEEPROM (memory_location+1);
    LSB = ReadEEPROM (memory_location+2);
    LLSB = ReadEEPROM (memory_location+3);
    
    valeurfinal = (((unsigned int)MMSB)<<24)&0xFF000000;
    valeurfinal = valeurfinal | (((unsigned int)MSB)<<16)&0x00FF0000;
    valeurfinal = valeurfinal | (((unsigned int)LSB)<<8)&0x0000FF00;
    valeurfinal = valeurfinal | ((unsigned int)LLSB & 0x000000FF);
    J'obtiens l'érreur suivante :

    Error [1138] integer types required for bitwise OR operator

    Un conseil ?

    Un grand merci encore une fois !
    Bonjour,

    le "OU" c'est 2x "|" donc blabla || blabla

    EDIT : euh.... je me suis trompé, c'est pour le OU logique.... désolé...

  13. #12
    invite29971eb1

    Re : Eeprom pic

    Citation Envoyé par hoffmann Voir le message
    Par contre et malheureusment pour moi je n'arrive pas a adapter le code pour un float... Je pense que quelque chose m'échappe...

    Cela concerne la concaténation lors de la lecture des 4 mots...

    Code:
    MMSB = ReadEEPROM (memory_location);
    MSB = ReadEEPROM (memory_location+1);
    LSB = ReadEEPROM (memory_location+2);
    LLSB = ReadEEPROM (memory_location+3);
    
    valeurfinal = (((unsigned int)MMSB)<<24)&0xFF000000;
    valeurfinal = valeurfinal | (((unsigned int)MSB)<<16)&0x00FF0000;
    valeurfinal = valeurfinal | (((unsigned int)LSB)<<8)&0x0000FF00;
    valeurfinal = valeurfinal | ((unsigned int)LLSB & 0x000000FF);
    J'obtiens l'érreur suivante :

    Error [1138] integer types required for bitwise OR operator

    Un conseil ?

    Un grand merci encore une fois !
    Un unsigned int est codé sur combien d'octets?

  14. #13
    inviteb6d767d2

    Re : Eeprom pic

    Salut
    ------

    Par contre et malheureusment pour moi je n'arrive pas a adapter le code pour un float
    En principe on ne peut pas faire d'opérations logiques sur des floats, la façon de coder un float en mémoire n'est pas standardisé.

    A+
    Bigonoff

  15. #14
    invite98765423456
    Invité

    Re : Eeprom pic

    Citation Envoyé par Bigonoff Voir le message
    Salut
    ------

    la façon de coder un float en mémoire n'est pas standardisée.

    A+
    Bigonoff
    Ah, dans ma grande naïveté, je croyais que c'était le cas
    http://fr.wikipedia.org/wiki/IEEE_754

    th

  16. #15
    inviteb6d767d2

    Re : Eeprom pic

    Salut
    ------

    Ah, dans ma grande naïveté, je croyais que c'était le cas
    Ben non, comme tu peux le constater en lisant quelques extraits de ton propre lien :

    L’IEEE 754 est un standard
    UN standard, pas LE standard

    Il est le plus employé
    LE PLUS employé, pas LE SEUL employé

    définit 4 formats pour représenter des nombres à virgule flottante
    4 formats rien que pour la norme IEEE 754, sachant qu'en plus elle n'est pas la seule possible.

    A l'intérieur d'un micro, le codage des données est purement conventionnel, rien n'interdit à personne de coder ses données comme il l'entend, et rien n'interdit à un compilateur de faire de même.

    Sinon, ben il ne reste qu'à constater que le compilateur ne semble pas apprécier les opérations logiques bit à bit sur un float.

    Du reste, même si ça fonctionnait et même si le compilateur utilisait la norme en question, le résultat ne donnerait rien de pertinent.

    A+
    Bigonoff

Discussions similaires

  1. Pic 16f876A - Eeprom 24LC512
    Par invitefc9589cd dans le forum Électronique
    Réponses: 14
    Dernier message: 01/09/2010, 18h09
  2. Pic+eeprom y goldcard(te20x)
    Par invite0a641e10 dans le forum Électronique
    Réponses: 2
    Dernier message: 29/07/2010, 12h03
  3. Memoire EEPROM PIC 16F84
    Par invite49da6b87 dans le forum Électronique
    Réponses: 6
    Dernier message: 10/09/2008, 12h37
  4. EEPROM et Pic
    Par invitedc3cc90b dans le forum Électronique
    Réponses: 1
    Dernier message: 10/05/2008, 03h39
  5. pic/eeprom
    Par invitec35bc9ea dans le forum Électronique
    Réponses: 5
    Dernier message: 10/05/2007, 23h21
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...