Go Down

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

PaoloP

Stavo ca@@eggiando sulle pagine della DUE e ad un certo punto leggo questo:

Quote
The Programming port is connected to an ATmega16U2, which provides a virtual COM port to software on a connected computer (To recognize the device, Windows machines will need a .inf file, but OSX and Linux machines will recognize the board as a COM port automatically.). The 16U2 is also connected to the SAM3X hardware UART. Serial on pins RX0 and TX0 provides Serial-to-USB communication for programming the board through the ATmega16U2 microcontroller. The Arduino software includes a serial monitor which allows simple textual data to be sent to and from the board. The RX and TX LEDs on the board will flash when data is being transmitted via the ATmega16U2 chip and USB connection to the computer (but not for serial communication on pins 0 and 1).


e poi questo:
Quote
Programming port: To use this port, select "Arduino Due (Programming Port)" as your board in the Arduino IDE. Connect the Due's programming port (the one closest to the DC power jack) to your computer. The programming port uses the 16U2 as a USB-to-serial chip connected to the first UART of the SAM3X (RX0 and TX0). The 16U2 has two pins connected to the Reset and Erase pins of the SAM3X. Opening and closing the Programming port connected at 1200bps triggers a "hard erase" procedure of the SAM3X chip, activating the Erase and Reset pins on the SAM3X before communicating with the UART. This is the recommended port for programming the Due. It is more reliable than the "soft erase" that occurs on the Native port, and it should work even if the main MCU has crashed.


quindi la domanda mi sorge spontanea.
Posso mettere il firmware che si usa sulla DUE nel 16U2 dell'Arduino UNO R3 e ottenere lo stesso comportamento per la programmazione della Leonardo. Ovvero senza il reset del micro ogni volta che apro la seriale?

Non ho ancora controllato se i collegamenti tra il 16U2 delle DUE e quello della UNO R3 sia identici (Seriale e Reset), ma nel caso, ci sarebbero delle modifiche da fare al firmware prima di sostituirlo?

Poi bisognerà istruire anche l'IDE per trattare la programmazione della UNO come una Leonardo? Giusto?

@ArduinoTeam
E' una modifica che farete sulla UNO R4?

UPDATE:
E' stato creato da Astro un apposito bootloader --> http://arduino.cc/forum/index.php/topic,130621.msg982176.html#msg982176

Michele Menniti

Non mi sono messo a tradurre i tuoi quote :smiley-sweat: ti dico quello che so: l'impulso di RESET all'apertura del serial monitor lo manda l'IDE tramite un segnale al convertitore USB-Seriale che gli fa semplicemente generare un DTR; la cosa l'ho scoperta quando ho fatto sperimentazione con l'MCP2200 che NON ha il DTR bensì l'RTS; in questo caso continuo ad avere le normali funzionalità di RESET ma quando apro il SM Arduino NON si resetta.
L'IDE manda entrambi i DTR e RTS (ovviamente le istruzioni per farli eseguire al convertitore) quando deve resettare la scheda solo nel caso del SM invece manda DTR ma non RTS.
In conclusione penso che agendo sul convertitore si possa disabilitare completamente il RESET, cosa peraltro facilmente fattibile interrompendo il jumper a saldare previsto o mettendo un C da 10µF tra 3,3V e RESET, ma non bloccare il comando proveniente dall'IDE SOLO nel caso del SM.
Sono interessato alla discussione :)
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Massimo Banzi

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.

Per eliminare il reset basta tagliare la pista in mezzo ai due pad vicino a RESET_EN

Non è in programma una Uno R4 a questo punto.

m

cece99


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.

Per eliminare il reset basta tagliare la pista in mezzo ai due pad vicino a RESET_EN

Non è in programma una Uno R4 a questo punto.

m

La DUE non è di certo adatta ai principianti, volete dismettere la UNO che è il punto di partenza? =(
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

leo72


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.


PaoloP


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.

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

leo72


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.

PaoloP

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.

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.

astrobeed


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.

PaoloP


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.  :smiley-roll:

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.

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
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


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.

astrobeed


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.

Code: [Select]

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.

Go Up