[SOLVED] Arduino nano - Problema reset arduino con watchdog

Ciao a tutti!

Ho un problema con arduino nano e il watchdog che dovrebbe resettare l'arduino quando per qualche motivo lo sketch si impalla.

Non posto lo sketch completo in quanto non avrebbe senso, vi posto solo come sono riuscito a ricreare il problema e dove mi incarto.
Il collegamento è basilare, solo il cavo usb (che fornisce l'alimentazione), nessun collegamento ai pin. Il problema si presenta anche su un arduino nano alimentato a batteria, senza usb.

#include <avr/wdt.h>

void setup() {
wdt_enable(WDTO_2S);
}

void loop() {
  wdt_reset();
  delay(2100);
}

il delay fa si che il wdt_reset() non entri in tempo per non far scattare il cane da guardia... Quando passano i due secondi, il led 13 dell'arduino parte a lampeggiare e non c'è verso di farlo "riprendere". Nè premendo il tasto reset, nè avviando il monitor seriale, nè caricando un altro sketch... non c'è proprio modo, se non togliere e rimettere l'alimentazione. Questo chiaramente rende il watchdog inutile.

Cercando un po' in google e qui sul forum non ho capito bene il motivo, mi pare sia un problema del bootloader di serie dell'arduino, ma ho trovato soluzioni solo con altri tipi di arduino, e nel nano non ho idea di come si possa risolvere.

Oppure sbaglio io qualcosa nell'usare il watchdog nello sketch? O serve qualche cablaggio tra i pin?

Grazie anticipatamente!

ciao, hai provato con wdt_disable(); all'inizio del setup? poi un consiglio è leggere il foglio tecnico del micro.

x iscrizione

andrea86:
ciao, hai provato con wdt_disable(); all'inizio del setup? poi un consiglio è leggere il foglio tecnico del micro.

Ciao, grazie per la risposta!

Ho provato, ma niente!

#include <avr/wdt.h>

void setup() {
wdt_disable();
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
wdt_enable(WDTO_2S);
}

void loop() {
wdt_reset();
delay(4000);
}

Ho controllato nel file boards. Il Nano usa il bootloader AtmegaBoot e non l'Optiboot, e non resetta il watchdog all'avvio per cui il chip entra in reset infinito. E' lo stesso problema della Mega col vecchio bootloader.
Dovresti aprire i sorgenti, modificare il codice del bootloader inserendo l'istruzione per disattivare il watchdog, ricompilare e ricaricare.

Hmmm non sono tanto pratico della sostituzione del bootloader, ho sempre usato arduino così com'è... avresti qualche link che spieghi l'operazione o quantomeno mi avii a capire cosa c'è da fare?

Grazie in anticipo!

Piu' che altro il problema è nella ricompilazione del bootloader.
Dovresti aprire il file atmegaBOOT_168.c che si trova in /hardware/arduino/bootloaders/atmega con un editor di testo, poi modificare la routine app_Start che avvia lo sketch memorizzato sulla Flash: adesso è un semplice jump a $0000, la prima locazione della flash, tu dovresti farti una piccola routine sulla falsariga di quella presente nell'Optiboot, poi ricompilare. Qui pero' si entra un po' nel complicato. Non so se ci sono guide per questo

e una sostituzione completa del bootloader con qualcun'altro? sarebbe pi semplice? Sto leggendo in google che ce ne sono vari, anche più performanti di quello predefinito...

Leo e se fa l'aggiornamento del boot con l'ultima versione dell'IDE?

Ho risolto identico problema con la MEGA aggiornando con l'IDE 1.5.4.

Ho solo degli arduino nano in casa...

dovrei fare una cosa così tipo?

Ho provato al volo a fare come scritto lì, mi ha caricato il bootloader correttamente (almeno così ha scritto), ma il problema persiste...

x babuino, probabilmente nell' 1.5.4 hanno cabiato la board per la mega, basta andare a guardare se hanno cambiato anche quella per la nano.
Cmq leo perche' far ricompilare il bootloader se esiste gia' l'optiboot per tutti i micro (se ricordi ho fatto test anche su atmega8) quindi a limite deve solo creare una board e caricare in modo standard il bootloader, avendo due nano puo' farlo

Copio dalle release note dellla versione 1.5.4:

[bootloaders]

Quindi han fixato solo il mega, del nano non accenna a nulla...

Ad ogni modo ho scaricato optibot, ma non capisco come si installa... non si fa dall'ide arduino? Nella guida c'è scritto di creare una cartella "hardware" nella cartella sketchbook, e metterci l'optibot, ma riavviando il programma non noto cambiamenti... Bisogna compilarlo da riga di comando e poi caricarlo in altro modo?

leo72:
Il Nano usa il bootloader AtmegaBoot e non l'Optiboot

Ho visto che effettivamente nel file board.txt il bootloader utilizzato è quello ATmega.
Però, mentre il NANO usa il ATmegaBOOT_168_atmega328.hex, la MEGA il stk500boot_v2_mega2560.hex che è stato pachato dalla 1.5.4.

EDIT: il bootloader della NANO è lo stesso montato su Arduino 2009.
Io credo che possa tranquillamente montarci l'optiboot cosi come si fa sulle 2009. :wink:
E risolvi il problema.
EDIT2: in effetti anche la NANO ha il chip FTDI, quindi è proprio una 2009 in miniatura.

Domanda: Quindi anche la 2009 è affetta dal problema del watchdog?

michele non serve scaricare niente, se vai nelle cartelle di arduino trovi anche quella con i bootloader, da quella cartella vengono richiamati via ide i bootloader da caricare, quindi se ti fai una board personalizzata che va a puntare al giusto bootloader, poi lo carichi normalmente, ed hai risolto.
Prendi spunto dalla mia guida in firma che ti spiega come farti una board.

Risolto grazie! :smiley:

Allora, ho seguito la dritta di PaoloP e la guida di Testato.

Scrivo qui come ho fatto, perchè magari a qualcuno può servire:

Come ho scritto, ho usato 2 arduino nano. Su di uno ho caricato normalmente come si fa di solito lo sketch che si trova negli sketch di esempio di arduino che si chiama "ArduinoISP".
Questo arduino l'ho usato come programmatore.

Poi ho preso l'arduino nano col bootloader da modificare, e l'ho collegato al precedente arduino tramite i pin "superiori" ICSP seguendo la guida che avevo incollato poco sopra nel thread, ovvero:

Arduino without   |  Arduino as ISP
   bootloader     |   programmer
__________________|________________
ICSP pin#1 (MISO) |      D12
ICSP pin#2 (+5V)  |      5V
ICSP pin#3 (SCK)  |      D13
ICSP pin#4 (MOSI) |      D11
ICSP pin#5 (RST)  |      D10
ICSP pin#6 (GND)  |      GND
__________________|________________

(a sinistra i pin ICSP sull'arduino col bootloader da modificare, da collegare con i pin a destra che sono sull'arduino che fa da programmatore).

Poi ho editato il file /usr/share/arduino/hardware/arduino/boards.txt (su linux), aggiungendo questa serie di righe:

##############################################################
nano328optiboot.name=Arduino Nano w/ ATmega328 (OptiBoot)
nano328optiboot.upload.protocol=arduino
nano328optiboot.upload.maximum_size=30720
nano328optiboot.upload.speed=115200
nano328optiboot.bootloader.low_fuses=0xff
nano328optiboot.bootloader.high_fuses=0xd6
nano328optiboot.bootloader.path=optiboot
nano328optiboot.bootloader.file=optiboot_atmega328.hex
nano328optiboot.bootloader.unlock_bits=0x05
nano328optiboot.bootloader.lock_bits=0x0F
nano328optiboot.build.mcu=atmega328p
nano328optiboot.build.f_cpu=16000000L
nano328optiboot.build.core=arduino
nano328optiboot.build.variant=eightanaloginputs
##############################################################

Ho qualche dubbio sulla riga
nano328optiboot.upload.maximum_size=30720
perchè l'ho copiata dalla parte "default" dell'arduino nano con atmega328, e mi pare che optiboot occupi meno spazio, quindi lo spazio massimo a disposizione dello sketch dovrebbe essere qualcosa in più, comunque non penso che crei problemi. Il resto i fuse ecc lì ho copiati da altri guide che usano il bootloader optiboot_atmega328.hex, quindi credo siano corretti.

Sucessivamente ho riavviato arduino ide, ho messo "Arduino as ISP" come programmatore nel menù strimenti, , come tipo device: "Arduino Nano w/ ATmega328 (OptiBoot)" (che sarebbe il nuovo modello di arduino creato poco sopra).
Poi "scrivi il bootloader". Ed ha caricato il bootloader.
Poi ho reimpostato il vecchio programmatore (AVRISP mkll) nel menù sstrumenti ( e provato a caricare qualche sketch, tra cui:

#include <avr/wdt.h>

void setup() {
  wdt_disable();
    pinMode(13, OUTPUT); 
    digitalWrite(13, HIGH);
    wdt_enable(WDTO_1S);
}

void loop() {
  wdt_reset();
  delay(4000);
}

che funziona correttamente! :slight_smile: Ogni secondo il led del pin 13 si spegne un attimino e si riaccende. Cambiando WDTO_1S con altri valori, cambia anche l'intervallo di reset, quindi tutto ok! :slight_smile:
Chiaramente per caricare sketch ora bisogna usare il nuovo modello di arduino aggiunto modificando il file boards.txt.

Grazie per l'aiuto! :slight_smile:

x iscrizione

Dopo aver collegato i 2 nani e messo sul primo l'Arduino as ISP, potevi semplicemente scegliare la board Arduino uno e poi il comando scrivi bootloader senza dover aggiungere una virtual board.
Poi per la programmazione e l'upload degli sketch rimettevi il giusto programmatore e la board del nano. :grin:

Comunque una guida in più e un po' di sperimentazione non fa male. :wink:

Ah ecco :smiley:

Comunque sto un po' convertendo un po' di arduino nano che ho e ricaricando un po' di sketch su dei progetti.... mi pare più performante ora l'arduino.... è una mia impressione o può essere? :roll_eyes:

No. Il micro è il medesimo ed alla stessa velocità.
Cambia forse l'upload dello sketch che può essere fatto a 115K invece che a 56K come la 2009.
Quindi mette la metà del tempo per l'upload del file sull'Arduino.