Sei sulla pagina 1di 67

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Lo scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Prima puntata.

a cura di Matteo Destro

ono trascorsi ormai 5 anni da quando Elettronica In present il primo Corso di programmazione per microcontrollori: si trattava del popolare ST6 della SGS-Thomson. Subito dopo abbiamo realizzato un Corso sulla famiglia Zilog Z8 e ultimamente sui PIC della Microchip. Ora parliamo di Atmel AVR. Tutti i micro elencati appartengono alla stessa classe anche se profondamente diversi tra loro nelle prestazioni. La scaletta utilizzata per presentare i vari dispositivi non assolutamente casuale; chi ci segue fin dallinizio avr intuito che la sequenza dei Corsi pubblicati legata alla maturazione del lettore in questo campo. Elettronica In - giugno 2001 25

CORSO PROGRAMMAZIONE AVR

MEMORIA E PRESTAZIONI
TIPO ATtiny10 ATtiny11 ATtiny12 ATtiny22 ATtiny28 AT90S1200 AT90S2313 AT90S2323 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90C8534 AT90S8535 ATmega161 ATmega603 ATmega103 PIEDINI 8 8 8 8 28 20 20 8 28 8 40 28 40 40 48 40 40 64 64 I/O 6 6 6 5 11 15 15 3 20 5 32 20 32 32 15 32 35 48 48 FLASH 1 KB 1 KB 1 KB 2 KB 2 KB 1 KB 2 KB 2 KB 2 KB 2 KB 4 KB 4 KB 4 KB 8 KB 8 KB 8 KB 16 KB 64 KB 128 KB Vcc MIN EEPROM 2,7 V 4V 4V 4V 2,7 V 2,7 V 2,7 V 4V 4V 4V 2,7 V 4V 4V 2,7 V 3,3 V 4V 4V 4V 4V NO NO 64 B 128 B NO 64 B 128 B 128 B 128 B 128 B 256 B 256 B 256 B 512 B 512 B 512 B 512 B 2 KB 4 KB SRAM NO NO NO 128 B NO NO 128 B 128 B 128 B 128 B 256 B 128 B 256 B 512 B 256 B 512 B 1 KB 4 KB 4 KB SPI NO NO NO NO NO NO NO NO 1 NO 1 1 1 1 NO 1 1 1 1 CLOCK 0-6 MHz 0-6 MHz 0-8 MHz 0-8 MHz 0-4 MHz 0-12 MHz 0-10 MHz 0-10 MHz 0-8 MHz 0-10 MHz 0-8 MHz 0-8 MHz 0-8 MHz 0-8 MHz 0-15 MHz 0-8 MHz 0-8 MHz 0-6 MHz 0-6 MHz

Anche se in modo improprio, possiamo dire che abbiamo utilizzato le prime pubblicazioni per cercare di fare capire la struttura base che accomuna tutti i microcontrollori. In seguito, abbiamo dato per scontato alcuni concetti di base per focalizzare invece la nostra attenzione su prestazioni e risorse. Questa premessa per spiegare che a nostro avviso il momento giusto per imparare ad utilizzare una delle due famiglie di micro pi diffuse in ambito industriale: stiamo parlando degli Intel 8051 (o compatibili) e degli AVR, questi ultimi oggetto di questo Corso. Come al solito, lo facciamo abbinando alla pubblicazione cartacea una scheda hardware, che in seguito chiameremo demoboard, con la quale testare e verificare i vari programmi dimostrativi. Non solo, daremo al lettore la possibilit di scegliere tra due diversi approcci di studio: un primo, pi veloce, basato sulla sola demoboard che funge anche da programmatore; un secondo, pi completo, che vede come protagonista il sistema di sviluppo originale Atmel (il nuovissimo STK500) a cui abbineremo la demoboard. LARCHITETTURA RISC La tecnologia RISC consiste nello spostare le maggiori complessit dellhardware al software che lesatto contrario della tecnologia CISC (Complex 26

Instruction Set Computer). Nellarchitettura CISC i progettisti hanno puntato sulla riduzione del numero di istruzioni necessarie ad eseguire il programma, progettando istruzioni molto potenti, con lo svantaggio di dovere aumentare mediamente il numero di cicli macchina necessari per completare un istruzione; in questo caso viene ridotta la frequenza di lavoro del sistema per il fatto di dovere introdurre una fase di interpretazione del codice macchina tramite microcodice. Invece nelle architetture RISC si punta molto sulla minimizzazione del numero di cicli macchina rendendo la maggior parte delle istruzioni eseguibili in un solo ciclo di clock potendo cos aumentare la frequenza di lavoro del sistema. Questo possibile eliminando la fase di interpretazione grazie alla semplicit delle istruzioni che possono essere decodificate ed eseguite direttamente da una semplice unit di controllo cablata. La semplificazione delle unit di controllo delle macchine di tipo RISC particolarmente vantaggiosa per la realizzazione della CPU su un unico chip VLSI. Il risparmio di spazio ottenuto permette, a parit di area di silicio, di aumentare notevolmente il numero di registri interni e/o di integrare direttamente sul chip la memoria cache per sfruttare al massimo la velocit del microprocessore. Purtroppo la tecnologia RISC ha anche dei difetti, giugno 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

RISORSE INTERNE
TIPO ATtiny10 ATtiny11 ATtiny12 ATtiny22 ATtiny28 AT90S1200 AT90S2313 AT90S2323 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90C8534 AT90S8535 ATmega161 ATmega603 ATmega103 INT. EXT INT. 4 4 5 2 5 3 10 2 14 2 11 14 15 11 7 15 20 16 16 1 1 1 1 2 1 2 1 2 1 2 2 2 2 2 2 3 8 8 UART 8-bit TIMER 16-bit TIMER NO NO NO NO NO NO 1 NO 1 NO 1 1 1 1 NO 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 2 2 2 NO NO NO NO NO NO 1 NO 1 NO 1 1 1 1 1 1 1 1 1 PWM NO NO NO NO NO NO 1 NO 2 NO 2 2 3 2 NO 3 4 4 4 A/D CH NO NO NO NO NO NO NO NO 6 NO NO 6 8 NO 6 8 8 8 8 B.OUT NO NO SI NO NO NO NO NO SI NO NO SI NO NO NO NO SI NO NO

infatti il numero ridotto di istruzioni comporta che il software prodotto, a parit di funzioni da espletare, occupi pi memoria di quello di una macchina CISC, sia staticamente che dinamicamente. Tutte le macchine RISC impiegano la tecnica del pipeling per aumentare le prestazioni in termini di istruzioni eseguite nell unit di tempo. LA FAMIGLIA AVR AD 8 BIT In queste pagine trovate lelenco delle principali risorse interne della famiglia di microcontrollori AVR. Ci che differenzia i vari dispositivi il numero di istruzioni assembler disponibili, la quantit di memoria programma, la quantit di memoria SRAM presente e non ultimo il numero di linee di I/O, oltre alla presenza o meno di periferiche quali UART, timer, convertitori A/D, eccetera. Ad esempio l AT90S1200 un dispositivo che ha un set di 89 istruzioni assembler, 1 Kbyte di memoria programma, 15 linee di I/O, 64 Byte di EEPROM e 32 registri di uso generale. Ci che accomuna invece lintera famiglia larchitettura con cui sono realizzati, il set di istruzioni e i vari metodi di indirizzamento della memoria e dei registri. L architettura in particolare si basa sul concetto di accesso veloce ai registri. I registri, come sappiaElettronica In - giugno 2001

mo, sono delle aree di memoria utilizzate per comunicare con le periferiche disponibili allinterno del micro quali Contatori, Timer, Convertitori A/D e porte di I/O. Alcuni registri possono essere usati come puntatori a indirizzamento indiretto a 16 bits per comunicare con della memoria; questi registri a 16 bits sono chiamati registri X,Y,Z. Unaltra caratteristica comune il modo con cui il micro processa le istruzioni che viene denominato instruction pipelining (catena di montaggio). Il pipelining consiste nelleseguire una istruzione e contemporaneamente andare a fare il fetch del1istruzione successiva. LATMEL AT90S8515 Questa breve premessa serve per far capire che imparando la struttura di un micro AVR qualsiasi, automaticamente si in grado di lavorare con lintera famiglia. Per questo motivo, abbiamo deciso di basare lintero Corso e di conseguenza la demoboard e i vari listati demo su di un solo modello di micro. La nostra scelta ovviamente andata verso il tipo pi diffuso e cio sullAT90S8515. Questo microcontrollore, racchiuso in un case a 40 piedini, fornisce un set di 118 istruzioni assembler, 8 Kbyte di memoria programma, 512 Byte di EEPROM, 512 Byte di SRAM e 32 linee di I/O. 27

CORSO PROGRAMMAZIONE AVR

Il dispositivo esegue potenti istruzioni in un singolo ciclo di clock, quindi capace di 1 MIPS per Mhz (questo in via teorica). Tra le altre caratteristiche segnaliamo la presenza di 32 registri per operazioni di I/O e 32 registri di uso generale, interrupt interni ed esterni, un UART programmabile per interfacciamenti seriali, un Watch-dog timer programmabile con oscillatore interno, una porta seriale SPI, due stati a basso consumo selezionabili via software e un Timer / Counter. I due stati a basso consumo sono detti uno idle mode e l altro power down mode. Il primo ferma la CPU ma permette alla SRAM, al Timer/Counter, alla porta seriale SPI e ai sistemi di interrupt di continuare a funzionare, mentre nel secondo modo vengono salvati i contenuti dei registri e viene congelato loscillatore, tutte le altre funzioni del chip vengono disabilitate finch non si 28

interviene con un interrupt esterno o resettando la CPU. Il micro AT90S8515 disponibile in contenitore a 40 piedini, vediamo di descriverli uno ad uno. DESCRIZIONE DEI PIN Vcc - Piedino di alimentazione positiva. GND - Massa di alimentazione. Port A (PA7PA0) - E una porta di I/O bidirezionale. Tutti i piedini della porta hanno delle resistenze interne di pull-up. Il buffer di uscita in grado di fornire fino a 20 mA di corrente sufficiente per pilotare un display a Led. I piedini sono nello stato di tri-stated quando una condizione di reset diventa attiva, oppure quando il clock non attivo. Questa porta usata come multiplexer di ingresso / uscita per dati e indirizzi quando viene collegata giugno 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

una SRAM esterna. Port B (PB7PB0) - E una porta di I/O bidirezionale. Tutti i piedini della porta hanno delle resistenze interne di pull-up. Il buffer di uscita della in grado di fornire fino a 20 mA di corrente. I pin della sono nello stato di tri-stated quando una condizione di reset diventa attiva, oppure quando il clock non attivo. Port C (PC7PC0) - E una porta di I/O bidirezionale. Tutti i pin della porta hanno delle resistenze interne di pull-up. Il buffer di uscita in grado di fornire fino a 20 mA di corrente. I pin sono nello stato di tri-stated quando una condizione di reset diventa attiva, oppure quando il clock non attivo. Quando si collega della SRAM esterna, questa

ICP - E un pin di ingresso per la funzione di Timer / Counter input Capture. (Descriveremo il pin nei dettagli nella puntata dedicata al Timer). AC1B - E un pin di uscita per la funzione di Timer / Counter1 CompareB. (Descriveremo il pin nei dettagli nella puntata dedicata al Timer1). ALE - E l abbreviazione di Address Latch Enable ed usato quando della memoria esterna viene connessa al microcontrollore. Praticamente il pin genera un impulso di riferimento che viene utilizzato per iniziare un collegamento tra il microcontrollore e la memoria. LA PROGRAMMAZIONE IN-SYSTEM Si pu notare che il microcontrollore dispone di una grande quantit di memoria programma, nel nostro caso disponiamo di ben 8 Kbyte di memoria

porta utilizzata come bus indirizzi in uscita verso la SRAM. Port D (PD7PD0) - E una porta di I/O bidirezionale. Tutti i pin della porta hanno delle resistenze interne di pull-up. Il buffer di uscita in grado di fornire fino a 20 mA di corrente. I pin sono nello stato di tri-stated quando una condizione di reset diventa attiva, oppure quando il clock non attivo. RESET (attivo basso) - Il pin di reset un ingresso. Viene attivato da un livello logico basso il quale deve avere unopportuna durata. Solitamente il tempo di reset si assesta intorno ai 50 ns. Tempi pi brevi non assicurano la generazione del reset. XTAL1 e XTAL2 - Pin a cui va connesso il Quarzo da 4 o 8 Mhz. Oltre al quarzo vanno connessi due opportuni condensatori (vedi figura). Elettronica In - giugno 2001

flash. Tale tipo di memoria pu essere programmata In-system, cio il micro viene lasciato sul circuito in cui deve lavorare e con un opportuno collegamento al PC si programma il micro secondo le proprie esigenze. La programmazione In-System evita linconveniente di dover continuamente estrarre il micro dallo zoccolo per inserirlo nell opportuno programmatore, in questo modo si evita anche di danneggiare il micro, ad esempio stortando o addirittura rompendo un piedino durante le continue manovre di inserzione e estrazione del componente. Se vogliamo, l unico inconveniente la necessita di dover realizzare un collegamento tra il circuito in progettazione e il PC. La nostra demoboard stata appositamente progettata per supportare la programmazione in-system. Appuntamento alla prossima puntata in cui inizieremo ad esaminare la struttura e il funzionamento della memoria interna e dei principali registri. 29

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Lo scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Seconda puntata.

a cura di Matteo Destro

ella prima puntata abbiamo elencato a grandi linee le prestazioni e le risorse dei dispositivi che compongono la famiglia Atmel AVR 8 bit; decidendo poi di soffermare la nostra attenzione sullAT90S8515. Questo microcontrollore dispone di una grande quantit di memoria programma: ben 8 Kbyte di Memoria Flash. Oltre alla memoria programma ritroviamo i 32 registri per uso generale che vanno dallindirizzo di memoria $0000 a $001F, i 64 registri di I/O che vanno dallindirizzo $0020 a $005F, la memoria SRAM interna (512 Byte) che va dallindirizzo $0060 allindirizzo $025F e, infine, abbiamo spazio per indirizzare una Elettronica In - luglio/agosto 2001 73

CORSO PROGRAMMAZIONE AVR

Schema a blocchi del microcontrollore AT90S8515.

memoria SRAM esterna per un totale di 64 Kbyte (indirizzi da $0260 a $FFFF). Nel box riportato in questa pagina illustrato lo schema a blocchi interno dellAT90S8515. Al centro dello schema troviamo lunit logico aritmetica lALU (Aritmetic Logic Unit) che unitamente al blocco dei registri forma il core del micro. Il core mediante un Data Bus ad 8 bit comunica con tutte le risorse implementate: innanzitutto con i registri di controllo che, visti apparentemente coma una particolare area di memoria, formano in realt delle interfacce tra il programma e le periferiche implementate. Proseguendo nellanalisi troviamo la Interrupt Unit ovvero un dispositivo che provvede a gestire ed a smistare le varie comunicazioni di interruzione che le periferiche possono inviare alla CPU. CONCETTO DI INTERRUPT Vedremo in seguito che la CPU altro non fa che leggere ed eseguire in sequenza, rigorosamente una dopo laltra, le istruzioni contenute nella 74

memoria programma. Con una descrizione elementare possiamo dire che la CPU legge lopcode della prima istruzione in memoria, lo interpreta trasformandolo in un comando e lo esegue; quindi ripete lo stesso processo sullopcode disponibile nel byte successivo di memoria programma e cos via. In realt questa sequenzialit affidata al Program Counter che per definizione contiene lindirizzo del byte di memoria programma che contiene lopcode della prossima istruzione che la CPU deve processare. Una macchina a stati cos congegnata non consente per di gestire eventi in tempo reale e, per questo motivo, sono stati inventati gli interrupt. In pratica le periferiche interne sulla base di particolari eventi interni od esterni possono generare uninterruzione al normale ciclo di programma. Nella pratica ci consiste nel forzare nel Program Counter lindirizzo di una zona di memoria definita (vettore di interrupt). Quindi ad esempio, abilitando linterrupt della periferica UART, otterremo che in corrispondenza con il termine della ricezione dei dati il micro andr ad eseguire listruzione contenuta nella locazione $009 (vettoluglio/agosto 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

Dalla figura si nota che le locazioni di memoria che vanno da $0000 a $001F individuano i registri di uso generale; mentre le locazioni da $0020 a $005K contengono i registri di I/O. Dalla locazione $0060 fino a $025F troviamo la SRAM interna al microcontrollore, mentre dallindirizzo $0260 fino a $FFFF abbiamo dello spazio indirizzabile per connettere al micro della memoria SRAM esterna.

Ad ogni registro assegnato un indirizzo univoco, in questo modo si mappata la memoria dallindirizzo $00 all indirizzo $1F individuando 32 locazioni da usare come spazio dati. I registri che vanno dalla locazione $1A alla locazione $1F possono essere combinati due a due per ottenere registri a 16 bit, indicati con i nomi di registri X, Y, Z.

re di interrupt della ricezione UART). Qui possiamo inserire una serie di istruzioni dedicate a questo evento: ad esempio, possiamo leggere il valore che lUART ha ricevuto e scriverlo in una variabile; queste operazioni vengono svolte da una subroutine che prende il nome di routine di risposta allinterrupt. La routine terminer con una istruzione che far loperazione opposta rispetto allinterrupt cio forzer nel Program Counter listruzione successiva allultima eseguita prima dellinterrupt. LAT90S8515 dispone di 13 vettori di interrupt. Torniamo ora allo schema a blocchi interno e vediamo che le altre periferiche disponibili sono la SPI Unit, interfaccia seriale sincrona a 3 fili in grado di operare in modalit Master o Slave; la Serial UART (Universal Asynchronous Receiver and Transmitter); un 8 bit Timer / Counter e un 16 bit Timer / Counter; un Watchdog Timer; un comparatore analogico e 32 linee di ingresso / uscita con le quali il dispositivo scambia dati a livello TTL con il mondo esterno. Per comunicare con le varie periferiche sopra elencate sono disponibili una serie di registri definiti Elettronica In - luglio/agosto 2001

secondo la tabella pubblicata a pagina 77 che prendono il nome di I/O register; in questa tabella troviamo elencato lindirizzo di memoria in cui sono resi disponibili e la sigla mnemonica che li identifica. MAPPA DI MEMORIA Come ogni microcontrollore anche lAT90S8515 dispone internamente di due specifiche aree di memoria: la Program Memory e la Data Memory. La Program Memory, memoria programma, contiene il programma ovvero lopcode delle istruzioni che la CPU dovr eseguire una dopo laltra quando il micro viene alimentato. La memoria programma di tipo FLASH e pu essere scritta e cancellata per ben 1000 volte. La sua capacit di 4K x 16 locazioni il cui indirizzo va da $000 a $FFF. La Data Memory pu essere scomposta in due parti significative: una contenente i dati e una destinata ai registri. Vedremo che lo svolgimento di un programma richiede lutilizzo oltre che di costanti 75

CORSO PROGRAMMAZIONE AVR

anche di variabili. Con questultimo termine indichiamo tutti i parametri numerici che possono variare durante lesecuzione di un programma. Il nostro micro dispone di 512 locazioni interne di memoria in cui possibile memorizzare delle variabili; tali locazioni sono contraddistinte da precisi indirizzi e vanno da $0060 a $025F. Osservando la mappa di memoria dati notiamo le locazioni da $0260 a $FFFF sono indicati come External RAM; ci significa che la struttura hardware e le risorse software (capacit di indirizzamento) dellAT90S8515 consentono di collegare esternamente una memoria SRAM da 64 Kbyte (massimi). Le locazioni da $0000 a $005F contengono invece i registri che come abbiamo visto prima sono delle locazioni utilizzate per comunicare con le periferiche o utili al lavoro della ALU. In particolare i registri il cui indirizzo va da $0000 a $0001F vengono denominati General Purpose Working Register: sono i registri di lavoro, quelli da utilizzare per svolgere operazioni matematiche o per puntare a determinate locazioni; vedremo meglio tali registri durante lanalisi del set di istruzioni. In ogni caso occorre ricordare che sei dei trentadue registri di uso generale possono essere utilizzati come puntatori a indirizzamento indiretto a 16 bits per lavorare con la memoria. Questi registri a 16 bits sono chiamati registri X, Y e Z. Ad ogni registro assegnato un indirizzo univoco, in questo modo si mappata la memoria dall indirizzo $00 all indirizzo $1F individuando 32 locazioni da usare come spazio dati. LALU ad alte prestazioni dell AVR comunica con tutti e 32 i registri di uso generale, ed in grado, in un unico ciclo di clock, di eseguire operazioni tra due registri. Le locazioni da $0060 a $005F contengono invece i registri di I/O (vedi tabella a lato); si tratta di 64 locazioni di memoria attraverso le quali possibile impartire ordini, ovvero inviare comandi, alle varie periferiche e riceverli. Descriveremo meglio il significato di ogni registro di I/O durante lanalisi della periferica a cui sono destinati. Per ora ci limitiamo a dire che le locazioni di I/O, ovvero la parte di memoria che contiene i registri di I/O, sono accessibili attraverso le istruzioni di IN e OUT le quali trasferiscono i dati tra i 32 registri di uso generale e lo spazio di I/O. LA MEMORIA EEPROM La SRAM interna non lunica area disponibile per la memorizzazione dei dati, sono infatti imple76

mentate altre 512 locazioni da 8 bit in cui scrivere e leggere dei dati: si tratta della memoria EEPROM. Questa area di memoria pu essere considerata come una RAM con la differenza che i dati inseriti vengono trattenuti anche in assenza di alimentazione. Per scrivere o leggere dati in EEPROM per necessario utilizzare tre specifici registri. Questa memoria consente un massimo di 100000 cicli di scrittura / lettura. IL REGISTRO DI STATO Questo registro serve per controllare il verificarsi di particolari eventi dovuti allesecuzione di alcune istruzioni, tipo quelle logiche o matematiche. Ogni Bit di questo registro ha una particolare funzione. Bit 7 - I Global Interrupt Enable Questo bit va settato a valore logico alto (cio 1) per abilitare lutilizzo degli interrupt. Questo bit viene posto a zero dallhardware dopo che c stata una richiesta di interrupt, mentre viene settato dallistruzione RETI al termine di una routine di interrupt. Bit 6 T Bit Copy Storage Le istruzioni di copia dei bit (BLD bit letto e BST bit immagazzinato ) usano il bit T come sorgente e destinazione nelle operazioni che vengono effettuate sui singoli bit di un registro. Un bit di un registro pu essere copiato nel bit T dallistruzione BST mentre il bit T pu essere copiato in un altro registro attraverso l istruzione BLD. Bit 5 H Half Carry Flag Questo bit indica che unoperazione aritmetica ha generato un riporto oppure un prestito. Bit 4 S Sign Bit Il bit S dato da un OR esclusivo tra il flag negativo N e il complemento a due del flag V. Indica il segno del dato dopo avere eseguito unoperazione aritmetica. Bit 3 V Flag di Overflow In questo bit contenuto il risultato di overflow ed in complemento a due. Letteralmente tradotto overflow significa traboccamento, ed una condizione nella quale unoperazione aritmetica fornisce un risultato di grandezza superiore alla massima che un registro o una locazione di memoria pu contenere. luglio/agosto 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR


Bit 2 N Negative Flag Bit 1 Z Zero Flag Bit 0 C Carry Flag Indicano al termine di un'operazione matematica o Elettronica In - luglio/agosto 2001

logica rispettivamente se il risultato negativo, se il risultato pari a zero, se loperazione ha dato luogo oltre che al risultato anche ad un riporto. Lo Status Register non viene automaticamente salvato quando si richiama una routine di interrupt. 77

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Lo scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Terza puntata.

a cura di Matteo Destro

l microcontrollore AT90S8515 dispone di quattro porte di I/O a 8 bit classificate come portA, portB, portC e portD. Le porte di I/O sono necessarie al micro per potere colloquiare con il mondo esterno, ad esempio se si volesse collegare un convertitore Analogico Digitale necessario che il micro disponga di alcuni pin per potere effettuare il collegamento al dispositivo in questione. Ognuna di queste porte di I/O formata da vettori di 8 bit ciascuna, e alcune di esse sono "programmabili". Con questo termine si intende che particolari pin della porta possono essere usati per scopi specifici, ad esempio il portB dispone di una Elettronica In - settembre 2001 71

CORSO PROGRAMMAZIONE AVR

interfaccia seriale ( SPI ) a quattro fili. Se il micro viene programmato in modo corretto si ha che la logica interna provveder a utilizzare i suddetti pin della porta di I/O per eseguire un interfacciamento seriale a 4 fili con unaltra periferica che usa lo stesso protocollo di comunicazione. I restanti 4 bit della porta di I/O possono essere usati per qualsiasi altro scopo. Ogni porta di I/O viene pilotata attraverso l'utilizzo di tre registri che sono chiamati Data Register, Data Direction Register e Input Pins Address. Per utilizzare la portA, come per le altre, vengono assegnate tre locazioni di memoria di I/O, una allocazione per ogni registro. Ad ogni allocazione di memoria viene assegnato un nome mnemonico. Il registro dei dati viene chiamato PORTA (indirizzo esadecimale 3BH), il registro che indica la direzione del dato, in o out, viene chiamato DDRA (indirizzo 3AH) mentre il registro Input Pins Address viene chiamato PINA (indirizzo 39H). Questi nomi (PORTA, DDRA e PINA) vengono usati quando si

INDIRIZZI ESADECIMALI DELLE PORTE I/O PORT $H3B $H38 $H35 $H32 DDR $H3A $H37 $H34 $H31 PIN $H39 $H36 $H33 $H30

PORTA PORTB PORTC PORTD

programma in assembler, infatti se si vuole scrivere nel registro DDRA sar sufficiente utilizzare le istruzioni: LDI r16 , 0xff OUT DDRA, r16 che assegnano al registro r16 il valore esadecimale FF e lo si trasferiscono al registro DDRA. In questo modo stata impostata la portA come

Schema elettrico di un pin del portA.

72

settembre 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

Port Pin PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

PORT B Alternate Functions T0 (Timer/Counter 0 external input) T1 (Timer/Counter 1 external input) AIN0 (Analog comparator pos input) AIN1 (Analog comparator neg input) /SS (SPI Slave Select input) MOSI (SPI Bus Master Out/Slave In) MISO (SPI Bus Master In/Slave Out) SCK (SPI Bus Serial Clock)

PORT D Port Pin PD0 PD1 PD2 PD3 PD5 PD6 PD7 Alternate Functions RXD (UART Input line) TXD (UART Output line) INT0 (External interrupt 0 input) INT1 (External interrupt 1 input) OC1A (Timer/Counter1 Out compareA) /WR (Write strobe to external memory) /RD (Read strobe to external memory)

porta di uscita. In definitiva: il registro PORTA serve per mandare in uscita dei dati, il registro PINA serve per acquisirli mentre il registro DDRA serve per indicare la direzione del dato, o meglio la direzione che ogni singolo bit della porta pu assumere. Lo schema elettrico di un singolo bit della portA visualizzato nel box presente in queste pagine. Per quanto riguarda il portB abbiamo che il numero di registri lo stesso solo che cambia il loro indirizzamento all'interno della memoria di I/O (vedi tabella). I registri vengono utilizzati a livello di assembler nello stesso modo del portA, per la differenza sta nel fatto che alcuni Bit possono essere utilizzati per scopi particolari. Analizzando la tabella pubblicata osserviamo, come accennato in precedenza, le funzioni che si possono assegnare al portB.

Va osservato che in questo caso lo schema di ogni Bit della porta diverso, cio lo schema circuitale per il Pin0 della portB sar diverso dallo schema circuitale del Pin1 e cos via proprio per le caratteristiche diverse dei vari pin. Per rendersi conto di ci sufficiente andare a vedere il Data-Sheet. Il portC identico al portA, invece il portD ha anchesso dei pin programmabili per scopi particolari legati allutilizzo dellUART, di memorie e interrupt esterni. CONTATORI All'interno del micro AT90S8515 troviamo integrati due contatori, uno a 8 bit e l'altro a 16 bit. In realt la logica permette di impostare il sistema sia come contatore che come temporizzatore. Ci

Schema a blocchi dei contatori ad 8 e 16 bit.

Elettronica In - settembre 2001

73

CORSO PROGRAMMAZIONE AVR

significa che, se il componente settato come contatore, allora in grado di accettare degli impulsi esterni e di interrompere il programma principale dopo un certo numero di impulsi stabiliti dal programmatore (praticamente c stata una richiesta di

CS11 e CS12). Questi bit di selezione vengono memorizzati dal programmatore allinterno di un registro a 8 bit di cui si usano i tre bit meno significativi, il registro si chiama TCCR0. E bene osservare che il Contatore a 8 bit un up-counter

Schema circuitale del contatore a 8 bit.

interrupt del contatore); oppure pu essere usato come temporizzatore ed quindi in grado di contare degli impulsi di clock del sistema e di dare un segnale di interrupt dopo un predeterminato numero di impulsi di clock. Ogni contatore pu usufruire di una logica interna che fa da PRESCALER, cio divisore di frequenza. Circuitalmente si presenta come mostrato in figura (Schema a blocchi dei contatori ad 8 e 16 bit). Nel circuito si notano il prescaler e due multiplexer necessari per portare il segnale o al contatore a 8 bit (TCK0) oppure al contatore a 16 bit (TCK1). Entrambi i multiplexer sono programmabili usando i tre bit CS00, CS01 e CS02. La tabella a lato mostra la corrispondenza tra il i valori logici dei tre bit e il tipo di segnale applicato al contatore: si pu selezionare il clock interno, processato o non processato dal prescaler, oppure un segnale esterno presente sul piedino T0. Sul segnale T0 si pu scegliere se essere sensibili sul fronte di salita oppure sul fronte di discesa del segnale. La tabella pubblicata valida per il contatore a 8 Bit. Per il contatore a 16 bit, identica, cambiano solo i pin di selezione (CS00, CS01 e CS02 diventano CS10, 74

e il valore del conteggio viene memorizzato nel registro TCNT0. Analizzando lo schema circuitale del contatore notiamo i due registri a 8 bit TIMSK e TIFR; questi registri servono per gestire gli eventi di interrupt del contatore. Per quanto riguarda il contatore a 8 bit viene utilizzato il Bit1 del registro TIMSK. Quando questo a livello logico alto, insieme al bit I dello Status Register, abbiamo che linterrupt di overflow del contatore stato abilitato e di conseguenza se ci sar traboccamento da parte del contatore, verr eseguita la corrispon-

Impostazione del prescaler del contatore ad 8 bit CS02 CS01 CS00 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 Description Stop the timer/counter0 CK CK/8 CK/64 CK/256 CK/1024 External Pin T0, falling edge External Pin T0, rising edge

settembre 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

dente routine (che sar allocata all'indirizzo 007H). Del registro TIFR viene usato il Bit 1, questo va a livello logico alto quando avviene un overflow e viene resettato dallhardware dopo che stata eseguita la routine corrispondente alla richiesta di

valore della soglia, si riesce a cambiare la durata dell'impulso in uscita e quindi, continuando a variare la soglia, si genera una forma donda PWM. La soglia deve essere fatta variare prima che incontri il segnale triangolare (vedi figura) pena la gene-

Modulazione PWM realizzata tramite il contatore a 16 bit.

interrupt. Il contatore a 16 bit invece pi complesso del precedente e di conseguenza permette di realizzare pi procedure. Una di questa la modulazione PWM (Pulse Width Modulation), e pu essere realizzata a 8, 9 o a 10 bit. Grazie al fatto che il contatore a 16 bit di tipo up/down, quindi pu contare sia in avanti che allindietro, possibile generare una sorta di onda triangolare (vedi figura sopra) ottenuta facendo salire il contatore fino al suo massimo valore e, sempre ad intervalli di tempo costanti, farlo contare allindietro fino ad arrivare a zero e di seguito ricominciare lincremento. Questa peculiarit viene usata per generare la modulazione PWM che consiste nel cambiare il duty cycle di unonda quadra in base ad un segnale modulante rappresentato dal valore di comparazione (Compare Value). Per capirne il funzionamento bisogna osservare la figura relativa: ogni volta che il segnale triangolare viene a trovarsi al di sotto del valore di riferimento (la riga tratteggiata) viene generato un cambiamento di fronte sul segnale OC1X. La forma donda triangolare rappresenta quindi landamento nel tempo del contatore. Si intuisce che cambiando il Elettronica In - settembre 2001

razione di un Glitch che rappresenta un disturbo indesiderato. WATCHDOG Il watchdog un temporizzatore particolare che viene usato nei sistemi a microprocessore come sistema di sicurezza per evitare che il programma vada in stallo e quindi che il sistema si blocchi in una situazione non prevista dal programmatore. In pratica il watchdog interviene e resetta il microcontrollore se non viene resettato tramite listruzione WDR (WatchDog Reset) entro il tempo stabilito dai pin 0, 1 e 2 del registro WDTCR. Il watchdog dei microcontrollori AVR viene temporizzato da un clock interno a 1 MHz, questo ci fa capire che pu funzionare anche in assenza del clock di sistema perch indipendente da esso. Il dispositivo viene programmato attraverso il registro WDTCR tramite lutilizzo dei primi 5 bit; vediamo ora di capirne il funzionamento analizzandoli in maniera dettagliata. I bit 0, 1 e 2, come abbiamo gi accennato, servono per stabilire il tempo che deve trascorrere prima che il watchdog resetti il micro. Questo 75

CORSO PROGRAMMAZIONE AVR

Schema circuitale del watch dog e relativa tabella di prescaler.

WDT Typ. Time-out Typ. Time-out WDP2 WDP1 WDP0 Oscillator cycle (Vcc=3V) (Vcc=5V) 0 0 0 16K cycles 47 ms 15 ms 0 0 1 32K cycles 94 ms 30 ms 0 1 0 64K cycles 0,19 s 60 ms 0 1 1 128K cycles 0,38 s 0,12 s 1 0 0 256K cycles 0,75 s 0,24 s 1 0 1 512K cycles 1,5 s 0,49 s 1 1 0 1024K cycles 3,0 s 0,97 s 1 1 1 2048K cycles 6,0 s 1,9 s

tempo dipende anche dallalimentazione del micro e pu variare da circa 12 ms (WDP0 = 0, WDP1 = 0, WDP2 = 0 e alimentazione Vcc=3V) fino a circa 6 s (WDP0 = 1, WDP1 = 1, WDP2 = 1 e alimentazione Vcc=5V). Il bit 4 (WDTOE = Watch Dog Turn Off Enable) ed il bit 5 (WDE) servono per disabilitare la funzione di watchdog: essendo un sistema di sicurezza, utilizzare un solo bit di abilitazione / disabilitazione sarebbe stato troppo rischioso visto che non si pu sapere come si comporta un programma in avaria . Per evitare, quin-

di, disabilitazioni involontarie, necessario seguire una precisa sequenza di disabilitazione del watchdog: bisogna prima settare (porre ad 1 logico) sia WDTOE che WDE e, successivamente, per i 4 cicli di clock successivi resettare WDE: in questo modo viene disabilitato il watchdog. Osservando lo schema del Watchdog si notano: loscillatore indipendente da 1 MHz, un prescaler e un multiplexer. I tre bit di controllo vanno ad agire proprio sul multiplexer per selezionare le temporizzazioni per il reset.

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 340.000 lire IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

76

settembre 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Lo scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Quarta puntata.

a cura di Matteo Destro

microcontrollori sono dei dispositivi sincroni e quindi per potere funzionare hanno bisogno di un orologio necessario per scandire le operazioni che devono eseguire. Questo orologio viene denominato clock. Naturalmente i vari microcontrollori sono realizzati per potere lavorare sul fronte di salita del clock oppure sul fronte di discesa. Nel caso dellAtmel AT90S8515, per generare il segnale di clock desiderato sufficiente collegare un quarzo, e due condensatori, ai pin di ingresso XTAL1 e XTAL2. Solitamente vengono utilizzati due condensatori da 22 pf. I quarzi che si possono utilizzare per le proprie applicazioni vanno da un Elettronica In - ottobre 2001 73

CORSO PROGRAMMAZIONE AVR

Collegamento del quarzo generatore di clock

minimo di 1 Mhz a un massimo di 8 Mhz. I pin XTAL1 e XTAL2 sono rispettivamente lingresso e luscita di un amplificatore invertente il quale viene usato come oscillatore. E anche possibile pilotare il dispositivo con un clock esterno; in questo caso necessario tenere disconnesso XTAL2 e connettere XTAL1 alloscillatore esterno. INTERFACCIAMENTO DI UNA MEMORIA SRAM ESTERNA Potrebbe essere necessario avere a disposizione un quantitativo maggiore di SRAM e quindi si presenta la necessit di collegare un banco di memoria esterno. Il microcontrollore AT90S8515 prevede questa possibilit e quindi pu essere predisposto per effettuare il collegamento che prevede lutiliz-

zo del PortA e del PortC. La porta A viene utilizzata sia come bus dati a 8 bit sia come parte meno significativa del bus indirizzi a 16 bit. La porta C viene usata per completare la parte pi significativa del bus a 16 bit. Alla porta A va collegato un latch che viene attivato dal pin ALE del microcontrollore (vedi figura a fondo pagina). Inoltre bisogna collegare anche i pin RD (PD7) e WR (PD6) alla memoria esterna per scandire le operazioni di lettura e scrittura in memoria. Si osservi che questi due segnali sono attivi bassi. Per abilitare la memoria esterna dobbiamo settare il bit pi significativo del registro MCUCR. Questo bit viene chiamato SRE. Quando questo pin a livello logico alto allora la memoria esterna attiva e quindi tutti i pin del microcontrollore dedicati allutilizzo della SRAM saranno impostati correttamente. Per capire come il microcontrollore interagisce con la memoria bene analizzare il suo diagramma temporale che, come si vede in figura, non presenta la condizione di Wait State, la quale viene settata dal bit SRW del registro MCUCR. Dal diagramma si capisce che i segnali vengono campionati sul fronte di salita del clock. Oltre al clock che scandisce le varie operazioni necessario tenere in considerazione i pin ALE, WR e RD che differenziano rispettivamente le operazioni di indirizzamento, scrittura e lettura. Quando il segnale ALE passa da valore logico alto a valore logico basso si ha che lindirizzo che va a puntare alla memoria pronto e quindi si ha lindirizzamento della SRAM. Dopodich ci si dovr attendere o unoperazione di lettura in memoria o un operazione di scrittura nella stessa. Se volessi fare una operazione di scrittura in memoria devo portare a

Come interfacciare una memoria SRAM esterna.

74

ottobre 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

ACIS1ACIS0 0 0 0 1 1 0 1 1

Interrupt Mode Comparator Int. on Output Toggle Reserved Comparator Int. on Falling Output Edge Comparator Int. on Rising Output Edge

livello logico basso il mio segnale di WR e quindi sul fronte di salita del clock scriver il dato in memoria (vedi diagramma). Invece se devo leggere, dopo avere indirizzato, porter il segnale di RD a livello logico basso e sul fronte di salita del clock andr a leggere il mio dato. Oltre a questo modo di operare esiste anche quello con la condizione di Wait State, che tra un operazione e laltra di lettura o scrittura, introduce una pausa che dura un ciclo di clock. Dal corrispondente diagramma temporale relativo si nota che dopo loperazione di lettura o scrittura troviamo un periodo di attesa che corrisponde a un ciclo di clock, questo potrebbe essere necessario per evitare di presentare dei dati alla memoria quando questa non ancora pronta a riceverli perch ad esempio non ha ancora finito di eseguire la precedente richiesta.

COMPARATORE ANALOGICO Allinterno dellAT90S8515 trova posto un comparatore analogico. Il funzionamento molto semplice: quando la tensione sul pin positivo del comparatore maggiore della tensione sul pin negativo abbiamo che in uscita viene a trovarsi un livello logico alto. Il comparatore viene programmato attraverso un registro a 8 bit chiamato ACSR (Registro di Stato e di controllo del comparatore analogico). Vediamo in dettaglio la funzione di ogni singolo bit: Bit 7 ACD: questo il bit pi significativo del registro in questione, quando a livello logico alto allora il comparatore disabilitato. Questo bit pu essere settato tutte le volte che il comparatore non deve essere usato riducendo i consumi

Cicli di lettura/scrittura SDRAM esterna senza Wait State

Cicli di lettura/scrittura SDRAM esterna con Wait State

Elettronica In - ottobre 2001

75

CORSO PROGRAMMAZIONE AVR

energetici. Bit 5 ACO: Contiene luscita logica del comparatore. Bit 4 ACI: Questo bit va a livello logico alto quando il comparatore pilota una richiesta di interrupt. Per fare in modo che venga eseguita la routine corrispondente anche necessario che sia settato a uno il bit ACIE e il Bit I del registro di stato SREG. Bit 3 ACIE: Quando a livello logico alto (assieme al bit I del SREG) allora possibile fare richiesta di interrupt attraverso luso del comparatore. Bit 2 ACIC: Questo bit, se a livello logico alto, abilita la possibilit di triggerare il pin ICP del timer a 16 bit. Bit 1, 0 ACIS1, ACIS0: Questi bit servono per generare un segnale di trigger che sia attivo sul fronte di salita, di discesa o a livello. MEMORIA EEPROM Allinizio del corso si era parlato della presenza di una memoria EEPROM interna, vediamo ora di parlarne in dettaglio. Lo spazio di memoria EEPROM di ben 512 Byte e quindi per poterla indirizzare non sufficiente un unico registro a 8 bit. Questo compito viene quindi svolto dal registro EEAR. Precisamente il registro formato da EEARH per la parte pi significativa e da EEARL per quella meno significativa. Va notato che per indirizzare 512 byte di memoria sono sufficienti 9 bit, quindi EEARL sar usato per intero, mentre di EEARH verr utilizzato solo il bit meno significativo. Oltre ai registri per lindirizzamento abbiamo bisogno di un registro per i dati e di un registro di

controllo, rispettivamente chiamati EEDR ed EECR. Nel registro EEDR sar contenuto il valore del dato da scrivere nella EEPROM allindirizzo puntato dal registro EEAR, oppure sar contenuto il dato letto dalla memoria allindirizzo puntato dallo stesso registro. Il registro di controllo della EEPROM usato solo in parte e precisamente i tre bit meno significativi. Per poter scrivere in EEPROM necessario che il bit EEMWE sia a livello logico alto assieme al segnale di strobe generato dal bit EEWE. Se EEMWE a livello logico zero allora non si potr scrivere in memoria. Il segnale EEWE abilita la scrittura in memoria. Quando lindirizzo e il dato sono stati correttamente impostati, si deve portare alto il segnale EEWE per scrivere nella memoria. Ecco la procedura corretta da seguire per scrivere nella EEPROM: - Controllare e attendere finch il Bit EEWE diventa zero. - Scrivere il nuovo indirizzo della EEPROM nei registri EEARL e EEARH - Scrivere il nuovo dato da mettere nella EEPROM nel registro EEDR - Scrivere un livello logico alto nel Bit EEMWE del registro EECR - Scrivere un livello logico alto nel Bit EEWE del registro EECR prima che siano trascorsi quattro cicli di clock, altrimenti EEMWE verr posto a zero dal micro stesso. Il bit EERE il segnale di strobe per la lettura nella memoria. Quando lindirizzo corretto stato impostato sar necessario impostare a uno logico questo bit per abilitare la lettura dalla memoria. Appena EERE andr basso avremo che il dato sar presente nel registro EEDR. Quando EERE settato la CPU attende due cicli di clock.

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 340.000 lire IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

76

ottobre 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Quinta puntata.

a cura di Matteo Destro

ella prima puntata stato introdotto il concetto di programmazione in-system. Per effettuare questo tipo di programmazione viene utilizzata uninterfaccia seriale a 3 fili che, collegata al relativo programmatore, consente di scaricare il programma nella memoria flash del micro stesso. Oltre a svolgere questa funzione, la seriale pu essere utilizzata anche per colloquiare con altri dispositivi oppure per fare interagire tra loro due microcontrollori della famiglia AVR. Da queste considerazioni si capisce che linterfaccia SPI (Serial Peripheral Interface) pu essere usata per connettersi con una miriade di dispositivi elettronici che utilizzano Elettronica In - novembre 2001 73

CORSO PROGRAMMAZIONE AVR

La figura mostra in modo schematico linterfaccia seriale presente allinterno del microcontrollore. questa stessa tecnologia. Allinterno del microcontrollore AT90S8515 integrata una seriale sincrona ad alta velocit che presenta le seguenti caratteristiche : - Trasferimento dati bidirezionale su due distinte linee di comunicazione; - Possibilit di decidere quale dispositivo il Master e quale lo Slave; - Possibilit di trasferire prima il bit meno significativo del dato oppure trasferire prima il bit pi significativo; - Possibilit di programmare quattro diverse velocit di funzionamento della seriale; - Flag che indica il completamento di una trasmissione; - Flag che indica se avvenuta una collisione tra dati. Una collisione avviene quando due o pi dispositivi vogliono accedere contemporaneamente al medesimo bus. La seriale contiene un prescaler programmabile che consente di ottenere un clock adatto al funzionamento della seriale stessa. Ad esempio, con una frequenza di lavoro per la CPU di 8 MHz, avremo che la seriale lavorer con una frequenza massima di 2 MHz fino ad un minimo di 62.5 KHz a seconda di come viene programmato il prescaler. presente, inoltre, un registro di controllo denominato SPI Controller Register necessario per impostare tutti i parametri di funzionamento della seriale e un registro di stato denominato SPI Status Register utilizzato per rilevare lo stato degli unici due Flag presenti. Per ultimo abbiamo un registro dati a 8 bit chiamato semplicemente SPI Data Register. Questo un registro abilitato sia in scrittura che in lettura ed usato per trasferire i dati tra un registro interno alla CPU e il registro di uscita della seriale (SPI Shift Register) e viceversa. Come accennato precedentemente, possibile collegare, attraverso la seriale, due microcontrollori. Il disegno rappresentato in figura mostra questo tipo di collegamento: una delle due CPU sar utilizzata come Master mentre laltra come Slave. Il dispositivo impiegato come master avr il pin del clock SCK configurato come uscita mentre il dispositivo usato come slave user il medesimo pin come ingresso. Scrivendo nel registro dei dati (SPI Data Register) del dispositivo master si d inizio alla procedura di trasferimento del dato dalla CPU master a quella Slave. Per prima cosa il sistema attiva il clock della seriale e contemporaneamente comincia a shiftare novembre 2001 - Elettronica In

Interconnessione tra due CPU AVR tramite la porta seriale.

74

CORSO PROGRAMMAZIONE AVR

Schema a blocchi della sezione di trasmissione dellUART

in uscita il dato da trasmettere. Una volta trasferiti tutti gli otto bit, il dispositivo master disattiver il clock provvedendo a settare il flag di fine trasmissione. I due registri a 8 bit dei dispositivi master e slave possono quindi essere considerati come un unico shift register circolare a 16 bit. Questo significa che quando un dato a 8 bit viene shiftato dal master allo slave, simultaneamente viene shiftato anche un dato dallo slave al master. Questo vuol dire che in un ciclo di trasmissione, i dati presenti nei due registri vengono interscambiati. UART Allinterno dellAT90S8515 trova posto anche una seconda interfaccia seriale denominata UART (Universal Asynchronous Receiver and Transmitter) che molto simile a quella presente sui PC e che consente di effettuare collegamenti asincroni con qualsiasi periferica esterna (tramite lUART non possibile programmare la memoria del micro). LUART presente nel microcontrollore ha le seguenti caratteristiche : - Differenti velocit di trasferimento dati grazie al Baud Generator programmabile; - Alta velocit di trasferimento dati anche a basse frequenze di funzionamento della CPU; - Possibilit di inviare dati a 8 oppure 9 bit; - Sistema di filtraggio del rumore; Elettronica In - novembre 2001

- Sistema di riconoscimento falso bit di Start; - Sistema di riconoscimento dellerrore di trama (Framing Error); - Presenza di tre interrupt che indicano la trasmissione completa, il registro di trasmissione dei dati vuoto, e la ricezione completa; I disegni mostrano, in modo schematico, come sono realizzate le sezioni di trasmissione e ricezione dellinterfaccia UART. In entrambi i casi possiamo notare un blocco funzionale che si occupa di impostare la velocit di comunicazione, questo blocco il Baud Rate Generator; esistono poi un registro di stato e un registro di controllo. Per ultimo notiamo la presenza di un registro dati a 11 bit nel quale vengono caricati il bit di start, il dato a 8 o 9 bit e il bit di stop. Tutti questi registri, tranne lo status register, possono essere sia letti che scritti. Osserviamo in dettaglio i registri di stato e di controllo: il registro di stato dellUART si chiama USR. Per questo registro vengono utilizzati solamente i 4 bit pi significativi che ora ci apprestiamo a descrivere. Bit 7 RXC: Questo bit settato a uno quando il dato ricevuto dallUART stato trasferito nel registro UDR. RXC viene posto a zero leggendo il registro UDR. Bit 6 TXC: Questo bit settato a uno quando un dato pi il suo bit di stop sono stati trasmessi dallUART. Oltre ad essere stato caricato un nuovo 75

CORSO PROGRAMMAZIONE AVR

Schema a blocchi della sezione di ricezione dellUART

dato nel registro UDR. Questo bit viene utilizzato nelle comunicazioni half-duplex. Bit 5 UDRE: Questo bit indica quando lUART pronta per ricevere un nuovo dato da trasmettere. Bit 4 FE: Questo bit settato a uno quando c un errore di Framing. Ad esempio, se il bit di Stop a

livello logico basso, questo considerato un errore perch il bit di Stop solitamente a uno logico. Bit 3 OR: Questo bit indica una situazione di Overrun. Un altro registro presente nellUART il registro di controllo che viene chiamato UCR. I tre bit pi significativi di questo registro servono

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 340.000 lire IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

76

novembre 2001 - Elettronica In

CORSO PROGRAMMAZIONE AVR

Tabella di impostazione del BAUD RATE dellUART presente nei microcontrollori ATMEL.

a generare i tre interrupt relativi alla periferica UART. Gli altri cinque bit, invece sono impostazioni specifiche dellUART: Bit 4 RXEN: Questo bit, se a uno logico, attiva lUART per la ricezione. Bit 3 TXEN: Questo bit, se a uno logico, attiva lUART per la trasmissione. Bit 2 CHR9: Se questo bit settato a uno significa che il dato trasmesso a 9 bit. A questo vanno sommati il bit di stop e il bit di start. Bit 1 RXB8: Serve per memorizzare il bit pi Elettronica In - novembre 2001

significativo del dato ricevuto quando viene settata la lunghezza del dato a 9 bit. Bit 0 TXB8: Serve per memorizzare il bit pi significativo del dato trasmesso quando viene settata la lunghezza del dato a 9 bit. Oltre a questi due registri ne esiste uno per programmare il BAUD RATE della periferica. Il valore da inserire in questo registro a 8 bit va ricavato dalla tabella pubblicata che tiene conto del BAUD RATE da generare (compreso tra un minimo di 2400 bps ed un massimo di 115200 bps) e della frequenza di clock utilizzata; viene inoltre indicata la percentuale di errore possibile. 77

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Sesta puntata.

a cura di Matteo Destro

opo aver visto, nelle puntate precedenti, le risorse interne dei microcontrollori Atmel, in questa puntata iniziamo ad analizzare le principali istruzioni dellAT90S8515. Ogni microcontrollore possiede un set di istruzioni assembler necessarie a programmare lo stesso in modo da rendere disponibili le proprie circuiterie interne per svolgere le operazioni necessarie al sistema in cui deve essere inserito. Un programma scritto in assembler costituito da una serie di dichiarazioni, definite statement, ciascuna delle quali pu rappresentare una serie di informazioni; vi sono poi le etichette (labels), il codice operativo, che rappresenta le Elettronica In - dicembre 2001 / gennaio 2002 75

CORSO PROGRAMMAZIONE AVR

LEGENDA Rd Rr R K k b s A q = Registro destinazione; = Registro sorgente; = Risultato dopo che l istruzione stata eseguita; = Costante; = Indirizzo; = Bit di un registro; = Bit presente nello Status Register; = Indirizzo di una locazione di I/O; = Spostamento per indirizzamento diretto.

Note: Il risultato viene posto allinterno del registro Rd. Esempio : Add r1, r2

Risultato: esegue la somma r2 con r1 e pone il risultato in r1. ADC Somma con riporto Descrizione: somma il contenuto di due registri tenendo conto del Flag di riporto C. Sintassi: ADC Rd,Rr

X,Y,Z = Registri a indirizzamento indiretto; Note: Il risultato viene posto nel registro Rd. Esempio: Add Adc istruzioni che il microcontrollore in grado di eseguire, gli operandi, cio gli elementi (registri o locazioni di memoria) su cui le istruzioni devono agire. Possiamo poi trovare dei commenti, cio delle indicazioni necessarie al programmatore per capire a che cosa serve la porzione di codice commentata. LAT90S8515 possiede un set esteso di istruzioni assembler composto da ben 118 istruzioni. Queste possono essere suddivise in quattro categorie distinte: Istruzioni aritmetico logiche - Istruzioni di salto - Istruzioni di trasferimento dati Istruzioni sui Bit e di Test sui Bit. Non verranno descritte tutte le istruzioni poich alcune sono molto simili tra di loro; spesso le uniche differenze sono relative ai registri ai quali vengono applicate, oppure ai bit del registro che vengono gestiti. ISTRUZIONI ARITMETICO-LOGICHE Possiamo quindi iniziare a descrivere le istruzioni aritmetico logiche presenti nel Set di istruzioni per microcontrollori AT90S8515: ADD Somma senza riporto Descrizione: questa istruzione consente di effettuare la somma di due registri senza tener conto del Flag di riporto C. Sintassi: 76 ADD Rd, Rr r2,r0 r3,r1 ; somma che ; causa un riporto

Risultato: Somma i registri r3 ed r1 tenendo conto del riporto delloperazione precedente. SUB Sottrazione senza riporto Descrizione: questa istruzione effettua la sottrazione tra due registri. Sintassi: SUB Rd,Rr

Note: Il risultato viene posto nel registro Rd. Esempio : Sub r13,r12

Risultato: sottrae il contenuto di r12 dal contenuto del registro r13. SBC Sottrazione con riporto Descrizione: questa istruzione fa la sottrazione fra due registri e tiene conto delleventuale Flag di riporto C. Sintassi: SBC Rd,Rr

Note: Il risultato viene posto nel registro Rd. Esempio : Sub Sbc r2,r0 r3,r1 ; sottrazione che ; causa un riporto

Risultato: esegue una sottrazione tenendo conto del dicembre 2001 / gennaio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

ISTRUZIONI ARITMETICO - LOGICHE ADD AD C SUBRd, SBC Rd, SBCI AND OR COM SBR CBR MUL Rd, Rr R d, R r Rr Rr Rd, Rr Rd, Rr Rd, Rr Rd R d, K R d, K Rd, Rr Somma s en z a r i p o r t o Somma co n r i p o r t o Sottrazione senza riporto Sottrazione con riporto Sottrazione immediata con riporto AND Logico OR Logico Complemento a 1 Setta un bit di un registro Resetta un bit di un registro Moltiplicazione senza segno

riporto generato precedentemente. SBCI Sottrazione immediata con riporto Descrizione: questa istruzione sottrae una costante dal contenuto del registro tenendo conto del riporto. Il risultato viene posto nel registro Rd. Sintassi: SBCI Rd,K

OR Logico Descrizione: questa istruzione esegue l OR logico tra il contenuto dei due registri Rd ed Rr. Sintassi: OR Rd,Rr

Note: Il risultato viene posto nel registro Rd. Esempio: Note: Il risultato viene posto nel registro Rd. Risultato: esegue l OR Bit a Bit tra i due registri. Esempio: Subi Sbci r16,$23; sottrazione che ; causa un riporto r17,$4F COM Complemento a uno Descrizione: questa istruzione esegue il complemento a uno del registro Rd. Sintassi: AND Logico Descrizione: esegue l AND logico tra i registri Rd ed Rr. Sintassi: AND Rd,Rr Risultato: esegue il complemento a uno del registro r4 e setta il Flag C del registro di stato. SBR Setta un Bit in un registro Descrizione: questa istruzione setta il Bit specificato nel registro Rd. 77 Note: questa istruzione va a cambiare il registro di stato, in particolare va a settare il Flag C. Esempio: Com r4 COM Rd Or r15,r16

Risultato: sottrae la costante al registro r17 tenendo conto del precedente riporto.

Note: Il risultato viene posto nel registro Rd. Esempio: And r2,r3

Risultato: esegue l AND Bit a Bit e pone il risultato in r2 Elettronica In - dicembre 2001 / gennaio 2002

CORSO PROGRAMMAZIONE AVR

Registro di Stato SREG. Esempio: Cbr r16,$F0

Risultato: questa istruzione resetta i quattro Bit pi significativi del registro r16. MUL Moltiplicazione senza segno Descrizione: questa istruzione esegue una moltiplicazione tra due registri a 8 Bit e mette il risultato in un registro a 16 Bit senza tener conto del segno. Sintassi: MUL Rd,Rr

Sintassi:

SBR Rd,K

Note: questa istruzione va ad influenzare il Registro di Stato SREG. Esempio: Sbr r16,3

Note: i registri Rd e Rr contengono dei dati senza segno. Il risultato della moltiplicazione viene posto per met nel registro R0 e per met nel registro R1. Se il moltiplicando o il moltiplicatore vengono messi nei registri R0 o R1 si ha che durante loperazione il loro contenuto verr sovrascritto. Esempio: Mul r5,r4 Movw r4,r0

Risultato: questa istruzione va a settare i Bit 0 e 1 del registro r16. CBR Resetta un Bit in un registro Descrizione: questa istruzione va a resettare un Bit allinterno del registro Rd. Sintassi: CBR Rd,K

Risultato: esegue la moltiplicazione senza segno tra il contenuto del registro r5 e r4 e, successivamente, copia il risultato della moltiplicazione, che si trova nei registri r0 ed r1, nei registri r4 r5. Con questa istruzione concludiamo una panoramica sulle istruzioni aritmetiche e logiche e vi diamo appuntamento alla prossima puntata nella quale analizzeremo le istruzioni di salto.

Note: questa istruzione va ad influenzare il

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175,00 euro (338.847 lire) IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

78

dicembre 2001 / gennaio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Settima puntata.

a cura di Matteo Destro

ella scorsa puntata abbiamo introdotto una serie di funzioni dedicate agli ATMEL AVR e relative alle operazioni arimetiche e logiche. Adesso passiamo ad una parte fondamentale di qualsiasi linguaggio di programmazione sia ad alto che a basso livello: la gestione dei salti. Nellesecuzione di un programma, infatti, necessario, per poter effettuare operazioni diverse in funzione di casi diversi, poter eseguire parti del programma non propriamente in ordine sequenziale. Ad esempio se dobbiamo visualizzare su un display una scritta che identifica un tasto premuto necessario poter saltare, in base alla pressione del tasto alla relativa Elettronica In - febbraio 2002 73

CORSO PROGRAMMAZIONE AVR

Legenda : Rd Rr R = Registro destinazione. = Registro sorgente = Risultato dopo che l istruzione stata eseguita K = Costante k = Indirizzo b = Bit di un registro s = Bit presente nello Status Register X,Y,Z = Registri a indirizzamento indiretto A = Indirizzo di una locazione di I/O q = Spostamento per indirizzamento diretto

struzione successiva alla chiamata della Call, in questo modo quando la Subroutine finisce di eseguire le proprie istruzioni si ha che nel Program Counter viene caricato lindirizzo di memoria precedentemente salvato nello Stack Pointer e il programma continua il suo flusso di istruzioni esattamente nel punto in cui lo aveva interrotto. Sintassi: CALL k

Note: Il registro di stato SREG non viene influenzato dall istruzione Call. Esempio : Mov Call . Pippo: Cpi . Ret r16,r0 pippo r16,$42

parte di sorgente che visualizza la scritta appropriata. Vediamo quindi come gestire queste situazioni in assemler. JMP Salto Descrizione: esegue un salto incondizionato a un indirizzo di memoria indicato da un etichetta. Sintassi: JMP k

Risultato: ad ogni chiamata (CALL) il programma esegue le istruzioni presenti dalletichetta Pippo fino allistruzione RET. Trovata questa il controllo torna allistruzione successiva la CALL. RET Ritorno da Subroutine Descrizione: consente di ritornare da una istruzione CALL. L indirizzo di ritorno viene letto nello Stack Pointer. Lo Stack Pointer usa uno schema di pre-incremento durante una istruzione di Ret. Il registro di stato SREG non viene influenzato da questa istruzione. Sintassi: RET

Note: Questa istruzione non va ad influenzare il registro di stato SREG. Esempio : Mov r1,r0 Jmp pluto .. .. pluto: Mov rr3,r2 .

RETI Ritorno da una chiamata di interrupt Risultato: Copia il contenuto del registro r0 nel registro r1 e salta in modo incondizionato alla routine pluto. CALL Chiamata a una Subroutine Descrizione: va a richiamare un sottoprogramma (Subroutine) da eseguire prima di ritornare al normale flusso del programma. Questa istruzione molto utile nel caso si debba usare una serie di istruzioni sempre uguali in molte parti del programma. Infatti si fa una sola copia di queste istruzioni, andando a formare appunto una Subroutine, le quali verranno richiamate quando serve. Quando viene usata una Call si ha che nello Stack Pointer viene salvato l indirizzo di memoria delli74 Descrizione: serve per ritornare al programma principale dopo una chiamata di interrupt. Anche in questo caso l indirizzo di ritorno viene letto dallo Stack Pointer. Il registro di stato non viene automaticamente salvato quando avviene una chiamata di interrupt, inoltre quando si ritorna da una chiamata di interrupt si deve ripristinare il precedente valore del registro di stata SREG. Sintassi: RETI

CP Istruzione di comparazione Descrizione: serve per fare il confronto tra il contenuto del registro Rd e il contenuto del registro Rr. febbraio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

Esempio :

Clr Ldi

r31 r30,$F0

Risultato: viene azzerata la parte pi significativa del registro Z e settata la parte meno significativa con il valore $F0. LD Caricamento indiretto dallo spazio dati in un registro usando l indice Z Descrizione: legge un Byte indirettamente con o senza spiazzamento dallo spazio dati e lo pone in un registro. Le locazioni di memoria riguardanti i dati vengono puntate dal registro Z (16 Bit). L accesso alla memoria limitato a 64 Kbyte. Il registro puntatore Z pu subire un post-incremento o un pre-decremento oppure rimanere invariato. Grazie a queste caratteristiche si ha che il registro Z pu anche essere usato come Stack Pointer e questo vale anche per i registri X e Y. Per i dispositivi che hanno solo 256 Byte di spazio dati si usa solo la parte meno significativa del registro Z. Sintassi: LD Rd,Z LD Rd,Z+ LD Rd,-Z Clr Ldi Ld Ld r31 r30,$60 r0,Z+ r1,Z

Nessun dato contenuto nei registri viene cambiato. Tutti i salti condizionati disponibili vengono utilizzati dopo questa istruzione. Sintassi: Esempio : CP Rd,Rr Cp Brne r4,r19 pippo

Risultato: effettua il confronto tra il contenuto del registro r4 e il contenuto del registro r19 e salta all etichetta pippo se il contenuto dei due registri diverso (BRNE = Branch if Not Equal) Oltre a queste istruzioni appena descritte, sono disponibili altre istruzioni di salto che riportiamo in tabella. Queste vanno a verificare lo stato di uno degli otto Bit che si trovano nello Status Register e agiscono di conseguenza. Introduciamo ora le istruzioni per il trasferimento dei dati e manipolazione dei bit dei registri. MOV Copia un registro

; Post-Incremento ; Pre-Decremento

Esempio :

Risultato: viene azzerata la parte pi significativa del registro Z e settata la parte meno significativa con $60; viene caricato nel registro r0 il valore contenuto nella locazione di memoria $60; incrementato Z di uno e caricato nel registro r1 il valore contenuto nella locazione di memoria $61.

IN Carica un dato dagli I/O in un registro Descrizione: serve per fare una copia di un registro. Il registro sorgente Rr mentre il registro destinazione Rd. In Rd si trover una copia di Rr. Sintassi: MOV Rd,Rr Sintassi: LDI Caricamento immediato Esempio : Descrizione: consente di caricare una costante a 8 Bit allinterno dei registri dal 16 a 31. Sintassi: LDI Rd,K In Cpi Breq r25,$16 r25,4 Exit IN Rd,A Descrizione: questa istruzione carica un dato dallo spazio di I/O ( Porte A,B,C,D, Timers, Registri di configurazione ) e lo pone nel registro Rd.

Risultato: viene caricato un dato dalla porta B nel 75

Elettronica In - febbraio 2002

CORSO PROGRAMMAZIONE AVR

registro Rd che viene confrontato con la costante 4. Salta all etichetta Exit se il contenuto di r25 = 4. PUSH Descrizione: salva il contenuto del registro Rr nello Stack. Lo Stack Pointer viene post-decrementato di 1. Questa istruzione viene utilizzata quando si fanno delle chiamate a delle subroutine. Sintassi: POP Descrizione: carica nel registro Rd il valore prelevato dallo Stack. Lo Stack Pointer viene pre-incrementato di 1 prima di eseguire la POP. Sintassi: POP Rd PUSH Rr

ASR Shift a destra aritmetico Descrizione: sposta tutti i Bit di Rd a destra di una posizione. Il Bit 7 tenuto costante mentre il Bit 0 viene caricato nel Flag C del registro SREG. Questa istruzione divide un dato per due. Sintassi: ASR Rd

SEI Setta Interrupt Globali Descrizione: abilita gli interrupt andando a settare il Flag I del registro SREG. Sintassi: SEI

CLI Disabilita Interrupt globali Descrizione: disabilita gli interrupt. Infatti va ad azzerare il Flag I dello Status Register SREG. Sintassi: CLI

LSL Shift logico a sinistra Descrizione: sposta tutti i Bit del registro Rd a sinistra . Il Bit 0 viene azzerato mentre il Bit 7 viene caricato nel Flag C del registro SREG. Questa istruzione, praticamente, esegue la moltiplicazione per due del dato con e senza segno. Sintassi: LSL Rd Sintassi: LSR Shift logico a destra Esempio: Descrizione: sposta tutti i Bit del registro Rd a destra. Il Bit 7 viene posto a zero mentre il Bit 0 viene caricato nel Flag C. Questa istruzione esegue una divisione per due del dato senza segno. Sintassi: LSR Rd MOV R0,R11 LDI R16,(1<<SE) OUT MCUCR,R16 Sleep Risultato: Abilita la modalit SLEEP e mette MCU in tale modalit. SLEEP

Sleep Descrizione: mette in sleep il microcontrollore e va ad agire sul registro MCUCR. In particolare sul bit 4 detto di Sleep Mode (SM).

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175 Euro IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CDROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

76

febbraio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Ottava puntata.

a cura di Matteo Destro

Per testare le potenzialit del microcontrollore della ATMEL abbiamo pensato di realizzare una demo-board molto semplice dal punto di vista circuitale ma allo stesso tempo sufficiente a introdurre le problematiche di programmazione del micro. I programmi realizzati per pilotare i dispositivi presenti sulla demo-board sono stati scritti prima in linguaggio assembler e poi in un secondo tempo in linguaggio BASIC, sicuramente molto pi facile da comprendere e pi maneggevole nel caso di programmi particolarmente complessi. Questa demo-board prevede la programmazione in-circuit, quindi non necessario

Elettronica In - marzo 2002

73

CORSO PROGRAMMAZIONE AVR

SCHEMA ELETTRICO DEMO-BOARD

rimuovere il microcontrollore dalla scheda tutte le volte che dobbiamo programmarlo. Il software utilizzato per interfacciare il PC alla demo-board lATMEL AVR ISP scaricabile gratuitamente dal 74

sito della ATMEL. Osservando lo schema elettrico si notano un display 7 segmenti, un display LCD, un buzzer, tre pulsanti (di cui uno serve per resettare il micro in caso di stallo), uninterfaccia seriale marzo 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

ELENCO COMPONENTI R1-R2 = 10 KOHM R3 = 220 KOHM R4 = 10 KOHM R5 = 4,7 KOHM R6 = 47 KOHM R7R10 = 10 KOHM R11R18 = 470 OHM R19 = 180 OHM R20 = 4,7 KOHM trimmer R21 = 470 OHM C1 = 470 F 25 V C2 = 100 F 25 V C3C6 = 100 nF multistrato C7C10 = 1 F 25 V C11-C12 = 22 pF ceramico C13 = 100 nF multistrato D1D3 = 1N4007 LD1 = LED ROSSO 5MM U1 = 7805

U2 = AT90S8515 U3 = 74HC244 U4 = MAX232 Q1 = QUARZO 4 MHz T1 = BC547 BZ1 = BUZZER senza el. P1P3 = PULSANTE N.A. DS1 = DIP SWITCH 4 POLI DISPLAY1 = LCD CDL4162 16 caratteri X 2 righe DISPLAY2 = 7 SEG. C.C. Varie: - Zoccolo 8 + 8 pin; - Zoccolo 10 + 10 pin; - Zoccolo 20 + 20 pin; - Connettore SUB-D 9 poli F; - Connettore SUB-D 25 poli M; - Morsetto 2 poli; - Connettore PIN STRIP 16 poli F; - Connettore PIN STRIP 16 poli M;

- Piedino quadrato in gomma (4 pz.); - Cavo parallelo 25 poli M/F; - Cavo seriale 9 poli F/M; - Circuito stampato cod. M049.

per collegare la demoboard a qualsiasi periferica seriale, linterfaccia di programmazione in-circuit (da collegare alla porta parallela del PC), un LED e una sezione di impostazione formata da quattro Elettronica In - marzo 2002

dip-switch. Cominciamo a descrivere linterfacciamento al display LCD 7 segmenti. Quello utilizzato del tipo a catodo comune. Viene collegato al micro, al PORTC, attraverso delle resistenze per 75

CORSO PROGRAMMAZIONE AVR

LA DEMO-BOARD

limitare la corrente assorbita dai led del display. E possibile scrivere un programma che accenda in sequenza i segmenti, oppure che visualizzi sequenze di numeri. Se si vuole qualche cosa di pi interattivo, utilizzando i pulsanti P2 e P3, sempre scrivendo un apposito programma, possibile, ad esempio, eseguire conteggi in avanti oppure allindietro a seconda della pressione dei tasti di controllo. Pi flessibile il Display LCD, che del tipo 16 caratteri su due righe, collegato in parte al PORTA (Bus Dati) in parte al PORTD (controlli). Con questo visualizzatore si possono realizzare molte pi applicazioni, soprattutto se il software viene scritto sfruttando la potenza del linguaggio BASIC. Per gestire il Display necessario utilizzare i segnali di controllo: RS, E ed R/W. Questultimo viene collegato direttamente a massa in quanto vogliamo sempre scrivere e non leggere la memoria del display. RS serve per distinguere tra linvio di unistruzione oppure di un dato mentre E lenable (attivo alto). Oltre a questi tre pin abbiamo un bus dati a 8 bit. Nel nostro caso abbiamo utilizzato tutti gli 8 bit, necessari ad inviare sia le istruzioni sia i dati, ma in caso di necessit si possono utilizzare soltanto i quattro bit pi significativi in modo da avere un bus a soli 4 bit. Questo accorgimento si usa quando si hanno poche uscite 76

del micro a disposizione. Lalimentazione viene portata al pin 4 del Display (+ 5V) mentre con il trimmer R20 si regola il contrasto dello stesso. Nelle prossime puntate, quando presenteremo i listati applicativi, si noter che i programmi scritti in assembler (soprattutto nella gestione del display) risultano piuttosto lunghi, mentre gli stessi programmi scritti in BASIC risulteranno estremamente corti. Passiamo ora a descrivere il Buzzer che viene attivato utilizzando un transistor come interruttore. Il transistor viene pilotato dal PORT D4, quando a livello logico alto T1 ON e quindi chiude il circuito a cui collegato il buzzer che emetter un suono. Oltre al buzzer abbiamo parlato di una seriale per interfacciare lAT90S8515 al mondo esterno. Il collegamento avviene utilizzando il noto MAX232 necessario a convertire le soglie dei valori logici provenienti, ad esempio da PC, ad un valore compatibile con i livelli dellAT90S8515. Il programma di gestione della seriale, in questo caso, verr realizzato solamente in BASIC vista la sua complessit. I pin del micro impegnati in questo collegamento sono il PD1 e il PD0. Il programma di interfaccia prevede di acquisire dei dati dalla porta seriale e di visualizzare il tutto sul Display LCD. Per ultimo notiamo la presenza di quattro dip-switch collegati al PORTB, marzo 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

Traccia lato rame in scala 1:1

precisamente a PB0-PB3. Questi possono servire per selezionare sedici possibili modi di funzionamento in una ipotetica applicazione. Nel nostro caso sono stati utilizzati per selezionare una delle applicazioni scritte per mostrare le funzionalit del circuito. Infatti tutti i programmi scritti sono stati raggruppati in un unico macro-programma e a seconda della combinazione dei dip-switch si andr a selezionare uno di questi programmi. Si osservi che lintegrato U3 serve per programmare il microcontrollore in-system. Si tratta di un semplicissimo buffer tri-state collegato alla porta parallela del PC. Ricordiamo che quando sono atti-

vi questi integrati si comportano come semplici buffer mentre quando i loro piedini di controllo non sono attivi allora le loro uscite si trovano in alta impedenza. Per la programmazione si usano i piedini PB5 PB6 PB7 che corrispondono rispettivamente a MOSI (IN) MISO (OUT) e SCK. La sezione di alimentazione viene realizzata utilizzando un semplicissimo 7805 per generare i + 5V stabilizzati. Il diodo di protezione serve a impedire danni al circuito in caso di errata alimentazione. Vi invitiamo ora alla realizzazione della demoboard cos da essere pronti a seguire, sui prossimi numeri del corso, i listati che verranno presentati.

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175 Euro IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CDROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

Elettronica In - marzo 2002

77

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Nona puntata.

a cura di Matteo Destro

onostante i linguaggi ad alto livello (C, Basic, ecc.) risultino molto pi semplici e di immediato apprendimento, in alcuni casi necessario dialogare a diretto contatto con il microcontrollore. Lunico linguaggio di programmazione che ci consente di agire direttamente sullHardware del microcontrollore (registri, memoria, porte di I/O ) rappresentato dallassembler (o linguaggio macchina) che, tra laltro, consente di sfruttare al meglio il microcontrollore sia dal punto di vista di possibili operazioni che di velocit. Lavorando in assembler, se da una parte abbiamo il miglioramento delle presta-

Elettronica In - aprile 2002

75

CORSO PROGRAMMAZIONE AVR

figura 1 zioni e lo sfruttamento completo della macchina, dallaltra abbiamo un aumento della difficolt nella stesura del codice stesso. In questa puntata vedremo come realizzare un programma in assembler analizzando un semplice listato dimostrativo (visibile nella pagina a lato) utile per semplificare la spiegazione. Innanzitutto necessario disporre del software adeguato: per la programmazione con il linguaggio assembler su piattaforme Windows disponibile, in rete presso il sito della ATMEL (www.atmel.com), il programma WAVRASM. Allo scopo, dal sito Atmel selezionare, in alto a sinistra, la voce PRODUCTS, in seguito AVR 8-BIT RISC, poi SOFTWARE; in questa pagina disponibile il tool ASMPACK.EXE che va installato ed eseguito sul proprio PC. Ultimata questa fase, selezionando sotto Programmi la voce AVR Assembler compare a video la schermata riportata in figura 3. Bisogna ora decidere se scrivere un nuovo programma oppure se aprirne uno gi esistente per approntargli delle modifiche. Nel caso di un nuovo file si aprir semplicemente una finestra di testo vuota, in caso contrario, se si vuole modificare un file esistente, comparir sul monitor una finestra contenente il listato del programma (vedi figura 1) che intendiamo modificare. Un programma scritto in assembler in sostanza un file di testo, pu avere qualsiasi nome ma deve essere caratterizzato dallestensione ASM. Un programma scritto in assembler risulta costituito da una serie di frasi, definite statement (dichiarazioni), ciascuna delle quali pu rappresentare una serie di informazioni. figura 2

76

aprile 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

I vari tipi di statement comprendono: - le etichette (labels); vengono utilizzate, in caso di salti condizionati o incondizionati, per indicare un punto del listato; oppure per dare un nome facilmente memorizzabile a variabili e a costanti; - il codice operativo, rappresenta le istruzioni che il microcontrollore in grado di eseguire; - gli operandi, cio gli elementi (registri e locazioni di memoria) su cui le istruzioni devono andare ad agire; - i commenti, cio delle indicazioni utili al programmatore per capire a che cosa serve la porzione di codice commentata; - le direttive, sono istruzioni (comandi) rivolte al compilatore, ovvero a quel programma che provveder a trasformare il nostro file.ASM (file di testo sorgente) in un file.HEX (file oggetto da inserire nella memoria programma del microcontrollore). Le direttive pi importanti sono: - CSEG: Indica linizio del codice programma; - DEF: Assegna un nome ad un registro; - DSEG: Indica linizio di unarea di dati; - EQU: Assegna un valore ad una etichetta; - ESEG: Indica linizio di uno spazio di memoria di tipo EEPROM; - INCLUDE: Serve per includere un file assembler allinterno di un file assembler. Per capire come scrivere del codice assembler per il microcontrollore AT90S8515 e pi in generale per qualsiasi micro AVR prendiamo in esame la porzione di listato riportata a lato. La prima riga del programma (.include 8515def.inc) serve per informare il compilatore sul dispositivo Hardware utilizzato, in questo caso lAT90S8515. La dicitura 8515def.inc identifica un file nel quale sono contenuti tutti gli indirizzi fisici dei registri, delle porte di I/O, e dei dispositivi Hardware (come il Watch Dog) presenti allinterno dellAT90S8515. Dopo aver selezionato il dispositivo Hardware bisogna definire i vettori di interrupt, gi descritti nella seconda puntata del Corso. I vettori di interrupt per il micro AT90S8515 sono 13, e sono disponibili nelle locazioni di memoria programma che vanno dalla $000 alla $00C. In particolare, quando si alimenta il circuito, oppure dopo un impulso di Reset, il microcontrollore inizia a lavorare eseguendo listruzione che si trova alla locazione $000; in questa locazione dovremo inserire una istruzione di salto incondizionato allinizio del programma. Nel nostro esempio, utilizziamo la direttiva .ORG 0x00 per scrivere nella locazione $000 listruzione rjmp RESET. Si noti Elettronica In - aprile 2002

PROGRAMMA DIMOSTRATIVO
.include 8515def.inc .org 0x00 rjmp RESET ; Chiamo il vettore ; di RESET ; Interrupt di ; overflow del timer TIMER0

.org 0x07

rjmp .CSEG .ORG 0X20 .def .equ

uscita=r18 uscita=0xff

TIMER0: ldi out com andi out ldi out reti RESET: ldi out ldi out r16,high(RAMEND) SPH,r16 r16,low(RAMEND) SPL,r16 r16,0xff DDRD,r16 r18 r18, 0b00010000 PORTD, r18 r17, 0xB9 TCNT0, r17

Il listato pubblicato rappresenta un semplice programma dimostrativo che aiuta a capire le basi e la struttura di un programma scritto in assembler per il microcontrollore Atmel AVR AT90S8515.

77

CORSO PROGRAMMAZIONE AVR

Il programma Windows AVR ASM (WAVRASM) liberamente scaricabile dal sito Atmel alla voce Microcontroller, AVR, Software, Tools. figura 3 che la locazione di memoria a cui si punta definita da una etichetta, ci vuol dire che possiamo posizionare la routine per linterrupt del RESET dove vogliamo in memoria, purch dopo le prime 13 locazioni di memoria (da 0x00 a 0x0C) che servono per identificare appunto le 13 possibili chiamate di interrupt. Nel nostro esempio, supponiamo di utilizzare anche linterrupt del Timer0: il vettore di interrupt di questultimo corrisponde alla locazione $007. Anche in questo caso, dovremo forzare in questa locazione (.org 0x07) una istruzione di salto incondizionato (rjmp TIMER0) ad una routine di risposta allinterrupt. La routine di risposta sar preceduta dalletichetta usata nellistruzione di salto (TIMER0:) e terminer con listruzione RETI. La direttiva .CSEG seguita dalla .ORG informano il compilatore dellinizio del codice vero e proprio del nostro programma e che tale codice sar scritto nella memoria programma del micro partendo dalla locazione $020 (.ORG 0x20). E buona norma iniziare con le routine di risposta allinterrupt. Nel nostro esempio, scriviamo la routine di risposta al Timer0 e la terminiamo con listruzione RETI. Non avendo implementato altre interrupt, riportiamo poi letichetta da cui il micro inizia a processare istruzioni a seguito di un Reset o quando viene alimentato. In pratica, dopo la label (etichetta) RESET: iniziano le istruzioni appartenenti al programma principale (main program). Le prime istruzioni riportate servono per indicare al compilatore la presenza di una SRAM di 512 Byte interna al microcontrollore. Oltre a quelle finora descritte vi sono altre direttive utili nella stesura di un programma come la DSEG e la ESEG. La DSEG informa il compilatore sull inizio di una area dati. Ad esempio: .DSEG ; Inizia larea dati var1: .BYTE 1 ; Riserva un byte ; alla variabile var1 La ESEG definisce linizio dello spazio per la memoria EEPROM. Ad esempio: .ESEG eevar: .DW 0x00ff Quando tutto il codice stato scritto nella finestra del programma WAVRASM necessario creare il file .HEX che deve essere caricato nella memoria del microcontrollore. Per fare questo sufficiente compilare il tutto selezionando ASSEMBLE. Se vi sono errori nel programma sorgente il compilatore generer automaticamente un file di testo con elencati i problemi riscontrati, in caso contrario verr generato un file di testo simile a quello rappresentato in figura 2: lassemblatore crea il file temporaneo .EPP da cui ricava tre distinti file (il .HEX, il .OBJ e il .LST). Il file con estensione .HEX verr caricato nella memoria Flash del microcontrollore utilizzando il programma Atmel AVR ISP (anchesso disponibile sul sito della ATMEL).

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175,00 euro IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CDROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

78

aprile 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Decima puntata.

a cura di Matteo Destro

Dopo aver visto quali sono le basi per poter scrivere un programma in assembler per i microprocessori Atmel AVR vediamo ora come realizzare semplici programmi sfruttando le potenzialit della demoboard. Prima di cominciare con la descrizione del funzionamento del primo listato, facciamo un passo indietro e, per chiarire meglio il significato dellistruzione: .include 8515def.inc, pubblichiamo lintero file di definizioni relativo al microcontrollore Atmel AVR AT90S8515. Detto questo passiamo alla descrizione del primo programma presentato: Buzzer che consente di pilotare luscita PortD.4

Elettronica In - maggio 2002

71

CORSO PROGRAMMAZIONE AVR

;***************************************************************************************** ;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y ;* ;* Number : AV R 0 0 0 ;* File Name :8515def.inc ; * Ti t l e :Register/Bit Definitions for the AT90S8515 ;* Date :99.01.28 ; * Ve r s i o n :1.30 ;* Support telephone :+47 72 88 43 88 (ATMEL Norway) ;* Support fax :+47 72 88 43 99 (ATMEL Norway) ;* Support E-mail :avr@atmel.com ; * Ta r g e t M C U :AT90S8515 ;* ;* DESCRIPTION ;* When including this file in the assembly program file, all I/O register ;* names and I/O register bit names appearing in the data book can be used. ;* In addition, the six registers forming the three data pointers X, Y and ;* Z have been assigned names XL - ZH. Highest RAM address for Internal ;* SRAM is also defined ;* ;* The Register names are represented by their hexadecimal address. ;* ;* The Register Bit names are represented by their bit number (0-7). ;* ;* Please observe the difference in using the bit names with instructions ;* such as sbr/cbr (set/clear bit in register) and sbrs/sbrc ;* (skip if bit in register set/cleared). The following example illustrates ;* this: ;* ;* in r16,PORTB ;read PORTB latch ;* sbr r16,(1<<PB6)+(1<<PB5) ;set PB6 and PB5 (use masks, not bit#) ;* out PORTB,r16 ;output to PORTB ;* ;* in r16,TIFR ; re a d t h e Ti m e r I n t e r r u p t F l a g R eg i s t e r ;* sbrc r 1 6 , TOV 0 ;test the overflow flag (use bit#) ;* rjmp TOV 0 _ i s _ s e t ;jump if set ;* ... ;otherwise do something else ;***************************************************************************************** ;***** Specify Device .device AT90S8515 ;***** I/O Register Definitions .equ SREG =$3f .equ SPH =$3e .equ SPL =$3d .equ GIMSK =$3b .equ GIFR =$3a .equ TIMSK =$39 .equ TIFR =$38 .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ MCUCR TCCR0 TCNT0 OCR0 TCCR1A TCCR1B TCNT1H TCNT1L OCR1AH OCR1AL OCR1BH OCR1BL ICR1H ICR1L WDTCR EEARH EEARL =$35 =$33 =$32 =$31 =$2f =$2e =$2d =$2c =$2b =$2a =$29 =$28 =$25 =$24 =$21 =$1f =$1e

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ

EEDR EECR PORTA DDRA PINA PORTB DDRB PINB PORTC DDRC PINC PORTD DDRD PIND SPDR SPSR SPCR UDR USR UCR UBRR ACSR

=$1d =$1c =$1b =$1a =$19 =$18 =$17 =$16 =$15 =$14 =$13 =$12 =$11 =$10 =$0f =$0e =$0d =$0c =$0b =$0a =$09 =$08

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ

INTF1 INTF0 TOIE1 OCIE1A OCIE1B TICIE1 TOIE0 TOV1 OCF1A OCF1B ICF1 TOV0 SRE SRW SE SM ISC11 ISC10 ISC01 ISC00 CS02 CS01 CS00 COM1A1

=7 =6 =7 =6 =5 =3 =1 =7 =6 =5 =3 =1 =7 =6 =5 =4 =3 =2 =1 =0 =2 =1 =0 =7

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ

COM1A0 COM1B1 COM1B0 PWM11 PWM10 ICNC1 ICES1 CTC1 CS12 CS11 CS10 WDDE WDE WDP2 WDP1 WDP0 EEMWE EEWE EERE PA7 PA6 PA5 PA4 PA3

=6 =5 =4 =1 =0 =7 =6 =3 =2 =1 =0 =4 =3 =2 =1 =0 =2 =1 =0 =7 =6 =5 =4 =3

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ

PA2 PA1 PA0 DDA7 DDA6 DDA5 DDA4 DDA3 DDA2 DDA1 DDA0 PINA7 PINA6 PINA5 PINA4 PINA3 PINA2 PINA1 PINA0 PB7 PB6 PB5 PB4 PB3 PB2 PB1

=2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1

;***** Bit Definitions .equ INT1 .equ INT0

=7 =6

.equ

in modo da fare emettere un suono al Buzzer collegatovi. Per prima cosa necessario impostare i vettori di interrupt, in particolare abbiamo bisogno del vettore di RESET (presente in tutte le applicazioni) 72

e del vettore TIMER0. Il primo vettore si trova allindirizzo 0x00 mentre il secondo allindirizzo 0x07 e ad ognuno di essi corrisponde unistruzione di salto incondizionato alla routine di gestione delmaggio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ

PB0 DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 DDC7 DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0 PINC7 PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0 PIND7 PIND6 PIND5 PIND4

=0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =5 =4

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .def .def .def .def .def .def .equ .equ .equ .equ

PIND3 PIND2 PIND1 PIND0 SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 SPIF WCOL RXC TXC UDRE FE OR RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 ACD ACO ACI ACIE ACIC ACIS1 ACIS0 XL XH YL YH ZL ZH

=3 =2 =1 =0 =7 =6 =5 =4 =3 =2 =1 =0 =7 =6 =7 =6 =5 =4 =3 =7 =6 =5 =4 =3 =2 =1 =0 =7 =5 =4 =3 =2 =1 =0 =r26 =r27 =r28 =r29 =r30 =r31 ;Last On-Chip SRAM Location

Nella puntata precedente abbiamo accennato alla necessit di inserire, in qualsiasi programma, la definizione del tipo di processore utilizzato. In queste pagine pubblichiamo il file completo che definisce tutti i parametri relativi al processore da noi utilizzato: il microcontrollore AT90S8515. Tale file viene fornito unitamente al sistema di sviluppo e viene richiamato dal programma dellutente tramite listruzione: .include 8515def.inc

RAMEND =$25F XRAMEND =$FFFF E2END =$1FF FLASHEND=$FFF

.equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ

INT0addr=$001 INT1addr=$002 ICP1addr=$003 OC1Aaddr=$004 OC1Baddr=$005 OVF1addr=$006 OVF0addr=$007 SPIaddr =$008 URXCaddr=$009 UDREaddr=$00a UTXCaddr=$00b ACIaddr =$00c

;External Interrupt0 Vector Address ;External Interrupt1 Vector Address ;Input Capture1 Interrupt Vector Address ;Output Compare1A Interrupt Vector Address ;Output Compare1B Interrupt Vector Address ;Overflow1 Interrupt Vector Address ;Overflow0 Interrupt Vector Address ;SPI Interrupt Vector Address ;UART Receive Complete Interrupt Vector Address ;UART Data Register Empty Interrupt Vector Address ;UART Transmit Complete Interrupt Vector Address ;Analog Comparator Interrupt Vector Address

linterrupt. Per primo (e questo avviene ad ogni accensione del micro) viene eseguito il vettore di RESET il quale, tra le altre cose, si preoccupa di abilitare i 512 Byte di SRAM disponibili. Questa Elettronica In - maggio 2002

procedura viene eseguita dalle quattro istruzioni che si trovano dopo letichetta RESET. Eseguita questa operazione, si rende necessario abilitare gli interrupt, e questo viene fatto dallistruzione sei. 73

CORSO PROGRAMMAZIONE AVR

FLOW CHART BUZZER

;**************************************** ;* Programma Buzzer - Buzzer.asm ;* 23/09/2001 ;* ;* Questo programma utilizza il timer0 a 8 bit ;* per generare una serie di inpulsi che vengono ;* mandati al buzzer, generando un tono. ;* ;**************************************** .include 8515def.inc ; Chiamo il vettore di RESET .org 0x00 rjmp RESET ; Interrupt di overflow del timer .org 0x07 rjmp TIMER0 .CSEG .ORG 0X20 .def uscita=r18 .equ uscita=0xff TIMER0: ldi r16,0xff out DDRD,r16 com r18 andi r18, 0b00010000 out PORTD, r18 ldi r17, 0xB9 out TCNT0, r17 reti

Una volta abilitati gli interrupt necessario programmare il registro TIMSK in particolare il bit TOEI0 che si occupa dellabilitazione del vettore di Overflow del Timer/Counter0 e di programmare il registro TCCR0 in modo da lavorare sui fronti di salita del segnale. Infine va caricato nel registro TCNT0 un valore di soglia per il conteggio. Dopo questa fase di programmazione si entra in un loop infinito, formato dalle ultime due istruzioni, dove si attende larrivo di un interrupt che mandi in esecuzione la routine TIMER0. Nella routine TIMER0 si abilita la porta D come uscita, si fa il complemento a uno del registro R18, lo si moltiplica Bit a Bit con un valore costante e lo si invia in uscita al PortD.4 pilotando cos il transistor T1. Dopodich e necessario riaggiornare il registro TCNT0 concludendo cos la routine con una istruzione di ritorno da interrupt. Questo provoca lemissione, da parte del buzzer, di un tono acustico. 74

RESET: ldi out ldi out

r16,high(RAMEND) SPH,r16 r16,low(RAMEND) SPL,r16

; Abilito il timer0 e gli interrupt sei ; Abilito gli interrupt ; Queste istruzioni servono per abilitare l interrupt ;di overflow del timer e per settare il prescaler del ;timer0 ldi r17, 0b00000010 out TIMSK, r17 ldi r17, 0b00000011 out TCCR0, r17 ldi r17, 0xB9 out TCNT0, r17 forever: rjmp

forever

maggio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

FLOW CHART LED LAMPEGGIANTE

;****************************************; * Programma Buzzer - Led.asm ;* 23/09/2001 ;* ;* Questo programma che fa lampeggiare il led ;* collegato alla PortB.4 ;* ;**************************************** .include 8515def.inc ; Chiamo il vettore di RESET .org 0x00 rjmp RESET ; Assegno un nome a dei registri .def primo = r18 .def secondo = r19 .def terzo = r20 RESET: ldi out ldi out

r16,high(RAMEND) SPH,r16 r16,low(RAMEND) SPL,r16

; Setto la portab.4 come uscita ldi r16,0x10 out DDRB,r16 ; Mando sulla Portab.4 il valore logico alto (5 V) ; Il quale accende il LED collegato ldi r16,255 out PORTB,r16 rcall Ritardo ; Chiamo ritardo ; Mando sulla Portab.4 il valore logico basso (0 V) ; Il quale spegne il LED collegato ldi r16,0x00 out PORTB,r16 rcall Ritardo Ritardo: ldi primo,25 a: ldi secondo,255 b: ldi terzo,255 c: dec terzo brne c dec secondo brne b dec primo brne a ret forever: rjmp forever

Il secondo programma che ci apprestiamo a descrivere si occupa di fare lampeggiare il diodo Led collegato al PortB.4. Come nel programma precedente necessario inizializzare il vettore di Reset e quindi impostare larea di memoria SRAM di 512 Byte. Una volta impostato il micro si pu passare allesecuzione delle rimanenti istruzioni. Per prima cosa bisogna settare la Porta B come uscita e per fare ci bisogna caricare il giusto valore nel registro DDRB. In questo caso ci limitiamo a abilitare come uscita solo la Porta B.4 e quindi dobbiamo caricare in DDRB il valore esadecimale 0x10. Dopo avere settato la Porta B posso pensare di accendere il LED portando a livello logico alto il pin PortB.4 Per fare ci sufficiente caricare il valore decimale 255 nel registro PORTB. In questo Elettronica In - maggio 2002

75

CORSO PROGRAMMAZIONE AVR

ROUTINE DI RITARDO

modo il LED acceso. Ora chiamiamo una routine di ritardo in modo da tenere acceso il led per un certo periodo di tempo. Una volta terminata la routine di ritardo porteremo a livello logico basso il pin PortB.4 e quindi spegneremo il diodo Led. La procedura la stessa di prima solo che il valore caricato nel registro PORTB zero. Queste procedure vengono ripetute per un numero infinito di volte. La routine di ritardo rispetta il diagramma di flusso presentato a lato. Il funzionamento molto semplice: per comodit si assegnato un nome ai registri utilizzati nella routine, in particolare r18, r19, r20. Ad ognuno di essi si assegnato un valore decimale; si inizia quindi a decrementare una variabile per volta facendo dei test in modo da rilevare quando questa arrivata a zero. La routine in questione esegue 25 * 255 * 255 iterazioni (infatti r18=25, r19=255, r20=255), cio 1625625 decrementi prima di essere terminata. Ci equivale a dire che il tempo necessario per svolgere le suddette iterazione di circa mezzo secondo. Questo, ovviamente dipende dalla frequenza a cui viene fatto funzionare il micro. Nel nostro caso, utilizzando un quarzo da 4 MHz, il tempo impiegato per svolgere il ciclo di ritardo , appunto, di circa mezzo secondo. E importante notare che, la routine di ritardo, deve essere chiamata dopo ogni variazione di stato del led, quindi, dopo ogni accensione ma anche dopo ogni spegnimento del led stesso. In questo modo il led rimarr acceso per mezzo secondo e spento per lo stesso periodo di tempo. Visti questi due semplicissimi programmi, rimandiamo alla prossima puntata per affrontare situazioni pi complesse e funzionali. Vedremo come gestire periferiche tipo display a sette segmenti e il display LCD da due righe montato sulla demoboard. Alla prossima!

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175,00 euro IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CDROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

76

maggio 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Undicesima puntata.

a cura di Matteo Destro

Come accennato il mese scorso, in questa puntata analizziamo due programmi, sempre in assembler, decisamente pi complicati di quelli visti in precedenza. Il primo visualizza sul display sette segmenti i numeri da 0 a 9 e le lettere da A a F, con la possibilit di fare scorrere in avanti o indietro la sequenza di numeri e lettere utilizzando i pulsanti P2 e P3; il secondo programma si occuper della gestione di un display LCD da 2 righe di 16 caratteri ciascuna. Vediamo subito come si comporta il primo programma avvalendoci dellausilio del flow chart e del listato pubblicati. Come al solito il listato inizia con la definizione dei vettori di interrupt e, Elettronica In - giugno 2002 69

CORSO PROGRAMMAZIONE AVR

FLOW CHART GESTIONE DISPLAY 7 SEGMENTI

in questo caso, sufficiente il solo vettore di RESET. Viene inizializzata la memoria SRAM e si imposta la variabile UP a zero. Si noti che allinizio del programma sono stati assegnati dei nomi ad alcuni registri del micro, in questo modo il programma diventa pi leggibile. Dopo le impostazioni iniziali bisogna settare la porta C come uscita e lo si fa nel solito modo, cio caricando nel registro DDRC il valore 0xFF: tutte le otto linee della porta vengono impostate come uscite. Alla prima accensione vogliamo visualizzare sul display il valore zero e per fare questo 70

necessario inviare la giusta codifica sulluscita del portC, in questo caso il valore da caricare nel registro 0x77. A questo punto il micro va a testare i pin di ingresso della porta D in particolare PortD.3 e PortD.2, che corrispondono rispettivamente ai pulsanti P2 e P3. Il micro legge lintera porta D con listruzione in andando poi a verificare se il bit 3 o il bit 2 sono a livello logico basso. Per effettuare la verifica sul bit 3 si utilizza listruzione sbrs la quale verifica se il bit sotto test a livello logico alto, se ci vero salta listruzione successiva andando cos a testare laltro bit corrispondente giugno 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

;**************************************** ;* Programma 7Seg - 7SegUPDOWN.asm ;* 23/09/2001 ;* ;* Questo programma gestisce due pulsanti ;* per pilotare un display a 7 segmenti ;* ;**************************************** .include 8515def.inc ; Assegno un nome ai registri .def UP = r17 .def primo = r20 .def secondo = r21 .def terzo = r22 .org 0x00 rjmp RESET RESET: ldi out ldi out r16,high(RAMEND) SPH,r16 r16,low(RAMEND) SPL,r16

cp breq inc rcall ret uguali1: ldi rcall ret

UP,r18 uguali1 UP visualizza

UP,0x00 visualizza

; Routine per riconoscere se UP = 0 P3: ldi r18,0x00 cp UP,r18 breq uguali2 dec UP rcall visualizza ret uguali2: ldi rcall ret UP,0x0f visualizza

; Carico nella variabile UP Il valore zero esadeciamle ldi UP,0x00

; Routine di visualizzazione dei caratteri, a seconda ; del valore di UP andr a visualizzare i numeri da ; 0 a 9 o le lettere dalla A alla F

; Abilito la porta C come uscita e mando sul display 0 visualizza: ldi r16,0xff out DDRC,r16 ldi r16,0x77 out PORTC,r16 ; Leggo la porta D (pin PD3 e PD2) uno: in r19,PIND ; Verifico se il Bit 3 della porta D settato alto sbrs r19,3 rcall P2 ; Chiamo routine per tasto P2 ; Verifico se il Bit 2 della porta D settato basso sbrc r19,2 rjmp uno rcall P3; Chiamo routine per tasto P3 rjmp uno ; Routine per riconoscere se UP = 15 P2: ldi r18,0x0f a:

b:

ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret

r18,0x00 r18, UP a r16,0x77;0 PORTC,r16 ritardo r18,0x01 r18, UP b r16,0x14;1 PORTC,r16 ritardo r18,0x02 r18, UP c r16,0xB3 PORTC,r16 ritardo

;2

allaltro pulsante, cio il bit 2. Se il bit 3 a livello logico basso viene richiamata la routine per il tasto P2. Listruzione che testa il bit 2 sbrc la quale va a verificare se il bit 2 a livello logico basso, in Elettronica In - giugno 2002

caso affermativo salta listruzione successiva andando a richiamare la routine per il tasto P3, altrimenti salta alletichetta uno entrando cos in un loop infinito, il quale viene interrotto solo dalla 71

CORSO PROGRAMMAZIONE AVR

c:

d:

e:

f:

g:

h:

i:

l:

ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse rjmp ldi out rcall ret ldi cpse

r18,0x03 r18, UP d r16,0xB6 PORTC,r16 ritardo r18,0x04 r18, UP e r16,0xD4 PORTC,r16 ritardo r18,0x05 r18, UP f r16,0xE6 PORTC,r16 ritardo r18,0x06 r18, UP g r16,0xC7 PORTC,r16 ritardo r18,0x07 r18, UP h r16,0x34;7 PORTC,r16 ritardo r18,0x08 r18, UP i r16,0xF7 PORTC,r16 ritardo r18,0x09 r18, UP l r16,0xF4 PORTC,r16 ritardo r18,0x0A r18, UP

;3

;4

;5

;6

;8

;9

rjmp m ldi r16,0xF5 out PORTC,r16 rcall ritardo ret m: ldi r18,0x0B cpse r18, UP rjmp n ldi r16,0xC7 out PORTC,r16 rcall ritardo ret n: ldi r18,0x0C cpse r18, UP rjmp o ldi r16,0x63;C out PORTC,r16 rcall ritardo ret o: ldi r18,0x0D cpse r18, UP rjmp p ldi r16,0x97;D out PORTC,r16 rcall ritardo ret p: ldi r18,0x0E cpse r18, UP rjmp q ldi r16,0xE3 out PORTC,r16 rcall ritardo ret q: ldi r16,0xE1 out PORTC,r16 rcall ritardo ret ; routine di ritardo di circa un secondo ;ritardo: ldi primo,25 aa: ldi secondo,255 bb: ldi terzo,255 cc: dec terzo brne cc dec secondo brne bb dec primo brne aa ret forever: rjmp forever

;A

;B

;E

;F

pressione di P2 o P3. Ora possiamo descrivere la subroutine P2: come si pu intuire questa routine corrisponde alla pressione del tasto P2, il quale serve per incrementare il valore visualizzato sul 72

display 7 segmenti, analogamente la routine P3 fa riferimento al tasto P3 e provvede a decrementare il valore visualizzato sul display. Per prima cosa si carica il valore 15 (0x0F) nel registro r18 e si giugno 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

esegue un confronto con UP, se sono uguali vuol dire che siamo arrivati a 15 con il conteggio e quindi si passa alla routine uguali, in caso contrario si incrementa UP per poi andare a richiamare la routine di visualizzazione dei caratteri denominata visualizza. La routine per P3 identica a quella appena descritta, lunica differenza che la variabile UP viene decrementata. La routine uguali pone a zero la variabile UP mentre la routine uguali2 pone Up a 15. La routine visualizza che come detto prima si occupa di gestire il display 7 segmenti molto semplice, in pratica viene eseguito un confronto tra la variabile UP e il registro r18 che pu contenere i valori da 0 a 9 o le lettere dalla A alla F. Quando trova una corrispondenza tra i due registri visualizza il valore sul display. Per ogni carattere visualizzato viene richiamata una routine di ritardo, questa routine identica a quella utilizzata nel programma LED. Il secondo listato si occupa di gestire il display LCD previsto sulla demoboard: la logica di controllo di un display LCD dispone di una memoria di impostazione dei caratteri denominata CG RAM e di una memoria dati denominata DD RAM. Per i display a due righe la memoria DD RAM allocata agli indirizzi che vanno da 00 a 0F e da 40 a 4F, i caratteri scritti in queste 32 allocazioni di memoria sono quelli che vengono effettivamente visualizzati sul display. Per scrivere dei caratteri sul display bisogna quindi scrivere in queste locazioni i caratteri uno dopo laltro, ad ogni invio di un carattere il cursore viene automaticamente posizionato alla cella successiva. Come tutti i programmi fino ad ora esposti, la sezione iniziale prevede la definizione del vettore di RESET e lassegnazione di un nome simbolico ai registri interni del microcontrollore, in modo da avere un codice pi leggibile. Nella nostra applicazione associamo dei nomi simbolici ai registri di controllo del display. Per informare il display che i dati in arrivo sono dei comandi occorre portare a livello logico basso il suo pin RS tramite il comando cbi che resetta il bit 6 della porta D. Dopodich viene inviato il comando Function Set che setta il display con un bus dati a 8 bit e uninterfaccia a due righe. Una volta inviato il comando necessario richiamare una routine di ritardo, questo perch il display un dispositivo lento rispetto al microcontrollore e quindi bisogna dargli il tempo necessario per acquisire il comando inviatogli. Function Set viene inviato tre volte. Ora bisogna inviare il comando Display Control, impostato nel nostro Elettronica In - giugno 2002

FLOW CHART DISPLAY LCD

caso per accendere il display e visualizzare il cursore, e il comando Entry Mode per specificare la direzione di movimento del cursore; successivamente bisogna pulire il display con il comando Display Clear e di seguito inviare il comando Return Home che muove il cursore sul primo carattere della prima linea. Infine, bisogna comunicare gli indirizzi della CG RAM e della DD RAM. Finita la serie di comandi si riporta a livello logico alto il pin RS mediante listruzione sbi. Ora si possono inviare i caratteri, per, prima bisogna trasmettere lindirizzo di memoria per la DD RAM cos da selezionare la prima riga. Per fare questo si pone a livello logico basso il pin RS del display, si invia sul bus dati lindirizzo di memoria della prima riga, si porta a livello logico alto lenable (E) del display riportandolo subito basso, si richiama la routine di ritardo e infine si riporta a livello logico alto il pin RS. Ora possibile inviare uno a uno tutti 73

CORSO PROGRAMMAZIONE AVR

;**************************************** ;* Programma Display - Dis2x16.asm ;* 23/09/2001 ;* ;* Questo programma gestisce un display ;* 2 righe per 16 caratteri ;* ;**************************************** .include 8515def.inc rjmp RESET ; Assegno dei nomi simbolici ai registri .def Contatore1 = r25 .def Contatore2 = r26 .def Dato = r27 .def Return_Home = r16 .def Entry_Mode = r17 .def Display_Control = r18 .def Shift = r19 .def Function_Set = r20 .def Display_Clear = r21 .def CG_RAM = r22 .def DD_RAM_Riga1= r23 .def DD_RAM_Riga2= r24 RESET: ldi out ldi out r16,HIGH(RAMEND) SPH,r16 r16,LOW(RAMEND) SPL,r16

; Mando al Display il comando Function_Set per ; 3 volte Come indicano le specifiche per la ; programmazione del display out PORTA,Function_Set sbi PORTD,7 cbi PORTD,7 rcall Delay sbi PORTD,7 cbi PORTD,7 rcall Delay sbi PORTD,7 cbi PORTD,7 rcall Delay ; Mando il comando Display_Control, ; Entry_Mode,Display_Clear, Return_Home ; Per questi comandi bisogna vedere la tabella di ; verit del display out PORTA, Display_Control sbi PORTD,7 cbi PORTD,7 rcall Delay out PORTA, Entry_Mode sbi PORTD,7 cbi PORTD,7 rcall Delay out PORTA, Display_Clear sbi PORTD,7 cbi PORTD,7 rcall Delay out PORTA, Return_Home sbi PORTD,7 cbi PORTD,7 rcall Delay ; Invio gli indirizzi della CG_RAM, ; DD_RAM_Riga1 e Riga2 out PORTA, CG_RAM sbi PORTD,7 cbi PORTD,7 rcall Delay out PORTA, DD_RAM_Riga1 sbi PORTD,7 cbi PORTD,7 rcall Delay out PORTA, DD_RAM_Riga2 sbi PORTD,7 cbi PORTD,7 rcall Delay

; Inizializzo Porta A e D come uscite ldi r16, 0xff out DDRD, r16 out DDRA, r16 ; Assegno un valore alle variabili in gioco ldi Function_Set, 0x38 ldi Display_Control, 0x0C ldi Entry_Mode, 0x06 ldi Return_Home, 0x02 ldi Display_Clear, 0x01 ldi CG_RAM, 0x40 ldi DD_RAM_Riga1, 0x80 ldi DD_RAM_Riga2, 0xC0 ldi Contatore1, 0xFF ; Inizializzazione Display cbi PORTD,6 rcall Delay

i caratteri della prima riga. La logica di invio dei caratteri rispecchia il flow-chart. Praticamente viene portato a zero un contatore che discrimina il numero di caratteri della prima linea del display. 74

Quando il contatore a zero scriviamo il primo carattere della prima riga, quando il contatore a uno scriviamo il secondo carattere della riga e cos via. Osservando il codice a partire dalletichetta giugno 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

; Riporto a livello logico alto il piedino RS del Display sbi PORTD,6 ; Invio Caratteri cbi PORTD, 6 out PORTA, DD_RAM_Riga1 sbi PORTD,7 cbi PORTD,7 rcall Delay sbi PORTD, 6 ldi Contatore2, 0x00 ; Comincio a inviare i caratteri uno ad uno fino a che ; non compare la scritta Futura Elettronica dati: cpi Contatore2, 0x00 brne a ldi Dato, 0x20 ; Lettera rcall Invio a: cpi Contatore2, 0x01 brne b ldi Dato, 0x20 ; Lettera rcall Invio b: cpi Contatore2, 0x02 brne c ldi Dato, 0x20 ; Lettera rcall Invio c: cpi Contatore2, 0x03 brne d ldi Dato, 0x20 ; Lettera rcall Invio d: cpi Contatore2, 0x04 brne e ldi Dato, 0x20 ; Lettera rcall Invio e: cpi Contatore2, 0x05 brne f ldi Dato, 0x46 ; Lettera F rcall Invio f: cpi Contatore2, 0x06 brne g ldi Dato, 0x55 ; Lettera U rcall Invio g: cpi Contatore2, 0x07 brne h ldi Dato, 0x54 ; Lettera T rcall Invio h: cpi Contatore2, 0x08 brne i ldi Dato, 0x55 ; Lettera U rcall Invio i: cpi Contatore2, 0x09 l:

m:

n:

o:

p:

q:

brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall ldi cpi brne cbi out sbi cbi rcall sbi ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi ee ldi rcall

l Dato, 0x52 ; Lettera R Invio Contatore2, 0x0A m Dato, 0x41 ; Lettera A Invio Contatore2, 0x0B n Dato, 0x20 ; Lettera Invio Contatore2, 0x0C o Dato, 0x20 ; Lettera Invio Contatore2, 0x0D p Dato, 0x20 ; Lettera Invio Contatore2, 0x0E q Dato, 0x20 ; Lettera Invio Contatore2, 0x0F aa Dato, 0x20 ; Lettera Invio Contatore2, 0x00 Contatore2, 0x00 bb PORTD, 6 PORTA, DD_RAM_Riga2 PORTD,7 PORTD,7 Delay PORTD, 6 Dato,0x20 ; Lettera Invio Contatore2, 0x01 cc Dato, 0x20 ; Lettera Invio Contatore2, 0x02 dd Dato, 0x20 ; Lettera Invio Contatore2, 0x03 Dato, 0x45 Invio ; Lettera E

aa:

bb:

cc:

dd: brne

dati si osserva che viene prima eseguita una comparazione tra il valore della variabile contatore2 e la costante zero. Se risultano diversi si salta alletichetta a dove si trova il secondo carattere Elettronica In - giugno 2002

da scrivere altrimenti si invia il primo carattere, ed cos per tutti i 16 caratteri della prima e della seconda riga. Terminata la prima riga bisogna dire al display di passare sulla seconda: tale operazione 75

CORSO PROGRAMMAZIONE AVR

ee:

ff:

gg:

hh:

ii:

ll:

mm:

nn:

oo:

cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne ldi rcall cpi brne

Contatore2, 0x04 ff Dato, 0x4C ; Lettera L Invio Contatore2, 0x05 gg Dato, 0x45 ; Lettera E Invio Contatore2, 0x06 hh Dato, 0x54 ; Lettera T Invio Contatore2, 0x07 ii Dato, 0x54 ; Lettera T Invio Contatore2, 0x08 ll Dato, 0x52 ; Lettera R Invio Contatore2, 0x09 mm Dato, 0x4F ; Lettera O Invio Contatore2, 0x0A nn Dato, 0x4E ; Lettera N Invio Contatore2, 0x0B oo Dato, 0x49 ; Lettera I Invio Contatore2, 0x0C pp

pp:

qq:

rr:

ldi rcall cpi brne ldi rcall cpi brne ldi rcall ldi out rcall rjmp

Dato, 0x43 ; Lettera C Invio Contatore2, 0x0D qq Dato, 0x41 ; Lettera A Invio Contatore2, 0x0E rr Dato, 0x20 ; Lettera Invio Dato, 0x20 ; Lettera PORTA, Dato Invio dati

; Routine di ritardo. Necessaria perch il micro ; molto pi veloce del display Delay: dec Contatore1 cpi Contatore1,0x00 brne Delay ldi Contatore1,0xff ret ; Routine per inviare i caratteri da visualizzare Invio: out PORTA, Dato sbi PORTD,7 cbi PORTD,7 rcall Delay inc Contatore2 ret forever: rjmp forever

consiste nellinviare lindirizzo di memoria DD RAM della seconda riga utilizzando il metodo prima esposto. A questo punto, i caratteri che andremo ad inviare verranno automaticamente

visualizzati sulla seconda riga. Il codice esposto viene ripetuto infinite volte visualizzando cosi la scritta FUTURA ELETRONICA sulle due righe a disposizione del display.

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175,00 euro IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CDROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

76

giugno 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

CORSO DI PROGRAMMAZIONE MICROCONTROLLORI

-- ATMEL AVR -Scopo di questo Corso quello di presentare i microcontrollori Flash della famiglia ATMEL AVR. Utilizzando una semplice demoboard completa di programmatore in-circuit impareremo ad utilizzare periferiche come display a 7 segmenti, pulsanti, linee seriali, buzzer e display LCD. I listati dimostrativi che andremo via via ad illustrare saranno redatti dapprima nel classico linguaggio Assembler e poi nel pi semplice ed intuitivo Basic. Dodicesima puntata.

a cura di Matteo Destro

icuramente scrivere un programma per microcontrollori utilizzando il linguaggio assembler risulta abbastanza complesso, soprattutto se bisogna pilotare bus di comunicazione oppure collegarsi a dei dispositivi esterni attraverso luso di interfacce seriali (SPI, RS232, ecc). Per ovviare a queste problematiche di programmazione si preferisce, la maggior parte delle volte, utilizzare linguaggi ad alto livello, cio pi vicini al linguaggio delluomo che a quello della macchina, in modo da semplificare notevolmente la stesura di un programma complesso. In questo Corso, giunto ormai al termine, presentiamo una serie di cinque semplici proElettronica In - luglio / agosto 2002 73

CORSO PROGRAMMAZIONE AVR

**************************************** * Programma che fa lampeggiare un Led * Demo1.bas * 14/08/2000 * * Questo programma fa lampeggiare un led * collegato al pin 5 del microcontrollore. Il pin * corrisponde al Portb.4. Il ciclo infinito. * **************************************** Config Portb = Output

**************************************** * Programma Buzzer - Demo2.bas * 14/08/2001 * * Questo programma manda degli impulsi al * Buzzer. **************************************** Dim Pulse As Long Main0: Pulse = 300 Main:

Main: Set Portb.4 Wait 1 Reset Portb.4 Wait 1 Goto Main End End

While Pulse < 100000 Sound Portd.4 , 100 , Pulse Wait 1 Pulse = Pulse + 300 Wend Goto Main0

grammi con lo scopo di far capire le differenze sostanziali tra un linguaggio ad alto livello e lassembler. Vi rimandiamo ad appositi manuali dedicati alla programmazione Basic per acquisire padronanza completa con il linguaggio in questione. Il primo listato si occupa della gestione di un LED collegato alla porta B. Il loop infinito. In questo modo il led si accender e spegner infinite

volte. Dopo aver configurato la porta B a cui risulta collegato il led, sar sufficiente prevedere un ciclo di set/reset del pin 4 della porta B con interposte due uguali routine di ritardo. Il secondo listato (Demo2.bas) consente di pilotare il Buzzer presente sulla nostra Demoboard in modo da fargli emettere un suono. Anche in questo caso il programma molto semplice, si imposta la porta D

***************************************************************************************** * Display - Demo3.bas * 14/08/2000 * * Scrive dei caratteri sul display intelligente a due righe e sedici caratteri * ***************************************************************************************** Main: Cls Wait 3 Locate 1 , 3 Lcd Corso Atmel Wait 1 Lowerline Locate 2 , 2 Lcd Elettronica In Wait 3 Goto Main End

Posiziona il cursore sulla prima riga terzo carattere

Posiziona il cursore sulla seconda riga secondo carattere

74

luglio / agosto 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

**************************************************************************************** * UP-Down Demo4.bas * 14/08/2000 * * Questo programma tramite i pulsanti P2 e P3 permette di visualizzare sul display 7 segmenti dei numeri * o delle lettere. Il valore iniziale sul display Zero. Se premo il pulsante P2 sul display comparir la cifra * successiva (da 0 a 15=F) o delle lettere o dei numeri. Se invece premo il pulsante P3 il display * verr decrementato di una unit. La tabella di verit per il display 7 segmenti la seguente : * ;* a b c d e f g PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 ;* 0 H H H H H H L 0 1 1 1 0 1 1 1 ;* 1 L H H L L L L 0 0 0 1 0 1 0 0 ;* 2 H H L H H L H 1 0 1 1 0 0 1 1 ;* 3 H H H H L L H 1 0 1 1 0 1 1 0 ;* 4 L H H L L H H 1 1 0 1 0 1 0 0 ;* 5 H L H H L H H 1 1 1 0 0 1 1 0 ;* 6 L L H H H H H 1 1 0 0 0 1 1 1 ;* 7 H H H L L L L 0 0 1 1 0 1 0 0 ;* 8 H H H H H H H 1 1 1 1 0 1 1 1 ;* 9 H H H L L H H 1 1 1 1 0 1 0 0 ;* A H H H L H H H 1 1 1 1 0 1 0 1 ;* b L L H H H H H 1 1 0 0 0 1 1 1 ;* C H L L H H H L 0 1 1 0 0 0 1 1 ;* d L H H H H L H 1 0 0 1 0 1 1 1 ;* E H L L H H H H 1 1 1 0 0 0 1 1 ;* F H L L L H H H 1 1 1 0 0 0 0 1 * ***************************************************************************************** Dim Up As Byte Config Portc = Output Config Debounce = 25 Declare Sub Riconoscimento Up = 0 Portc = &B01110111 Wait 1 Main: Debounce Pind.3 , 0 , Pulsante2 , Sub Debounce Pind.2 , 0 , Pulsante3 , Sub Goto Main End Pulsante2: Verifico lo stato del pulsante P2, se premuto salto alla sua subroutine equivalente verifico lo stato del pulsante P3, se premuto salto alla sua subroutine equivalente Loop infinito

Visualizzo il valore zero sul display

Questa routine deve stabilire quale valore ha assunto il contatore Up. Siccome il pulsante P2 serve per incrementare il contatore, devo prima verificare = 15

If Up = 15 Then Up = 0 Call Riconoscimento Else Up = Up + 1 Call Riconoscimento End If Return

Elettronica In - luglio / agosto 2002

75

CORSO PROGRAMMAZIONE AVR

Pulsante3:

Questa routine deve stabilire quale valore ha assunto il contatore Up. Devo verificare non sia = 0 If Up = 0 Then Up = 15 Call Riconoscimento Else Up = Up - 1 Call Riconoscimento End If Return Questa routine serve per riconoscere quale carattere visualizzare 0

Sub Riconoscimento

If Up = 0 Then Portc = &B01110111 Wait 1 Else If Up = 1 Then Portc = &B00010100 Wait 1 Else If Up = 2 Then Portc = &B10110011 Wait 1 Else If Up = 3 Then Portc = &B10110110 Wait 1 Else If Up = 4 Then Portc = &B11010100 Wait 1 Else If Up = 5 Then Portc = &B11100110 Wait 1 Else If Up = 6 Then Portc = &B11000111 Wait 1 Else If Up = 7 Then Portc = &B00110100 Wait 1 Else

If Up = 8 Then Portc = &B11110111 Wait 1 Else If Up = 9 Then Portc = &B11110100 Wait 1 Else If Up = 10 Then Portc = &B11110101 Wait 1 Else If Up = 11 Then Portc = &B11000111 Wait 1 Else If Up = 12 Then Portc = &B01100011 Wait 1 Else If Up = 13 Then Portc = &B10010111 Wait 1 Else If Up = 14 Then Portc = &B11100011 Wait 1 Else If Up = 15 Then Portc = &B11100001 Wait 1 End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End Sub

come uscita e si associa alla variabile Pulse un valore iniziale di 300. Si prevede poi un ciclo While in modo da ripetere pi volte listruzione Sound. Questultima pilota il pin 4 della portaD a cui collegato il buzzer. La sintassi della Sound la seguente: linea di uscita, numero di impulsi da inviare, tempo in cui il pin deve essere tenuto a 76

livello logico basso e alto. Il primo e il secondo parametro sono fissi (Portd.4 e 100), mentre il terzo parametro la variabile Pulse che viene incrementata ad ogni ciclo di While di 300, fino a quando il valore di Pulse inferiore al 100000. Al termine del ciclo While, il programma ricomincia dallinizio associando nuovamente alla variabile Pulse il valoluglio / agosto 2002 - Elettronica In

CORSO PROGRAMMAZIONE AVR

***************************************************************************************** * Comunicazione Seriale - Demo5.bas * 22/09/2000 * Questa applicazione serve per inviare una stringa di caratteri dal microcontrollore al PC attraverso *la porta seriale COM1. Il codice molto semplice quindi non serve fare un flow-chart : * ***************************************************************************************** Main: Open "Comd.1:9600,8,n,1" For Output As #1 Cls Lcd " Comunicazione " Locate 2 , 1 Lcd " Seriale " Wait 1 Print #1 , "Stringa di prova Close #1 Goto Main End

***************************************************************************************** * Comunicazione Seriale - Demo5_PC.bas * 22/09/2000 * Programma lato PC scritto in QBasic che si occupa di ricevere la stringa inviata dal microcontrollore * e di visualizzarla sul monitor del PC * ***************************************************************************************** Start: Open "COM1:9600,N,8,1" For Random As #1 Cls Print "Tentativo di comunicazione seriale" C$ = Input$(16 , #1) Print C$ End

re 300. Il terzo listato (Demo3.bas) controlla il display LCD da 2 linee 16 caratteri implementato sulla Demoboard e visualizza la scritta Corso Atmel Elettronica In. E interessante notare come un linguaggio evoluto semplifichi notevolmente un listato che in assembler (vedi puntate precedenti) avrebbe richiesto parecchie righe di programma. In Elettronica In - luglio / agosto 2002

pratica, in Basic, sono sufficienti due semplici istruzioni per posizionare il cursore (Locate y,x) e per visualizzare qualsiasi scritta sul display (lcd xxxxxx). La prima istruzione CLS, consente di cancellare eventuali scritte visualizzare sul display. Listruzione Locate consente di posizionare il cursore in un punto preciso del display: il primo para77

CORSO PROGRAMMAZIONE AVR

metro il numero della riga dallalto verso il basso, il secondo parametro il numero della colonna da sinistra verso destra. Ad esempio, Locate 1,3 posiziona il cursore sulla prima riga, terza colonna. Listruzione LCD consente di visualizzare sul display, partendo da dove stato posizionato il cursore, quanto riportato tra virgolette dopo listruzione stessa. Poich il display un dispositivo molto pi lento del micro nello svolgere le operazioni indispensabile dopo ogni comando, o in ogni caso prima di inviarne uno successivo, interporre un ritardo variabile da 1 a 3 secondi in funzione del tipo di display. Il quarto listato (Demo4.bas) consente di visualizzare sul display a 7 segmenti della Demoboard un valore da 0 a F, tale valore pu essere aumentato o diminuito agendo su due pulsanti: se viene premuto il pulsate P2 si ha un incremento del valore, al contrario se si preme P3 si ha un decremento del valore visualizzato. Le prime righe del programma servono per le inizializzazioni, si imposta la porta C come uscita, si sceglie il valore in millisecondi del Debounce (antirimbalzo sulla pressione dei pulsanti) e si dichiara la subroutine Riconoscimento. Il listato pu essere scomposto in un main e in tre subroutine fondamentali. Nel main vengono testati continuamente gli stati dei due ingressi a cui sono collegati i due pulsanti: alla pressione di P2 viene eseguita la subroutine Pulsante2, alla pressione di P3 viene eseguita la subroutine Pulsante3. E interessante notare che il valore di Debounce una costante ma deve essere determinato empiricamente in funzione del tipo di pulsante; per la nostra Demoboard il valore ottimale 25, ma utilizzando altri modelli di pulsante tale valore potrebbe dover essere aumentato. La subroutine Pulsante2 serve per incrementare il valore della variabile UP; prima di ci bisogna verificare che UP non abbia gi raggiunto il

valore massimo consentito, ovvero 15. In questultimo caso, alla variabile UP si associa il valore 0. Sia dopo un azzeramento di UP che dopo un incremento, si esegue la subroutine Riconoscimento. La routine Pulsante3 strutturalmente identica alla precedente: la variabile UP viene decrementata oppure caricata con il numero 15 se il suo valore era pari a 0. La subroutine Riconoscimento provvede a visualizzare il numero contenuto nella variabile UP sul display a 7 segmenti. Non essendoci una relazione precisa tra numero e le linee che si collegano al display, il listato prevede 16 check: viene testato il valore di UP con un numero compreso tra 0 e 15, il test con esito positivo causa la visualizzazione della relativa cifra. Il quinto listato proposto (Demo5.bas) consente di inviare una stringa di caratteri dal microcontrollore alla porta seriale di un PC. Per prima cosa bisogna abilitare la porta di comunicazione seriale e questo viene fatto con il comando open, nel quale si seleziona il pin di uscita dal micro, la velocit di trasmissione il numero di bit per i dati, la parit e il numero di bit di stop. Poi si avvisa lutente che sta per avvenire una comunicazione seriale visualizzando sul display la scritta Comunicazione Seriale, infine con il comando print si invia la stringa sulla COM1. Dal lato PC possiamo scrivere un uguale programma, ad esempio in QBASIC, utilizzando il comando Input per leggere la stringa inviata dal microcontrollore. Anche per il programma in QBASIC dovremo aprire una porta seriale COM impostando gli stessi parametri di velocit, bit di dati, parit e bit di stop utilizzati nel Basic del microcontrollore. Nel comando Input dovremo specificare la porta seriale a cui si riferisce, nella demo la COM1 e il numero di caratteri da leggere, sempre nel nostro caso sono 16. Ora, possiamo visualizzare sul monitor quanto inviato dal micro.

DOVE ACQUISTARE LO STARTER KIT STK500


Il sistema di sviluppo originale Atmel per la famiglia di microcontrollori AVR disponibile al prezzo di 175,00 euro IVA compresa. La confezione comprende: la scheda di sviluppo e programmazione; un cavo seriale per il collegamento al PC; due cavi per la programmazione parallela; un cavo per la programmazione in-system; quattro cavi per la connessione della periferica UART; un cavo di alimentazione (lalimentatore non compreso); un campione di microcontrollore AT90S8515; un manuale utente e un CDROM contenente tutta la documentazione tecnica necessaria completa di applicativi e il programma AVR-Studio che consente di editare, assemblare, simulare e debuggare il programma sorgente per poi trasferirlo nella memoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

78

luglio / agosto 2002 - Elettronica In