Buonasera a tutti,
d'accordo che sono niubbio sia di C/C++ che di Arduino, ma questa proprio non la capisco.
E' ancora lo schetch dell'orologio tuttofare di qualche giorno fa, nel tempo libero continuo la cura dimagrante per la prova costume dell'ATtiny85 e oggi ho cercato di fare un reset via software invece di azzerare una per una tutte le singole variabili.
Ho trovato il reset tramite WhatchDog, fighissimo.
L'ho implementato, provato (SOLO QUELLO
) e sono andato avanti, ma a distanza di ore quando dopo altri interventi ho usato i pulsanti per impostare la data all'uscita del "setting" si blocca(va) tutto.
Segue uno spezzone del codice coinvolto con un minimo di commenti per capirrne il senso.
La parte incriminata è la #define all'inizio insieme alle tre righe marcate con *****
...
// --- Thanks https://forum.arduino.cc/index.php?topic=35155.msg256412#msg256412
#include <avr/io.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}
...
// --- Questa si occupa di mostrare e far impostare i sotto-elementi del menu principale
// --- ad esempio anno, mese, giorno quando si setta la data
// --- Nella prima parte (MenuPos) uso/avanzo gli elementi corrispondenti alla funzione
// --- nella seconda
// --- I "Conta" nei commenti fanno riferimento a un array che tiene il valore e lo gestisce entro minimi e massimi
// --- Finiti gli elementi, o se ce n'è solo uno, "Elemento" va a -1 e si attiva la parte successiva
void NextElemento()
{
// --- Prima parte, scorro gli elementi
if ( MenuPos == 1 ) // --- Setting DATA
Elemento = Elemento < 2 ? Elemento+1 : -1 ; // --- Conta Elementi 0/1/2 (aaaa/mm/gg) e poi torna a -1
...
if ( MenuPos == 10 ) // --- Full Reset
Elemento = -1 ; // --- Conta solo Elemento 20 - Si/No e va subito a -1
// ---- Seconda parte, conferma e scrittura
if ( Elemento == -1 ) // --- Se ho modificato tutto scrivo le modifiche ed esco dal SETTING
{
if ( MenuPos == 1 ) // --- Set DATA
...
if ( MenuPos == 10 ) // --- Conferma il Reset // *****
if ( D2Set[20] == 1 ) // *****
Reset_AVR(); // *****
...
}
}
Dov'è il problema.
Teoricamente mi aspetto che Reset_AVR(); scatti solo se ho scelto l'opzione 10 del menu e se D2Set[20] ha valore 1.
Invece anche se ho modificato una qualsiasi voce di MenuPos (tutte: dalla 1 alla 10 compresa) sia che per la 10 (Reset/D2Set[20]) abbia lasciato/scelto "No" (quindi 0) l'Arduino UNO si blocca come se venisse eseguita while(1) {}
Se commento le tre righe ***** o se invece di Reset_AVR(); invoco direttamente wdt_enable(WDTO_30MS); tutto funziona regolarmente.
Non mi spiego proprio la cosa; lasciare la sola wdt_enable(WDTO_30MS); mi sta benissimo, ma spero in un vostro aiuto almeno per capire.
Lo schetch, anche scevro dai commenti, è abbondantemente oltre i 9k accettati dal forum; se necessario non ho riserve ad allegarlo.
Grazie fin d'ora.