Autoreset ? No, grazie.

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)

Sto già scaldando il saldatore per aggiungere il connettore alla mia UNO e provvedere alla modifica :wink:

Perfetto! Sulla mia UNO R1 funziona perfettamente.

Ho scelto l'upload tramite ISP con il mio USBtinyISP perché non me la sentivo di piazzare un jumper sul retro della scheda (sono molto cialtrone nelle saldature piccole) perciò ho deciso di sacrificare il bootloader Dfu, tanto se mi occorre posso sempre riscrivercelo sopra.

Adesso la presenza del jumper impedisce il reset della scheda quando si avvia l'IDE o si apre il monitor seriale. Basta ricordarsi di staccare il jumper in fase di programmazione, altrimenti si riceverà l'errore di "stk500_getsync(): not in sync: resp=0xe0" da parte di avrdude. Se si vuole conservare il comportamento "tradizionale" basta togliere il jumper e tutto funziona come prima.

Bravo Astro!

leo72:
Perfetto! Sulla mia UNO R1 funziona perfettamente.

Grazie per la prova e la conferma del funzionamento.

astrobeed:

leo72:
Perfetto! Sulla mia UNO R1 funziona perfettamente.

Grazie per la prova e la conferma del funzionamento.

Dovere :stuck_out_tongue:

Grande Astro, qualcuno aveva dubbi?

Io ho la R3.
Attendo..

grande Astro,
bellissima la frase

La modifica al firmware del 8/16u2 è quasi banale tanto è semplice

:stuck_out_tongue_closed_eyes:

devo saldare anche io l'header per la R1, approfittero' per "pazziare" con dfu che non l'ho mai usato.

per le modifiche/compilazione hai usato AVRStudio ?

per il discorso che facevo sull'altro topic, cioe' la provocazione promessa, non e' niente di che, semplicemente mi chiedevo, ma queste stesse cose le si fanno con l'apposita piazzola per il reset. Ad esempio su R1 si deve saldare l'header, quindi cmq serve saldatore, a quel punto si mette un jumper sulla piazzola reset. Diciamo che la tua modifica e' piu' pulita a livello hardware perche' va ad usare un jumper stadard invece di saldare la piazzola ogni volta e dissaldarla.
La cosa piu' banale che io farei al posto di arduinoteam e' semplicemente mettere un jumper al posto della piazzola, in modo da avare di fabbrica la possibilita' di abilitare o meno lo stesso, senza la necessita' di modificare nulla.

Testato:
per le modifiche/compilazione hai usato AVRStudio ?

No perché la libreria LUFA è scritta talmente male che tocca impazzire per renderla compatibile con AvrStudio, ho usato la make, leggermente modificata, fornita con i sorgenti e winavr come compilatore.
Mi ci è voluto più tempo per riuscire a capire come fare la compilazione che realizzare la modifica al software :slight_smile:
La cosa divertente è che se segui alla lettera le istruzioni ufficiali per compilare, provato sia con windows che con Linux, ottieni solo una sfilza interminabile di errori, la prima cosa che non ti dicono è che la libreria LUFA deve essere la versione 100807, con tutte le altre non si riesce a compilare senza doverci mettere mano pesantemente.

Testato:
La cosa piu' banale che io farei al posto di arduinoteam e' semplicemente mettere un jumper al posto della piazzola, in modo da avare di fabbrica la possibilita' di abilitare o meno lo stesso, senza la necessita' di modificare nulla.

Forse con una mazza da 1 Tons si riesce a fargli entrare in testa questa semplicissima modifica a costo 0 :grin:
Tieni presente che il mio lavoro è solo il primo mattone di un qualcosa di più grande, ho intenzione di implementare il mio SmartReset, quello presente sulla Luigino 328 che consente di programmare Arduino tenendo l'autoreset generico bloccato, su Arduino e poi vediamo se l'Arduino Team ha il coraggio di dire che è una modifica inutile :grin:

yep,
avevi detto che questo era il primo step, credo che alla fine, pur di non darti soddisfazione, metteranno il jumper reset sulla UNO R4 :stuck_out_tongue_closed_eyes:

Ha detto Banzi che non ci sarà un R4.

astrobeed:
No perché la libreria LUFA è scritta talmente male che tocca impazzire per renderla compatibile con AvrStudio, ho usato la make, leggermente modificata, fornita con i sorgenti e winavr come compilatore.
Mi ci è voluto più tempo per riuscire a capire come fare la compilazione che realizzare la modifica al software :slight_smile:
La cosa divertente è che se segui alla lettera le istruzioni ufficiali per compilare, provato sia con windows che con Linux, ottieni solo una sfilza interminabile di errori, la prima cosa che non ti dicono è che la libreria LUFA deve essere la versione 100807, con tutte le altre non si riesce a compilare senza doverci mettere mano pesantemente.

Me ne sono accorto anch'io..... cos'hai modificato, scusa? E' tutto il pomeriggio che impazzisco per cercare di compilare il firmware però io ho usato la 12xxx.

EDIT:
scaricando la 100807 ho compilato senza apportare modifiche ad alcunché (su Linux).

astro, protresti proporre la modifica del bootloader sul progetto arduino, così da renderlo (si spera) una feature "di default" su tutti i prossimo arduino UNO (R4?)

lesto:
astro, protresti proporre la modifica del bootloader sul progetto arduino, così da renderlo (si spera) una feature "di default" su tutti i prossimo arduino UNO (R4?)

Banzi ha detto che a loro le cose stanno bene così come sono, non vedo nessun motivo per cui devo perdere tempo dietro loro per cose che non gli interessano.
Domani aggiungo le versioni compilate per la UNO R3 e la MEGA tutte le release.

bha, io la proporrei lo stesso su github e sul sito inglese, anche se a Banzi va bene così se la comunità decide cosà di certo non può fare a meno di pensarci due volte XD

lesto:
bha, io la proporrei lo stesso su github e sul sito inglese, anche se a Banzi va bene così se la comunità decide cosà di certo non può fare a meno di pensarci due volte XD

Non confondere un progetto aperto con un progetto comune. Chi decide il perché ed il per come è il team di Arduino, qui non è come in altri progetti guidati dalla comunità. :stuck_out_tongue:

ma vedi, il vantaggio di git è che quando cloni un progetto, puoi anche clonare le varie pull-request in attesa di accettazione (o rifiutate). Quindi a questo punto mantenendo l'IDE orginale come punto di riferimento primario, si può creare una versione comunità più permissiva in fatto di pacth, e il bello è che chiunque potrebbe scegliere che path usare e compilarsi la sua personalizzata versione di IDE.
Al momento basta un maintainer che scelga quali patch inserire e risolva i conflitti per ottenere una shiny new ide 1.0.2-community

Vero, ma io mi riferivo alla gestione del progetto. :wink:

Per Astro:

Scusa Astro, ma ho letto solo ora il tuo 3D...

Ma perché non usare il solito elettrolitico da 4.7 - 10 uF tra Vcc e Reset?