RTC DS3231 impostare allarmi

ziopippo:
Questa è la dichiarazione delle variabili:

uint8_t tmpYear;

Il motivo per cui ho dovuto fare quelle strane sottrazioni non me lo spiego neanche io, soprattutto quella relativa al 2018.

Ok, tutto chiaro, più o meno, c'è ancora un errore nascosto da qualche parte ma adesso è chiaro.

Partiamo dal principio.

La funzione 'year()' restituisce un valore a 16 bit compreso tra 1970 2069.

La cosa più semplice sarebbe quindi usare una 'tmpYear' da 16 bit (una banale variabile tipo int) per manipolare l'anno (regolandolo quindi con l'encoder dal 1970 al 2069), e poi sottrarre 1970 quando la si vuole copiare nella 'tm.Year', perché 'tm.Year' è un offset rispetto al valore 1970. Tutto questo in tabella 1, semplice, lineare, nessuna possibilità di errore:

TABELLA 1

                    -1970
   Year()    tmpYear      tm.Year
------------------------------------
   1970       1970         0
   1971       1971         1
    .         .            .
    .         .            .
   1998       1998         28
   1999       1999         29
------------------------------------
   2000       2000         30
   2001       2001         31
   2018       2018         48
    .         .            .
    .         .            .
   2068       2068         98
   2069       2069         99

MA...
Tu hai usato una 'tmpYear' a 8 bit che non può contenere un valore superiore a 255, quindi servono due operazioni invece di una. Prima sottraiamo 2000 al valore restituito da 'year()', in modo da lavorare in 'tmpYear' a 8 bit con un valore compreso tra 0 e 69 per gli anni 2000..2069, ma anche un valore negativo in complemento a due per gli anni dal 1970 al 1999.

E' un problema? No. Ci basta regolare l'anno in 'tmpYear' solo da 0 a 69 senza sconfinare nei valori negativi e tutto funziona. Quando dobbiamo aggiornare 'tm.Year' dobbiamo anche aggiungere 30 per riportare i valori come 'tm.Year' richiede. Il tutto in tabella 2, anche questo funziona senza errori:

TABELLA 2

        -2000         +30
   Year()    tmpYear      tm.Year
------------------------------------
   1970       226 (-30)    0
   1971       227 (-29)    1
    .         .            .
    .         .            .
   1998       254 (-2)     28
   1999       255 (-1)     29
------------------------------------
   2000       0            30
   2001       1            31
   2018       18           48
    .         .            .
    .         .            .
   2068       68           98
   2069       69           99

MA...
Invece tu hai fatto così per tentativi (tabella 3):

TABELLA 3

         -1999        -2018
    Year()    tmpYear      tm.Year
-------------------------------------
    1970       227 (-29)    1
    1971       228 (-28)    2
     .         .            .
     .         .            .
    1998       255 (-1)     29
    1999       0            30
-------------------------------------
    2000       1            31
    2001       2            32
    2018       19           49
     .         .            .
    2068       69           99
    2069       70           100

Iniziamo con il lolloso 2018... sottrarre 2018 da una variabile 8 bit senza segno è del tutto equivalente a sommare 30, in pratica se scrivevi +30 era la stessa cosa (il fatto che siamo nel 2018 è una pura coincidenza :slight_smile: )

Di differente dalla tabella 2 rimane solo quel 1999... che sfalsa di uno i valori degli anni, per cui va sicuramente a "compensare" un errore (probabilmente un decremento) presente da qualche altra parte.

Risolto quell'errore si può quindi tranquillamente usare l'attuale procedimento (ma sottraendo 2000 come in tabella 2) regolando 'tmpYear' da 0 a 69.

Il caso è chiuso :slight_smile: