Modificare firmware 16U2 dell'Arduino Uno per eliminare l'autoreset

cece99:
La DUE non è di certo adatta ai principianti, volete dismettere la UNO che è il punto di partenza? =(

Semplicemente la UNO verrà lasciata com'è, immagino senza più evoluzione.

[quote author=Massimo Banzi link=topic=129176.msg972379#msg972379 date=1351280393]
Il firmware che gira sul 16U2 della Due non è per nulla compatibile con la Uno.. Quel processore fa una sequenza di Erase/Reset per riprogrammare la scheda che non sono quelli necessari alla Uno.[/quote]
Peccato.
Un sistema come quello della Leonardo, importato sulla UNO lo troverei più comodo che non tagliare la pista.

PaoloP:
Un sistema come quello della Leonardo, importato sulla UNO lo troverei più comodo che non tagliare la pista.

Il sistema della Leonardo si basa sull'uso di una circuiteria interna al micro stesso. Attivando uno specifico fuse, si può fare in modo che all'apertura e chiusura della seriale il micro si autoresetti. In questo modo può partire il bootloader e scrivere l'eventuale nuovo firmware in arrivo.
Sui 328 non c'è nulla di simile all'interno del microcontrollore.

Ok per la Leonardo. Ma lo stesso sistema è usato sulla DUE che usa il 16U2. Ecco perché pensavo che si potesse modificare il firmware per adattarlo alla UNO in modo che si potesse programmare come la Leonardo.

Vediamo se ho capito.
Tu vorresti riscrivere il firmware del 16U2 della UNO per far sì che esso invii il segnale di reset all'Atmega328 solo in determinate condizioni, modificando opportunamente l'IDE.

leo72:
Attivando uno specifico fuse, si può fare in modo che all'apertura e chiusura della seriale il micro si autoresetti. In questo modo può partire il bootloader e scrivere l'eventuale nuovo firmware in arrivo.

Non esiste nessun fuse del genere nei 8/16u2, esistono due fuse dedicati al reset, il primo è BOOTRST che consente di specificare se dopo un reset, hardware, il program counter parte dall'indirizzo 0 oppure dall'indirizzo in cui è posto il bootloader, dipende dalle dimensioni dell'area riservata (vedere relativa tabella sul datasheet).
Il secondo fuse è HWBE e consente di utilizzare il pin PD7 del micro per scegliere se dopo un reset il program counter parte dall'indirizzo 0 oppure da quello in cui si trova il bootloader.

leo72:
Vediamo se ho capito.
Tu vorresti riscrivere il firmware del 16U2 della UNO per far sì che esso invii il segnale di reset all'Atmega328 solo in determinate condizioni, modificando opportunamente l'IDE.

Esatto. Anche se al momento non sono in grado di fare queste modifiche. Almeno credo. :roll_eyes:

astrobeed:

leo72:
Attivando uno specifico fuse, si può fare in modo che all'apertura e chiusura della seriale il micro si autoresetti. In questo modo può partire il bootloader e scrivere l'eventuale nuovo firmware in arrivo.

Non esiste nessun fuse del genere nei 8/16u2, esistono due fuse dedicati al reset, il primo è BOOTRST che consente di specificare se dopo un reset, hardware, il program counter parte dall'indirizzo 0 oppure dall'indirizzo in cui è posto il bootloader, dipende dalle dimensioni dell'area riservata (vedere relativa tabella sul datasheet).
Il secondo fuse è HWBE e consente di utilizzare il pin PD7 del micro per scegliere se dopo un reset il program counter parte dall'indirizzo 0 oppure da quello in cui si trova il bootloader.

Mi riferivo alla Leonardo, che ha il 32U4. Tempo fa ho indagato come funziona il reset ed è come ho descritto io.

la soluzione e' molto piu' semplice, e non capisco perche' l'ArduinoTeam non se ne faccia carico.
Bisogna sistemare la RXTXSerial che e' vecchissima.
Con la versione modificata che ho postato tempo fa non c'e' questo problema

Visto che questa .dll e' alla base delle comuniczioni arduiniche sarebbe buona cosa iniziare ad inserire quella modificata nell'IDE prossimo, e poi magari contribuire al suo sviluppo, ad esempio servirebbe un porting 64bit

Testato:
la soluzione e' molto piu' semplice, e non capisco perche' l'ArduinoTeam non se ne faccia carico.
Bisogna sistemare la RXTXSerial che e' vecchissima.
Con la versione modificata che ho postato tempo fa non c'e' questo problema

Visto che questa .dll e' alla base delle comuniczioni arduiniche sarebbe buona cosa iniziare ad inserire quella modificata nell'IDE prossimo, e poi magari contribuire al suo sviluppo, ad esempio servirebbe un porting 64bit

Hai le modifiche che hai apportato? Non voglio l'eseguibile perché tu hai Windows ed io Linux.

leo72:
Mi riferivo alla Leonardo, che ha il 32U4. Tempo fa ho indagato come funziona il reset ed è come ho descritto io.

Sto guardando adesso il datasheet e non vedo nessun fuse che fa quello che dici tu, per il reset ci sono solo i due BOOTRST e HWBE presenti nel 8/16u2.

27.5 Entering the Boot Loader Program
The bootloader can be executed with three different conditions:

27.5.1 Regular application conditions.
A jump or call from the application program. This may be initiated by a trigger such as a com-mand received via USART, SPI or USB. 

27.5.2 Boot Reset Fuse
The Boot Reset Fuse (BOOTRST) can be programmed so that the Reset Vector is pointing to
the Boot Flash start address after a reset. In this case, the Boot Loader is started after a reset.
After the application code is loaded, the program can start executing the application code. Note
that the fuses cannot be changed by the MCU itself. This means that once the Boot Reset Fuse

27.5.3 External Hardware conditions
The Hardware Boot Enable Fuse (HWBE) can be programmed (See Table 27-5) so that upon
special hardware conditions under reset, the bootloader execution is forced after reset.

Non parla di fuse speciali, parla di una ben precisa azione comandata da software in risposta ad un comando ricevuto da una periferica, oppure l'uso del pin reset eventualmente abbinato a PE2 per scegliere da dove far partire il program counter.

non le ho apportate io :slight_smile:
cerca ERIED, e' un utente cileno, ha fatto un capolavoro, non solo si risolve l'autoreset, ma anche i problemi con bluetooth.
il tutto compatibile anche con processing.

Ho postato tutti i miei test nel topic bluetooth

@astrobeed:
adesso non ricordo ma tempo fa ho studiato la cosa perché volevo replicare anch'io lo stesso modo di reset della Leonardo e pensavo che ci fosse qualcosa nel bootloader ma poi, guardandolo, non trovai nulla. Studiando il datasheet ho trovato invece che era una cosa a livello di microcontrollore.

@astro:
ecco, qui ho spiegato come avviene la cosa:

Non è un fuse, mi ero confuso, ma una R su un determinato pin.

leo72:
Non è un fuse, mi ero confuso, ma una R su un determinato pin.

Viene settato HWBE che consente di scegliere tramite lo stato logico presente su PE2, durante il reset è un input, se parte il programma utente oppure il bootloader, in pratica consente di avviare Leonardo senza passare per il bootloader se non è necessario.

Ho visto su Git che c'è il codice del 16U2 per la UNO (https://github.com/arduino/Arduino/tree/master/hardware/arduino/firmwares/atmegaxxu2), però non trovo quello della DUE (Arduino/hardware/arduino/sam at ide-1.5.x · arduino/Arduino · GitHub)
Manca la cartellina Firmware. Probabilmente la metteranno in seguito. =(
Volevo verificare le differenze a livello di codice. :~

Non sono in hardware\arduino\firmwares ?

Testato:
non le ho apportate io :slight_smile:
cerca ERIED, e' un utente cileno, ha fatto un capolavoro, non solo si risolve l'autoreset, ma anche i problemi con bluetooth.
il tutto compatibile anche con processing.

Ho postato tutti i miei test nel topic bluetooth

Ho trovato solo la .dll già compilata ma nessun accenno a cosa ha modificato.

Lui ha modificato solo la dll ? Quindi niente linux ?

Ricordo un topic in merito sul sito internazionale dove aeva spiegato. Appena lo trovo lo posto.
Anche lesto parlo dell abbandono di serialrxtx, un interesse in tal senso sarebbe un bel progetto.
Ho delle mail personali con eried dove mi disse varie cose.
Appena metto mano al pc posto qui.

Lo ontattai perche volevo creare la versione 64bit, poi ho iniziato ad usare la 32 e non ne ho piu parlato

Testato:
Lui ha modificato solo la dll ? Quindi niente linux ?

Vediamo un attimo di chiarire meglio la questione, quella dll modificata è utilizzabile solo con il terminale seriale del IDE ed eventuali programmi utente sviluppati sotto Processing/Java previa specifica inclusione, il problema autoreset rimane sempre se si utilizzano altri software per l'emulazione di un terminale seriale come HyperTerminal o Putty, oppure si si usano software generici che comunicano con Arduino.
La vera soluzione è gestire la disattivazione dell'autoreset direttamente sul 8/16u2, ovvero deve ignorare i segnali DTR/RTS e non resettare l'ATmega, questa funzionalità deve essere attivabile/disattivabile a piacere, il modo più semplice sarebbe utilizzare un pin del 8/16u2 collegato ad un jumper, a seconda dello stato l'autoreset è attivo o disattivato.
Dato che sulle varie revisioni della UNO e della MEGA2560 è sempre presente il connettore per la programmazione ISP del 8/16u2 si può utilizzare una coppia di pin collegati a questo per il jumper selezione autoreset, non si deve modificare nulla a livello di hardware e non si perde la possibilità di programmare l'8/16u2 tramite ISP.