Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata

Problema lettura EEprom interna

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

0
voti

[1] Problema lettura EEprom interna

Messaggioda Foto UtenteJackd » 3 feb 2018, 12:36

Buongiorno,
sto diventando matto con una schedina, fatta da me con sopra atmega328p-au, non ha bootloader arduino, ne ha porta seriale, (fisicamente i pin non sono connessi a nulla per ora), per scrivere il firmware uso l'ide di arduino 1.7.11, per caricare il programma uso il circuitino "Arduino ISP".

Le mie conoscenze di programmazione in genere sono piuttosto elementari, anche se in linea di massima credo di avere un buon senso logico.

Via via ho scritto in blocchi il firmware, fino ad arrivare alla fine di voler usare anche due dati salvati in eeprom: un booleano ed un valore numerico ( tra 0 e 100 )
Il resto del programma gira abbastanza bene senza grossi problemi e questa è già una vittoria ,il problema che mi trovo davanti è che quando si alimenta la scheda, apparentemente a random il firmware salti di leggere il valore boolenano salvato in memoria; cioè posso accendere la scheda N volte e legge il valore corretto, come la N+1 volta leggere il valore errato.
Di seguito riporto le porzioni di codice che interagisce con eeprom

definizioni variabili
Codice: Seleziona tutto
#include <eeprom.h>
...
int var1;
bool var2=true; //valore predefinito
unsigned int eeVar1
byte eeVar2;
...


setup inizializza array di dati, imposta ingressi/uscite, crea caratteri custom per display e per ultima cosa Legge la eeprom:

Codice: Seleziona tutto
void setup() {
...
delay(3000);//sicurezza completamento fase 1
eeVar1=EEPROM.read(20); //prima posizione e lettura eeprom
//se eeprom vergine limito valore tra 0 e 100
if(eeVar1>=100){eeVar1==100;}
if(eeVar1<=0){eeVar1==0;}
var1=eeVar1;
eeVar2=EEPROM.read(30); //seconda ed ultima posizione e lettura
//debug vado a modificare var2 se eeVar2 è esattamente quello che mi aspetto
if (eeVar2 ==0b11111111) {var2=true;}
if (eeVar2 ==0b00000000) {var2=false;}
//fine debug
}//fine setup


Per gestire graficamente i testi, e cambiare i parametri, ho ragionato come una griglia di elementi, le celle di questa griglia sono nominate "frame", il loop fa le sue cose :mrgreen: ed ad un certo punto controlla lo stato di 4 pulsati ed un encoder, che mi permettono di muovermi tra le celle della griglia e di cambiare i valori.

qui la parte che gestisce il cambio dei valori, questo è l'unico punto dove il sw abbia la possibilità di scrivere dentro alla eeprom.

Codice: Seleziona tutto
void loop() {
...
...
...
//switch azioni vs pulsante vs dove
switch (return_pulsanti_analog){
   case 0:
   break;
   
   case 1: //pulsante enter
        stepY++;
   if(frame==6){EEPROM.update(20, eeVar1);}
   if(frame==5){EEPROM.update(30, eeVar2);}
   delay(300);
   break;
   
   case 2: //pulsante 2
        comInt();
   delay(300);
   break;
   
   case 3: //pulsante esc   
        if(frame==2 || frame==3 || frame==4 || frame ==8){stepX=0;}
   stepY--;
   delay(300);
   break;
   
        case 4: //pulsante non usato
   break;
   
       case 5: //rotazione encoder ccw
   if (frame==5){var2 ^=1;}
   else if(frame==6){eevar1--;}
   else if(frame==2 || frame==3 || frame==4 || frame==8){stepX--;}
   delay(150);
   break;

   case 6: // rotazione encoder cw
   if(frame==5){var2 ^=1;}
   else if(frame==6){eeVar1++;}
   else if(frame==2 || frame==3 || frame==4 || frame==9){stepX++;}
   delay(150);
   break;

}//end switch azioni
...
...
impaginazione();
}//fine loop


di seguito la porzione di codice che effettivamente va a scrivere sul display, ho scelto di modificare il contenuti di eeVar2 in base a var2 in questo punto del programma, per avere riscontro diretto anche su display

Codice: Seleziona tutto
void impaginazione(){
if(allarme==false){
   if(frame!=frameOld){//testi statici
      switch(frame){
      }//fine switch
      frameOld=frame;
    ...
   }//fine diverso
   else {
      switch(frame)
      ...
      case 5:
      lcd.print("...");
      if (var2==true){
      lcd.print("...");
      eeVar2=0b11111111;}
      if (var2==false){
      lcd.print("...");
      eeVar2=0b00000000;}
      break;
     ...
}//fine else
}//fine false
}//fine impaginzaione



In ogni caso ho fatto un investimento nel futuro... ho ordinato Atmel-ICE, ora devo aspettare che mi arrivi, poi toccherà chiedere come usarlo....
Avatar utente
Foto UtenteJackd
430 2 6
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 15 set 2014, 18:10
Località: Padova

0
voti

[2] Re: Problema lettura EEprom interna

Messaggioda Foto UtenteJackd » 13 feb 2018, 11:38

La situazione diventa più intricata...

Sembrerebbe che qualcosa vada a scrivere sull'eeprom in maniera completamente arbitraria, ma a sto punto non capisco se è un problema hw o sw.

Per venirci a capo, ho provato a cambiare area di memoria dove salvare i dati, ma nulla è cambiato, pensando al guasto hardware ho preso una scheda nuova, settati i fuse, caricato il firmware,

acceso scheda e modificato i parametri con i tasti/encoder ecc...
ho fatto il primo salvataggio in eeprom, HEX "47" ed "00" (niente di che solo 2 dati)
ho scaricato sul PC e letto il contenuto della eeprom, effettivamente c'è il "47" ed il "00"
ho spento e riacceso la scheda molteplici volte, fino a quando non si è manifestato di nuovo il problema.
ho scaricato e letto di nuovo il contenuto della eeprom e confrontandolo col salvataggio precedente,
mi trovo con la cella che da "00" è diventata "FF";

non contento uso i tasti della scheda e riporto il valore da "FF" a "00" e salvo (l'altro parametro non lo tocco)
estraggo ancora il contenuto della eeprom per verificare la corretta scrittura, ed Ok scrittura corretta;

di nuovo spengo e accendo la scheda varie volte fino alla comparsa del problema, ed ora che si è riproposto il problema mi ritrovo, estraendo l'eeprom che oltre ad avermi riportato a "FF" la cella col "00", mi è andato a scrivere su altre 3 posizioni.

Sinceramente a questo punto non ci sto capendo più nulla. Qualsiasi indicazione la troverei estremamente interessante.

Per completezza riporto il contenuto eeprom corretto prima, ed errato di seguito

Codice: Seleziona tutto
:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFF47FFFFFFFFFFFFFFFFFFFFFFA8
:10002000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFDF
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
:00000001FF

righe diverse sono precedute da *
Codice: Seleziona tutto
:10000000FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04
:10001000FFFFFFFF47FFFFFFFFFFFFFFFFFFFFFFA8
*:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
*:10008000FFFFFFFFFFFFFFFFFFFFFF02FFFFFFFF7D
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
*:10029000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
*:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0C
:00000001FF
Avatar utente
Foto UtenteJackd
430 2 6
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 15 set 2014, 18:10
Località: Padova


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti