Go Down

Topic: Autoreset ? No, grazie. (Read 6370 times) previous topic - next topic

astrobeed

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":
Code: [Select]

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:
Code: [Select]

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ì:
Code: [Select]

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


leo72

Sto già scaldando il saldatore per aggiungere il connettore alla mia UNO e provvedere alla modifica  ;)

leo72

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!

astrobeed


Perfetto! Sulla mia UNO R1 funziona perfettamente.


Grazie per la prova  e la conferma del funzionamento.


leo72



Perfetto! Sulla mia UNO R1 funziona perfettamente.


Grazie per la prova  e la conferma del funzionamento.



Dovere  :P

Michele Menniti

Grande Astro, qualcuno aveva dubbi?
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


Testato

#7
Nov 04, 2012, 09:16 pm Last Edit: Nov 04, 2012, 09:21 pm by Testato Reason: 1
grande Astro,
bellissima la frase
Quote
La modifica al firmware del 8/16u2 è quasi banale tanto è semplice
:smiley-yell:

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

astrobeed


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  :)
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.

astrobeed


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  :smiley-mr-green:
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  :smiley-mr-green:

Testato

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

PaoloP

Ha detto Banzi che non ci sarà un R4.

leo72

#12
Nov 04, 2012, 09:57 pm Last Edit: Nov 04, 2012, 11:22 pm by leo72 Reason: 1

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  :)
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).

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?)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed

#14
Nov 07, 2012, 02:40 pm Last Edit: Nov 07, 2012, 04:12 pm by astrobeed Reason: 1

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.

Go Up