Go Down

Topic: bug serial monitor ? (Read 2222 times) previous topic - next topic

m_ri

#15
Sep 06, 2012, 11:19 am Last Edit: Sep 06, 2012, 11:25 am by m_ri Reason: 1



Io lo trovo abbastanza comodo l'autoreset  :smiley-mr-green:


Dipende dai casi, in alcuni è comodo in altri è deleterio, esempio pratico il tuo Arduino ha collezionato dei dati e ti colleghi alla USB, o apri un qualunque programma di comunicazione, e ti trovi con un bel resettone con la conseguente perdita di dati.


Diciamo anche che non è molto "intelligente" memorizzare dati nella sram  :smiley-sad-blue:

ci sono molti scenari in cui uno preferirebbe non resettare l'arduino,soprattutto se uno non ha un niente per la comunicazione jtag..

un caso è quello sopracitato,connettersi(magari per debug) per leggere dati che potrebbero essere memorizzati in sd o eeprom,però essa ha un limite di scritture/letture..
oppure immagina un arduino che sta facendo il suo lavoro controllando un macchinario..a un certo punto inizia a comportarsi come non dovrebbe..connettendosi direttamente senza il reset,uno può vedere subito il problema senza dover ricreare la situazione iniziale..
oppure semplicemente,mentre l'arduino sta lavorando,vuoi monitorarlo senza interrompere l'esecuzione e senza ripartire dal setup..
altro caso,uno usa l'orologio sotware nello sketch..è inutile doverlo resettare ogni volta,se non sto caricando uno sketch
oppure,durante l'esecuzione,gli mandi dei parametri di configurazione per il tuo programma(ed essendo in fase di test,non vai a memorizzare tutto in eeprom)..se poi riconnetti il pc,i parametri devono essere reimmessi..

è verissimo che ci sono diverse strade per impedire l'autoreset,ma diverse sono semidefinitive(ossia non riesci a fare il reset da software)..oppure devi scrivere un po' di codice..secondo me,sarebbe comodo potersi connettere anche senza resettare l'arduino..
si può fare sta votazione?

PaoloP

Con la Leonardo hanno risolto aprendo e chiudendo la seriale a 1200 baud, questo abilita il reset ,altrimenti non resetta.
Però ha anche un bootloader di 4K.
Da PC c'è la possibilità di realizzare un monitor seriale senza invio del segnale DTR di reset. Oppure ti colleghi ai pin 1 e 0 saltando l'interfaccia USB.

m_ri

si,conosco queste strade..tranne quella della leonardo..
la mia domanda è: si potrebbe,nelle future versioni dell'IDE,prevedere la possibilità di collegarsi all'arduino senza resettarlo?ossia,senza mandare il segnale DRT..

testato: ecco, mi era venuto in mente ma non ci avevo pensato. In effetti quella lib è una manna dal cielo xò ci sono casi in cui l'autoreset è comodo.
Io penso che magari si potrebbe mettere tra le impostazioni dell'ide, se abilitare o meno l'autoreset

leo72


Con la Leonardo hanno risolto aprendo e chiudendo la seriale a 1200 baud, questo abilita il reset ,altrimenti non resetta.
Però ha anche un bootloader di 4K.

Credo che il bootloader sia 4 kB perché contiene anche il codice per gestire la comunicazione USB dato che l'Atmega32U4 ha il convertitore integrato, a differenza delle schede UNO/MEGA che usano un chip separato. Forse, esaminando il bootloader, si potrebbe cercare di sfruttare lo stesso trucco anche sulle UNO....

PaoloP



Con la Leonardo hanno risolto aprendo e chiudendo la seriale a 1200 baud, questo abilita il reset ,altrimenti non resetta.
Però ha anche un bootloader di 4K.

Credo che il bootloader sia 4 kB perché contiene anche il codice per gestire la comunicazione USB dato che l'Atmega32U4 ha il convertitore integrato, a differenza delle schede UNO/MEGA che usano un chip separato. Forse, esaminando il bootloader, si potrebbe cercare di sfruttare lo stesso trucco anche sulle UNO....


mmmmm, l'ultima volta che qualcuno ha cercato di modificare un bootloader è successo un quarantotto. Nel senco che la cosa si è prospettata molto più difficile del previsto. E se ti ricordi era stata aggiunta solo una stringa o poco più.
Pensa ad aggiungere un'intera funzione di controllo della velocità della seriale e dell'apertura e chiusura della porta stessa.  :smiley-eek: :smiley-eek:

leo72

Non ho detto che sia facile né che si ottenga qualcosa di funzionante ma tentar non nuoce.... se ho tempo, oggi a casa do un'occhiata al bootloader della Leonardo  :smiley-sweat:

astrobeed


[Pensa ad aggiungere un'intera funzione di controllo della velocità della seriale e dell'apertura e chiusura della porta stessa.  :smiley-eek: :smiley-eek:


Personalmente non vedo tutti questi problemi nel modificare il bootloader, anzi è molto più semplice di quello che sembra, però tale modifica non è a livello del bootloader ma del convertitore USB seriale che si trova sul 8u2, è lui che comanda il reset su i normali Arduino.
La Leonardo è diversa perché la USB è gestita direttamente dallo stesso micro che poi lavora come Arduino, quindi valgono altre regole e altri metodi.
In tutti i casi la soluzione è proprio nella modifica del software sul 8u2 e non serve inventarsi cose come il cambio di baud rate, basta prevedere uno specifico comando ,da inviarsi tramite seriale usb,  per resettare il 328 o ATmega che sia.
Tempo fa mi ero pure offerto di fare, gratis, questa modifica da integrarsi in una prossima versione dell'ide, visto che nessuno mi ha contattato in via ufficiale immagino che non gli interessa come feature da implementare.

PaoloP

Vero.
Non avevo pensato alla differenza tra la  Leonardo e la UNO.

ma i sorgenti del bl del 8u2/16u2 sta sul sito? Nn ho mai guardato in verità

leo72


ma i sorgenti del bl del 8u2/16u2 sta sul sito? Nn ho mai guardato in verità

Sono in /hardware/arduino/firmwares



ma i sorgenti del bl del 8u2/16u2 sta sul sito? Nn ho mai guardato in verità

Sono in /hardware/arduino/firmwares



trovati grazie :)

leo72

#27
Sep 06, 2012, 07:26 pm Last Edit: Sep 06, 2012, 07:30 pm by leo72 Reason: 1
Dopo aver studiato il bootloader della Leonardo ed aver letto un po' il datasheet dell'Atmega32U4 ho capito come funziona il sistema di reset di questa scheda.

Partiamo subito da un dato di fatto: non è basato sulla velocità della seriale, nonostante sul sito si dica ciò. Si legge infatti dalla scheda della Leonardo:
Quote
The reset is triggered when the Leonardo's virtual (CDC) serial / COM port is opened at 1200 baud and then closed. When this happens, the processor will reset, breaking the USB connection to the computer (meaning that the virtual serial / COM port will disappear).

Traduco:
Quote
Il reset è attivato quando la porta COM/seriale virtuale (CDC) della Leonardo è aperta a 1200 baud e poi richiusa. Quando ciò accade, il processore si resetta, interrompendo la connessione USB verso il computer (ciò significa che la porta COM/serial virtuale scomparirà).


In realtà le cose non stanno così. Nel bootloader non c'è nessun controllo sulla velocità con cui viene aperta la connessione. E non potrebbe essercene, d'altronde!  ;)
Infatti la cosa mi era suonata subito strana: se il controllo è a livello di bootloader, vuol dire che il micro si è resettato. Ovvio, no?  ;)
Il controllo viene invece lasciato direttamente all'hardware dell'Atmega32U4. Questo chip ha infatti un circuito che si può attivare per resettare il microcontrollore se una connessione USB viene aperta e poi chiusa. Inoltre dopo il reset si può passare il controllo al bootloader. Per fare ciò basta mettere a massa con una R di pull-down il piedino PE2 del microcontrollore, denominato HWB (HardWare Bootloader). Sulla Leonardo esiste difatti tale resistenza.
Basta quindi aprire e chiudere la connessione sulla seriale virtuale che la scheda si resetta ed il controllo passato al bootloader. Io a questo punto credo che la cosa sia indipendente dalla velocità: il datasheet difatti non parla di aprire la connessione ad una specifica velocità. Immagino quindi che l'Arduino team abbia scelto il valore di 1200 così. Ecco anche il motivo per cui la relativa porta sparisce dal sistema e la Leonardo viene montata su un'altra.

Detto questo, l'unica strada percorribile per replicare una simile funzionalità sulla UNO, ossia un reset "a comando", sia quella proposta da astrobeed: modificare cioè l'IDE affinché durante l'apertura della connessione seriale verso la scheda venga spedito un apposito comando che l'8U2 interpreti ed usi per resettare l'Atmega328P. In assenza di tale comando, l'8U2 deve aprire la connessione seriale senza spedire il segnale di reset. Ovviamente la cosa comporta la modifica del firmware dell'8U2 per fargli riconoscere il comando e la modifica dell'IDE per farglielo spedire.

leo, riguardo l'8u2, se ho capito bene non è lui a inviare in base a un sistema il reet al micro, ma solo se l'ide lo chiede. così come tutti i convertitori usb-seraile.
perciò la modifica non è da fare al bl ma all'ide
o dico male?

PaoloP

Se in apertura della porta non invii il segnale DTR la UNO non si resetta.
Ho fatto un semplice serial monitor che con una lib modificata (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1204641836) non resetta quando apre la connessione.

Go Up