Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #390 on: December 26, 2012, 12:47:49 am » |
Lo sketch di esempio leOS2_use_of_reset.ino mi ha creato per 2 volte il blocco dell'AVR sul mio 2560, entrambe le volte ho dovuto applicare la manovra di emergenza.
ciao
Con che versione? Preciso che la 2.0.90 aveva la gestione del reset buggata. La 2.1.0 ha rimediato a quei problemi.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #391 on: December 27, 2012, 04:33:38 pm » |
Lo sketch di esempio leOS2_use_of_reset.ino mi ha creato per 2 volte il blocco dell'AVR sul mio 2560, entrambe le volte ho dovuto applicare la manovra di emergenza.
ciao
Con che versione? Preciso che la 2.0.90 aveva la gestione del reset buggata. La 2.1.0 ha rimediato a quei problemi. Pablos, potresti confermarmi la versione che stai usando? Non avendo una MEGA, non posso riprodurre l'eventuale bug 
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #392 on: December 28, 2012, 11:25:36 am » |
versione che ho provato 2.1.1, ho preso l'ultima qui http://www.leonardomiliani.com/?p=516ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #393 on: December 28, 2012, 12:34:39 pm » |
OK. Ti ringrazio. Investigherò il problema.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #394 on: December 28, 2012, 01:39:00 pm » |
Se hai bisogno, mi mandi la lib modificata e te lo provo... ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #395 on: December 28, 2012, 04:42:45 pm » |
Se hai bisogno, mi mandi la lib modificata e te lo provo... ciao
OK, grazie dell'aiuto. Prima però mi studio il datasheet: devo capire cosa c'è di differente nella gestione del WD tra il 2560 ed il 328.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #396 on: January 02, 2013, 05:58:40 am » |
Lo sketch di esempio leOS2_use_of_reset.ino mi ha creato per 2 volte il blocco dell'AVR sul mio 2560, entrambe le volte ho dovuto applicare la manovra di emergenza.
ciao
Ho studiato un po' la questione e sono giunto alla conclusione che il problema nasca dal bootloader della MEGA. Per resettare il microcontrollore, la leOS2 utilizza lo stesso Watchdog: se si accorge che un task si blocca, aspetta il timeout e poi poi il Watchdog in modalità System Reset con un tempo di attesa di 30 ms, che genera appunto un reset del micro dopo tale periodo. Una volta riavviato lo sketch, la prima cosa che mi preoccupo di fare è il reset del circuito di Watchdog per evitare che resti acceso. Sull'Arduino UNO tale compito è facilitato dal fatto che il bootloader utilizza il Watchdog per impostare il tempo da attendere prima che qualcosa arrivi sulla seriale: se passa tale tempo senza arrivo di dati, resetta nuovamente il micro e fa partire subito lo sketch utente. L'Arduino MEGA lavora invece in modo differente, e non inizializza il watchdog. Può essere che il circuito del watchdog resti attivo e continui quindi a resettare il microcontrollore. Prova aumentando il tempo di attesa prima del reset modificando la funzione reset() nel file leOS2.ccp (righe 229-234): //reset the MCU void leOS2::reset(void) { wdt_disable(); wdt_enable(WDTO_30MS); //<--- MODIFICA QUESTO while(1){}; //wait for reset }
Prova con WDTO_4S WDTO_2S WDTO_1S WDTO_500MS WDTO_250MS WDTO_120MS WDTO_60MS ecc... Parti con un valore alto e guarda se riesci a superare il tempo che attende il bootloader. Ad occhio, ti serve un tempo pari o maggiore di 1 secondo, ma non ne sono certo: il codice del bootloader non è molto chiaro. Se ce la fai, abbassa tale valore finché non ritorni ad avere il blocco della scheda. Se non funziona neanche così, devo pensare ad un'altra soluzione.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #397 on: January 02, 2013, 11:15:47 am » |
Ok, ho in test uno sketch, appena termina carico il tuo. Io lo avevo caricato per curiosità e ho notato il blocco, per la verità non so nemmeno a cosa serva  Un po' come con le cose nuove, si spacchettano, si attacca la spina, si premono un po' di bottoni e poi si leggono le istruzioni  ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #398 on: January 02, 2013, 11:31:39 am » |
Ok, ho in test uno sketch, appena termina carico il tuo. Io lo avevo caricato per curiosità e ho notato il blocco, per la verità non so nemmeno a cosa serva  Un po' come con le cose nuove, si spacchettano, si attacca la spina, si premono un po' di bottoni e poi si leggono le istruzioni  ciao E' una caratteristica secondo me molto interessante, che si può anche utilizzare in altri ambiti, ossia anche come semplice funzione anti-freeze (se uno non ha nessun task da far eseguire in background). Nella sua essenza originale tale funzione serve a controllare se un task si sia bloccato. Ogni volta che il watchdog va in overflow viene lanciato un segnale di reset. La ruotine che intercetta il reset controlla se c'è un task in esecuzione. Se c'è, decrementa un contatore che rappresenta il timeout passato dall'utente in fase di setup. Se tale timeout va a zero prima che il task termini la sua esecuzione, significa che si è bloccato ed ha conseguentemente bloccato tutto il micro. A questo punto, il watchdog lancia un reset e pone fine al problema  Però possiamo usarla anche come antiblocco del codice principale. Prendiamo ad esempio un task lanciato ogni secondo che controlla se una certa variabile di sistema è su un determinato valore. Se la trova ad esempio su false, la rimette a true ed esce mentre se la trova a true resetta il micro. Nel loop principale l'utente la imposta a false ad ogni ciclo. Va da sé che se il loop si blocca, tale variabile non può essere impostata a false. Quindi il task di controllo, vedendola a true, resetta il micro.
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #399 on: January 02, 2013, 11:55:56 am » |
Questa mi potrebbe interessare  Ho provato diversi esempi con reset via software, ma nemmeno uno funzionava. Avevo pensato a un circuito esterno RC che controllasse l'attività di un pin, in caso la frequenza va a zero per n secondi fa il reset. Se il tuo funziona, potrebbe essere molto utile su schedine dove scarseggia la presenza di un operatore. ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #400 on: January 02, 2013, 12:08:22 pm » |
Se il tuo funziona, potrebbe essere molto utile su schedine dove scarseggia la presenza di un operatore. L'uso "standard" del watchdog, supponendo per un attimo che non ci siano bootloader tra i piedi  è proprio questo: il programma inizializza i registri opportuni e fa partire il WDT. Nel ciclo principale, che viene eseguito periodicamente, il WDT viene resettato, cioè riportato al valore iniziale. In questo modo gli si impedisce di arrivare zero e resettare il micro. Se il programma principale si blocca, per qualsiasi motivo, allora il reset del WDT non viene più eseguito, il timer raggiunge lo zero e il micro viene resettato, come se si operasse sul pin di reset. In questo modo il programma riparte. Il tutto senza che un operatore debba fare alcunché.
|
|
|
|
« Last Edit: January 02, 2013, 12:09:59 pm by tuxduino »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #401 on: January 02, 2013, 12:21:17 pm » |
A quanto detto da tuxduino, aggiungo che io uso una modalità differente. Quella da lui descritta è la modalità "system reset", che resetta appunto il micro. Nella modalità "interrupt" invece viene semplicemente sollevato un interrupt intercettabile da una ISR. La terza modalità è quella più figa. "Interrupt, then system reset". Inizialmente viene sollevato un interrupt: soccessivamente viene resettato il microcontrollore se non viene reimpostato l'interrupt per il successivo overflow del contatore del watchdog.
Contando gli interrupt posso eseguire un conto alla rovescia: passato il timeout predefinito, non reimposto più il watchdog per risollevare l'interrupt ed attendo il successivo reset.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #402 on: January 02, 2013, 02:36:52 pm » |
(un giorno o l'altro qualcuno dovrà pur distillare una piccola enciclopedia da questo megathread  )
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16496
Don't know what I do
|
 |
« Reply #403 on: January 02, 2013, 04:58:23 pm » |
(un giorno o l'altro qualcuno dovrà pur distillare una piccola enciclopedia da questo megathread  ) Dì la verità, gli argomenti che tratto sono sempre interessanti 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #404 on: January 02, 2013, 06:22:48 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
|