IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[PIC]Enregistrer un Long dans l'EEPROM


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Par défaut [PIC]Enregistrer un Long dans l'EEPROM
    bonjour,
    je suis en train de programmer un PIC (18F1320) et j'ai besoin de le Redémarrer (reset_cpu) de temps en temps. J'utilise une variable que j'ai besoin de "sauvegarder" entre les RESET, pour cela j'utilise l'EEPROM interne du pic.
    voilà mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    unsigned long nb = 0;
     
    //Ecrire dans l'EEPROM un long "data" à partir de l'adresse "n"
    void WRITE_LONG_EEPROM(long int n, long data) {
       int i;
       for (i = 0; i < 4; i++)
         write_eeprom(i + n, *(&data + i) ) ;
    }
     
    //Lire depuis l'EEPROM partir de l'adresse "n"
    unsigned long READ_LONG_EEPROM(long int n) {
       int i;
       unsigned long data=0;
       for (i = 0; i < 4; i++)
         *(&data + i) = read_eeprom(i + n);
       return(data);
    }
     
    void main()
    {
     nb=1;
     switch(restart_cause())
     {
       case RESET_INSTRUCTION : //appel de la fonction reset_cpu
          nb=READ_LONG_EEPROM(0);//Lecture du nb sauvegardé
          printf("RESET %lu\r",nb);
       break;
       case NORMAL_POWER_UP : //1ere alimentation du PIC
          printf("POWER UP %lu\r",nb);
       break;
     }
     while(true)  
     {
      nb*=2;
      if(nb%5==0)//on entregistre toute les 5 boucles, et on reset
      {
       WRITE_LONG_EEPROM(0,nb);//Sauvegarde de nb dans l'EEPROM
       reset_cpu();
      }
     }
    }
    le problème est qu'il s'arrête à 256 et j'ai besoin d'atteindre 42000

    où est le ik??!!

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Je ne m'y connais pas en EEPROM, mais une chose me chiffonne : le décalae &data + i, où data est de type long me parait louche. À mon avis, il manque un cast.
    Que ce passe-t-il si on écrit ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //Ecrire dans l'EEPROM un long "data" à partir de l'adresse "n"
    void WRITE_LONG_EEPROM(long int n, long data) {
       int i;
       for (i = 0; i < 4; i++)
         write_eeprom(i + n, *(((char*)&data) + i) ) ;
    }
     
    //Lire depuis l'EEPROM partir de l'adresse "n"
    unsigned long READ_LONG_EEPROM(long int n) {
       int i;
       unsigned long data=0;
       for (i = 0; i < 4; i++)
         *(((char*)&data) + i) = read_eeprom(i + n);
       return(data);
    }

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Par défaut
    J'essaye et je te tiens au courant

    A savoir que le code que j'utilise est tiré d'un exemple de la FAQ du logiciel CCS.

    EDIT : lol, je viens de relire la FAQ, effectivement y a un cast int8* (qui correspond à un char*), la FAQ off line ne doit pas être à jour. Je pourrais pas tester avant cet aprèm

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Par défaut
    Bingo



    Thx

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 19
    Dernier message: 04/06/2007, 17h12
  2. Réponses: 16
    Dernier message: 22/03/2005, 21h57
  3. Enregistrement trop long dans ACCESS (ALTER TABLE)
    Par Arrown dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/07/2004, 20h20
  4. [PIC] Enregistrement de données permanentes
    Par Grulou dans le forum Autres architectures
    Réponses: 6
    Dernier message: 15/03/2004, 19h31
  5. Enregistrer un RichEdit dans un .Txt
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 06/08/2002, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo