Eccoci dunque a questo tanto atteso post.
In questo articolo vedremo come programmare alcuni Atmel della famiglia Attiny, in particolare quelli evidenziati nel titolo, utlizzando le librerie Arduino e Arduino Uno come ISP. Ovviamente il tutto può essere fatto anche utilizzando un programmatore dedicato, ma qui non mi soffermo su questo argomento più di tanto in quanto le differenze sono minime.
Partiamo da una premessa: sull’Attiny non andiamo a caricare il bootloader, ma procediamo ad un caricamento degli sketch direttamente nella memoria del microcontrollore. Quindi questa è una prima differenza rispetto agli Atmega328. Esistono forse cercando qua e là alcuni bootlaoder anche per Attiny, ma non ha molto senso montarli per diversi motivi. Il primo è l’esigua memoria che hanno questi microcontrollori (8kb per l’Attiny85 rispetto ai 32kb dell’Atmega328). In secondo luogo la maggior parte degli Attiny non hanno la seriale hardware, quindi non avrebbe senso montare un bootloader se poi non ci serve a fare l’upload via seriale.
Vediamo ora i vantaggi dell’Attiny85 rispetto all’Atmega328:
1 – minore consumo elettrico (quindi adatto per progetti a batteria)
2 – minore dimensione (l’Atmega328 ha 28 piedini, mentre l’Attiny85 ne ha solo 8)
3 – minor costo
Ovviamente presenta lo svantaggio che avendo meno piedini abbiamo un numero limitato di I/O rispetto ai fratelli maggiori.
Per quanto riguarda la programmazione è molto simile a quella vista nel post precedente e in quello prima ancora.
Vediamo innanzitutto la piedinatura dell’Attiny85 che useremo come esempio in questo articolo:

Mentre dal punti di vista di Arduino:
+-\/-+
Ain0 (D 5) PB5 1| |8 VCC
Ain3 (D 3) PB3 2| |7 PB2 (D 2) INT0 Ain1
Ain2 (D 4) PB4 3| |6 PB1 (D 1) pwm1
GND 4| |5 PB0 (D 0) pwm0
+----+
Quindi se voglio usare il PIN6 come uscita digitale userò pinMode(1,output) e se volessi leggere l’ingresso analogico dal PIN3 userò analogRead(A2).
Ovviamente anche qui come in arduino possiamo usare gli ingressi analogici come uscite digitali.
La seriale hardware non esiste come dicevamo, ma possiamo utlizzare il PIN2 (PB3) come seriale software monodirezionale. Praticamente usando i comandi standard di arduino tipo Serial.begin(9600), sul PIN2 abbiamo il segnale di TX, collegabile all’RX di un convertitore USB-SERIALE per comunicare dall’Attiny verso il PC, quindi è come se avessimo una “seriale in sola lettura”.
Ma veniamo alla pratica: rispetto alla programmazione dell’Atmega328, la programmazione dell’Attiny richiede la modifica e/o l’aggiunta di alcune librerie all’IDE.
Consiglio di usare la versione 0023 dell’IDE, scaricabile dal sito di Arduino (con altre versioni non sono riuscito), e di creare una cartella apposita separata da usare unicamente per la programmazione degli Attiny.
Quindi se abbiamo già Arduino (ad esempio sotto la cartella c:\Arduino), andremo a creare una nuova cartella che chiameremo ad esempio c:\Arduino-Tiny.
Fatto questo dobbiamo andare a scaricare il core arduino-tiny-0022-0009.zip, che trovate qui, poi dobbiamo scaricare la libreria PinChangeInterrupt-0001.zip che troviamo qui e infine la libreria TinyTuner-0003.zip che trovate qui. Il primo files lo scompattate così com’è dentro la cartella hardware (es.: c:\Arduino-Tiny\hardware). Vi chiederà di sovrascrivere alcuni files. Ditegli di si senza problemi. Le altre due librerie le scompattate sotto la cartella libraries (es.: c:\Arduino-Tiny\libraries). A questo punto dovrebbe essere tutto apposto. Potete eseguire l’upload dei vostri esempi usando il seguente schema:

