151
Laborator Microcontrolere Lucrarea 1 Microcontrolerul ATmega32. Utilizarea porturilor Scopul lucrării a) Noţiuni generale despre ATmega32 b)Setul de instrucţiuni al ATmega32 c) Porturile ATmega32 şi exemple de utilizare d) Programarea unor aplicaţii utilizând placa de dezvoltare EasyAVRv7 1. Noţiuni generale ATmega32 este un micro controler RISC pe 8 biţi realizat de firma Atmel. Caracteristicile principale ale acestuia sunt: - 32KB de memorie Flash re inscriptibilă pentru stocarea codului - 2KB de memorie RAM - 1KB de memorie EEPROM - două numărătoare/temporizatoare de 8 biţi - un numărător/temporizator de 16 biţi - conţine un convertor analog - digital cu intrări multiple - conţine un comparator analogic - conţine un modul USART pentru comunicaţie serială - dispune de oscilator intern - oferă 32 de linii I/O organizate în patru porturi. Structura internă generală a controlerului este prezentată în Figura 1. Se poate observa că există o magistrală generală de date la care sunt conectate mai multe module: - unitatea aritmetică şi logică (ALU) - registrele generale - memoria RAM şi memoria EEPROM - liniile de intrare (porturile - I/O Lines) şi celelalte blocuri de intrare/ieşire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul având asociat un număr de registre specifice.

Laborator Microcontrolere

Embed Size (px)

DESCRIPTION

Laborator Microcontrolere

Citation preview

Laborator MicrocontrolereLucrarea 1Microcontrolerul ATmega32. Utilizarea porturilorScopul lucrriia) Noiuni generale despre ATmega32b) Setul de instruciuni al ATmega32c) Porturile ATmega32 i exemple de utilizared) Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVRv71. Noiuni generaleATmega32 este un micro controler RISC pe 8 bii realizat de firma Atmel. Caracteristicile principale ale acestuia sunt: 32KB de memorie Flash re inscriptibil pentru stocarea codului 2KB de memorie RAM 1KB de memorie EEPROM dou numrtoare/temporizatoare de 8 bii un numrtor/temporizator de 16 bii conine un convertor analog - digital cu intrri multiple conine un comparator analogic conine un modul USART pentru comunicaie serial dispune de oscilator intern ofer 32 de linii I/O organizate n patru porturi.Structura intern general a controlerului este prezentat n Figura 1. Se poate observa c exist o magistral general de date la care sunt conectate mai multe module: unitatea aritmetic i logic (ALU) registrele generale memoria RAM i memoria EEPROM liniile de intrare (porturile - I/O Lines) i celelalte blocuri de intrare/ieire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul avnd asociat un numr de registre specifice.Memoria Flash de program mpreun cu ntreg blocul de extragere a instruciunilor, decodare i execuie comunic printr-o magistral proprie, separat de magistrala de date menionat mai sus. Acest tip de organizare este conform principiilor unei arhitecturi Haivad i permite controlerului s execute instruciunile foarte rapid.

Figura 1. Structura bloc general a microcontrolerului ATmega32

ATmega32 conine 32 de registre de uz general i 64 de registre speciale pentru modulele I/O. Aceste registre sunt mapate la adrese din memoria RAM cuprinse ntre OOOOh i 005Fh.Una din caracteristicile foarte importante pentru orice procesor i n particular pentru microcontrolere este sistemul de ntreruperi. O ntrerupere reprezint un semnal generat de un modul extern unitii centrale de procesare (CPU) pentru a anuna apariia unui eveniment care trebuie tratat. Utilizarea unui astfel de sistem permite implementarea de module specializate care s execute operaii n paralel cu CPU i s solicite intervenia acestuia numai la terminarea operaiilor sau n alte cazuri definite.ATmega32 dispune de 21 surse de ntrerupere. Atunci cnd una dintre ele devine activ se suspend cursul normal de execuie i se face salt automat la o adres prestabilit din memoria program. Astfel, structura tipic a unui program conine la adresele respective instruciuni care apeleaz procedurile create special pentru fiecare ntrerupere:jmpRESET jmp EXTJNTO jmp EXTJNT1 jmp EXTJNT2 jmp TIM2_COMP jmp TIM2_OVF jmp TIM1_CAPT

jmp TIMljOOMPA jmp TIMl_COMPB jmp TIMl_OVF jmp TIMO_COMP jmp TIMOjOVF jmp SPI_STC jmp USART_RXC jmp USARTJJDRE jmp USART_TXC jmpADC jmp EE_RDY jmp ANA_COMP jmp TWI jmp SPM_RDY RESET:Idi rl6,high (RAMEND) ou SPH,rl6 Idi r 16, low (RAMEND) oul SPL,r 16Dac una din ntreruperi nu este utilizat se recomand ca pe poziia acesteia s se introduc o instruciune de salt ctre eticheta RESET.Primele patru instruciuni care apar dup eticheta RESET sunt utilizate pentru a iniializa pointer-ul de stiv definit de registrele SPH i SPL.2. Setul de instruciuniReadiWne In lia Va jeATmega32 dispune de un registru special de stare ai crui bii ofer informaii despre rezultatul ultimei instruciuni aritmetice sau logice executate. Componena registrului de stare este prezentat n Figura 2.BitTHSVNZ

R.'WaRJW 0RAY 0R.'W DR'WDRiWR.'W SREGR.'W G

Figura 2. Registrul de stareRegistrul de stare SREG conine urmtorii bii: bitul 7 - activare/dezactivare global ntreruperiAcest bit trebuie s aib valoarea 1" pentru a permite execuia oricrei ntreruperi. Dac are valoarea 0" orice surs de ntrerupere este dezactivat. bitul 6 - bit de copiere bitul 5 - indicator de transport la jumtate bitul 4 - indicator de semn bitul 3 - indicator de depire n cazul operaiilor n complement fa de doi bitul 2 - indicator de rezultat negativ bitul 1 - indicator de zeroAcest bit devine 1" dac rezultatul unei operaii aritmetice sau logice a fost zero.

bitul O - indicator de transportAcest bit devine 1" n cazul unei depiri la operaii pe 8 bii. ATmega32 dispune de un set de 131 de instruciuni grupate n mai multe categorii ce vor fi prezentate n continuare.2.1. Instruciuni aritmetice i logiceCele mai uzuale instruciuni aritmetice i logice sunt: ADD Rd,RrEfectul: se adun coninutul registrului Rd cu cel al registrului Rr i rezultatul se pune n Rd. ADC Rd,RrEfectul: se adun coninutul registrului Rd cu cel al registrului Rr i cu indicatorul de transport i rezultatul se pune n Rd. SUB Rd,RrEfectul: se scade coninutul registrului Rr din cel al registrului Rd i rezultatul se pune n Rd. AND Rd,RrEfectul: se face I logic" ntre coninutul registrului Rd i cel al registrului Rr iar rezultatul se pune n Rd. INC RdEfectul: incrementeaz coninutul registrului Rd i pune rezultatul n Rd. DEC RdEfectul: decrementeaz coninutul registrului Rd i pune rezultatul n Rd.2.2. Instruciuni de saltCele mai uzuale instruciuni de salt sunt: JMPkEfectul: se face salt necondiionat cu k" poziii fa de adresa curent din memoria program. Instruciunea se poate utiliza i n forma JMP etichet". RCALL subrutinEfectul: se apeleaz o subrutin. Pentru a reveni din aceasta se utilizeaz instruciunea RET. RETIEfectul: se revenire dintr-o subrutin de tratare a unei ntreruperi. CPSE Rd,RrEfectul: se compar valorile regitrilor Rd i Rr i n caz de egalitate instruciunea imediat urmtoare nu se mai execut. CP Rd,RrEfectul: compar valorile regitrilor Rd i Rr iar s modifice coninutul acestora. Ca urmare a execuiei acestei instruciuni se vor schimba corespunztor biii registrului de stare. SBRC Rd,bEfectul: dac bitul b din registrul Rd are valoarea 0" instruciunea imediat urmtoare nu se mai execut. SBRS Rd,bEfectul: dac bitul b din registrul Rd are valoarea 1" instruciunea imediat urmtoare nu se mai execut. SBIC P,bEfectul: dac bitul b din registrul de intrare/ieire P are valoarea 0" instruciunea imediat urmtoare nu se mai execut. SBIS P,bEfectul: dac bitul b din registrul de intrare/ieire P are valoarea 1" instruciunea imediat urmtoare nu se mai execut. BREQ etichetEfectul: dac indicatorul Z are valoarea 1" se face salt la etichet.2.3. Instruciuni de transferCele mai uzuale instruciuni de transfer sunt: MOV Rd,RrEfectul: copiaz coninutul registrului Rr n registrul Rd. LDI Rd,kEfectul: copiaz valoarea k n registrul Rd. Aceast instruciune lucreaz numai cu registrele rl 6 - r31. IN Rd,PEfectul: copiaz coninutul registrului de intrare/ieire P n registrul Rd. OUT P,RrEfectul: copiaz coninutul registrului Rr n registrul de intrare/ieire P.2.4. Instruciuni care lucreaz la nivel de bitCele mai uzuale instruciuni care lucreaz la nivel de bit sunt: SBI P,bEfectul: bitul b din registrul de intrare/ieire P ia valoarea 1". Instruciunea se poate utiliza numai pentru regitri P situai la adresele de memorie 20h - 3Fh. CBI P,bEfectul: bitul b din registrul de intrare/ieire P ia valoarea 0". Instruciunea se poate utiliza numai pentru regitri P situai la adresele de memorie 20h - 3Fh. LSL RdEfectul: Registrul Rd este deplasat logic la stnga cu o poziie. ROR RdEfectul: Registrul Rd este rotit la dreapta cu o poziie prin bitul indicator de transport.2.5. Instruciuni speciale Instruciunile speciale sunt: NOP SLEEP WDR3. Porturile ATmega323.1. Prezentare generalATmega32 dispune de 32 de linii de I/O grupate n patru porturi de 8 bii. Porturile sunt denumite cu literele A, B, C i D. Fiecare pin al oricrui port se poate seta individual ca intrare sau ieire iar s afecteze ceilali pini. In plus, anumii pinise pot utiliza pentru funcii speciale ale micro controlerului. In Figura 3 este prezentat structura general a unui pin.Toi cei 32 de pini au fiecare cte o rezisten pull-up" care poate fi activat sau dezactivat.ha RpuPotFigura 3. Structura general a unui pinOperaiile cu porturile se fac prin intermediul unui set de patru regitri alocai fiecrui port: PORTx, PINx i DDRx; x poate fi A, B, C sau D. Aceti regitri fac parte din categoria regitri de intrare/ieire de aceea instruciunile care pot lucra direct cu ei sunt CBI, SBI, IN i OUT.Regitrii DDRx stabilesc dac un pin este intrare sau ieire. Astfel, un bit cu valoarea 1" n registrul DDRx face ca pinul corespunztor s fie considerat ieire; altfel pinul va fi intrare.Regitrii PORTx sunt utilizai pentru a scrie o valoare n portul corespunztor iar regitrii PINx se folosesc pentru a citi valoarea prezent pe pinii unui port.Activarea sau dezactivarea rezistenelor pull-up" este determinat de bitul PUD din registrul SFIOR i de valorile regitrilor PORTx i DDRx aa cum se poate observa n tabelul urmtor.Bitul din DDRxBitul din PORTxBitul PUDTipul pinuluiRezisten pull-up

