bug serial monitor ?

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:

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:

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! :wink:
Infatti la cosa mi era suonata subito strana: se il controllo è a livello di bootloader, vuol dire che il micro si è resettato. Ovvio, no? :wink:
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.