domanda che considererete assurda... c'e' un comando che messo nello sketch puo' dare un reset come se si premesse il pulsantino?
in alternativa come si potrebbe dare il comando di reset al chip?
domanda che considererete assurda... c'e' un comando che messo nello sketch puo' dare un reset come se si premesse il pulsantino?
in alternativa come si potrebbe dare il comando di reset al chip?
Qualche giorno fa astrobeed disse che con asm ("JMP $0000") si resettava via software il micro.
si, così fai ripartire il sw
Mi pare che sia quello che vuole lui:
un reset come se si premesse il pulsantino
![]()
BrainBooster:
risposta corta
Frequently Asked Questions
Attenzione che se si abilita il watchdog per ottenere un reset hardware forzato è indispensabile utilizzare un bootloader modificato affinché non appena si avvia disabiliti il watchdog, altrimenti entrate in un loop forzato dal quale è impossibile uscire senza togliere l'alimentazione.
In pratica Arduino continua a resettare ogni tot ms senza riuscire ad attivare il bootloader e tantomeno il programma utente.
Per il soft reset basta usare :
asm("jmp 0");
In pratica si dice al micro di ripartire dalla prima istruzione del software, non vengono resettati ne i registri macchina ne i vari registri di stato, però se in testa al programma si preinizializza tutto come serve il problema non sussiste.
non è proprio uguale, così i timers ed altre cose vanno puliti a mano.
da provare così:
#include <avr/wdt.h>
...
void forceHardReset()
{
cli();
wdt_enable(WDTO_15MS);
}
edit:oops, non avevo visto la risposta di astrobeed
Quoto astrobeed: il "cane da guardia" lasciamolo nella cuccia ![]()
lol, non ci sto capendo niente, ho chiesto una cosa troppo per esperti ![]()
mi mettete il reset alla fine di un banale blink
edit, ho fatto mi pare funzioni:
#include <avr/wdt.h>
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(3000);
digitalWrite(13, LOW);
delay(3000);
digitalWrite(13, HIGH);
delay(3000);
digitalWrite(13, LOW);
delay(3000);
digitalWrite(13, HIGH);
delay(3000);
void forceHardReset();
{
cli();
wdt_enable(WDTO_15MS);
}
}
fa un blink velocissimo a fine del ciclo, spe che cambio il led...
Vedi l'ultimo post di astrobeed ![]()
e come fà a funzionare?! ![]()
spe ho modificato, non chiedere a me come fa a funzionare ma funziona, altrimenti il led 5 rimarrebbe acceso:
come vedi le uscite sono 3 e l'ultima la lascio alta, se non ci fosse quel reset rimarrebbe alta all'infinito
#include <avr/wdt.h> //per dare reset al programma
void setup() {
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
digitalWrite(3, HIGH);
delay(3000);
digitalWrite(3, LOW);
delay(3000);
digitalWrite(4, HIGH);
delay(3000);
digitalWrite(4, LOW);
delay(3000);
digitalWrite(5, HIGH);
delay(3000);
void forceHardReset(); //per dare reset al programma
{ // ///
cli(); //per dare reset al programma
wdt_enable(WDTO_15MS);// ///
} //per dare reset al programma
}
Mah... dubito che faccia quel che dici ![]()
reizel:
fa un blink velocissimo a fine del ciclo, spe che cambio il led...
Esattamente quello che ho detto prima, ora sei in un loop infinito causato dal watchdog e non c'è modo di uscirne.
leo72:
Mah... dubito che faccia quel che dici
sistema tu lo sketch, non mi offendo mica, io a programmazione sto a 1 in una scala di 100...
astro nell'ultimo sketch che ho messo lo fa un reset
reizel:
astro nell'ultimo sketch che ho messo lo fa un reset
Si certo che resetta, ma poi continua a farlo ogni 30 ms e non funziona più nulla, se devi staccare l'alimentazione per far ripartire Arduino tanto vale premere il pulsante di reset ![]()
no astro, e' montato sulla breadboard,
accende led1 x 3 secondi
spegne led1 x 3 secondi
accende led2 x 3 secondi
spegne led2 x 3 secondi
accende led3 x 3 secondi
quindi si spegne tutto e riparte dal led1 ecc ecc
Giusto per scrupolo ho provato il tuo sketch, risultato led che lampeggiano per la prima sequenza, alla fine led L di Arduino che lampeggia rapidissimo per effetto del loop dovuto al watchdog.
Anche premendo reset il software non riparte perché il bootloader non disattiva il watchdog, è necessario disattivare l'alimentazione, tutto come previsto.
... e se si mettesse il timeout del watchdog a 2 secondi o più per perdere volutamente la corsa col bootloader all'avvio ed un instuzione per disabilitarlo subito nel setup?
Ma la domanda fondamentale è: che motivo ha di resettare il micro? Quale funzione deve mai svolgere per aver bisogno di un reset? ![]()