Corso Atmel Avr

67

Transcript of Corso Atmel Avr

Page 1: Corso Atmel Avr
Page 2: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2001 25

Lo scopo di questo Corso è quellodi presentare i microcontrollori

Flash della famiglia ATMELAVR. 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Prima puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

ono trascorsi ormai 5 anni daquando Elettronica In presentò il

primo Corso di programmazione permicrocontrollori: si trattava del popola-re ST6 della SGS-Thomson. Subitodopo abbiamo realizzato un Corso sullafamiglia Zilog Z8 e ultimamente suiPIC della Microchip. Ora parliamo diAtmel AVR. Tutti i micro elencatiappartengono alla stessa “classe” anchese profondamente diversi tra loro nelleprestazioni. La scaletta utilizzata perpresentare i vari dispositivi non è asso-lutamente casuale; chi ci segue fin dal-l’inizio avrà intuito che la sequenza deiCorsi pubblicati è legata alla matura-zione del lettore in questo campo.

Page 3: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

Instruction Set Computer). Nell’architettura CISC iprogettisti hanno puntato sulla riduzione del nume-ro di istruzioni necessarie ad eseguire il program-ma, progettando istruzioni molto potenti, con losvantaggio di dovere aumentare mediamente ilnumero di cicli macchina necessari per completareun istruzione; in questo caso viene ridotta la fre-quenza di lavoro del sistema per il fatto di dovereintrodurre una fase di interpretazione del codicemacchina tramite microcodice. Invece nelle architetture RISC si punta molto sullaminimizzazione del numero di cicli macchina ren-dendo la maggior parte delle istruzioni eseguibili inun solo ciclo di clock potendo così aumentare lafrequenza di lavoro del sistema. Questo è possibileeliminando la fase di interpretazione grazie allasemplicità delle istruzioni che possono essere deco-dificate ed eseguite direttamente da una sempliceunità di controllo cablata.La semplificazione delle unità di controllo dellemacchine di tipo RISC è particolarmente vantag-giosa per la realizzazione della CPU su un unicochip VLSI. Il risparmio di spazio ottenuto permet-te, a parità di area di silicio, di aumentare notevol-mente il numero di registri interni e/o di integraredirettamente sul chip la memoria cache per sfrutta-re al massimo la velocità del microprocessore. Purtroppo la tecnologia RISC ha anche dei difetti,

26 giugno 2001 - Elettronica In

TIPO PIEDINI I/O FLASH Vcc MIN EEPROM SRAM SPI CLOCK

ATtiny10 8 6 1 KB 2,7 V NO NO NO 0-6 MHzATtiny11 8 6 1 KB 4 V NO NO NO 0-6 MHzATtiny12 8 6 1 KB 4 V 64 B NO NO 0-8 MHzATtiny22 8 5 2 KB 4 V 128 B 128 B NO 0-8 MHzATtiny28 28 11 2 KB 2,7 V NO NO NO 0-4 MHzAT90S1200 20 15 1 KB 2,7 V 64 B NO NO 0-12 MHzAT90S2313 20 15 2 KB 2,7 V 128 B 128 B NO 0-10 MHzAT90S2323 8 3 2 KB 4 V 128 B 128 B NO 0-10 MHzAT90S2333 28 20 2 KB 4 V 128 B 128 B 1 0-8 MHzAT90S2343 8 5 2 KB 4 V 128 B 128 B NO 0-10 MHzAT90S4414 40 32 4 KB 2,7 V 256 B 256 B 1 0-8 MHzAT90S4433 28 20 4 KB 4 V 256 B 128 B 1 0-8 MHzAT90S4434 40 32 4 KB 4 V 256 B 256 B 1 0-8 MHzAT90S8515 40 32 8 KB 2,7 V 512 B 512 B 1 0-8 MHzAT90C8534 48 15 8 KB 3,3 V 512 B 256 B NO 0-15 MHzAT90S8535 40 32 8 KB 4 V 512 B 512 B 1 0-8 MHzATmega161 40 35 16 KB 4 V 512 B 1 KB 1 0-8 MHzATmega603 64 48 64 KB 4 V 2 KB 4 KB 1 0-6 MHzATmega103 64 48 128 KB 4 V 4 KB 4 KB 1 0-6 MHz

MMEEMMOORRIIAA EE PPRREESSTTAAZZIIOONNII

Anche se in modo improprio, possiamo dire cheabbiamo utilizzato le prime pubblicazioni per cer-care di fare capire la struttura base che accomunatutti i microcontrollori. In seguito, abbiamo datoper scontato alcuni concetti di base per focalizzareinvece la nostra attenzione su prestazioni e risorse.Questa premessa per spiegare che a nostro avviso èil momento giusto per imparare ad utilizzare unadelle due famiglie di micro più diffuse in ambitoindustriale: stiamo parlando degli Intel 8051 (ocompatibili) e degli AVR, questi ultimi oggetto diquesto Corso. Come al solito, lo facciamo abbinan-do alla pubblicazione cartacea una scheda hardwa-re, che in seguito chiameremo demoboard, con laquale testare e verificare i vari programmi dimo-strativi. Non solo, daremo al lettore la possibilità discegliere tra due diversi approcci di studio: unprimo, più veloce, basato sulla sola demoboard chefunge anche da programmatore; un secondo, piùcompleto, che vede come protagonista il sistema disviluppo originale Atmel (il nuovissimo STK500) acui abbineremo la demoboard.

L’ARCHITETTURA RISC

La tecnologia RISC consiste nello spostare le mag-giori complessità dell’hardware al software che èl’esatto contrario della tecnologia CISC (Complex

Page 4: Corso Atmel Avr

infatti il numero ridotto di istruzioni comporta cheil software prodotto, a parità di funzioni da espleta-re, occupi più memoria di quello di una macchinaCISC, sia staticamente che dinamicamente. Tutte le macchine RISC impiegano la tecnica delpipeling per aumentare le prestazioni in termini diistruzioni eseguite nell’ unità di tempo.

LA FAMIGLIA AVR AD 8 BIT

In queste pagine trovate l’elenco delle principalirisorse interne della famiglia di microcontrolloriAVR. Ciò che differenzia i vari dispositivi è ilnumero di istruzioni assembler disponibili, la quan-tità di memoria programma, la quantità di memoriaSRAM presente e non ultimo il numero di linee diI/O, oltre alla presenza o meno di periferiche qualiUART, timer, convertitori A/D, eccetera. Ad esem-pio l’ AT90S1200 è un dispositivo che ha un set di89 istruzioni assembler, 1 Kbyte di memoria pro-gramma, 15 linee di I/O, 64 Byte di EEPROM e 32registri di uso generale.Ciò che accomuna invece l’intera famiglia è l’ar-chitettura con cui sono realizzati, il set di istruzio-ni e i vari metodi di indirizzamento della memoriae dei registri.L’ architettura in particolare si basa sul concetto diaccesso veloce ai registri. I registri, come sappia-

mo, sono delle aree di memoria utilizzate percomunicare con le periferiche disponibili all’inter-no del micro quali Contatori, Timer, ConvertitoriA/D e porte di I/O. Alcuni registri possono essereusati come puntatori a indirizzamento indiretto a 16bits per comunicare con della memoria; questi regi-stri a 16 bits sono chiamati registri X,Y,Z.Un’altra caratteristica comune è il modo con cui ilmicro processa le istruzioni che viene denominatoinstruction pipelining (catena di montaggio). Ilpipelining consiste nell’eseguire una istruzione econtemporaneamente andare a fare il fetchdel1’istruzione successiva.

L’ATMEL AT90S8515

Questa breve premessa serve per far capire cheimparando la struttura di un micro AVR qualsiasi,automaticamente si è in grado di lavorare con l’in-tera famiglia. Per questo motivo, abbiamo deciso dibasare l’intero Corso e di conseguenza la demo-board e i vari listati demo su di un solo modello dimicro. La nostra scelta è ovviamente andata versoil tipo più diffuso e cioè sull’AT90S8515.Questo microcontrollore, racchiuso in un case a 40piedini, fornisce un set di 118 istruzioni assembler,8 Kbyte di memoria programma, 512 Byte diEEPROM, 512 Byte di SRAM e 32 linee di I/O.

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2001 27

RRIISSOORRSSEE IINNTTEERRNNEE

TIPO INT. EXT INT. UART 8-bit TIMER 16-bit TIMER PWM A/D CH B.OUT

ATtiny10 4 1 NO 1 NO NO NO NOATtiny11 4 1 NO 1 NO NO NO NOATtiny12 5 1 NO 1 NO NO NO SIATtiny22 2 1 NO 1 NO NO NO NOATtiny28 5 2 NO 1 NO NO NO NOAT90S1200 3 1 NO 1 NO NO NO NOAT90S2313 10 2 1 1 1 1 NO NOAT90S2323 2 1 NO 1 NO NO NO NOAT90S2333 14 2 1 1 1 2 6 SIAT90S2343 2 1 NO 1 NO NO NO NOAT90S4414 11 2 1 1 1 2 NO NOAT90S4433 14 2 1 1 1 2 6 SIAT90S4434 15 2 1 2 1 3 8 NOAT90S8515 11 2 1 1 1 2 NO NOAT90C8534 7 2 NO 1 1 NO 6 NOAT90S8535 15 2 1 2 1 3 8 NOATmega161 20 3 2 2 1 4 8 SIATmega603 16 8 1 2 1 4 8 NOATmega103 16 8 1 2 1 4 8 NO

Page 5: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

Il dispositivo esegue potenti istruzioni in un singo-lo ciclo di clock, quindi è capace di 1 MIPS perMhz (questo in via teorica).Tra le altre caratteristiche segnaliamo la presenzadi 32 registri per operazioni di I/O e 32 registri diuso generale, interrupt interni ed esterni, un UARTprogrammabile per interfacciamenti seriali, unWatch-dog timer programmabile con oscillatoreinterno, una porta seriale SPI, due stati a basso con-sumo selezionabili via software e un Timer /Counter.I due stati a basso consumo sono detti uno idlemode e l’ altro power down mode. Il primo ferma la CPU ma permette alla SRAM, alTimer/Counter, alla porta seriale SPI e ai sistemi diinterrupt di continuare a funzionare, mentre nelsecondo modo vengono salvati i contenuti dei regi-stri e viene “congelato” l’oscillatore, tutte le altrefunzioni del chip vengono disabilitate finché non si

interviene con un interrupt esterno o resettando laCPU. Il micro AT90S8515 è disponibile in conteni-tore a 40 piedini, vediamo di descriverli uno aduno.

DESCRIZIONE DEI PIN

Vcc - Piedino di alimentazione positiva.GND - Massa di alimentazione.

Port A (PA7…PA0) - E’ una porta di I/O bidire-zionale. Tutti i piedini della porta hanno delle resi-stenze interne di pull-up. Il buffer di uscita è ingrado di fornire fino a 20 mA di corrente sufficien-te per pilotare un display a Led. I piedini sono nellostato di tri-stated quando una condizione di resetdiventa attiva, oppure quando il clock non è attivo.Questa porta è usata come multiplexer di ingresso /uscita per dati e indirizzi quando viene collegata

28 giugno 2001 - Elettronica In

Page 6: Corso Atmel Avr

porta è utilizzata come bus indirizzi in uscita versola SRAM.

Port D (PD7…PD0) - E’ una porta di I/O bidire-zionale. Tutti i pin della porta hanno delle resisten-ze interne di pull-up. Il buffer di uscita è in gradodi fornire fino a 20 mA di corrente. I pin sono nellostato di tri-stated quando una condizione di resetdiventa attiva, oppure quando il clock non è attivo.

RESET (attivo basso) - Il pin di reset è un ingres-so. Viene attivato da un livello logico basso il qualedeve avere un’opportuna durata. Solitamente iltempo 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 Quarzoda 4 o 8 Mhz. Oltre al quarzo vanno connessi dueopportuni condensatori (vedi figura).

flash. Tale tipo di memoria può essere programma-ta In-system, cioè il micro viene lasciato sul circui-to in cui deve lavorare e con un opportuno collega-mento al PC si programma il micro secondo le pro-prie esigenze. La programmazione In-System evital’inconveniente di dover continuamente estrarre ilmicro dallo zoccolo per inserirlo nell’ opportunoprogrammatore, in questo modo si evita anche didanneggiare il micro, ad esempio stortando o addi-rittura rompendo un piedino durante le continuemanovre di inserzione e estrazione del componen-te. Se vogliamo, l’ unico inconveniente è la neces-sita di dover realizzare un collegamento tra il cir-cuito in progettazione e il PC. La nostra demoboardè stata appositamente progettata per supportare laprogrammazione in-system. Appuntamento alla prossima puntata in cui inizie-remo ad esaminare la struttura e il funzionamentodella memoria interna e dei principali registri.

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2001 29

una SRAM esterna.

Port B (PB7…PB0) - E’ una porta di I/O bidire-zionale. Tutti i piedini della porta hanno delle resi-stenze interne di pull-up. Il buffer di uscita della èin grado di fornire fino a 20 mA di corrente. I pindella sono nello stato di tri-stated quando una con-dizione di reset diventa attiva, oppure quando ilclock non è attivo.

Port C (PC7…PC0) - E’ una porta di I/O bidire-zionale. Tutti i pin della porta hanno delle resisten-ze interne di pull-up. Il buffer di uscita è in gradodi fornire fino a 20 mA di corrente. I pin sono nellostato di tri-stated quando una condizione di resetdiventa 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 neidettagli nella puntata dedicata al Timer).

AC1B - E’ un pin di uscita per la funzione di Timer/ Counter1 CompareB. (Descriveremo il pin neidettagli nella puntata dedicata al Timer1).

ALE - E’ l’ abbreviazione di Address Latch Enableed è usato quando della memoria esterna viene con-nessa al microcontrollore. Praticamente il pin gene-ra un impulso di riferimento che viene utilizzatoper iniziare un collegamento tra il microcontrolloree la memoria.

LA PROGRAMMAZIONE IN-SYSTEM

Si può notare che il microcontrollore dispone diuna grande quantità di memoria programma, nelnostro caso disponiamo di ben 8 Kbyte di memoria

Page 7: Corso Atmel Avr
Page 8: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - luglio/agosto 2001 73

Lo scopo di questo Corso è quellodi presentare i microcontrollori

Flash della famiglia ATMELAVR. 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Seconda puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

ella prima puntata abbiamo elen-cato a grandi linee le prestazioni e

le risorse dei dispositivi che compongo-no la famiglia Atmel AVR 8 bit; deci-dendo poi di soffermare la nostra atten-zione sull’AT90S8515. Questo micro-controllore dispone di una grande quan-tità di memoria programma: ben 8Kbyte di Memoria Flash. Oltre allamemoria programma ritroviamo i 32registri per uso generale che vanno dal-l’indirizzo di memoria $0000 a $001F, i64 registri di I/O che vanno dall’indiriz-zo $0020 a $005F, la memoria SRAMinterna (512 Byte) che va dall’indirizzo$0060 all’indirizzo $025F e, infine,abbiamo spazio per indirizzare una

Page 9: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

memoria programma. Con una descrizione elemen-tare possiamo dire che la CPU legge l’opcode dellaprima istruzione in memoria, lo interpreta trasfor-mandolo in un comando e lo esegue; quindi ripetelo stesso processo sull’opcode disponibile nel bytesuccessivo di memoria programma e così via. Inrealtà questa sequenzialità è affidata al ProgramCounter che per definizione contiene l’indirizzodel byte di memoria programma che contiene l’op-code della prossima istruzione che la CPU deveprocessare. Una macchina a stati così congegnatanon consente però di gestire eventi in tempo realee, per questo motivo, sono stati “inventati” gliinterrupt. In pratica le periferiche interne sullabase di particolari eventi interni od esterni possonogenerare un’interruzione al normale ciclo di pro-gramma. Nella pratica ciò consiste nel forzare nelProgram Counter l’indirizzo di una zona di memo-ria definita (vettore di interrupt). Quindi ad esem-pio, abilitando l’interrupt della periferica UART,otterremo che in corrispondenza con il terminedella ricezione dei dati il micro andrà ad eseguirel’istruzione contenuta nella locazione $009 (vetto-

74 luglio/agosto 2001 - Elettronica In

memoria SRAM esterna per un totale di 64 Kbyte(indirizzi da $0260 a $FFFF). Nel box riportato in questa pagina è illustrato loschema a blocchi interno dell’AT90S8515. Al cen-tro dello schema troviamo l’unità logico aritmetical’ALU (Aritmetic Logic Unit) che unitamente alblocco dei registri forma il “core” del micro. Il coremediante un Data Bus ad 8 bit comunica con tuttele risorse implementate: innanzitutto con i registridi controllo che, visti apparentemente coma unaparticolare area di memoria, formano in realtà delleinterfacce tra il programma e le periferiche imple-mentate. Proseguendo nell’analisi troviamo la Interrupt Unitovvero un dispositivo che provvede a gestire ed asmistare le varie comunicazioni di interruzione chele periferiche possono inviare alla CPU.

CONCETTO DI INTERRUPT

Vedremo in seguito che la CPU altro non fa cheleggere ed eseguire in sequenza, rigorosamenteuna dopo l’altra, le istruzioni contenute nella

Schema a blocchi del microcontrollore

AT90S8515.

Page 10: Corso Atmel Avr

re di interrupt della ricezione UART). Qui possia-mo inserire una serie di istruzioni dedicate a questoevento: ad esempio, possiamo leggere il valore chel’UART ha ricevuto e scriverlo in una variabile;queste operazioni vengono svolte da una subrouti-ne che prende il nome di routine di risposta all’in-terrupt. La routine terminerà con una istruzioneche farà l’operazione opposta rispetto all’interruptcioè forzerà nel Program Counter l’istruzione suc-cessiva all’ultima eseguita prima dell’interrupt.L’AT90S8515 dispone di 13 vettori di interrupt.Torniamo ora allo schema a blocchi interno evediamo che le altre periferiche disponibili sono laSPI Unit, interfaccia seriale sincrona a 3 fili ingrado di operare in modalità Master o Slave; laSerial UART (Universal Asynchronous Receiverand Transmitter); un 8 bit Timer / Counter e un 16bit Timer / Counter; un Watchdog Timer; un com-paratore analogico e 32 linee di ingresso / uscitacon le quali il dispositivo scambia dati a livelloTTL con il mondo esterno.Per comunicare con le varie periferiche sopra elen-cate sono disponibili una serie di registri definiti

secondo la tabella pubblicata a pagina 77 che pren-dono il nome di I/O register; in questa tabella tro-viamo elencato l’indirizzo di memoria in cui sonoresi disponibili e la sigla mnemonica che li identi-fica.

MAPPA DI MEMORIA

Come ogni microcontrollore anche l’AT90S8515dispone internamente di due specifiche aree dimemoria: la Program Memory e la DataMemory.La Program Memory, memoria programma, contie-ne il programma ovvero l’opcode delle istruzioniche la CPU dovrà eseguire una dopo l’altra quandoil micro viene alimentato. La memoria programmaè di tipo FLASH e può essere scritta e cancellataper ben 1000 volte. La sua capacità è di 4K x 16locazioni il cui indirizzo va da $000 a $FFF. La Data Memory può essere scomposta in due partisignificative: una contenente i dati e una destinataai registri. Vedremo che lo svolgimento di un pro-gramma richiede l’utilizzo oltre che di costanti

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - luglio/agosto 2001 75

Dalla figura si nota che lelocazioni di memoria chevanno da $0000 a $001F

individuano i registri di usogenerale; mentre le locazio-ni da $0020 a $005K contengono i registri di I/O.Dalla locazione $0060 fino a $025F troviamo la

SRAM interna al microcontrollore, mentre dall’in-dirizzo $0260 fino a $FFFF abbiamo dello spazio

indirizzabile per connettere al micro della memoria SRAM esterna.

Ad ogni registro è assegnato un indiriz-zo univoco, in questo modo si è mappa-

ta la memoria dall’indirizzo $00 all’indirizzo $1F individuando 32 locazio-ni da usare come spazio dati. I registri

che vanno dalla locazione $1A allalocazione $1F possono essere combi-nati due a due per ottenere registri a

16 bit, indicati con i nomi di registri X, Y, Z.

Page 11: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRanche di variabili. Con quest’ultimo termine indi-chiamo tutti i parametri numerici che possonovariare durante l’esecuzione di un programma. Ilnostro micro dispone di 512 locazioni interne dimemoria in cui è possibile memorizzare dellevariabili; tali locazioni sono contraddistinte da pre-cisi indirizzi e vanno da $0060 a $025F.Osservando la mappa di memoria dati notiamo lelocazioni da $0260 a $FFFF sono indicati comeExternal RAM; ciò significa che la strutturahardware e le risorse software (capacità di indiriz-zamento) dell’AT90S8515 consentono di collegareesternamente una memoria SRAM da 64 Kbyte(massimi). Le locazioni da $0000 a $005F contengono invecei registri che come abbiamo visto prima sono dellelocazioni utilizzate per comunicare con le periferi-che o utili al lavoro della ALU.In particolare i registri il cui indirizzo va da $0000a $0001F vengono denominati General PurposeWorking Register: sono i registri di lavoro, quel-li da utilizzare per svolgere operazioni matemati-che o per “puntare” a determinate locazioni; vedre-mo meglio tali registri durante l’analisi del set diistruzioni. In ogni caso occorre ricordare che seidei trentadue registri di uso generale possono esse-re utilizzati come puntatori a indirizzamento indi-retto a 16 bits per lavorare con la memoria. Questiregistri 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’ indi-rizzo $00 all’ indirizzo $1F individuando 32 loca-zioni da usare come spazio dati. L’ALU ad alte pre-stazioni dell’AVR comunica con tutti e 32 i registridi uso generale, ed è in grado, in un unico ciclo diclock, di eseguire operazioni tra due registri.Le locazioni da $0060 a $005F contengono invecei registri di I/O (vedi tabella a lato); si tratta di 64locazioni di memoria attraverso le quali è possibileimpartire ordini, ovvero inviare comandi, alle varieperiferiche e riceverli. Descriveremo meglio ilsignificato di ogni registro di I/O durante l’analisidella periferica a cui sono destinati. Per ora ci limi-tiamo a dire che le locazioni di I/O, ovvero la partedi memoria che contiene i registri di I/O, sonoaccessibili attraverso le istruzioni di IN e OUT lequali trasferiscono i dati tra i 32 registri di usogenerale e lo spazio di I/O.

LA MEMORIA EEPROM

La SRAM interna non è l’unica area disponibileper la memorizzazione dei dati, sono infatti imple-

mentate altre 512 locazioni da 8 bit in cui scriveree leggere dei dati: si tratta della memoriaEEPROM. Questa area di memoria può essere con-siderata come una RAM con la differenza che i datiinseriti vengono trattenuti anche in assenza di ali-mentazione. Per scrivere o leggere dati in EEPROM è perònecessario utilizzare tre specifici registri. Questamemoria consente un massimo di 100000 cicli discrittura / lettura.

IL REGISTRO DI STATO

Questo registro serve per controllare il verificarsi diparticolari eventi dovuti all’esecuzione di alcuneistruzioni, tipo quelle logiche o matematiche. OgniBit di questo registro ha una particolare funzione.

Bit 7 - I – Global Interrupt EnableQuesto bit va settato a valore logico alto (cioè 1)per abilitare l’utilizzo degli interrupt. Questo bitviene posto a zero dall’hardware dopo che c’è statauna richiesta di interrupt, mentre viene settato dal-l’istruzione RETI al termine di una routine diinterrupt.

Bit 6 – T – Bit Copy StorageLe istruzioni di copia dei bit (BLD bit letto e BSTbit immagazzinato ) usano il bit T come sorgente edestinazione nelle operazioni che vengono effettua-te sui singoli bit di un registro. Un bit di un registropuò essere copiato nel bit T dall’istruzione BSTmentre il bit T può essere copiato in un altro regi-stro attraverso l’ istruzione BLD.

Bit 5 – H – Half Carry FlagQuesto bit indica che un’operazione aritmetica hagenerato un riporto oppure un prestito.

Bit 4 – S – Sign Bit Il bit S è dato da un OR esclusivo tra il flag nega-tivo N e il complemento a due del flag V. Indica ilsegno del dato dopo avere eseguito un’operazionearitmetica.

Bit 3 – V – Flag di OverflowIn questo bit è contenuto il risultato di overflow edè in complemento a due. Letteralmente tradottooverflow significa traboccamento, ed è una condi-zione nella quale un’operazione aritmetica fornisceun risultato di grandezza superiore alla massimache un registro o una locazione di memoria puòcontenere.

76 luglio/agosto 2001 - Elettronica In

Page 12: Corso Atmel Avr

Bit 2 – N – Negative FlagBit 1 – Z – Zero FlagBit 0 – C – Carry Flag

Indicano al termine di un'operazione matematica o

logica rispettivamente se il risultato è negativo, seil risultato è pari a zero, se l’operazione ha datoluogo oltre che al risultato anche ad un riporto. LoStatus Register non viene automaticamente salvatoquando si richiama una routine di interrupt.

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - luglio/agosto 2001 77

Page 13: Corso Atmel Avr
Page 14: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - settembre 2001 71

Lo scopo di questo Corso è quellodi presentare i microcontrollori

Flash della famiglia ATMELAVR. 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Terza puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

l microcontrollore AT90S8515dispone di quattro porte di I/O a 8

bit classificate come portA, portB,portC e portD. Le porte di I/O sononecessarie al micro per potere collo-quiare con il mondo esterno, ad esem-pio se si volesse collegare un converti-tore Analogico Digitale è necessarioche il micro disponga di alcuni pin perpotere effettuare il collegamento aldispositivo in questione. Ognuna diqueste porte di I/O è formata da vettoridi 8 bit ciascuna, e alcune di esse sono"programmabili". Con questo termine siintende che particolari pin della portapossono essere usati per scopi specifici,ad esempio il portB dispone di una

Page 15: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRinterfaccia seriale ( SPI ) a quattro fili. Se il microviene programmato in modo corretto si ha che lalogica interna provvederà a utilizzare i suddetti pindella porta di I/O per eseguire un interfacciamentoseriale a 4 fili con un’altra periferica che usa lostesso protocollo di comunicazione. I restanti 4 bitdella porta di I/O possono essere usati per qualsia-si altro scopo. Ogni porta di I/O viene pilotata attra-verso l'utilizzo di tre registri che sono chiamatiData Register, Data Direction Register e InputPins Address. Per utilizzare la portA, come per le altre, vengonoassegnate tre locazioni di memoria di I/O, una allo-cazione per ogni registro. Ad ogni allocazione dimemoria viene assegnato un nome mnemonico. Ilregistro dei dati viene chiamato PORTA (indirizzoesadecimale 3BH), il registro che indica la direzio-ne del dato, in o out, viene chiamato DDRA (indi-rizzo 3AH) mentre il registro Input Pins Addressviene chiamato PINA (indirizzo 39H). Questi nomi(PORTA, DDRA e PINA) vengono usati quando si

programma in assembler, infatti se si vuole scrive-re nel registro DDRA sarà sufficiente utilizzare leistruzioni:

LDI r16 , 0xffOUT DDRA, r16

che assegnano al registro r16 il valore esadecimaleFF e lo si trasferiscono al registro DDRA.In questo modo è stata impostata la portA come

72 settembre 2001 - Elettronica In

INDIRIZZI ESADECIMALIDELLE PORTE I/O

PORT DDR PINPORTA $H3B $H3A $H39PORTB $H38 $H37 $H36PORTC $H35 $H34 $H33PORTD $H32 $H31 $H30

Schema elettrico di un pin del portA.

Page 16: Corso Atmel Avr

porta di uscita. In definitiva: il registro PORTAserve per mandare in uscita dei dati, il registroPINA serve per acquisirli mentre il registro DDRAserve per indicare la direzione del dato, o meglio ladirezione che ogni singolo bit della porta può assu-mere. Lo schema elettrico di un singolo bit dellaportA è visualizzato nel box presente in questepagine. Per quanto riguarda il portB abbiamo cheil numero di registri è lo stesso solo che cambia illoro indirizzamento all'interno della memoria diI/O (vedi tabella). I registri vengono utilizzati alivello di assembler nello stesso modo del portA,però la differenza sta nel fatto che alcuni Bit pos-sono essere utilizzati per scopi particolari.Analizzando la tabella pubblicata osserviamo,come accennato in precedenza, le funzioni che sipossono assegnare al portB.

Va osservato che in questo caso lo schema di ogniBit della porta è diverso, cioè lo schema circuitaleper il Pin0 della portB sarà diverso dallo schemacircuitale del Pin1 e così via proprio per le caratte-ristiche diverse dei vari pin. Per rendersi conto diciò è sufficiente andare a vedere il Data-Sheet. IlportC è identico al portA, invece il portD haanch’esso dei pin programmabili per scopi partico-lari legati all’utilizzo dell’UART, di memorie einterrupt esterni.

CONTATORI

All'interno del micro AT90S8515 troviamo integra-ti due contatori, uno a 8 bit e l'altro a 16 bit. Inrealtà la logica permette di impostare il sistema siacome contatore che come temporizzatore. Ciò

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - settembre 2001 73

PORT BPort Pin Alternate Functions

PB0 T0 (Timer/Counter 0 external input)PB1 T1 (Timer/Counter 1 external input)PB2 AIN0 (Analog comparator pos input)PB3 AIN1 (Analog comparator neg input)PB4 /SS (SPI Slave Select input)PB5 MOSI (SPI Bus Master Out/Slave In)PB6 MISO (SPI Bus Master In/Slave Out)PB7 SCK (SPI Bus Serial Clock)

PORT D

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

Schema a blocchi dei contatori ad 8 e 16 bit.

Page 17: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

interrupt del contatore); oppure può essere usatocome temporizzatore ed è quindi in grado di con-tare degli impulsi di clock del sistema e di dare unsegnale di interrupt dopo un predeterminato nume-ro di impulsi di clock.Ogni contatore può usufruire di una logica internache fa da PRESCALER, cioè divisore di fre-quenza. Circuitalmente si presenta come mostratoin figura (Schema a blocchi dei contatori ad 8 e 16bit). Nel circuito si notano il prescaler e due mul-tiplexer necessari per portare il segnale o al conta-tore a 8 bit (TCK0) oppure al contatore a 16 bit(TCK1). Entrambi i multiplexer sono programma-bili usando i tre bit CS00, CS01 e CS02. La tabel-la a lato mostra la corrispondenza tra il i valorilogici dei tre bit e il tipo di segnale applicato al con-tatore: si può selezionare il clock interno, processa-to o non processato dal prescaler, oppure un segna-le esterno presente sul piedino T0. Sul segnale T0si può scegliere se essere sensibili sul fronte di sali-ta oppure sul fronte di discesa del segnale. La tabel-la pubblicata è valida per il contatore a 8 Bit. Per ilcontatore a 16 bit, è identica, cambiano solo i pin diselezione (CS00, CS01 e CS02 diventano CS10,

e il valore del conteggio viene memorizzato nelregistro TCNT0. Analizzando lo schema circuitaledel contatore notiamo i due registri a 8 bit TIMSKe TIFR; questi registri servono per gestire gli even-ti di interrupt del contatore. Per quanto riguarda ilcontatore a 8 bit viene utilizzato il Bit1 del registroTIMSK. Quando questo è a livello logico alto,insieme al bit I dello Status Register, abbiamo chel’interrupt di overflow del contatore è stato abili-tato e di conseguenza se ci sarà “traboccamento”da parte del contatore, verrà eseguita la corrispon-

74 settembre 2001 - Elettronica In

significa che, se il componente è settato come con-tatore, allora è in grado di accettare degli impulsiesterni e di interrompere il programma principaledopo un certo numero di impulsi stabiliti dal pro-grammatore (praticamente c’è stata una richiesta di

CS11 e CS12). Questi bit di selezione vengonomemorizzati dal programmatore all’interno di unregistro a 8 bit di cui si usano i tre bit meno signi-ficativi, il registro si chiama TCCR0. E’ beneosservare che il Contatore a 8 bit è un up-counter

Impostazione del prescaler del contatore ad 8 bit

CS02 CS01 CS00 Description0 0 0 Stop the timer/counter00 0 1 CK0 1 0 CK/80 1 1 CK/641 0 0 CK/2561 0 1 CK/10241 1 0 External Pin T0, falling edge1 1 1 External Pin T0, rising edge

Schema circuitaledel contatore a 8 bit.

Page 18: Corso Atmel Avr

interrupt. Il contatore a 16 bit invece è più com-plesso del precedente e di conseguenza permette direalizzare più procedure. Una di questa è la modu-lazione PWM (Pulse Width Modulation), e puòessere realizzata a 8, 9 o a 10 bit. Grazie al fatto cheil contatore a 16 bit è di tipo up/down, quindi puòcontare sia in avanti che all’indietro, è possibilegenerare una sorta di onda triangolare (vedi figurasopra) ottenuta facendo salire il contatore fino alsuo massimo valore e, sempre ad intervalli ditempo costanti, farlo contare all’indietro fino adarrivare a zero e di seguito ricominciare l’incre-mento. Questa peculiarità viene usata per generarela modulazione PWM che consiste nel cambiare ilduty cycle di un’onda quadra in base ad unsegnale modulante rappresentato dal valore dicomparazione (Compare Value).Per capirne il funzionamento bisogna osservare lafigura relativa: ogni volta che il segnale triangolareviene a trovarsi al di sotto del valore di riferimento(la riga tratteggiata) viene generato un cambiamen-to di fronte sul segnale OC1X. La forma d’ondatriangolare rappresenta quindi l’andamento neltempo del contatore. Si intuisce che cambiando il

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - settembre 2001 75

dente routine (che sarà allocata all'indirizzo 007H).Del registro TIFR viene usato il Bit 1, questo va alivello logico alto quando avviene un overflow eviene resettato dall’hardware dopo che è stata ese-guita la routine corrispondente alla richiesta di

valore della soglia, si riesce a cambiare la duratadell'impulso in uscita e quindi, continuando avariare la soglia, si genera una forma d’onda PWM.La soglia deve essere fatta variare prima che incon-tri il segnale triangolare (vedi figura) pena la gene-

razione di un Glitch che rappresenta un disturboindesiderato.

WATCHDOG

Il watchdog è un temporizzatore particolare cheviene usato nei sistemi a microprocessore comesistema di sicurezza per evitare che il programmavada in stallo e quindi che il sistema si blocchi inuna situazione non prevista dal programmatore. Inpratica il watchdog interviene e resetta il micro-controllore se non viene resettato tramite l’istruzio-ne WDR (WatchDog Reset) entro il tempo stabilitodai pin 0, 1 e 2 del registro WDTCR. Il watchdogdei microcontrollori AVR viene temporizzato da unclock interno a 1 MHz, questo ci fa capire che puòfunzionare anche in assenza del clock di sistemaperché è indipendente da esso. Il dispositivo vieneprogrammato attraverso il registro WDTCR trami-te l’utilizzo dei primi 5 bit; vediamo ora di capirneil funzionamento analizzandoli in maniera detta-gliata. I bit 0, 1 e 2, come abbiamo già accennato,servono per stabilire il tempo che deve trascorrereprima che il watchdog resetti il micro. Questo

Modulazione PWM realizzata tramite il contatore a 16 bit.

Page 19: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

tempo dipende anche dall’alimentazione del microe può variare da circa 12 ms (WDP0 = 0, WDP1 =0, WDP2 = 0 e alimentazione Vcc=3V) fino a circa6 s (WDP0 = 1, WDP1 = 1, WDP2 = 1 e alimenta-zione Vcc=5V). Il bit 4 (WDTOE = Watch DogTurn Off Enable) ed il bit 5 (WDE) servono perdisabilitare la funzione di watchdog: essendo unsistema di sicurezza, utilizzare un solo bit di abili-tazione / disabilitazione sarebbe stato tropporischioso visto che non si può sapere come si com-porta un programma in “avaria” . Per evitare, quin-

76 settembre 2001 - Elettronica In

Il sistema di sviluppo originale Atmel per la famiglia di microcon-trollori AVR è disponibile al prezzo di 340.000 lire IVA compresa. Laconfezione comprende: la scheda di sviluppo e programmazione; uncavo seriale per il collegamento al PC; due cavi per la programma-zione parallela; un cavo per la programmazione in-system; quattrocavi per la connessione della periferica UART; un cavo di alimenta-zione (l’alimentatore non è compreso); un campione di microcontrol-lore AT90S8515; un manuale utente e un CD-ROM contenente tuttala documentazione tecnica necessaria completa di applicativi e il pro-gramma AVR-Studio che consente di editare, assemblare, simulare edebuggare il programma sorgente per poi trasferirlo nella memoriaflash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: FuturaElettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

WDT Typ. Time-out Typ. Time-outWDP2 WDP1 WDP0 Oscillator cycle (Vcc=3V) (Vcc=5V)

0 0 0 16K cycles 47 ms 15 ms0 0 1 32K cycles 94 ms 30 ms0 1 0 64K cycles 0,19 s 60 ms0 1 1 128K cycles 0,38 s 0,12 s1 0 0 256K cycles 0,75 s 0,24 s1 0 1 512K cycles 1,5 s 0,49 s1 1 0 1024K cycles 3,0 s 0,97 s1 1 1 2048K cycles 6,0 s 1,9 s

di, disabilitazioni involontarie, è necessario seguireuna precisa sequenza di disabilitazione del watch-dog: bisogna prima settare (porre ad 1 logico) siaWDTOE che WDE e, successivamente, per i 4cicli di clock successivi resettare WDE: in questomodo viene disabilitato il watchdog.Osservando lo schema del Watchdog si notano: l’o-scillatore indipendente da 1 MHz, un prescaler e unmultiplexer. I tre bit di controllo vanno ad agireproprio sul multiplexer per selezionare le temporiz-zazioni per il reset.

Schema circuitale

del watch doge relativatabella diprescaler.

Page 20: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - ottobre 2001 73

Lo scopo di questo Corso è quellodi presentare i microcontrollori

Flash della famiglia ATMELAVR. 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Quarta puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

microcontrollori sono dei dispo-sitivi sincroni e quindi per potere

funzionare hanno bisogno di un “orolo-gio” necessario per scandire le opera-zioni che devono eseguire. Questo “oro-logio” viene denominato clock.Naturalmente i vari microcontrollorisono realizzati per potere lavorare sulfronte di salita del clock oppure sulfronte di discesa. Nel caso dell’AtmelAT90S8515, per generare il segnale diclock desiderato è sufficiente collegareun quarzo, e due condensatori, ai pin diingresso XTAL1 e XTAL2. Solitamentevengono utilizzati due condensatori da22 pf. I quarzi che si possono utilizzareper le proprie applicazioni vanno da un

Page 21: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

minimo di 1 Mhz a un massimo di 8 Mhz. I pinXTAL1 e XTAL2 sono rispettivamente l’ingresso el’uscita di un amplificatore invertente il quale vieneusato come oscillatore. E’ anche possibile pilotareil dispositivo con un clock esterno; in questo caso ènecessario tenere disconnesso XTAL2 e connettereXTAL1 all’oscillatore esterno.

INTERFACCIAMENTO DI UNA MEMORIA SRAM ESTERNA

Potrebbe essere necessario avere a disposizione unquantitativo maggiore di SRAM e quindi si presen-ta la necessità di collegare un banco di memoriaesterno. Il microcontrollore AT90S8515 prevedequesta possibilità e quindi può essere predispostoper effettuare il collegamento che prevede l’utiliz-

zo del PortA e del PortC. La porta A viene utiliz-zata sia come bus dati a 8 bit sia come parte menosignificativa del bus indirizzi a 16 bit. La porta Cviene usata per completare la parte più significati-va del bus a 16 bit. Alla porta A va collegato unlatch che viene attivato dal pin ALE del microcon-trollore (vedi figura a fondo pagina). Inoltre biso-gna collegare anche i pin RD (PD7) e WR (PD6)alla memoria esterna per scandire le operazioni dilettura e scrittura in memoria. Si osservi che questidue segnali sono attivi bassi. Per abilitare la memo-ria esterna dobbiamo settare il bit più significativodel registro MCUCR. Questo bit viene chiamatoSRE. Quando questo pin è a livello logico alto allo-ra la memoria esterna è attiva e quindi tutti i pin delmicrocontrollore dedicati all’utilizzo della SRAMsaranno impostati correttamente. Per capire come ilmicrocontrollore interagisce con la memoria è beneanalizzare il suo diagramma temporale che, comesi vede in figura, non presenta la condizione di WaitState, la quale viene settata dal bit SRW del registroMCUCR. Dal diagramma si capisce che i segnalivengono campionati sul fronte di salita del clock.Oltre al clock che scandisce le varie operazioni ènecessario tenere in considerazione i pin ALE, WRe RD che differenziano rispettivamente le opera-zioni di indirizzamento, scrittura e lettura. Quandoil segnale ALE passa da valore logico alto a valorelogico basso si ha che l’indirizzo che va a puntarealla memoria è pronto e quindi si ha l’indirizza-mento della SRAM. Dopodiché ci si dovrà attende-re o un’operazione di lettura in memoria o un’ ope-razione di scrittura nella stessa. Se volessi fare unaoperazione di scrittura in memoria devo portare a

74 ottobre 2001 - Elettronica In

Collegamento del quarzo generatore di clock

Come interfacciare una memoria

SRAM esterna.

Page 22: Corso Atmel Avr

livello logico basso il mio segnale di WR e quindisul fronte di salita del clock scriverò il dato inmemoria (vedi diagramma). Invece se devo legge-re, dopo avere indirizzato, porterò il segnale di RDa livello logico basso e sul fronte di salita del clockandrò a leggere il mio dato. Oltre a questo modo dioperare esiste anche quello con la condizione diWait State, che tra un’ operazione e l’altra di lettu-ra o scrittura, introduce una pausa che dura un ciclodi clock. Dal corrispondente diagramma temporalerelativo si nota che dopo l’operazione di lettura oscrittura troviamo un periodo di attesa che corri-sponde a un ciclo di clock, questo potrebbe esserenecessario per evitare di presentare dei dati allamemoria quando questa non è ancora pronta a rice-verli perché ad esempio non ha ancora finito di ese-guire la precedente richiesta.

COMPARATORE ANALOGICO

All’interno dell’AT90S8515 trova posto un compa-ratore analogico. Il funzionamento è molto sempli-ce: quando la tensione sul pin positivo del compa-ratore è maggiore della tensione sul pin negativoabbiamo che in uscita viene a trovarsi un livellologico alto. Il comparatore viene programmatoattraverso un registro a 8 bit chiamato ACSR(Registro di Stato e di controllo del comparatoreanalogico). Vediamo in dettaglio la funzione diogni singolo bit:

Bit 7 ACD: questo è il bit più significativo delregistro in questione, quando è a livello logicoalto allora il comparatore è disabilitato. Questobit può essere settato tutte le volte che il compa-ratore non deve essere usato riducendo i consumi

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - ottobre 2001 75

ACIS1ACIS0 Interrupt Mode0 0 Comparator Int. on Output Toggle0 1 Reserved1 0 Comparator Int. on Falling Output Edge1 1 Comparator Int. on Rising Output Edge

Cicli dilettura/scritturaSDRAM esterna

senza Wait State

Cicli dilettura/scrittura SDRAM esterna

conWait State

Page 23: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRenergetici.Bit 5 ACO: Contiene l’uscita logica del compara-tore.Bit 4 ACI: Questo bit va a livello logico altoquando il comparatore pilota una richiesta diinterrupt. Per fare in modo che venga eseguita laroutine corrispondente è anche necessario che siasettato a uno il bit ACIE e il Bit I del registro distato SREG.Bit 3 ACIE: Quando è a livello logico alto (assie-me al bit I del SREG) allora è possibile farerichiesta di interrupt attraverso l’uso del compa-ratore.Bit 2 ACIC: Questo bit, se a livello logico alto,abilita la possibilità di triggerare il pin ICP deltimer a 16 bit. Bit 1, 0 ACIS1, ACIS0: Questi bit servono pergenerare un segnale di trigger che sia attivo sulfronte di salita, di discesa o a livello.

MEMORIA EEPROM

All’inizio del corso si era parlato della presenza diuna memoria EEPROM interna, vediamo ora diparlarne in dettaglio. Lo spazio di memoriaEEPROM è di ben 512 Byte e quindi per poterlaindirizzare non è sufficiente un unico registro a 8bit. Questo compito viene quindi svolto dal registroEEAR. Precisamente il registro è formato daEEARH per la parte più significativa e da EEARLper quella meno significativa. Va notato che perindirizzare 512 byte di memoria sono sufficienti 9bit, quindi EEARL sarà usato per intero, mentre diEEARH verrà utilizzato solo il bit meno significa-tivo. Oltre ai registri per l’indirizzamento abbiamobisogno di un registro per i dati e di un registro di

controllo, rispettivamente chiamati EEDR edEECR. Nel registro EEDR sarà contenuto il valoredel dato da scrivere nella EEPROM all’indirizzopuntato dal registro EEAR, oppure sarà contenutoil dato letto dalla memoria all’indirizzo puntatodallo stesso registro. Il registro di controllo dellaEEPROM è usato solo in parte e precisamente i trebit meno significativi. Per poter scrivere inEEPROM è necessario che il bit EEMWE sia alivello logico alto assieme al segnale di strobegenerato dal bit EEWE. Se EEMWE è a livellologico zero allora non si potrà scrivere in memoria.Il segnale EEWE abilita la scrittura in memoria.Quando l’indirizzo e il dato sono stati correttamen-te impostati, si deve portare alto il segnale EEWEper scrivere nella memoria. Ecco la procedura cor-retta da seguire per scrivere nella EEPROM:

- Controllare e attendere finchè il Bit EEWEdiventa zero.- Scrivere il nuovo indirizzo della EEPROM neiregistri EEARL e EEARH- Scrivere il nuovo dato da mettere nellaEEPROM nel registro EEDR- Scrivere un livello logico alto nel Bit EEMWEdel registro EECR- Scrivere un livello logico alto nel Bit EEWE delregistro EECR prima che siano trascorsi quattrocicli di clock, altrimenti EEMWE verrà posto azero dal micro stesso.

Il bit EERE è il segnale di strobe per la lettura nellamemoria. Quando l’indirizzo corretto è stato impo-stato sarà necessario impostare a uno logico questobit per abilitare la lettura dalla memoria. AppenaEERE andrà basso avremo che il dato sarà presen-te nel registro EEDR. Quando EERE è settato laCPU attende due cicli di clock.

76 ottobre 2001 - Elettronica In

Il sistema di sviluppo originale Atmel per la famiglia di microcon-trollori AVR è disponibile al prezzo di 340.000 lire IVA compresa. Laconfezione comprende: la scheda di sviluppo e programmazione; uncavo seriale per il collegamento al PC; due cavi per la programma-zione parallela; un cavo per la programmazione in-system; quattrocavi per la connessione della periferica UART; un cavo di alimenta-zione (l’alimentatore non è compreso); un campione di microcontrol-lore AT90S8515; un manuale utente e un CD-ROM contenente tuttala documentazione tecnica necessaria completa di applicativi e il pro-gramma AVR-Studio che consente di editare, assemblare, simulare edebuggare il programma sorgente per poi trasferirlo nella memoriaflash dei micro. Lo Starter Kit (cod. STK500) va richiesto a: FuturaElettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

Page 24: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - novembre 2001 73

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Quinta puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

ella prima puntata è stato intro-dotto il concetto di programma-

zione in-system. Per effettuare questotipo di programmazione viene utilizzataun’interfaccia seriale a 3 fili che, colle-gata al relativo programmatore, consen-te di scaricare il programma nellamemoria flash del micro stesso. Oltre asvolgere questa funzione, la seriale puòessere utilizzata anche per colloquiarecon altri dispositivi oppure per fareinteragire tra loro due microcontrolloridella famiglia AVR. Da queste conside-razioni si capisce che l’interfaccia SPI(Serial Peripheral Interface) può essereusata per connettersi con una miriade didispositivi elettronici che utilizzano

Page 25: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

questa stessa tecnologia. All’interno del microcon-trollore AT90S8515 è integrata una seriale sincronaad alta velocità che presenta le seguenti caratteri-stiche :

- Trasferimento dati bidirezionale su due distintelinee di comunicazione;

- Possibilità di decidere quale dispositivo è ilMaster e quale lo Slave;

- Possibilità di trasferire prima il bit meno signifi-cativo del dato oppure trasferire prima il bit piùsignificativo;

- Possibilità di programmare quattro diverse velo-cità di funzionamento della seriale;

- Flag che indica il completamento di una trasmis-sione;

- Flag che indica se è avvenuta una collisione tradati. Una collisione avviene quando due o piùdispositivi vogliono accedere contemporanea-mente al medesimo bus.

La seriale contiene un prescaler programmabile checonsente di ottenere un clock adatto al funziona-mento della seriale stessa. Ad esempio, con una fre-quenza di lavoro per la CPU di 8 MHz, avremo chela seriale lavorerà con una frequenza massima di 2MHz fino ad un minimo di 62.5 KHz a seconda dicome viene programmato il prescaler.È presente, inoltre, un registro di controllo denomi-nato SPI Controller Register necessario per impo-stare tutti i parametri di funzionamento della seria-le e un registro di stato denominato SPI StatusRegister utilizzato per rilevare lo stato degli unicidue Flag presenti. Per ultimo abbiamo un registrodati a 8 bit chiamato semplicemente SPI DataRegister. Questo è un registro abilitato sia in scrit-tura che in lettura ed è usato per trasferire i dati traun registro interno alla CPU e il registro di uscitadella seriale (SPI Shift Register) e viceversa.Come accennato precedentemente, è possibile col-legare, attraverso la seriale, due microcontrollori. Ildisegno rappresentato in figura mostra questo tipodi collegamento: una delle due CPU sarà utilizzatacome Master mentre l’altra come Slave. Il disposi-tivo impiegato come master avrà il pin del clockSCK configurato come uscita mentre il dispositivousato come slave userà il medesimo pin comeingresso.Scrivendo nel registro dei dati (SPI Data Register)del dispositivo master si dà inizio alla procedura ditrasferimento del dato dalla CPU master a quellaSlave. Per prima cosa il sistema attiva il clock dellaseriale e contemporaneamente comincia a shiftare

74 novembre 2001 - Elettronica In

La figura mostra in modo schematico l’interfaccia seriale

presente all’interno del microcontrollore.

Interconnessione tra due CPU AVR tramite la porta seriale.

Page 26: Corso Atmel Avr

in uscita il dato da trasmettere. Una volta trasferititutti gli otto bit, il dispositivo master disattiverà ilclock provvedendo a settare il flag di fine trasmis-sione. I due registri a 8 bit dei dispositivi master e slavepossono quindi essere considerati come un unicoshift register circolare a 16 bit. Questo significa chequando un dato a 8 bit viene shiftato dal master alloslave, simultaneamente viene shiftato anche undato dallo slave al master. Questo vuol dire che inun ciclo di trasmissione, i dati presenti nei due regi-stri vengono interscambiati.

UART

All’interno dell’AT90S8515 trova posto anche unaseconda interfaccia seriale denominata UART(Universal Asynchronous Receiver andTransmitter) che è molto simile a quella presentesui PC e che consente di effettuare collegamentiasincroni con qualsiasi periferica esterna (tramitel’UART non è possibile programmare la memoriadel micro).L’UART presente nel microcontrollore ha leseguenti caratteristiche :

- Differenti velocità di trasferimento dati grazie alBaud Generator programmabile;

- Alta velocità di trasferimento dati anche a bassefrequenze di funzionamento della CPU;

- Possibilità di inviare dati a 8 oppure 9 bit;- Sistema di filtraggio del rumore;

- Sistema di riconoscimento “falso bit di Start”;- Sistema di riconoscimento dell’errore di trama

(Framing Error);- Presenza di tre interrupt che indicano la trasmis-

sione completa, il registro di trasmissione deidati vuoto, e la ricezione completa;

I disegni mostrano, in modo schematico, comesono realizzate le sezioni di trasmissione e ricezio-ne dell’interfaccia UART. In entrambi i casi possiamo notare un blocco fun-zionale che si occupa di impostare la velocità dicomunicazione, questo blocco è il Baud RateGenerator; esistono poi un registro di stato e unregistro di controllo. Per ultimo notiamo la presen-za di un registro dati a 11 bit nel quale vengonocaricati il bit di start, il dato a 8 o 9 bit e il bit distop. Tutti questi registri, tranne lo status register,possono essere sia letti che scritti. Osserviamo in dettaglio i registri di stato e di con-trollo: il registro di stato dell’UART si chiamaUSR. Per questo registro vengono utilizzati sola-mente i 4 bit più significativi che ora ci apprestia-mo a descrivere.

Bit 7 RXC: Questo bit è settato a uno quando ildato ricevuto dall’UART è stato trasferito nel regi-stro UDR. RXC viene posto a zero leggendo il regi-stro UDR.

Bit 6 TXC: Questo bit è settato a uno quando undato più il suo bit di stop sono stati trasmessidall’UART. Oltre ad essere stato caricato un nuovo

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - novembre 2001 75

Schema a blocchi della sezione ditrasmissione dell’UART

Page 27: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

76 novembre 2001 - Elettronica In

dato nel registro UDR. Questo bit viene utilizzatonelle comunicazioni half-duplex.

Bit 5 UDRE: Questo bit indica quando l’UART èpronta per ricevere un nuovo dato da trasmettere.

Bit 4 FE: Questo bit è settato a uno quando c’è unerrore di Framing. Ad esempio, se il bit di Stop è a

livello logico basso, questo è considerato un erroreperché il bit di Stop è solitamente a uno logico.Bit 3 OR: Questo bit indica una situazione diOverrun.

Un altro registro presente nell’UART è il registro dicontrollo che viene chiamato UCR. I tre bit più significativi di questo registro servono

Il sistema di sviluppo originale Atmel per la famiglia di micro-controllori AVR è disponibile al prezzo di 340.000 lire IVAcompresa. La confezione comprende: la scheda di sviluppo eprogrammazione; un cavo seriale per il collegamento al PC;due cavi per la programmazione parallela; un cavo per la pro-grammazione in-system; quattro cavi per la connessione dellaperiferica UART; un cavo di alimentazione (l’alimentatore nonè compreso); un campione di microcontrollore AT90S8515; unmanuale utente e un CD-ROM contenente tutta la documenta-zione tecnica necessaria completa di applicativi e il programmaAVR-Studio che consente di editare, assemblare, simulare edebuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) varichiesto a: Futura Elettronica, V.le Kennedy 96, Rescaldina(MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

Schema a blocchi della sezione diricezione dell’UART

Page 28: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - novembre 2001 77

a generare i tre interrupt relativi alla perifericaUART. Gli altri cinque bit, invece sono impostazio-ni specifiche dell’UART:

Bit 4 RXEN: Questo bit, se a uno logico, attival’UART per la ricezione.

Bit 3 TXEN: Questo bit, se a uno logico, attival’UART per la trasmissione.

Bit 2 CHR9: Se questo bit è settato a uno significache il dato trasmesso è a 9 bit. A questo vanno som-mati il bit di stop e il bit di start.

Bit 1 RXB8: Serve per memorizzare il bit più

significativo del dato ricevuto quando viene setta-ta la lunghezza del dato a 9 bit.

Bit 0 TXB8: Serve per memorizzare il bit più signi-ficativo del dato trasmesso quando viene settata lalunghezza del dato a 9 bit.

Oltre a questi due registri ne esiste uno per pro-grammare il BAUD RATE della periferica. Il valo-re da inserire in questo registro a 8 bit va ricavatodalla tabella pubblicata che tiene conto del BAUDRATE da generare (compreso tra un minimo di2400 bps ed un massimo di 115200 bps) e della fre-quenza di clock utilizzata; viene inoltre indicata lapercentuale di errore possibile.

Tabella di impostazione del BAUD RATE dell’UART presente nei microcontrollori ATMEL.

Page 29: Corso Atmel Avr
Page 30: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - dicembre 2001 / gennaio 2002 75

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Sesta puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

opo aver visto, nelle puntate pre-cedenti, le risorse interne dei

microcontrollori Atmel, in questa pun-tata iniziamo ad analizzare le principaliistruzioni dell’AT90S8515. Ognimicrocontrollore possiede un set diistruzioni assembler necessarie a pro-grammare lo stesso in modo da renderedisponibili le proprie circuiterie interneper svolgere le operazioni necessarie alsistema in cui deve essere inserito. Un programma scritto in assembler ècostituito da una serie di dichiarazioni,definite statement, ciascuna delle qualipuò rappresentare una serie di informa-zioni; vi sono poi le etichette (labels), ilcodice operativo, che rappresenta le

Page 31: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRNote: Il risultato viene posto all’interno del regi-stro Rd.

Esempio : Add r1, r2

Risultato: esegue la somma r2 con r1 e pone ilrisultato in r1.

ADC Somma con riporto

Descrizione: somma il contenuto di due registritenendo conto del Flag di riporto C.

Sintassi: ADC Rd,Rr

Note: Il risultato viene posto nel registro Rd.

Esempio: Add r2,r0 ; somma che; causa un riporto

Adc r3,r1

Risultato: Somma i registri r3 ed r1 tenendo contodel riporto dell’operazione precedente.

SUB Sottrazione senza riporto

Descrizione: questa istruzione effettua la sottrazio-ne 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 contenutodel registro r13.

SBC Sottrazione con riporto

Descrizione: questa istruzione fa la sottrazione fradue registri e tiene conto dell’eventuale Flag diriporto C.

Sintassi: SBC Rd,Rr

Note: Il risultato viene posto nel registro Rd.

Esempio : Sub r2,r0 ; sottrazione che; causa un riporto

Sbc r3,r1

Risultato: esegue una sottrazione tenendo conto del

76 dicembre 2001 / gennaio 2002 - Elettronica In

LEGENDA

Rd = Registro destinazione;

Rr = Registro sorgente;

R = 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.

istruzioni che il microcontrollore è in grado di ese-guire, gli operandi, cioè gli elementi (registri olocazioni di memoria) su cui le istruzioni devonoagire. Possiamo poi trovare dei commenti, cioèdelle indicazioni necessarie al programmatore percapire a che cosa serve la porzione di codice com-mentata. L’AT90S8515 possiede un set esteso di istruzioniassembler composto da ben 118 istruzioni. Questepossono essere suddivise in quattro categoriedistinte: Istruzioni aritmetico logiche - Istruzionidi 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 uni-che differenze sono relative ai registri ai quali ven-gono applicate, oppure ai bit del registro che ven-gono gestiti.

ISTRUZIONI ARITMETICO-LOGICHE

Possiamo quindi iniziare a descrivere le istruzioniaritmetico logiche presenti nel Set di istruzioni permicrocontrollori AT90S8515:

ADD Somma senza riporto

Descrizione: questa istruzione consente di effettua-re la somma di due registri senza tener conto delFlag di riporto C.

Sintassi: ADD Rd, Rr

Page 32: Corso Atmel Avr

riporto generato precedentemente.

SBCI Sottrazione immediata con riporto

Descrizione: questa istruzione sottrae una costantedal contenuto del registro tenendo conto del ripor-to. Il risultato viene posto nel registro Rd.

Sintassi: SBCI Rd,K

Note: Il risultato viene posto nel registro Rd.

Esempio: Subi r16,$23; sottrazione che; causa un riporto

Sbci r17,$4F

Risultato: sottrae la costante al registro r17 tenen-do conto del precedente riporto.

AND Logico

Descrizione: esegue l’ AND logico tra i registri Rded Rr.

Sintassi: AND Rd,Rr

Note: Il risultato viene posto nel registro Rd.

Esempio: And r2,r3

Risultato: esegue l’ AND Bit a Bit e pone il risulta-to in r2

OR Logico

Descrizione: questa istruzione esegue l’ OR logicotra il contenuto dei due registri Rd ed Rr.

Sintassi: OR Rd,Rr

Note: Il risultato viene posto nel registro Rd.

Esempio: Or r15,r16

Risultato: esegue l’ OR Bit a Bit tra i due registri.

COM Complemento a uno

Descrizione: questa istruzione esegue il comple-mento a uno del registro Rd.

Sintassi: COM Rd

Note: questa istruzione va a cambiare il registro distato, in particolare va a settare il Flag C.

Esempio: Com r4

Risultato: esegue il complemento a uno del registror4 e setta il Flag C del registro di stato.

SBR Setta un Bit in un registro

Descrizione: questa istruzione setta il Bit specifica-to nel registro Rd.

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - dicembre 2001 / gennaio 2002 77

ISTRUZIONI ARITMETICO - LOGICHE

ADD Rd, Rr Somma senza r iporto

ADC Rd, Rr Somma con r iporto

SUBRd, Rr Sottrazione senza r iporto

SBC Rd, Rr Sottrazione con r iporto

SBCI Rd, Rr Sottrazione immediata con r iporto

AND Rd, Rr AND Logico

OR Rd, Rr OR Logico

COM Rd Complemento a 1

SBR Rd, K Set ta un bi t di un regis tro

CBR Rd, K Reset ta un bi t di un regis tro

MUL Rd, Rr Molt ipl icazione senza segno

Page 33: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

78 dicembre 2001 / gennaio 2002 - Elettronica In

Sintassi: SBR Rd,K

Note: questa istruzione va ad influenzare ilRegistro di Stato SREG.

Esempio: Sbr r16,3

Risultato: questa istruzione va a settare i Bit 0 e 1del registro r16.

CBR Resetta un Bit in un registro

Descrizione: questa istruzione va a resettare un Bitall’interno del registro Rd.

Sintassi: CBR Rd,K

Note: questa istruzione va ad influenzare il

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 moltipli-cazione tra due registri a 8 Bit e mette il risultato inun registro a 16 Bit senza tener conto del segno.

Sintassi: MUL Rd,Rr

Note: i registri Rd e Rr contengono dei dati senzasegno. Il risultato della moltiplicazione viene postoper metà nel registro R0 e per metà nel registro R1.Se il moltiplicando o il moltiplicatore vengonomessi nei registri R0 o R1 si ha che durante l’ope-razione il loro contenuto verrà sovrascritto.

Esempio: Mul r5,r4Movw r4,r0

Risultato: esegue la moltiplicazione senza segnotra il contenuto del registro r5 e r4 e, successiva-mente, copia il risultato della moltiplicazione, chesi trova nei registri r0 ed r1, nei registri r4 – r5.

Con questa istruzione concludiamo una panorami-ca sulle istruzioni aritmetiche e logiche e vi diamoappuntamento alla prossima puntata nella qualeanalizzeremo le istruzioni di salto.

Il sistema di sviluppo originale Atmel per la famiglia di micro-controllori AVR è disponibile al prezzo di 175,00 euro(338.847 lire) IVA compresa. La confezione comprende: lascheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela;un cavo per la programmazione in-system; quattro cavi per laconnessione della periferica UART; un cavo di alimentazione(l’alimentatore non è compreso); un campione di microcontrol-lore AT90S8515; un manuale utente e un CD-ROM contenentetutta la documentazione tecnica necessaria completa di appli-cativi e il programma AVR-Studio che consente di editare,assemblare, simulare e debuggare il programma sorgente perpoi trasferirlo nella memoria flash dei micro. Lo Starter Kit(cod. STK500) va richiesto a: Futura Elettronica, V.le Kennedy96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

Page 34: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - febbraio 2002 73

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Settima puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

ella scorsa puntata abbiamo intro-dotto una serie di funzioni dedica-

te agli ATMEL AVR e relative alle ope-razioni arimetiche e logiche. Adessopassiamo ad una parte fondamentale diqualsiasi linguaggio di programmazio-ne sia ad alto che a basso livello: lagestione dei salti. Nell’esecuzione di unprogramma, infatti, è necessario, perpoter effettuare operazioni diverse infunzione di casi diversi, poter eseguireparti del programma non propriamentein ordine sequenziale. Ad esempio sedobbiamo visualizzare su un displayuna scritta che identifica un tasto pre-muto è necessario poter saltare, in basealla pressione del tasto alla relativa

Page 35: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRstruzione successiva alla chiamata della Call, inquesto modo quando la Subroutine finisce di ese-guire le proprie istruzioni si ha che nel ProgramCounter viene caricato l’’indirizzo di memoria pre-cedentemente salvato nello Stack Pointer e il pro-gramma continua il suo flusso di istruzioni esatta-mente nel punto in cui lo aveva interrotto.

Sintassi: CALL k

Note: Il registro di stato SREG non viene influen-zato dall’ istruzione Call.

Esempio : Mov r16,r0Call pippo….

Pippo: Cpi r16,$42….Ret

Risultato: ad ogni chiamata (CALL) il programmaesegue le istruzioni presenti dall’etichetta “Pippo”fino all’istruzione “RET”. Trovata questa il con-trollo torna all’istruzione successiva la CALL.

RET Ritorno da Subroutine

Descrizione: consente di ritornare da una istruzio-ne CALL. L’ indirizzo di ritorno viene letto nelloStack Pointer. Lo Stack Pointer usa uno schema dipre-incremento durante una istruzione di Ret. Ilregistro di stato SREG non viene influenzato daquesta istruzione.

Sintassi: RET

RETI Ritorno da una chiamata di interrupt

Descrizione: serve per ritornare al programmaprincipale dopo una chiamata di interrupt. Anchein questo caso l’ indirizzo di ritorno viene lettodallo Stack Pointer. Il registro di stato non vieneautomaticamente salvato quando avviene una chia-mata di interrupt, inoltre quando si ritorna da unachiamata di interrupt si deve ripristinare il prece-dente valore del registro di stata SREG.

Sintassi: RETI

CP Istruzione di comparazione

Descrizione: serve per fare il confronto tra il con-tenuto del registro Rd e il contenuto del registro Rr.

74 febbraio 2002 - Elettronica In

Legenda :

Rd = Registro destinazione.Rr = Registro sorgenteR = Risultato dopo che l’ istruzione è stata

eseguitaK = Costantek = Indirizzob = Bit di un registros = Bit presente nello Status RegisterX,Y,Z = Registri a indirizzamento indirettoA = Indirizzo di una locazione di I/Oq = Spostamento per indirizzamento diretto

parte di sorgente che visualizza la scritta appro-priata. Vediamo quindi come gestire queste situa-zioni in assemler.

JMP Salto

Descrizione: esegue un salto incondizionato a unindirizzo di memoria indicato da un’ etichetta.

Sintassi: JMP k

Note: Questa istruzione non va ad influenzare ilregistro di stato SREG.

Esempio : Mov r1,r0Jmp pluto…..…..

pluto: Mov rr3,r2….

Risultato: Copia il contenuto del registro r0 nelregistro r1 e salta in modo incondizionato alla rou-tine pluto.

CALL Chiamata a una Subroutine

Descrizione: va a “richiamare” un sottoprogram-ma (Subroutine) da eseguire prima di ritornare alnormale flusso del programma. Questa istruzione èmolto utile nel caso si debba usare una serie diistruzioni sempre uguali in molte parti del pro-gramma. Infatti si fa una sola copia di queste istru-zioni, andando a formare appunto una Subroutine,le quali verranno richiamate quando serve.Quando viene usata una Call si ha che nello StackPointer viene salvato l’ indirizzo di memoria dell’i-

Page 36: Corso Atmel Avr

Nessun dato contenuto nei registri viene cambiato.Tutti i salti condizionati disponibili vengono utiliz-zati dopo questa istruzione.

Sintassi: CP Rd,Rr

Esempio : Cp r4,r19Brne pippo

Risultato: effettua il confronto tra il contenuto delregistro 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, sonodisponibili altre istruzioni di salto che riportiamo intabella. Queste vanno a verificare lo stato di unodegli otto Bit che si trovano nello Status Register eagiscono di conseguenza.

Introduciamo ora le istruzioni per il trasferimentodei dati e manipolazione dei bit dei registri.

MOV Copia un registro

Descrizione: serve per fare una copia di un regi-stro. Il registro sorgente è Rr mentre il registrodestinazione è Rd. In Rd si troverà una copia di Rr.

Sintassi: MOV Rd,Rr

LDI Caricamento immediato

Descrizione: consente di caricare una costante a 8Bit all’interno dei registri dal 16 a 31.

Sintassi: LDI Rd,K

Esempio : Clr r31Ldi r30,$F0

Risultato: viene azzerata la parte più significativadel registro Z e settata la parte meno significativacon il valore $F0.

LD Caricamento indiretto dallo spazio dati inun registro usando l’ indice Z

Descrizione: legge un Byte indirettamente con osenza spiazzamento dallo spazio dati e lo pone inun registro. Le locazioni di memoria riguardanti idati vengono puntate dal registro Z (16 Bit). L’accesso alla memoria è limitato a 64 Kbyte. Il regi-stro puntatore Z può subire un post-incremento oun pre-decremento oppure rimanere invariato.Grazie a queste caratteristiche si ha che il registroZ può anche essere usato come Stack Pointer e que-sto vale anche per i registri X e Y. Per i dispositiviche hanno solo 256 Byte di spazio dati si usa solola parte meno significativa del registro Z.

Sintassi: LD Rd,ZLD Rd,Z+ ; Post-IncrementoLD Rd,-Z ; Pre-Decremento

Esempio : Clr r31Ldi r30,$60Ld r0,Z+Ld r1,Z

Risultato: viene azzerata la parte più significativadel registro Z e settata la parte meno significativacon $60; viene caricato nel registro r0 il valorecontenuto nella locazione di memoria $60; incre-mentato Z di uno e caricato nel registro r1 il valo-re contenuto nella locazione di memoria $61.

IN Carica un dato dagli I/O in un registro

Descrizione: questa istruzione carica un dato dallospazio di I/O ( Porte A,B,C,D, Timers, Registri diconfigurazione ) e lo pone nel registro Rd.

Sintassi: IN Rd,A

Esempio : In r25,$16Cpi r25,4Breq Exit

Risultato: viene caricato un dato dalla porta B nel

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - febbraio 2002 75

Page 37: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

76 febbraio 2002 - Elettronica In

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 nelloStack. Lo Stack Pointer viene post-decrementato di1. Questa istruzione viene utilizzata quando sifanno delle chiamate a delle subroutine.

Sintassi: PUSH Rr

POP

Descrizione: carica nel registro Rd il valore prele-vato dallo Stack. Lo Stack Pointer viene pre-incre-mentato di 1 prima di eseguire la POP.

Sintassi: POP Rd

LSL Shift logico a sinistra

Descrizione: sposta tutti i Bit del registro Rd a sini-stra . Il Bit 0 viene azzerato mentre il Bit 7 vienecaricato nel Flag C del registro SREG. Questaistruzione, praticamente, esegue la moltiplicazioneper due del dato con e senza segno.

Sintassi: LSL Rd

LSR Shift logico a destra

Descrizione: sposta tutti i Bit del registro Rd adestra. Il Bit 7 viene posto a zero mentre il Bit 0viene caricato nel Flag C. Questa istruzione esegueuna divisione per due del dato senza segno.

Sintassi: LSR Rd

ASR Shift a destra aritmetico

Descrizione: sposta tutti i Bit di Rd a destra di unaposizione. Il Bit 7 è tenuto costante mentre il Bit 0viene 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 settareil Flag I del registro SREG.

Sintassi: SEI

CLI Disabilita Interrupt globali

Descrizione: disabilita gli interrupt. Infatti va adazzerare il Flag I dello Status Register SREG.

Sintassi: CLI

Sleep

Descrizione: mette in sleep il microcontrollore e vaad agire sul registro MCUCR. In particolare sul bit4 detto di Sleep Mode (SM).

Sintassi: SLEEP

Esempio:MOV R0,R11LDI R16,(1<<SE)OUT MCUCR,R16Sleep

Risultato: Abilita la modalità SLEEP e mette MCUin tale modalità.

Il sistema di sviluppo originale Atmel per la famiglia di microcontrolloriAVR è disponibile al prezzo di 175 Euro IVA compresa. La confezionecomprende: la scheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela; un cavo perla programmazione in-system; quattro cavi per la connessione della perife-rica UART; un cavo di alimentazione (l’alimentatore non è compreso); uncampione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa diapplicativi e il programma AVR-Studio che consente di editare, assembla-re, simulare e debuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a:Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

Page 38: Corso Atmel Avr

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Ottava puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - marzo 2002 73

Per testare le potenzialità del microcon-trollore della ATMEL abbiamo pensatodi realizzare una demo-board moltosemplice dal punto di vista circuitalema allo stesso tempo sufficiente a intro-durre le problematiche di programma-zione del micro. I programmi realizzatiper pilotare i dispositivi presenti sullademo-board sono stati scritti prima inlinguaggio assembler e poi in un secon-do tempo in linguaggio BASIC, sicura-mente molto più facile da comprenderee più maneggevole nel caso di program-mi particolarmente complessi. Questademo-board prevede la programmazio-ne in-circuit, quindi non è necessario

Page 39: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

rimuovere il microcontrollore dalla scheda tutte levolte che è dobbiamo programmarlo. Il softwareutilizzato per interfacciare il PC alla demo-board èl’ATMEL AVR ISP scaricabile gratuitamente dal

sito della ATMEL. Osservando lo schema elettricosi notano un display 7 segmenti, un display LCD,un buzzer, tre pulsanti (di cui uno serve per resetta-re il micro in caso di stallo), un’interfaccia seriale

74 marzo 2002 - Elettronica In

SSCCHHEEMMAA EELLEETTTTRRIICCOO DDEEMMOO--BBOOAARRDD

Page 40: Corso Atmel Avr

per collegare la demoboard a qualsiasi perifericaseriale, l’interfaccia di programmazione in-circuit(da collegare alla porta parallela del PC), un LED euna sezione di impostazione formata da quattro

dip-switch. Cominciamo a descrivere l’interfaccia-mento al display LCD 7 segmenti. Quello utilizza-to è del tipo a catodo comune. Viene collegato almicro, al PORTC, attraverso delle resistenze per

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - marzo 2002 75

ELENCO COMPONENTIR1-R2 = 10 KOHMR3 = 220 KOHMR4 = 10 KOHMR5 = 4,7 KOHMR6 = 47 KOHMR7÷R10 = 10 KOHMR11÷R18 = 470 OHMR19 = 180 OHMR20 = 4,7 KOHM trimmerR21 = 470 OHMC1 = 470 µF 25 VC2 = 100 µF 25 VC3÷C6 = 100 nF multistratoC7÷C10 = 1 µF 25 VC11-C12 = 22 pF ceramicoC13 = 100 nF multistratoD1÷D3 = 1N4007LD1 = LED ROSSO 5MMU1 = 7805

U2 = AT90S8515U3 = 74HC244U4 = MAX232Q1 = QUARZO 4 MHzT1 = BC547BZ1 = BUZZER senza el.P1÷P3 = PULSANTE N.A. DS1 = DIP SWITCH 4 POLIDISPLAY1 = LCD CDL4162 16

caratteri X 2 righeDISPLAY2 = 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.

Page 41: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

limitare la corrente assorbita dai led del display. E’possibile scrivere un programma che accenda insequenza i segmenti, oppure che visualizzi sequen-ze di numeri. Se si vuole qualche cosa di più inte-rattivo, utilizzando i pulsanti P2 e P3, sempre scri-vendo un apposito programma, è possibile, adesempio, eseguire conteggi in avanti oppure all’in-dietro a seconda della pressione dei tasti di control-lo. Più flessibile è il Display LCD, che è del tipo16 caratteri su due righe, collegato in parte alPORTA (Bus Dati) in parte al PORTD (controlli).Con questo visualizzatore si possono realizzaremolte più applicazioni, soprattutto se il softwareviene scritto sfruttando la potenza del linguaggioBASIC. Per gestire il Display è necessario utilizza-re i segnali di controllo: RS, E ed R/W.Quest’ultimo viene collegato direttamente a massain quanto vogliamo sempre scrivere e non leggerela memoria del display. RS serve per distinguere tral’invio di un’istruzione oppure di un dato mentre Eè l’enable (attivo alto). Oltre a questi tre pin abbia-mo un bus dati a 8 bit. Nel nostro caso abbiamo uti-lizzato tutti gli 8 bit, necessari ad inviare sia leistruzioni sia i dati, ma in caso di necessità si pos-sono utilizzare soltanto i quattro bit più significati-vi in modo da avere un bus a soli 4 bit. Questoaccorgimento si usa quando si hanno poche uscite

del micro a disposizione. L’alimentazione vieneportata al pin 4 del Display (+ 5V) mentre con iltrimmer R20 si regola il contrasto dello stesso.Nelle prossime puntate, quando presenteremo ilistati applicativi, si noterà che i programmi scrittiin assembler (soprattutto nella gestione del display)risultano piuttosto lunghi, mentre gli stessi pro-grammi scritti in BASIC risulteranno estremamen-te corti. Passiamo ora a descrivere il Buzzer cheviene attivato utilizzando un transistor come inter-ruttore. Il transistor viene pilotato dal PORT D4,quando è a livello logico alto T1 è ON e quindichiude il circuito a cui è collegato il buzzer cheemetterà un suono. Oltre al buzzer abbiamo parlatodi una seriale per interfacciare l’AT90S8515 almondo esterno. Il collegamento avviene utilizzan-do il noto MAX232 necessario a convertire lesoglie dei valori logici provenienti, ad esempio daPC, ad un valore compatibile con i livellidell’AT90S8515. Il programma di gestione dellaseriale, in questo caso, verrà realizzato solamentein BASIC vista la sua complessità. I pin del microimpegnati in questo collegamento sono il PD1 e ilPD0. Il programma di interfaccia prevede di acqui-sire dei dati dalla porta seriale e di visualizzare iltutto sul Display LCD. Per ultimo notiamo la pre-senza di quattro dip-switch collegati al PORTB,

76 marzo 2002 - Elettronica In

LLAADDEEMMOO--BBOOAARRDD

Page 42: Corso Atmel Avr

precisamente a PB0-PB3. Questi possono servireper selezionare sedici possibili modi di funziona-mento in una ipotetica applicazione. Nel nostrocaso sono stati utilizzati per selezionare una delleapplicazioni scritte per mostrare le funzionalità delcircuito. Infatti tutti i programmi scritti sono statiraggruppati in un unico macro-programma e aseconda della combinazione dei dip-switch si andràa selezionare uno di questi programmi.Si osservi che l’integrato U3 serve per programma-re il microcontrollore in-system. Si tratta di unsemplicissimo buffer tri-state collegato alla portaparallela del PC. Ricordiamo che quando sono atti-

vi questi integrati si comportano come semplicibuffer mentre quando i loro piedini di controllo nonsono attivi allora le loro uscite si trovano in altaimpedenza. Per la programmazione si usano i pie-dini PB5 PB6 PB7 che corrispondono rispettiva-mente a MOSI (IN) MISO (OUT) e SCK.La sezione di alimentazione viene realizzata utiliz-zando un semplicissimo 7805 per generare i + 5Vstabilizzati. Il diodo di protezione serve a impediredanni al circuito in caso di errata alimentazione.Vi invitiamo ora alla realizzazione della demo-board così da essere pronti a seguire, sui prossiminumeri del corso, i listati che verranno presentati.

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - marzo 2002 77

Il sistema di sviluppo originale Atmel per la famiglia di microcontrolloriAVR è disponibile al prezzo di 175 Euro IVA compresa. La confezionecomprende: la scheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela; un cavo perla programmazione in-system; quattro cavi per la connessione della perife-rica UART; un cavo di alimentazione (l’alimentatore non è compreso); uncampione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa diapplicativi e il programma AVR-Studio che consente di editare, assembla-re, simulare e debuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a:Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

Traccia lato rame

in scala 1:1

Page 43: Corso Atmel Avr
Page 44: Corso Atmel Avr

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Nona puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - aprile 2002 75

Nonostante i linguaggi ad alto livel-lo (C, Basic, ecc.) risultino molto

più semplici e di immediato apprendi-mento, in alcuni casi è necessario dialo-gare a diretto contatto con il microcon-trollore. L’unico linguaggio di pro-grammazione che ci consente di agiredirettamente sull’Hardware del micro-controllore (registri, memoria, porte diI/O … ) è rappresentato dall’assembler(o linguaggio macchina) che, tra l’al-tro, consente di sfruttare al meglio ilmicrocontrollore sia dal punto di vistadi possibili operazioni che di velocità.Lavorando in assembler, se da una parteabbiamo il miglioramento delle presta-

Page 45: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRzioni e lo sfruttamento completo della macchina,dall’altra abbiamo un aumento della difficoltà nellastesura del codice stesso. In questa puntata vedre-mo come realizzare un programma in assembleranalizzando un semplice listato dimostrativo (visi-bile nella pagina a lato) utile per semplificare laspiegazione.Innanzitutto è necessario disporre del software ade-guato: per la programmazione con il linguaggioassembler su piattaforme Windows è disponibile, inrete presso il sito della ATMEL (www.atmel.com),il programma WAVRASM. Allo scopo, dal sitoAtmel selezionare, in alto a sinistra, la voce PRO-DUCTS, in seguito AVR 8-BIT RISC, poiSOFTWARE; in questa pagina è disponibile il toolASMPACK.EXE che va installato ed eseguito sulproprio PC. Ultimata questa fase, selezionando

sotto Programmi la voce AVR Assembler comparea video la schermata riportata in figura 3.Bisogna ora decidere se scrivere un nuovo pro-gramma oppure se “aprirne” uno già esistente perapprontargli delle modifiche. Nel caso di un nuovo file si aprirà semplicementeuna finestra di testo vuota, in caso contrario, se sivuole modificare un file esistente, comparirà sulmonitor una finestra contenente il listato del pro-gramma (vedi figura 1) che intendiamo modificare. Un programma scritto in assembler è in sostanza unfile di testo, può avere qualsiasi nome ma deveessere caratterizzato dall’estensione ASM.Un programma scritto in assembler risulta costitui-to da una serie di frasi, definite statement (dichia-razioni), ciascuna delle quali può rappresentare unaserie di informazioni.

76 aprile 2002 - Elettronica In

figura 1

figura 2

Page 46: Corso Atmel Avr

I vari tipi di statement comprendono:- le etichette (labels); vengono utilizzate, in caso disalti condizionati o incondizionati, per indicare unpunto del listato; oppure per dare un nome facil-mente memorizzabile a variabili e a costanti;- il codice operativo, rappresenta le istruzioni cheil microcontrollore è in grado di eseguire;- gli operandi, cioè gli elementi (registri e locazio-ni di memoria) su cui le istruzioni devono andaread agire;- i commenti, cioè delle indicazioni utili al pro-grammatore per capire a che cosa serve la porzionedi codice commentata;- le direttive, sono istruzioni (comandi) rivolte alcompilatore, ovvero a quel programma che provve-derà a trasformare il nostro file.ASM (file di testosorgente) in un file.HEX (file oggetto da “inserire”nella memoria programma del microcontrollore).Le direttive più importanti sono:- CSEG: Indica l’inizio del codice programma;- DEF: Assegna un nome ad un registro;- DSEG: Indica l’inizio di un’area di dati;- EQU: Assegna un valore ad una etichetta;- ESEG: Indica l’inizio di uno spazio di memoria

di tipo EEPROM;- INCLUDE: Serve per includere un file assembler

all’interno di un file assembler.Per capire come scrivere del codice assembler peril microcontrollore AT90S8515 e più in generaleper qualsiasi micro AVR prendiamo in esame laporzione di listato riportata a lato.La prima riga del programma (.include“8515def.inc”) serve per “informare” il compilato-re sul dispositivo Hardware utilizzato, in questocaso l’AT90S8515. La dicitura “8515def.inc” iden-tifica un file nel quale sono contenuti tutti gli indi-rizzi fisici dei registri, delle porte di I/O, e deidispositivi Hardware (come il Watch Dog) presentiall’interno dell’AT90S8515. Dopo aver selezionato il dispositivo Hardwarebisogna definire i vettori di interrupt, già descrit-ti nella seconda puntata del Corso. I vettori di inter-rupt per il micro AT90S8515 sono 13, e sono dispo-nibili nelle locazioni di memoria programma chevanno dalla $000 alla $00C. In particolare, quando si alimenta il circuito, oppu-re dopo un impulso di Reset, il microcontrolloreinizia a lavorare eseguendo l’istruzione che si trovaalla locazione $000; in questa locazione dovremoinserire una istruzione di salto incondizionato all’i-nizio del programma. Nel nostro esempio, utiliz-ziamo la direttiva .ORG 0x00 per scrivere nellalocazione $000 l’istruzione rjmp RESET. Si noti

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - aprile 2002 77

PROGRAMMA DIMOSTRATIVO

.include “8515def.inc”

.org 0x00

rjmp RESET ; Chiamo il vettore ; di RESET

.org 0x07 ; Interrupt di ; overflow del timer

rjmp TIMER0

.CSEG

.ORG 0X20

.def uscita=r18

.equ uscita=0xff

TIMER0:

ldi r16,0xffout DDRD,r16

com r18andi r18, 0b00010000out PORTD, r18

ldi r17, 0xB9out TCNT0, r17reti

RESET:

ldi r16,high(RAMEND)out SPH,r16ldi r16,low(RAMEND)out SPL,r16

………………………………………………………………

Il listato pubblicato rappresenta un sempliceprogramma dimostrativo che aiuta a capire lebasi e la struttura di un programma scritto inassembler per il microcontrollore Atmel AVRAT90S8515.

Page 47: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

interna al microcontrollore. Oltre a quelle fin’oradescritte vi sono altre direttive utili nella stesura diun programma come la DSEG e la ESEG.La DSEG informa il compilatore sull’ inizio di unaarea dati. Ad esempio:

.DSEG ; Inizia l’area dativar1: .BYTE 1 ; Riserva un byte

; alla variabile var1

La ESEG definisce l’inizio dello spazio per lamemoria EEPROM. Ad esempio:

.ESEGeevar: .DW 0x00ff

Quando tutto il codice è stato scritto nella finestradel programma WAVRASM è necessario creare ilfile .HEX che deve essere caricato nella memoriadel microcontrollore. Per fare questo è sufficientecompilare il tutto selezionando ASSEMBLE.Se vi sono errori nel programma sorgente il com-pilatore genererà automaticamente un file di testocon elencati i problemi riscontrati, in caso contra-rio verrà generato un file di testo simile a quellorappresentato in figura 2: l’assemblatore crea il filetemporaneo .EPP da cui ricava tre distinti file (il.HEX, il .OBJ e il .LST). Il file con estensione .HEX verrà caricato nellamemoria Flash del microcontrollore utilizzando ilprogramma Atmel AVR ISP (anch’esso disponibi-le sul sito della ATMEL).

78 aprile 2002 - Elettronica In

che la locazione di memoria a cui si punta è defini-ta da una etichetta, ciò vuol dire che possiamo posi-zionare la routine per l’interrupt del RESET dovevogliamo in memoria, purchè dopo le prime 13locazioni di memoria (da 0x00 a 0x0C) che servo-no per identificare appunto le 13 possibili chiama-te di interrupt. Nel nostro esempio, supponiamo di utilizzareanche l’interrupt del Timer0: il vettore di interruptdi quest’ultimo corrisponde alla locazione $007.Anche in questo caso, dovremo forzare in questalocazione (.org 0x07) una istruzione di salto incon-dizionato (rjmp TIMER0) ad una routine di rispostaall’interrupt. La routine di risposta sarà precedutadall’etichetta usata nell’istruzione di salto(TIMER0:) e terminerà con l’istruzione RETI.La direttiva .CSEG seguita dalla .ORG informanoil compilatore dell’inizio del codice vero e propriodel nostro programma e che tale codice sarà scrittonella memoria programma del micro partendo dallalocazione $020 (.ORG 0x20). E’ buona norma iniziare con le routine di rispostaall’interrupt. Nel nostro esempio, scriviamo la rou-tine di risposta al Timer0 e la terminiamo con l’i-struzione RETI. Non avendo implementato altreinterrupt, riportiamo poi l’etichetta da cui il microinizia a processare istruzioni a seguito di un Reseto quando viene alimentato. In pratica, dopo la label(etichetta) RESET: iniziano le istruzioni apparte-nenti al programma principale (main program).Le prime istruzioni riportate servono per indicare alcompilatore la presenza di una SRAM di 512 Byte

Il sistema di sviluppo originale Atmel per la famiglia di microcontrolloriAVR è disponibile al prezzo di 175,00 euro IVA compresa. La confezionecomprende: la scheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela; un cavo perla programmazione in-system; quattro cavi per la connessione della perife-rica UART; un cavo di alimentazione (l’alimentatore non è compreso); uncampione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa diapplicativi e il programma AVR-Studio che consente di editare, assembla-re, simulare e debuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a:Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

figura 3

Il programma Windows AVR ASM (WAVRASM)è liberamente scaricabile dal sito Atmel allavoce Microcontroller, AVR, Software, Tools.

Page 48: Corso Atmel Avr

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Decima puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - maggio 2002 71

Dopo aver visto quali sono le basi perpoter scrivere un programma in assem-bler per i microprocessori Atmel AVRvediamo ora come realizzare sempliciprogrammi sfruttando le potenzialitàdella demoboard. Prima di cominciarecon la descrizione del funzionamentodel primo listato, facciamo un passoindietro e, per chiarire meglio il signifi-cato dell’istruzione: .include“8515def.inc”, pubblichiamo l’interofile di definizioni relativo al microcon-trollore Atmel AVR AT90S8515. Dettoquesto passiamo alla descrizione delprimo programma presentato: “Buzzer”che consente di pilotare l’uscita PortD.4

Page 49: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

in modo da fare emettere un suono al Buzzer colle-gatovi. Per prima cosa è necessario impostare i vet-tori di interrupt, in particolare abbiamo bisogno delvettore di RESET (presente in tutte le applicazioni)

e del vettore TIMER0. Il primo vettore si trovaall’indirizzo 0x00 mentre il secondo all’indirizzo0x07 e ad ognuno di essi corrisponde un’istruzionedi salto incondizionato alla routine di gestione del-

72 maggio 2002 - Elettronica In

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *; * 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; * ; * N u m b e r : AV R 0 0 0; * F i l e N a m e : ” 8 5 1 5 d e f . i n c ”; * T i t l e : R e g i s t e r / B i t D e f i n i t i o n s f o r t h e A T 9 0 S 8 5 1 5; * D a t e : 9 9 . 0 1 . 2 8; * Ve r s i o n : 1 . 3 0; * S u p p o r t t e l e p h o n e : + 4 7 7 2 8 8 4 3 8 8 ( A T M E L N o r w a y ); * S u p p o r t f a x : + 4 7 7 2 8 8 4 3 9 9 ( A T M E L N o r w a y ); * S u p p o r t E - m a i l : a v r @ a t m e l . c o m; * Ta r g e t M C U : A T 9 0 S 8 5 1 5; *; * D E S C R I P T I O N; * W h e n i n c l u d i n g t h i s f i l e i n t h e a s s e m b l y p r o g r a m f i l e , a l l I / O r e g i s t e r; * n a m e s a n d I / O r e g i s t e r b i t n a m e s a p p e a r i n g i n t h e d a t a b o o k c a n b e u s e d .; * I n a d d i t i o n , t h e s i x r e g i s t e r s f o r m i n g t h e t h r e e d a t a p o i n t e r s X , Y a n d; * Z h a v e b e e n a s s i g n e d n a m e s X L - Z H . H i g h e s t R A M a d d r e s s f o r I n t e r n a l ; * S R A M i s a l s o d e f i n e d ; *; * T h e R e g i s t e r n a m e s a r e r e p r e s e n t e d b y t h e i r h e x a d e c i m a l a d d r e s s .; * ; * T h e R e g i s t e r B i t n a m e s a r e r e p r e s e n t e d b y t h e i r b i t n u m b e r ( 0 - 7 ) .; * ; * P l e a s e o b s e r v e t h e d i f f e r e n c e i n u s i n g t h e b i t n a m e s w i t h i n s t r u c t i o n s; * s u c h a s “ s b r ” / ” c b r ” ( s e t / c l e a r b i t i n r e g i s t e r ) a n d “ s b r s ” / ” s b r c ”; * ( s k i p i f b i t i n r e g i s t e r s e t / c l e a r e d ) . T h e f o l l o w i n g e x a m p l e i l l u s t r a t e s; * t h i s :; * ; * i n r 1 6 , P O R T B ; r e a d P O R T B l a t c h; * s b r r 1 6 , ( 1 < < P B 6 ) + ( 1 < < P B 5 ) ; s e t P B 6 a n d P B 5 ( u s e m a s k s , n o t b i t # ); * o u t P O R T B , r 1 6 ; o u t p u t t o P O R T B; *; * i n r 1 6 , T I F R ; r e a d t h e T i m e r I n t e r r u p t F l a g R e g i s t e r; * s b r c r 1 6 , T O V 0 ; t e s t t h e o v e r f l o w f l a g ( u s e b i t # ); * r j m p T O V 0 _ i s _ s e t ; j u m p i f s e t; * . . . ; o t h e r w i s e d o s o m e t h i n g e l s e; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;***** 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 MCUCR =$35

.equ TCCR0 =$33

.equ TCNT0 =$32

.equ OCR0 =$31

.equ TCCR1A =$2f

.equ TCCR1B =$2e

.equ TCNT1H =$2d

.equ TCNT1L =$2c

.equ OCR1AH =$2b

.equ OCR1AL =$2a

.equ OCR1BH =$29

.equ OCR1BL =$28

.equ ICR1H =$25

.equ ICR1L =$24

.equ WDTCR =$21

.equ EEARH =$1f

.equ EEARL =$1e

.equ EEDR =$1d

.equ EECR =$1c

.equ PORTA =$1b

.equ DDRA =$1a

.equ PINA =$19

.equ PORTB =$18

.equ DDRB =$17

.equ PINB =$16

.equ PORTC =$15

.equ DDRC =$14

.equ PINC =$13

.equ PORTD =$12

.equ DDRD =$11

.equ PIND =$10

.equ SPDR =$0f

.equ SPSR =$0e

.equ SPCR =$0d

.equ UDR =$0c

.equ USR =$0b

.equ UCR =$0a

.equ UBRR =$09

.equ ACSR =$08

;***** Bit Definitions.equ INT1 =7.equ INT0 =6

.equ INTF1 =7

.equ INTF0 =6

.equ TOIE1 =7

.equ OCIE1A =6

.equ OCIE1B =5

.equ TICIE1 =3

.equ TOIE0 =1

.equ TOV1 =7

.equ OCF1A =6

.equ OCF1B =5

.equ ICF1 =3

.equ TOV0 =1

.equ SRE =7

.equ SRW =6

.equ SE =5

.equ SM =4

.equ ISC11 =3

.equ ISC10 =2

.equ ISC01 =1

.equ ISC00 =0

.equ CS02 =2

.equ CS01 =1

.equ CS00 =0

.equ COM1A1 =7

.equ COM1A0 =6

.equ COM1B1 =5

.equ COM1B0 =4

.equ PWM11 =1

.equ PWM10 =0

.equ ICNC1 =7

.equ ICES1 =6

.equ CTC1 =3

.equ CS12 =2

.equ CS11 =1

.equ CS10 =0

.equ WDDE =4

.equ WDE =3

.equ WDP2 =2

.equ WDP1 =1

.equ WDP0 =0

.equ EEMWE =2

.equ EEWE =1

.equ EERE =0

.equ PA7 =7

.equ PA6 =6

.equ PA5 =5

.equ PA4 =4

.equ PA3 =3

.equ PA2 =2

.equ PA1 =1

.equ PA0 =0

.equ DDA7 =7

.equ DDA6 =6

.equ DDA5 =5

.equ DDA4 =4

.equ DDA3 =3

.equ DDA2 =2

.equ DDA1 =1

.equ DDA0 =0

.equ PINA7 =7

.equ PINA6 =6

.equ PINA5 =5

.equ PINA4 =4

.equ PINA3 =3

.equ PINA2 =2

.equ PINA1 =1

.equ PINA0 =0

.equ PB7 =7

.equ PB6 =6

.equ PB5 =5

.equ PB4 =4

.equ PB3 =3

.equ PB2 =2

.equ PB1 =1

Page 50: Corso Atmel Avr

l’interrupt. Per primo (e questo avviene ad ogniaccensione del micro) viene eseguito il vettore diRESET il quale, tra le altre cose, si preoccupa diabilitare i 512 Byte di SRAM disponibili. Questa

procedura viene eseguita dalle quattro istruzioniche si trovano dopo l’etichetta RESET. Eseguitaquesta operazione, si rende necessario abilitare gliinterrupt, e questo viene fatto dall’istruzione “sei”.

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - maggio 2002 73

.equ PB0 =0

.equ DDB7 =7

.equ DDB6 =6

.equ DDB5 =5

.equ DDB4 =4

.equ DDB3 =3

.equ DDB2 =2

.equ DDB1 =1

.equ DDB0 =0

.equ PINB7 =7

.equ PINB6 =6

.equ PINB5 =5

.equ PINB4 =4

.equ PINB3 =3

.equ PINB2 =2

.equ PINB1 =1

.equ PINB0 =0

.equ PC7 =7

.equ PC6 =6

.equ PC5 =5

.equ PC4 =4

.equ PC3 =3

.equ PC2 =2

.equ PC1 =1

.equ PC0 =0

.equ DDC7 =7

.equ DDC6 =6

.equ DDC5 =5

.equ DDC4 =4

.equ DDC3 =3

.equ DDC2 =2

.equ DDC1 =1

.equ DDC0 =0

.equ PINC7 =7

.equ PINC6 =6

.equ PINC5 =5

.equ PINC4 =4

.equ PINC3 =3

.equ PINC2 =2

.equ PINC1 =1

.equ PINC0 =0

.equ PD7 =7

.equ PD6 =6

.equ PD5 =5

.equ PD4 =4

.equ PD3 =3

.equ PD2 =2

.equ PD1 =1

.equ PD0 =0

.equ DDD7 =7

.equ DDD6 =6

.equ DDD5 =5

.equ DDD4 =4

.equ DDD3 =3

.equ DDD2 =2

.equ DDD1 =1

.equ DDD0 =0

.equ PIND7 =7

.equ PIND6 =6

.equ PIND5 =5

.equ PIND4 =4

.equ PIND3 =3

.equ PIND2 =2

.equ PIND1 =1

.equ PIND0 =0

.equ SPIE =7

.equ SPE =6

.equ DORD =5

.equ MSTR =4

.equ CPOL =3

.equ CPHA =2

.equ SPR1 =1

.equ SPR0 =0

.equ SPIF =7

.equ WCOL =6

.equ RXC =7

.equ TXC =6

.equ UDRE =5

.equ FE =4

.equ OR =3

.equ RXCIE =7

.equ TXCIE =6

.equ UDRIE =5

.equ RXEN =4

.equ TXEN =3

.equ CHR9 =2

.equ RXB8 =1

.equ TXB8 =0

.equ ACD =7

.equ ACO =5

.equ ACI =4

.equ ACIE =3

.equ ACIC =2

.equ ACIS1 =1

.equ ACIS0 =0

.def XL =r26

.def XH =r27

.def YL =r28

.def YH =r29

.def ZL =r30

.def ZH =r31

.equ RAMEND =$25F ;Last On-Chip SRAM Location

.equ XRAMEND =$FFFF

.equ E2END =$1FF

.equ FLASHEND=$FFF

.equ INT0addr=$001 ;External Interrupt0 Vector Address

.equ INT1addr=$002 ;External Interrupt1 Vector Address

.equ ICP1addr=$003 ;Input Capture1 Interrupt Vector Address

.equ OC1Aaddr=$004 ;Output Compare1A Interrupt Vector Address

.equ OC1Baddr=$005 ;Output Compare1B Interrupt Vector Address

.equ OVF1addr=$006 ;Overflow1 Interrupt Vector Address

.equ OVF0addr=$007 ;Overflow0 Interrupt Vector Address

.equ SPIaddr =$008 ;SPI Interrupt Vector Address

.equ URXCaddr=$009 ;UART Receive Complete Interrupt Vector Address

.equ UDREaddr=$00a ;UART Data Register Empty Interrupt Vector Address

.equ UTXCaddr=$00b ;UART Transmit Complete Interrupt Vector Address

.equ ACIaddr =$00c ;Analog Comparator Interrupt Vector Address

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 dell’utente tramite l’istruzione:

.include “8515def.inc”

Page 51: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

74 maggio 2002 - Elettronica In

Una volta abilitati gli interrupt è necessario pro-grammare il registro TIMSK in particolare il bitTOEI0 che si occupa dell’abilitazione del vettore diOverflow del Timer/Counter0 e di programmare ilregistro TCCR0 in modo da lavorare sui fronti disalita del segnale. Infine va caricato nel registroTCNT0 un valore di soglia per il conteggio. Dopo questa fase di programmazione si entra in unloop infinito, formato dalle ultime due istruzioni,dove si attende l’arrivo di un interrupt che mandi inesecuzione la routine TIMER0.Nella routine TIMER0 si abilita la porta D comeuscita, si fa il complemento a uno del registro R18,lo si moltiplica Bit a Bit con un valore costante e losi invia in uscita al PortD.4 pilotando così il transi-stor T1. Dopodiché e necessario riaggiornare ilregistro TCNT0 concludendo così la routine conuna istruzione di ritorno da interrupt. Questo pro-voca l’emissione, da parte del buzzer, di un tonoacustico.

;****************************************;* 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,0xffout DDRD,r16com r18andi r18, 0b00010000

out PORTD, r18ldi r17, 0xB9out TCNT0, r17reti

RESET:ldi r16,high(RAMEND)out SPH,r16ldi r16,low(RAMEND)out SPL,r16

; Abilito il timer0 e gli interruptsei ; Abilito gli interrupt

; Queste istruzioni servono per abilitare l’ interrupt;di overflow del timer e per settare il prescaler del;timer0

ldi r17, 0b00000010out TIMSK, r17ldi r17, 0b00000011out TCCR0, r17ldi r17, 0xB9out TCNT0, r17

forever:rjmp forever

FF LL OO WW CC HH AA RR TTBB UU ZZ ZZ EE RR

Page 52: Corso Atmel Avr

Il secondo programma che ci apprestiamo a descri-vere si occupa di fare lampeggiare il diodo Led col-legato al PortB.4. Come nel programma preceden-te è necessario inizializzare il vettore di Reset equindi impostare l’area di memoria SRAM di 512Byte. Una volta impostato il micro si può passareall’esecuzione delle rimanenti istruzioni. Per primacosa bisogna settare la Porta B come uscita e perfare ciò bisogna caricare il giusto valore nel regi-stro DDRB. In questo caso ci limitiamo a abilitarecome uscita solo la Porta B.4 e quindi dobbiamocaricare in DDRB il valore esadecimale 0x10.Dopo avere settato la Porta B posso pensare diaccendere il LED portando a livello logico alto ilpin PortB.4 Per fare ciò è sufficiente caricare ilvalore decimale 255 nel registro PORTB. In questo

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - maggio 2002 75

;****************************************;* 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 0x00rjmp RESET

; Assegno un nome a dei registri.def primo = r18.def secondo = r19.def terzo = r20

RESET:ldi r16,high(RAMEND)out SPH,r16ldi r16,low(RAMEND)out SPL,r16

; Setto la portab.4 come uscitaldi r16,0x10out DDRB,r16

; Mando sulla Portab.4 il valore logico alto (5 V); Il quale accende il LED collegato

ldi r16,255out PORTB,r16rcall Ritardo ; Chiamo ritardo

; Mando sulla Portab.4 il valore logico basso (0 V); Il quale spegne il LED collegato

ldi r16,0x00out PORTB,r16rcall Ritardo

Ritardo:ldi primo,25

a: ldi secondo,255b: ldi terzo,255c: dec terzo

brne cdec secondobrne bdec primobrne aret

forever:rjmp forever

FF LL OO WW CC HH AA RR TTLL EE DD LL AA MM PP EE GG GG II AA NN TT EE

Page 53: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVRmodo il LED è acceso. Ora chiamiamo una routinedi ritardo in modo da tenere acceso il led per uncerto periodo di tempo. Una volta terminata la rou-tine di ritardo porteremo a livello logico basso ilpin PortB.4 e quindi spegneremo il diodo Led. Laprocedura è la stessa di prima solo che il valorecaricato nel registro PORTB è zero. Queste proce-dure vengono ripetute per un numero infinito divolte. La routine di ritardo rispetta il diagramma diflusso presentato a lato. Il funzionamento è moltosemplice: per comodità si è assegnato un nome airegistri utilizzati nella routine, in particolare r18,r19, r20. Ad ognuno di essi si è assegnato un valo-re decimale; si inizia quindi a decrementare unavariabile per volta facendo dei test in modo da rile-vare quando questa è arrivata a zero. La routine in questione esegue 25 * 255 * 255 ite-razioni (infatti r18=25, r19=255, r20=255), cioè1625625 decrementi prima di essere terminata. Ciòequivale a dire che il tempo necessario per svolge-re le suddette iterazione è di circa mezzo secondo.Questo, ovviamente dipende dalla frequenza a cuiviene fatto funzionare il micro. Nel nostro caso,utilizzando un quarzo da 4 MHz, il tempo impiega-to per svolgere il ciclo di ritardo è, appunto, di circamezzo secondo. E’ importante notare che, la routine di ritardo, deveessere chiamata dopo ogni variazione di stato delled, quindi, dopo ogni accensione ma anche dopoogni spegnimento del led stesso. In questo modo illed rimarrà acceso per mezzo secondo e spento perlo stesso periodo di tempo.Visti questi due semplicissimi programmi, riman-diamo alla prossima puntata per affrontare situa-zioni più complesse e funzionali. Vedremo comegestire periferiche tipo display a sette segmenti e ildisplay LCD da due righe montato sulla demo-board. Alla prossima!

76 maggio 2002 - Elettronica In

Il sistema di sviluppo originale Atmel per la famiglia di microcontrolloriAVR è disponibile al prezzo di 175,00 euro IVA compresa. La confezionecomprende: la scheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela; un cavo perla programmazione in-system; quattro cavi per la connessione della perife-rica UART; un cavo di alimentazione (l’alimentatore non è compreso); uncampione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa diapplicativi e il programma AVR-Studio che consente di editare, assembla-re, simulare e debuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a:Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

RR OO UU TT II NN EEDD II

RR II TT AA RR DD OO

Page 54: Corso Atmel Avr

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Undicesima puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2002 69

Come accennato il mese scorso, in que-sta puntata analizziamo due program-mi, sempre in assembler, decisamentepiù complicati di quelli visti in prece-denza. Il primo visualizza sul displaysette segmenti i numeri da 0 a 9 e le let-tere da A a F, con la possibilità di farescorrere in avanti o indietro la sequenzadi numeri e lettere utilizzando i pulsan-ti P2 e P3; il secondo programma sioccuperà della gestione di un displayLCD da 2 righe di 16 caratteri ciascuna.Vediamo subito come si comporta ilprimo programma avvalendoci dell’au-silio del flow chart e del listato pubbli-cati. Come al solito il listato inizia conla definizione dei vettori di interrupt e,

Page 55: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

in questo caso, è sufficiente il solo vettore diRESET. Viene inizializzata la memoria SRAM e siimposta la variabile UP a zero. Si noti che all’ini-zio del programma sono stati assegnati dei nomi adalcuni registri del micro, in questo modo il pro-gramma diventa più leggibile.Dopo le impostazioni iniziali bisogna settare laporta C come uscita e lo si fa nel solito modo, cioècaricando nel registro DDRC il valore 0xFF: tuttele otto linee della porta vengono impostate comeuscite. Alla prima accensione vogliamo visualizza-re sul display il valore zero e per fare questo è

necessario inviare la giusta codifica sull’uscita delportC, in questo caso il valore da caricare nel regi-stro è 0x77. A questo punto il micro va a testare ipin di ingresso della porta D in particolare PortD.3e PortD.2, che corrispondono rispettivamente aipulsanti P2 e P3. Il micro legge l’intera porta D conl’istruzione “in” andando poi a verificare se il bit 3o il bit 2 sono a livello logico basso. Per effettuarela verifica sul bit 3 si utilizza l’istruzione “sbrs” laquale verifica se il bit sotto test è a livello logicoalto, se ciò è vero salta l’istruzione successivaandando così a testare l’altro bit corrispondente

70 giugno 2002 - Elettronica In

FF LL OO WW CC HH AA RR TTGG EE SS TT II OO NN EE DD II SS PP LL AA YY

77 SS EE GG MM EE NN TT II

Page 56: Corso Atmel Avr

all’altro pulsante, cioè il bit 2. Se il bit 3 è a livellologico basso viene richiamata la routine per il tastoP2. L’istruzione che testa il bit 2 è “sbrc” la qualeva a verificare se il bit 2 è a livello logico basso, in

caso affermativo salta l’istruzione successivaandando a richiamare la routine per il tasto P3,altrimenti salta all’etichetta uno entrando così in unloop infinito, il quale viene interrotto solo dalla

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2002 71

;****************************************;* 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 0x00rjmp RESET

RESET:ldi r16,high(RAMEND)out SPH,r16ldi r16,low(RAMEND)out SPL,r16

; Carico nella variabile UP Il valore zero esadeciamleldi UP,0x00

; Abilito la porta C come uscita e mando sul display “0”ldi r16,0xffout DDRC,r16ldi r16,0x77out PORTC,r16

; Leggo la porta D (pin PD3 e PD2)uno: in r19,PIND

; Verifico se il Bit 3 della porta D è settato altosbrs r19,3rcall P2 ; Chiamo routine per tasto P2

; Verifico se il Bit 2 della porta D è settato bassosbrc r19,2rjmp unorcall P3; Chiamo routine per tasto P3 rjmp uno

; Routine per riconoscere se UP = 15P2:

ldi r18,0x0f

cp UP,r18breq uguali1inc UPrcall visualizzaret

uguali1:ldi UP,0x00rcall visualizzaret

; Routine per riconoscere se UP = 0P3:

ldi r18,0x00cp UP,r18breq uguali2dec UPrcall visualizzaret

uguali2:ldi UP,0x0frcall visualizzaret

; 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

visualizza:ldi r18,0x00cpse r18, UPrjmp aldi r16,0x77;0out PORTC,r16rcall ritardoret

a: ldi r18,0x01cpse r18, UPrjmp bldi r16,0x14;1out PORTC,r16rcall ritardoret

b: ldi r18,0x02cpse r18, UPrjmp cldi r16,0xB3 ;2out PORTC,r16rcall ritardoret

Page 57: Corso Atmel Avr

display 7 segmenti, analogamente la routine “P3”fa riferimento al tasto P3 e provvede a decrementa-re il valore visualizzato sul display. Per prima cosasi carica il valore 15 (0x0F) nel registro r18 e si

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

72 giugno 2002 - Elettronica In

pressione di P2 o P3. Ora possiamo descrivere lasubroutine “P2”: come si può intuire questa routinecorrisponde alla pressione del tasto P2, il qualeserve per incrementare il valore visualizzato sul

c: ldi r18,0x03cpse r18, UPrjmp dldi r16,0xB6 ;3out PORTC,r16rcall ritardoret

d: ldi r18,0x04cpse r18, UPrjmp eldi r16,0xD4 ;4out PORTC,r16rcall ritardoret

e: ldi r18,0x05cpse r18, UPrjmp fldi r16,0xE6 ;5out PORTC,r16rcall ritardoret

f: ldi r18,0x06cpse r18, UPrjmp gldi r16,0xC7 ;6out PORTC,r16rcall ritardoret

g: ldi r18,0x07cpse r18, UPrjmp hldi r16,0x34;7out PORTC,r16rcall ritardoret

h: ldi r18,0x08cpse r18, UPrjmp ildi r16,0xF7 ;8out PORTC,r16rcall ritardoret

i: ldi r18,0x09cpse r18, UPrjmp lldi r16,0xF4 ;9out PORTC,r16rcall ritardoret

l: ldi r18,0x0Acpse r18, UP

rjmp mldi r16,0xF5 ;Aout PORTC,r16rcall ritardoret

m: ldi r18,0x0Bcpse r18, UPrjmp nldi r16,0xC7 ;Bout PORTC,r16rcall ritardoret

n: ldi r18,0x0Ccpse r18, UPrjmp oldi r16,0x63;Cout PORTC,r16rcall ritardoret

o: ldi r18,0x0Dcpse r18, UPrjmp pldi r16,0x97;Dout PORTC,r16rcall ritardoret

p: ldi r18,0x0Ecpse r18, UPrjmp qldi r16,0xE3 ;Eout PORTC,r16rcall ritardoret

q: ldi r16,0xE1 ;Fout PORTC,r16rcall ritardoret

; routine di ritardo di circa un secondo ;ritardo:

ldi primo,25aa: ldi secondo,255bb: ldi terzo,255cc: dec terzo

brne ccdec secondobrne bbdec primobrne aaret

forever:rjmp forever

Page 58: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2002 73

esegue un confronto con UP, se sono uguali vuoldire che siamo arrivati a 15 con il conteggio e quin-di si passa alla routine “uguali”, in caso contrariosi incrementa UP per poi andare a richiamare laroutine di visualizzazione dei caratteri denominata“visualizza”. La routine per P3 è identica a quellaappena descritta, l’unica differenza è che la varia-bile 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 display7 segmenti è molto semplice, in pratica viene ese-guito un confronto tra la variabile UP e il registror18 che può contenere i valori da 0 a 9 o le letteredalla A alla F. Quando trova una corrispondenza trai due registri visualizza il valore sul display. Perogni carattere visualizzato viene richiamata unaroutine di ritardo, questa routine è identica a quel-la utilizzata nel programma LED.Il secondo listato si occupa di gestire il displayLCD previsto sulla demoboard: la logica di con-trollo di un display LCD dispone di una memoria diimpostazione dei caratteri denominata CG RAM edi una memoria dati denominata DD RAM. Per idisplay a due righe la memoria DD RAM è alloca-ta agli indirizzi che vanno da 00 a 0F e da 40 a 4F,i caratteri scritti in queste 32 allocazioni di memo-ria sono quelli che vengono effettivamente visua-lizzati sul display. Per “scrivere” dei caratteri suldisplay bisogna quindi scrivere in queste locazionii caratteri uno dopo l’altro, ad ogni invio di uncarattere il cursore viene automaticamente posizio-nato alla cella successiva. Come tutti i programmi fino ad ora esposti, lasezione iniziale prevede la definizione del vettoredi RESET e l’assegnazione di un nome simbolicoai registri interni del microcontrollore, in modo daavere un codice più leggibile. Nella nostra applica-zione associamo dei nomi simbolici ai registri dicontrollo del display. Per informare il display che idati in arrivo sono dei comandi occorre portare alivello logico basso il suo pin RS tramite il coman-do “cbi” che resetta il bit 6 della porta D.Dopodiché viene inviato il comando Function Setche setta il display con un bus dati a 8 bit e un’in-terfaccia a due righe. Una volta inviato il comando è necessario richia-mare una routine di ritardo, questo perché il displayè un dispositivo “lento” rispetto al microcontrollo-re e quindi bisogna dargli il tempo necessario per“acquisire” il comando inviatogli. Function Setviene inviato tre volte. Ora bisogna inviare ilcomando Display Control, impostato nel nostro

caso per accendere il display e visualizzare il cur-sore, e il comando Entry Mode per specificare ladirezione di movimento del cursore; successiva-mente bisogna “pulire” il display con il comandoDisplay Clear e di seguito inviare il comandoReturn Home che muove il cursore sul primo carat-tere della prima linea. Infine, bisogna comunicaregli indirizzi della CG RAM e della DD RAM.Finita la serie di comandi si riporta a livello logicoalto il pin RS mediante l’istruzione “sbi”. Ora sipossono inviare i caratteri, però, prima bisogna tra-smettere l’indirizzo di memoria per la DD RAMcosì da selezionare la prima riga. Per fare questo sipone a livello logico basso il pin RS del display, siinvia sul bus dati l’indirizzo di memoria dellaprima riga, si porta a livello logico alto l’enable (E)del display riportandolo subito basso, si richiama laroutine di ritardo e infine si riporta a livello logicoalto il pin RS. Ora è possibile inviare uno a uno tutti

FF LL OO WW CC HH AA RR TTDD II SS PP LL AA YY

LL CC DD

Page 59: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

Quando il contatore è a zero scriviamo il primocarattere della prima riga, quando il contatore è auno scriviamo il secondo carattere della riga e cosìvia. Osservando il codice a partire dall’etichetta

74 giugno 2002 - Elettronica In

;****************************************;* 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 r16,HIGH(RAMEND)out SPH,r16ldi r16,LOW(RAMEND)out SPL,r16

; Inizializzo Porta A e D come usciteldi r16, 0xffout DDRD, r16out DDRA, r16

; Assegno un valore alle variabili in giocoldi Function_Set, 0x38ldi Display_Control, 0x0Cldi Entry_Mode, 0x06ldi Return_Home, 0x02ldi Display_Clear, 0x01ldi CG_RAM, 0x40ldi DD_RAM_Riga1, 0x80ldi DD_RAM_Riga2, 0xC0ldi Contatore1, 0xFF

; Inizializzazione Displaycbi PORTD,6rcall Delay

i caratteri della prima riga. La logica di invio deicaratteri rispecchia il flow-chart. Praticamenteviene portato a zero un contatore che discrimina ilnumero di caratteri della prima linea del display.

; Mando al Display il comando Function_Set per ; 3 volte Come indicano le specifiche per la; programmazione del display

out PORTA,Function_Setsbi PORTD,7cbi PORTD,7rcall Delaysbi PORTD,7cbi PORTD,7rcall Delaysbi PORTD,7cbi PORTD,7rcall 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_Controlsbi PORTD,7cbi PORTD,7rcall Delayout PORTA, Entry_Modesbi PORTD,7cbi PORTD,7rcall Delayout PORTA, Display_Clearsbi PORTD,7cbi PORTD,7rcall Delayout PORTA, Return_Homesbi PORTD,7cbi PORTD,7rcall Delay

; Invio gli indirizzi della CG_RAM,; DD_RAM_Riga1 e Riga2

out PORTA, CG_RAMsbi PORTD,7cbi PORTD,7rcall Delayout PORTA, DD_RAM_Riga1sbi PORTD,7cbi PORTD,7rcall Delayout PORTA, DD_RAM_Riga2sbi PORTD,7cbi PORTD,7rcall Delay

Page 60: Corso Atmel Avr

“dati” si osserva che viene prima eseguita unacomparazione tra il valore della variabile contato-re2 e la costante zero. Se risultano diversi si saltaall’etichetta “a” dove si trova il secondo carattere

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

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - giugno 2002 75

; Riporto a livello logico alto il piedino RS del Displaysbi PORTD,6

; Invio Carattericbi PORTD, 6out PORTA, DD_RAM_Riga1sbi PORTD,7cbi PORTD,7rcall Delaysbi PORTD, 6ldi Contatore2, 0x00

; Comincio a inviare i caratteri uno ad uno fino a che ; non compare la scritta Futura Elettronicadati: cpi Contatore2, 0x00

brne aldi Dato, 0x20 ; Lettera “ “rcall Invio

a: cpi Contatore2, 0x01brne bldi Dato, 0x20 ; Lettera “ “rcall Invio

b: cpi Contatore2, 0x02brne cldi Dato, 0x20 ; Lettera “ “rcall Invio

c: cpi Contatore2, 0x03brne dldi Dato, 0x20 ; Lettera “ “rcall Invio

d: cpi Contatore2, 0x04brne eldi Dato, 0x20 ; Lettera “ “rcall Invio

e: cpi Contatore2, 0x05brne fldi Dato, 0x46 ; Lettera Frcall Invio

f: cpi Contatore2, 0x06brne gldi Dato, 0x55 ; Lettera Urcall Invio

g: cpi Contatore2, 0x07brne hldi Dato, 0x54 ; Lettera Trcall Invio

h: cpi Contatore2, 0x08brne ildi Dato, 0x55 ; Lettera Urcall Invio

i: cpi Contatore2, 0x09

brne lldi Dato, 0x52 ; Lettera Rrcall Invio

l: cpi Contatore2, 0x0Abrne mldi Dato, 0x41 ; Lettera Arcall Invio

m: cpi Contatore2, 0x0Bbrne nldi Dato, 0x20 ; Lettera “ “rcall Invio

n: cpi Contatore2, 0x0Cbrne oldi Dato, 0x20 ; Lettera “ “rcall Invio

o: cpi Contatore2, 0x0Dbrne pldi Dato, 0x20 ; Lettera “ “rcall Invio

p: cpi Contatore2, 0x0Ebrne qldi Dato, 0x20 ; Lettera “ “rcall Invio

q: cpi Contatore2, 0x0Fbrne aaldi Dato, 0x20 ; Lettera “ “rcall Invio

aa:ldi Contatore2, 0x00cpi Contatore2, 0x00brne bbcbi PORTD, 6out PORTA, DD_RAM_Riga2sbi PORTD,7cbi PORTD,7rcall Delaysbi PORTD, 6ldi Dato,0x20 ; Lettera “ “rcall Invio

bb: cpi Contatore2, 0x01brne ccldi Dato, 0x20 ; Lettera “ “rcall Invio

cc: cpi Contatore2, 0x02brne ddldi Dato, 0x20 ; Lettera “ “rcall Invio

dd: cpi Contatore2, 0x03brne ee

ldi Dato, 0x45 ; Lettera Ercall Invio

Page 61: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

Il sistema di sviluppo originale Atmel per la famiglia di microcontrolloriAVR è disponibile al prezzo di 175,00 euro IVA compresa. La confezionecomprende: la scheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela; un cavo perla programmazione in-system; quattro cavi per la connessione della perife-rica UART; un cavo di alimentazione (l’alimentatore non è compreso); uncampione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa diapplicativi e il programma AVR-Studio che consente di editare, assembla-re, simulare e debuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a:Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

ee: cpi Contatore2, 0x04brne ffldi Dato, 0x4C ; Lettera Lrcall Invio

ff: cpi Contatore2, 0x05brne ggldi Dato, 0x45 ; Lettera Ercall Invio

gg: cpi Contatore2, 0x06brne hhldi Dato, 0x54 ; Lettera Trcall Invio

hh: cpi Contatore2, 0x07brne iildi Dato, 0x54 ; Lettera Trcall Invio

ii: cpi Contatore2, 0x08brne llldi Dato, 0x52 ; Lettera Rrcall Invio

ll: cpi Contatore2, 0x09brne mmldi Dato, 0x4F ; Lettera Orcall Invio

mm: cpi Contatore2, 0x0Abrne nnldi Dato, 0x4E ; Lettera Nrcall Invio

nn: cpi Contatore2, 0x0Bbrne ooldi Dato, 0x49 ; Lettera Ircall Invio

oo: cpi Contatore2, 0x0Cbrne pp

ldi Dato, 0x43 ; Lettera Crcall Invio

pp: cpi Contatore2, 0x0Dbrne qqldi Dato, 0x41 ; Lettera Arcall Invio

qq: cpi Contatore2, 0x0Ebrne rrldi Dato, 0x20 ; Lettera “ “rcall Invio

rr: ldi Dato, 0x20 ; Lettera “ “out PORTA, Datorcall Inviorjmp dati

; Routine di ritardo. Necessaria perché il micro è; molto più veloce del displayDelay:

dec Contatore1cpi Contatore1,0x00brne Delayldi Contatore1,0xffret

; Routine per inviare i caratteri da visualizzareInvio:

out PORTA, Datosbi PORTD,7cbi PORTD,7rcall Delayinc Contatore2ret

forever:rjmp forever

consiste nell’inviare l’indirizzo di memoria DDRAM della seconda riga utilizzando il metodoprima esposto. A questo punto, i caratteri cheandremo ad inviare verranno automaticamente

visualizzati sulla seconda riga. Il codice espostoviene ripetuto infinite volte visualizzando cosi lascritta “FUTURA ELETRONICA” sulle due righea disposizione del display.

76 giugno 2002 - Elettronica In

Page 62: Corso Atmel Avr

Scopo di questo Corso è quello dipresentare i microcontrolloriFlash della famiglia ATMEL

AVR. Utilizzando una semplicedemoboard 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 sarannoredatti dapprima nel classico

linguaggio Assembler e poi nelpiù semplice ed intuitivo Basic.

Dodicesima puntata.

a cura di Matteo Destro

CORSO DIPROGRAMMAZIONE

MICROCONTROLLORI-- ATMEL AVR --

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - luglio / agosto 2002 73

icuramente scrivere un programmaper microcontrollori utilizzando il

linguaggio assembler risulta abbastan-za complesso, soprattutto se bisognapilotare bus di comunicazione oppurecollegarsi a dei dispositivi esterni attra-verso l’uso di interfacce seriali (SPI,RS232, ecc). Per ovviare a queste pro-blematiche di programmazione si prefe-risce, la maggior parte delle volte, uti-lizzare linguaggi ad alto livello, cioèpiù vicini al linguaggio dell’uomo che aquello della macchina, in modo da sem-plificare notevolmente la stesura di unprogramma complesso. In questoCorso, giunto ormai al termine, presen-tiamo una serie di cinque semplici pro-

Page 63: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

grammi con lo scopo di far capire le differenzesostanziali tra un linguaggio ad alto livello e l’as-sembler. Vi rimandiamo ad appositi manuali dedi-cati alla programmazione Basic per acquisirepadronanza completa con il linguaggio in questio-ne. Il primo listato si occupa della gestione di unLED collegato alla porta B. Il loop è infinito. Inquesto modo il led si accenderà e spegnerà infinite

volte. Dopo aver configurato la porta B a cui risul-ta collegato il led, sarà sufficiente prevedere unciclo di set/reset del pin 4 della porta B con inter-poste due uguali routine di ritardo. Il secondo lista-to (Demo2.bas) consente di pilotare il Buzzer pre-sente sulla nostra Demoboard in modo da fargliemettere un suono. Anche in questo caso il pro-gramma è molto semplice, si imposta la porta D

74 luglio / agosto 2002 - Elettronica In

‘****************************************‘* Programma Buzzer - Demo2.bas ‘* 14/08/2001 ‘* ‘* Questo programma manda degli impulsi al ‘* Buzzer. ‘****************************************

Dim Pulse As LongMain0:Pulse = 300

Main:While Pulse < 100000

Sound Portd.4 , 100 , PulseWait 1Pulse = Pulse + 300

WendGoto Main0

End

‘****************************************‘* 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

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

End

‘*****************************************************************************************‘* Display - Demo3.bas ‘* 14/08/2000 ‘* ‘* Scrive dei caratteri sul display intelligente a due righe e sedici caratteri ‘* ‘*****************************************************************************************

Main:

ClsWait 3Locate 1 , 3 ‘ Posiziona il cursore sulla prima riga terzo carattereLcd “Corso Atmel”Wait 1

LowerlineLocate 2 , 2 ‘ Posiziona il cursore sulla seconda riga secondo carattereLcd “Elettronica In”Wait 3

Goto MainEnd

Page 64: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - luglio / agosto 2002 75

‘****************************************************************************************‘* 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 ByteConfig Portc = OutputConfig Debounce = 25Declare Sub Riconoscimento

Up = 0Portc = &B01110111 ‘ Visualizzo il valore zero sul displayWait 1

Main:Debounce Pind.3 , 0 , Pulsante2 , Sub ‘ Verifico lo stato del pulsante P2, se

‘ premuto salto alla sua subroutine equivalenteDebounce Pind.2 , 0 , Pulsante3 , Sub ‘ verifico lo stato del pulsante P3, se

‘ premuto salto alla sua subroutine equivalenteGoto Main ‘ Loop infinitoEnd

Pulsante2: ‘ 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 ThenUp = 0Call Riconoscimento

ElseUp = Up + 1Call Riconoscimento

End IfReturn

Page 65: Corso Atmel Avr

livello logico basso e alto. Il primo e il secondoparametro sono fissi (Portd.4 e 100), mentre il terzoparametro è la variabile Pulse che viene incremen-tata ad ogni ciclo di While di 300, fino a quando ilvalore di Pulse è inferiore al 100000. Al termine delciclo While, il programma ricomincia dall’inizioassociando nuovamente alla variabile Pulse il valo-

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

76 luglio / agosto 2002 - Elettronica In

come uscita e si associa alla variabile Pulse unvalore iniziale di 300. Si prevede poi un cicloWhile in modo da ripetere più volte l’istruzioneSound. Quest’ultima pilota il pin 4 della portaD acui è collegato il buzzer. La sintassi della Sound èla seguente: linea di uscita, numero di impulsi dainviare, tempo in cui il pin deve essere tenuto a

If Up = 8 ThenPortc = &B11110111 ‘8Wait 1

ElseIf Up = 9 Then

Portc = &B11110100 ‘9Wait 1

ElseIf Up = 10 Then

Portc = &B11110101 ‘AWait 1

ElseIf Up = 11 Then

Portc = &B11000111 ‘BWait 1

ElseIf Up = 12 Then

Portc = &B01100011 ‘CWait 1

ElseIf Up = 13 Then

Portc = &B10010111 ‘DWait 1

ElseIf Up = 14 Then

Portc = &B11100011 ‘EWait 1

ElseIf Up = 15 Then

Portc = &B11100001 ‘FWait 1

End IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd Sub

Pulsante3: ‘ Questa routine deve stabilire ‘ quale valore ha assunto il ‘ contatore Up. Devo verificare ‘ non sia = 0

If Up = 0 ThenUp = 15Call Riconoscimento

ElseUp = Up - 1Call Riconoscimento

End IfReturn

Sub Riconoscimento ‘ Questa routine serve per ‘ riconoscere quale ‘ carattere visualizzare

If Up = 0 ThenPortc = &B01110111 ‘0Wait 1

ElseIf Up = 1 Then

Portc = &B00010100 ‘1Wait 1

ElseIf Up = 2 Then

Portc = &B10110011 ‘2Wait 1

ElseIf Up = 3 Then

Portc = &B10110110 ‘3Wait 1

ElseIf Up = 4 Then

Portc = &B11010100 ‘4Wait 1

ElseIf Up = 5 Then

Portc = &B11100110 ‘5Wait 1

ElseIf Up = 6 Then

Portc = &B11000111 ‘6Wait 1

ElseIf Up = 7 Then

Portc = &B00110100 ‘7Wait 1

Else

Page 66: Corso Atmel Avr

CO

RSO

PRO

GR

AM

MA

ZIO

NE

AVR

Elettronica In - luglio / agosto 2002 77

re 300. Il terzo listato (Demo3.bas) controlla ildisplay LCD da 2 linee 16 caratteri implementatosulla Demoboard e visualizza la scritta “CorsoAtmel Elettronica In”. E’ interessante notare comeun linguaggio evoluto semplifichi notevolmente unlistato che in assembler (vedi puntate precedenti)avrebbe richiesto parecchie righe di programma. In

pratica, in Basic, sono sufficienti due sempliciistruzioni per posizionare il cursore (Locate y,x) eper visualizzare qualsiasi scritta sul display (lcd“xxxxxx”). La prima istruzione CLS, consente dicancellare eventuali scritte visualizzare sul display.L’istruzione Locate consente di posizionare il cur-sore in un punto preciso del display: il primo para-

‘*****************************************************************************************‘* 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

ClsLcd " Comunicazione "Locate 2 , 1Lcd " 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

Page 67: Corso Atmel Avr

CO

RSO

PROG

RA

MM

AZIO

NE

AVR

78 luglio / agosto 2002 - Elettronica In

Il sistema di sviluppo originale Atmel per la famiglia di microcontrolloriAVR è disponibile al prezzo di 175,00 euro IVA compresa. La confezionecomprende: la scheda di sviluppo e programmazione; un cavo seriale per ilcollegamento al PC; due cavi per la programmazione parallela; un cavo perla programmazione in-system; quattro cavi per la connessione della perife-rica UART; un cavo di alimentazione (l’alimentatore non è compreso); uncampione di microcontrollore AT90S8515; un manuale utente e un CD-ROM contenente tutta la documentazione tecnica necessaria completa diapplicativi e il programma AVR-Studio che consente di editare, assembla-re, simulare e debuggare il programma sorgente per poi trasferirlo nellamemoria flash dei micro. Lo Starter Kit (cod. STK500) va richiesto a:Futura Elettronica, V.le Kennedy 96, Rescaldina (MI), www.futuranet.it.

DOVE ACQUISTARE LO STARTER KIT STK500

metro è il numero della riga dall’alto verso ilbasso, il secondo parametro è il numero dellacolonna da sinistra verso destra. Ad esempio,Locate 1,3 posiziona il cursore sulla prima riga,terza colonna. L’istruzione LCD consente di visua-lizzare sul display, partendo da dove è stato posi-zionato il cursore, quanto riportato tra virgolettedopo l’istruzione stessa. Poiché il display è undispositivo molto più lento del micro nello svolge-re le operazioni è indispensabile dopo ogni coman-do, o in ogni caso prima di inviarne uno successi-vo, interporre un ritardo variabile da 1 a 3 secondiin funzione del tipo di display. Il quarto listato(Demo4.bas) consente di visualizzare sul display a7 segmenti della Demoboard un valore da 0 a F, talevalore può essere aumentato o diminuito agendosu due pulsanti: se viene premuto il pulsate P2 si haun incremento del valore, al contrario se si premeP3 si ha un decremento del valore visualizzato. Leprime righe del programma servono per le inizia-lizzazioni, si imposta la porta C come uscita, si sce-glie il valore in millisecondi del Debounce (anti-rimbalzo sulla pressione dei pulsanti) e si dichiarala subroutine Riconoscimento. Il listato può esserescomposto in un main e in tre subroutine fonda-mentali. Nel main vengono testati continuamentegli stati dei due ingressi a cui sono collegati i duepulsanti: alla pressione di P2 viene eseguita lasubroutine Pulsante2, alla pressione di P3 vieneeseguita la subroutine Pulsante3. E’ interessantenotare che il valore di Debounce è una costante madeve essere determinato empiricamente in funzio-ne del tipo di pulsante; per la nostra Demoboard ilvalore ottimale è 25, ma utilizzando altri modelli dipulsante tale valore potrebbe dover essere aumen-tato. La subroutine Pulsante2 serve per incremen-tare il valore della variabile UP; prima di ciò biso-gna verificare che UP non abbia già raggiunto il

valore massimo consentito, ovvero 15. In quest’ul-timo caso, alla variabile UP si associa il valore 0.Sia dopo un azzeramento di UP che dopo un incre-mento, si esegue la subroutine Riconoscimento. Laroutine Pulsante3 è strutturalmente identica allaprecedente: la variabile UP viene decrementataoppure caricata con il numero 15 se il suo valoreera pari a 0. La subroutine Riconoscimento prov-vede a visualizzare il numero contenuto nella varia-bile UP sul display a 7 segmenti. Non essendociuna relazione precisa tra numero e le linee che sicollegano al display, il listato prevede 16 check:viene testato il valore di UP con un numero com-preso tra 0 e 15, il test con esito positivo causa lavisualizzazione della relativa cifra. Il quinto listatoproposto (Demo5.bas) consente di inviare unastringa di caratteri dal microcontrollore alla portaseriale di un PC. Per prima cosa bisogna abilitare laporta di comunicazione seriale e questo vienefatto con il comando open, nel quale si seleziona ilpin di uscita dal micro, la velocità di trasmissione ilnumero di bit per i dati, la parità e il numero di bitdi stop. Poi si avvisa l’utente che sta per avvenireuna comunicazione seriale visualizzando suldisplay la scritta “Comunicazione Seriale”, infinecon il comando print si invia la stringa sullaCOM1. Dal lato PC possiamo scrivere un ugualeprogramma, ad esempio in QBASIC, utilizzando ilcomando Input per leggere la stringa inviata dalmicrocontrollore. Anche per il programma in QBA-SIC dovremo aprire una porta seriale COM impo-stando gli stessi parametri di velocità, bit di dati,parità e bit di stop utilizzati nel Basic del micro-controllore. Nel comando Input dovremo specifi-care la porta seriale a cui si riferisce, nella demo èla COM1 e il numero di caratteri da leggere, sem-pre nel nostro caso sono 16. Ora, possiamo visua-lizzare sul monitor quanto inviato dal micro.