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 ---
- 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 ---
Modérateur : Jérémy
EEPROM
EEPROM
L'avantage d'une eeprom est qu'on n'a pas besoin de ces fonctions d'effacement.
Pour le reste, c'est pas compliqué, tu dis que au démarrage le contenu de l'eeprom n'est pas bon. Je repose ma question, lorsque tu mets hors tension, tu connais à peu près son contenu, et bien fais une fonction qui au démarrage affiche toutes les infos stockées, est ce qu'elles sont toutes fausses, ou seulement une partie ?
Pour le reste, c'est pas compliqué, tu dis que au démarrage le contenu de l'eeprom n'est pas bon. Je repose ma question, lorsque tu mets hors tension, tu connais à peu près son contenu, et bien fais une fonction qui au démarrage affiche toutes les infos stockées, est ce qu'elles sont toutes fausses, ou seulement une partie ?
EEPROM
EEPROM
EEPROM
Sans changer le déroulement du programme.
Toutes les secondes (à peu près ou un peu plus) tu lis dans l'eeprom l'octet à l'adresse 0x3FFF et envoi sur uart (ou sur afficheur), cela doit être possible dans ta boucle main. Tu peux ainsi tester ton programme en surveillant l'uart.
Au démarrage juste après le delay 10 ms, UART_Init() et idem tu lis et envoi uart.
Toutes les secondes (à peu près ou un peu plus) tu lis dans l'eeprom l'octet à l'adresse 0x3FFF et envoi sur uart (ou sur afficheur), cela doit être possible dans ta boucle main. Tu peux ainsi tester ton programme en surveillant l'uart.
Au démarrage juste après le delay 10 ms, UART_Init() et idem tu lis et envoi uart.
EEPROM
EEPROM
Bonjour ! :)
Alors voila, j'ai mis a peu près tout tout le main en commentaire hormis les define, initialisation de variables, les ports, ... Et j'ai laissé ceci :
Lcd_Init();
__delay_ms(10);
I2C2_Init();
__delay_ms(10);
SetPoint_Temp = 20;
Lcd_Set_Cursor(1, 1);
sprintf(buffer, "%d ", SetPoint_Temp);
Lcd_Write_String(buffer);
SetPoint_Temp = RestoreSetPointHeater();
__delay_ms(10);
Lcd_Set_Cursor(2, 1);
sprintf(buffer, "%d ", SetPoint_Temp);
Lcd_Write_String(buffer);
De cette façon, sur la ligne 1 j'ai 20, et la ligne 2 j'ai 20 aussi. Si je supprime le "= 20" j'obtiens 0 et 20 (Le 26 a disparu ??). Même après coupure de courant..
J'ai donc remis toute la séquence d'origine au démarrage avec le text "Boot" et tout, et juste avant de rentrer dans le while j'ai remis le morceau "SetPoint_Temp = RestoreSetPointHeater(); + affichage sur le LCD" sans le "= 20" bien entendu et j'ai 20 aussi même après coupure.
J'ai déplacé le morceau "SetPoint_Temp = RestoreSetPointHeater(); + affichage sur le LCD" dans le while d'origine --> Même chose, meme après coupure
J'ai considéré donc mon main comme ok car tout le code est actif sauf l'affichage de la date, heure et temp sur le LCD (uniquement l'affichage) que j'ai mis en /* */
Je suppose donc que le souci viens du Settings.C.
J'ai déplacé le morceau "SetPoint_Temp = RestoreSetPointHeater(); + affichage sur le LCD" juste après les déclarations de variables dans la fonction bool SetPointTemperature(void) présente dans Settings.c et il m'affiche bien 20, l'affichage d'origine ensuite prend le relai et affiche 20 aussi même après coupure.
Je vais donc régler ce SP Temp a 24 via le menu comme je fais normalement et revient dans la fonction et j'obtiens 20 même sans coupure..
J'ai supprimé donc du code que j'ai donné ci dessus cette ligne "SetPoint_Temp = RestoreSetPointHeater();" et il me met donc bien cette fois 24 dans ce cas et si je coupe l'alim et la remet je revient a 20.
Donc la variable globable semble bien être a 24 mais enregistré a 20 dans l'eeprom..
Mes fonctions save ou restore ne serait pas juste ? Etonnant étant donné que SetPoint Brightness n'a pas ce souci..
Alors voila, j'ai mis a peu près tout tout le main en commentaire hormis les define, initialisation de variables, les ports, ... Et j'ai laissé ceci :
Lcd_Init();
__delay_ms(10);
I2C2_Init();
__delay_ms(10);
SetPoint_Temp = 20;
Lcd_Set_Cursor(1, 1);
sprintf(buffer, "%d ", SetPoint_Temp);
Lcd_Write_String(buffer);
SetPoint_Temp = RestoreSetPointHeater();
__delay_ms(10);
Lcd_Set_Cursor(2, 1);
sprintf(buffer, "%d ", SetPoint_Temp);
Lcd_Write_String(buffer);
De cette façon, sur la ligne 1 j'ai 20, et la ligne 2 j'ai 20 aussi. Si je supprime le "= 20" j'obtiens 0 et 20 (Le 26 a disparu ??). Même après coupure de courant..
J'ai donc remis toute la séquence d'origine au démarrage avec le text "Boot" et tout, et juste avant de rentrer dans le while j'ai remis le morceau "SetPoint_Temp = RestoreSetPointHeater(); + affichage sur le LCD" sans le "= 20" bien entendu et j'ai 20 aussi même après coupure.
J'ai déplacé le morceau "SetPoint_Temp = RestoreSetPointHeater(); + affichage sur le LCD" dans le while d'origine --> Même chose, meme après coupure
J'ai considéré donc mon main comme ok car tout le code est actif sauf l'affichage de la date, heure et temp sur le LCD (uniquement l'affichage) que j'ai mis en /* */
Je suppose donc que le souci viens du Settings.C.
J'ai déplacé le morceau "SetPoint_Temp = RestoreSetPointHeater(); + affichage sur le LCD" juste après les déclarations de variables dans la fonction bool SetPointTemperature(void) présente dans Settings.c et il m'affiche bien 20, l'affichage d'origine ensuite prend le relai et affiche 20 aussi même après coupure.
Je vais donc régler ce SP Temp a 24 via le menu comme je fais normalement et revient dans la fonction et j'obtiens 20 même sans coupure..
J'ai supprimé donc du code que j'ai donné ci dessus cette ligne "SetPoint_Temp = RestoreSetPointHeater();" et il me met donc bien cette fois 24 dans ce cas et si je coupe l'alim et la remet je revient a 20.
Donc la variable globable semble bien être a 24 mais enregistré a 20 dans l'eeprom..
Mes fonctions save ou restore ne serait pas juste ? Etonnant étant donné que SetPoint Brightness n'a pas ce souci..
EEPROM
Salut,
Difficile de te suivre, on ne connaît pas ton programme.
Je ne connais qu'une seule méthode pour résoudre ce problème, elle est citée plus haut.
Difficile de te suivre, on ne connaît pas ton programme.
Je ne connais qu'une seule méthode pour résoudre ce problème, elle est citée plus haut.
Code : Tout sélectionner
void DebugTemp(void)
{
uint8_t val = EEPROM_Read_Byte(SLAVE_EE_BANK0_ADDR, SETPOINT_HEAT);
sprintf(buffer, "%03d %03d\n", SetPoint_Temp, val);
UART_WriteString(buffer);
}EEPROM
Code : Tout sélectionner
void SaveSetPointHeater(uint8_t SetPoint_Temp) {
EEPROM_Write_Byte(SLAVE_EE_BANK0_ADDR, SETPOINT_HEAT, SetPoint_Temp);
__delay_ms(5);
} Tu choisis le nom d'une variable globale comme paramètre de fonction, c'est un peu téméraire, bien que ça ne devrait pas poser de problème, c'est juste confus.
EEPROM
Si je fais cette commande dans le main avant le while et après toute la séquence d'initialisation (Boot), j'ai : 20 (Si je régle la température a 23 via la fonction "bool SetPointTemperature(void)" du settings.c, j'obtiens bien 23 une fois de retour dans le main, mais si je coupe le courant et le remet je revient a 20).
Si je déplace cette commande a la toute fin du while du main j'obtiens : 20 (Si je régle la température a 23 via la fonction "bool SetPointTemperature(void)" du settings.c, j'obtiens bien 23 une fois de retour dans le main, mais si je coupe le courant et le remet je revient a 20).
Je la déplace dans la fonction "bool SetPointTemperature(void)" et j'obtiens 20 (Si je régle la température a 23, j'obtiens bien 23 une fois de retour dans le main, mais si je coupe le courant et le remet je revient a 20).
Si je comprends bien, je ne peux pas mettre une variable globale en argument de fonction alors dans les règles de bonne pratique ? Je devrais faire par exemple plutot "void SaveSetPointHeater(uint8_t newSetPoint_Temp)" ?
J'ai refait les tests avec cette modification quand même mais la valeur de SetPoint_Temp se perds systématiquement a chaque redémarrage et revient a 20
Si je déplace cette commande a la toute fin du while du main j'obtiens : 20 (Si je régle la température a 23 via la fonction "bool SetPointTemperature(void)" du settings.c, j'obtiens bien 23 une fois de retour dans le main, mais si je coupe le courant et le remet je revient a 20).
Je la déplace dans la fonction "bool SetPointTemperature(void)" et j'obtiens 20 (Si je régle la température a 23, j'obtiens bien 23 une fois de retour dans le main, mais si je coupe le courant et le remet je revient a 20).
Si je comprends bien, je ne peux pas mettre une variable globale en argument de fonction alors dans les règles de bonne pratique ? Je devrais faire par exemple plutot "void SaveSetPointHeater(uint8_t newSetPoint_Temp)" ?
J'ai refait les tests avec cette modification quand même mais la valeur de SetPoint_Temp se perds systématiquement a chaque redémarrage et revient a 20
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 18 invités


