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

EEPROM
satinas
Expert
Expert
Messages : 1534
Enregistré en : novembre 2015

#31 Message par satinas » dim. 7 juin 2026 12:05

A mon avis, l'usure de l'eeprom et le temps de recherche sont les mêmes que tu utilises 1 bloc ou 2. Chaque fois que tu fais une écriture d'1 octet ou plusieurs, c'est toute la page qui est écrite, et quelque soit le bloc. Je ne connais pas la fréquence d'écriture des enregistrements, c'est sans doute le stockage eeprom de currentAddress qui pose problème car très souvent écrit et toujours au même endroit.

EEPROM_RESERVED_START n'intervient pas dans le contenu du for, le for écrit systématiquement 128 fois 0 à partir de l'adresse addr, qui fait des grands sauts de 128.
Pourquoi ce SaveSetPointHeater() répété 128 fois ?

Code : Tout sélectionner

    for (uint16_t addr = 0; addr < EEPROM_RESERVED_START; addr += PAGE_SIZE) {
        I2C2_Start();
        I2C2_WriteAddr(SLAVE_EE_BANK0_ADDR);
        I2C2_WriteData((addr >> 8) & 0xFF);
        I2C2_WriteData(addr & 0xFF);
        for (uint8_t i = 0; i < PAGE_SIZE; i++) {
            I2C2_WriteData(0x00);
        }
        I2C2_Stop();
        __delay_ms(10);
        SaveSetPointHeater(MemSPTemp);
        __delay_ms(10);
    }

Si tu ne peux utiliser l'uart, affiche chaque seconde sur le lcd l'octet de l'eeprom que tu veux surveiller, en le lisant à chaque fois. J'ai du mal à croire que lorsque tu vas éteindre le montage, la dernière valeur affichée ne sera pas réaffichée au démarrage.

EEPROM
Stefox
Débutant
Débutant
Messages : 81
Enregistré en : juillet 2025

#32 Message par Stefox » dim. 7 juin 2026 12:12

Donc tu ferais banque 1 pour les codes avec les dates banque 2 pour les adresses reservé ?

SaveSetPointHeater(MemSPTemp); n'a pas d'interet d'être fait 128 fois, c'est une erreur, je viens de le déplacer. :lol:

Si je met une valeur dans SP Temp, (18 imaginons), si je veux aller la régler, je repasse donc via mon menu et je récupère bien 18. Si je coupe l'alimentation et la remet et écrit sur le lcd la valeur du SP Temp avant de rentrer dans le while du main, je recupère bel et bien 138. L'écriture a peu être un souci, mais je ne comprend pas pourquoi SP Brightness n'est pas impacté et les codes avec les dates non plus.

EEPROM
satinas
Expert
Expert
Messages : 1534
Enregistré en : novembre 2015

#33 Message par satinas » dim. 7 juin 2026 12:26

Tu repasses, tu récupères, tu remets, tu rentres, moi ce qui m'intéresse c'est ce qu'il y a dans l'eeprom :-)

Si tu stockes un pointeur, pas besoin d'effacer l'eeprom.
On peut se passer de pointeur, on part d'une eeprom effacée, et on scrute l'eeprom pour chercher le premier emplacement vide, là c'est plus long lors de l'écriture.

EEPROM
Stefox
Débutant
Débutant
Messages : 81
Enregistré en : juillet 2025

#34 Message par Stefox » dim. 7 juin 2026 12:33

Ok donc je fais ceci a la ligne 295 juste avant le while du main :

Lcd_Clear();
SetPoint_Temp = RestoreSetPointHeater();
Lcd_Set_Cursor(1, 1);
sprintf(buffer,"%d", SetPoint_Temp);
Lcd_Write_String(buffer);
__delay_ms(3000);

Je lance le programme j'obtiens 138.

Je déplace ce morceau en ligne 147 juste après le delay 10ms de I2C2_Init(); et j'obtiens aussi 138.

j'ai ensuite fait ceci juste après le bout de code que j'ai écrit ci dessus : SaveSetPointHeater(test); avec test initalisé a 19, j'ai chargé le programme puis j'ai supprimé la déclaration de variable et cette fonction save du main et re-charger le programme et j'obtiens 19 donc la ça a l'air d'aller, si je remet le bout de code que j'ai écrit au dessus en ligne 295, j'obtiens bien 19 aussi

EEPROM
satinas
Expert
Expert
Messages : 1534
Enregistré en : novembre 2015

#35 Message par satinas » dim. 7 juin 2026 12:43

Avec le lcd tu n'as même pas à attendre 1 seconde. Dans ta boucle main, tu ajoutes une lecture de l'octet eeprom et affichage sur le lcd. Tu vérifieras que quand tu le modifies le lcd se met à jour et après un off/on ce sera le même affichage, car ton I2C marche.

EEPROM
Stefox
Débutant
Débutant
Messages : 81
Enregistré en : juillet 2025

#36 Message par Stefox » dim. 7 juin 2026 12:51

Ok ok donc alors je met :

Lcd_Clear();
SetPoint_Temp = RestoreSetPointHeater();
Lcd_Set_Cursor(1, 1);
sprintf(buffer,"%d", SetPoint_Temp);
Lcd_Write_String(buffer);

Dans le while en ligne 319 et je met en commentaire l'affichage de la température, date et heure

Au démarrage, j'ai 19 et elle reste a 19. Si je la change via le menu, elle ne varie pas du tout une fois de retour dans le main (J'ai aussi 19 en revenant dans le menu du réglage après l'avoir modifié)

EEPROM
Stefox
Débutant
Débutant
Messages : 81
Enregistré en : juillet 2025

#37 Message par Stefox » dim. 7 juin 2026 13:00

Je pense avoir compris, dis moi ce que tu en penses :

Dans settings.c j'ai la fct : bool SetPointTemperature(void) en ligne 760

je met if (OK_BUTTON == 0) dans le while, mais OK_BUTTON == 0 est aussi une condition de sortie de la boucle while

j'ai déplacé le if en dehors du while et mnt ça marche on dirait, je récupère bien la modif meme après coupure

EEPROM
satinas
Expert
Expert
Messages : 1534
Enregistré en : novembre 2015

#38 Message par satinas » dim. 7 juin 2026 13:07

L'idéal est de ne pas utiliser lors du debug la variable SetPoint_Temp et la fonction RestoreSetPointHeater();
Le debug ne doit pas toucher au programme. Tu avais un exemple ici


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Baidu [Spider] et 6 invités