Arduino Nano Every e WatchDog

Un saluto a tutti,
Ho visto che con Arduino Nano Every se non sbaglio ci sono alcuni problemi per attivare il watchdog del micro. Chiedo se manipolando direttamente i registri giusti lo si può fare dallo sketch e se si mostrarmi qualche codice di esempio.
Grazie
Andrea. :slight_smile:

Non so se già si trovano in giro esempi di programmazione del WDT del ATmega4809 ... comunque devi fare riferimento a QUESTO documento dove è spiegato come funziona ed i registri coinvolti.

Guglielmo

... ma hai già provato ad usare la AVR libc ed il modulo <avr/wdt.h> ? Perché, almeno in teoria, dovrebbe andare ... ::slight_smile:

Guglielmo

Ho fatto delle prove, e il micro non sembra rispondere come mi aspetto, anche seguendo alcuni esempi di watchdog per il reset.
In alcuni post ho trovato informazioni che parlavano di limitazioni legate al bootloader :o
La cosa si è complicata! Dal datasheet del micro pero ho visto che i registri su cui agire sono documentati.
Ma mi manca il come agire! Quale funzioni usare nello sketch!
Grazie

AndreaM:
... In alcuni post ho trovato informazioni che parlavano di limitazioni legate al bootloader :o

Quello era accaduto in passato con il vecchio Bootloader della Nano (ma non credo abbiano ripetuto lo stesso errore con la Nano Every) ... sicurio di non aver letto cose relative alla Nano basata su ATmega328P? Perché NON è neanche lontanamente parente della nano Every basata su ATmega4809 ... ::slight_smile:

Guglielmo

AndreaM:
Ma mi manca il come agire! Quale funzioni usare nello sketch!

Scusa, usa quelle che sono in <avr/wdt.h> ... quelle vanno usate e, su AVR, tutti usano quelle ...
... "wdt_enable();" , "wdt_reset();" e "wdt_disable();" ... non è che ne servano altre eh ...

Guglielmo

P.S.: Alla wdt_enable() devi passare un tempo ed hai a disposizione, come hai visto, le costanti: WDTO_15MS, WDTO_30MS, WDTO_60MS, WDTO_120MS, WDTO_250MS, WDTO_500MS, WDTO_1S, WDTO_2S, WDTO_4S ed infine WDTO_8S.

Prova anche a leggere prima QUI e poi QUI :wink:

Guglielmo

La cosa strana è che il comando

wdt_enable(WDTO_2S);

non mi dà problemi nella compilazione, mentre modificando da 2 secondi a 8 secondi con:

wdt_enable(WDTO_8S);

nella compilazione mi restituisce l'errore:

NanoTest:126:12: error: 'WDTO_8S' was not declared in this scope
Stesso problema per 4 secondi.
:confused:

... hai messo in testa al codice #include <avr/wdt.h> ? Perché quelle costanti sono dichiarate la dentro ... ::slight_smile:

#define 	WDTO_15MS   0
#define 	WDTO_30MS   1
#define 	WDTO_60MS   2
#define 	WDTO_120MS   3
#define 	WDTO_250MS   4
#define 	WDTO_500MS   5
#define 	WDTO_1S   6
#define 	WDTO_2S   7
#define 	WDTO_4S   8
#define 	WDTO_8S   9

Guglielmo

Certamente Guglielmo,
Ma poi alcune sono presenti ed altre no? :confused:
Quelle più veloci le prende senza errori!

Hai provato a mettere direttamente il valore corrispondente (quello che viene definito dalle #define) invece che il simbolico ?

Guglielmo

P.S.: Comunque in <avr/wdt.h> sono presenti tutte, quindi ... non capisco ... ::slight_smile:

Mmm ... stavo comunque vedendo che ...

Enabling the watchdog is trivial, though the 4809 watchdog only supports reset, not interrupt on timeout:

CPU_CCP = 0xD8; // Disable IO register write protection
WDT.CTRLA = 0xB; // 0xB = 8.192s, other values are listed in the data sheet

ed anche ...

The 4809 doesn't have an interrupt/callback mode on it wdt.

... quindi attenzione per cosa vuoi usare il wdt ... perché può SOLO resettare la board e NON generare un interrupt come nel caso di altre MCU AVR.

Guglielmo

E' proprio quello che cerco un reset della CPU bloccata per qualsiasi motivo!
Ma l'unica cosa bloccata mi sa che sono io :slight_smile: