Arduino

USBtinyISP: programmatore Atmel fatto in casa

Costruire un semplice programmatore per microcontrollori ATMEL

USBtinyISP è un prodotto commerciale acquistabile sul sito Adafruit. Si tratta di un programmatore AVR per microcontrollori Atmel. Per realizzarlo si necessita principalmente dei seguenti strumenti/componenti:

  • ArduinoISP (per la guida è stato usato su Arduino UNO rev.3)
  • Microcontrollore ATtiny2313 (datasheet)
  • Software Arduino (per la guida è stata usata la versione 1.8.10 su Raspbian, oggi Raspberry Pi OS)
  • Firmware (download)
  • Quarzo da 12 MHz e due condensatori ceramici da 22 pF

Ovviamente poi si va ad aggiungere tutta la componentistica ausiliaria in base a se si desidera realizzare il progetto su breadboard o su pcb.

Collegamento dell’ATtiny2313 ad ArduinoISP

Il primo passo è collegare la scheda Arduino al computer e mediante l’IDE fare l’upload dello sketch ArduinoISP (si trova nella directory degli esempi; la procedura è descritta in dettaglio in ArduinoISP: programmiamo ATmega e ATtiny). Una volta in possesso del nostro ISP dobbiamo collegare il microcontrollore alla scheda Arduino seguendo il seguente schema di riferimento:

Schema di collegamento ATtiny2313 ad Arduino UNO usato come ArduinoISP

Quindi su breadboard risulterà:

Montaggio su breadboard di ATtiny2313 e Arduino UNO come ArduinoISP

Il pinout completo del microcontrollore ATtiny2313 è il seguente:

Pinout del microcontrollore ATtiny2313

Quarzo e fuse

La tensione VCC deve essere pari a 5V (si può prelevare direttamente dal pin 5V della scheda Arduino). Inoltre bisognerà inserire tra i pin 4 e 5 un quarzo da 12MHz, con due condensatori da 22pF che collegano il pin 4 e il pin 5 verso massa (vedi schema elettrico sotto riportato). Conviene montare il quarzo prima di scrivere i fuse: con lfuse 0xEF il microcontrollore usa il quarzo esterno come sorgente di clock e senza di esso non risponde più al programmatore, nemmeno per il successivo caricamento del firmware.

Dopo aver verificato che i collegamenti siano corretti, si può procedere alla fase del caricamento dell’impostazione dei fuse per permettere il funzionamento del microcontrollore a 12MHz. Personalmente ho usato gli stessi fuse indicati da Adafruit per i loro prodotti commerciali: lfuse:w:0xef:m e hfuse:w:0xdb:m 

Se per qualche motivo dovete modificare i fuse standard fate riferimento ad uno dei due seguenti link per il calcolo:

Attenzione: modificando i fuse non abilitare mai DWEN (debugWIRE) né RSTDISBL e non disabilitare SPIEN: con uno di questi bit nello stato sbagliato l’ATtiny2313 non è più programmabile via ISP e serve un programmatore ad alta tensione o un debugger per recuperarlo. Controllare sempre il valore calcolato prima di scriverlo.

Scrittura dei fuse con avrdude

L’applicazione che ci serve per il trasferimento del firmware è avrdude (presente nelle directory di Arduino). Se ci troviamo su una qualsiasi distribuzione GNU/Linux o su macOS ci basta aprire il terminale e posizionarci nella cartella di Arduino. Con l’IDE 1.8.x spostiamoci nella sotto directory hardware > tools > avr: l’eseguibile si trova in bin e il file di configurazione in etc. Con l’IDE 2.x, invece, avrdude viene installato nella cartella dei pacchetti (su Linux ~/.arduino15/packages/arduino/tools/avrdude/<versione>/); in alternativa si può installare avrdude dai repository della propria distribuzione (ad esempio sudo apt install avrdude) e usarlo senza l’opzione -C. Una volta posizionati nella cartella possiamo collegare l’ArduinoISP al nostro PC e dare il seguente comando:

./bin/avrdude -C ./etc/avrdude.conf -U lfuse:w:0xef:m -U hfuse:w:0xdb:m -p t2313 -c stk500v1 -P /dev/ttyACM0 -b 19200

Non è necessario usare l’utente root: per accedere alla porta seriale basta aggiungere il proprio utente al gruppo dialout (sudo usermod -aG dialout $USER, poi uscire e rientrare nella sessione).
L’output dovrà essere simile al seguente (operazione svolta su Ubuntu).

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude: Device signature = 0x1e910a
avrdude: reading input file "0xef"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xef:
avrdude: load data lfuse data from input file 0xef:
avrdude: input file 0xef contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xdb"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xdb:
avrdude: load data hfuse data from input file 0xdb:
avrdude: input file 0xdb contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Caricamento del firmware

A questo punto il microcontrollore è pronto all’uso, pertanto dobbiamo scaricare il firmware (versioni v2.0 e v1.0) dalla pagina download di Adafruit, che ha sostituito il vecchio sito ladyada.net.
Apriamo il file compresso e andiamo ad estrarre solo il file main.hex situato nella cartella spi. Possiamo ora trasferire il firmware sul nostro microcontrollore ATtiny2313. Ritorniamo quindi sul terminale, controlliamo di essere ancora posizionati nella cartella hardware/tools/avr di arduino, e utilizziamo il seguente comando:

./bin/avrdude -C ./etc/avrdude.conf  -U flash:w:/home/mae89/main.hex:i -p t2313 -c stk500v1 -P /dev/ttyACM0 -b 19200

Dove al posto di /home/mae89/main.hex dovrete inserire la corretta path relativa a dove avere estratto il firmware. Se è andato tutto a buon fine dovreste ottenere un output simile al seguente:

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.07s

avrdude: Device signature = 0x1e910a
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/home/carlo/main.hex"
avrdude: writing flash (2038 bytes):

Writing | ################################################## | 100% 5.26s

avrdude: 2038 bytes of flash written
avrdude: verifying flash memory against /home/carlo/main.hex:
avrdude: load data flash data from input file /home/carlo/main.hex:
avrdude: input file /home/carlo/main.hex contains 2038 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 3.13s

avrdude: verifying ...
avrdude: 2038 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Realizzazione del programmatore

Giunti a questo punto, poiché abbiamo trasferito correttamente il firmware, possiamo rimuovere ogni collegamento e andare a realizzare (su breadboard, millefori o PCB) lo schema elettrico del programmatore:

Realizzato il circuito saremo in possesso del nostro USBtinyISP e potremo programmare moltissimi microcontrollori. Di seguito mostro alcune foto del mio prototipo:

Prototipo del programmatore USBtinyISP fatto in casa

Admin | MST-Tutorial

Appassionato di elettronica, elettrotecnica e programmazione. Fondatore di MST-Tutorial, condivido con entusiasmo conoscenze, esperienze e progetti legati all’innovazione tecnologica, con l’obiettivo di rendere accessibili concetti tecnici complessi attraverso tutorial chiari e pratici.

Articoli Correlati

Check Also
Chiudi
Pulsante per tornare all'inizio