Come promesso ecco una soluzione semplice, che non richiede nessuna modifica dell'IDE, per bloccare l'autoreset sulla UNO, R1-R2-R3, e la MEGA 2560, R1-R2-R3 e ADK, il blocco funziona anche con qualunque software applicativo sia realizzato da noi che di terze parti.
La disattivazione del autoreset si ottiene inserendo un jumper tra i pin 6 e 4 del connettore ISP del l'8/16u2 utilizzato come convertitore USB seriale, il pin 6 è GND e il pin 4 corrisponde a MOSI (PB2), la foto allegata mostra chiaramente come deve essere posizionato il jumper, per chi ha schede versione R1 e R2, dove il connettore ISP non è montato, può saldare solo i due pin necessari invece di tutti e sei.
Se il jumper tra GND e PB2 non è presente il comportamento di Arduino è quello classico con autoreset attivo e relativo reset aprendo la comunicazione seriale con Arduino.
Se il jumper è presente autoreset è disattivato, Arduino non resetta più aprendo la comunicazione seriale, ovviamente il blocco è valido anche per la fase di programmazione, o si rimuove il jumper, consigliato in fase di sviluppo, oppure si preme manualmente il tasto di reset, consigliato per applicazioni definitive per gli eventuali aggiornamenti software.
Il jumper può essere inserito/rimosso in qualunque momento con la relativa modifica del comportamento del autoreset.
Non è necessario resettare Arduino e/o l'8/16u2 per cambiare il comportamento del autoreset.
La modifica al firmware del 8/16u2 è quasi banale tanto è semplice, come prima cosa si aggiungono le seguenti righe alla funzione "main":
int main(void)
{
// set PB2 (MOSI) as input with pull up
DDRB &= 0b011; // Port B2 input
PORTB |= 0b100; // Pull Up
Viene settato PB2 come input con la pull attiva in modo da tenerlo fisso a uno logico
La funzione EVENT_CDC_Device_ControLineStateChanged() va modificata da cosi:
void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
{
bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR);
if (CurrentDTRState)
AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK;
else
AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK;
}
A così:
void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
{
bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR);
unsigned char ResetOK;
ResetOK = PINB & 0b100;
if(ResetOK == 4)
{
if (CurrentDTRState)
AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK;
else
AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK;
}
}
Viene aggiunto un controllo sullo stato di PB2, se è a uno logico (jumper rimosso) il segnale DTR attiva il reset, se è a 0 logico (jumper presente) il reset non viene eseguito.
Nel file rar allegato trovate il sorgente modificato del file "Arduino-usbserial.c" e il relativo .hex già compilato per l'ATMEGA 8u2 (UNO R1 e R2), ho messo anche il file "UNO-dfu_and_usbserial_combined.hex" che è quello originale per eventuale ripristino tramite programmazione ISP.
Purtroppo a causa di un imprevisto oggi non posso compilare, e testare, le versioni per la UNO R3 e quelle per la MEGA, le rilascerò nei prossimi giorni, i sorgenti originali, e i vari file .hex già compilati, si trovano nella cartella "..\arduino-1.0.1\hardware\arduino\firmwares\arduino-usbserial".
Per caricare il file hex sul 8u2 potete utilizzare la programmazione ISP oppure tramite il bootloader DFU precaricato sul micro, la procedura per utilizzare il DFU la trovate qui.
Attenzione che se caricate l'hex tramite ISP perdete il bootloader DFU, è sempre possibile ripristinarlo utilizzando i file originali forniti con la distro di Arduino.
Questo post verrà aggiornato nei prossimi giorni con le versioni per le R3 e le MEGA
NoAutoReset.rar (13.2 KB)