Reset via Software

Ciao ragazzi :slight_smile:
E' possibile eseguire il reset dell'arduino con un comando dalla seriale?
Considerato che quando si accende il serial monitor dal pc la scheda si resetta di sicuro un modo esiste :smiley:

D4ng3R92:
Ciao ragazzi :slight_smile:
E' possibile eseguire il reset dell'arduino con un comando dalla seriale?
Considerato che quando si accende il serial monitor dal pc la scheda si resetta di sicuro un modo esiste :smiley:

la rs232 prevede che vi sia la possibilità di attivare il pin rst, questo si attiva in automatico quando si abilita la comunicazione ma si è possibile impostarlo via software, se ci dici che linguaggio usi su pc ci dovrebbe essere un modo

Uso c# :slight_smile:

Dovresti riuscire a switchare via software il PIN DTR della seriale del tuo PC via C# in questo modo:

fammi sapere se funziona, non ho mai provato in tale linguaggio...

Se devi resettare Arduino dal tuo programma su PC basta che chiudi e riapri la comunicazione sulla seriale, questa operazione fa abbassare il segnale hardware DTR che è collegato al reset di Arduino con conseguente reset dello stesso.
Cioè una cosa tipo com.close() seguito da com.open(), sintassi e nomi delle funzioni dipendono dal linguaggio e dalla libreria utilizzati.

Ci proverò :slight_smile:
Ma io ho visto che sulla mia scheda c'è un piedino reset che portato a massa resetta la scheda. Non è possibile portarlo a massa via software? che ne sò, con un LOW. Dico una cazzata?

Ciao

via software il metodo consigliato da Atmel è di abilitare il watchdog, guarda questo thread:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1222941939/all

nel tuo caso quindi la soluzione potrebbe essere:

definire un comando che impartirai via seriale e che provoca il reset (es. la stringa "reset")
fare in modo che il tuo sw c# invii tale comando
fare in modo che arduino, alla ricezione di tale comando, lanci il reset via watchdog

bye

Scusate ho guardato ma l'inglese non lo mastico molto :smiley: bisogna richiamare una funzione apposita?

D4ng3R92:
Non è possibile portarlo a massa via software? che ne sò, con un LOW. Dico una cazzata?

Sì, dici una roba del genere XD
L'Atmega non riesce ad autoresettarsi dandosi da solo un segnale LOW sul pin di reset per un tempo sufficiente a far sì che il segnale sia interpretato correttamente.

Senza scomodare il watchdog (potrebbe causare blocchi del micro nel caso si sbagli qualcosa a livello di software per cui si manda in loop il programma), puoi usare il reset via codice. Fai un bel asm volatile ("jmp 0x0000"); alla ricezione di un particolare comando.

Sei un genio.... :wink:

ciao

nota però che il jump a 0 non è un vero reset... fa ricominciare il tuo sw dalla prima istruzione ma non resetta stato dei registri, dei PIN etc... per un confronto tra i due metodi:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235780325/all

bye

c'era anche una discussione in italiano di qualche tempo fà sullo stesso argomento.

lucad79:
nota però che il jump a 0 non è un vero reset... fa ricominciare il tuo sw dalla prima istruzione ma non resetta stato dei registri, dei PIN etc... per un confronto tra i due metodi:

E' un reset software, è vero che non vengono riportati ai valori di default i registri macchina, però viene reinizializzato completamente l'ambiente di lavoro dalla parte nascosta del software, quella che aggiunge il compilatore.
Quanto sopra vuol dire che lo stack e l'heap vengono distrutti e ricreati, idem per tutte le variabili e i puntatori, cioè hai tabula rasa di tutto e anche i vari PORT vengono rimessi alla condizione di default prevista da wiring, tutti input, per poi eseguire la relativa inizializzazione come previsto dal software utente.
Inoltre attenzione al fatto che il giochetto col watchdog si può fare solo con l'optiboot che ne prevede la disattivazione, con il bootloader della 2009 non viene disattivato e di conseguenza il micro continua a resettare fino a che non staccate l'alimentazione, il che rende inutile il reset tramite watchdog, tanto vale premere il tasto di reset o staccare l'alimentazione.

lucad79:
Dovresti riuscire a switchare via software il PIN DTR della seriale del tuo PC via C# in questo modo:
SerialPort.DtrEnable Proprietà (System.IO.Ports) | Microsoft Learn

fammi sapere se funziona, non ho mai provato in tale linguaggio...

Io stavo pensando di utilizzare SerialPort.DtrEnable Proprietà (System.IO.Ports) | Microsoft Learn
Ma si deve impostare a true o a false? E per quanto tempo?

ma quello mi sà che serve solo per l'abilitazione o meno , non per l'uso.

BrainBooster:
ma quello mi sà che serve solo per l'abilitazione o meno , non per l'uso.

Esatto, e comunque basta chiudere la serial port per poi riaprirla, quindi un metodo e non una proprietà.
Rimanendo nell'esempio di msdn per .net prima si usa _SerialPort.Close() seguito da _serialPort.Open() , questo causa una transizione a 0 di DTR con conseguente reset di Arduino.

Non si resetta l'arduino quando chiudo e riapro la connessione seriale!
In C# sarebbe: serialPort1.Open(); o Close();

Vedi se riesci a fare la stessa cosa che fa il codice python, usando c#.

Se non capisci il codice chiedi.

Ciao.

hai provato a fare DtrEnable = True ?