Go Down

Topic: Modificare firmware 16U2 dell'Arduino Uno per eliminare l'autoreset (Read 23609 times) previous topic - next topic

testato

scusa Astro, non son d'accordo.
Arduino in se non si resetta a piacere suo, si resetta quando glielo si dice.
Quindi perche' modificarlo ?
Se uso putty e mando DTR voglio che si resetti, se non lo mando non si resetta.
Quindi il problema non e' sull'harduino ma sull'IDE e su Processing, che a loro volta non hanno problemi, ma li ha rxtxserial
la dll modificata evita questa cosa, senza perdere la capacita' di programmazione dell'IDE

questo topic e' di Eried:
ha vari riferimenti interni http://arduino.cc/forum/index.php/topic,50986.0.html
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


scusa Astro, non son d'accordo.
Arduino in se non si resetta a piacere suo, si resetta quando glielo si dice.


Si resetta ogni volta che apri la porta seriale, di questa cosa abbiamo discusso più volte, ed è un difetto di Arduino dovuto all'uso del segnale DTR, che fa parte dello standard RS232, per comandare l'autoreset.
Scientia potentia est

testato

di questa cosa ne avete sempre parlato, ed avete sempre sbagliato.
Eried spiega bene il rpoblema e ti confermo che e' come dice lui.

io apro tutte le seriali che voglio ora e non ci sono autoreset, e contemporaneamente programmo da IDE senza problemi
Qui spiega il rpoblema ed infatti dice che era andato fuori strada http://arduino.cc/forum/index.php/topic,46977.0.html

sul suo sito, in cileno, ha fatto una cronistoria di questo problema e spiega come lo aveva affrontato inizialmente, partendo dalla modifica dell'IDE, cosa che invece non serve.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


di questa cosa ne avete sempre parlato, ed avete sempre sbagliato.


Non credo proprio, la modifica di Eried riguarda solo l'IDE di Arduino, o meglio una dll che utilizza, però non risolve il problema in senso assoluto, se io apro la Vcom di Arduino da un mio applicativo, non importa con che linguaggio è scritto, Arduino resetta a meno che io non blocco DTR dal mio software, cosa che non sempre è fattibile o che non tutti sanno fare.
DTR è uno dei segnali di handshaking della RS232, non lo devi gestire, cambia automaticamente come serve perché è controllato in hardware, o in software a seconda dei casi, dal sistema di controllo della porta seriale.
Tu riduci la questione al solo terminale seriale di Arduino, io la vedo sotto l'aspetto generale che è decisamente molto più ampio del ristretto mondo dell'IDE di Arduino.
Scientia potentia est

testato

interessante posizione,
pero' si aprono troppe strade contemporaneamente.
Il DTR, e nelle ultime versioni anche RTS, e' stato usato da arduino per resettarsi.
Capisco che sono segnali della seriale, ma e' il programmatore a decidere se usarli o meno.
Se tu scrivi un applicativo che usa DTR per "qualcosa" e' normale che questo poi resettera' arduino.
Non potevano creare un nuovo standard, sempre uno dei due dovevano usare per il reset, perche' gli altri segnali sono tutti "in entrata" verso il pc e quindi non usabili.

In questi casi qui c'e' gia' la soluzione, il ponticello saldato sulla pcb, e' li' apposta.
Ma quando parliamo di applicazioni nuove scritte da zero, se si ci vuole interfacciare ad arduino lo si deve considerare e non si useranno quei segnali.

Ma la maggior parte delle richieste che arrivano sul forum non sono quelle di programatori che stanno usando il DTR per altro e quindi gli da fastidio, ma programmatori in erba, da me il primo, che aprendo il serial monitor o usando processing, hanno problemi, anche usando correttamente i segnali DTR RTS, e questo e' dovuto alla rxtxserial.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

astrobeed


hanno problemi, anche usando correttamente i segnali DTR RTS, e questo e' dovuto alla rxtxserial.


Stai facendo una interpretazione tutta tua della cosa, le cose non stanno come dici tu e non sempre è possibile interdire DTR/RTS, e poi oltre alla questione software scritto dall'utente c'è la questione software fatto da altri pronto all'uso che si deve collegare ad Arduino tramite seriale, p.e. un banale data logger.
Tu stai generalizzando tutto alla mera questione di una dll usata solo dal IDE e/o eventuali applicativi processing/java, il mondo informatico è un tantinello più grande di questa dll  :)
Comunque sei liberissimo di tenerti le tue idee, io non ho alcuna intenzione di imbarcarmi ulteriormente in discussioni di questo tipo, per giunta già fatte diverse volte, dalle quali non c'è via di uscita senza andare mettere mano direttamente su Arduino, una possibile, e semplice, soluzione l'ho prospettata, funziona con tutto e non serve fare nessuna modifica all'ambiente di lavoro di Arduino.
Scientia potentia est

menniti


interessante posizione,
pero' si aprono troppe strade contemporaneamente.
Il DTR, e nelle ultime versioni anche RTS, e' stato usato da arduino per resettarsi.

veramente è l'opposto, l'RTS era previsto con l'FT232RL, con la sostituzione di questo chip il segnale è scomparso nella fase di apertura del SM mentre continua a fare il suo lavoro nella fase di programmazione; questa è la chiara prova che è l'IDE a gestire questi due segnali e lo fa in assoluta autonomia. Nel mio Programmatore HV ho usato l'MCP2200 come convertitore USB-Seriale, che ha l'RTS ma NON ha il DTR, funziona tutto senza problemi ma non resetta il micro se apro il Serial Monitor. Immagino che i convertitori ATMEL intercettino il comando RTS e lo trasformino in DTR, nel senso che lo mandano al RESET del micro. Se ti vai a guardare gli schemi elettrici della 2009 e della UNO ti sarà chiara la cosa.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

astrobeed


veramente è l'opposto, l'RTS era previsto con l'FT232RL


Non è nemmeno così, anche la 2009 con l'FTDI usa DTR, RTS è solo linkato a livello di schema per retrocompatibilità con le vecchie versioni di Arduino, quelle con la seriale RS232 per capirci, però non è fisicamente collegato sulla scheda, il componente marcato come R2 con valore 100 in realtà è un condensatore da 100 nf e non è montato sul pcb della 2009.
L'IDE non comanda nulla relativamente a DTR/RTS, e l'ho detto 1000 volte.
DTR e RTS Sono segnali standard della RS232 ed è la parte di gestione della seriale sul pc, non importa se hardware o software, a cambiare  stato a questi segnali in accordo con il protocollo RS232 che ne stabilisce il funzionamento.
Scientia potentia est

PaoloP


Non potevano creare un nuovo standard, sempre uno dei due dovevano usare per il reset, perche' gli altri segnali sono tutti "in entrata" verso il pc e quindi non usabili.


Infatti hanno deciso di far resettare la Leonardo e la DUE quando si apre e si chiude la seriale a 1200 baud.
Ho aperto il topic solo per sapere se modificando opportunamente il firmware del 16U2 della UNO R3 si possa ottenere lo stesso comportamento.  ]:D ]:D

leo72



che attiva la programmazione e resetta il micro quando la seriale viene aperta e chiusa a 1200 baud.


Su questo sistema non mi esprimo altrimenti mi bannano  :D

Prima di esprimermi una considerazione. Secondo me basta aprire la seriale a qualunque velocità. Non ho trovato nulla nel datasheet del 32U4 in cui si parla della possibilità di scegliere a che velocità di trasmissione attivare il reset.

Ora mi esprimo. Mi pare un sistema un po'... rozzo. Ogni volta che la scheda si resetta, il sistema la vede sconnettersi e riconnettersi, e la numerazione della porta salta. Mah...

astrobeed


Non ho trovato nulla nel datasheet del 32U4 in cui si parla della possibilità di scegliere a che velocità di trasmissione attivare il reset.


E non lo troverai mai perché è una cosa gestita a software e non dal micro.

Quote

Ora mi esprimo. Mi pare un sistema un po'... rozzo.


Per me è una vera "bischerata", ci sono metodi di gran  lunga migliori, senza nessuna controindicazione, per far resettare l'ATmega a comando.
Scientia potentia est

leo72



Non ho trovato nulla nel datasheet del 32U4 in cui si parla della possibilità di scegliere a che velocità di trasmissione attivare il reset.


E non lo troverai mai perché è una cosa gestita a software e non dal micro.


Voglio capire meglio questa cosa. Chi è che lato 32U4 "guarda" se la seriale è stata aperta a 1200 bps? A me pare nessuno.

EDIT:
aspetta, non dirmelo.... vuoi vedere che sta nell'unico posto in cui non ho guardato, ossia direttamente nel core (nel codice che gestisce la seriale)?

leo72

Ho fatto tombola!  :smiley-yell:
Dal file CDC.cpp:
Code: [Select]

// auto-reset into the bootloader is triggered when the port, already
// open at 1200 bps, is closed.  this is the signal to start the watchdog
// with a relatively long period so it can finish housekeeping tasks
// like servicing endpoints before the sketch ends

astrobeed


Voglio capire meglio questa cosa. Chi è che lato 32U4 "guarda" se la seriale è stata aperta a 1200 bps? A me pare nessuno.


La USB, o meglio il software che gestisce il device CDC della USB, tra i parametri disponibili c'è anche la velocità della seriale, viene comunicato dal HOST quando apri la Vcom, in realtà non serve a nulla dal lato USB perché i dati viaggiano sempre alla massima velocità possibile, si usa per settare in modo corretto l'UART.

Scientia potentia est

leo72


La USB, o meglio il software che gestisce il device CDC della USB, tra i parametri disponibili c'è anche la velocità della seriale, viene comunicato dal HOST quando apri la Vcom, in realtà non serve a nulla dal lato USB perché i dati viaggiano sempre alla massima velocità possibile, si usa per settare in modo corretto l'UART.



L'ho trovato da solo... che fava che sono, non pensavo affatto che c'era ancora una cosa che non avevo controllato, il codice per gestire la seriale lato Arduino.  :smiley-sweat:

Go Up