Praticamente è come per l’Atmega328. Il pin 10 va collegato al RESET, e i pin 11, 12, 13 ai pin MOSI, MISO, SCK (cioè in questo caso 5, 6, 7), più ovviamente l’alimentazione.
Ricordatevi come sempre di inserire il condensatore da 22uF tra GND e RESET dell’Arduino UNO altrimenti la board si resetterà e l’upload non funzionarà generando un errore di sincronizzazione!!!
A questo punto aprendo dil nostro IDE, e aprendo uno sketch di esempio possiamo selezionando Tools –> Boards –> Attiny85 @1Mhz e poi File –> Upload to I/O Board.
Vi darà un errore di tipo “PAGEL”, ma si può ignorare. Vedrete il messaggio “Done Uploading” che vi avviserà che tutto è andato a buon fine.
Come vedete è molto semplice.
Gli Attiny escono di fabbrica con i fuse impostati in maniera tale che il microcontrollore utilizzi l’oscillatore interno a 1Mhz. E’ l’opzione migliore per la maggior parte dei progetti, ma se aveste bisogno di una velocità maggiore si può programmare l’Attiny in maniera tale che utilizzi il proprio oscillatore interno a 8Mhz oppure utlizzando un oscillatore esterno a 16Mhz (vedi post precedenti). Se vogliamo cambiare velocità al nostro Attiny, utlizzando as esempio l’oscillatore interno a 8Mhz, dobbiamo settare i fuse, facendo un’upload di un bootloader vuoto, contenente solo i settaggi che ci interessano. Per fare ciò è sufficiente selezionare da Tools –> Boards il settaggio che ci interessa (ad esempio Attiny85 @ 8Mhz), e poi Tools –> Burn bootloader —> w/Arduino as ISP.
A questo punto probabilmente vi darà il seguente errore:
avr_read(): error reading address 0x0000
read operation not supported for memory "lock"
avrdude: failed to read all of lock memory, rc=-2
Errore dovuto al fatto che manca nel file c:\Arduino-Tiny\hardware\tools\avr\etc\avrdude.conf la riga che riguarda l’operazione memory lock.
Quindi andiamo ad editare tale file e aggiugiamo la seguente riga:
read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
"0 0 0 0 0 0 0 0 o o o o o o o o";
Nella sezione dell’Attiny85 sotto la riga memory “lock” che dovrebbe apparire così dopo la modifica:
# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08.
memory "signature"
size = 3;
read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
"x x x x x x a1 a0 o o o o o o o o";
;
memory "lock"
size = 1;
write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
"x x x x x x x x 1 1 i i i i i i";
read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
"0 0 0 0 0 0 0 0 o o o o o o o o";
min_write_delay = 9000;
max_write_delay = 9000;
;
Ora eseguendo l’operazione di bootloader dovrebbe andare.
Se vogliamo possiamo andare a sistemare anche il problema del messaggio “PAGEL” aggiungeno le seguenti righe:
pagel = 0xB3;
bs2 = 0xB4;
Sotto la riga chip_erase_delay = 4500; nella sezione relativa all’Attiny85. In questo modo dovrebbe apparire così dopo le modifiche:
#------------------------------------------------------------
# ATtiny85
#------------------------------------------------------------
part
id = "t85";
desc = "ATtiny85";
has_debugwire = yes;
flash_instr = 0xB4, 0x02, 0x12;
eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC,
0x99, 0xE1, 0xBB, 0xAC;
## no STK500 devcode in XML file, use the ATtiny45 one
stk500_devcode = 0x14;
## avr910_devcode = ?;
## Try the AT90S2313 devcode:
avr910_devcode = 0x20;
signature = 0x1e 0x93 0x0b;
reset = io;
chip_erase_delay = 4500;
pagel = 0xB3;
bs2 = 0xB4;
pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
"x x x x x x x x x x x x x x x x";
In questo modo l’errore è corretto ma solo sull’Attiny85. Per risolvere il problema anche per gli altri microcontroller, qui vi ho dato uno spunto. Fate eventualmente una ricerca su google con l’errore che vi è apparso durante l’upload del bootloader.
Potrebbe verificarsi un’ulteriore errore (non ricordo la dicitura) quando fate l’upload di sketch molto grossi.
In questo caso so che era legato ad un bug dell’avr-gcc, e per risolvero bisogna scaricare il tools Winavr, installarlo, e copiare il contenuto della cartella c:\WinAvr\tools\ in c:\Arduino-Tiny\hardware\tools\ sostituendo tutti i files presenti (eccetto il file avrdude.conf precedentemente modificato).
Questa ultima parte è un po’ più complessa, ma vedrete che se seguirete tutto alla lettera non sarà difficile.
Al prossimo post allora!!!