You are on page 1of 0

AUTO.

NLU

For more details and questions, contact me: thanhtam.h@gmail.com
CNG HC AVR
AVR2 C#U TRC AVR

Tho thu#n: ti li&u ny thu(c quy*n s+ h-u c0a tc gi, b2n c th3 t5 do tham kho
ti li&u nh.ng khng 6.7c php s8 d9ng 63 in thnh sch bo, 6:ng ln cc di<n 6n
hay website, nh.ng b2n c th3 dng 6.>ng link http://www.dieukhientudong.net 63
h.@ng t@i ti li&u. Lin h& tc gi qua email: thanhtam.h@gmail.com.

I. B&n s( +i +,n +u.
Bi ny tip t$c bi '(u tin trong lo*t bi gi+i thi.u v/ AVR, nu sau bi 1 b*n ' ph(n no
bit cch l0p trnh cho AVR b1ng AVRStudio th trong bi ny, chng ta s3 tm hi5u k7 h,n v/
c9u trc c:a AVR. Sau bi ny, b*n s3:
- Hi5u '<=c c9u trc AVR, c9u trc b> nh+ v cch th@c ho*t '>ng c:a chip.
- Hi5u v/ Stack v cch ho*t '>ng.
- Bit '<=c m>t sA instruction c, bBn truy xu9t b> nh+.
- HCc cc instruction r3 nhnh v vng lDp.
- Ch<,ng trnh con (Subroutine) v Macro.
- CBi tin v d$ trong bi 1.
- Vit 1 v d$ minh hCa cch sE d$ng b> nh+ v vng lDp.
II. T/ ch1c c4a AVR.
AVR c c9u trc Harvard, trong ' '<Fng truy/n cho b> nh+ dH li.u (data memory bus) v
'<Fng truy/n cho b> nh+ ch<,ng trnh (program memory bus) '<=c tch ring. Data memory bus
chI c 8 bit v '<=c kt nAi v+i h(u ht cc thit bK ngo*i vi, v+i register file. Trong khi '
program memory bus c '> r>ng 16 bits v chI ph$c v$ cho instruction registers. Hnh 1 m tB c9u
trc b> nh+ c:a AVR.
B7 nh8 ch29ng trnh (Program memory): L b> nh+ Flash l0p trnh '<=c, trong cc chip
AVR cM (nh< AT90S1200 hay AT()2313) b> nh+ ch<,ng trnh chI gNm 1 ph(n l Application
Flash Section nh<ng trong cc chip AVR m+i chng ta c thm ph(n Boot Flash setion. Boot
section s3 '<=c khBo st trong cc ph(n sau, trong bi ny khi ni v/ b> nh+ ch<,ng trnh, chng
ta tO hi5u l Application section. ThOc ch9t, application section bao gNm 2 ph(n: ph(n ch@a cc
instruction (m l.nh cho ho*t '>ng c:a chip) v ph(n ch@a cc vector ngPt (interrupt vectors). Cc
vector ngPt n1m Q ph(n '(u c:a application section (tR 'Ka chI 0x0000) v di 'n bao nhiu ty
thu>c vo lo*i chip. Ph(n ch@a instruction n1m li/n sau ', ch<,ng trnh vit cho chip phBi '<=c
load vo ph(n ny. Xem l*i ph(n '(u c:a v d$ trong bi 1:
.ORG 0x000
RJMP BATDAU
.ORG 0x020
BATDAU:
Trong v d$ ny, ngay sau khi set vK tr 0x000 b1ng chI thK (DIRECTIVE) .ORG 0x000
chng ta dng instruction RJMP '5 nhBy 'n vK tr 0x020, nh< th ph(n b> nh+ ch<,ng trnh tR
0x00 'n 0x01F khng '<=c sE d$ng (v trong v d$ ny chng ta khng sE d$ng cc vector
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
ngPt). Ch<,ng trnh chnh '<=c bPt '(u tR 'Ka chI 0x020, con sA 0x020 l do ng<Fi l0p trnh chCn,
th0t ra cc vector ngPt c:a chip ATMEGA8 chI ko di 'n 'Ka chI 0x012, v v0y ch<,ng trnh
chnh c th5 '<=c bPt '(u tR b9t c@ vK tr no sau '. S5 bit '> di cc vector ngPt c:a tRng chip
b*n hy tham khBo datasheet c:a chip '.
V ch@c nTng chnh c:a b> nh+ ch<,ng trnh l ch@a instruction, chng ta khng c nhi/u c,
h>i tc '>ng ln b> nh+ ny khi l0p trnh cho chip, v th 'Ai v+i ng<Fi l0p trnh AVR, b> nh+ ny
khng qu quan trCng. T9t cB cc thanh ghi quan trCng c(n khBo st n1m trong b> nh+ dH li.u
c:a chip.

Hnh 1. Cu trc b$ nh' c*a AVR.
B7 nh8 d: li;u (data memory): Sy l ph(n ch@a cc thanh ghi quan trCng nh9t c:a chip,
vi.c l0p trnh cho chip ph(n l+n l truy c0p b> nh+ ny. B> nh+ dH li.u trn cc chip AVR c '>
l+n khc nhau ty theo mUi chip, tuy nhin v/ c, bBn ph(n b> nh+ ny '<=c chia thnh 5 ph(n:
Ph<n 1: l ph(n '(u tin trong b> nh+ dH li.u, nh< m tB tronh hnh 2, ph(n ny bao gNm 32
thanh ghi c tn gCi l register file (RF), hay General Purpose Rgegister GPR, hoDc ',n giBn l
cc Thanh ghi. T9t cB cc thanh ghi ny '/u l cc thanh ghi 8 bits nh< trong hnh 2.

Hnh 2. Thanh ghi 8 bits.
T9t cB cc chip trong hC AVR '/u bao gNm 32 thanh ghi Register File c 'Ka chI tuy.t 'Ai tR
0x0000 'n 0x001F. MUi thanh ghi c th5 ch@a gi trK d<,ng tR 0 'n 255 hoDc cc gi trK c d9u
tR -128 'n 127 hoDc m ASCII c:a m>t k tO no 'Cc thanh ghi ny '<=c 'Dt tn theo th@
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
tO l R0 'n R31. Chng '<=c chia thnh 2 ph(n, ph(n 1 bao gNm cc thanh ghi tR R0 'n R15 v
ph(n 2 l cc thanh ghi R16 'n R31. Cc thanh ghi ny c cc 'Dc 'i5m sau:
- S<=c truy c0p trOc tip trong cc instruction .
- Cc ton tE, php ton thOc hi.n trn cc thanh ghi ny chI c(n 1 chu kW xung clock.
- Register File +2=c k,t n>i tr?c ti,p v8i b7 x@ l trung tm CPU c4a chip.
- Chng l nguNn ch@a cc sA h*ng trong cc php ton v cMng l 'ch ch@a kt quB trB l*i
c:a php ton.
S5 minh hCa, hy xt v d$ thOc hi.n php c>ng 2 thanh ghi b1ng instruction ADD nh< sau:
ADD R1, R2
B*n th9y trong dng l.nh trn, 2 thanh ghi R1 v R2 '<=c sE d$ng trOc tip v+i tn c:a
chng, dng l.nh trn khi '<=c dKch sang opcode '5 download vo chip s3 c d*ng:
0000110000010010 trong ' 00001=1 t@c thanh ghi R1 v 00010 = 2 chI thanh ghi R2. Sau php
c>ng, kt quB s3 '<=c l<u vo thanh ghi R1.
T9t cB cc instruction sE d$ng RF lm ton h*ng '/u c th5 truy nh0p t9t cB cc RF m>t cch
trOc tip trong 1 chu kW xung clock, ngo*i trR SBCI, SUBI, CPI, ANDI v LDI, cc instruction
ny chI c th5 truy nh0p cc thanh ghi tR R16 'n R31.
Thanh ghi R0 l thanh ghi duy nh9t '<=c sE d$ng trong instruction LPM (Load Program
Memory). Cc thanh ghi R26, R27, R28, R29, R30 v R31 ngoi ch@c nTng thng th<Fng cn
'<=c sE d$ng nh< cc con trX (Pointer register) trong m>t sA instruction truy xu9t gin tip.
Chng ta s3 khBo st v9n '/ con trX sau ny. Hnh 3 m tB cc ch@c nTng ph$ c:a cc thanh ghi.

Hnh 3. Register file.
Tm l*i 32 RF c:a AVR '<=c xem l 1 ph(n c:a CPU, v th chng '<=c CPU sE d$ng trOc
tip v nhanh chng, '5 gCi cc thanh ghi ny, chng ta khng c(n gCi 'Ka chI m chI c(n gCi trOc
tip tn c:a chng. RF th<Fng '<=c sE d$ng nh< cc ton h*ng (operand) c:a cc php ton trong
lc l0p trnh.
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Ph<n 2: l ph(n n1m ngay sau register file, ph(n ny bao gNm 64 thanh ghi '<=c gCi l 64
thanh ghi nh0p/xu9t (64 I/O register) hay cn gCi l vng nh+ I/O (I/O Memory). Vng nh+ I/O
l cEa ng giao tip giHa CPU v thit bK ngo*i vi. T9t cB cc thanh ghi 'i/u khi5n, tr*ng
thic:a thit bK ngo*i vi '/u n1m Q 'y. Xem l*i v d$ trong bi 1, trong ' ti c '/ c0p v/ vi.c
'i/u khi5n cc PORT c:a AVR, mUi PORT lin quan 'n 3 thanh ghi DDRx, PORTx v PINx, t9t
cB 3 thanh ghi ny '/u n1m trong vng nh+ I/O. Xa h,n, nu muAn truy xu9t cc thit bK ngo*i vi
khc nh< Timer, chuy5n 'Yi Analog/Digital, giao tip USART'/u thOc hi.n thng qua vi.c
'i/u khi5n cc thanh ghi trong vng nh+ ny.
Vng nh' I/O c th- 012c truy c3p nh1 SRAM hay nh1 cc thanh ghi I/O. N4u s5 d6ng
instruction truy xut SRAM 0- truy xut vng nh' ny th 07a ch9 c*a chng 012c tnh t; 0x0020
04n 0x005F. Nh1ng n4u truy xut nh1 cc thanh ghi I/O th 07a ch9 c*a chng 0=(c tnh t;
0x0000 04n 0x003F.
Xt v d$ instruction OUT dng xu9t gi trK ra cc thanh ghi I/O, l.nh ny sE d$ng 'Ka chI
ki5u thanh ghi, c9u trc c:a l.nh nh< sau: OUT A, Rr, trong ' A l 'Ka chI c:a thanh ghi trong
vng nh+ I/O, Rr l thanh ghi RF, l.nh OUT xu9t gi trK tR thanh ghi Rr ra thanh ghi I/O c 'Ka
chI l A. GiB sE chng ta muAn xu9t gi trK ch@a trong R6 ra thanh ghi 'i/u khi5n h<+ng c:a
PORTD, t@c thanh ghi DDRD, 'Ka chI tnh theo vng I/O c:a thanh ghi DDRD l 0x0011, nh< th
cu l.nh c:a chng ta s3 c d*ng: OUT 0x0011, R6. Tuy nhin trong 1 tr<Fng h=p khc, nu
muAn truy xu9t DDRD theo d*ng SRAM, v d$ l.nh STS hay LDS, th phBi dng 'Ka chI tuy.t 'Ai
c:a thanh ghi ny, t@c gi trK 0x0031, khi ' l.nh OUT Q trn '<=c vit l*i l STS 0x0031, R6.
>- th@ng nht cch s5 d6ng t; ngA, t; by giC chng ta dng khi niDm 6Ba chD I /O cho
cc thanh ghi trong vng nh' I/O 0- ni 04n 07a ch9 khng tnh phEn Register File, khi niDm
6Ba chD b( nh@ c*a thanh ghi l ch9 07a ch9 tuyDt 0@i c*a chng trong SRAM. V d6 thanh ghi
DDRD c 07a ch9 I/O l 0x0011 v 07a ch9 b$ nh' c*a n l 0x0031, 07a ch9 b$ nh' =
07a ch9 thanh ghi + 0x0020.
V cc thanh ghi trong vng I/O khng '<=c hi5u theo tn gCi nh< cc Register file, khi l0p
trnh cho cc thanh ghi ny, ng<Fi l0p trnh c(n nh+ 'Ka chI c:a tRng thanh ghi, 'y l vi.c t<,ng
'Ai kh khTn. Tuy nhin, trong h(u ht cc ph(n m/m l0p trnh cho AVR, 'Ka chI c:a t9t cB cc
thanh ghi trong vng I/O '/u '<=c 'Knh nghZa tr<+c trong 1 file Definition, b*n chI c(n 'nh km
file ny vo ch<,ng trnh c:a b*n l c th5 truy xu9t cc thanh ghi v+i tn gCi c:a chng. GiB sE
trong v d$ Q bi 1, '5 l0p trnh cho chip Atmega8 b1ng AVRStudio, dng th@ 2 chng ta sE d$ng
INCLUDE "M8DEF.INC" '5 load file 'Knh nghZa cho chip ATMega8, file M8DEF.INC. V v0y,
trong sau ny khi muAn sE d$ng thanh ghi DDRD b*n chI c(n gCi tn c:a chng, nh<:
OUT DDRD,R6.
Ph<n 4: RAM ngo*i (external SRAM), cc chip AVR cho php ng<Fi sE d$ng gPn thm cc
b> nh+ ngoi '5 ch@a bin, vng ny thOc ch9t chI tNn t*i khi no ng<Fi sE d$ng gPn thm b> nh+
ngoi vo chip.
Ph<n 5: EEPROM (Electrically Ereasable Programmable ROM) l m>t ph(n quan trCng c:a
cc chip AVR m+i, v l ROM nn b> nh+ ny khng bK xa ngay cB khi khng cung c9p nguNn
nui cho chip, r9t thch h=p cho cc @ng d$ng l<u trH dH li.u. Nh< trong hnh 1, ph(n b> nh+
EEPROM '<=c tch ring v c 'Ka chI tnh tR 0x0000.


AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
AVR ho&t +7ng nh2 th, no?
Hnh 4 bi5u di[n c9u trong bn trong c:a 1 AVR. B*n th9y r1ng 32 thanh ghi trong Register
File '<=c kt nAi trOc tip v+i Arithmetic Logic Unit -ALU (ALU cMng '<=c xem l CPU c:a
AVR) b1ng 2 line, v th ALU c th5 truy xu9t trOc tip cng lc 2 thanh ghi RF chI trong 1 chu
kW xung clock (vng '<=c khoanh trn mu 'X trong hnh 4).

Hnh 4. Cu trc bn trong AVR.
Cc instruction '<=c ch@a trong b> nh+ ch<,ng trnh Flash memory d<+i d*ng cc thanh ghi
16 bit. B> nh+ ch<,ng trnh '<=c truy c0p trong mUi chu kW xung clock v 1 instruction ch@a
trong program memory s3 '<=c load vo trong instruction register, instruction register tc '>ng v
lOa chCn register file cMng nh< RAM cho ALU thOc thi. Trong lc thOc thi ch<,ng trnh, 'Ka chI
c:a dng l.nh 'ang thOc thi '<=c quyt 'Knh bQi m>t b> 'm ch<,ng trnh PC (Program
counter). S chnh l cch th@c ho*t '>ng c:a AVR.
AVR c <u 'i5m l h(u ht cc instruction '/u '<=c thOc thi trong 1 chu kW xung clock, v
v0y c th5 nguNn clock l+n nh9t cho AVR c th5 nhX h,n 1 sA vi 'i/u khi5n khc nh< PIC nh<ng
thFi gian thOc thi v\n nhanh h,n.



AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
III. Stack.
Stack '<=c hi5u nh< l 1 thp dH li.u, dH li.u '<=c ch@a vo stack Q 'Inh thp v dH
li.u cMng '<=c l9y ra tR 'Inh. Ki5u truy c0p dH li.u c:a stack gCi l LIFO (Last In First Out vo
sau ra tr<+c). Hnh 5 th5 hi.n cch truy c0p dH li.u c:a stack.

Hnh 5. Stack
Khi ni.m v cch th@c ho*t '>ng c:a stack c th5 '<=c p d$ng cho AVR, b1ng cch khai
bo m>t vng nh+ trong SRAM l stack ta c th5 sE d$ng vng nh+ ny nh< m>t stack thOc th$.
S5 khai bo m>t vng SRAM lm stack chng ta c(n xc l0p 'Ka chI '(u c:a stack b1ng cch
xc l0p con trX stack-SP (Stack Pointer). SP l 1 con trX 16 bit bao gNm 2 thanh ghi 8 bit SPL v
SPH (chH L l LOW chI thanh ghi mang gi trK byte th9p c:a SP, v H = HIGH), SPL v SPH
n1m trong vng nh+ I/O. Gi trK gn cho thanh ghi SP s3 l 'Ka chI khQi '>ng c:a stack. Quay l*i
v d$ Q bi 1, ph(n khQi t*o cc 'i/u ki.n '(u.
; KHOI TAO CC DIEU KIEN DAU
LDI R16, HIGH(RAMEND)
LDI R17, LOW(RAMEND)
OUT SPH, R16
OUT SPL, R17
BAn dng khai bo trn m$c 'ch l gn gi trK c:a RAMEND cho con trX SP, RAMEND
(t@c End of Ram) l bin ch@a 'Ka chI l+n nh9t c:a RAM n>i trong AVR, bin ny '<=c 'Knh
nghZa trong file M8DEF.INC. Nh< th sau 4 dng trn, con trX SP ch@a gi trK cuAi cng c:a
SRAM hay ni cch khc vng stack bPt '(u tR vK tr cuAi cng c:a b> nh+ SRAM. Nh<ng t*i sao
l vK tr cuAi cng m khng l 1 gi trK khc. C th5 giBi thch nh< sau: stack trong AVR ho*t
'>ng tR trn xuAng, sau khi dH li.u '<=c ']y vo stack, SP s3 giBm gi trK v th khQi '>ng SP Q
vK tr cuAi cng c:a SRAM s3 trnh '<=c vi.c m9t dH li.u do ghi '. B*n c th5 khQi '>ng stack
v+i 1 'Ka chI khc, tuy nhin v l do an ton, nn khQi '>ng stack Q RAMEND.
Hai instruction dng cho truy c0p stack l PUSH v POP, trong ' PUSH dng ']y dH li.u
vo stack v POP dng l9y dH li.u ra khXi stack. DH li.u '<=c ']y vo v l9y ra khXi stack t*i vK
tr m con trX SP trX 'n. V d$ cho chip ATMega8, RAMEND=0x045F, sau khi khQi '>ng, con
trX SP trX 'n vK tr 0x045F trong SRAM, nu ta vit cc cu l.nh sau:
LDI R1, 1
PUSH R1
LDI R1, 5
PUSH R1
LDI R1, 8
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
PUSH R1
Khi ' n>i dung c:a stack s3 nh< trong hnh 6.

Hnh 6. N$i dung stack trong v d6.
Sau mUi l(n PUSH dH li.u, SP s3 giBm 1 ',n vK v trX vo vK tr tip theo.
By giF nu ta dng POP '5 l9y dH li.u tR stack, POP R2, th R2 s3 mang gi trK c:a ngTn
nh+ 0x045D, t@c R2=8. Tr<+c khi instruction POP '<=c thOc hi.n, con trX SP '<=c tTng ln 1
',n vK, sau ' dH li.u s3 '<=c l9y ra tR vK tr m SP trX 'n trong stack.
Stack trong AVR khng phBi l v 'y, nghZa l chng ta chI c th5 PUSH dH li.u vo
stack Q 1 '> su nh9t 'Knh no '9y (ph$ thu>c vo chip). SE d$ng stack khng 'ng cch 'i khi
s3 lm ch<,ng trnh thOc thi sai hoDc tAn thFi gian thOc thi v ch. V th khng nn sE d$ng stack
chI '5 l<u cc bin thng th<Fng. ^ng d$ng phY bin nh9t c:a stack l sE d$ng trong cc ch<,ng
trnh con (Subroutine), khi chng ta c(n nhBy tR m>t vK tr trong ch<,ng trnh chnh 'n 1
ch<,ng trnh con, sau khi thOc hi.n ch<,ng trnh con l*i muAn quay v/ vK tr ban '(u trong
ch<,ng trnh chnh th Stack l ph<,ng cch tAi <u dng '5 ch@a b> 'm ch<,ng trnh trong
tr<Fng h=p ny. Xem l*i v d$ trong bi 1, trong ch<,ng trnh chnh chng ta dng l.nh RCALL
DELAY '5 nhBy 'n 'o*n ch<,ng trnh con DELAY, RCALL l l.nh nhBy 'n 1 vK tr trong b>
nh+ ch<,ng trnh, tr<+c khi nhBy, PC '<=c c>ng thm 1 v PUSH m>t cch tO '>ng vo stack.
CuAi ch<,ng trnh con DELAY, chng ta dng instruction RET, instruction ny POP dH li.u tR
stack ra PC m>t cch tO '>ng, b1ng cch ny chng ta c th5 quay l*i vK tr tr<+c '. Chnh v cc
l.nh RCALL v RET sE d$ng stack m>t cch tO '>ng nn ta phBi khQi '>ng stack ngay tR '(u,
nu khng ch<,ng trnh s3 thOc thi sai ch@c nTng.
Tm l*i c(n khQi '>ng stack Q '(u ch<,ng trnh v khng nn sE d$ng stack m>t cch ty
thch nu ch<a th0t c(n thit.
IV. Thanh ghi tr&ng thi SREG (STATUS REGISTER).
N1m trong vng nh+ I/O, thanh ghi SREG c 'Ka chI I/O l 0x003F v 'Ka chI b> nh+ l
0x005F (th<Fng 'y l vK tr cuAi cng c:a vng nh+ I/O) l m>t trong sA cc thanh ghi quan
trCng nh9t c:a AVR, v th m ti dnh ph(n ny '5 gi+i thi.u v/ thanh ghi ny. Thanh ghi SREG
ch@a 8 bit cF (flag) chI tr*ng thi c:a b> xE l, t9t cB cc bit ny '/u bK xa sau khi reset, cc bit
ny cMng c th5 '<=c 'Cc v ghi bQi ch<,ng trnh. Ch@c nTng c:a tRng bit '<=c m tB nh< sau:

AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Hnh 7. Thanh ghi trFng thi.
Bit 0 C (Carry Flag: CF nh+): l bit nh+ trong cc php '*i sA hoDc logic, v d$ thanh
ghi R1 ch@a gi trK 200, R2 ch@a 70, chng ta thOc hi.n php c>ng c nh+: ADC R1, R2,
sau php c>ng, kt quB s3 '<=c l<u l*i trong thanh ghi R1, trong khi kt quB thOc l 270
m thanh ghi R1 l*i chI c khB nTng ch@a tAi 'a gi trK 255 (v c 8 bit) nn trong tr<Fng
h=p ny, gi trK l<u l*i trong R1 thOc ch9t chI l 14, 'Nng thFi cF C '<=c set ln 1 (v
270=100001110, trong ' 8 bit sau 00001110 =14 s3 '<=c l<u l*i trong R1).
Bit 1 Z (Zero Flag: CF 0): cF ny '<=c set nu kt quB php ton '*i sA hay php Logic
b1ng 0.
Bit 2 N (Negative Flag: CF m): cF ny '<=c set nu kt quB php ton '*i sA hay php
Logic l sA m.
Bit 3 V (Twos complement Overflow Flag: CF trn c:a b 2): ho*t '>ng c:a cF ny c
v` s3 kh hi5u cho b*n v n lin quan 'n kin th@c sA nhK phn (ph(n b), chng ta s3
'/ c0p 'n khi no th9y c(n thit.
Bit 4 S (Sign Bit: Bit d9u): Bit S l kt quB php XOR giHa 1 cF N v V, S=NV.
Bit 5 H (Half Carry Flag: CF nhF nHa): cF H l cF nh+ trong 1 vi php ton '*i sA v
php Logic, cF ny hi.u quB 'Ai v+i cc php ton v+i sA BCD.
Bit 6 T (Bit Copy Storage): '<=c sE d$ng trong 2 Instruction BLD (Bit LoaD) v BST
(Bit STorage). Ti s3 giBi thch ch@c nTng Bit T trong ph(n gi+i thi.u v/ BLD v BST.
Bit 7 I (Global Interrupt Enable : Cho php ngPt ton b>): Bit ny phBi '<=c set ln 1 nu
trong ch<,ng trnh c sE d$ng ngPt. Sau khi set bit ny, b*n muAn kch ho*t lo*i ngPt
no c(n set cc bit ngPt ring c:a ngPt '. Hai instruction dng ring '5 Set v Clear bit I
l SEI v CLI.

Ch : tt cG cc bit trong thanh ghi SREG 0Hu c th- 012c xa thng qua cc instruction khng
ton hFng CLx v set bIi SEx, trong 0 x l tn c*a Bit.V d6 CLT l xa Bit T v SEI l set bit I.

Ti chI giBi thch ngPn gCn ch@c nTng c:a cc bit trong thanh ghi SREG, c$ th5 ch@c nTng v
cch sE d$ng c:a tRng bit chng ta s3 tm hi5u trong cc tr<Fng h=p c$ th5 sau ny, ng<Fi 'Cc c
th5 tO tm hi5u thm trong cc ti li.u v/ INSTRUCTION cho AVR.
Ti cung c9p thm 1 bBng tm tPt sO Bnh h<Qng c:a cc php ton '*i sA, logic ln cc Bit
trong thanh ghi SREG.
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com

Hnh 8. Jnh h1Ing c*a cc php ton ln SREG.
V. Gi8i thi;u m7t s> Imstruction c9 bAn.
Sau khi tm hi5u c9u trc b> nh+ v ph<,ng th@c ho*t '>ng c:a chip, ph(n ny ti gi+i thi.u
m>t sA instruction m chng ta r9t hay sE d$ng khi l0p trnh cho AVR. Ti s3 chia cc instruction
ny ra thnh nhi/u nhm dOa theo ph*m vi tc '>ng v ch@c nTng c:a chng.
Tr<+c ht chng ta thAng nh9t m>t sA cch sE d$ng k hi.u trong cch vit c php c:a cc
instruction nh< sau:
R
d
: thanh ghi nguNn v cMng l 'ch thu>c Register File.
R
r
: thanh ghi nguNn thu>c Register File.
Khi ni.m nguNn (Source), 'ch (Destination) l chI cc ton h*ng v kt quB trong
cc php ton '*i sA v Logic, v d$ ADD R1, R2 l l.nh c>ng 2 gi trK ch@a trong 2
thanh ghi R1, R2, trong tr<Fng h=p ny cB R1 v R2 '/u '<=c gCi l nguNn v ch@a
gi trK tr<+c khi thOc hi.n php c>ng. Sau khi php c>ng '<=c thOc hi.n, kt quB
'<=c ch@a l*i trong R1 v v th R1 '<=c gCi l 'ch trong tr<Fng h=p ny. R1 vRa
l nguNn, vRa l 'ch trong khi R2 chI l nguNn, nu vit v d$ ny d<+i d*ng tYng
qut s3 l : ADD R
d
, R
r
.
R: kt quB sau khi l.nh '<=c thOc thi.
K: h1ng sA.
k: h1ng sA chI 'Ka chI tuy.t 'Ai c:a thanh ghi.
b: (0 'n 7) sA th@ tO bit trong cc thanh ghi c:a Register File v vng nh+ I/O.
s: (0 'n 7) sA th@ tO bit trong thanh ghi tr*ng thi SREG .
X,Y,X: cc thanh ghi 'Ka chI t<,ng 'Ai (X=R27:R26, X=R29:R28, X=R31:R30).
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
A: 'Ka chI I/O.
q: '> dKch chuy5n c:a 'Ka chI tuy.t 'Ai.
1. I nstruction chD dng cho Register Files:
- LDI (LoaD Immediate).
C php: LDI R
d
, K
Ch@c nTng: Load h1ng sA K vo thanh ghi R
d
.
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$: LDI R16, 99 kt quB l thanh ghi R1 mang gi trK 99.
- MOV (MOVE).
C php: MOV R
d
, R
r

Ch@c nTng: Copy gi trK trong thanh ghi R
r
vo thanh ghi R
d
.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$: MOV R15, R16 kt quB l R15 c cng gi trK v+i R16 (R15=R16=99).
- CLR (CLEAR Register).
C php: CLR R
d

Ch@c nTng: xa thanh ghi R
d
, sau l.nh ny thanh ghi R
d
=0x00.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$: CLR R16 kt quB l R16 = 0x00.
- SER (SET Register).
C php: SER R
d

Ch@c nTng: set t9t cB cc bit tronh thanh ghi R
d
ln 1, sau l.nh ny thanh ghi R
d
=0xFF
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$: SER R16 kt quB l R16 = 0xFF.
- CBR (CLEAR Bit in Register).
C php: CBR R
d
, K
Ch@c nTng: xa cc bit trong thanh ghi R
d
v+i mDt n* K, nu Bit no trong K l 1
th Bit t<,ng @ng trong R
d
s3 bK xa.
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$: CBR R16, 0xF0 kt quB l 4 bit cao nh9t c:a R16 bK xa v K=11110000 (B).
- SBR (SET Bit in Register).
C php: SBR R
d
, K
Ch@c nTng: set cc bit trong thanh ghi R
d
v+i mDt n* K, nu Bit no trong K l 1 th
Bit t<,ng @ng trong R
d
s3 '<=c set ln 1.
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$: SBR R16, 0xF0 kt quB l 4 bit cao nh9t c:a R16 '<=c set ln 1 v
K=11110000 (B).
- BLD (Bit LoaD from T Flag).
C php: BLD R
d
, b
Ch@c nTng: Load gi trK trong cF T c:a thanh ghi SREG vo bit th@ b trong thanh ghi
R
d
. Sy cMng chnh l ch@c nTng chnh c:a cF T.
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
SET ; set bit T ln 1
BLD R16, 4
Kt quB l bit 4 c:a thanh ghi R16 '<=c set ln 1 v gi trK c:a bit T l 1.
- BST (Bit Storage from T Flag).
C php: BST R
d
, b
Ch@c nTng: Copy bit th@ b trong thanh ghi R
d
vo trong cF T c:a thanh ghi SREG.
Sy cMng chnh l ch@c nTng chnh c:a cF T.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$: BST R16, 4 kt quB l cF T ch@a gi trK c:a bit 4 c:a thanh ghi R16.
- CPI (COMPARE with Immediate).
C php: CPI R
d
, K
Ch@c nTng: so snh thanh ghi R
d
v+i h1ng sA K, l.nh ny lm thay 'Yi nhi/u bit trong
thanh ghi SREG trong ' sO thay 'Yi c:a cF Zero l quan trCng nh9t, nu R
d
= K cF
Z=1, ng<=c l*i Z=0, sE d$ng 'Dc 'i5m thay 'Yi c:a cF Z kt h=p v+i l.nh BRNE hoDc
BREQ chng ta c th5 t*o thnh m>t l.nh r3 nhnh.
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$:
LDI R16, 10
CPI R16, 10
Kt quB l cF Z '<=c set thnh 1 v lc ny R16 =10.
- ANDI (AND with Immediate)
C php: ANDI R
d
, K
Ch@c nTng: thOc hi.n php Logic AND giHa thanh ghi R
d
v+i h1ng sA K v kt quB
'Dt l*i trong R
d
.
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$: ANDI R17, 0x00 kt quB l R17 c 0x00.
- AND (Logical AND)
C php: AND R
d
, R
r

Ch@c nTng: thOc hi.n php Logic AND giHa 2 thanh ghi R
d
v R
r ,
kt quB 'Dt l*i
trong R
d
.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R1, 0xFF ;(11111111)
LDI R17, 0xAA; (10101010)
AND R1, R17
Kt quB l R1=0xAA v 11111111 & 10101010 =10101010.
- ORI (Logical OR with Immediate)
C php: ORI R
d
, K
Ch@c nTng: thOc hi.n php Logic OR giHa thanh ghi R
d
v+i h1ng sA K v kt quB 'Dt
l*i trong R
d
.
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$: ORI R17, 0xFF kt quB l R17 c 0xFF.
- OR (Logical OR)
C php: OR R
d
, R
r

Ch@c nTng: thOc hi.n php Logic OR giHa 2 thanh ghi R
d
v R
r ,
kt quB 'Dt l*i trong
R
d
.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R1, 0xFF ;(11111111)
LDI R17, 0xAA; (10101010)
AND R1, R17
Kt quB l R1=0xFF v 11111111 & 10101010 =11111111.
- LSL(Logical Shift Left)
C php: LSL R
d

Ch@c nTng: dKch t9t thanh ghi R
d
sang tri 1 vK tr, Bit 7 (bit l+n nh9t) c:a R
d
s3 '<=c
ch@a trong cF nh+ C, bit 0 c:a R
d
bK xa thnh 0. ThOc ch9t LSL t<,ng '<,ng v+i
php nhn thanh ghi R
d
v+i 2. B*n xem hnh minh hCa bn d<+i.

Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R1, 0B11000011 ; (d*ng nhK phn c:a 195)
LSL R1
Kt quB l R1=10000110 v cF C =1 v thanh ghi R1 ' '<=c dKch sang tri 1 vK
tr, tr<+c khi dKch bit 7 c:a R1 l 1 nn sau khi dKch bit ny '<=c ch@a trong C,
cho nn C=1.
- LSR(Logical Shift Right)
C php: LSR R
d

Ch@c nTng: dKch t9t thanh ghi R
d
sang phBi 1 vK tr, Bit 0 (bit nhX nh9t) c:a R
d
s3 '<=c
ch@a trong cF nh+ C, bit 7 c:a R
d
bK xa thnh 0. ThOc ch9t LSR t<,ng '<,ng v+i
php chia thanh ghi R
d
cho 2. B*n xem hnh minh hCa bn d<+i.

Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R1, 0B11000110 ; (d*ng nhK phn c:a 195)
LSR R1
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Kt quB l R1=01100001 v cF C =1 v thanh ghi R1 ' '<=c dKch sang phBi 1 vK
tr, tr<+c khi dKch bit 0 c:a R1 l 1 nn sau khi dKch bit ny '<=c ch@a trong C,
cho nn C=1.
- ADD(ADD without Carry)
C php: ADD R
d
, R
r

Ch@c nTng: thOc hi.n php c>ng 2 thanh ghi R
d
v R
r ,
kt quB 'Dt l*i trong R
d
. CF nh+
C khng '<=c sE d$ng.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R16, 30
LDI R17, 25
ADD R16, R17
Kt quB l R16=55.
- ADC(ADD with Carry)
C php: ADC R
d
, R
r

Ch@c nTng: thOc hi.n php c>ng 2 thanh ghi R
d
v R
r ,
kt quB 'Dt l*i trong R
d
. CF nh+
C '<=c set nu kt quB v<=t qu 255.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R16, 255
LDI R17, 1
ADC R16, R17
Kt quB l R16=0 v cF C=1v kt quB php c>ng l 256=100000000.
- INC (INCrement)
C php: INC R
d

Ch@c nTng: tTng thanh ghi R
d
1 ',n vK v kt quB 'Dt l*i trong R
d
. L.nh ny 'Dc bi.t
thch h=p cho cc @ng d$ng lDp, kt h=p v+i BREQ hay BRNE c th5 t*o thnh 1
vng lDp FOR.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$: INC R17 kt quB l R17 '<=c tTng thm 1 ',n vK.
- SUB(SUBtract without Carry)
C php: SUB R
d
, R
r

Ch@c nTng: thOc hi.n php trR 2 thanh ghi R
d
- R
r ,
kt quB 'Dt l*i trong R
d
. CF nh+ C
khng '<=c sE d$ng.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R16, 30
LDI R17, 25
SUB R16, R17
Kt quB l R16=5.
- SUBI(SUBtract Immediate)
C php: SUBI R
d
, K
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Ch@c nTng: thOc hi.n php trR thanh ghi R
d
v+i h1ng sA K,

kt quB 'Dt l*i trong R
d
.
Gi+i h*n: chI p d$ng cho cc thanh ghi tR R16 'n R31.
V d$:
LDI R16, 30
SUBI R16, 20
Kt quB l R16=10.
- DEC (DECrement)
C php: DEC R
d

Ch@c nTng: giBm thanh ghi R
d
1 ',n vK v kt quB 'Dt l*i trong R
d
. L.nh ny 'Dc bi.t
thch h=p cho cc @ng d$ng lDp, kt h=p v+i BREQ hay BRNE c th5 t*o thnh 1
vng lDp FOR.
Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$: DEC R17 kt quB l R17 '<=c giBm 'i 1 ',n vK.
- MUL (MULtiply unsigned)
C php: MUL R
d
, R
r

Ch@c nTng: thOc hi.n php nhn khng d9u 2 thanh ghi 8 bit R
d
, R
r
, kt quB l 1 sA 16
bit 'Dt trong 2 thanh ghi R1:R0. Ch nu R
d
v R
r
l cc thanh ghi R1 v R0 th kt
quB sau khi tnh '<=c s3 '<=c vit ' ln. Xem hnh minh hCa instruction MUL bn
d<+i.

Gi+i h*n: p d$ng cho t9t cB cc thanh ghi trong RF.
V d$:
LDI R16, 30
LDI R17, 25
MUL R16, R17
Kt quB l R1=0x2, R0=0xEE, v 30x25=750=0x02EE.
2. I nstruction cho cc thanh ghi I /O
BAn instruction sau 'y '<=c thit k ring '5 truy c0p vng nh+ I/O, cc instruction ny sE
d$ng 'Ka chI I/O c:a cc thanh ghi trong vng nh+ ny. V l thit k ring cho vng nh+ I/O, b*n
khng th5 sE d$ng cc thanh ghi ny '5 truy c0p RF hay SRAM. Trong cc c php c:a
instruction ny, khi ni.m 'Ka chI A l 'Ka chI I/O, 0 a A a 63, nu trong v d$ A=0x00 th ' l
thanh ghi '(u tin c:a vng I/O, khng phBi l thanh ghi R0.
- OUT(OUTPUT Data )
C php: OUT A,R
r

Ch@c nTng: xu9t gi trK tR thanh ghi R
r
ra thanh ghi c 'Ka chI A trong vng nh+ I/O.
'y l cch phY bin nh9t '5 xu9t gi trK ra vng I/O.
Gi+i h*n: R
r
l thanh ghi RF b9t kW, A bK gi+i h*n tR 0 'n 63.
V d$:
LDI R16, 0xFF
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
OUT 0x11, R16
Kt quB l thanh ghi c 'Ka chI 0x11 trong vng I/O, t@c thanh ghi DDRD, c gi
trK b1ng 0xFF.
- IN(INPUT Data )
C php: IN R
r
, A
Ch@c nTng: Load gi trK tR thanh ghi c 'Ka chI A trong vng nh+ I/O vo thanh ghi
R
r
. Sy l cch phY bin nh9t '5 nh0n gi trK tR vng I/O.
Gi+i h*n: R
r
l thanh ghi RF b9t kW, A bK gi+i h*n tR 0 'n 63.
V d$:
IN R16, 0x10
Kt quB l thanh ghi R16 nh0n '<=c gi trK c:a thanh ghi c 'Ka chI 0x11 trong
vng I/O, t@c thanh ghi PIND, 'y chnh l v d$ 'Cc gi trK cc chn c:a PORTD
vo R16.
- SBI(Set Bit in I/O Register)
C php: SBI A, b
Ch@c nTng: Set bit th@ b trong thanh ghi c 'Ka chI A trong vng nh+ I/O. Tuy nhin
l.nh ny khng c tc d$ng trn ton b> vng I/O m chI c tc 'Ai v+i 32 thanh ghi
'(u ('Ka chI tR 0 'n 31).
Gi+i h*n: b l sA th@ cc bit trong thanh ghi, 0aba7; A bK gi+i h*n tR 0 'n 31.
V d$:
SBI 0x12, 2
Kt quB l bit 2 c:a thanh ghi c 'Ka chI 0x12 trong vng I/O, t@c thanh ghi
PORTD, '<=c set ln 1. Sy chnh l v d$ set chn PD2 c:a PORTD.
- CBI(Clear Bit in I/O Register)
C php: CBI A, b
Ch@c nTng: xa bit th@ b trong thanh ghi c 'Ka chI A trong vng nh+ I/O. Tuy nhin
l.nh ny khng c tc d$ng trn ton b> vng I/O m chI c tc 'Ai v+i 32 thanh ghi
'(u ('Ka chI tR 0 'n 31).
Gi+i h*n: b l sA th@ cc bit trong thanh ghi, 0aba7; A bK gi+i h*n tR 0 'n 31.
V d$:
CBI 0x12, 2
Kt quB l bit 2 c:a thanh ghi c 'Ka chI 0x12 trong vng I/O, t@c thanh ghi
PORTD, bK xa thnh 0. Sy chnh l v d$ xa chn PB2 c:a PORTD.
Nh< ti trnh by Q ph(n trn, trong lc l0p trnh, sau khi include file 'Knh nghZa cho chip b*n
c th5 sE d$ng tn c:a cc thanh ghi thay cho 'Ka chI c:a chng, nh< th ch<,ng trnh c:a cc b*n
s3 trQ nn d[ hi5u h,n.
3. Cc con trF X, Y, Z v cch truy c#p ton b( khng gian b( nh@
Trong Register File c:a AVR, cc thanh ghi tR R26 'n R31ngoi ch@a nTng thanh ghi thng
th<Fng cn c ch@c nTng l con trX (Pointer) trong vi.c truy c0p b> nh+ (cB b> nh+ data v b> nh+
Program). Nu '<=c sE d$ng nh< cc Pointer, cc thanh ghi trn '<=c bit 'n v+i tn gCi X, Y,
Z. SKnh nghZa nh< sau: X=R27:R26, X=R29:R28, X=R31:R30. Chng l 3 thanh ghi 16 bit '<=c
'Knh nghZa tr<+c cho t9t cB cc AVR. Ngoi ra trong cc file 'Knh nghZa cho chip chng ta c thm
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
6 'Knh nghZa khc l XL, XH, YL, YH, ZL, ZH cMng chnh l tn gCi c:a R26-> R31. Ph(n ny
chng ta khBo st m>t sA instruction dng truy c0p ton b> khNi nh+ c:a AVR b1ng cch sE d$ng
'Ka chI trOc tip v b1ng cch sE d$ng Pointer.
- LDS(LoaD direc from data Space)
C php: LDS R
d
, k
Ch@c nTng: load gi trK 1 byte tR thanh ghi c 'Ka chI k trong SRAM vo thanh ghi R
d
,
k l d*ng 'Ka chI tuy.t 'Ai c gi+i h*n tR 0 'n 65535(2
16
-1) .
Gi+i h*n: R
d
l thanh ghi b9t kW trong RF nh<ng gi trK l+n nh9t c:a k l 65535, v th
v+i l.nh ny ta khng th5 truy c0p v<=t qu khoBng khng gian 64KB. Nu muAn truy
c0p vng khng gian l+n h,n 64KB chng ta c(n m>t sA hU tr=, tuy nhin Q 'y ti
giB sE b> nh+ c:a chip (th<Fng l b> nh+ data) khng v<=t qu 64KB (thOc t ch<a c
chip AVR no c SRAM hay EEPROM v<=t qu 64KB).
V d$:
LDS R2, 0x0060
Kt quB l thanh ghi R2 ch@a gi trK c:a thanh ghi c 'Ka chI 0x0060, 'y l thanh
ghi '(u tin trong khoBng SRAM (sau RF v vng I/O) c:a AVR.
- STS(STorage direc to data Space)
C php: STS k, R
r

Ch@c nTng: instruction ny hon ton giAng LDS nh<ng dng '5 xu9t dH li.u tR thanh
ghi R
r
ra RAM, ng<,i 'Cc c th5 tham khBo ph(n giBi thch cho LDS.

SE d$ng 'Ka chI trOc tip th cu l.nh s3 ',n giBn nh<ng r9t kh nh+ ph(n 'Ka chI, thng
th<Fng SRAM l vng chng ta hay sE d$ng '5 ch@a bin t*m thFi, trong cc ngn ngH c9p cao ta
chI c(n nh+ tn bin nh<ng v+i ASM chng ta phBi nh+ 'Ka chI c:a chng. M>t cch tAt '5 trnh
vi.c ny l dng chI thK (DIRECTIVE, b*n xem l*i bi 1) . EQU '5 gn tn bin cho 1 'Ka chI, v
d$ .EQU bientam = 0x0060 v sau ' sE d$ng bientam thay cho 0x0060.
M>t cch khc '<=c dng '5 truy c0p b> nh+ m khng dng 'Ka chI tuy.t 'Ai l sE d$ng sE
d$ng con trX. C 2 instruction hU tr= con trX l LD (LoaD indirec from data Space), v ST
(STorage indirec to data Space), LD 'Cc dH li.u tR SRAM vo thanh ghi cn ST l<u dH li.u tR
thanh ghi vo SRAM. CB 3 con trX X, Y v Z '/u c th5 '<=c dng nh<ng c m>t sA 'i5m l<u :
cB 3 '/u dng '<=c trong tr<Fng h=p truy xu9t thng th<Fng nh<ng v+i cch truy c0p c offset,
con trX X khng sE d$ng '<=c. S5 truy xu9t b> nh+ ch<,ng trnh b1ng con trX th Z l giBi php
duy nh9tD<+i 'y l 1 sA cch sE d$ng LD, ST kt h=p v+i con trX, chng ta xt thng qua cc
v d$.
V dB 1:
CLR R27 ; xa R27, t@c xa byte cao c:a pointer X
LDI R26, 0x60 ; load gi trK 0x60 vo R26, t@c byte th9p c:a pointer X
; sau 2 dng trn, gi pointer X l 0x0060, sbn sng '5 trX 'n vK tr '(u tin trong SRAM.

LD R1, X+ ; Load gi trK Q A nh+ 0x0060 vo R1 (v X trX 'n 0x0060), sao ' tTng gi trK
;X ln 1, nh< th sau l.nh ny X=0x0061
LD R2, X+ ; Load gi trK Q A nh+ 0x0061 vo R2, sao ' tTng gi trK ;X ln 1, nh< th sau
l.nh ny X=0x0062
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
LD R3, X ; Load gi trK Q nh+ 0x0062 vo R3 v khng thay 'Yi X
LD R4, -X ; GiBm gi trK c:a X tr<+c (X=0x0061), sau ' load gi trK Q nh+ 0x0061 vo
R4
TR v d$ ny chng ta th9y c 3 cch c, bBn '5 load dH li.u tR SRAM b1ng con trX, cch
Load trOc tip trong tr<Fng h=p LD R3, X, cch load post-increment (hoDc post-decrement) nh<
trong tr<Fng h=p LD R1, X+ v cch load pre-decrement (hoDc pre-increment) trong tr<Fng h=p
LD R4, -X.
Chng ta c th5 vit l*i v d$ trn nh<ng sE d$ng con trX Y hoDc Z thay cho X. V d$ vit
cho instruction ST cMng hon ton t<,ng tO.
Tuy nhin cch truy c0p theo cch pre hay post '/u lm thay 'Yi gi trK c:a con trX, 'i/u ny
c 1 b9t l=i l nu chng ta muAn quay l*i vK tr nh+ no ', chng ta phBi tip t$c thay 'Yi con
trX. S5 trnh vi.c lm ny, 1 cch truy c0p khc '<=c hU tr= l truy c0p Offset. Xt v d$ sau:
LD R1, Y+1
Sy chnh l cch truy c0p Offset dng con trX Y, cch vit trn l t<,ng '<,ng v+i cch vit
LD R1, Y+
Nh<ng 'i5m khc bi.t Q 'y l cch vit Offset khng lm thay 'Yi gi trK c:a con trX Y. SE
d$ng Offset c <u 'i5m nh< sE d$ng mBng (array) trong cc ngn ngH l0p trnh c9p cao. CEn ch
l gi tr7 offset khng v12t qu 63 v ph1(ng php ny ch9 dng cho 2 thanh ghi Y v Z.
4. RG nhnh v vng lHp
Khng giAng nh< cc ngn ngH c9p cao, khi l0p trnh b1ng ASM b*n khng '<=c hU tr= cc
c9u trc 'i/u khi5n nh< If, For, Whileng<Fi l0p trnh ASM phBi tO xy dOng cho mnh cc c9u
trc ny tR nhHng instruction c, bBn. Nu b*n c trong tay ti li.u tra c@u instruction cho AVR
b*n s3 th9y c r9t nhi/u instruction c d*ng BRxx, v+i BR l vit tPt c:a tR Branch (r3 nhnh).
Sy l cc instruction c, bBn gip b*n xy dOng cc c9u trc 'i/u khi5n t<,ng '<,ng If, For,
Whilecho ring mnh.
Tr<+c ht ta s3 khBo st instruction BRNE b1ng cch xem l*i v d$ trong bi 1, 'y l 'o*n
ch<,ng trnh con DELAY:
DELAY:
LDI R20, 0xFF
DELAY0:
LDI R21, 0xFF
DELAY1:
DEC R21
BRNE DELAY1
DEC R20
BRNE DELAY0
RET
B*n hy ch 4 dng l.nh n1m giHa 'o*n ch<,ng trnh trn, dng '(u tin th b*n ' bit -
load gi tr7 255 vo thanh ghi R21, sau ' ti 'Dt 1 label DELAY1- xem nh1 l 1 c$t m@c, dng 3,
instruction DEC b*n m+i '<=c hCc hm nay - giGm gi tr7 thanh ghi R21 0i 1 0(n v7, v cuAi cng
BRNE DELAY1, BRNE l vit tPt c:a BRanch if Not Equal rL nhnh n4u khng bMng, thOc ra
bBn ch9t c:a l.nh ny l rL nhnh n4u cC Zero khng bMng 1. Nh< th cu l.nh BRNE DELAY1
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
c:a chng ta '<=c AVR thOc hi.n nh< sau: ki5m tra cF Z, nu Z=1 tip t$c thOc hi.n dng tip
theo sau m khng quan tm 'n nhn DELAY1, nh<ng nu Z=0 th nhBy 'n nhn DELAY1.
B*n th9y r1ng ban '(u R21 =255, sau khi giBm 1 bQi DEC, thanh ghi R21=254c0, cF Z =0, r3
nhnh xBy ra, b> 'm ch<,ng trnh nhBy v/ nhn DELAY1. Qu trnh ny lDp l*i khoBng 255 l(n
tr<+c khi R21 =0 d\n 'n Z=1.
Bao bn ngoi vng lDp c:a nhn DELAY1 l vng lDp c:a nhn DELAY0, cch hi5u hon
ton t<,ng tO nh<ng tr<+c khi l.nh DEC R20 '<=c thOc thi th phBi chF cho vng lDp DELAY1
kt thc. BBn thn DELAY0 cMng l 1 vng lDp 255 l(n. kt quB cuAi cng l ta thu '<=c 1 vng
lDp khoBng 255x255 l(n m khng lm g cB, ' chnh l nghZa v cch ho*t '>ng c:a 'o*n
ch<,ng trnh con DELAY.
Bn c*nh BRNE chng ta c 1 sA instruction ph$c v$ r3 nhnh khc nh<:
- BREQ(BRanch if EQual )
C php: BREQ LABEL
Ch@c nTng: NhBy 'n nhn LABEL nu cF Z =1. CF Z chKu tc '>ng c:a r9t nhi/u
instruction nh< CP, CPI, SUB, SUBIv th BREQ th<Fng '<=c sE d$ng sau cc
instruction ny.
V d$:
LDI R16, 0xFF
LDI R17, 0xFF
CP R16, R17 ; so sanh 2 thanh ghi R16, R17
BREQ RENHANH
..
RENHANH:
; thOc hi.n nhHng vi.c khi r3 nhnh.

Kt quB l vi.c r3 nhnh xBy ra v khi so snh b1ng CP, R17=R16 nn cF Z tO
'>ng '<=c set b1ng 1, l.nh BREQ '<=c thOc thi v nhBy 'n nhn RENHANH. V
d$ ny t<,ng '<,ng c9u trc if (R16=R17) {thOc hi.n nhHng vi.c khi r3 nhnh}
- BRLO(BRanch if LOwer )
C php: BRLO LABEL
Ch@c nTng: bBn ch9t c:a cu l.nh l nhBy 'n nhn LABEL nu cF C =1. Tuy nhin,
thng th<Fng l.nh ny sE d$ng theo sau cc instruction nh< CP, CPI, SUB,
SUBIkhi ' vi.c r3 nhnh s3 xBy ra nu thanh ghi R
d
<R
r
.
V d$:
EOR R16, R16 ;XOR R16 v+i chnh n, t<,ng '<,ng CLR R16
VONG LAP:
INC R16 ;tTng R16 thm 1 ',n vK
CPI R16, $10 ;so snh R16 v+i sA hexadecimal $10
BRLO VONGLAP ;nhBy v/ VONGLAP nu R16 <$10
NOP ;cu l.nh ny s3 '<=c thOc thi nu 'i/u ki.n r3 nhnh Q trn khng thXa,
; NOP l 1 instruction, ch@c nTng l khng lm g cB.

AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Kt quB l ph(n l.nh bn trong VONGLAP s3 '<=c th<c hi.n khoBng 16 l(n
($10=16) tr<+c khi thOc hi.n l.nh NOP.
- BRSH(BRanch if Same or Higher )
C php: BRSH LABEL
Ch@c nTng: bBn ch9t c:a cu l.nh l nhBy 'n nhn LABEL nu cF C =0. Tuy nhin,
thng th<Fng l.nh ny sE d$ng theo sau cc instruction nh< CP, CPI, SUB,
SUBIkhi ' vi.c r3 nhnh s3 xBy ra nu thanh ghi R
d
dR
r
.
V d$:
SUBI R16, 4 ;trR R16 'i 4 ',n vK
BRSH RENHANH ; nhBy 'n RENHANH nu R16 d 4
.
RENHANH:
NOP

Cn r9t nhi/u instruction r3 nhnh b*n c th5 sE d$ng '5 t*o c9u trc 'i/u khi5n, ch l cc
instruction ny '/u ho*t '>ng dOa trn tr*ng thi c:a 1 cF no ', do ' b*n c(n lOa chCn 1 l.nh
ph h=p '5 thOc thi tr<+c cc instruction r3 nhnh ny, '5 lm '<=c nh< v0y b*n c(n xem k7 ti
li.u h<+ng d\n INSTRUCITON cho AVR.
Ph(n ny ti ' giBi thch ho*t '>ng v @ng d$ng c:a m>t sA instruction c, bBn, '5 bit ht
cc instrcuiton cho AVR b*n c(n tham khBo ti li.u lin quan.
VI. Macro v ch29ng trnh con.
Macro l khi ni.m chI m>t 'o*n code nhX '5 thOc hi.n m>t cng vi.c no ', nu c 1 'o*n
code no ' m b*n r9t hay sE d$ng khi l0p trnh th b*n nn dng macro '5 trnh vi.c phBi vit 'i
vit l*i 'o*n code '. L0p trnh ASM cho AVR cho php b*n sE d$ng Macro, '5 t*o 1 Macro b*n
sE d$ng DIRECTIVE .MACRO v .ENDMACRO, b*n xem 1 v d$:
.MACRO delay4
NOP
NOP
NOP
NOP
.ENDMACRO
So*n Macro trn c tn delay4 thOc hi.n vi.c delay 4 chu kW my b1ng 4 l.nh NOP, nu
trong ch<,ng trnh b*n c(n dng Macro ny th chI c(n gCi delay4 Q b9t kW dng no.
[] ; code c:a b*n
Delay4
[] ; code c:a b*n
MUi l(n tn c:a Macro '<=c gCi, trnh bin dKch s3 tm 'n Macro ' v copy ton b7 n7i
dung Macro vo vK tr b*n gCi. Nh< v0y thOc ch9t con trX ch<,ng trnh khng nhBy 'n Macro,
Macro khng lm giBm dung l<,ng ch<ong trnh m chI lm cho vi.c l0p trnh nhe nhng h,n.
Sy chnh l khc bi.t l+n nh9t c:a Macro v Subroutine (ch<,ng trnh con).
Ch<,ng trnh con cMng l 1 'o*n code thOc hi.n 1 ch@c nTng 'Dc bi.t no '. Tuy nhin
khc v+i Macro, mUi khi gCi ch<,ng trnh con, con trX ch<,ng trnh nhBy 'n ch<,ng trnh con '/
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
thOc thi ch<,ng trnh con v sau ' quay v/ ch<,ng trnh chnh. Nh< th ch<,ng trnh con chI
'<=c bin dKch 1 l(n v c th5 sE d$ng nhi/u l(n, n lm giBm dung l<=ng ch<ong trnh. Sy l
<u 'i5m v cMng l 'i5m khc bi.t l+n nh9t giHa ch<,ng trnh con v Macro. Tuy nhin c(n ch
l vi.c nhBy 'n ch<,ng trnh con v nhBy v/ ch<,ng trnh chnh c(n vi chu kW my, c th5 lm
ch0m ch<,ng trnh, 'y l nh<=c 'i5m c:a ch<,ng trnh con so v+i macro.
Ch<,ng trnh con cho AVR lun '<=c bPt '(u b1ng 1 Label, ' cMng l tn v 'Ka chI c:a
ch<,ng trnh con. Ch<,ng trnh con th<Fng '<=c kt thc v+i cu l.nh RET (Return). Chng ta
' bit v/ ch<,ng trnh con qua v d$ c:a bi 1, trong ' DELAY l 1 ch<,ng trnh con.
S5 gCi ch<,ng trnh con tR 1 vK tr no ' trong ch<,ng trnh, chng ta c th5 dng l.nh
CALL hoDc RCALL (Relative CALL) (xem l*i v d$ bi 1 v/ cch sE d$ng RCALL). MUi khi
cc l.nh ny '<=c gCi, b> 'm ch<,ng trnh '<=c tO '>ng '<=c PUSH vo stack v khi ch<,ng
trnh con kt thc b1ng l.nh RET, b> 'm ch<,ng trnh '<=c POP trQ ra v quay v/ ch<,ng trnh
chnh. L.nh CALL c th5 gCi 1 ch<,ng trnh con Q b9t kW vK tr no trong khi RCALL chI gCi
trong khoBng b> nh+ 4KB, nh<ng RCALL c(n t chu kW xung clock h,n khi thOc thi.
Hai instruction khc c th5 '<=c dng '5 gCi ch<,ng trnh con ' l JMP (Jump) v RJMP
(Relative Jump). Khc v+i cc l.nh call, cc l.nh jump khng cho php quay l*i v khng tO '>ng
PUSH b> 'm ch<,ng trnh vo Stack, '5 sE d$ng cc l.nh ny gCi ch<,ng trnh con b*n c(n m>t
sA l.nh jump khc Q cuAi ch<,ng trnh con.
Tm l*i b*n nn vit 1 ch<,ng trnh con 'ng chu]n v dng CALL hoDc RCALL '5 gCi
ch<,ng cc ch<,ng trnh ny, chI nhHng tr<Fng h=p 'Dc bi.t hoDc b*n hi5u r9t r v/ chng th c
th5 dng cc l.nh jump.
VII. Ch29ng trnh v dB.
Nu b*n ' 'Cc v hi5u 'n thFi 'i5m ny th b*n ' c th5 hi5u ht ho*t '>ng c:a ch<,ng
trnh v d$ trong bi 1, th0t sO v d$ ' r9t ',n giBn v d[ hi5u. Tuy nhin, b*n c th/ tAi <u ha v
d$ ' theo h<+ng lm giBm dung l<=ng ch<,ng trnh v t9t nhin, ch<,ng trnh s3 kh hi5u h,n
cho ng<Fi khc. Cc ph(n khQi '>ng vK tr b> nh+, stack v ch<,ng trnh con DELAY chng ta
khng thay 'Yi, chI thay 'Yi ph(n ch<,ng trnh chnh, 1 trong nhHng cch vit ch<,ng trnh chnh
nh< cch sau:
; CHUONG TRINH CHINH , BAI 1, VI DU 1, VERSION 2///////////////////////////////
LDI R16, $1 ; LOAD GIA TRI KHOI DONG CHO R16
MAIN:
OUT PORTB, R16 ; XUAT GIA TRI TRONG R16 RA PORTB
RCALL DELAY ; GOI CHUONG TRINH CON DELAY
ROL R16 ; XOAY THANH GHI R16 SANG TRAI 1 VI TRI
RJMP MAIN ; NEU R16 c0, NHAY VE MAIN, TIEP TUC QUET
;//////////////////////////////////////////////////////////////////////////////////////////
C th5 khng c(n giBi thch b*n cMng ' c th5 hi5u 'o*n code trn, 'y chI l 1 trong
nhHng cch c th5, b*n hy vit l*i theo cch c:a ring b*n v+i yu c(u l ch<,ng trnh phBi thOc
hi.n 'ng ch@c nTng v ngPn gCn.
By giF chng ta s3 thOc hi.n m>t v d$ minh hCa cho nhHng g chng ta ' hCc trong bi 2
ny. N>i dung c:a v d$ th5 hi.n trong m*ch 'i.n hnh 9. Ho*t '>ng c:a m*ch 'i.n tE nh< sau: 1
chip ATMega8 '<=c sE d$ng nh< m>t counter, c th5 dng '5 'm ln v 'm xuAng, 2 button
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
trong m*ch 'i.n tc '>ng nh< 2 kicker, nh9n button 1 '5 'm ln v button '5 'm xuAng, gi
trK 'm n1m trong khoBng tR 0 'n 9. Gi trK 'm '<=c hi5n thK trn 1 LED 7 'o*n lo*i anod
chung (d<,ng chung), chip 7447 '<=c dng '5 giBi m tR gi trK BCD xu9t ra bQi ATMega8 sang
tn hi.u cho LED 7 'o*n anod chung, chng ta c(n sE d$ng 7447 v tn hi.u xu9t ra tR chip
ATMega8 l d*ng nhK phn hoDc BCD , tn hi.u ny khng th5 hi5n thK trOc tip trn cc LED 7
'o*n, chip 7447 c nhi.m v$ chuy5n 1 dH li.u d*ng digit BCD sang m ph h=p cho LED 7 'o*n.
S5 thOc hi.n v d$, tr<+c ht b*n hy v3 m*ch 'i.n nh< trong hnh 9 b1ng ph(n m/m Proteus
(xem cch v3 m*ch 'i.n b1ng Proteus trong v d$ bi 1), m*ch 'i.n chI c 5 lo*i linh ki.n l chip
ATMega8 (tR kha mega8), 1 LED 7 'o*n anod chung v+i tn '(y ': trong Proteus l 7SEG-
COM-AN-GRN (tR kha 7SEG), 1 chip 7447 (tR kha 7447), 1 'i.n trQ 10 f v 2 button (tR kha
button).

Hnh 9. V d6 cho bi 2.
SE d$ng AVRStudio t*o 1 project m+i v+i tn gCi avr2 (xem l*i v d$ bi 1 '5 bit cch t*o
Project m+i trong AVRStudio). Vit l*i ph(n code bn d<+i vo vo file avr2.asm
.INCLUDE "M8DEF.INC"
.CSEG.
.ORG 0x0000
RJMP BATDAU
.ORG 0x0020
BATDAU:
;KHOI DONG STACK POINTER
LDI R17, HIGH(RAMEND)
LDI R16, LOW(RAMEND)
OUT SPL, R16
OUT SPH,R17
; KHOI DONG CAC PORT
CLR R16 ; XOA R16, R16=0
OUT DDRB, R16; DDRB=0, PORTB LA NGO NHAP
LDI R16, 0xFF; SET TAT CA CAC BIT CUA R16 LEN 1
OUT PORTB,R16; DDRB=0, PORTB =0xFF, KEO LEN CAC CHAN PORTB
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
OUT DDRD, R16; DDRD=0xFF, PORTD LA NGO XUAT
CLR R25; XOA R25, R25 LA THANH GHI DUNG CHUA SO DEM
SER R20 ; R21 LA THANH GHI TAM CHUA GIA TRI TRUOC DO CUA PINB
MAIN:
IN R21,PINB ; DOC GIA TRI TU PINB, TUC TU CAC BUTTON
RCALL SOSANH; GOI CHUONG TRINH CON SOSANH
OUT PORTD, R25; XUAT GIA TRI DEM RA PORTD
SBRS R21,0; NEU BIT 0 CUA R21 (TUC CHAN PB0) =1 THI BO QUA DONG
;TIEP THEO
RCALL TANG ; NHAY DEN CHUONG TRINH CON TANG GIA TRI DEM
SBRS R21,1; NEU BIT 1 CUA R21 (TUC CHAN PB1) =1 THI BO QUA DONG
;TIEP THEO
RCALL GIAM; NHAY DEN CHUONG TRINH CON GIAM GIA TRI DEM
MOV R20,R21; LUU LAI TRANG THAI PINB
RJMP MAIN
;**********************CHUONG TRINH CON************************
; **************subroutine kiem tra gioi hang (tu 0 den 9) cua so dem
SOSANH:
CPI R25, 10
BREQ RESET0; NEU GIA TRI DEM=10 THI TRA VE 0
CPI R25, 255
BREQ RESET9; NEU GIA TRI DEM =255 THI TRA VE 9
RJMP QUAYVE; NHAY DEN NHAN QUAYVE
RESET0:
LDI R25,$0; TRA GIA TRI DEM VE 0
RJMP QUAYVE
RESET9:
LDI R25,$9; GAN 9 CHO GIA TRI DEM
QUAYVE:
RET
; ************************************************************
; **************subroutine tang so dem 1 don vi neu dieu kien thoa
TANG:
SBRS R20,0
RET
INC R25
RET
; **************subroutine giam so dem 1 don vi neu dieu kien thoa
GIAM:
SBRS R20,1
RET
DEC R25
RET
AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Trong v ny ny, chng ta sE d$ng 2 PORT c:a chip ATMega8, PORTD dng xu9t dH li.u
(sA 'm) ra chip 7447 v sau ' hi5n thK trn LED 7 'o*n. PORTB dng nh< ng nh0p, tn hi.u tR
cc button s3 '<=c chip ATMega8 nh0n thng qua 2 chn PB0 v PB1 c:a PORTB.
Ho*t '>ng c:a cac PORT v vi.c xc l0p 1 PORT nh< cc ng xu9t chng ta ' khBo st
trong bi 1. g 'y chng ta khBo st thm v/ xc l0p PORT nh< 1 ng nh0p, tr<+c ht b*n hy
quan st m*ch 'i.n t<,ng '<,ng c:a 1 chn trong cc PORT xu9t nh0p c:a AVR trong hnh 10.

Hnh 10. Cu trc chn trong PORT c*a AVR.
Trong m*ch 'i.n hnh 10, cc diode v t$ 'i.n chI c ch@c nTng bBo v. chn PORT, nh<ng
'i.n trQ R
pu
(R Pull up) 'ng vai tr quan trCng nh< l 'i.n trQ ko ln khi chn c:a PORT lm
nhi.m v$ nh0n tn hi.u (ng nh0p). Tuy nhin trong AVR, 'i.n trQ ko ln ny khng phBi lun
kch ho*t, chng ta bit r1ng mUi PORT c:a AVR c 3 thanh ghi: DDRx, PORTx v PINx, nu
DDRx=0 th PORT x l ng nh0p, lc ny thanh ghi PINx l thanh ghi ch@a dH li.u nh0n v/, 'Dc
bi.t thanh ghi PORTx v\n '<=c sE d$ng trong mode ny, ' l thanh ghi xc l0p 'i.n trQ ko ln,
nh< th nu DDRx=0 v PORTx=0xFF th cc chn PORTx l ng nh0p v '<=c ko ln bQi 1
'i.n trQ trong chip, nghZa l cc chn c:a PORTx lun Q m@c cao, muAn kch '5 thay 'Ni tr*ng
thi chn ny chng ta c(n nAi chn ' trOc tip v+i GND, '9y l l do t*i sao cc button trong
m*ch 'i.n c:a chng ta c 1 '(u nAi v+i chn c:a chip cn '(u kia '<=c nAi v+i GND. Sy cMng
l nghZa c:a khi ni.m 'i.n trQ ko ln (Pull up resistor) trong k7 thu0t 'i.n tE. So*n code trong
ph(n KHOI DONG CAC PORT c:a v d$ ny xc l0p PORTD l ng xu9t (DDRD=0xFF) ,
PORTB l ng nh0p c sE d$ng 'i.n trQ ko ln (DDRB=0, PORTB=0xFF).
Chng ta s3 giBi thch ho*t '>ng c:a 'o*n ch<,ng trnh chnh v cc 'o*n ch<,ng trnh con.
Tr<+c ht, trong ch<,ng trnh ny, chng ta sE d$ng 3 thanh ghi chnh l R20, R21 v R25, trong
' R25 l thanh ghi ch@a sA 'm, gi trK c:a thanh ghi R25 s3 '<=c xu9t ra PORTD c:a chip,
thanh ghi R21 ch@a tr*ng thi c:a thanh ghi PINB v cMng l tr*ng thi c:a cc button, thanh ghi
R20 kt h=p v+i thanh ghi R21 t*o thnh 1 b> 'm c*nh xuAng c:a cc button. S5 hi5u th9u 'o
ho*t '>ng 'm (cMng l ho*t '>ng chnh c:a v d$ ny) chng ta xt tr*ng thi chn PB0 nh<
trong hnh 11.

AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Hnh 11. Thay 0Oi trFng thi I cc chn I/O.
Trong tr*ng thi bnh th<Fng (button khng '<=c nh9n), chn PB0 Q m@c cao (do 'i.n trQ
ko ln), b> 'm khng ho*t '>ng, gi trK 'm khng thay 'Yi, by giF nu nh9n button, chn PB0
'<=c nAi trOc tip v+i GND, chn ny s3 bK ko xuAng m@c th9p, b1ng cch ki5m tra tr*ng thi
chn PB0, nu PB0=0 ta tTng gi trK 'm 1 ',n vK. t<Qng nh< th c v` h=p l, tuy nhin nu p
d$ng th ch<,ng trnh s3 ho*t '>ng khng 'ng ch@c nTng, khi b*n nh9n 1 l(n gi, trK 'm c th5
tTng 'n cB trTm hoDc khng ki5m sot '<=c, hi.u @ng ny t<,ng tO khi b*n nh9n v giH 1 phm
trn bn phm my tnh, l do l v chng ta sE d$ng ph<,ng php ki5m tra m@c '5 'm, thFi gian
qut c:a ch<,ng trnh r9t ngPn so v+i thFi gian chng ta giH button. S5 khPc ph$c, chng ta dng
ph<,ng php ki5m tra c*nh xuAng, chI khi no pht hi.n chn PB0 thay 'Yi tR 1 xuAng 0 th m+i
tTng gi trK 'm 1 ',n vK, kt quB l mUi l(n nh9n button th gi trK 'm chI tTng 1 (ngay cB khi ta
nh9n v giH button), thanh ghi R20 '<=c sE d$ng '5 l<u tr*ng thi tr<+c ' c:a PINB (cMng l
tr*ng thi c:a cc button).
Trong ch<,ng trnh, ti sE d$ng 2 istruction m+i l SBRC v SBRS '5 ki5m tra tr*ng thi
cc chn c:a PORTB (button). SBRC Skip if Bit in Register is Clear, l.nh ny s3 bX qua 1 dng
l.nh ngay sau ' (chI bX qua 1 dng duy nh9t) nu 1 bit trong thanh ghi Q m@c 0, SBRC Skip if
Bit in Register is Set- ho*t '>ng t<,ng tO SBRC nh<ng skip s3 xBy ra nu bit trong thanh ghi Q
m@c 1. DOa vo 'y chng ta giBi thch 4 dng sau:
SBRS R21,0
RCALL TANG
SBRS R21,1
RCALL GIAM
Dng 1 dng ki5m tra tr*ng thi bit 0 trong R21 (ch R21 ch@a gi trK c:a PINB), nu bit
ny b1ng 1 (set), t@c chn PB0=1 hay button khng '<=c nh9n, th nhBy bX qua dng l.nh tip
theo '5 'n dng 3. g dng 3 ch<,ng trnh ki5m tra tr*ng thi chn PB1 (button th@ 2). Quay l*i
dng 1, nu ch<,ng trnh ki5m tra pht hi.n chn PB0=0 (button th@ nh9t '<=c nh9n) th dng
l.nh th@ 2 '<=c thOc thi, kt quB l ch<,ng trnh nhBy 'n ch<,ng trnh con TANG.
TANG:
SBRS R20,0
RET
INC R25
RET
Dng '(u tin c:a ch<,ng trnh con TANG l ki5m tra tr*ng thi tr<+c ' c:a chn PB0
('<=c l<u Q bit 0 trong thanh ghi R20), nu tr*ng thi ny b1ng 0, nghZa l khng c sO chuy5n tR
1 xuAng 0 Q chn PB0, dng 2 (l.nh RET) s3 '<=c thOc thi '5 quay v/ ch<,ng trnh chnh. Nh<ng
nu PB0 tr<+c ' b1ng 1, nghZa l c sO thay 'Yi tR 1->0 Q chn ny, gi trK 'm s3 '<=c tTng
thm 1 nhF INC R25, sau ' quay v/ ch<,ng trnh chnh.
Tm l*i muAn tTng gi trK 'm thm 1 ',n vK c(n thXa mn 2 'i/u ki.n: chn PB0 hi.n t*i =0
(button 'ang '<=c nh9n) v tr*ng thi tr<+c ' c:a PB0 phBi l 1 (trnh tr<Fng h=p tTng lin t$c).
Ph<,ng php ny c th5 p d$ng cho r9t nhi/u tr<Fng h=p 'm d*ng 'm xung.
Qu trnh giBm gi trK 'm '<=c hi5u t<,ng tO, ph(n cn l*i c:a v d$ ny b*n 'Cc hy tO
giBi thch theo nhHng g=i trn.

AUTO.NLU

For more details and questions, contact me: thanhtam.h@gmail.com
Chng ta kt thc bi 2 Q 'y, sau bi ny ti hy vCng b*n s3 nPm '<=c m>t cch chung nh9t
c9u trc v ho*t '>ng c:a chip AVR, 'y l c, sQ quan trCng '5 sE d$ng hi.u quB lo*i vi 'i/u
khi5n ny. K5 tR cc bi sau, chng ta s3 tm hi5u ho*t '>ng v @ng d$ng c:a cc thit bK ngo*i vi
trn AVR nh< Timer, chuy5n 'Yi analog to digital (ADC), cc chu]n giao tip
Cc thPc mPc v/ n>i dung v cch sE d$ng ti li.u, cc b*n c th5 lin h. tc giB qua email:
thanhtam.h@gmail.com hoDc sim@mophong.org

You might also like