
La famiglia ATMEGA della ATMEL comprende una ampia serie di microcontrollori a 8 bit dotati di una vasta gamma di periferiche (convertitori analogici digitali, interfacce UART, timer ecc), facilmente programmabili e dotati di un buon rapporto qualità prezzo: caratteristiche che consentono l’utilizzo di questi dispositivi in molti progetti sviluppati in campo hobbistico. Un altro vantaggio dei microcontrollori della famiglia ATMEGA è che si possono facilmente programmare in modalità “in circuit”: sarà quindi sufficiente prevedere sulla scheda target un connettore per poter collegare il programmatore esterno evitando così l’uso di complicati e costosi sistemi di programmazione.
In questo articolo vedremo come muovere i primi passi per iniziare a impiegare questa famiglia di microcontrollori. Per prima cosa verrà presentato lo schema elettrico di una semplice demoboard utile per svolgere le prime prove di programmazione. Verrà poi descritto quale sistema di sviluppo utilizzare. Infine verrà presentato un semplice esempio di programmazione.
Demoboard
In figura 1 è rappresentato lo schema elettrico della demoboard e in figura 2 il relativo elenco dei componenti. Chiaramente il cuore del circuito è costituito dal microcontrollore ATMEGA48; è stato scelto questo modello in quanto in un package dalle dimensioni contenute (28 pin) sono presenti tutte le periferiche più significative per le nostre prove di programmazione: un convertitore analogico digitale a 10 bit con sei ingressi, 2 timer a 8 bit, un timer a 16 bit, un’interfaccia seriale USART. Tale microcontrollore dispone inoltre di 4 kbyte di memoria flash, 512 byte di ram e 256 byte di EEPROM. Le linee PC2, PC3, PC4 e PC5 sono configurate come uscite digitali e pilotano tramite il buffer ULN2803 (U4) 4 diodi led. Alle linee PB0, PB1 e PB2 (configurate come ingressi digitali) sono connessi 3 pulsanti (le resistenze da 10 kohm R6, R7 e R8 vengono utilizzate come pullup). L’amplificatore operazionale LM358 (U1a) configurato come amplificatore non invertente a guadagno 1 viene impiegato come buffer ad alta impedenza di ingresso. Il diodo zener da 5,1 V (D5) evita che all’ingresso analogico del microcontrollore arrivino tensioni con un valore superiore a 5 V che potrebbero danneggiare il microcontrollore stesso. All’ingresso analogico è possibile applicare la tensione in uscita dal trimmer V1 oppure applicare una tensione esterna applicata al morsetto P2 (la selezione viene fatta mettendo un jumper tra i pin 1 e 2 oppure 2 e 3 del pin strip P1). Alla nostra demoboard è possibile applicare un display a matrice di punti che ci permetterà di visualizzare delle scritte. Il trimmer da 10 kohm V2 permette di regolare il contrasto di tale display. Infine nel nostro circuito è presente un convertitore TTL – 485 connesso alla UART del microcontrollore: in questo modo sarà possibile far comunicare la nostra demoboard con altre schede dotate di interfaccia seriale. È stato scelto lo standard 485 data la sua diffusione in ambito industriale. Il convertitore in questione è costituito dall’integrato SN75176 (U5). Per alimentare il circuito è sufficiente applicare alla morsettiera P10 una tensione continua o alternata (la tensione alternata viene raddrizzata dal ponte a diodi D7) non stabilizzata avente un valore di 12V. Tale tensione viene poi stabilizzata a 5V dall’integrato7805 (U2). Il led D6 indica la presenza della tensione di alimentazione. Il microcontrollore viene fatto oscillare dal quarzo X1 da 8 Mhz. Ai pin strip P3 e P4 è possibile collegare il programmatore per l’in circuit programming.

Figura 1: schema elettrico demoboard.
Sistema di sviluppo
Dal sito della Atmel è possibile scaricare liberamente il software AVR Studio che permette di scrivere, compilare e scaricare i programmi (con gli opportuni programmatori) direttamente all’interno dei microcontrollori. Tale software permette inoltre di eseguire l’in circuit debugging (chiaramente utilizzando i programmatori che prevedono tale funzione). L’utilizzo di questo software è veramente molto semplice: dopo aver scritto il programma e averlo compilato se non sono presenti errori è possibile scaricarlo direttamente nella memoria flash del micro. Per ulteriori approfondimenti rimandiamo alla guida in linea del software.

Figura 2: componenti elettronici
Esempi di programmazione
Riportiamo un semplice esempio di programmazione: il programma non fa altro che far lampeggiare il led connesso alla linea PC2. Tale programma è di una banalità estrema, serve soltanto per capire quali sono i punti fondamentali per programmare i microcontrollori della famiglia ATMEGA.
.nolist
.include “m48def.inc”
.nolist
.def mp = R16
.def count1 = R17
.def count2 = R18 rjmp main
main:
ldi mp,0b11111111 out DDRC,mp
loop:
ldi mp,0b00000100 out PORTC,mp
ldi count2,255
loop2:
ldi count1,255
loop1:
dec count1 brne loop1
dec count2 brne loop2
ldi mp,0b00000000 out PORTC,mp
ldi count2,255
loop4:
ldi count1,255
loop3:
dec count1 brne loop3
dec count2 brne loop4
rjmp loop
La riga “.include “m48def.inc” “ utilizza la direttiva include per poter inserire il file di definizioni relativo al microcontrollore che si intende utilizzare (nel nostro caso l’ATMEGA48). Quindi nel caso si utilizzino microcontrollori diversi sarà necessario modificare opportunamente tale riga. La riga “.def mp = R16” utilizza la direttiva def che permette di definire dei mnemonici: in questo modo sarà più semplice e pratico scrivere il codice. Nel nostro caso al registro R16 viene associato il mnemonico mp. Stessa cosa per count1 e count2. Con l’istruzione rjump il programma salta all’inizio del programma principale (nel nostro caso identificato dall’etichetta main). Per utilizzare i pin di I/O del microcontrollore è necessario prima configurarli, bisogna cioè impostarli come ingressi o come uscite in base alle nostre esigenze. Nel nostro caso, dato che al pin PC2 è connesso un led dobbiamo configurarlo come uscita. Per fare questo, quindi, dobbiamo settare in maniera opportuna i bit del registro DDRC: tali bit vanno settati a 1 se vogliamo utilizzare il corrispondente pin come uscita altrimenti vanno impostati a 0 se vogliamo utilizzare il corrispondente pin come ingresso. L’istruzione “ldi mp,0b11111111” carica nel registro mp (nella nostra applicazione il registro chiamato da noi mp che in realtà è R16 viene utilizzato come registro generico per lo scambio di dati) il valore 255 (espresso in forma binaria come 11111111). Dopodichè l’istruzione “out DDRC,mp” scarica tale valore nel registro DDRC impostando i pin di I/O nel modo desiderato. A questo punto è necessario accendere il led portando a livello logico 1 la linea PC2: per fare questo carichiamo nel registro mp il valore 00000100 tramite l’istruzione “ ldi mp,0b00000100” dopodiché scarichiamo tale valore nel registro PORTC con l’istruzione “out PORTC,mp”. Dopo aver acceso il led, è necessario creare una pausa software di circa mezzo secondo prima di riaccenderlo. Per creare questa pausa sono stati utilizzati due cicli uno interno all’altro. Il ciclo interno è quello identificato dall’etichetta loop1: nel registro count1 viene caricato il valore 255. Ogni volta che il ciclo viene eseguito il registro count1 viene decrementato di 1 con l’istruzione “dec count1”. L’istruzione “brne loop1” controlla lo stato del registro count1: se è diverso da 0 il programma torna all’etichetta loop1 altrimenti prosegue con le istruzioni successive. Con lo stesso principio funziona il ciclo esterno identificato dall’etichetta loop2. Terminata la pausa il led viene spento portando a livello logico 0 la linea PC2 tramite le due istruzioni “ldi mp,0b00000000” e “out PORTC,mp”. Viene poi eseguita un’altra pausa software di mezzo secondo e poi tutto il programma viene ripetuto tramite l’istruzione “ rjmp loop”.
Conclusioni
In questo articolo abbiamo quindi visto come muovere i primi passi con i microcontrollori della famiglia ATMEGA. Sono state date solo le indicazioni fondamentali necessarie per partire: sul web si possono trovare centinaia di siti che trattano l’argomento e permettono di approfondire gli aspetti che più interessano. Abbiamo visto che i microcontrollori ATMEGA sono facili da usare ed estremamente flessibili: come al solito l’unico limite è la nostra fantasia.
