attiny85 problemi memoria

Salve a tutti, sto avendo qualche problema con la gestione della eeprom del chip attiny85, ogni volta che scrivo una/delle variabili sulla memoria eeprom a volte mi ritrovo un dato corrotto o diverso da quello scritto inizialmete , considerate che utilizzo il 95% della memoria flash per i programmi e il 30% della memoria di lavoro, teoricamente non dovrei avere problemi del genere , paradossalmente mi viene da pensare che non sto utilizzando la libbreria corretta o per via della memoria flash utilizzata posso avere problemi di instabilità con le variabili di sistema o quantaltro, consigli in merito?

fatemi sapere

saluti

Mmmm … NON è normale.

Meglio che metti il codice che stai usando (… mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra) così magari gli si può dare un’occhiata ::slight_smile:

Guglielmo

il codice è molto lungo e articolato, sono mesi che lo sto studiando , è un’ applicazione speciale , ho usato solo le due istruzioni per la gestione della eeprom

EEPROM.write
EEPROM.read

il tutto sembra funzionare ma dopo 3 ore di lavoro incominciano i casini, considera che ho messo un contatore di cicli che dopo 4 ripetizioni aggiorna la variabile di contatore nella eeprom, ho paura che devo mettere un controllo sulla scrittura temporale per permettere che l’info venga scritta correttamente , stesso fenomeno lo riscontro quando effettuo l’aggiornamento delle variabili inserite nella eeprom , inizialmente avevo distanziato la loro allocazione , non ho usato allocazioni di memoria consecutivi, però rilevo sempre la problematica in modo random , sto pensando a utilizzare le istruzioni native del processore per capire di risolvere la problematica
in basso un piccolo pezzo del programma

void setup () {
  fabbrica = EEPROM.read(1);
  if (fabbrica != 1) { 
    EEPROM.write(15, 2); 
    EEPROM.write(1, 1);
    EEPROM.write (2, 3);
    EEPROM.write (3, 3); 
    EEPROM.write (4, 2); 
    EEPROM.write (6, 2);
    EEPROM.write (7, 0); 
    EEPROM.write (8, 0);
    EEPROM.write (9, 0);
    EEPROM.write (12, 0); 
  }
  cicli = EEPROM.read(15);
  t_ciclo = EEPROM.read (2);
  ciclimanut = EEPROM.read (3);
  t_ciclo_com = EEPROM.read (4);
  t_avviso = EEPROM.read (6);
  tre = EEPROM.read(7);
  due = EEPROM.read(8);
  uno = EEPROM.read(9);
  cicli_manut = EEPROM.read(12);
  contatore = ((uno << 0) & 0xFF) + ((due << 8) & 0xFFFF) + ((tre  << 16) & 0xFFFFFF);

sto pensando di cambiare i comandi e utilizzare

EEPROM.update EEPROM.get

però mi mangiano troppa memoria e non riesco a compilare il programma

forse ho trovato il problema , mediamente scrivo la eeprom ed effettuo una pausa con un delay per xx secondi , ho notato che qualora viene disalimentato il chip durante il delay il sistema impazzisce e non riesce a scrivere correttamente il dato provocando il problema pecedentemente evidenziato, il delay blocca il chip e non fà effettuare la scrittura della eeprom?

è possibile un fenomeno del genere?

in basso un pezzo del programma dove rilevo il problema , il delay temporale è settato da questa istruzione
delay (t_ciclo_completato);

 if (conta == cicli) { // verifica se il ciclo complessivo è ultimato
    // Riporta la variabile a 0
    digitalWrite (segn, LOW);
    digitalWrite (rele, HIGH);
    digitalWrite (led, HIGH);
    if (contatore_par - contatore >= 10) { // se il contatore è incrementato di 10 valori aggiorna la memoria e allinea i contatori
      uno = contatore_par >> 0 & 0xFF;
      due = contatore_par >> 8 & 0xFF ;
      tre = contatore >> 16 & 0xFF;
      EEPROM.write (7, tre);
      EEPROM.write (8, due);
      EEPROM.write (9, uno);
      contatore = contatore_par;
    }
    delay (t_ciclo_completato);
    digitalWrite (rele, LOW);
    digitalWrite (led, LOW);
    conta = 0;
    start = 0;
  }

ho visto che in alcune soluzioni viene inserita una pausa di 5mS ogni istruzione di scrittura, perchè mediamente il chip impiega cirva 2 mS per effettuare la scrittura, provo ad inserirla e vediamo che succede

Ma tu togli alimentazione ? ? ?

pinoros64: ho notato che qualora viene disalimentato il chip durante il delay il sistema impazzisce ...

Perché la EEPROM ha dei tempi ben precisi e ... NON puoi disalimentare il chip durante il tempo di scrittura interna, pena, appunto, la perdita di dati !!!

Guglielmo

infatti, ho trovato quale era il problema , ho messo il dispositivo alimentato a batteria, dopo circa 2 ore di lavoro al suono del buzzer, ho notato che l'alimentatore 78L05 si sedeva e non mi garantiva l'alimentazione abbassandola , in questo caso la memorizzazione del nuovo valore andava in errore provocando i dati corrotti riscontrati , adesso sto utilizzando un modulo dc-dc bypassando l'integrato on board, vediamo cosa succede.