Comportamento stano unsigned long dopo salvataggio in eeprom

Ciao ragazzi,
Sto provando a salvare in eeprom una variabile unsigned long che uso xome timeout in una funzione millis, faccio un esempio e spiego quello che faccio e quello che ottengo:

Premetto che sto da telefono...

Unsigned long timeout = 38000;
Byte save_timeout_eeprom = 0;

Salvo in eeprom con get trasformando quel 38000 in 38 dividendo per 1000...

save_timeout_eeprom = 38000/1000
eeprom.get(1save_timeout_eeprom);

Quando lo carico com eeprom.put il 38 lo moltiplico per 1000( e imposto quindi timeout = save_timeout_eeprom *1000

Ora premesso che quel 38000 può assumere valori da 1000 a 38000 e che quindi varia, come mai se verifico quanto vale timeout DOPO aver ricaricato con eeprom.put e aver fatto timeout = save_timeout_eeprom*1000 ottengo 4294960296???

Ho pensato che salvavo o caricavo male in eeprom, ma verificandoli con un serial.print sul monitor seriale mi ritrovo perfettemente quello che vado a salvare e poi a caricare.... sempre con un serial print, se verifico dopo timeout = save_timeout_eeprom*1000 mi ritrovo 4294960296.....

Help...
Grazie

Fallo così che il risultato è corretto:

 timeout = save_timeout_eeprom * 1000UL;

Però puoi salvare la variabile timeout direttamente con put.

Ciao.

Che vuol dire quel UL dopo il 1000? Si infacci ci avevo pensato a bypassare la conversione a byte...

Le costanti numeriche manifeste richiedono anche loro una dimensione in byte e il compilatore non la deduce dal valore ma di default usa il tipo int. Per dire al compilatore che la costante deve essere salvata in un tipo di dato ad esempio Unsigned Long (UL). Se è solo Unsigned 1000U e allora sarà usato il tipo uinsigned int.

Ho controllato i metodi get e put possono salvare direttamente la variabile uinsigned long in automatico grazie ai Template del C++.

Ciao.

Grande! Ho capito!!

Grazie!!! Sono giorni che mi ci sto incastrando...

Funziona anche così:

    uint32_t t = 38000;
    byte p = t / 1000;
    uint32_t r = (uint32_t)p * 1000;

Funziona perché p è stato forzato (casting) a tipo grande 32-bit.
Quindi almeno uno degli operandi deve essere grande a sufficienza per contenere il risultato della operazione.

uint32_t è equivalente a unsigned long. Esistono anche uint16_t, uint8_t.
Stessa cosa per int8_t equivalente a byte con segno.

Ciao.

Sì salva con put e si legge con get!

Comunque, un misero 38 puoi salvarlo semplicemente con eeprom.write() o eeprom.update()!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.