Documente Academic
Documente Profesional
Documente Cultură
Lucrarea 1
Microcontrolerul ATmega32. Utilizarea porturilor
Scopul lucrrii
a)
b)
c)
d)
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
A
.'
W
W
.'
'
Va
T je H
S
V
N
Z
Y
W
G
0
W
W
I
0
Figura 2. Registrul de stare
- 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
0
0
0
1
1
Valoare implicit
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
L_JLJ
-
dup
lansarea
: '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
T
>VAic* "g >> S:
VA Ciulin: ution
E>:.*
IIMll
WcIcoti
to Atmel
E:udio
LINK: ARR
Getto
krcwA:"-:l
tudio
OnmPi^ia...
R;::;MI
Pmjisl'
[S /'.IV l.ltfAfij
ilcliuril 3 i n*-p-g^
iftiT-f-jert lord 71
Show p=ge :n
rtartup
rr
New Project
Recent
Templa
tes
Search Installed
Templates
Installed Templates
C/O*
Type: Assembler
AVR Assembler
Project
Assembler
Creates an AVR 8-bit Assembler
project
Assembler
Atmel Studio Solution
I
Name:
AssemblerApplicationl
location:
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
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
SI tio AL t11 A m L tu AL tu AL ie II tu
SI ti?
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
;
SetareUi
porturi
Unic
JmL
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
.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
7
8
9
10
11
12
13
14
OxOC
OxOE
0x10
0x12
0x14
0x16
0x18
OxlA
15
16
0x1 C
OxlE
17
18
0x20
0x22
19
20
21
0x24
0x26
0x28
/V
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
intrerupere:
in r20, SREG ; salvarea registrului de stare in r20
/V
- posibilitate de auto-iniializare
- posibilitate de generare facil a semnalelor Puise Width Modulation (PWM)
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
WGMOO
(PWMO)
Update
OCRO
of TOVO Flag
Set-on
Normal
OxFF
Immediate
MAX
OxFF
TOP
BOTTOM
CTC
OCRO Immediate
MAX
Fast PWM
OxFF
MAX
BOTTOM
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
/V
TCNTO atinge valoarea registrului de prag OCRO. In acest caz pinul trebuie setat ca
ieire. ______________________________________________________________
COMOl
COMOO
Description
y
OC
n
OC
(COMnliO - 2)
j~L_ru i_____n_
(COMnliO - 3)
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
OCfln Update
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
X-
TOP
Valu
?-
ICPn
7CCiA
-OCknfl
L.
TCCBnB
-ICFn (IntHsq.)
'sic i reet b
1CES1
l< C1
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
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)
TOP
Update of
OCR1X
Normal
QxFFFF
Immediate
MAX
OxOOFF
TOP
BOTTOM
0x01 FF
TOP
BOTTOM
0x03FF
TOP
BOTTOM
CTC
OCR1A
Immediate
MAX
OxOOFF
BOTTOM
TOP
(MUFF
BOTTOM
TOP
Qx03FF
BOTTOM
TOP
ICR1
BOTTOM
BOTTOM
OCR1A
BOTTOM
BOTTOM
10
ICH1
TOP
BOTTOM
11
OCR1A
TOP
BOTTOM
12
CTC
ICR1
Immediate
MAX
13
Reserved
14
Fast PWM
ICR1
BOTTOM
TOP
15
Fast PWM
OCR1A
BOTTOM
TOP
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 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.
/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
and
Set
Rag
Rag
TCNT
n
(COMmtl :0 = )
OCn
(COMrotl :0 = 3)
x
OCn
x
Figura
10. Modul de funcionare semnal PWM rapid
Period
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
(COMnxl ft =2)
J (COMnxl ft
=3)
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
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
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
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
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
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
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
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
J osc
16(UBRR +1)
f
J osc
8 (UBRR +1)
Sincron mater
J osc
2 (UBRR +1)
2.2.
jos.
Denumirea bitului
Descriere
Poziia
bitului
7
6
5
RXC
TXC
UDRE
FE
DOR
2
1
PE
U2X
MPCM
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
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
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
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
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
receptie: in
r20,SREG in
rl6,UDR cpi
rl6,0x73
breq PC+2
rjmp et2
sbrc rl8,0
sec
sbrs rl8,0
clc
memora
ultima
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
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
au_trecut_2s: in
r20,SREG inc rl8
cpi rl8,0x05
brio end ldi
rl8,0x00
/se pornete timerul si este setat sa numere /la fiecare 25 6 perioade de ceas /activare
intreruperi
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
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
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.
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
15
14
13
12
ADC7
ADC6
ADC5
ADC4
11
ADCH
ADCL
ADC3
10
ADC9
ADC8
ADC2
ADC1
ADCO
ADC8
ADC1
ADOO
15
14
ADC7
-
13
ADC6
ADC5
ADC4
ADC3
12
11
10
2.
ADC2
Figura
ADC
H
ADCL
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
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
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
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.
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
rl7,"
call put
ldi
rl7,"
call put
'
char
' t'
char
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
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
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
cpi rl7,64
brio end ldi
rl6,0x07 out
PORTB,rl6
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
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
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
ori rl6,ObOOOOOOlO
out TIFR,rl6
;se reseteaza flagul
in rl6,TCCRO
andi rl6,OblllllOOO ;se oprete timerul
out TCCRO,rl6
ret
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
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.
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
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
BYTE
2
3
TEMPERATURE LSB
P
D
TEMPERATURE MSB
THWSER BYTE
TUU5ER BYTE 2
RESERVEE}
RESERVE!?
COUNT REMAIN
COUNT PER C
CRC
Tip de semnal
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
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.
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
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
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
in rl6,TCCR1Bandi rl6,ObllllllOl
ori rl6,ObOOOOOlOl out TCCR1B,rl6
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 identifica codul
corespunztor cifrei
/
alese
zpentrul digitul 3
/
trebuie sa aprind si virgula
care
este
octetul
inf
call
wire_write ldi
temp,OxBE call
wire_write
call wire_read
call
wire_reset
wire_reset:
sbi
wirectrl,wir
epin cbi
wireport,wir
epin cli
480us
al
//se
verifica
daca
senzorul
rspuns
//senzorul
nu
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