GPS Clock Project – parte 1

Parte 1 – Scrivere un bootloader e caricare sketch via FTDI su un Atmega 1284P

L’utilizzo di un Arduino per realizzare un progetto ha una grande utilità per la fase di sperimentazione. Una volta poi che si hanno le idee più o meno chiare sulla realizzazione di un progetto, bisogna passare dalla fase della breadboard con l’Arduino ad un prototipo che sia il più possibile indipendente. Onde evitare di utilizzare un Arduino per ogni prototipo, è utile imparare a programmare e utilizzare direttamente gli stessi MCU che vengono utilizzati per gli Arduino. Volendo si possono anche prendere campioni gratuiti dal sito della Atmel. Qualche anno fa c’erano pochi limiti sul sito della Atmel e sono riuscito a richiedere decine di campioni di vari microprocessori. Tra questi, ho preso una decina di Atmega 1284P; questi MCU hanno funzionalità e potenzialità simili all’Atmega 2560 che viene utilizzato sull’Arduino Mega, con la differenza che l’Atmega 2560 si trova soltanto in formato QFN mentre l’Atmega 1284P si trova in formato DIP. Pertanto è molto più facile sviluppare e prototipare con l’Atmega 1284P a partire da una breadboard, e passando poi ad una millefori, senza dover ricorrere alla realizzazione di una PCB su cui montare componenti SMD e QFN. Per una fase di sperimentazione e prototipazione è decisamente più a portata di mano l’Atmega 1284P.

