Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#1 Message par flolarajasse » jeu. 1 oct. 2015 11:09

Bonjour,

J'ai su qu'il était possible d'écrire des données dans l'EEPROM du PIC directement à son démarrage, sans passer par toute la procédure qu'on trouve dans le datasheet. Savez vous quelles sont les instructions adéquates? J'ai cherché sur le net, je n'ai rien trouvé de particulier.
Pour info, je travaille avec un PIC18F4431 avec MPLABX et XC8 comme compilo.

Merci d'avance, et bonne journée

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#2 Message par flolarajasse » jeu. 1 oct. 2015 11:20

J'ai trouvé cette page, l'instruction assembleur serait 'DE', existe-t-il une équivalence en C?

http://fabrice.sincere.pagesperso-orang ... eeprom.htm

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#3 Message par flolarajasse » jeu. 1 oct. 2015 16:37

Pour faire une "synthèse" des mes problèmes :

- Celui cité sur le message ci-dessus ; j'ai l'impression que cette instruction :

Code : Tout sélectionner

const unsigned char abc0 @ 0xF00000 = 0x05; // Écrit dans la première case de l'EEPROM la valeur 0x05 au démarrage  


écrit sur 2 octets au lieu d'un seul, d'où l'erreur quand j'écris l'instruction suivante :

Code : Tout sélectionner

const unsigned char abc1 @ 0xF00001 = 0x05; // Écrit dans la première case de l'EEPROM la valeur 0x09 au démarrage  


:0: error: psect "_abc1_const" not relocated on 0x2 byte boundary


Comment écrire seulement sur un octet? Pourtant unsigned char correspond à un octet?!?

- 2ème problème : le programme ci-dessous écrit mes données en EEPROM en simulation, mais pas en debug sur mon PIC? Savez vous pourquoi? Le problème ne vient pas de mes bits de config, ils sont tous en "no code-protected".


Code : Tout sélectionner

unsigned char valeur1 = 5;
unsigned char valeur2 = 10;

void ecriture_valeur_eeprom (void)
{
    EEADR = 0x00; // Ecriture adresse
    EEDATA = valeur1;
    EECON1bits.EEPGD = 0; // Access data EEPROM memory.
    EECON1bits.CFGS = 0; // Acces program flash or data EEPROM memory.
    EECON1bits.WREN = 1; // Allows erase/ write cycles.
    INTCONbits.GIE = 0; // Disable interrupts.
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1; // Initiates a data EEPROM erase/write cycle
    while (EECON1bits.WR == 1)
    {
    }
    EECON1bits.WREN = 0; // Inhibs erase/ write cycles.

    EEADR = 0x01; // Ecriture adresse 
    EEDATA = valeur2;
    EECON1bits.EEPGD = 0; // Access data EEPROM memory.
    EECON1bits.CFGS = 0; // Acces program flash or data EEPROM memory.
    EECON1bits.WREN = 1; // Allows erase/ write cycles.
    //INTCONbits.GIE = 0; // Disable interrupts.
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1; // Initiates a data EEPROM erase/write cycle
    while (EECON1bits.WR == 1)
    {
    }
    EECON1bits.WREN = 0; // Inhibs erase/ write cycles.
    INTCONbits.GIE = 1; // Enable interrupts.
}

int main(int argc, char** argv)
{
    Config_Init();
    ecriture_valeur_eeprom();
    while(1)
    {
    }

}

Flasher data dans EEPROM PIC en C
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#4 Message par Guest » jeu. 1 oct. 2015 18:44

bonjour

1et 2

Code : Tout sélectionner

 const unsigned char abc0 @ 0xF00000 = 0x05; // Écrit dans la première case de l'EEPROM la valeur 0x05 au démarrage

Tu ne crois pas, que ton adresse 0xF00000 est un peut élevé.32K soit 0X7FF0 c'est le max.Le problème, ne vient pas de la, car sur 18F, EEPROM, est en fin de programme,pas facile. Voir IMAGE1, bienvenu est en fin de mon programme, écrit avec la fonction ci joint , memprom pointe sur un tableau

Code : Tout sélectionner

void
near ecritureEeprom(int nb)
{
    EEADR = 0;

    for (i=0;i <= nb; i++)
    {
        EECON1bits.EEPGD = 0;
        EECON1bits.WREN = 1;
        EEDATA = memprom[i];
        EECON2 = 0x55;
        INTCONbits.GIE = 0;
        EECON2 = 0xAA;
        EECON1bits.WR = 1;
        INTCONbits.GIE = 1;
        while (!PIR2bits.EEIF); teste le flag eeprom
        PIR2bits.EEIF = 0;
        EEADR++;
    }
}

Je ne connais pas ton problème, tu veux modifier après,ces variables?

A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#5 Message par flolarajasse » jeu. 1 oct. 2015 22:27

J'avais lu sur un forum que l'adresse de l'EEPROM commençait en 0xF00000 ; c'est pour ça que j'ai mis cette valeur.
Mais tu n'a pas spécialement répondu à mes questions avec ton exemple :

- Comment se fait-il que mon instruction écrive dans 2 octets au lieu d'un seul?
- Pourquoi mon programme fonctionne en simul mais pas en debug?

pour répondre à ta question, j'écris des valeurs en EEPROM au démarrage, puis les modifies au cours de mon programme ci-besoin.

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#6 Message par flolarajasse » jeu. 1 oct. 2015 22:29

De plus, je veux savoir ou je stocke mes variables (le plus logique serait en début d'EEPROM) afin de pouvoir les manipuler par la suite.

Flasher data dans EEPROM PIC en C
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#7 Message par Guest » ven. 2 oct. 2015 09:17

bonjour

Vous devriez essayer cela:

Code : Tout sélectionner

const char mesPagesRom [] @ 0XF00000 ={ 0X01,0X9};
cela fonction chez moi :-)
Merci je n’ai jamais utiliser cette adresse. j'utilise EEprom plutôt pour les paramètres a l'int, si eeprom vierge active le menu paramètres
voila pour le 1

Pour le 2 je ne connais que 2 façons d'utiliser le debuggeur :
-en mode simulation
-en mode réel in situ en utilisant comme interface le programmateur entre le PC et la carte

la fonction ecritureEeprom à était passe en mode simulation avec debug. Donc je ne comprend pas trop ou est votre problème(fonctionne en simulation pas en debug), un petit explication merci

A+

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#8 Message par flolarajasse » ven. 2 oct. 2015 09:31

Bonjour,

Mon problème est que mon programme fonctionne bien en mode simulation, en revanche en mode debug (interfaçage avec la carte), je vois sur mon pc que mon programme n'écrit pas sur l'EEPROM.

Flasher data dans EEPROM PIC en C
flolarajasse
Membre
Membre
Messages : 22
Enregistré en : septembre 2015

#9 Message par flolarajasse » ven. 2 oct. 2015 09:36

Ce que j'appelle le mode debug, c'est le mode réel in situ. ;)

Flasher data dans EEPROM PIC en C
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#10 Message par Guest » ven. 2 oct. 2015 09:52

bon ok
faite un test, point d’arrêt avant fonction écriture puis un test après la fonction si ok c'est AHMA,il ne doit pas aimer être interrompue en mode pas à pas entre

Code : Tout sélectionner

        EECON2 = 0xAA;
        EECON1bits.WR = 1;



et la

je préféré utiliser les fag pour tout test de fin d' opération, ici fin écriture car même en simulation j'ai eu quelques soucis avec WR en autre, ce n'est il va de soit qu'un simple conseil :-)

A+


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 53 invités