00nu conteazintrareinactiv

010*intrareactiv

011intrareinactiv

10nu conteazieireinactiv

11nu conteazieireinactiv

Valoare implicit

3.2. Prezentare general a mediului software Atmel StudioAtmel Studio este un mediu software dezvoltat de Atmel pentru scrierea n limbaj de asamblare sau C/C++, compilarea i simularea de programe destinate microcontrolerelor produse de aceast companie.Orice program scris n Atmel Studio este coninut ntr-o structur de tip proiect. Paii care trebuie urmai pentru a crea un program nou sunt:- dup lansarea programului, apare o fereastr similar cu cea din Figura 4.L_JLJ

'irr Vflfi" - AtmpJ itiidi- fic Edit Vcu> VAssr.* ASF Projzct ?:bug Tools Wrdow help: 'br n* :i Vr - . . : KJJ . I . -wLJ] Ncwrrfcijccl-Nn lynm r Pr>(*+ ..[5j OnmPi^ia... R;::;mI Pmjisl'[S /'.IV l.ltfAfij ilcliuril 3 i n*-p-g^ iftiT-f-jert lord 71 Show p=ge :n rtartupg2t-Drt2d TmjIs HhI|] I h h-I Npw,'. V/plonmfr link: arrWcIcoti to Atmel E:udioGetto krcwA:"-:l tudioSe va alege opiunea New Project";OutputT *

I Show outpu:''?".:IIMll

fjeh nq i-tsrted P'cgrammrg Dia og FAO>VAic* "g VA Ciulin:>> S: ution E>:.

Figura 4. Fereastra de dialog primar din Atmel Studio- n acest moment se va afia o fereastr asemntoare cu cea din Figura 5. Se selecteaz ca Template Assembler" i apoi AVR Assembler Project" i se bifeaz opiunea Create directory for solution". Apoi se completeaz cmpurile Name" i Location" i se apas butonul OK";New Projectrr

Recent TemplatesSort by: I DefaultSearch Installed TemplatesInstalled TemplatesC/O*AssemblerAtmel Studio SolutionType: AssemblerCreates an AVR 8-bit Assembler projectAVR Assembler ProjectAssembler

>HI

Name:AssemblerApplicationl

location:C:\Program Files (*86)\Atmer\Atmel Studio 6.2\ Browse...

Solution name:AssemblerApplicationl[y Create directory for solution

OK 1 Cancel

rHI Search for deviceDevice Info:Oevice Name: ATmeqa32 Speed:0Vcc:2,7/5.5Family:megaAVRDatasheetsSupported Tools Atmel-ICEV AVR Dragon AVRISP mkllf AVR ONE!3 JTAGICE3 JTAGICE mkll% SimulatorTSTK500STK600Figura 5. Fereastra de dialog pentru denumirea proiectului (solution)din fereastra care apare se selecteaz din list modelul de microcontroler n cazul acestui laborator ATmega 32" i n final se apas butonul OK";Device SelectionNameApp./Boot Memory (Kbytes)Data Memory (bytes)EEPROM (b;

ATmegal69PA161024512*

ATmega 16A161024512

ATmegalHVA16512256

ATmegal6HVB161024512

ATmegal6HVBrevB 161024512

ATmegal6Ml161024512

ATmegal6U216512512

ATmegal6U4161280512

ATmega256025681924096

ATmega256125681924096

ATmega2564RFR2256327688192

ATmega256RFR2256327688192

I ATmega323220481024

ATmega324A3220481024

ATmega324P322041024

ATmega324PA322041024

ATmega325322041024

ATmega3250322041024

T -t~\rr\ * n

in 1

Device Family:Ail

Figura 6. Alegerea tipului de controler utilizat ntr-un proiect

nainte de a scrie programul propriu-zis, se introduce urmtoarea linie:.include ,,m32def.inc" Aceast linie este o directiv de compilare care indic numele fiierului ce conine descrierea regitrilor i caracteristicilor microcontrolerului. dup scrierea programului, se aleg opiunile Save AH" din meniul File" i apoi Build Solution" din meniul Build". Orice erori de sintax vor fi semnalate de compilator. Acestea trebuie corectate i apoi se vor repeta paii anteriori.pentru a scrie un nou program, din meniul File" se va alege opiunea New Project" i apoi se vor repeta paii prezentai mai sus.3.3. Programarea microcontrolerlorfolosind software-ul A VRFLASH"AVRFLASH este un program oferit mpreun cu placa de dezvoltare EasyAVRv7 care permite programarea unei game largi de microcontrolere utilizndaaceast plac conectat la calculator prin intermediul interfeei USB. nainte de orice operaie se va specifica prin intermediul opiunii Device" tipul de microcontroler programat.Pentru orice microcontroler trebuie programate dou elemente distincte: biii de configurare i programul propriu-zis.Aa cum se poate vedea n Figura 7, biii de configurare sunt disponibili n zona central a ferestrei programului AVRFLASH. Valorile acestor bii se stabilesc/V

Selectarea tipului de microcontrolerSelectarea frecvenei microcontroleruluipe baza datelor de catalog. In cadrul laboratorului nu se vor modifica valorile acestor bii.mikroElektronika - AVRFLASH [ v2.14 ]File Device Buffer Windows USB About HistoryI Mode 1 3 IbLBO Mode 1|bLB1 Mode 1

Selectarea tipului de semnal de tactNo memory lock features enabled.FUSE Bitsf OCDEN JTAGENV SPI Enable r CKOPT f EESAVE BOOTRSTExternal ClockCOOE Size: 32 K DATA Size: 1024 Bytes"31|BOD DisabledStartup: 6 CK + 65ms I Boot block 2048 WordsType: Unknown Device Status: IdleReadWrite

VerifyErase

CODEDATA

Load ^Load

Reload

SaveSave

CODEDATA

OptionsProgress:

0%Butonul care comand scrierea codului n microcontrolerButonul care permite selectarea codului surs

CODE HEX File: D:\DOCUMENTE\FlLE.HEX DATA HEX File: Device: ATmega32Figura 7. Fereastra programului AVRFLASHScrierea programului propriu-zis presupune urmtorii pai: se asigur conectarea plcii de dezvoltare la calculator - ledul Link trebuie s fie aprins; la opiunea Device" se alege ATmega32" iar la opiunea Device frequency [MHz]" se alege valoarea 8; se selecteaz opiunea Externai Clock" pentru semnalul de tact al microcontro Ierului; se deschide fiierul care conine codul: se apas butonul Load" din cadrul grupului de butoane numit Flash" i se identific fiierul .hex" corespunztor. Acest tip de fiier este generat automat de AVRStudio dup compilarea cu succes, fr erori, a unui program. se apas butonul Write" i se ateapt finalizarea operaiei urmrind indicatorul Progress" din partea inferioar a programului.3.4. Placa de dezvoltare EasyA VRv7EasyAVRv7 este o plac de dezvoltare produs de firma Mikroelectronika i permite realizarea de aplicaii cu micro controlere Atmel.Placa dispune de urmtoarele resurse hardware principale: programator cu interfa USB; bloc de alimentare a plcii cu posibilitatea de a utiliza o surs de tensiune extern sau tensiunea furnizat de interfaa USB; socluri pentru conectarea micro controlerelor Atmel n capsule DIP40, DIP28, DIP18, DIP20, DIP14 sau DIP8; SW pushbuton conectate la toate porturile microcontrolerului; LED-uri conectate la toate porturile microcontrolerului; rezistene externe de pull-up sau pull-down pentru fiecare pin al fiecrui port. Prin intermediul unor micro-comutatoare aceste rezistene pot fi conectate sau deconectate de pe pini, pentru fiecare pin individual. generator de tensiune pentru diferite canale ale modulului ADC din microcontroler generator de semnal de tact cu frecvena de 8MHz; modul de afiare cu LED-uri tip 7 segmente; interfa serial RS232 cu modul harware de conversie de la RS232 la USB; senzor de temperatur DS1820 cu interfa One-wire; modul de afiare LCD 2x16 caractere.Sunt disponibile pentru interfaarea cu alte blocuri suplimentare toate porturile microcontrolerului cu ajutorul unor conectori.Schema blocului de LED-uri i push-butoane este prezentat n figura de mai jos. Se observ c pentru fiecare port se pot dezactiva LED-urile corespunztoare iar pentru aprinderea unui LED este nevoie ca pinul respectiv s aib valoarea 1 logic. De asemenea se poate selecta, pentru fiecare port, nivelul de tensiune la care este conectat pinul n momentul cnd se apas pe push-buton cu urmtoarele opiuni: mas (GND), +5V sau liber/deconectat.

si tio al t11 a m l tu al tu al ie ii tu Si ti?L L 1*^1 L L 1-^*1 L L s^a -L s^si SL t~*I4. Exemple de programe

l n y IIJ: nilJ m LUi 230 BUTTON PRES5 LEVEL DU 230poitrajjvB-;

irtt^iiiin tmf rpiis nmu) rpw rhmm nwta nwtn ni Uuk Ui Unic Um* Ui Uiok Uiac UiUJ_ CNUEHa) S se scrie un program care menine aprinse doar led-urile PAO i PA7 i le stinge la fiecare apsare a pushbuton-ului corespunztor de pe portul D. Se va asigura c apsarea butonului determin conectarea pinului la potenialul GND.

Setare porturi

Aprinde PAO i PA7

.include "m32def.inc"jmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetreset:ldi rl 6,high(RAMEND)out SPH,rl6ldi rl6,low(RAMEND)out SPL,rl6ldi rl6,0b00000000out DDRD,rl6 ; portul D este setat ca intrare ldi rl6,0bl 1111111out PORTD,rl6 ; se activeaza rezistentele pull-up pentru toti pinii portului D ldi rl 6,0bl 1111111out DDRA,rl 6 ; portul A, unde sunt conectate led-urile, este setat ca ieire main:ldi rl7,0b00000000in rl 6,PIND ; se citesc pushbutoanelesbrc rl6,PD0 ; s-a apasat butonul corespunztor led-ului PAO ?ldi rl 7,0b00000001 ; nu s-a apasat deci led-ul PAO trebuie sa fie aprinsout PORTAjl ?ldi rl7,0b00000000inrl6,PINDsbrc rl6,PD7 ; s-a apasat butonul corespunztor led-ului PA7 ?ldi rl 7,0bl 0000000 ; nu s-a apasat deci led-ul PA7 trebuie sa fie aprinsout PORTA,r 17jmp mainS se scrie un program care aprinde unul din ledurile portului A corespunztor valorii binare creat de primele 2 butoane PD0 - PD1 ai portului D, considernd PD0 LSB. Ledul 0 se consider PAO. Se va asigura c apsarea butonului determin conectarea pinului la potenialul GND.

.include "m32def.inc"jmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset reset:ldi rl 6,high(RAMEND)out SPH,rl6ldi rl 6,low(RAMEND)out SPL,rl6ldi rl6,0b00000000out DDRD,rl6 ; portul D este setat ca intrare ldi rl6,0bl 1111111out PORTD,rl6 ; se activeaza rezistentele pull-up pentru toti pinii portului D ldi rl6,0bl 1111111out DDRA,rl 6; portul A, unde sunt conectate led-urile, este setat ca ieire main:in rl 6,PIND ; se citesc pushbutoaneleandi rl 6,0b00000011 ;se izoleaza doar valorile de pe primele 2 butoane ldi rl 7,0x00cp rl 6,rl7 ;configuratia butoanelor corespunde valorii 0 ?bme et 1;nu, se merge mai departeldi rl 8,0b00000001 ;da, se va aprinde led-ul PAOout PORTA,rl8jmp mainetl:ldi rl 7,0x01 cp rl6,rl7 bme et2ldi rl8,0b00000010 out PORTA,r 18 jmp main et2:ldi rl 7,0x02 cp rl6,rl7 bme et3ldi rl8,0b00000100 out PORTA,r 18 et3:ldi rl 7,0x03 cp rl6,rl7 bme et4ldi rl8,0b00001000 out PORTA,rl8 et4:jmp mainc) S se scrie un program care deplaseaz n mod automat ledul aprins de pe portul A cu o poziie ctre stnga i se oprete la apsarea butonului PDO. Ledul 0 se consider PAO. Se va asigura c apsarea butonului determin conectarea pinului la potenialul GND.

.include "m32definc"jmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp resetjmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset jmp reset reset:ldi rl6,high(RAMEND) out SPH,rl6 ldi rl6,low(RAMEND) out SPL,rl6 ldi rl6,0b00000000 out DDRD,rl6 ldi rl6,0bl 1111111 out PORTD,rl6 ldi rl6,0bl 1111111 out DDRA,rl6 ldi rl7,0b00000001 out PORTA,rl 7 clc main:ldi rl8,0xFF ldi rl9,0xFF ldi r20,0x13 bucla: dec rl8 brne bucla ldi rl8,0xFF dec rl9 brne bucla ldi rl9,0xFF dec r20 brne bucla rol rl7out PORTA,rl7 inrl6,PIND sbrc rl6,PD0 jmp main Idirl7,0b00000001 out PORTA,rl7 end:;initial se aprinde ledul PAO ;idicatorul carry se face 0jegistni rl8,rl9 si r20 sunt utilizati pentru a crea o temporizare;dupa terminarea temporizrii se face o rotatie ctre stanga prin carry ;se scrie noua valoare la leduri;am apasat butonul PDO ?;nu, se cotinua deplasarea ledului aprins;da, aprind ledul PAO si ma oprescjmp endTeme i exerciiiS se scrie un program care aprinde toate LED-urile portului B, mai puin cel corespunztor numrului butonului apsat pe portul A (se va alege acest buton). Observaie: butoanele i LED-urile se numeroteaz corespunztor valorii pinului pe care sunt conectate.S se scrie un program care adun dou valori de 8 bii i aprinde ledurile portului D astfel nct acestea s reflecte reprezentarea binar a rezultatului. Observaie: butoanele i LED-urile se numeroteaz corespunztor valorii pinului pe care sunt conectate.S se scrie un program care deplaseaz n mod automat ledul aprins al portului B cu o poziie ctre dreapta i se oprete la apsarea butonului PC3; n acest moment se va aprinde ledul 3 considernd c ledul 0 este PBO.Laborator Microcontrolere

Lucrarea 2Microcontrolerul ATmega32. Utilizarea modulelor timer

Scopul lucrriia) Prezentarea modulului Timer/CounterO pe 8 biib) Prezentarea modulului timer pe 16 biic) Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVRv71. Noiuni generale privind sistemul de ntreruperiMicrocontrolerul ATmega32 dispune de mai multe tipuri de module hardware care pot funciona independent de unitatea central utiliznd sistemul de ntreruperi. Astfel, dup ce un modul termin activitatea pe care trebuie s o realizeze, genereaz o ntrerupere pentru a avertiza procesorul c este pregtit s execute o nou sarcin. Ca exemple de module hardware se pot meniona: dou numrtoare (timere) de 8 bii i un numrtor (timer) de 16 bii modul de comunicaie serial pe dou fire TWI modul de comunicaie serial USART convertor analog - digital comparator analogic.Tabela de ntreruperi se plaseaz de obicei la nceputul zonei de memorie flash.AIn cazul microcontrolerului ATmega32, fiecare linie din tabela de ntreruperi ocup dou locaii de memorie. Aceast structur permite utilizarea instruciunii jmp pentru saltul ctre rutina de tratare a ntreruperii. Instruciunea jmp, spre deosebire de rjmp, ocup un numr dublu de bii (32) i ofer posibilitatea de a accesa orice zon din cei 32KB de memorie flash ai microcontrolerului ATmega32. Cea mai uzual amplasare a ntreruperilor este descris n tabelul de mai jos.Nr. crt.Adresa n memoria FlashDescriere

10x00Generat la alimentare sau la un semnal pe pinul RESET

20x02ntrerupere extern 0

30x04ntrerupere extern 1

40x06ntrerupere extern 2

50x08Generat cnd Timer/Counter2 atinge valoarea de prag

6OxOAGenerat cnd Timer/Counter2 atinge valoarea maxim

7OxOCGenerat de unitatea de captur a timerului pe 16 bii

8OxOEGenerat cnd timerul pe 16 bii atinge valoarea de prag A

90x10Generat cnd timerul pe 16 bii atinge valoarea de prag B

100x12Generat cnd timerul pe 16 bii atinge valoarea maxim

110x14Generat cnd Timer/CounterO atinge valoarea de prag

120x16Generat cnd Timer/CounterO atinge valoarea maxim

130x18Generat de unitatea SPI

14OxlAGenerat la recepia complet a unor date de ctre modulul USART

150x1 CGenerat cnd registrul de date al modulului USART este gol

16OxlEGenerat la transmisia complet a unor date de ctre modulul USART

170x20Generat de modulul ADC

180x22Generat de modulul EEPROM

190x24Generat de comparatorul analogic

200x26Generat de modulul TWI

210x28Generat de modulul de auto-scriere a memoriei Flash

Pentru orice surs de ntrerupere, exist un bit specific de activare/dezactivare./VIn afar de biii specifici, toate ntreruperile sunt controlate de bitul I din registrul de stare. Astfel, dac acest bit este 0, nu se va executa nici o ntrerupere, indiferent de setarea biilor individuali. Bitul I se poate face 0 cu instruciunea cli i 1 cu instruciunea sei./VIn rutina de tratare a ntreruperii, utilizatorul trebuie s salveze de la nceput registrul de stare SREG i apoi s l restaureze la sfritul rutinei. De asemenea, ieirea din rutina de tratare a ntreruperii se face cu instruciunea reti.Un exemplu tipic de rutin pentru ntreruperi este prezentat mai jos:intrerupere:in r20, SREG ; salvarea registrului de stare in r20out SREG, r20 ; restaurarea registrului de stare din r20 reti2. Modulul Timer/CounterO pe 8 biiModulul Timer/CounterO pe 8 bii poate fi utilizat pentru realizarea de/Vtemporizri, numrarea evenimentelor externe sau generarea de forme de und. In Figura 1 este prezentat schema bloc a modulului timer. Dintre cele mai importante caracteristici se pot meniona: un prag independent de comparaie poate numra impulsuri externe posibilitate de auto-iniializare posibilitate de generare facil a semnalelor Puise Width Modulation (PWM)

Figura 1. Schema bloc a modulului Timer/CounterO pe 8 biiRegitrii alocai acestui timer pot fi mprii n trei mari categorii: registrul de numrare: TCNTO pragul de comparaie: OCRO comand i control: TCCRO, TIMSK i TIFRConinutul regitrilor de comand i control este prezentat n Figura 2.rFOCOtfGMOOCOMOICOM 00WGM01CS02CS01CSOO1TCCRO

7e54321c

iOC!E2TOIE2TIC IEOCIE1AOCIE1BTOI ElOCIEOTOIEO|TIMSK

7efi43210

iOCF2TOV2IC K1OCF1AOCMBTOV1OCFOTOVO1TIFR

Figura 2. Coninutul regitrilor de comand i control ai Timer/CounterO

Modurile principale de funcionare ale Timer/CounterO sunt: funcionare normal re-iniializare la atingerea valorii de prag (CTC)

TC.,1 (Irrt.Req.)mXti Int P jq.)Wf"=iform Sa rationOCn

semnal PWM rapid semnal PWM corect n fazBiii care selecteaz modul de funcionare se regsesc n registrul TCCRO. Rezultatul posibilelor combinaii ale acestora este dat n Figura 3.

ModeWGM01 (CTCO)WGMOO (PWMO)Timer/Counter Mode of OperationTOPUpdate of OCROTOVO Flag Set-on

000NormalOxFFImmediateMAX

101PWM, Phase CorrectOxFFTOPBOTTOM

210CTCOCROImmediateMAX

311Fast PWMOxFFBOTTOMMAX

Figura 3. Setarea modului de funcionare al Timer/CounterO

Toate modurile de funcionare se bazeaz pe incrementarea sau decrementarea automat a registrului de numrare TCNTO. Frecvena de incrementare/decrementare este controlat de combinaia biilor CS02, CS01, CSOO din registrul TCCRO conform tabelului de mai jos (cu fosc s-a notat frecvena ceasului microcontrolerului).CS02CS01CSOOFrecvena de inc/dec

000timer oprit

001f /1^osc' 1

010fosc/8

011fosc/64

100fosc/256

101fosc/1024

110frecvena semnalului de pe pinul TO, frontul descendent

111frecvena semnalului de pe pinul TO, frontul ascendent

^^/VUnitatea timer compar n permanen valoarea TCNTO cu OCRO. In modurile de funcionare normal i re-iniializare la atingerea valorii de prag, valoarea 1 a bitul OCIEO din registrul TIMSK determin generarea unei ntreruperi cnd TCNTO atinge valoarea registrului de prag OCRO./V_In vederea utilizrii timerului Timer/CounterO, programatorul trebuie s prevad o secven iniial de cod pentru setarea parametrilor de funcionare. Aceast secven trebuie s cuprind cel puin urmtorii pai: dezactivarea global a ntreruperilor (folosind cli); setarea porturilor ce urmeaz a fi folosite, dac este cazul; alegerea modului de funcionare dorit prin modificarea biilor corespunztori din registrul de control. Se va avea n vedere s nu se porneasc timerul. iniializarea cu o valoarea a registrului de numrare i/sau a pragului, dac este cazul; activarea ntreruperilor dorite prin modificarea biilor corespunztori din registrul TIMSK. Se va avea n vedere s nu se modifice biii corespunztori altui modul timer. pornirea timerului la frecvena dorit, avnd n vedere s nu se modifice valoarea altor bii din registrul de control;

- activarea global a ntreruperilor folosind sei, dac este cazul.2.1. Modul de funcionare normal/V_^In acest mod valoarea TCNTO este incrementat continuu la fiecare tact de numrare. Cnd se atinge valoarea maxim reprezentabil pe 8 bii, TCNTO ia valoarea 0 i apoi continu s numere.Dac bitul TOIEO din registrul TIMSK are valoarea 1, se va genera o ntrerupere cnd se atinge valoarea maxim reprezentabil pe 8 bii.2.2. Modul de funcionare cu re-iniializare la atingerea valorii de prag (CTC)/V_^In acest mod valoarea TCNTO este incrementat la fiecare tact de numrare/V_^pn cnd devine egal cu OCRO. In acest moment, TCNTO se re-iniializeaz cu 0 i numrtoarea rencepe.n funcie de valorile biilor COMOl i COMOO din registrul TCCRO (Figura 4), este posibil s se programeze modificarea nivelului logic al pinului OCO cnd^^/VTCNTO atinge valoarea registrului de prag OCRO. In acest caz pinul trebuie setat ca ieire. COMOlCOMOODescription

00Normal port operation, OCO disconnected.

01Toggle OCO on compare match

10Clear OCO on compare match

11Set OCO on compare match

Figura 4. Efectul combinaiilor posibile ale biilor COMOl i COMOO

2.3. Modul de funcionare semnal PWM rapid/V_^In acest mod de funcionare, TCNTO este incrementat pn atinge valoarea/V_^OxFF. In acest moment se iniializeaz TCNTO cu 0 i se reia numrtoarea.Valoarea logic a pinului OCO se modific numai cnd TCNTO este egal cu o valoare de prag i cnd ajunge la valoarea 0, aa cum se poate vedea n Figura 5./VyOCn OCn(COMnliO - 2) (COMnliO - 3)j~L_ru in_Period |i1 -Jf2 _|94+5+67>|Figura 5. Modul de funcionare semnal PWM rapidIn acest mod de funcionare utilizatorul poate modifica oricnd valoarea de prag deoarece ea nu va fi transferat n modulul timer dect dup ce TCNTO a realizat un ciclu complet de numrare.ccRn interrupt nag setCCRn Update and TOVn Inteirupt Rag Sety2.4. Modul de funcionare semnal PWM corect n faz/V_^In acest mod de funcionare TCNTO este incrementat pn atinge valoarea/V_^OxFF. In acest moment TCNTO ncepe s fie decrementat pn ajunge la 0 dup care se reia ciclul.Valoarea logic a pinului OCO se modific numai cnd TCNTO este egal cu valoarea de prag n timp ce crete i apoi n timp ce descrete, aa cum se poate vedea n Figura 6./VIn acest mod de funcionare utilizatorul poate modifica oricnd valoarea de prag deoarece ea nu va fi transferat n modulul timer dect dup ce TCNTO a realizat un ciclu complet de numrare.OCn Interrupt Flag SetOCfln UpdateTOVn Interrupt Flag Set

Period|J*2Jf3>|Figura 6. Modul de funcionare semnal PWM corect n faz3. Modulul timer pe 16 biiModulul timer pe 16 bii poate fi utilizat pentru realizarea de temporizri,/Vnumrarea evenimentelor externe sau generarea de forme de und. In Figura 7 este prezentat schema bloc a modulului timer. Dintre cele mai importante caracteristici se pot meniona: lucreaz cu registre de 16 bii dou praguri independente de comparaie unitate de captur evenimente posibilitate de auto-iniializare posibilitate de generare facil a semnalelor Puise Width Modulation (PWM)CountlOY(Intrteq.JCbck SelectClear DirectionControl Ld[ jok

/ITnEdge J ctor

CP BOTTOM

Timer, Counier i ( From Pnaacr'Br)

= 0TCHTn

iCnA"(IntReq.)VtoreturmOCiA

ane re on

O " fJz\IkX-UtRnATOP Valu?-f IL.I-OCknfl-ICFn (IntHsq.)

iQ"(IrrtReq.;W . mOTnB

S jrib ration

( crom Ar -, Competitor (Xput

/IcaoDetectorNoiae CancelarICUn

ICPn

TCCBnB7CCiAFigura 7. Schema bloc a modulului timer pe 16 biiRegitrii alocai acestui timer pot fi mprii n trei mari categorii: registrul de numrare: TCNT1H i TCNT1L praguri de comparaie: OCR1AL i OCR1AH, OCR1BL i OCR1BH, ICR1H i ICR1L comand i control: TCCR1A, TCCR1B, TIMSK i TIFRConinutul regitrilor de comand i control este prezentat n Figura 8.

[]COMTA1 C0M1 AO COM 181 COM _C F0C1A FOC1B WGM1 WGM 0 ' T f=lkHzin rl6,TCCROandi rl6,OblllllOOO;se pornete timerul si este setat sa numereori rl6,ObOOOOOOll;la fiecare 64 perioade de ceas, fara a modifica alti bitiout TCCRO,rl6seibucla: rjmp bucla

refresh: in r20,SREG out PORTA,mux ldi rl6,0b00001000 cp mux,rl6 brne PC+3 mov rl7,digitl rjmp refresh_out ldi rl6,0b00000100 cp mux,rl6 brne PC+3 mov rl7,digit2 rjmp refresh_out ldi rl6,0b00000010 cp mux,rl6 brne PC+3 mov rl7,digit3 rjmp refresh_out mov rl7,digit4 refresh_out: ldi ZH,high(2*cifre) ldi ZL,low(2*cifre) ldi tempi,0x00 add ZL,rl7 adc ZH,tempi lpm tempi,Z ldi rl6,0b00000010 cp mux,rl6 brne PC+2ori tempi,0bl0000000 out PORTC,tempi lsr mux ldi rl6,0x00 cp mux,rl6 brne PC+3 ldi rl6,0b00001000 mov mux,rl6 out SREG,r20 reticitire_temp: in r20,SREG call wire_reset ldi temp,OxCC/comanda "skip ROM"call wire_write/trimite la DS1820 continutul registrului templdi temp,0x44/comanda de iniiere conversiecall wire_writecbi wirectrl,wirepintemp_wait:sbis wirein,wirepin/atept sa termine conversiarjmp temp_waitcall wire_reset/a terminat conversia, voi citi rezultatul/se selecteaza digitul corespunztor/se incarca cifra corespunztoare /digitului selectatse identifica codulcorespunztor cifrei /alesezpentrul digitul 3/trebuie sa aprind si virgula/in templ este codul corespunztor cifrei selectate /se pregtete selecia urmtorului digitldi temp,OxCC

:comanda de citire scratchpadrse citete in registrul temp primul octet din scratchpad :care este octetul inf al conversiei;se extrage in carry bitul indicator de 1/2 gradrdigitul 4 (cel mai din dreapta) afiseaza 1/2 gradpe baza rezultatului conversieicall wire_write ldi temp,OxBE call wire_write call wire_read call wire_resetldi rl7,0x00 lsr temp brcc PC+2 ldi rl7,0x05 mov digit4,rl7ldi rl6,0x00 mov digitl,rl6 mov digit2,rl6 mov digit3,rl6 temp_buclal: inc digit3 ldi rl6,OxOA cp digit3,rl6 brne buclal_next clr digit3 inc digit2 ldi rl6,OxOA cp digit2,rl6 brne PC+3 clr digit2 inc digitl buclal_next: dec temp breq PC+2 rjmp temp_buclal out SREG,r20 retise calculeaza cele 3 cifre zecimale care se vor afia

wire_reset: sbi wirectrl,wirepin cbi wireport,wirepin clildi rl6,34 ldi temp2,10 wr_loopl:_lusdec temp2 brne wr_loopl ldi temp2,10 dec rl6//34 * 113 cicluri * 0,125us//8 cicluri //I ciclu//2 cicluri la salt inapoi; 1 ciclu altfel //I ciclu480us//I ciclu

brne wr_loopl//2 cicluri la salt inapoi; 1 ciclu altfel cbi wirectrl,wirepin//2 cicluri//70,5us410us1 ciclu altfel1 ciclu altfel//se verifica daca senzorul a rspuns //senzorul nu a rspuns,aprind un led //senzorul a rspuns,sting ledul//29 * 113 cicluri * 0,125us//8 cicluri //I ciclubrne wr_loop3//2 cicluri la salt inapoi; ldi temp2,10 //I ciclu dec rl6//I ciclubrne wr_loop3//2 cicluri la salt inapoi;ldi rl6,50 wr_loop2:_lus dec rl6 brne wr_loop2 sbis wirein,wirepin rjmp PC+3 sbi PORTD,0 rjmp PC+2 cbi PORTD,0ldi rl6,29 ldi temp2,10 wr_loop3:_lusdec temp2sei ret

wire_write: clildi temp2,0x08 ww_sendl:Isr temp brcs PC+2 rjmp wwO wwrite_l rjmp ww_nextbit wwO: wwrite_0 ww_nextbit: dec temp2 breq PC+2 rjmp ww_sendl sei retwire_read: clildi temp2,0x08 wr_getl:sbi wirectrl,wirepincbi wireport,wirepin_lus_lus_lus_lus_lus_lus_luscbi wirectrl,wirepin_lus_lus_lus_lus_lus_lus_lus_lus_lussec//lciclu ; presupun ca am primit 1sbis wirein,wirepinclcror temp;in temp se va memora octetul primitldi rl6,50 //50 * 11 * 0,125us =~ 68.75us wre_loopl: _lus dec rl6brne wre_loopl dec temp2 breq PC+2 rjmp wr_getl sei ret