Sunteți pe pagina 1din 14

Laborator Microcontrolere

Lucrarea 1
Microcontrolerul ATmega16. Utilizarea porturilor



Scopul lucrrii

a) Noiuni generale despre ATmega16
b) Setul de instruciuni al ATmega16
c) Porturile ATmega16 i exemple de utilizare
d) Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVR4


1. Noiuni generale

ATmega16 este un microcontroler RISC pe 8 bii realizat de firma Atmel.
Caracteristicile principale ale acestuia sunt:
- 16KB de memorie Flash reinscriptibil pentru stocarea codului
- 1KB de memorie RAM
- 512B 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 Harvad i permite controlerului s execute instruciunile
foarte rapid.
2

Figura 1. Structura bloc general a microcontrolerului ATmega16

ATmega16 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
0000h 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.
ATmega16 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:
jmp RESET
jmp EXT_INT0
jmp EXT_INT1
jmp TIM2_COMP
jmp TIM2_OVF
jmp TIM1_CAPT
jmp TIM1_COMPA
3
jmp TIM1_COMPB
jmp TIM1_OVF
jmp TIM0_OVF
jmp SPI_STC
jmp USART_RXC
jmp USART_UDRE
jmp USART_TXC
jmp ADC
jmp EE_RDY
jmp ANA_COMP
jmp TWSI
jmp INT2
jmp TIM0_COMP
jmp SPM_RDY
RESET:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16

Dac 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 instruciuni

ATmega16 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.

Figura 2. Registrul de stare

Registrul de stare SREG conine urmtorii bii:
- bitul 7 activare/dezactivare global ntreruperi
Acest 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 zero
Acest bit devine 1 dac rezultatul unei operaii aritmetice sau logice a fost
zero.
4
- bitul 0 indicator de transport
Acest bit devine 1 n cazul unei depiri la operaii pe 8 bii.
ATmega16 dispune de un set de 131 de instruciuni grupate n mai multe
categorii ce vor fi prezentate n continuare.
2.1. Instruciuni aritmetice i logice
Cele mai uzuale instruciuni aritmetice i logice sunt:
- ADD Rd,Rr
Efectul: se adun coninutul registrului Rd cu cel al registrului Rr i rezultatul
se pune n Rd.
- ADC Rd,Rr
Efectul: se adun coninutul registrului Rd cu cel al registrului Rr i cu
indicatorul de transport i rezultatul se pune n Rd.
- SUB Rd,Rr
Efectul: se scade coninutul registrului Rr din cel al registrului Rd i rezultatul
se pune n Rd.
- AND Rd,Rr
Efectul: se face I logic ntre coninutul registrului Rd i cel al registrului Rr
iar rezultatul se pune n Rd.
- INC Rd
Efectul: incrementeaz coninutul registrului Rd i pune rezultatul n Rd.
- DEC Rd
Efectul: decrementeaz coninutul registrului Rd i pune rezultatul n Rd.
2.2. Instruciuni de salt
Cele mai uzuale instruciuni de salt sunt:
- JMP k
Efectul: se face salt necondiionat cu k poziii fa de adresa curent din
memoria program. Instruciunea se poate utiliza i n forma JMP etichet.
- RCALL subrutin
Efectul: se apeleaz o subrutin. Pentru a reveni din aceasta se utilizeaz
instruciunea RET.
- RETI
Efectul: se revenire dintr-o subrutin de tratare a unei ntreruperi.
- CPSE Rd,Rr
Efectul: se compar valorile regitrilor Rd i Rr i n caz de egalitate
instruciunea imediat urmtoare nu se mai execut.
- CP Rd,Rr
Efectul: compar valorile regitrilor Rd i Rr fr s modifice coninutul
acestora. Ca urmare a execuiei acestei instruciuni se vor schimba
corespunztor biii registrului de stare.
- SBRC Rd,b
Efectul: dac bitul b din registrul Rd are valoarea 0 instruciunea imediat
urmtoare nu se mai execut.
- SBRS Rd,b
Efectul: dac bitul b din registrul Rd are valoarea 1 instruciunea imediat
urmtoare nu se mai execut.
5
- SBIC P,b
Efectul: dac bitul b din registrul de intrare/ieire P are valoarea 0
instruciunea imediat urmtoare nu se mai execut.
- SBIS P,b
Efectul: dac bitul b din registrul de intrare/ieire P are valoarea 1
instruciunea imediat urmtoare nu se mai execut.
- BREQ etichet
Efectul: dac indicatorul Z are valoarea 1 se face salt la etichet.
2.3. Instruciuni de transfer
Cele mai uzuale instruciuni de transfer sunt:
- MOV Rd,Rr
Efectul: copiaz coninutul registrului Rr n registrul Rd.
- LDI Rd,k
Efectul: copiaz valoarea k n registrul Rd. Aceast instruciune lucreaz numai
cu registrele r16 r31.
- IN Rd,P
Efectul: copiaz coninutul registrului de intrare/ieire P n registrul Rd.
- OUT P,Rr
Efectul: copiaz coninutul registrului Rr n registrul de intrare/ieire P.
2.4. Instruciuni care lucreaz la nivel de bit
Cele mai uzuale instruciuni care lucreaz la nivel de bit sunt:
- SBI P,b
Efectul: 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,b
Efectul: 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 Rd
Efectul: Registrul Rd este deplasat logic la stnga cu o poziie.
- ROR Rd
Efectul: Registrul Rd este rotit la dreapta cu o poziie prin bitul indicator de
transport.
2.5. Instruciuni speciale
Instruciunile speciale sunt:
- NOP
- SLEEP
- WDR

3. Porturile ATmega16

3.1. Prezentare general
ATmega16 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 fr s afecteze ceilali pini. In plus, anumii pini
6
se pot utiliza pentru funcii speciale ale microcontrolerului. 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.
Figura 3. Structura general a unui pin

Operaiile 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 DDRx Bitul din PORTx Bitul PUD Tipul pinului Rezisten pull-up
0 0 nu conteaz intrare inactiv
0 1 0
*
intrare activ
0 1 1 intrare inactiv
1 0 nu conteaz ieire inactiv
1 1 nu conteaz ieire inactiv






*
Valoare implicit
7
3.2. Prezentare general a mediului software AVRStudio
AVRStudio este un mediu software dezvoltat de Atmel pentru scrierea n
limbaj de asamblare, compilarea i simularea de programe destinate
microcontrolerelor produse de aceast companie.
Orice program scris n AVRStudio 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.
Se va alege opiunea Create New Project;


Figura 4. Fereastra de dialog primar din AVRStudio

- n acest moment se va afia o fereastr asemntoare cu cea din Figura 5. Se
bifeaz opiunile Create Initial File i Create Folder, se completeaz
cmpurile Project name i Location iar apoi se apas butonul Next.


Figura 5. Fereastra de dialog pentru denumirea proiectului

8
- din fereastra care apare se selecteaz AVR Simulator ca Debug
Platform, apoi se selecteaz din list modelul de microcontroler (n cazul
acestui laborator ATmega 16) i n final se apas butonul Finish;


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

- nainte de a scrie programul propriu-zis, se introduce urmtoarea linie:
.include m16def.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 project i apoi Build
din meniul Project. Orice erori de sintax vor fi semnalate de compilator.
- pentru a scrie un nou program, din meniul Project se va alege opiunea
Project wizard. Dup ce se apas butonul OK din fereastra de dialog
aprut, se vor repeta paii prezentai mai sus.

3.3. Programarea microcontrolerlor folosind software-ul AVRFLASH
AVRFLASH este un program oferit mpreun cu placa de dezvoltare
EasyAVR4 care permite programarea unei game largi de microcontrolere utiliznd
aceast 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
pe baza datelor de catalog. n cadrul laboratorului nu se vor modifica valorile acestor
bii.

9

Figura 7. Fereastra programului AVRFLASH

Scrierea programului propriu-zis presupune urmtorii pai:
- se asigur conectarea plcii de dezvoltare la calculator;
- la opiunea Device se alege ATmega16 iar la opiunea Device
frequency [MHz] se alege valoarea 8;
- se selecteaz opiunea External Clock pentru semnalul de tact al
microcontrolerului;
- 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 unui program.
- se apas butonul Write i se ateapt primirea mesajului care confirm
programarea reuit.

3.4. Placa de dezvoltare EasyAVR4
EasyAVR4 este o plac de dezvoltare realizat de firma Mikroelectronika i
permite realizarea de aplicaii cu microcontrolere Atmel.
Placa dispune de urmtoarele resurse hardware :
- 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 microcontrolerelor 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 jumperi aceste rezistene pot fi conectate sau
deconectate de pe pini, numai n cazul portului A fiind posibil s se
selecteze conectarea/deconectarea pentru fiecare pin individual.
Selectarea tipului
de microcontroler
Selectarea frecvenei
microcontrolerului
Butonul care comand
scrierea codului
n microcontroler
Butonul care permite
selectarea codului surs
Selectarea tipului
de semnal de tact
10
- referin extern precis de tensiune pentru utilizarea blocului de ADC cu
aceast facilitate
- generator de semnal de tact cu frecvena de 8MHz;
- modul de afiare cu LED-uri tip 7 segmente;
- interfa serial RS 232;
- senzor de temperatur DS1820 cu interfa I2C;
- 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 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.


Modul de conectare a SW pushbutoanelor este descris schematic n figura de
mai jos. Se observ c se poate selecta nivelul de tensiune la care este conectat pinul
n momentul cnd se apas pe buton.


11
3.5. Exemple de programe
a) S se scrie un program care menine aprinse doar led-urile PA0 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.

.include "m16def.inc"
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
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
reset:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0b00000000
out DDRD,r16 ; portul D este setat ca intrare
ldi r16,0b11111111
out PORTD,r16 ; se activeaza rezistentele pull-up pentru toti pinii portului D
ldi r16,0b11111111
out DDRA,r16 ; portul A, unde sunt conectate led-urile, este setat ca iesire
main:
ldi r17,0b00000000
in r16,PIND ; se citesc pushbutoanele
sbrc r16,PD0 ; s-a apasat butonul corespunzator led-ului PA0 ?
ldi r17,0b00000001 ; nu s-a apasat deci led-ul PA0 trebuie sa fie aprins
out PORTA,r17
ldi r17,0b00000000
in r16,PIND
sbrc r16,PD7 ; s-a apasat butonul corespunzator led-ului PA7 ?
ldi r17,0b10000000 ; nu s-a apasat deci led-ul PA7 trebuie sa fie aprins
out PORTA,r17
jmp main

12
b) S 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 PA0. Se va asigura c apsarea butonului
determin conectarea pinului la potenialul GND.

.include "m16def.inc"
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
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
reset:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0b00000000
out DDRD,r16 ; portul D este setat ca intrare
ldi r16,0b11111111
out PORTD,r16 ; se activeaza rezistentele pull-up pentru toti pinii portului D
ldi r16,0b11111111
out DDRA,r16; portul A, unde sunt conectate led-urile, este setat ca iesire
main:
in r16,PIND ; se citesc pushbutoanele
andi r16,0b00000011 ;se izoleaza doar valorile de pe primele 2 butoane
ldi r17,0x00
cp r16,r17 ;configuratia butoanelor corespunde valorii 0 ?
brne et1 ;nu, se merge mai departe
ldi r18,0b00000001 ;da, se va aprinde led-ul PA0
out PORTA,r18
jmp main
et1:
ldi r17,0x01
cp r16,r17
brne et2
13
ldi r18,0b00000010
out PORTA,r18
jmp main
et2:
ldi r17,0x02
cp r16,r17
brne et3
ldi r18,0b00000100
out PORTA,r18
et3:
ldi r17,0x03
cp r16,r17
brne et4
ldi r18,0b00001000
out PORTA,r18
et4:
jmp main

c) 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 PD0. Ledul 0 se
consider PA0. Se va asigura c apsarea butonului determin conectarea pinului
la potenialul GND.

.include "m16def.inc"
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
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
reset:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0b00000000
14
out DDRD,r16
ldi r16,0b11111111
out PORTD,r16
ldi r16,0b11111111
out DDRA,r16
ldi r17,0b00000001
out PORTA,r17 ;initial se aprinde ledul PA0
clc ;idicatorul carry se face 0
main:
ldi r18,0xFF ;registrii r18,r19 si r20 sunt utilizati pentru a crea o temporizare
ldi r19,0xFF
ldi r20,0x13
bucla:
dec r18
brne bucla
ldi r18,0xFF
dec r19
brne bucla
ldi r19,0xFF
dec r20
brne bucla
rol r17 ;dupa terminarea temporizarii se face o rotatie catre stanga prin carry
out PORTA,r17 ;se scrie noua valoare la leduri
in r16,PIND
sbrc r16,PD0 ;am apasat butonul PD0 ?
jmp main ;nu, se cotinua deplasarea ledului aprins
ldi r17,0b00000001 ;da, aprind ledul PA0 si ma opresc
out PORTA,r17
end:
jmp end



4. Teme i exerciii

a) S 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.

b) 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.

c) 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 PB0.

S-ar putea să vă placă și