je travaille avec un PIC18F6722, et je rencontre quelques soucis lorsque que je viens lire mes données en EEPROM, ça marche généralement bien (à 80%) mais parfois (toujours pour les mêmes valeurs), il récupère des informations mauvaises...
Quel pourrait etre le probleme? Je sais qu'avec juste ça comme infos il est difficile pour vous de savoir, mais le programme est long!! alors si vous aviez deja rencontré ça...
les mêmes adresses ou données ? Tu n'aurais pas usé prématurément ces adresses par des écritures répétées?
L'age n'est pas un handicap .... Encore faut-il arriver jusque là pour le constater !
27/05/2009 - 08h45
lil-vince
Date d'inscription
février 2008
Localisation
Lyon
Âge
27
Messages
1 112
Re : PIC]-Lecture sauvegarde en EEPROM aléatoire
Salut,
Quel est (ou quels sont) les types de données que tu sauvegarde?
Comment les écrits-tu et les lis-tu? (pointeurs sur?)
+ mêmes questions que DAUDET
Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius
27/05/2009 - 09h17
jorg1n
Date d'inscription
septembre 2007
Messages
1 873
Re : PIC]-Lecture sauvegarde en EEPROM aléatoire
Bonjour,
Quel est (ou quels sont) les types de données que tu sauvegarde?
voila ma façon pour lire:
Code:
char readEEPROM ( int addr )
{
EEADR=(addr); // Extraction des 8 bits faible de addr et les placent dans EEADR
EECON1bits.EEPGD = 0; // Access data EEPROM memory
EECON1bits.CFGS = 0; // Access Flash program or data EEPROM memory
EECON1bits.RD = 1; // Initiates an EEPROM read
data = EEDATA;
return data;
}
void ReadIntoEEPROM (unsigned short addr, unsigned char dataLen, unsigned char* pDest )
{
while (dataLen--)
{
*pDest++ = readEEPROM ( addr++ );
}
}
et voila celle pour écrire :
Code:
void writeEEPROM ( unsigned short addr, char data)
{
static unsigned char GIE_Status;
EEADR=(addr); // Extraction des 8 bits faible de addr et les placent dans EEADR
EEDATA = data; // Data to be written in EEPROM
EECON1bits.EEPGD = 0; // Access data EEPROM memory
EECON1bits.CFGS = 0; // Access Flash program or data EEPROM memory
EECON1bits.WREN = 1; // Allows write cycles to Flash program/data EEPROM
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; // Initiates a data EEPROM erase/write cycle
while(EECON1bits.WR); // Wait for completion of write sequence
INTCONbits.GIE=GIE_Status; //Restore the original global interrupt status
PIR2bits.EEIF = 0; //The write operation is not complete or has not been started
EECON1bits.WREN = 0; //Inhibits write cycles to Flash program/data EEPROM
}
void SaveIntoEEPROM (unsigned short addr, unsigned char *ptr, unsigned char dataLen)
{
while (dataLen--)
{
writeEEPROM ( addr++, *ptr++);
}
}
il s'agit des variables fixées au même adresse et la données est toujours la même lorsqu'il y a un problème...
Tu n'aurais pas usé prématurément ces adresses par des écritures répétées?
C'est vrais, j'utilise depuis pas mal de temps le même µC (environ 10 mois) et vu que je travaille toute la journée dessus, et que je reprogramme et reteste a chaque fois... c'est peut etre pour ça?
il s'agit des variables fixées au même adresse et la données est toujours la même lorsqu'il y a un problème...
Et tu ne veux pas nous dire quelle est cette valeur et ce que tu lis?
T´as un debbugger pour aller voir ce qu´il écrit à ces adresses?
Je pense que c´est normal que ça ne fonctionne pas, il faut faire "abstraction" du type si tu veux lire un float en plusieurs fois.
Ton ReadEEPROM renvoi un char (donc implicitement signé)!
C'est vrais, j'utilise depuis pas mal de temps le même µC (environ 10 mois) et vu que je travaille toute la journée dessus, et que je reprogramme et reteste a chaque fois... c'est peut etre pour ça?
Si tu ne nous dit pas combien de fois par jour (environ) tu les reprogrammes pas facile de repondre!
Une EEPROM a un nombre de cycle limité à 100kcycles je crois
Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius
T´as un debbugger pour aller voir ce qu´il écrit à ces adresses?
Si, mais j'ai du mal lorsque je suis en mode debugger a avoir le phénomène.
Et tu ne veux pas nous dire quelle est cette valeur et ce que tu lis?
Par exemple, au lieu de m'écrire une variable de type INT = 40, il m'écrit une variable = 610...
Et lorsque c'est un Float, il m'écrit 0.00 au lieu de 16.00...
Je pense que c´est normal que ça ne fonctionne pas, il faut faire "abstraction" du type si tu veux lire un float en plusieurs fois.
Ton ReadEEPROM renvoi un char (donc implicitement signé)!
je ne te suis pas!!!
Si tu ne nous dit pas combien de fois par jour (environ) tu les reprogrammes pas facile de repondre!
Une EEPROM a un nombre de cycle limité à 100kcycles je crois
Je sais pas, entre 30 et 50 fois par jour... ma méthode de développement, n'est pas bonne je crois!!! je devrais inhiber les fonctions de travaille sur EEPROM...
28/05/2009 - 07h24
lil-vince
Date d'inscription
février 2008
Localisation
Lyon
Âge
27
Messages
1 112
Re : PIC]-Lecture sauvegarde en EEPROM aléatoire
Salut,
Si, mais j'ai du mal lorsque je suis en mode debugger a avoir le phénomène.
Je ne comprend pas trop!normalement le fonctionnement est le même...
Désolé, mais ton programme n´est pas très clair (pour moi), je n´utilise pas des incrémentations / décrémentation dans les boucles:
Code:
while (dataLen--)
{
writeEEPROM ( addr++, *ptr++);
}
Est ce que par exemple dataLen est décrémenté à la première boucle? Ce qui ferait que si dataLen = 2 il n´effectuera la boucle qu´une seule fois... ?
Par exemple, au lieu de m'écrire une variable de type INT = 40, il m'écrit une variable = 610...
Et lorsque c'est un Float, il m'écrit 0.00 au lieu de 16.00...
Ce sont les vrais valeurs que tu obtiens?
T´aurais pas un ou deux exemples en plus (qui marchent et qui marchent pas)?
Il faut essayer de trouver le lien entre ces valeurs et pourquoi il lit y au lieu de x...
C´est pour ça qu´avec le debugger, c´est plus imple, tu vas lire directement "avec tes yeux" ta mémoire et tu cherches ta valeurs sauvegardée (comme ça tu vois si elle est écrite à la mauvaise adresse, inversée, si elle n´est pas lá, etc...)
Dernière modification par lil-vince ; 28/05/2009 à 07h27.
Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius
03/06/2009 - 16h16
jorg1n
Date d'inscription
septembre 2007
Messages
1 873
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
Je reviens vers vous car j'ai visualisé l'EEPROM lorsque je récupérai des informations aléatoire, et voila le problème:
Je n'écris que sur les adresses qui vont de 000 à 0FFalors que j'écris des données sur les adresses jusqu'a 3C0.
Et lorsque j'écris une donnée à une adresse supérieure à 0FF, il me ré-écrit sur des adresses comprises entre 0 et 0FF..et donc écraser des valeurs existantes mais qui n'ont rien a voir, et donc quand je viens lire ma donnée, je récupère une valeur erronée...
D'ou viens le problème??? J'imagine que cela tourne autour de l'adressage... mais ou exactement???
MErci d'avance
04/06/2009 - 06h44
jorg1n
Date d'inscription
septembre 2007
Messages
1 873
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
Bonjour à tous,
auriez vous une petite idée pour résoudre ce problème, dans le post n°4, il y a mes fonctions de lecture et d'écriture, alors si vous pouviez jetez un oeil!!!
Merci d'avance et bonne journée à tous
04/06/2009 - 07h06
lil-vince
Date d'inscription
février 2008
Localisation
Lyon
Âge
27
Messages
1 112
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
Envoyé par code Jorg1n
EEADR=(addr); // Extraction des 8 bits faible de addr et les placent dans EEADR
Comment tu pourrais écrire à une adresse superieur à 0xFF si tu a une adresse sur 8 bit ???
Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius
04/06/2009 - 07h46
jorg1n
Date d'inscription
septembre 2007
Messages
1 873
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
Bonjour lil-vince,
Comment tu pourrais écrire à une adresse superieur à 0xFF si tu a une adresse sur 8 bit ???
c'est bien ce que je pensais... il y avait une erreur a ce niveau. En fait j'ai récupéré un morceau de soft pour ecriture sur un EEPROM de 256 octets et pas pour une de 1024...
Non, je ne suis pas au courant, mais je vais m'informer de tout ça...
Si tu as des infos ou même des routines je suis preneur...
Merci encore lil-vince
04/06/2009 - 08h12
lil-vince
Date d'inscription
février 2008
Localisation
Lyon
Âge
27
Messages
1 112
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
C´est quand même pas bien difficile, il y a des notes d´appli pour presque tout, surtout pour les µC!
Pour moi, ça prend moins de temps de lire une note d´appli correctement, donc de bien comprendre tous les principes et de faire SON programme (ce qui n´empêche pas de s´inspirer d´exemples ou de celui des autres), comme ça on comprend ce que l´on fait et quand ça ne marche pas, on comprend vite pourquoi...
Si tu as des infos ou même des routines je suis preneur...
Je t´ai déjà dit que je ne programmais pas sur PIC (mais sur MSP430 et maintenant sur STM32)...
Mais même en ayant jamais approché un PIC, j´ai trouvé en 5min...
Normalement, tu devrais toujours avoir la datasheet sous les yeux quand tu programmes et quand tu as commencé ton prog de sauvegarde des données en eeprom, la première chose que tu aurais du faire, c´est lire le paragraphe EEPROM et voir s´il n´y avait pas une note d´appli pour rentrer plus dans les détails si tu le voulais (ici je pense que la datasheet suffit)!
C´est impossible de faire sans ou alors on ne comprend pas et on se retrouve bloqué un jour...
Dernière modification par lil-vince ; 04/06/2009 à 08h16.
Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius
04/06/2009 - 10h41
jorg1n
Date d'inscription
septembre 2007
Messages
1 873
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
Merci lil-vince...
c'est écrit noir sur blanc:
The EEADRH:EEADR register pair is used to address
the data EEPROM for read and write operations.
EEADRH holds the two MSbs of the address; the upper
6 bits are ignored. The 10-bit range of the pair can
address a memory range of 1024 bytes (00h to 3FFh).
Et moi je n'utilisais que le registre EEADR...
je pense donc faire cela dans ma routine:
Code:
EEADR=(addr & 0x00FF);
EEADR=((addr>>8)&0x0003);
comme ça je récupère les bits de poids faible et je les mets dans EEADR, et ensuite les bits de poids forts que je stocke dans EEADRH.
04/06/2009 - 13h46
jorg1n
Date d'inscription
septembre 2007
Messages
1 873
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
Et bien ça marche parfaitement, merci encore lil-vince...
Bonne fin de journée à tous
04/06/2009 - 13h55
lil-vince
Date d'inscription
février 2008
Localisation
Lyon
Âge
27
Messages
1 112
Re : [PIC]-Lecture sauvegarde en EEPROM aléatoire
De rien, mais la prochaine fois lis la datasheet, t´aurais gagné une semaine ..
Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius