Sunteți pe pagina 1din 124

Laborator Microcontrolere

Lucrarea 1
Microcontrolerul ATmega32. Utilizarea porturilor

Scopul lucrrii
a)
b)
c)
d)

Noiuni generale despre ATmega32


Setul de instruciuni al ATmega32
Porturile ATmega32 i exemple de utilizare
Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVRv7
1. Noiuni generale

ATmega32 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
EXTJNTO
EXTJNT1
EXTJNT2
TIM2_COMP
TIM2_OVF
TIM1_CAPT

jmp
jmp
jmp
jmp
jmp
jmp

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 16

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
ATmega32 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.
Bit
Readi
SR
Wne
R
W
R.'
R
R
R
R
R.'
RJ
EG
In lia
W

A
.'
W
W
.'
'
Va
T je H
S
V
N
Z
Y
W
G
0
W
W
I

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

bitul O - indicator de transport


Acest 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 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:
- JMPk
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 iar 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.

- 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 rl 6 - 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 ATmega32
3.1. Prezentare general
ATmega32 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 pini
se 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.

h
a
R

pu

POT

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

0
0
0
1
1

Valoare implicit

Bitul din PORTx

0
1
1
0
1

Bitul PUD

nu conteaz
0*
1
nu conteaz
nu conteaz

Tipul pinului

intrare
intrare
intrare
ieire
ieire

Rezisten pull-up

inactiv
activ
inactiv
inactiv
inactiv

3.2. Prezentare general a mediului software Atmel Studio


Atmel 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:

L_JLJ
-

dup

lansarea

programului, apare o fereastr similar cu cea din Figura 4.


Se va alege opiunea New Project";
fic Edit Vcu> VAssr.*
ASF Projzct ?:bug Tools Wrdow help
'irr Vflfi" - AtmpJ itiidi-

: 'br n*
KJJ . I . -w

:i

Vr - . . :
fjeh nq i-tsrted

P'cgram
mrg Dia
og FAO

Output
LJ] NcwrrfcijcclI Show
outpu:''?".:
Nn lynm r
Pr>(*+ ..

[5j

-DRT2D
V/PLONMFR
G2 T

TMJIS HHI|] I H H-I NPW,'.

T
>VAic* "g >> S:
VA Ciulin: ution
E>:.*

IIMll
WcIcoti
to Atmel
E:udio

LINK: ARR

Getto
krcwA:"-:l
tudio

OnmPi^ia...

R;::;MI

Figura 4. Fereastra de dialog primar din Atmel Studio

Pmjisl'
[S /'.IV l.ltfAfij
ilcliuril 3 i n*-p-g^
iftiT-f-jert lord 71

- 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";

Show p=ge :n
rtartup

rr

New Project

Recent
Templa
tes

Search Installed
Templates
Installed Templates

Sort by: I Default

C/O*

Type: Assembler
AVR Assembler
Project
Assembler
Creates an AVR 8-bit Assembler
project

Assembler
Atmel Studio Solution

I
Name:

AssemblerApplicationl

location:

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

Solution name:

AssemblerApplicationl

Browse...
[y Create directory for

>H
Fig
ura
5.
Fer
east
ra
de
dial
og
pen
tru
den
umi
rea
proi
ectu
lui
(sol
utio
n)

rH
I Search for device

Device Info:
Oevice Name: ATmeqa32
Speed:
Vcc:

2,7/5.5

Family:

megaAVR

Datasheets
Supported Tools AtmelICE
V AVR Dragon
AVRISP mkll

d
i
n
f

f AVR ONE!
3 JTAGICE3
JTAGICE mkll
% Simulator

TSTK500
STK600

e
r
e
a
st
r
a
c
a
r
e
a
p
a
r
e
s
e
s
e
l
e
c
t
e
a
z

d
i
n
li
st

m
o
d
e
l
u
l
d
e
m

i
c
r
o
c
o
n
tr
o
l
e
r

n
c
a
z
u
l
a
c
e
st
u
i
l
a
b
o
r
a
t
o
r

A
T
m
e
g
a
3
2
"

n
fi
n
a
l
s
e
a
p
a
s

b
u
t
o
n
u
l

O
K
";
Device
Selection

Name

App./Boot Memory (Kbytes) Data

ATmegal69PA

16

1024

ATmega 16A

16

1024

ATmegalHVA

16

512

ATmegal6HVB

16

1024

ATmegal6HVBrevB 16

1024

ATmegal6Ml

16

1024

ATmegal6U2

16

512

ATmegal6U4

16

1280

ATmega2560

256

8192

ATmega2561

256

8192

ATmega2564RFR2

256

3276

ATmega256RFR2

256

3276

I ATmega32

32

2048

ATmega324A

32

2048

ATmega324P

32

204

ATmega324PA

32

204

ATmega325

32

204

ATmega3250

32

204

T -t~\rr\

*n

in
Device
Family:

Ai
l

Figura
6.
Alegere
a tipului
de
controle
r
utilizat
ntr-un
proiect


n
ai
n
te
d
e
a
s
c
ri
e
p
r
o
g
r
a
m
u
l
p
r
o
p
ri
u
zi
s,
s
e
i
n
tr
o
d
u
c
e
u
r
m
t

o
a
r
e
a
li
n
ie
:

.
i
n
c
l
u
d
e
,,
m
3
2
d
e
f.
i
n
c
"
A
c
e
a
st

li
n
ie
e
st
e
o
d
ir
e

ct
i
v

d
e
c
o
m
p
il
a
r
e
c
a
r
e
i
n
d
ic

n
u
m
el
e
fi
i
e
r
u
l
u
i
c
e
c
o
n
i
n
e

d
e
s
c
ri
e
r
e
a
r
e
g
i
tr
il
o
r
i
c
a
r
a
ct
e
ri
st
ic
il
o
r
m
ic
r
o
c
o
n
tr
o
le
r
u
l
u

i.
d
u
p

s
c
ri
e
r
e
a
p
r
o
g
r
a
m
u
l
u
i,
s
e
al
e
g
o
p
i
u
n
il
e

S
a
v
e
A
H
"
d

i
n
m
e
n
i
u
l

F
il
e
"
i
a
p
o
i

B
u
il
d
S
o
l
u
ti
o
n
"
d
i
n
m
e
n
i
u
l

B
u
il

d
".
O
ri
c
e
e
r
o
ri
d
e
si
n
ta
x

v
o
r
fi
s
e
m
n
al
at
e
d
e
c
o
m
p
il
at
o
r.
A
c
e
st
e
a

tr
e
b
u
ie
c
o
r
e
ct
at
e
i
a
p
o
i
s
e
v
o
r
r
e
p
et
a
p
a
i
i
a
n
te
ri
o
ri
.
p
e
n
tr
u
a

s
c
ri
e
u
n
n
o
u
p
r
o
g
r
a
m
,
d
i
n
m
e
n
i
u
l

F
il
e
"
s
e
v
a
al
e
g
e
o
p
i
u
n

e
a

N
e
w
P
r
o
je
ct
"
i
a
p
o
i
s
e
v
o
r
r
e
p
et
a
p
a
i
i
p
r
e
z
e
n
ta
i
m
ai
s
u
s.

3.3.
Progra
marea
microc
ontrole
rlorfolo
sind
softwar
e-ul A
VRFLA
SH"
A
VRFLA
SH este
un
program
oferit
mpreun

cu
placa de
dezvolta
re
EasyAV
Rv7
care
permite
program
area
unei
game
largi de
microco
ntrolere
utilizn
d
A

aceast
plac
conectat

la
calculat
or prin
interme
diul
interfee

i USB.
nainte
de orice
operaie
se
va
specific
a prin
interme
diul
opiunii
Device
" tipul
de
microco
ntroler
program
at.
P
entru
orice
microco
ntroler
trebuie
program
ate dou
element
e
distincte
: biii de
configur
are
i
program
ul
propriuzis.
A
a cum
se poate
vedea n
Figura
7, biii
de
configur
are sunt

disponib
ili
n
zona
central
a
ferestrei
program
ului
AVRFL
ASH.
Valorile
acestor
bii se
stabilesc

/V

pe baza
datelor
de
catalog.
In
cadrul
laborato
rului nu
se vor
modific
a
valorile
acestor
bii.
m
ikr
oEl
ekt
ron
ika
AV
RF
LA
SH
[ v
2.1
4]
F
ile
De
vic
e
Buf
fer
Wi
nd
ow
s
US
B
Ab
out
His
tor
y

Selectarea tipului de
microcontroler
Selectarea
frecvenei
microcontrolerului

I
Mo
de

1
3
Ib
L
B
O
Mo
de

1
|

b
L
B
1
Mo
de

1
S
N
o

Read
Verify

F
f
V

CODE

T
y

Erase
DATA

Load ^
E
Reload
Save

e
Write

|
B

Load

Save

CODE

DATA
Options
Progress:

r
e
a
c
o
d
u
l
u
i

n
m
i
c
r
o
c
o
n

"31

t
C
O
D
E
H
E
X
F
i
l
e
:
D
:
\
D
O
C
U
M
E
N
T
E
\
F
l
L
E
.
H
E
X
D
A
T
A
H
E
X
F
i
l
e
:
D
e
v
i
c
e
:
A
T
m

e
g
a
3
2

Fi
gu
ra
7.
Fe
re
ast
ra
pr
og
ra
m
ul
ui
A
V
R
FL
A
S
H

Scrierea 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 VRv7


EasyAVRv7 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~*I

4. Exemple de programe
a) S se scrie un program care menine aprinse doar led-urile PAO i PA7 i le stinge la
EH

fiecare
apsare a pushbuton-ului corespunztor de pe portul D. Se va
asigura c apsarea butonului determin conectarea pinului la potenialul GND.
iU
J_
CNU

irtt ^ i iii
lny
IIJ:
poitrajjvB-_____________________
nil
;

n tmf rpiis nmu) rpw rhmm nwta nwtn ni

SetareUi
porturi
Unic

Ui 230 BUTTON PRES5 LEVEL DU 230

JmL

Aprinde PAO i PA7

U * Ui U Uiac U
m

iok

uk

.include "m32def.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 rl 6,high(RAMEND)
out SPH,rl6
ldi rl6,low(RAMEND)
out SPL,rl6
ldi rl6,0b00000000
out DDRD,rl6 ; portul D este setat ca intrare ldi
rl6,0bl 1111111
out PORTD,rl6 ; se activeaza rezistentele pull-up pentru toti pinii portului D ldi rl
6,0bl 1111111
out DDRA,rl 6 ; portul A, unde sunt conectate led-urile, este setat ca ieire main:
ldi rl7,0b00000000
in rl 6,PIND ; se citesc pushbutoanele
sbrc 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 aprins
out PORTAjl ?
ldi rl7,0b00000000
inrl6,PIND
sbrc 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 aprins
out PORTA,r 17
jmp main

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 PAO. Se va asigura c apsarea butonului determin conectarea pinului la
potenialul GND.

.include "m32def.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 rl 6,high(RAMEND)
out SPH,rl6
ldi rl 6,low(RAMEND)
out SPL,rl6
ldi rl6,0b00000000
out DDRD,rl6 ; portul D este setat ca intrare ldi rl6,0bl 1111111
out PORTD,rl6 ; se activeaza rezistentele pull-up pentru toti pinii portului D ldi rl6,0bl 1111111
out DDRA,rl 6; portul A, unde sunt conectate led-urile, este setat ca ieire main:
in rl 6,PIND ; se citesc pushbutoanele
andi rl 6,0b00000011 ;se izoleaza doar valorile de pe primele 2 butoane ldi rl 7,0x00
cp rl 6,rl7 ;configuratia butoanelor corespunde valorii 0 ?
bme et 1
;nu, se merge mai departe
ldi rl 8,0b00000001 ;da, se va aprinde led-ul PAO
out PORTA,rl8
jmp main
etl:
ldi rl 7,0x01 cp rl6,rl7 bme et2
ldi rl8,0b00000010 out PORTA,r 18 jmp main et2:
ldi rl 7,0x02 cp rl6,rl7 bme et3
ldi rl8,0b00000100 out PORTA,r 18 et3:
ldi rl 7,0x03 cp rl6,rl7 bme et4
ldi rl8,0b00001000
out PORTA,rl8 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 PDO. Ledul 0 se consider
PAO. Se va asigura c apsarea butonului determin conectarea pinului la potenialul
GND.

.include "m32definc"
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 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 rl7
out PORTA,rl7 inrl6,PIND
sbrc rl6,PD0 jmp main
Idirl7,0b00000001 out
PORTA,rl7 end:
jmp end

;dupa
temporizrii
se face ocarry
rotatie
ctre0stanga prin carry
;initialterminarea
se aprinde ledul
PAO ;idicatorul
se face
;se scrie noua valoare la leduri
jegistni rl8,rl9 si r20 sunt utilizati pentru a crea o temporizare
;am apasat butonul PDO ?
;nu, se cotinua deplasarea ledului aprins
;da, aprind ledul PAO si ma opresc

Teme i exerciii
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.
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 2
Microcontrolerul ATmega32. Utilizarea modulelor timer

Scopul lucrrii
a) Prezentarea modulului Timer/CounterO pe 8 bii
b)Prezentarea modulului timer pe 16 bii
c) Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVRv7

1. Noiuni generale privind sistemul de ntreruperi

Microcontrolerul 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.
A

Tabela de ntreruperi se plaseaz de obicei la nceputul zonei de memorie flash.


___

In 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.______________
Descriere
Adresa n
Nr.
crt. memoria Flash
1
0x00
Generat la alimentare sau la un semnal pe pinul RESET
2
0x02
ntrerupere extern 0
3
0x04
ntrerupere extern 1
4
0x06
ntrerupere extern 2
5
0x08
Generat cnd Timer/Counter2 atinge valoarea de prag
6
OxOA
Generat cnd Timer/Counter2 atinge valoarea maxim

7
8
9
10
11
12
13
14

OxOC
OxOE
0x10
0x12
0x14
0x16
0x18
OxlA

Generat de unitatea de captur a timerului pe 16 bii


Generat cnd timerul pe 16 bii atinge valoarea de prag A
Generat cnd timerul pe 16 bii atinge valoarea de prag B
Generat cnd timerul pe 16 bii atinge valoarea maxim
Generat cnd Timer/CounterO atinge valoarea de prag
Generat cnd Timer/CounterO atinge valoarea maxim
Generat de unitatea SPI
Generat la recepia complet a unor date de ctre modulul USART

15
16

0x1 C
OxlE

17
18

0x20
0x22

Generat cnd registrul de date al modulului USART este gol


Generat la transmisia complet a unor date de ctre modulul
USART
Generat de modulul ADC
Generat de modulul EEPROM

19
20
21

0x24
0x26
0x28

/V

Generat de comparatorul analogic


Generat de modulul TWI
Generat de modulul de auto-scriere a memoriei Flash

Pentru orice surs de ntrerupere, exist un bit specific de activare/dezactivare.

In 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.
/V

In 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 r20

out SREG, r20 ; restaurarea registrului de stare din


r20 reti

2. Modulul Timer/CounterO pe 8 bii


Modulul Timer/CounterO pe 8 bii poate fi utilizat pentru realizarea de
temporizri, 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

/V

- posibilitate de auto-iniializare
- posibilitate de generare facil a semnalelor Puise Width Modulation (PWM)

Figura 1. Schema bloc a modulului Timer/CounterO pe 8 bii


Regitrii alocai acestui timer pot fi mprii n trei mari categorii:
- registrul de numrare: TCNTO
- pragul de comparaie: OCRO
- comand i control: TCCRO, TIMSK i TIFR
Coninutul regitrilor de comand i control este prezentat n Figura 2.

FOCO
7

i OC!E2
7
OCF2

tfGMOO

COMOI

COM 00

WGM01

CS02

CS01

TIC IE

OCIE1A

OCIE1B

TOI El

OCIEO

TOIEO

fi

TOV1

OCFO

TOVO

TOIE2

e
TOV2

IC K1

OCF1A

OCMB

CSOO

TCCR
O

TIMSK

i
1 TIFR
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)

mXti Int P

Wf"=ifo
rm Sa
ration

jq.)

O
Cn
TC.,1

(Irr
t.R
eq.)

corect

semnal PWM rapid


semnal PWM
n faz

Biii care selecteaz modul de funcionare se regsesc n registrul TCCRO.


Rezultatul posibilelor combinaii ale acestora este dat n Figura 3.
Mode WGM01
(CTCO)

WGMOO
(PWMO)

Timer/Counter Mode of TOP


Operation

Update
OCRO

of TOVO Flag
Set-on

Normal

OxFF

Immediate

MAX

PWM, Phase Correct

OxFF

TOP

BOTTOM

CTC

OCRO Immediate

MAX

Fast PWM

OxFF

MAX

BOTTOM

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

CS02

CS01

CSOO

0
0

0
0

0
1

0
0
1
1
1

1
1
0
0
1

0
1
0
1
0

Frecvena de inc/dec
timer oprit
f /1
^osc' 1
fosc/8
fosc/64
fosc/256
fosc/1024
frecvena semnalului de pe pinul TO,
frontul descendent
frecvena semnalului de pe pinul TO,
frontul ascendent
^

^
/V

Unitatea 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
^

/V

TCNTO atinge valoarea registrului de prag OCRO. In acest caz pinul trebuie setat ca
ieire. ______________________________________________________________
COMOl

COMOO

Description

Normal port operation, OCO disconnected.

Toggle OCO on compare match

Clear OCO on compare match

Set 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.
/V

In 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 set
CCRn Update and TOVn Inteirupt Rag Set

y
OC
n
OC

(COMnliO - 2)

j~L_ru i_____n_

Period |i----1 -Jf2 _|- 9- --4- +-5- +-6


------->|
n

(COMnliO - 3)

Figura 5. Modul de funcionare semnal PWM rapid

y2.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.
/V

In 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 Set

OCfln Update

TOVn Interrupt Flag Set

|<---1---->J*- 2----Jf- - -3---->|


Figura 6. Modul de funcionare semnal PWM corect n faz
Period

3. Modulul timer pe 16 bii


Modulul timer pe 16 bii poate fi utilizat pentru realizarea de temporizri,
/V

numrarea 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)

Count

Tn

Edge J ctor

/I

Control Ld[ j

Directi

CP BOTTOM

lOY

Clear

(Intrteq.J
Cbck Select

ok

on

i ( From Pnaacr'Br)

Timer, Counier

=0

TCHTn

iCnA
"(IntReq.)
Vtoreturm

OCiA

ane re on

O"f
J
-------------UtRnA

iQ
"(IrrtReq.;

ICUn

z \
Ik

W.m
S jrib ration

/I
cao
OTnB
Detecto
r

Noiae
Cance
lar

( crom Ar -, Competitor (Xput

X-

TOP
Valu
?-

ICPn

7CCiA

-OCknfl

L.

TCCBnB

-ICFn (IntHsq.)

Figura 7. Schema bloc a modulului timer pe 16 bii


Regitrii 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 TIFR
Coninutul regitrilor de comand i control este prezentat n Figura 8.
COMTA1 C0M1 AO COM 181 COM _C F0C1A FOC1B WGM1 WGM 0 ' T<XRLA

'sic i reet b

1CES1

l< C1

Wfil" 3 WGM2 CS12

OC!
=2

TOF
2

TICIE1

OCIE1A

OCIE1B

THE1

OCE TOI
O
CO
1

TIMSK

TIFR
ICF1
OCF1A
OCF1B
OV1
TOVO
ocra
OCF TOV7
Figura
2 8. Coninutul regitrilor de comand i control ai timerului pe 16 bii
T

Toi regitrii utilizai ca praguri de comparaie i registrul de numrare sunt de 16 bii


dar utilizatorul nu are acces direct la octeii superiori i inferiori ai acestora. In schimb, se
utilizeaz un registru temporar de 8 bii invizibil pentru programator i o secven special de
scriere i citire.

Astfel, pentru a scrie o valoare n regitrii de tip prag sau n cel de numrare, se va
scrie mai nti partea superioar (de exemplu OCR1AH) i apoi partea inferioar (de
exemplu OCR1AL). Cnd se citete o valoare din regitrii de tip prag ai timerului sau din
cel de numrare, se va citi mai nti partea inferioar i apoi partea superioar.
Modurile principale de funcionare ale timerului de 16 bii sunt:
funcionare normal
re-iniializare la atingerea valorii de prag (CTC)
semnal PWM rapid
semnal PWM corect n faz
semnal PWM corect n faz i frecven
Biii care selecteaz modul de funcionare se regsesc n regitrii TCCR1A i
TCCR1B. Rezultatul posibilelor combinaii ale acestora este dat n Figura 9.
Mode

WGM13

WGM12 WGM11
(CTC1) (PWM11)

WGM10
(PWM10)

Timer/Coulter Mode of Operation

TOP

Update of
OCR1X

TOV1 Flag Set on

Normal

QxFFFF

Immediate

MAX

PWM, Phase Correct 8-bit

OxOOFF

TOP

BOTTOM

PWM, Phase Correct 9-bit

0x01 FF

TOP

BOTTOM

PWM, Phase Correct, 10-bit

0x03FF

TOP

BOTTOM

CTC

OCR1A

Immediate

MAX

Fast PWM, 8-bit

OxOOFF

BOTTOM

TOP

Fast PWM, 9-bit

(MUFF

BOTTOM

TOP

Fast PWM, 10-bit

Qx03FF

BOTTOM

TOP

PWM, Phase and Frequency Correct

ICR1

BOTTOM

BOTTOM

PWM, Phase and Frequency Correct

OCR1A

BOTTOM

BOTTOM

10

PWM, Phase Correct

ICH1

TOP

BOTTOM

11

PWM, Phase Correct

OCR1A

TOP

BOTTOM

12

CTC

ICR1

Immediate

MAX

13

Reserved

14

Fast PWM

ICR1

BOTTOM

TOP

15

Fast PWM

OCR1A

BOTTOM

TOP

Figura 9. Setarea modului de funcionare al timerului de 16 bii


Toate modurile de funcionare se bazeaz pe incrementarea sau decrementarea
automat a registrului de numrare TCNT1. Frecvena de incrementare/decrementare este
controlat de combinaia biilor CS12, CS11, CS10 din registrul TCCR1B conform tabelului
de mai jos (cu fosc s-a notat frecvena ceasului microcontrolerului).
CS12
0
0

CS11
0
0

CS10
0
1

Frecvena de inc/dec
timer oprit
f /I
^osc' 1

fosc

/8

0
1
1
1

1
0
0
1

1
0
1
0

/64
fosc/256
fosc/1024
frecvena semnalului de pe pinul TI,
frontul descendent
frecvena semnalului de pe pinul TI,
frontul ascendent
fosc

/V

In modurile de funcionare normal i re-iniializare la atingerea valorii de prag se


poate utiliza unitatea de captur evenimente. Aceasta este controlat de tranziiile
semnalului de pe pinul ICP1 sau cele ale ieirii comparatorului analogic. Cnd se produce o
anumit tranziie selectat de utilizator, unitatea de captur copiaz registrul TCNT1 (16
bii) n registrul ICR1, obinndu-se astfel o amprent temporal a producerii evenimentului.
Dac bitul TICIE1 din registrul TIMSK are valoarea 1, se va genera o ntrerupere
cnd are loc copierea amprentei temporale.
Unitatea timer compar n permanen valoarea TCNT1 cu OCR1A i
/V

OCR1B. In modurile de funcionare normal i re-iniializare la atingerea valorii de prag,


valoarea 1 a bitul OCIE1A sau OCIE1B din registrul TIMSK determin generarea unei
ntreruperi cnd TCNT1 atinge valoarea registrului de prag OCR1A respectiv OCR1B.
/V

In vederea utilizrii timerului pe 16 bii, 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
regitrii de control. Se va avea n vedere s nu se porneasc timerul.
- iniializarea cu o valoarea a registrului de numrare i/sau a pragurilor, 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 ntreruperile folosind sei, dac este cazul.
3.1. Modul de funcionare normal
/V

In acest mod valoarea TCNT1 este incrementat continuu la fiecare tact de numrare.
Cnd se atinge valoarea maxim reprezentabil pe 16 bii, TCNT1 ia valoarea 0 i apoi
continu s numere.
Dac bitul TOIE1 din registrul TIMSK are valoarea 1, se va genera o ntrerupere
cnd se atinge valoarea maxim reprezentabil pe 16 bii.

3.2. Modul de funcionare cu re-iniializare la atingerea valorii de prag (CTC)


/V

In acest mod valoarea TCNT1 este incrementat la fiecare tact de numrare

/V

pn cnd devine egal cu OCR1A sau ICR1, n funcie de setrile fcute. In acest moment,
TCNT1 se re-iniializeaz cu 0 i numrtoarea rencepe.
n funcie de valorile biilor COM1A1/COM1B1 i COM1AO/COM1BO din registrul
TCCRA, este posibil s se programeze modificarea nivelului logic al pinului
^

/V

OC1A cnd TCNT1 atinge valoarea registrului de prag OCRA1/OCRB1. In acest caz pinul
respectiv trebuie setat ca ieire.
3.3. Modul de funcionare semnal PWM rapid
/V

In acest mod de funcionare, TCNT1 este incrementat, n funcie de setri, pn atinge


una din valorile OxOOFF, 0x01FF, 0x03FF, valoarea din ICR1 sau cea din
/V

OCR1A. In acest moment se iniializeaz TCNT1 cu 0 i se reia numrtoarea.


Valoarea logic a pinilor OC1A sau OC1B se modific numai cnd TCNT1 este egal cu
o valoare de prag i cnd ajunge la valoarea maxim, aa cum se poate vedea n Figura 10.
/V

In acest mod de funcionare, cnd TCNT1 este setat s numere pn la valoarea


registrului OCR1A, utilizatorul o poate modifica oricnd deoarece ea nu va fi transferat n
modulul timer dect dup ce TCNT1 a realizat un ciclu complet de numrare.
OCR.'TOP Update
TOVn Interrupt Rag
and OCnA Interrupt
Set OCnA Interrupt
Set (Interrupt on TOP)

and
Set
Rag
Rag

TCNT
n
(COMmtl :0 = )

OCn

(COMrotl :0 = 3)

x
OCn

x
Figura
10. Modul de funcionare semnal PWM rapid
Period

3.4. Modul de funcionare semnal PWM corect n faz


/V

In acest mod de funcionare, TCNT1 este incrementat, n funcie de setri, pn atinge


una din valorile OxOOFF, 0x01FF, 0x03FF, valoarea din ICR1 sau cea din
/V

OCR1A. In acest moment TCNT1 ncepe s fie decrementat pn ajunge la 0 dup care se reia
ciclul.

Valoarea logic a pinilor OC1A sau OC1B se modific numai cnd TCNT1 este egal cu
o valoare de prag n timp ce crete i apoi n timp ce descrete, aa cum se poate vedea n
Figura 11.

/V

In acest mod de funcionare, cnd TCNT1 este setat s numere pn la valoarea


registrului OCR1A, utilizatorul o poate modifica oricnd deoarece ea nu va fi transferat n
modulul timer dect dup ce TCNT1 a ajuns la valoarea maxim.
CCRnwTOP Update and CCnA
Interrupt Flag Set or ICFn
Interrupt Flag Set (Interrupt on
TOP)

TOVn Intempt Rag


Set
(Interrupt
on
Bottom)

(COMnxl ft =2)

J (COMnxl ft
=3)

Figura 11. Modul de funcionare semnal PWM corect n faz


3.5. Modul de funcionare semnal PWM corect n faz i frecven
/V

In acest mod de funcionare, TCNT1 este incrementat, n funcie de setri, pn


/V

atinge valoarea din ICR1 sau cea din OCR1A. In acest moment TCNT1 ncepe s fie
decrementat pn ajunge la 0 dup care se reia ciclul.
Valoarea logic a pinilor OC1A sau OC1B se modific numai cnd TCNT1 este egal cu
o valoare de prag n timp ce crete i apoi n timp ce descrete, aa cum se poate vedea n
Figura 12.
/V

In acest mod de funcionare, cnd TCNT1 este setat s numere pn la valoarea


registrului OCR1A, utilizatorul o poate modifica oricnd deoarece ea nu va fi transferat n
modulul timer dect dup ce TCNT1 a terminat un ciclu.

A
Figura 12. Modul de funcionare semnal PWM corect n faz i frecven

OCnx
Psrio
dI

(COMnxl :0-2) 1
_____ (COMnxl :0-3)

4. Exemple de programe
a) S se scrie un program care genereaz pe pinul OCO (PB3) un semnal dreptunghiular cu frecvena de
aproximativ 15 Hz i factor de umplere 50%.

1r
Setare porturi

Setare Timer 0

Bucl infinit

.include
"m32def.i
nc"
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 rl6,high(RAMEND) out SPH,rl6 ldi rl6,low(RAMEND) out SPL,rl6 ldi rl6,OxFF out DDRB,rl6 main:
cli
ldi
rl6,ObOOOllOOO OCO este pe pinul PB3
out TCCRO,rl6
/dezactivare intreruperi
in rl6, TIMSK
/setare timer: se utilizeaza pinul OCO, timerul este oprit deocamdata
andi
;modul va fi CTC cu prag dat de OCRO

;se incarca valoarea de prag: 0xFA=250


;250 * 1/(8MHz/1024) =~ 32ms

rl6,ObllllllOO ;nu se
utiliz. nici o intrer.,
fara a modifica alti biti
din TIMSK out TIMSK, rl6
ldi rl6, OxFA out OCRO,rl6

in rl6,TCCRO
andi rl6,ObllllllOl ;se porneste timerul si este setat sa numere
ori rl6,ObOOOOOlOl ;la fiecare 1024 perioade de ceas, fara a modifica alti biti out TCCRO,rl6
bucla: rjmp bucla

b) S se scrie un program care ntr-un interval de aproximativ 8s efectueaz urmtoarele operaii: dup
2s aprinde ledurile portului A, dup 6,5s aprinde ledurile portului C iar la finalul intervalului
stinge toate ledurile.

.include "m32def.inc"
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp prag_2sec
jmp prag_6_5sec
jmp prag_8sec
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,OxFF
out
DDRA,rl6
out
DDRC,rl6 main:
cli
/dezactivare globala intreruperi
ldi rl6,ObOOOOOOOO /setare timer: nu se utiliz. OC1A si OC1B, oprit deocamdata out TCCR1A,r16
/modul va fi normal
ldi rl6,ObOOOOOOOO out TCCR1B,rl6 in rl6, TIMSK andi rl6,ObllOOOOll ori rl6,ObOOOlllOO out
TIMSK, rl6 ldi rl6, 0x3D out OCR1AH,rl6 ldi rl6, 0x09 out OCR1AL,rl6 ldi rl6, 0xC6 out
OCR1BH,rl6 ldi rl6, 0x5D out OCR1BL,rl6 ldi rl6, OxOB out TCNT1H,rl6 ldi rl6, OxDB out
TCNT1L,rl6
in rl6,TCCR1B
andi rl6,ObllllllOl
;se pornete timerul care va numara la 1024 impulsuri de ceas
ori rl6,0b00000101 out TCCR1B,rl6
sei
/activare globala a intreruperilor
bucla: rjmp bucla
prag_2 sec: in r20, SREG ldi rl8,OxFF out PORTA,rl8 out SREG,r20 reti
prag_6_5
sec:
in
r20,
SREG
ldi
rl8,OxFF
out
PORTC,rl8
out
SREG,r20
reti
prag_8 sec: in r20, SREG ldi rl8,0x00 out PORTA,rl8 out PORTC,rl8
ldi rl6, OxOB
/se incarca o valoarea iniiala: 0x0BDB=3035 si 65535-3035=62500
out TCNT1H,rl6
;62500 * 1/(8MHz/1024) = 8s

se utiliz. toate intreruperile, fara a modifica alti biti din TIMSK


se incarca valoarea de prag A: 0x3D09=15625 ;15625 * 1/(8MHz/1024) =~
2s

se incarca valoarea de prag: 0xC65D=50781 ;5


0781 * 1/(8MHz/1024) =~ 6,5s
se incarca o valoarea iniiala: 0x0BDB=3035 si 65535-3035=62500 ;
62500 * 1/(8MHz/1024) = 8s

ldi rl6, OxDB


out TCNT1L,rl6
out SREG,r20
reti

c) S se scrie un program care schimb starea ledului conectat pe pinul PA7 dac s-a inut apsat cel
puin 6s pe butonul conectat pe PC7.

.include
"m32def.inc"
jmp reset jmp
reset jmp reset
jmp reset jmp
reset jmp reset
jmp reset jmp
prag_lsec
jmp
reset jmp reset
jmp reset

jmp
scanare_butoane
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,0x00 out DDRC,rl6
ldi rl6,OxFF out DDRA,rl6 out PORTC,rl6 ldi rl8,0x00 main: cli
ldi rl6,ObOOOOOOOO out TCCR1A,r16 ldi rl6,ObOOOOlOOO out TCCR1B,rl6 in rl6, TIMSK andi
rl6,ObllOOOOll
ori rl6,ObOOOlOOOO ;se
utiliz.
doar
intrer.
se incarca valoarea de prag A: 0x7A12=31250
prag A fara a modifica
;31250 * 1/(8MHz/256) = s
alti biti din TIMSK out
TIMSK, rl6 ldi rl6,
0x7A out OCR1AH,rl6
ldi
rl6,
0x12
out
/setare
timerO:
nu
se
utiliz
OCO,
oprit OCR1A1,rl6
deocamdata /modul va fi normal
ldi rl6,ObOOOOOOOO
se utiliz. intrer. la depire,
out TCCR0,rl6 in rl6,
/fara a modifica alti biti din TIMSK
TIMSK andi
rl6,ObllllllOO ori
rl6,ObOOOOOOOl out
TIMSK, rl6 in
rl6,TCCR0
andi rl6,ObllllllOl /se pornete timerul si este setat sa numere
ori rl6,ObOOOOOlOl /la fiecare 1024 perioade de ceas, fara a modifica alti biti
out TCCR0,rl6
/ va ajunge la val max. in aprox 32ms
sei
/activare globala a intreruperilor
bucla:
rjmp bucla
scanare_butoane: in r20, SREG in rl6,PINC
sbrc rl6,PC7
/verific daca se apasa pe buton
rjmp turn_off
in rl6,TCCR1B
mov rl7,rl6
andi rl7,ObOOOOOlll

/la fiecare 32ms se verifica starea butonului

;rl8 este contorul de secunde


/dezactivare globala intreruperi
/setare timer: nu se utiliz. OC1A si OC1B, oprit deocamdata
/modul va fi CTC

cpi rl7,ObOOOOOlOO
;daca timerul e deja pornit nu il mai pornesc
breq end ldi rl7,0x00 out TCNT1H,rl7
out TCNTlL,rl7
;inainte de o noua pornire se reseteaza
andi rl6,OblllllOOO ;se pornete timerul cu numarare la fiecare 256 impulsuri de ceas
ori rl6,ObOOOOOlOO
out TCCR1B,rl6
rjmp end
turn_off:
cpi rl8,6
;s-a tinut apasat cel puin 6s ?
brio endl
;nu, se oprete timer si se iese din intrerupere
in rl6,PINA
; am tinut apasat cel puin 6s, citesc starea ledului
ldi rl7,OblOOOOOOO ; ca sa o pot schimba eor rl6,rl7
out PORTA, rl6
/trimit noua stare a ledului
endl:
ldi rl8,0x00
/pregtesc contorul pt. o noua numarare
in rl6,TCCR1B
andi rl6,0xF8
out TCCR1B,rl6
end:
out SREG,r20 reti
prag_lsec: in r20, SREG in rl6,PINC
sbrs rl6,PC7
/verific daca inca se mai apasa pe buton
inc rl8
out SREG,r20
reti

5. Teme i exerciii
a) S se scrie un program care genereaz pe pinul OC1A (PD5) un semnal dreptunghiular cu frecvena
de 0,5 Hz i factor de umplere 50%.
b) S se scrie un program care numr cte secunde s-a inut apsat pe butonul conectat pe PB6 sau cel
conectat pe PC5 i reflect reprezentarea binar a acestui numr pe portul A respectiv portul D.
Laborator Microcontrolere

Lucrarea 3

Microcontrolerul ATmega32. Utilizarea modulului USART

Scopul lucrrii
a) Prezentarea modulului USART
b)Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVRv7 1.

Tabela de ntreruperi
______Cea mai uzual amplasare a ntreruperilor este descris n tabelul de mai jos.

Nr.
crt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Adresa n
memoria Flash
0x00
0x02
0x04
0x06
0x08
OxOA
OxOC
OxOE
0x10
0x12
0x14
0x16
0x18
OxlA

Descriere
Generat la alimentare sau la un semnal pe pinul RESET
ntrerupere extern 0
ntrerupere extern 1
ntrerupere extern 2
Generat cnd Timer/Counter2 atinge valoarea de prag
Generat cnd Timer/Counter2 atinge valoarea maxim
Generat de unitatea de captur a timerului pe 16 bii
Generat cnd timerul pe 16 bii atinge valoarea de prag A
Generat cnd timerul pe 16 bii atinge valoarea de prag B
Generat cnd timerul pe 16 bii atinge valoarea maxim
Generat cnd Timer/CounterO atinge valoarea de prag
Generat cnd Timer/CounterO atinge valoarea maxim
Generat de unitatea SPI
Generat la recepia complet a unor date de ctre modulul USART

0x1 C
OxlE

Generat cnd registrul de date al modulului USART este gol


Generat la transmisia complet a unor date de ctre modulul
USART
17
0x20
Generat de modulul ADC
18
0x22
Generat de modulul EEPROM
19
0x24
Generat de comparatorul analogic
20
0x26
Generat de modulul TWI
21
0x28
Generat de modulul de auto-scriere a memoriei Flash
2. Prezentarea modulului USART
Modulul USART implementeaz o unitate de emisie i o unitate de recepie
/V

care funcioneaz conform standardului RS232. In Figura 1 este prezentat schema bloc a
modulului USART. Principalele lui caracteristici sunt:
- poate opera full duplex (unitile de emisie i recepie sunt independente)
- lucreaz n mod sincron sau asincron
- cadrele de date pot avea ntre 5 i 9 bii
- calculeaz i verific paritatea independent, far intervenie software
- poate lucra pe baz de ntreruperi

Figura 1. Schema bloc a modulului USART


Pentru a comanda i a utiliza modulul USART, programatorul are la dispoziie un numr
de regitrii care pot fi grupai n urmtoarele categorii:
- registrul de date pentru emisie/recepie UDR
- registrul de 12 bii UBRR pentru calculul vitezei de comunicaie. UBRR este
implementat sub forma a doi regitrii de 8 bii UBRRH i UBRRL care se
iniializeaz separat
- regitrii generali de configurare: UCSRA, UCSRB, UCSRC
2.1. Moduri de operare
Exist patru moduri distincte de operare a modulului USART: asincron normal,
asincron cu vitez dubl, sincron mater i sincron slave.
/V

Modul asincron normal este cel mai utilizat. In acest mod dispozitivul emitor i cel
care recepioneaz au fiecare un ceas intern iar sincronizarea se face prin intermediul
protocolului de comunicare. Modul asincron cu vitez dubl opereaz la fel ca cel normal dar
viteza de comunicaie a microcontrolerului poate fi de dou ori mai mare.
/V

/V

In modul sincron se utilizeaz un singur ceas pentru emitor i receptor. In acest caz
microcontrolerul poate fi mater (genereaz el ceasul pentru comunicaie) sau slave (primete
semnalul de ceas de la dispozitivul cu care comunic).
/V

In tabelul de mai jos este prezentat modul cum se calculeaz viteza de comunicaie n
modurile asincron normal, asincron cu vitez dubl i sincron mater
n funcie de valoarea din registrul UBRR i frecvena ceasului microcontrolerului f

Modul de operare
Asincron normal

Viteza de comunicaie (bps)


f

J osc

16(UBRR +1)

Asincron vitez dubl

f
J osc

8 (UBRR +1)

Sincron mater

J osc

2 (UBRR +1)

2.2.

Recepia i transmisia datelor


Modulul USART din Atmega32 folosete un singur registru de date pentru
emisie/recepie i anume UDR. Diferenierea ntre cele dou situaii se face astfel: octeii care
se scriu n registrul UDR sunt automat trimii la unitatea de emisie; atunci cnd programatorul
solicit citirea registrului UDR, datele din unitatea de recepie sunt ncrcate automat n
registru i astfel se poate avea acces la datele recepionate. Modulul USART poate genera
ntreruperi pentru urmtoarele evenimente:
- recepia corect a unui cadru de date;
- golirea registrului de date de emisie;
- terminarea complet a emisiei unui cadru de date.
2.3.

Configurarea modulului USART


Regitrii utilizai pentru configurare sunt UCSRA, UCSRB i UCSRC. O descriere
general a biilor registrului UCSRA este dat n tabelul de mai

jos.
Denumirea bitului

Descriere

Poziia
bitului
7
6
5

RXC
TXC
UDRE

Este 1 dac s-a terminat recepia; altfel este 0


Este 1 dac s-a terminat emisia; altfel este 0
Este 1 dac registrul de emisie este gol; altfel este 0

FE

DOR

2
1

PE
U2X

Valoarea 1 indic o eroare de format al cadrului la


recepie
Valoarea 1 indic situaia n care buffer-ele de
recepie sunt pline i apare un nou bit de start
Valoarea 1 indic eroare de paritate la recepie
Valoarea 1 activeaz modul asincron cu vitez dubl

MPCM

Valoarea 1 activeaz sistemul de recepie


multiprocesor
0 descriere general a biilor registrului UCSRB este dat n tabelul de mai jos.

Denumirea bitului

Poziia
bitului
7
6
5

RXCIE
TXCIE
UDRIE

4
3
2

RXEN
TXEN
UCSZ2

RXB8

TXB8

Descriere
Valoarea 1 activeaz ntreruperea la recepie
Valoarea 1 activeaz ntreruperea la emisie
Valoarea 1 activeaz ntreruperea pentru registru de
emisie gol
Valoarea 1 activeaz unitatea de recepie
Valoarea 1 activeaz unitatea de emisie
mpreun cu biii UCSZ1:0 din UCSRC determin
formatul cadrului de emisie i a celui de recepie
Reprezint al 9-lea bit cnd se recepioneaz cadre de
9 bii
Reprezint al 9-lea bit cnd se emit cadre de 9 bii

O descriere general a biilor registrului UCSRC este dat n tabelul de mai jos.
Denumirea bitului
Descriere
Poziia
bitului
7
URSEL
Trebuie s fie 1 cnd se scriu date n registrul UCSRC
6

UMSEL

UPM1

UPMO

USBS

UCSZ1
2

ucszo
1
0

UCPOL

Valoarea 1 activeaz modul sincron iar valoarea 0


activeaz modul asincron
UPMl

UPMO

0
0

Paritate

0
1

fr
comb,
neutiliz.
1
0
par
1
1
impar
Valoarea 0 configureaz utilizarea unui bit de
stop iar valoarea 1 utilizarea a doi bii de stop la
emisie
UCSZ2
UCSZl
Dimen. cadru
ucszo
0
0

0
0

0
1

5 bii
6 bii

0
0

1
1

0
1

7 bii
8 bii

comb. neutiliz.

comb. neutiliz.

1
1

1
1

0
1

comb. neutiliz.
9 bii

Este utilizat doar pentru modul sincron

3. Interfaa RS232 pe placa de dezvoltare EasyAVRv7

Placa de dezvoltare EasyAVRv7 ofer dou posibiliti de conectare la modulul USART


al microcontrolerului:
- un montaj realizat cu ajutorul circuitului integrat MAX232 care asigur legtura i
interfaa ntre pinii USART ai microcontrolerului (PDO - recepie i PD1 transmisie) i alte echipamente prevzute cu o conexiune RS232, prin intermediul
unei mufe tip DB9. Circuitul integrat MAX232 realizeaz conversia de tensiune
ntre nivelele TTL folosite de microcontroler i nivelele uzuale pentru alte
echipamente, mai ales PC-uri
- un montaj (USB UART) care convertete interfaa USART a microcontrolerului
(PDO - recepie i PD1 - transmisie) ntr-o interfa USB folosind circuitul integrat
FTDI FT232RL
Deoarece PC-urile actuale nu mai sunt echipate cu porturi RS232, n cadrul
laboratorului se va utiliza montajul cu conexiune USB (reprezentat n figura de mai jos) pentru
a comunica cu interfaa USART a microcontrolerului. Pentru aceasta sunt necesare
urmtoarele:
- un cablu USB (altul dect cel folosit pentru programarea microcontrolerului)
conectat ntre mufa USB UART i un port USB al calculatorului
- instalarea pe calculator a driverelor pentru circuitul FT232RL. Astfel se va crea un
port de tip COM virtual care poate fi utilizat n aplicaiile de comunicaie serial
- comutarea SW10 de pe placa EasyAVRv7 pe poziia ON" pentru pinii PDO iPDl
- comutarea J12 i J23 de pe placa EasyAVRv7 pe poziia corespunztoare USB
UART.

Figura 2. Montajul USB UART al plcii EasyAVRv7


4. Software-ul Simple Serial Monitor
Simple Serial Monitor este un software dedicat pentru a recepiona i transmite date prin
intermediul unei interfee COM a calculatorului. Acesta este preinstalat pe calculatoarele din
laborator i poate fi accesat din directorul My Documents. Pe sistemele de operare Windows
7/8/8.1 fiierul executabil sermon.exe" trebuie lansat cu opiunea Run as administrator" pentru
a funciona corect.
La execuie programul afieaz fereastra din Figura 3. In partea stng sunt grupate
setrile pentru interfaa serial. Astfel, cmpul VISA resource name" trebuie s conin
denumirea portului COM creat la instalarea driverelor pentru circuitul FT232RL. Celelate

cmpuri trebuie s fie configurate cu aceleai valori ca cele specificate n programul implementat
pe microcontroler.
Dup configurarea setrilor pentru interfa serial, utilizatorul trebuie s apese butonul
ON/OFF" pentru a porni programul. Din acest moment se pot recepiona date - dac butonul
read" este n poziia ON (culoare verde) i se pot transmite date dac butonul write" este n
poziia ON (culoare verde). Datele vor fi transmise caracter cu caract pe msur ce utilizatorul le
introduce n cmpul string to write".
Trebuie avut n vedere c datele transmise i recepionate de programul Simple Serial
Monitor sunt interpretate sub form de coduri ASCII.

si rial.'

VISA
resourc
e name

^
CO
NTI
baud

rate

Jseo
o
parity

Kz
Zr

lata bib
actual
bytt read

r
ri'ad

filing

read

stop bits

EXIT

Figur
a 3.
Interf
aa
progr
amul
ui
Simp
le
Serial
Moni
tor

5. Exemple de programe
a) S se scrie un program care trimite prin interfaa serial textul lab micro3" la fiecare 3s. Se
utilizeaz mod asincron cu o vitez de 300bps, cadru de 8 bii, paritate par i doi bii de stop. n
timpul emisiei se va aprinde ledul conectat pe pinul PA4.

.include "m32def.inc"
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp au_trecut_3s
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:
Idi rl 6,high(RAMEND)
out SPH,rl6
ldi rl6,low(RAMEND)
out SPL,rl6
ldi rl6,Obllllllll
out DDRA,rl6 ; portul A, unde sunt conectate led-urile, este setat ca ieire ldi rl7,0x00
out porta,rl7
;sting toate ledurile
main:
cli
/dezactivare intreruperi
ldi rl6,ObOOOOlOOO ;in rndurile de mai jos se configureaz out UCSRB,rl6
/modulul USART
prin registrii UCSRB si UCSRC
ldi rl6,OblOlOlllO out UCSRC,rl6
ldi rl6,0x06
/se seteaza viteza de comunicaie
out UBRRH,rl6
/avand in vedere ca frecventa ceasului
ldi rl6,0x81
/este 8MHz
out UBRRL,rl6
ldi rl6,ObOOOOOOOO /setare timer: nu se utilizeaz pinii OC1A si OC1B out TCCR1A,r16 /modul va
fi CTC cu prag dat de OCR1A
in rl6, TIMSK
andi rl6,ObllOlOOll /nu se utilizeaza intr. unitatii de captura ori rl6,ObOOOlOOOO /se
utilizeaza intr. de egalitate cu prag OCR1A out TIMSK, rl6
/nu se utilizeaza intr. de
egalitate cu prag OCR1B
/nu se utilizeaza intr. la atingerea valorii max pe
16biti
ldi rl6, 0x5B
out OCR1AH,rl6
se incarca valoarea de prag: 0x5B8E=23438 r 23438 * 1/(8MHz/1024) =~ 3s
ldi rl6, 0x8E
out OCR1A1,rl6
se pornete timerul si este setat sa numere la fiecare 1024 perioade de
ldi
ceas activare intreruperi
rl6,ObOOOOllOl
out TCCR1B,rl6
sei
bucla:
rjmp bucla
au_trecut_3s: in
r20,SREG ldi
rl6,ObOOOlOOOO out
PORTA, rl6 ldi
rl6,0x6C out
UDR,rl6 call wait

/in r20 salvez registrul de stare


/aprind ledul
/codul ascii pentru "1"
/apelez o funcie de ateptare
ldi rl6,0x61 /codul ascii pentru "a"
out UDR,rl6 call wait

ldi rl6,0x62
/codul ascii pentru "b"
out UDR,rl6 call wait
ldi rl6,0x20
/codul ascii pentru " "(spaiu)
out UDR,rl6 call wait
ldi rl6,0x6D
/codul ascii pentru "m"
out UDR,rl6 call wait
ldi rl6,0x69
/codul ascii pentru "i"
out UDR,rl6 call wait
ldi rl6,0x63
/codul ascii pentru "c"
out UDR,rl6 call wait
ldi rl6,0x72

/codul ascii pentru "r"

out
UDR,rl6
call wait

ldi
rl6,0x6F
out UDR,rl6
call wait
ldi
rl6,0x33
out UDR,rl6
call wait

; codul ascii
pentru "0"

; codul ascii
pentru "3"

;codul ascii
pentru "
"(spaiu)

: sting ledul
:restaurez
registrul
de stare
:revin din
intrerupere

ldi
rl6,0x20
out UDR,rl6
call wait
ldi rl6,0x00
out
PORTA,rl6
out SREG,r20
reti

wait:
in rl6,UCSRA
sbrs rl6,UDRE
rjmp wait ret

/citesc
starea
modulului
USART
/verific daca
registrul de
emisie/recept
ie e
/registrul nu
este gol, mai
atept
/registrul
este gol,
revin din
ateptare

b) S se scrie
un
program
care
aprinde
iniial
ledurile
conectat
e
pe
pinii
PC3 i
PC4 i
primete
urmtoa
rele

gol

comenzi
pe
interfaa
RS232:
s"
determi
n
deplasar
ea celor
dou
leduri cu
o poziie
la stnga
(ctre
PC7),
d"
determi
n
deplasar
ea celor
dou
leduri cu
o poziie
la
dreapta
(ctre
PC0);
orice
alte
caracter
e
primite
sunt
ignorate.
Se
utilizeaz
mod
asincron
cu
o
vitez
de
9600bps
, cadru
de 8 bii,
paritate
par i
un bit de
stop.

.include "m32def.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 receptie
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,OxFF
out DDRC,rl6
; portul C este setat ca iesire
ldi rl7,ObOOOllOOO ;se aprind ledurile initiale out
portc,rl7 main: cli

ldi rl6,OblOOOOOOO out UCSRB,rl6 ldi rl6,OblOlOOllO


out UCSRC,rl6 ldi rl6,0x00 out UBRRH,rl6 ldi rl6,0x33
out UBRRL,rl6 sbi UCSRB,RXEN ldi rl8,0x00
sei
bucla: rjmp bucla

/salvez registrul de stare in r20


;am receptionat "s" ?
;da, trebuie sa deplasez ledurile
;(PC = Program Counter)
;nu am recptionat "s" si trec la urmatoarea
verificare ;verfic daca anterior carry a fost 0
(aici este PC+2) /anterior carry a fost 1 deci
acum va lua aceasta valoare
/anterior carry a fost 0 deci acum va lua aceasta
valoare /rotesc ledurile la stanga prin carry /salt
daca in urma rotatiei carry = 0 /salvez noul carry
/aici este PC+3, corespunztor
carry = 0 /scriu noua stare a
ledurilor
ram receptionat "d" ?
;nu am receptionat d", ignor orice alt caracter primit

/activez unitatea de receptie


;rl8
va
fi
utilizat
pentru
valoare ;a indicatorului carry

receptie: in
r20,SREG in
rl6,UDR cpi
rl6,0x73
breq PC+2
rjmp et2
sbrc rl8,0
sec
sbrs rl8,0

clc

rol rl7 brcc


PC+3 ldi
rl8,0x01
brcs PC+2
ldi rl8,0x00
out
portc,rl7
rjmp end et2
:
cpi rl6,0x64
breq PC+2
rjmp end

memora

ultima

sbrc rl8,O sec


sbrs rl8,O clc
ror rl7 brcc PC+3 ldi rl8,0x01 brcs PC+2 ldi
rl8,0x00 out porte,rl7 end:
out SREG,r20
/restaurez registrul de stare
reti
/revin din intrerupere

c) S se scrie un program care la fiecare lOs transmite pe interfaa RS232 starea butoanelor PD5, PD6 i
PD7 sub forma unui mesaj text de tipul PDnr butom up" sau PDnr butom down". Se presupune
c apsarea unui buton aduce pinul respectiv la nivelul 0 logic. Se utilizeaz mod asincron cu o
vitez de 9600bps, cadru de 8 bii, paritate par i un bit de stop.

.include "m32def.inc"
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp au trecut 2s
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

/portul D este setat ca intrare


/se activeaza rezistentele pull-up pentru PD5, PD6 si PD7 ;rl8 este utilizat pt numararea
secundelor
/dezactivare intreruperi
/in rndurile de mai jos se configureaz /modulul USART prin registrii UCSRB si UCSRC
/se seteaza viteza de comunicaie /avand in vedere ca frecventa ceasului /este 8MHz
/setare timer: nu se utilizeaz pinii OC1A si OC1B /modul va fi CTC cu prag dat de OCR1A
/nu
/se
/nu
/nu

se utilizeaza intr.
utilizeaza intr. de
se utilizeaza intr.
se utilizeaza intr.

unitatii de captura
egalitate cu prag OCR1A
de egalitate cu prag OCR1B
la atingerea valorii max pe 16biti

ldi rl6, 0xF4


out
OCR1AH,rl6
ldi rl6, 0x24
out
OCR1A1,rl6
ldi
rl6,ObOOOOllO
O
out
TCCR1B,rl6
sei
bucla: rjmp
bucla

/se incarca valoarea de prag: 0xF424=62500 ; 62500 * 1/(8MHz/256) = 2s

au_trecut_2s: in
r20,SREG inc rl8
cpi rl8,0x05
brio end ldi
rl8,0x00

/codul ascii pentru 5 /se verifica PD5

in rl6, PIND ldi


rl7,0x35 call
msg_generic sbrc
rl6, PD5 call
msg_up sbrs rl6,
PD5 call
msg_down
ldi rl7,0x36
call msg_generic
sbrc rl6, PD6
call msg_up sbrs
rl6,PD6 call
msg_down
ldi rl7,0x37
call msg_generic
sbrc rl6, PD7
call msg_up sbrs
rl6,PD7 call
msg_down
ldi rl9,OxOd
out UDR,rl9
call
wait
ldi rl9,0x0a
out UDR,rl9
call wait

/se pornete timerul si este setat sa numere /la fiecare 25 6 perioade de ceas /activare
intreruperi

/in r20 salvez registrul de stare /au trecut 2 x 5 = 1 0 s ?

/codul ascii pentru 6 /se verifica PD6

/codul ascii pentru 7 /se verifica PD7

/codul ascii pentru enter (CR)


/apelez o funcie de ateptare /codul ascii pentru enter (LF)

ldi rl6,low(RAMEND) /apelez o funcie de ateptareend:


out SPL,rl6
out SREG,r20
/restaurez registrul de stare
ldi rl6,ObOOOOOOOO
reti
/revin din intrerupere
out DDRD,rl6
ldi rl6,OblllOOOOO
out PORTD,rl6
msg_generic
ldi rl8,0x00
:
ldi
/codul ascii pentru "P"
main:
rl9,0x50 cli
/apelez o funcie de ateptare /codul ascii pentru "D"
out UDR,rl9
ldi rl6,0b00001000
call
wait
out UCSRB,rl6 ldi
/apelez o funcie de ateptare
ldi
rl6,OblOlOOllO out
rl9,0x44 UCSRC,rl6 ldi
/codul ascii corespunztor butonului /apelez o funcie de ateptare /codul ascii pentru ":"
out UDR,rl9
rl6,0x00 out
call wait UBRRH,rl6 ldi
/apelez o funcie de ateptare
rl6,0x33 out
out UDR,rl7
UBRRL,rl6 ldi
call
wait rl6,ObOOOOOOOO out
ms g_up:
ldi
TCCR1A,r16 in rl6,
/codul ascii pentru "u"
ldi
rl9,0x3A
rl9,0x75 TIMSK andi
out
/apelez o funcie de ateptare /codul ascii pentru "p"
rl6,ObllOlOOll ori
out UDR,rl9
UDR,rl9
call
call wait
wait rl6,0b00010000 out
ret
/apelez o funcie de ateptare /codul ascii pentru " "(spaiu)
TIMSK, rl6
ldi
rl9,0x70
/apelez o funcie de ateptare
out UDR,rl9
call wait
ldi
ms g_down:
rl9,0x20
:codul ascii pentru "d"
ldi
out UDR,rl9
rl9,0x64
call wait
:apelez o funcie de ateptare :codul ascii pentru "o"
out UDR,rl9
ret
call wait
:apelez o funcie de ateptare :codul ascii pentru "w"
ldi
rl9,0x6f
out UDR,rl9
call wait
ldi
rl9,0x77
out UDR,rl9
call wait
ldi
rl9,0x6e
out UDR,rl9
call wait
ldi
rl9,0x20
out UDR,rl9
call wait
ret

:apelez o funcie de ateptare :codul ascii pentru "n"


:apelez o funcie de ateptare :codul ascii pentru " "(spaiu)
:apelez o funcie de ateptare

/citesc starea modulului USART


/verific daca registrul de emisie/receptie e gol /registrul nu este gol,
mai atept /registrul este gol, revin din ateptare

6. Teme i exerciii
a) S se scrie un program care primete pe interfaa RS232 un numr cuprins ntre 0 i 7 i rspunde cu
starea butonului PA corespunztor. Orice alte caractere primite se vor ignora. Mesajul de rspuns va
fi un text de forma sus" (coduri ASCII 115, 117 i 115 ) sau jos" (coduri ASCII 106, 111 i 115 ).
Imediat dup ce se recepioneaz un caracter valid, se va aprinde ledul PB corespunztor, se va
menine aprins pe toat perioada transmisiei mesajului de rspuns i apoi se va stinge. Se utilizeaz
mod asincron cu o vitez de 2400bps, cadru de 8 bii, paritate par i un bit de stop.

wait:
in r21,UCSRA
sbrs r21,UDRE
rjmp wait ret

Laborator Microcontrolere

Lucrarea 4
Microcontrolerul ATmega32. Utilizarea modulului de conversie A/D Utilizarea
unui afior LCD alfanumeric

Scopul lucrrii
a) Prezentarea modulului de conversie A/D al microcontrolerului ATmega32
b)Descrierea modului de utilizare a unui modul de afiare LCD alfanumeric b)
Programarea unor aplicaii utiliznd placa de dezvoltare EasyAVRv7
1. Tabela de ntreruperi
______Cea mai uzual amplasare a ntreruperilor este descris n tabelul de mai jos.
Descriere
Adresa n
Nr.
crt. memoria Flash
1
0x00
Generat la alimentare sau la un semnal pe pinul RESET
2
0x02
ntrerupere extern 0
3
0x04
ntrerupere extern 1
4
0x06
ntrerupere extern 2
5
0x08
Generat cnd Timer/Counter2 atinge valoarea de prag
6
OxOA
Generat cnd Timer/Counter2 atinge valoarea maxim
7
OxOC
Generat de unitatea de captur a timerului pe 16 bii
8
OxOE
Generat cnd timerul pe 16 bii atinge valoarea de prag A
9
0x10
Generat cnd timerul pe 16 bii atinge valoarea de prag B
10
0x12
Generat cnd timerul pe 16 bii atinge valoarea maxim
11
0x14
Generat cnd Timer/CounterO atinge valoarea de prag
12
0x16
Generat cnd Timer/CounterO atinge valoarea maxim
13
0x18
Generat de unitatea SPI
14
OxlA
Generat la recepia complet a unor date de ctre modulul USART
15
16

0x1 C
OxlE

17
18
19
20
21

0x20
0x22
0x24
0x26
0x28

Generat cnd registrul de date al modulului USART este gol


Generat la transmisia complet a unor date de ctre modulul
USART
Generat de modulul ADC
Generat de modulul EEPROM
Generat de comparatorul analogic
Generat de modulul TWI
Generat de modulul de auto-scriere a memoriei Flash

Prezentarea modulului de conversie A/D


Modulul de conversie A/D (ADC - Analog to Digital Converter) permite transformarea
semnalelor analogice aplicate pe anumii pini ai microcontrolerului n valori numerice. In
Figura 1 este prezentat schema bloc a modulului ADC. Principalele lui caracteristici sunt:
- mod de lucru pe baz de aproximaii succesive
- alimentare separat pe pinul AVCC
- vitez maxim de 15kSPS
- rezoluie de 10 bii
- 8 canale multiplexate, ADC0...ADC7 corespunztoare pinilor PA0...PA7
- rezultatul conversiei poate fi aliniat la stnga, simplificnd calculele cu preul
reducerii rezoluiei la 8 bii
-poate genera ntrerupere la finalizarea conversiei
-se pot selecta trei tipuri de nivele de referin
- se pot selecta mai multe surse pentru iniierea unei conversii, incluznd un mod de
2.
funcionare permanent
ADC OON"EHSION

Figura 1. Schema bloc a modulului ADC

Rolul oricrui modul de conversie A/D este de a transforma o tensiune analogic ntr-o
valoare numeric. Cele mai importante elemente care definesc aceast transformare sunt
valoarea tensiunii de referin i rezoluia convertorului. Astfel, rezoluia stabilete numrul
maxim de trepte n care se poate cuantiza tensiunea de intrare iar tensiunea de referin
stabilete valoarea maxim a tensiunii de intrare.
Dac notm cu N rezoluia i Vref tensiunea de referin, atunci treapta unui converter
A/D sau 1 LSB se definete ca:
1 LSB = Vref/ 2N (V)
Valoarea treptei se exprim n voli i n funcie de aceasta i rezultatul conversiei C, se
poate afla tensiunea de intrare n convertor Vin pe baza relaiei:
Vm = C*l LSB (V)
Valoarea maxim a tensiunii de intrare care poate fi msurat este ntotdeauna V ref- 1
LSB.
Modulul ADC din ATmegal6 poate avea trei surse ca tensiune de referin:
- valoarea de pe pinul AVCC
- valoarea de pe pinul AREF
- o tensiune generat intern cu valoarea de 2,56V
/V

In cadrul acestui laborator se va utiliza ca tensiune de referin valoarea tensiunii de


alimentare de 5V pe care placa de dezvoltare EasyAVRv7 o conecteaz pe pinul AREF.
Folosind formulele prezentate anterior, pentru rezoluia de 10 bii rezult c 1 LSB=4,88mV.
Pentru a comanda i a utiliza modulul ADC, programatorul are la dispoziie un numr
de regitrii care pot fi grupai n urmtoarele categorii:
- regitrii ADCL i ADCH pentru stocarea rezultatului unei conversii
- regitrii generali de configurare: ADMUX i ADCSRA
- registrul special de configurare SFIOR, utilizat i de alte module ale
microcontrolerului.
2.1. Configurarea i utilizarea modulului de conversie A/D
La finalul unei conversii, rezultatul acesteia se va regsi n regitrii ADCH i
/V

ADCL. In mod normal, se citete mai nti ADCL i apoi ADCH pentru a utiliza precizia
complet de 10 bii. Cu toate acestea, dac s-a configurat alinierea rezultatului la stnga
(Figura 3), utilizatorul poate citi numai registrul ADCH obinnd astfel o valoare mai uor de
prelucrat dar care corespunde unei precizii a convertorului de numai 8 bii.
Convertorul poate msura tensiunea aplicat pe oricare din cele opt canale reprezentate
de pinii ADC0...ADC7, dar nu simultan. De aceea, numai unul dintre acestea va fi activ la un
moment dat, selecia realizndu-se pe baza unor bii din registrul ADMUX. Trebuie avut n
vedere c aceti bii pot fi oricnd modificai dar, la nivelul hardware, selecia unui nou canal
se face imediat numai dac nici o conversie nu este n desfurare. Altfel, selecia se va realiza
dup ce se termin conversia curent.

Regitrii utilizai pentru configurare sunt ADMUX, ADCSRA i SFIOR. O descriere


general a biilor registrului ADMUX este dat n tabelul de mai
jos.
Denumirea bitului

Poziia
bitului
7

Descriere
REFSl

REFS1

REFS0

ADLAR

4
3

MUX4
MUX3

2
1
0

MUX2
MUX1
MUX0

REFS0

Sursa tensiunii de
referin
AREF

0
0
AVCC
0
1
Neutilizat
1
0
2,56V intern
1
1
Valoarea 0 determin alinierea la dreapta a
rezultatului conversiei, aa cum se poate vedea n
Figura 2. Valoarea 1 determin alinierea la stnga a
rezultatului conversiei, ca n Figura 3.
Combinaia acestor bii selecteaz canalul de
/V

intrare pentru ADC. In cadrul laboratorului se va


utiliza doar setarea 00000 care corespunde
canalului ADC0, adic pinul PA0 al
microcontrolerului.

15

14

13

12

ADC7

ADC6

ADC5

ADC4

11
ADCH
ADCL
ADC3

10

ADC9

ADC8

ADC2

ADC1

ADCO

ADCH i ADCL n cazul alinierii la dreapta a rezultatului conversiei


ADC9

ADC8

ADC1

ADOO

15

14

ADC7
-

13

ADC6

ADC5

ADC4

ADC3

12

11

10

2.

ADC2

Figura

ADC
H
ADCL

Figura 3. ADCH i ADCL n cazul alinierii la stnga a rezultatului conversiei

O descriere general a biilor registrului ADCSRA este dat n tabelul de mai jos.
Utilizatorul trebuie s acorde atenie mai ales biilor ADPS0...ADPS2 care stabilesc
frecvena ceasului convertorului funcie de frecvena de tact a procesorului, fose- Astfel,
convertorul are nevoie de un semnal de tact cuprins ntre 50kHz i 200kHz pentru a
funciona corect.
Denumirea bitului

Poziia
bitului
7

ADEN

ADSC

Descriere
Acest bit trebuie s fie 1 pentru ca modulul ADC s
funcioneze. Altfel, acesta este oprit
Cnd acest bit devine 1 se iniiaz nceperea unei
conversii

Cnd acest bit este 1, dup o prim conversie


iniiat de utilizator, convertorul va realiza
automat alte conversii n funcie de evenimentele
selectate n registrul SFIOR
Acest bit devine 1 la terminarea unei conversii
Valoarea 1 activeaz ntreruperea la finalizarea
conversiei

ADATE
J
4
3

ADIF
ADIE

ADPS2

ADPS1

ADPSO

ADPS2

ADPS1

ADPSO

0
1
1

1
0
0

1
0
1

1
1

1
1

0
1

Ceasul ADC

f/2
J-OSC '
^
f/2
J-OSC '
^
f/4
1
osc ' '
fose / 8
fose / 16
f / 32
J-osc '
fose / 64
fose /
128

Biii 5 (ADTSO), 6 (ADTS1) i 7 (ADTS2) din registrul SFIOR selecteaz


evenimentul care declaneaz o nou conversie n modul de funcionare automat
(ADATE=1). Aceste evenimente sunt de fapt semnale de ntrerupere i utilizarea lor va
determina activarea flagului corespunztor. Acesta trebuie s fie dezactivat dup ce s-a
realizat o conversie pentru a permite o nou autodeclanare la respectivul eveniment.
Deoarece acest registru este utilizat i de alte module ale microcontrolerului, utilizatorul va
avea grij s nu modifice dect valoarea biilor 5..7 ale cror combinaii posibile sunt
descrise n tabelul de mai jos.
ADTS2

ADTS1

ADTSO

Eveniment de autodeclanare
Funcionare permanent: dup terminarea unei
conversii se ncepe imediat alta
Semnalul de ntrerupere generat de
comparatorul analogic
Semnalul de ntrerupere generat de ntreruperea
extern 0
Semnalul de ntrerupere generat cnd
Timer/CounterO atinge valoarea de prag
Semnalul de ntrerupere generat cnd
Timer/CounterO atinge valoarea maxim

Semnalul de ntrerupere generat cnd timerul pe


16 bii atinge valoarea de prag B
Semnalul de ntrerupere generat cnd timerul pe
16 bii atinge valoarea maxim
Semnalul de ntrerupere generat de unitatea de
captur a timerului pe 16 bii

3. Prezentarea modulelor LCD alfanumerice


Un modul LCD alfanumeric este format dintr-un ecran LCD i o serie de circuite
integrate care asigur comanda i controlul acestuia. Astfel, se pot afia caractere i cifre
prin intermediul unei interfee de tip magistral format din 8 sau 4 bii de date i 3 semnale
de comand: RS, R/W i E.
Orice modul LCD are prestabilit un anumit set de caractere i dispune de dou tipuri
de memorii RAM: una pentru afiare de caractere i una pentru a memora modele pentru
caractere noi.
Ficrui caracter de pe ecran i corespunde o locaie prestabilit din memoria RAM
pentru afiare. Astfel, atunci cnd utilizatorul dorete s afieze un caracter, el trebuie s
scrie codul caracterului n locaia RAM corespunztoare. Dup ce s-a efectuat o scriere,
adresa RAM este automat incrementat de modulul de afiare astfel c, dac se afieaz pe
poziii succesive, nu mai este nevoie s se seteze de fiecare dat adresa. Pentru un afior cu
2 rnduri a cte 16 caractere fiecare, corespondena ntre adresa din memoria RAM de
afiare (valori n hexazecimal) i poziia caracterului pe ecran este dat n tabelul de mai jos.
Poziia pe
ecran
Adrese rnd 1
(cel de sus)
Adrese rnd 2
(cel de jos)

10

11

12

13

14

15

16

00

01

02

03

04

05

06

07

08

09

0A

0B

OC

0D

0E

OF

40

41

42

43

44

45

46

47

48

49

4A

4B

4C

4D

4E

4F

Setul prestabilit de caractere definete codul asociat fiecrui caracter pe care l poate
afia modulul respectiv i difer de la un productor la altul. Cu toate acestea, n majoritatea
cazurilor cifrele, literele mari i mici, semnele de punctuaie precum i simbolurile
matematice uzuale au acelai cod ca cel din tabela ASCII.
Comunicarea cu un modul de afiare LCD se face prin intermediul unor comenzi
descrise n documentaia productorului. Aceste comenzi sunt definite de
/V

combinaia semnalelor RS, R/W i a unui numr de 8 bii de date. In plus, atunci cnd
semnalul E trece din 0 n 1, datele de pe magistrala de comunicaie (avnd 8 sau 4 bii) sunt
preluate de ctre modulul de afiare. Atunci cnd se lucreaz cu o magistral de 4 bii, se
transmite mai nti partea superioar din cei 8 bii de date ai unei comenzi i apoi partea
inferioar.
Dup ce a primit toi biii corespunztori unei comenzi, modulul LCD ncepe
/V

execuia acesteia. In aceast perioad nu se mai poate transmite nici o alt comand, prin
urmare utilizatorul trebuie fie s atepte timpul de execuie minim specificat de productor,
fie s citeasc n permanen indicatorul Busy al modulului LCD pn cnd acesta
semnaleaz finalizarea comenzii.

Setul de comenzi al unui modul LCD poate fi mprit n urmtoarele categorii


generale:
comenzi de iniializare i configurare
- comanda de selecie a unei adrese din memoria RAM pentru afiare de caractere
- comanda de selecie a unei adrese din memoria RAM pentru memorarea de modele
pentru caractere noi
comanda de citire a indicatorului Busy
comanda de scriere a datelor n una din memoriile RAM selectate
comanda de citire a datelor din una dintre memoriile RAM selectate
Pentru a selecta o adres din memoria RAM pentru afiare de caractere,
semnalele R/W i RS trebuie s fie 0, bitul de date 7 trebuie s fie 1 iar biii de date 0...6
trebuie s conin valoarea adresei care se selecteaz.
Pentru a scrie o valoare la o adres selectat din oricare memorie RAM, semnalul R/W
trebuie s fie 0, semnalul RS trebuie s fie 1 iar biii de date trebuie s conin valoarea care
se dorete a fi scris.
/V

In cadrul acestui laborator se va utiliza un modul LCD cu 2 linii a cte 16 caractere


fiecare, conectat pe o magistral de 4 bii: PC4, PC5, PC6 i PC7. Semnalul RS este comandat
de PA2, semnalul R/W este conectat n permanen la 0V iar semnalul E este comandat de
PD6.
Pe perioada de execuie a unei comenzi de ctre modulul de afiare se vor genera
intervale de ateptare cu aproximativ 10% mai mari dect timpii de execuie specificai de
productor.
4. Exemple de programe S se scrie un program care afieaz pe rndul 1 al modulului LCD textul
a) Lab. microC 4" i pe rndul 2 textul Mesaj test".

.include "m32def.inc" .equ rs=PA2 .equ e=PD6 .equ


ctrl=PORTD .equ ctrl2=PORTA
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 rl6,high(RAMEND)

reset
reset
reset
reset
reset

jmp
jmp
jmp
jmp
jmp

pinii PC7...PC4 sunt ieiri pinul PD6 este ieire pinul PA2 este
ieire

/setare
timerO:nu
se
utiliz.
pinul
OCO,
deocamdata /modul va fi CTC cu prag dat de OCRO
ou SPH,rl6
t
rl6,low(RAMEND
ld ) SPL,rl6
i
rl6,ObllllOOOO
ou DDRC,rl6
t
rl6,ObOlOOOOOO
ld DDRD,rl6
i
rl6,ObOOOOOlOO
ou DDRA,rl6
t
ld
i
ou
t
ld
i
ou
t
ma
in
:
cl
i
cbi ctrl,e
cbi ctrl2,rs
ldi rl6,ObOOOOlOOO
out TCCRO,rl6
in rl6, TIMSK
andi rl6,ObllllllOO
out TIMSK, rl6

timerul

este

oprit

/nu se utiliz. nici o intrer., fara a modifica alti biti din TIMSK

call init_display ldi rl7,OblOOOOOOO


call set_ram
/prin rl7 se seteaza adresa 0x00 pentru RAM de
afiare
ldi rl7,'L'
call put_char
ldi rl7,'a'
call put_char
ldi rl7,'b'
call put_char
ldi rl7,'.'
/punct
call put_char
ldi rl7,' '
/spaiu
call put_char
ldi rl7,'m'
call put_char
ldi rl7,''
call put_char
ldi rl7,'c'
call put_char
ldi rl7,'r'
call put_char
ldi rl7,'o'
call put_char
ldi rl7,'C'
call put_char
ldi rl7,' '
call put_char
ldi rl7,'4'
call put_char
ldi rl7,ObllOOOOll /prin rl7 se seteaza adresa 0x43 pentru RAM de afiare
call set ram
ldi
'M'
rl7,"
call put char
ldi
'e'
rl7,"
call put char
ldi
' s
rl7,"
'
call put char
ldi
'a'
rl7,"
call put char
ldi
' j
rl7,"
'
call put char
ldi
i i
rl7,"
call put char
ldi
' t'
rl7,"
call put char
ldi
'e'
rl7,"
call put char
ldi
' s

rl7,"
call put
ldi
rl7,"
call put

'
char
' t'
char

bucla: rjmp bucla


init_display: cbi ctrl2,rs ldi rl6,ObOOlOOOOO out PORTC,rl6 sbi ctrl,e
call wait_48us cbi ctrl,e
ldi rl6,ObOOlOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
ldi rl6,OblOOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
call wait_30ms
ldi rl6,ObOOOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
ldi rl6,ObllOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
call wait_30ms
ldi rl6,ObOOOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
ldi rl6,ObOOOlOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
call wait_30ms
ldi rl6,ObOOOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
ldi rl6,ObOOlOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e
call wait_30ms ret
set_ram: cbi ctrl2,rs mov rl6,rl7
andi rl6,0xF0
;se retine doar nibble (4 biti) superior
out PORTC,rl6
sbi ctrl,e
nop
nop
cbi ctrl,e mov rl6,rl7

andi rl6,0x0F
;se retine doar nibble (4 biti) inferior
swap rl6
;interschimba nibble (4 biti) sup. cu nibble (4 biti) inf.
out PORTC,rl6
sbi ctrl,e
nop
nop
cbi ctrl,e call wait_48us ret

put_char: sbi
ctrl2,rs mov
rl6,rl7 andi
rl6,OxFO out
PORTC,rl6 sbi
ctrl,e nop
nop
cbi ctrl,e
mov rl6,rl7
andi rl6,OxOF
swap rl6 out
PORTC,rl6 sbi
ctrl,e nop
nop
cbi ctrl,e
call
wait_48us ret

se retine doar nibble (4 biti) superior

se retine doar nibble (4 biti) inferior


interschimba nibble (4 biti) sup. cu nibble (4 biti) inf.

wait_4 8us:
ldi
rl6,0x00
out
TCNTO,rl6
ldi rl6, 0x06
;se incarca valoarea de prag: 0x06=6
out OCRO,rl6
;6 * l/(8MHz/64) =48us
in rl6,TCCR0
andi rl6,OblllllOOO
;se pornete timerul si este setat sa numere
ori rl6,ObOOOOOOll
;
la fiecare 64 perioade de ceas, fara a modif. alti biti
out TCCR0,rl6 wait:
in rl6,TIFR
sbrs rl6,OCFO
;se asteapta atingerea pragului OCRO
rjmp
wait
in rl6,TIFR
ori
rl6,ObOOOOO
OlO
out TIFR,rl6
;se reseteaza flagul
in rl6,TCCR0
andi rl6,OblllllOOO ;se oprete timerul
out TCCR0,rl6
ret

;se incarca valoarea de prag: 0xF0=240 ;2 40 * 1/(8MHz/1024) =~ 30ms


;se pornete timerul si este setat sa numere ;
fiecare 1024 per. de ceas, fara a modif.

se asteapta atingerea pragului OCRO

se reseteaza flagul se oprete timerul


wait_30ms:
ldi rl6,0x00
out TCNTO,rl6
ldi rl6, OxFO
out OCRO,rl6
in rl6,TCCR0
andi rl6,OblllllOOO
ori rl6,ObOOOOOlOl
out TCCR0,rl6
waitl:
in rl6,TIFR
sbrs rl6,OCFO
rjmp waitl
in rl6,TIFR
ori rl6,ObOOOOOOlO
out TIFR,rl6
in rl6,TCCR0
andi rl6,OblllllOOO
out TCCR0,rl6
ret

la

alti biti

b) S se scrie un program de tip VU-metru" care aprinde succesiv ledurile conectate pe pinii PB0...PB7
n funcie de valoarea tensiunii aplicat pe pinul ADC6 al microcontrolerului.

(^^START J^)
1r
Setare porturi

Setare ADC

.include "m32def.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 gata_conversia
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,OxFF
out DDRB,rl6 ; portul B este ieire
main:
cli
ldi rl6,ObOOlOOllO ;setare ADC: AREF este referina, canal ADC6 out ADMUX,rl6
/rezultatul se aliniaza la stanga
ldi rl6,OblOlOlllO /activare intrer., setare ceas ca fosc/64 out ADCSRA,rl6
/deocamdata nu s-a initiat conversia
in rl6, SFIOR
andi rl6,ObOOOlllll /setarea modului de funct. perm., fara a modifica alti biti
out SFIOR, rl6
sei
sbi ADCSRA,ADSC
;se initiaza conversia
bucla: rjmp bucla

/se citete rezultatul conversiei, pastrand precizie de numai 8 biti /se sting
toate ledurile
/primul nivel de comparaie, echiv. la 19,5mV

cpi rl7,32
brio end ldi
rl6,0x03 out
PORTB,rl6

ral doilea nivel, echiv. la 62 4mV

cpi rl7,64
brio end ldi
rl6,0x07 out
PORTB,rl6

ral treilea nivel, echiv. la 1248mV

cpi rl7,96 brio end ldi rl6,OxOF out PORTB,rl6


cpi rl7,12 8 brio end ldi rl6,OxlF

gata_conversia:
in r20,SREG in
rl7,ADCH ldi
rl6,0x00 out
PORTB,rl6 cpi
rl7,0x01 brio
end ldi
rl6,0x01 out
PORTB,rl6

out PORTB,rl6
cpi rl7,160
brio end ldi
rl6,0x3F out
PORTB,rl6
cpi rl7,192
brio end ldi
rl6,0x7F out
PORTB,rl6
cpi rl7,224
brio end ldi
rl6,OxFF out
PORTB,rl6
end:
out SREG,r20
reti

c) S se scrie un program care convertete la fiecare 2s valoarea tensiunii de pe pinul ADC6 i afieaz
rezultatul conversiei pe modulul LCD. Mesajul afiat va avea pe prima linie textul Tensiunea
este:" iar pe a doua linie textul va/oarex4,9mV" unde valoare reprezint cei 10 bii ai rezultatului
conversiei.

pinii PC7...PC4 sunt ieiri pinul PD6 este ieire pinul PA2 este ieire

;setare ADC: AREF este referina, canal ADC6 /rezultatul se aliniaza la dreapta /activare
intrer., setare ceas ca fosc/64
/deocamdata nu s-a initiat conversia si nu s-a pornit modulul
/setarea modului de funct. pe semnal timer 16b prag B / fara a modifica alti biti

.include "m32def.inc"
.equ rs=PA2 .equ
ldi
e=PD6rl6,
.equ0x3D
ctrl=PORTD
out
.equOCR1AH,rl6
ctrl2=P0RTA
ldi rl6, OxOA
out OCR1A1,rl6
ldi rl6, 0x3D
out
jmp OCR1BH,rl6
reset
ldi
rl6, 0x09
jmp reset
out
jmp OCR1BL,rl6
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 gata_conversia
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,ObllllOOOO
out DDRC,rl6
ldi rl6,ObOlOOOOOO
out DDRD,rl6
ldi rl6,ObOOOOOlOO
out DDRA,rl6
main:
cli
cbi ctrl,e cbi
ctrl2,rs ldi
rl6,ObOOOOOllO out
ADMUX, rl6 ldi
rl6,ObOOlOlllO out
ADCSRA,rl6 in rl6,
SFIOR andi
rl6,ObOOOlllll ori
rl6,OblOlOOOOO out
SFIOR, rl6

ldi rl6,ObOOOOOOOO /setare timer 16 biti: nu se utiliz. OC1A si OC1B, oprit deocamdata
out TCCR1A,r16
/modul va fi CTC
ldi rl6,ObOOOOlOOO
out TCCR1B,rl6
in rl6, TIMSK
andi rl6,ObllOOOOll /nu se utiliz. nici o intrer., fara a modifica alti biti din TIMSK out
TIMSK, rl6
/se incarca valoarea de prag A: 0x3D0A=15626 ;15626 * 1/(8MHz/1024) =~ 2s
/se incarca valoarea de prag B: 0x3D09=15625 ;15625 * 1/(8MHz/1024) =~ 2s

ldi rl6,ObOOOOlOOO /setare timerO: nu se utiliz. pin OCO, timerul este oprit deocamdataout
TCCRO,rl6
;
modul va fi CTC cu prag dat de OCRO
in rl6, TIMSK
andi rl6,ObllllllOO ;nu se utiliz. nici o intrer., fara a modifica alti biti din TIMSK out
TIMSK, rl6
call init_display ldi rl7,OblOOOOOOO
call set_ram
;prin rl7 se seteaza adresa 0x00 pentru RAM de afiare
ldi rl7,'T'
call put_char
ldi rl7,'e'
call put_char
ldi rl7,'n'
call put_char
ldi rl7,'s'
call put_char
ldi rl7,''
call put_char
ldi rl7,'u'
call put_char
ldi rl7,'n'
call put_char
ldi rl7,'e'
call put_char
ldi rl7,'a'
call put_char
ldi rl7,' '
call put_char
ldi rl7,'e'
call put_char
ldi rl7,'s'
call put_char
ldi rl7,'t'
call put_char
ldi rl7,'e'
call put_char
ldi rl7,':'
call put_char
ldi rl7,ObllOOlOlO ;prin rl7 se seteaza adresa 0x4A pentru RAM de afiare call set_ram
ldi rl7,'x' call put_char ldi rl7,'4' call put_char ldi rl7,',' call put_char ldi rl7,'9' call
put_char ldi rl7,'m' call put_char ldi rl7,'V' call put_char
sei
sbi ADCSRA,ADEN
in rl6,TCCR1B
andi rl6,ObllllllOl
ori rl6,ObOOOOOlOl
out TCCR1B,rl6
bucla:
rjmp bucla

;se pornete ADC


;se pornete timerul 16b care va numara la 1024 imp. de ceas

gata_conversia: in r20,SREG
in r21,ADCL ;se citete rezultatul conversiei in r22,ADCH in rl6,TIFR
ori rl6,ObOOOOlOOO ;se reseteaza flagul timerului 16biti out TIFR,rl6
ldi rl7,ObllOOOOOO ;prin rl7 se seteaza adresa 0x40 pentru RAM de afiare call set_ram
ldi rl7,'0'
sbrc r22,l
;se trimite bitul 9 al conversiei
ldi rl7,'1' call put_char
ldi rl7,'0'
sbrc r22,0
;se trimite bitul 8 al conversiei
ldi rl7,'1' call put_char
ldi rl8,0x09 buclai: ldi rl7,'0' dec rl8 breq end rol r21 brcc PC+2 ldi rl7,'1' call put_char
rjmp buclai
end:
out SREG,r20 reti

init_display: cbi ctrl2,rs ldi rl6,0b00100000 out PORTC,rl6 sbi ctrl,e call wait_48us cbi
ctrl,e
ldi rl6,0b00100000 out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e ldi rl6,OblOOOOOOO out
PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e call wait_30ms
ldi rl6,ObOOOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e ldi rl6,ObllOOOOOO out
PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e call wait_30ms
ldi rl6,ObOOOOOOOO out PORTC,rl6 sbi ctrl,e call wait_48us cbi ctrl,e ldi rl6,0b00010000 out
PORTC,rl6 sbi ctrl,e call wait 48us

tine doar nibble (4 biti) superior

rse retine doar nibble (4 biti) inferior


rinterschimba nibble (4 biti) sup. cu nibble (4 biti) inf.

put_char: sbi
ctrl2,rs mov
rl6,rl7 andi
se retine doar nibble (4 biti) superior
rl6,OxFO out
PORTC,rl6 sbi
ctrl,e nop
nop
cbi ctrl,e
mov rl6,rl7
andi rl6,OxOF
se retine doar nibble (4 biti) inferior
swap rl6 out
cbi ctrl,esbi
interschimba nibble (4 biti) sup. cu nibble (4 biti) inf.
PORTC,rl6
call
wait_30ms
ctrl,e nop
nop
ldi rl6,ObOOOOOOOO
cbi ctrl,e
out PORTC,rl6 sbi
call
ctrl,e call
wait_48us ret
wait_48us cbi
ctrl,e ldi
rl6,ObOOlOOOOO out
PORTC,rl6 sbi
ctrl,e call
wait_48us cbi
ctrl,e call
wait_30ms ret
;se incarca valoarea de prag: ;6 * 1/(8MHz/64) =48us
0x06=6
;se pornete timerul si este setat sa numere
;
la fiecare 64 perioade de ceas, fara a modif.
set_ram: cbi
alti biti
ctrl2,rs mov
rl6,rl7 andi
rl6,OxFO out
PORTC,rl6 sbi
se asteapta atingerea pragului OCRO
ctrl,e nop
nop
cbi ctrl,e
mov rl6,rl7
andi rl6,OxOF
swap rl6 out
PORTC,rl6 sbi
ctrl,e nop
nop
cbi ctrl,e
call
wait_48us ret

wait_4 8us: ldi


rl6,0x00 out
TCNTO,rl6 ldi rl6,
0x06 out OCRO,rl6
in rl6,TCCR0 andi
rl6,OblllllOOO ori
rl6,ObOOOOOOll out
TCCR0,rl6 wait:
in rl6,TIFR
sbrs
rl6,OCFO
rjmp wait in
rl6,TIFR

ori rl6,ObOOOOOOlO
out TIFR,rl6
;se reseteaza flagul
in rl6,TCCRO
andi rl6,OblllllOOO ;se oprete timerul
out TCCRO,rl6
ret

;se incarca valoarea


de prag: 0xF0=240 ;2
40 * 1/(8MHz/1024) =~
30ms
;se pornete timerul si este setat
sa numere ;
la fiecare 1024 per.
de ceas, fara a modif.

se asteapta atingerea pragului OCRO

alti biti

se reseteaza flagul
se oprete timerul

wait_30ms:
ldi rl6,0x00
out TCNTO,rl6
ldi rl6, OxFO
out OCRO,rl6
in rl6,TCCRO
andi rl6,OblllllOOO
ori rl6,ObOOOOOlOl
out TCCRO,rl6
waitl:
in rl6,TIFR
sbrs rl6,OCFO
rjmp waitl
in rl6,TIFR
ori rl6,ObOOOOOOlO
out TIFR,rl6
in rl6,TCCRO
andi rl6,OblllllOOO
out TCCRO,rl6
ret

Laborator Microcontrolere

Lucrarea 5 Utilizarea microcontrolerului ATmega32 pentru a comanda senzorul


de temperatur DS1820
Prezentarea informaiilor folosind un afior LED multiplexat tip 7 segmente

Scopul lucrrii
a) Prezentarea senzorului de temperatur DS1820 i a modului n care se poate realiza
comunicaia cu acesta
b) Descrierea modului de utilizare a unui modul de afiare LED tip 7 segmente folosind tehnica
multiplexrii
c) Prezentarea unor opiuni avansate de compilare oferite de mediul Atmel Studio
d) Programarea unei aplicaii utiliznd placa de dezvoltare EasyAVRv7
1. Senzorul de temperatur DS1820
DS1820 este un circuit integrat produs de firma Dallas Semiconductor cu funcionare
specializat pentru msurarea temperaturilor mediului ambiant sau a suprafeei cu care se afl
n contact. Dintre caracteristicile acestui circuit se pot meniona:
- este disponibil i n capsul de mici dimensiuni tip T092 cu numai 3 pini;
- interfaa de comunicaie se bazeaz pe un protocol proprietar 1-Wire" care necesit
o conexiune de date cu un singur fir, n afar de mas, la care se pot conecta
simultan mai multe dispozitive;
- poate fi telealimentat prin conexiunea de date;
- gam de msur cuprins ntre -55C i +125C cu pas de 0,5C
- poate memora ntr-o memorie nevolatil valori limit de temperatur la depirea
crora va genera automat stare de alarm
Schema bloc a circuitului DS1820 este prezentat n figura de mai jos.

1.1. Modul de funcionare


Conversia temperaturii se realizeaz dup un mecanism hardware proprietar imediat
dup ce se primete o comand de iniiere a acesteia. La finalizarea conversiei, care dureaz
aproximativ 200ms, rezultatul va fi reprezentat n form binar pe un numr total de 16bii.

Primul octet al rezultatului indic semnul conversiei. Astfel, valoarea FFh semnific
o temperatur negativ care va fi reprezentat n cel de-al doilea octet (cel mai puin
semnificativ) n complement fa de doi. Dac temperatura este pozitiv, octetul cel mai
semnificativ va fi OOh i valoarea acesteia va avea o reprezentare direct n cel de-al doilea
octet.
Un exemplu de legtur ntre rezultatul conversiei i valoarea temperaturii este
prezentat n tabelul de mai jos.
TEMPERATURE
+125C

DIGITAL OUTPUT (Binary)

DIGITAL OUTPUT (Hex)

00000000 11111010

00FA

+25C

00000000 00110010

0032h

+ 1,.2C

00000000 00000001

0001 h

+0C

00000000 00000000

OOOOh

11111111 11111111

FFFFh

-25C

11111111 11001110

FFCEh

-55C

11111111 10010010

FF92h

-V2c

Indiferent de semnul temperaturii, doar biii 1...7 din octetul cel mai puin
semnificativ reprezint valoarea efectiv a conversiei, n timp ce bitul 0 este indicator
pentru jumtate de grad. Astfel, dac bitul 0 are valoarea 1 logic, temperatura se
0 ^ citete prin adunarea valorii 0,5 C la valoarea
reprezentat de biii 1...7. In caz
contrar, temperatura se obine direct din valoarea biilor 1..7. Pentru temperaturile
negative, mai nti se face trecerea din complementul fa de doi i apoi se separ i
se interpreteaz biii.
/V

In tabelul de mai jos sunt exemplificate dou cazuri de citire a temperaturii.


Rezultatul conversiei
Interpretare
Octet MS
Octet LS
00000000
00010101- MS este 00h prin urmare temperatura este pozitiv iar LS se citete
direct
- bitul 0 din LS este 1 deci se va aduga 0,5C
- din LS se rein doar biii 1...7 adic 00001010 = 10z
- n final temperatura se interpreteaz ca +10,5C
11111111
11001111- MS este FFh prin urmare temperatura este negativ iar LS se
citete n complement fa de doi
- LS este n complement fa de doi, scdem 1 i complementm
obinnd 00110001
- bitul 0 din noul LS este 1 deci se va aduga 0,5C
- din noul LS se rein doar biii 1 ...7 adic 00011000 = 24z
- n final temperatura se interpreteaz ca -24,5C

DS1820 dispune de o memorie RAM numit scratchpad" cu dimensiunea de 9


octei. Rezultatul conversiei se memoreaz ntotdeauna cu octetul LS la adresa 0 i octetul
MS la adresa 1, aa cum se poate vedea n figura de mai jos.
SCRATCHPAD

BYTE

2
3

TEMPERATURE LSB

P
D

TEMPERATURE MSB

THWSER BYTE
TUU5ER BYTE 2

RESERVEE}
RESERVE!?
COUNT REMAIN
COUNT PER C

CRC

1.2. Protocolul de comunicaie


Comunicaia ntre DS1820 i alte dispozitive este de tip serial i necesit o singur
conexiune bidirecional pe care se pot conecta mai multe echipamente. Dintre acestea, unul
singur va avea rol de mater i toate celelalte vor fi slave. Dispozitivul mater este cel care
iniiaz comunicaia iar dispozitivele slave rspund la comenzile primite, fiind identificate
prin intermediul unei adrese unice astfel c la un moment dat comunicaia se desfoar
numai ntre mater i un singur slave, cel care a fost adresat.
Din punct de vedere hardware, protocolul necesit o rezisten de pull-up pe linia
de date i respectarea strict a unor secvene de generare a urmtoarelor tipuri de semnale,
privite din punctul de vedere al dispozitivului mater:
puls de reset la care dispozitivul slave rspunde prin aducerea liniei n 0 logic;
bit 0 logic;
bit 1 logic;
citire bit de la slave
Transmiterea sau recepionarea unui octet de ctre mater se face prin compunerea
semnalelor menionate i respectnd regula LSB first". Secvena de generare standard a
semnalelor de baz este descris n tabelul de mai jos.

Tip de semnal

Secvena de generare standard

Puls de reset - se aduce linia de date la nivel 0 i se ateapt ntre 480^s i 640^s
- se elibereaz linia de date (i se permite s fie adus la nivel 1 prin rezistena
de pull-up) i se ateapt ntre 70(is i 78(is

- se verific nivelul liniei de date pentru a vedea dac a rspuns cel puin un
dispozitiv (n acest caz linia va avea nivel 0)
- se ateapt cel puin 410(is
Bit 0 logic - se aduce linia de date la nivel 0 i se ateapt ntre 60|is i 120|is
- se elibereaz linia de date (i se permite s fie adus la nivel 1 prin rezistena
de pull-up) i se ateapt cel puin 1 Ojis
Bit 1 logic - se aduce linia de date la nivel 0 i se ateapt ntre 6|is i 15|is
- se elibereaz linia de date (i se permite s fie adus la nivel 1 prin rezistena
de pull-up) i se ateapt cel puin 64(s
Citire bit de la- se aduce linia de date la nivel 0 i se ateapt ntre 6|is i 15|is
- se elibereaz linia de date (i se permite s fie adus la nivel 1 prin rezistena
slave
de pull-up) i se ateapt ntre i 12[xs
- se verific nivelul liniei de date pentru a vedea cu ce valoare a rspuns
dispozitivul slave
- se ateapt cel puin 55 (s
Din punct de vedere software, orice comunicare se face printr-o tranzacie n timpul
creia dispozitivul slave primete o serie de comenzi cunoscute. Orice tranzacie va conine
n ordine cte o singur comand din urmtoarele categorii:
- iniializare;
- identificare;
- transfer date.
Comanda de iniializare coincide cu generarea de ctre mater a pulsului de
reset.
Comenzile de identificare permit adresarea mai multor dispozitive care mpart
/V

aceeai conexiune. In cadrul laboratorului nu se va utiliza dect comanda cu codul OxCC


care permite comunicarea cu un dispozitiv far a-1 adresa explicit. Acest lucru este posibil
doar cnd exist un singur dispozitiv slave astfel nct nu exist riscul apariiei conflictelor
n comunicaie.
Comenzile de transfer de date reprezint de fapt instruciunile pe care le poate
/V

executa circuitul DS1820. In cadrul laboratorului se va utiliza comanda 0x44 - iniierea unei
conversii i comanda OxBE - citire memorie scratchpad.
Trebuie precizat c n timp ce realizeaz o conversie, DS1820 va ine linia de date n
0, urmnd s o elibereze imediat dup terminarea acesteia. De asemenea, dup comanda
OxBE, DS1820 va transmite pe rnd i n ordine octeii 0...8 ai memoriei scratchpad, pn
n momentul cnd primete comand de iniializare.
Placa EasyAVRv7 este echipat cu un senzor DS1820 a crui linie de date poate fi
conectat la pinul PA7 sau PB4.
2. Module de afiare LED tip 7 segmente
O unitate de afiare LED tip 7 segmente este format din 7 leduri dispuse aa cum se
observ n figura de mai jos. De multe ori unitile conin i un al optulea LED care este pe
poziia punctului zecimal. ntotdeauna unele dintre terminalele ledurilor, anodul sau catodul,
vor fi conectate mpreun astfel nct pentru a comanda o unitate sunt necesare 8 linii
(segmentele a...g i dp) + una (anodul sau catodul comun).

Atunci cnd mai multe uniti sunt conectate i comandate mpreun, ele formeaz un
modul de afiare.
Exist dou modaliti fundamentale de a comanda un modul:
- direct;
- prin multiplexare.
Modul direct de conectare impune ca fiecare unitate s aib propriile linii de comand.
Acest mod are avantajul simplitii dar un dezavantaj major prin faptul c sunt necesare foarte
multe linii de comand (9/unitate).
Comanda prin multiplexare este puin mai complex dar necesit doar 8 linii de
comand plus cte o singur linie pentru fiecare unitate, care se conecteaz la anodul sau
catodul comun al acesteia. Multiplexarea se bazeaz pe faptul c la o vitez suficient de mare
(peste 30 de acionri pe secund), ochiul uman nu poate sesiza stingerea unui LED. Astfel, n
loc s se aprind simultan toate unitile unui modul, ele se aprind pe rnd, fiecare cu propria
configuraie. Selecia se face pe baza anodului sau catodului comun pe care l are fiecare
unitate.
Placa EasyAVRv7 este echipat cu un modul LED tip 7 segmente conectate pentru
comand prin multiplexare. Cele 8 linii principale sunt comandate de portul C iar liniiile de
selecie a fiecrei uniti sunt comandate de pinii PA0...PA3.
3. Opiuni avansate de compilare oferite de mediul Atmel Studio
3.1.
Macroinstruciuni
O macroinstruciune este reprezentat de un nume ales de utilizator i conine mai
multe intstruciuni simple sau chiar alte macroinstruciuni. Atunci cnd compilatorul ntlnete
n cod numele unei macroinstruciuni, acesta va fi nlocuit n codul surs cu toate
instruciunile simple asociate. De aceea, programatorul trebuie s aib grij s nu utilizeze
excesiv macroinstruciunile deoarece se poate ajunge n situaia n care codul surs devine
prea mare i depete capacitatea memoriei pentru cod a microcontrolerului.
Sintaxa unei macroinstruciuni este urmtoarea:
.MACRO nume
instruciune
instruciune .
ENDMACRO
3.2.

Rezervarea de spaiu n memorie i tabele de cutare


Compilatorul mediului Atmel Studio ofer posibilitatea de a rezerva spaiu pentru
valori constante n memoria de cod sau n memoria EEPROM. Selecia ntre cele dou se face
prin directivele .cseg i .eseg respectiv.

Directivele utilizate pentru rezervarea i iniializarea memoriei sunt: .db - rezerv un


octet, .dw - rezerv un cuvnt, .dd - rezerv un dublucuvnt i .dq - rezerv 64 de bii. Acestea
sunt de obicei precedate de o etichet i urmate de o list de valori, conform sintaxei:
eticheta: .db list valori
Valorile din list pot fi exprimate n orice form: binar, hexazecimal sau zecimal.
Rezervarea i iniializarea de spaiu n memorie constituie elementul cheie pentru
realizarea de tabele de cutare, utilizate frecvent atunci cnd sunt necesare diverse conversii
de date.
Pentru a extrage un element de 8 bii aflat la poziia offset ntr-o tabel identificat prin
eticheta labei, se poate utiliza urmtoarea secven de cod:
ldi ZH, high(2*/^e/)
ldi ZL, \ow(2*labei)
ldi registru, 0x00 ldi
registrul, offset add
ZL, registrul adc ZH,
registru lpm registru,
Z
La finalul acestei secvene de cod elementul de la poziia offset se va regsi n registrul
registru.
4. Exemple de programe
a) S se scrie un program care la fiecare 2 secunde realizeaz o msurare a temperaturii ambiante utiliznd
senzorul DS1820 i afieaz valoarea acesteia utiliznd modulul de afiare LED 7 segmente de pe
placa EasyAVRv7. Algoritmul de afiare va fi conceput numai pentru gama de temperaturi pozitive
cuprinse ntre 0C i 125C. Comunicaia cu senzorul se face pe pinul PB4 i este monitorizat astfel
nct n cazul n care acesta nu rspunde la comenzi se va aprinde ledul PDO.

.include "m32def.inc" .equ wireport = PORTB .equ wirepin =


PB4 .equ wirectrl = DDRB .equ wirein = PINB
.def
.def
.def
.def
.def
.def
.def
.def

temp=rl8
templ=rl9
temp2=r24
digitl=rO
digit2=rl
digit3=r2
digit4=r3
mux=r4

.MACRO _ lus
nop nop nop nop nop nop nop nop .ENDMACRO
.MACRO wwrite_l
sbi wirectrl,wirepin
cbi wireport,wirepin
_lus

_lus
_lus
_lus
_lus
_lus
sbi wireport,wirepin
ldi rl6,50 //50 * 11 * 0,125us =~ 68,75us wwrite_l_loopl: _lus dec rl6
brne wwrite_l_loopl .ENDMACRO
.MACRO wwrite_0
sbi wirectrl,wirepin cbi wireport,wirepin
ldi rl6,50 //50 * 11 * 0,125us =~ 68,75us wwrite_0_loopl: _lus dec rl6
brne wwrite_0_loopl sbi wireport,wirepin _lus
_lus _lus _lus _lus _lus _lus _lus _lus _lus
_lus .ENDMACRO

jmp reset jmp reset jmp reset jmp reset

jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp
jmp

reset
reset
reset
citire temp
reset
reset
refresh
reset
reset
reset
reset
reset
reset
reset
reset
reset
reset

cifre: .DB ObOOllllll, ObOOOOOllO .DB ObOlOllOll, ObOlOOllll .DB ObOllOOllO,


ObOllOllOl .DB ObOlllllOl, ObOOOOOlll .DB ObOlllllll, ObOllOllll

reset:
ldi rl6,high(RAMEND) out SPH,rl6 ldi rl6,low(RAMEND) out SPL,rl6 in rl6,SFIOR ori rl6,ObOOOOOlOO
out SFIOR,rl6 ldi rl6,OxFF out DDRC,rl6 out DDRD,rl6 ldi rl6,OxOF out DDRA,rl6 sbi
wirectrl,wirepin sbi wireport,wirepin cbi PORTD,0 clr digitl clr digit2 clr digit3 clr digit4
ldi rl6,ObOOOOlOOO mov mux,rl6 main: cli
ldi rl6,ObOOOOlOOO out TCCRO,rl6 in rl6, TIMSK
andi rl6,ObllllllOO ;se utiliz. intrer. pt prag, ori rl6,ObOOOOOOlO out TIMSK, rl6

ldi rl6,ObOOOOOOOO /setare timer 16 biti: nu se utiliz. OC1A si OC1B, oprit deocamdata
out TCCR1A,r16
;modul va fi CTC
ldi rl6,ObOOOOlOOO
out TCCR1B,rl6
in rl6, TIMSK
andi rl6,ObllOOOOll ;se utiliz. intrer. prag A, fara a modifica alti biti din TIMSK ori
rl6,ObOOOlOOOO out TIMSK, rl6
ldi rl6, 0x3D
;se incarca valoarea de prag A: 0x3D0A=15626
out OCR1AH,rl6
;15626 * 1/(8MHz/1024) =~ 2s
ldi rl6, OxOA out OCR1A1,rl6

portul C este ieire


pinii PA3...PAO sunt ieiri

/setare timer: nu se utiliz. pinul OCO, timerul este oprit deocamdata


;modul va fi CTC cu prag dat de OCRO
fara a modifica alti biti din TIMSK

in rl6,TCCR1Bandi rl6,ObllllllOl
ori rl6,ObOOOOOlOl out TCCR1B,rl6

;se pornete timerul 16b care va numara la 1024 imp. de ceas

ldi rl6,0x00 out TCNTO,rl6


ldi rl6, 0x7D
;se incarca valoarea de prag: 0x7D=125
out OCRO,rl6
;125 * l/(8MHz/64) = lms => f=lkHz
in rl6,TCCRO
andi rl6,OblllllOOO
;se pornete timerul si este setat sa numere
ori rl6,ObOOOOOOll
;la fiecare 64 perioade de ceas, fara a modifica alti biti
out TCCRO,rl6
sei
bucla: 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+2
ori 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 reti
citire_temp: in r20,SREG call wire_reset ldi temp,OxCC /comanda "skip ROM"
call wire_write
/trimite la DS1820 continutul registrului temp
ldi temp,0x44
/comanda de iniiere conversie
call wire_write
cbi wirectrl,wirepin
temp_wait:
sbis wirein,wirepin
/atept sa termine conversia
rjmp temp_wait
call wire_reset
/a terminat conversia, voi citi rezultatul
ldi temp,OxCC

/se selecteaza digitul corespunztor


/se incarca cifra corespunztoare /
digitului selectat

se identifica codul
corespunztor cifrei
/
alese

zpentrul digitul 3
/
trebuie sa aprind si virgula

/in templ este codul corespunztor cifrei selectate


/se pregtete selecia urmtorului digit

:comanda de citire scratchpad


rse citete in registrul temp primul octet din scratchpad :
conversiei

care

este

octetul

inf

;se extrage in carry bitul indicator de 1/2 grad


rdigitul 4 (cel mai din dreapta) afiseaza 1/2 grad

call
wire_write ldi
temp,OxBE call
wire_write
call wire_read
call
wire_reset

pe baza rezultatului conversiei


se calculeaza cele 3 cifre zecimale care se vor afia

ldi rl7,0x00 lsr


temp brcc PC+2
ldi rl7,0x05 mov
digit4,rl7
ldi 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
reti

wire_reset:
sbi
wirectrl,wir
epin cbi
wireport,wir
epin cli

ldi rl6,34 ldi temp2,10 wr_loopl:


_lus
dec 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 ciclu
//I ciclu

480us

al

brne wr_loopl//2 cicluri la salt inapoi; 1 ciclu altfel cbi


wirectrl,wirepin
//2 cicluri
//70,5us

//se

verifica

daca

senzorul

rspuns

//senzorul

nu

rspuns,aprind un led //senzorul a rspuns,sting


ledul
//29 * 113 cicluri * 0,125us
//8 cicluri //I ciclu
brne wr_loop3//2 cicluri la salt inapoi;
ldi temp2,10 //I ciclu dec rl6
//I
ciclu
brne wr_loop3
//2 cicluri la salt inapoi;
sei
ret

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,0
ldi rl6,29
ldi temp2,10
wr_loop3:
_lus
dec temp2

410us

1 ciclu altfel
1 ciclu altfel

wire_write:
cli
ldi 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 ret
wire_read:
cli
ldi temp2,0x08
wr_getl:
sbi wirectrl,wirepin
cbi wireport,wirepin
_lus
_lus
_lus
_lus
_lus
_lus
_lus
cbi wirectrl,wirepin
_lus
_lus
_lus
_lus
_lus
_lus
_lus
_lus
_lus
sec
//lciclu ; presupun ca am primit 1
sbis wirein,wirepin
clc
ror temp
;in temp se va memora octetul primit
ldi rl6,50 //50 * 11 * 0,125us =~ 68.75us
wre_loopl: _lus dec rl6
brne wre_loopl dec temp2 breq PC+2 rjmp wr_getl sei
ret

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