Dopo vari tentativi non riusciti, sono finalmente riuscito a scrivere con successo un bootloader sull’Atmega 1284P utilizzando un Arduino come ISP. Ho caricato sull’Arduino l’apposito sketch “ArduinoISP”, ho fatto i vari collegamenti indicati nella guida che si trova sul sito dell’Arduino (Tutorial ArduinoISP o, meglio ancora, Tutorial ArduinoToBreadboard), ho aggiunto le definizioni hardware necessarie per l’Atmega 1284P (a partire da Arduino 1.6.3 bisogna fare riferimento a https://github.com/JChristensen/mighty-1284p/tree/v1.6.3, nel README si trovano istruzioni per l’installazione)… Ho collegato anche i LED utili per i segnali di errore o di successo… E alla fine sono riuscito a scrivere il bootloader. Sono poi riuscito con ulteriori fatiche ad uploadare uno sketch sempre attraverso un Arduino, e ho fatto blinkare un LED. Ebbene, un passo è compiuto.

Ora però, vorrei riuscire a caricare uno sketch senza dover utilizzare un Arduino, utilizzando soltanto un cavo FTDI o un FTDI breakout. Cercando tra vari tutorial online, vengono suggerite varie schematiche, vari collegamenti… Provi una soluzione, provi un’altra… Ricevevo sempre un bellissimo messaggio “avrdude not in sync…”. Ma dopo svariati tentativi e acquisti di FTDI breakout, insieme con Vincenzo siamo riusciti finalmente nell’impresa utilizzando un cavo FTDI, pertanto condividiamo con gli altri comuni mortali quello che ha funzionato per noi e che ci permette di finalizzare ora il nostro progetto.

Per prima cosa, potete richiedere qualche campione dell’Atmega 1284P dalla Atmel oppure acquistarlo dal sito, qui la pagina di questo MCU con il suo datasheet e le sue specifiche tecniche: http://www.atmel.com/devices/ATMEGA1284P.aspx.
Può essere utile stampare su un foglietto di carta il pinout del MCU e incollarlo direttamente sopra, così è più facile sapere esattamente quale pin fa cosa. Io ho preparato un foglio con le misure precise, che si può stampare e ritagliare e incollare sopra l’MCU con appena un tocco di vinavil. Lo schema del pinout è questo:

atmega1284p_by_pighixxx-d5u4aed[1]

Da qui invece potete scaricare il PDF con il pinout da stampare, ritagliare e incollare direttamente sul MCU (il puntino bianco demarca il pin 0, che si trova all’estremità del MCU segnata con un semicerchio, a sinistra del semi-cerchio, di solito c’è anche un puntino sul MCU che segna il pin 0):
https://drive.google.com/file/d/0B1siLB9ZuVUvQllNOXhYQnFpUVk/view?usp=sharing

Scrittura del bootloader

Per la scrittura del bootloader raccomando di seguire le istruzioni che si trovano sull’apposita pagina del sito dell’Arduino (https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard) come anche nei commenti iniziali dello sketch “ArduinoISP”. Il bootloader che stiamo utilizzando è quello di “Maniacbug con Optiboot 16MHZ”. Una volta scritto il bootloader, potete verificare che sia effettivamente funzionante collegando un LED al pin 0 e un interrutore a pulsante (pushbutton switch) al pin di reset; ogni volta che viene inizializzato l’MCU, il bootloader fa flashare il LED sul pin 0. Pertanto ogni volta che viene alimentato l’MCU o che viene premuto il tasto RESET, si dovrebbe flashare il LED sul pin 0. Prima di scrivere il bootloader, dovrete anche collegare un Crystal Oscillator da 16MHZ al MCU. Ecco lo schema che vi serve per scrivere e verificare il bootloader:
atmega1284p_bb

I due condensatori per il Cristallo sono da 22pF, mentre i due condensatori tra VCC e GND sono da 100nF (=0.1uF). La resistenza tra lo switch e VCC è da 10kOhm, è un “pull-up resistor” che serve per mantenere lo stato del pin di RESET a HIGH quando lo switch non è attivo. Le resistenze dei LED sono invece da 470 Ohm.

I tre led sui pin 7-8-9 sono opzionali, ma danno feedback sullo stato di scrittura del bootloader. Sul pin 9, il led (verde nella figura) dovrebbe aumentare e diminuire di intensità una volta caricato lo sketch “ArduinoISP” sull’Arduino UNO, questo vi fa capire che lo sketch è caricato correttamente e che potete procedere per la scrittura del bootloader.

Per scrivere poi il bootloader, selezionate “Maniacbug Mighty 1284P 16MHZ con Optiboot” dal menu “Strumenti -> Scheda”, assicuratevi che sia selezionata la Porta COM che corrisponde all’Arduino UNO, poi selezionate dal menù “Strumenti -> Scrivi il bootloader”.

Il led sul pin 7 (arancione nella figura) dovrebbe flashare mentre viene scritto il bootloader. Se c’è qualche errore, si dovrebbe accendere il led sul pin 8 (rosso nella figura). Se il bootloader è stato scritto correttamente, oltre ad avere un messaggio di conferma nell’interfaccia Arduino, dovrebbe flashare inizialmente anche il led sul pin 0 (= D0) del 1284P. Potete usare il pulsante di RESET che avete predisposto sulla breadboard per resettare il chip e verificare che flashi il led sul pin 0.

Nel caso che abbiate un Arduino MEGA anziché un Arduino UNO, basta utilizzare i pin 53-51-50-52 al posto di 10-11-12-13 rispettivamente. Nello sketch ArduinoISP sono indicati i pin da utilizzare con il seguente schema:

// pin name:      not-mega:       mega(1280 and 2560)
// slave reset:   10:             53
// MOSI:          11:             51
// MISO:          12:             50
// SCK:           13:             52

Una volta verificato che il bootloader sia stato scritto e funzioni effettivamente, potete procedere ad uploadare gli sketch con un cavo FTDI. Ora non vi serve più l’Arduino UNO.

Caricare uno sketch

Dopo svariati tentativi, siamo riusciti finalmente ad uploadare uno sketch utilizzando sia un cavo FTDI da 3.3V, sia un FTDI breakout che può essere settato sia a 3.3V sia a 5V. Questo lo schema del cavo FTDI:

Lo schema del FTDI breakout è quasi uguale, eccetto che al posto del RTS c’è il pin DTR.

Abbiamo notato che è essenziale il condensatore da 220nF (= 0.22uF) tra il pin RTS del cavo FTDI e il pin RESET dell’Atmega 1284P. Mentre questo condensatore non sembra che sia necessario per altri MCU, per l’Atmega 1284P sembra che sia indispensabile. Senza questo condensatore, ci sono messaggi di errore del tipo “avrdude not in sync” quando si tenta di uploadare uno sketch. Questo lo schema dei collegamenti:

atmega1284p_upload_sketch_bb

Per uploadare gli sketch, è sufficiente selezionare la board dal menù “Strumenti -> Scheda” (bisogna selezionare “Maniacbug Mighty 1284P 16MHZ con Optiboot”), e selezionare la porta COM che corrisponde al cavo FTDI.
Seguendo questa schematica e queste istruzioni, il caricamento dello sketch dovrebbe avere esito positivo. Provate uno sketch semplice tipo il Blink; nello sketch di esempio “Blink” è settato il pin 13, allora potete collegare un LED con una resistenza adatta al pin D13 dell’Atmega 1284P (facile da individuare se avete incollato il foglietto da stampare e ritagliare sopra l’MCU, comunque è il penultimo pin in basso a destra nello schema qui sopra). Se tutto va bene, caricato lo sketch vedrete blinkare il vostro mitico LED e sarete ora in grado di caricare un qualsiasi programma Arduino sul vostro Atmega 1284P!

Nel caso però che aveste qualche difficoltà a caricare gli sketch con messaggi del tipo “avrdude not in sync”, provate a tenere premuto il tasto RESET prima di iniziare la compilazione, poi nel  momento che l’IDE di Arduino cambia il messaggio di stato da “compiling” a “uploading”, rilasciate il tasto RESET. Il caricamento dovrebbe avere esito positivo.

<- Torna all’articolo introduttivo      |      Continua alla seconda parte… ->

Comments are closed.