You are on page 1of 101

Bi 1 - Lm quen AVR

I. Gii thiu. AVR l mt h vi iu khin do hng Atmel sn xut (Atmel cng l nh sn xut dng vi iu khin 89C51 m c th bn tng nghe n). AVR l chip vi iu khin 8 bits vi cu trc tp lnh n gin ha-RISC(Reduced Instruction Set Computer), mt kiu cu trc ang th hin u th trong cc b x l. Ti sao AVR: so vi cc chip vi iu khin 8 bits khc, AVR c nhiu c tnh hn hn, hn c trong tnh ng dng (d s dng) v c bit l v chc nng: Gn nh chng ta khng cn mc thm bt k linh kin ph no khi s dng AVR, thm ch khng cn ngun to xung clock cho chip (thng l cc khi thch anh). Thit b lp trnh (mch np) cho AVR rt n gin, c loi mch np ch cn vi in tr l c th lm c. mt s AVR cn h tr lp trnh on chip bng bootloader khng cn mch np Bn cnh lp trnh bng ASM, cu trc AVR c thit k tng thch C. Ngun ti nguyn v source code, ti liu, application notert ln trn internet. Hu ht cc chip AVR c nhng tnh nng (features) sau:

C th s dng xung clock ln n 16MHz, hoc s dng xung clock ni ln n 8 MHz (sai s 3%) B nh chng trnh Flash c th lp trnh li rt nhiu ln v dung lng ln, c SRAM (Ram tnh) ln, v c bit c b nh lu tr lp trnh c EEPROM. B nh chng trnh Flash c th lp trnh li rt nhiu ln v dung lng ln, c SRAM (Ram tnh) ln, v c bit c b nh lu tr lp trnh c EEPROM. Nhiu ng vo ra (I/O PORT) 2 hng (bi-directional). 8 bits, 16 bits timer/counter tch hp PWM. Cc b chuyn i Analog Digital phn gii 10 bits, nhiu knh. Chc nng Analog comparator. Giao din ni tip USART (tng thch chun ni tip RS-232). Giao din ni tip Two Wire Serial (tng thch chun I2C) Master v Slaver. Giao din ni tip Serial Peripheral Interface (SPI)

... Mt s chip AVR thng dng: AT90S1200


1

AT90S2313 AT90S2323 and AT90S2343 AT90S2333 and AT90S4433 AT90S4414 and AT90S8515 AT90S4434 and AT90S8535 AT90C8534 ATtiny10, ATtiny11 and ATtiny12 ATtiny15 ATtiny22 ATtiny26 ATtiny28 ATmega8/8515/8535 ATmega16 ATmega161 ATmega162 ATmega163 ATmega169 ATmega32 ATmega323 ATmega103 ATmega64/128/2560/2561 AT86RF401. ....

Trong bi vit ny ti s dng chip ATmega8 lm v d, ti chn ATmega8 v y l loi chip thuc dng AVR mi nht, n c y cc tnh nng ca AVR nhng li nh gn (gi PDIP c 28 chn) v low cost nn cc bn c th mua t mnh to ng dng. Ti sao Assembly (ASM): bn c th khng cn bit v cu trc ca AVR vn c th lp trnh cho AVR bng cc phn mm h tr ngn ng cp cao nh BascomAVR (Basic) hay CodevisionAVR (C), tuy nhin khng phi l mc ch ca bi vit ny. hiu thu o v AVR bn phi lp trnh bng chnh ngn ng ca n, ASM. Nh vy lp trnh bng ASM gip bn hiu tng tn v AVR, v tt nhin lp trnh c bng ASM bn phi hiu v cu trc AVR.Mt l do khc bn m ti khuyn bn nn lp trnh bng ASM l cc trnh dch (compiler) ASM cho AVR l hon ton min ph, v ngun source code cho AVR vit bng ASM l rt ln. Tuy nhin mt khi bn thnh tho AVR v ASM bn c th s dng cc ngn
2

ng cp cao nh C vit ng dng v u im ca ngn ng cp cao l gip bn d dng thc hin cc php ton i s 16 hay 32 bit (vn l vn kh khn khi lp trnh bng ASM). II. Cng c. Trnh bin dch: c rt nhiu trnh bin dch bn c th s dng bin dch code ca bn thnh file intel hex np vo chip, mt s trnh dch quen thuc c th k n nh sau: AvrStudio: l trnh bin dch ASM chnh thc cung cp bi Atmel, y l trnh bin dch hon ton min ph v tt nhin l tt nht cho lp trnh AVR bng ASM. Phin bn hin ti l 4.18 SP1, bn c th download phn mm AvrStudio ti trang web chnh thc ca Atmel hoc bn 4.623 ti y. Wavrasm: cng c cung cp bi Atmel, n chnh l tin thn ca AvrStudio. Hin ti wavrasm khng cn c s dng nhiu v so vi AvrStudio trnh bin dch ny c nhiu hng ch, nu bn quan tm c th download ti y. WinAVR hay avr-gcc: l b trnh dch c pht trin bi gnu, ngn ng s dng l C v c th c dng tch hp vi AvrStudio (dng Avrstudio lm trnh bin tp editor). c bit b bin dch ny cng min ph v a s ngun source code C c vit bng b ny, v vy n rt l tng cho bn khi vit cc ng dng chuyn nghip. Vic lp trnh bng avrgcc ti s cp trong nhng phn sau. CodeVisionAvr: mt chng trnh bng ngn ng C rt hay cho AVR, h tr nhiu th vin lp trnh. Tuy nhin l chng trnh thng mi. Bn c th download bn demo (y chc nng nhng nhng gii hn dung lng b nh chng trnh 2KB) ti Website hpinfotech ICCAVR: lp trnh C cho avr, download bn demo. BascomAVR: lp trnh cho AVR bng basic, y l trnh bin dch kh hay v d s dng, h tr rt nhiu th vin. Tuy nhin rt kh debug li v khng thch hp cho vic tm hiu AVR. V vy ti khng bn khuyn khch bn s dng trnh dch ny. Bn c th download bn demo (4K limit). V cn rt nhiu trnh bin dch khc cho AVR m ti khng k ra y, nhn chung tt c cc trnh bin dch ny h tr C hoc Basic hoc thm ch Pascal. Vic chn 1 trnh bin dch ty thuc vo mc ch, vo mc ng dng, vo kinh nghim s dng v nhiu l do khc na. V d ti thng dng Avrstudio v avrgcc khi hc s dng AVR v khi vit
3

th vin. Nhng khi cn vit chng trnh ng dng ti thng chn avrgcc v CodeVisionAVR. Trong bi vit ny ti hng dn bn s dng AvrStudio vit chng trnh cho AVR bng ASM. Chng trnh np (Chip Programmer): a s cc trnh bin dch (AvrStudio, CodeVisionAVR, Bascom) u tch hp sn 1 chng trnh np chip h tr nhiu loi mch np nn bn khng qu lo lng. Trong trng hp khc, bn c th s dng cc chng trnh np nh Icprog hay Ponyprogl cc chng trnh np min ph cho AVR. Vic chn v s dng chng trnh np s c gii thiu trong cc bi sau. Mch np: tham kho bi vit gii thiu mch np AVR. Chng trnh m phng: avr simulator l trnh m phng v debbug c tch hp sn trong Avrstudio, avr simulator cho php bn quan st trng thi cc thanh ghi bn trong AVR nn rt ph hp bn debug chng trnh. Proteus l chng trnh th hai ti mun ni n, Proteus khng nhng m phng hot ng bn trong chip m cn m phng mch in t. Proteus m phng rt trc quan, n l 1 cng c hu ch khi cc bn cha c iu kin lm cc mch in t. III. V d u tin ca bn. Sau khi download AvrStudio, bn hy ci t phn mm trn my ca bn, qu trnh ci t rt n gin, bn hy theo cc mc nh v nhn next ci t. Trong bi u tin ny chng ta s vit th 1 chng trnh n gin cho AVR sau chy m phng bng Proteus. C th c mt s cu lnh cc bn s khng hiu, nhng ng lo lng qu, trong bi th 2 chng ta s hc v cu trc AVR cc bn s c gii thich r hn. thc hin v d ny, bn hy to mt Project bng AVRStudio, phn hng dn chi tit cho vic to Project trong AVRStudio bn hy tham kho bi hng dn AVRStudio.on code v d trong bi u tin ny c trnh by trong List1.

List 1. on code u tin ca bn. 1 .CSEG 2 .INCLUDE "M8DEF.INC" 3 .ORG 0x000 4 RJMP BATDAU 5 6 .ORG 0x020 7 BATDAU: 8 ; KHOI TAO CAC DIEU KIEN DAU 9 LDI R16, HIGH(RAMEND) 10 LDI R17, LOW(RAMEND) 11 OUT SPH, R16 12 OUT SPL, R17 13 LDI R16, 0xFF; 14 OUT DDRB, R16 15 16 ; CHUONG TRINH CHINH 17 MAIN: 18 LDI R16, 0B00000001 19 OUT PORTB, R16 20 RCALL DELAY 21 22 LDI R16, 0B00000010 23 OUT PORTB, R16 24 RCALL DELAY 25 26 LDI R16, 0B00000100 27 OUT PORTB, R16 28 RCALL DELAY 29 30 LDI R16, 0B00001000 31 OUT PORTB, R16 32 RCALL DELAY 33 34 LDI R16, 0B00010000 35 OUT PORTB, R16 36 RCALL DELAY 37
5

LDI R16, 0B00100000 38 OUT PORTB, R16 39 RCALL DELAY 40 41 LDI R16, 0B01000000 42 OUT PORTB, R16 43 RCALL DELAY 44 45 LDI R16, 0B10000000 46 OUT PORTB, R16 47 RCALL DELAY 48 49 RJMP MAIN 50 ; CHUONG TRING CON DELAY 65535 chu ky (khoang 51 65535us neu xung ;clock cho chip la 1M) 52 DELAY: 53 LDI R20, 0xFF 54 DELAY0: 55 LDI R21, 0xFF 56 DELAY1: 57 DEC R21 58 BRNE DELAY1 59 DEC R20 60 BRNE DELAY0 61 RET Trc khi tm hiu ngha on code, hy nhn 1 lt qua on code. Trc ht vic vit HOA hay vit thng l khng quan trng, bn c th vit on code vi bt c hnh thc no min ng c php, t kha l c. Trong on code: Bn thy 1 s t c mu BLUE (v d LDI, OUT, RJMP, RCALL, RET) l cc INSTRUCTiON, tc l cc cu lnh ca ngn ng ASM, bn c th c ti liu AVR INSTRUCTION tm hiu tt c cc INSTRUCTION. Cc INSTRUCTION sau s c trnh dch dch thnh cc m tng ng. Mt s t bt u bng bng du chm . l cc DIRECTIVE (v d .INCLUDE hay .ORG ) cng l nhng t kha mc nh ca ASM AVR, cc DIRECTIVE khng phi l m lnh m ch l cc ch dn v a ch b nh, khi ng b nh, nh ngha macrov khng c
6

trnh dch dch thnh m. Chi tit v DIRECTIVE c th tm thy trong cc ti liu v ASM AVR, di y ti tm tt cc DIRECTIVE v chc nng ca chng nh sau:

Thng thng 1 INSTRUCTION c theo sau bi 2 ton hng operand (tuy nhin c nhiu trng hp ch c 1 ton hng hoc khng c ton hng), khi ton hng th nht s l cc THANH GHI. ca AVR (nh cp, chng ta s kho st thanh ghi AVR trong cc bi sau), v d : LDI R16, 0xFF; trong ton hng R16 l tn 1 thanh ghi trong AVR, v 0xFF l 1 hng s dng hexadecimal c gi tr tng ng l 255 dng thp phn hay 11111111 nh phn. Cc t theo sau bi du : l cc nhn label (v d MAIN, DELAY), l t do chng ta t t, n thc cht l 1 v tr trong b nh chng trnh, c th s dng nhn nh 1 chng trnh con. Phn i sau du ; gi l gii thch comment, phn ny khng c bin dch, bn c th ghi comment bt c u trong chng trnh vi yu cu phi s dng du ; trc n. Gii thch on code:c th chia on code trn thnh 4 phn: phn u cha cc DIRECTIVE v lnh RJMP dng xc nh cc a ch b nh chng trnh, phn 2 l khi to mt s iu kin u cho Stack Pointer v PORT, phn 3 l chng trnh chnh, v phn 4 l chng trnh con ( ch

y ch l cch b tr ca ring ti, mt khi quen thuc, bn c th b tr chng trnh theo cch ring ca bn). Phn 1 v phn 2: .CSEG Ch th .CSEG: Code Segment bo cho trnh bin dch rng phn code theo sau l phn chng trnh thc thi, phn ny s c download vo b nh chng trnh ca chip. .INCLUDE "M8DEF.INC" Ch th .INCLUDE bo cho trnh bin dch bt u c 1 file nh km, trong trng hp trn l file M8DEF.INC, y l file cha cc khai bo cho chip Atmega8 nh thanh ghi, ngtcho vic truy xut trong chng trnh ca bn, y l dng bt buc, nu bn lp trnh cho chip khc bn hy i tn file nh km, v d m32def.inc cho chip ATmega32 bn c th tm thy cc file ny trong th mc C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes. .ORG 0x000 Ch th .ORG: Set Program Origin, set v tr trong b nh s c tc ng n, trong trng hp trn, .ORG 0x000 xc nh phn code theo ngay sau s nm a ch 000, v tr u tin, trong b nh chng trnh. V dng lnh trong v tr u tin l: RJMP BATDAU RJMP: Relative Jump l lnh nhy khng iu kin n 1 v tr trong b nh, trong trng hp trn l nhy n nhn BATDAU, v nhn BATDAU nm v tr 0x020 (s hexadecimal, 0x020 =32 decimal) v n c khai bo ngay sau DIRECTIVE .ORG 0x020. .ORG 0x020 BATDAU Nh th phn b nh chng trnh nm gia 0 v 0x020 khng c s dng trong on code ca chng ta, phn ny c s dng cho mc ch khc, l cc vect ngt ( khng c cp y). Tip theo:
8

; KHOI TAO CC DIEU KIEN DAU LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 Bn dng code trn khi to cho Stack Pointer, chng ta s tm hiu phn ny trong cc bi v Stack v chng trnh con. Li khuyn: cc bn nn khi ng 1 chng trnh theo cch trn v chng ta s hiu chng r hn sau ny ! LDI R16, 0xFF OUT DDRB, R16 Bn ch 2 dng trn v nhng g ti gii thch sau y, 2 dng ny c tc dng khi ng PORTB ca chip ATmega8 tc dng nh cc ng xut tn hiu (OUTPUT). Trc ht hy quan st chip ATmega8 trong hnh sau

Hnh 1: chip ATmega8. Bn c th thy chip ny gm 28 chn, trng c cc chn c ghi l PB0(chn 14), PB1(chn 15),,PB7(chn 10), l cc chn ca PORTB. PORT l khi nim ch cc ng xut nhp. Trong AVR, PORT c th giao tip theo 2 hng (bi directional), c th dng xut hoc nhn thng tin, mi PORT c 8 chn. Chip Atmega8 c 3 PORT c tn tng ng l PORTB, PORTC v PORTD (mt s chip

AVR khc c 4 hoc 6 PORT). PORT c coi l ca ng then cht ca vi iu khin. Trong AVR, mi PORT lin quan n 3 thanh ghi (8 bits) c tn tng ng l DDRx, PINx, v PORTx vi x l tn ca PORT, mi bit trong thanh ghi tng ng vi mi chn ca PORT. Trong trng hp ca Atmega8 x l B, C hoc D. V d chng ta quan tm n PORTB th 3 thanh ghi tng ng c tn l DDRB, PINB v PORTB, trong 2 thanh ghi PORTB v PINB c ni trc tip vi cc chn ca PORTB, DDRB l thanh ghi iu khin hng ( Input hoc Output). Vit gi tr 1 vo mt bit trong thanh ghi DDRB th chn tng ng ca PORTB s l chn xut (Output), ngc li gi tr 0 xc lp chn tng ng l ng nhp. Sau khi vit gi tr iu khin vo DDRB, vic truy xut PORTB c thc hin thng qua 2 thanh ghi PINB v PORTB. Quay li vi 2 dng code ca chng ta, dng u: LDI R16, 0xFF, vi LDI LoaD Immediately, dng lnh c ngha l load gi tr 0xFF vo thanh ghi R16, R16 l tn 1 thanh ghi trong b nh ca AVR, 0xFF l 1 hng s c dng thp lc phn, k hiu 0x ni ln iu , bn cng c th dng k hiu khc l $ ch 1 s thp lc phn, v d &FF, v 0xFF=255(thp phn)=0B11111111 (nh phn). Nh th sau dng u thanh ghi R16 c gi tr l 11111111 (nh phn). Dng th 2: OUT DDRB, R16 ngha l xut gi tr t thanh ghi R16 ra thanh ghi DDRB, tm li sau 2 dng trn gi tr DDRB nh sau: 1 1 1 1 1 1 1 1

C th bn s hi ti sao chng khng s dng 1 dng duy nht l LDI DDRB, 0xFF hay OUT DDRB, 0xFF, chng ta khng th v lnh LDI ch cho php thc hin trn cc thanh ghi R16,R31 v lnh OUT khng thc hin c vi cc hng s. V v DDRB=11111111 nn trong trng hp ny tt c cc chn ca PORTB sn sng cho vic xut d liu. Lc ny thanh ghi PINB khng c tc dng, thanh ghi PORTB s l thanh ghi xut, ghi gi tr vo thanh ghi ny s tc ng n cc chn ca PORTB.1

10

Phn 3: Chng trnh chnh MAIN: LDI R16, 0B00000001 OUT PORTB, R16 RCALL DELAY Bn ch cn ch 4 dng trn trong ton b phn chng trnh chnh, trc ht MAIN: ch l 1 nhn do chng ta t t tn, ging nh 1 ct mc trong chng trnh thi. Dng LDI R16, 0B00000001 th bn hiu, ch c 1 khc bit nh l ti s dng hng s dng nh phn cho bn d hiu hn. V dng OUT PORTB, R16 xut gi tr 0B00000001 c sn trong R16 ra thanh ghi PORTB, lc ny chn PB0 ca chip s ln 1 (5V) v cc chn cn li s mc 0 (0V). Dng th 3: RCALL DELAY l lnh gi chng trnh con DELAY, tm hon trc khi thc hin cc dng lnh tip theo: LDI R16, 0B00000010 OUT PORTB, R16 RCALL DELAY Ba dng lnh ny cng ging ba dng trn, nhng gi tr xut ra lc ny l 0B00000010, chn PB1 s ln 5V v cc chn khc xung mc 0V. V c nh th n on cui: LDI R16, 0B10000000 OUT PORTB, R16 RCALL DELAY RJMP MAIN Sau khi kt thc 3 dng trn chn PB7 s ln 5V, kt thc 1 vng xoay. Cui cng l quay v u chng trnh chnh bng dng RJMP MAIN By gi chc bn on c chng trnh ca chng ta thc hin vic g, l qut xoay vng cc chn ca PORTB, nu chng ta kt ni cc chn ca PORTB vi cc LED, chng ta s c 1 hiu ng qut LED xoay vng, chng ta thc hin iu ny bng phn mm Proteus. Phn 4: chng trinh con DELAY: on chng trnh ny khng lm g c ngoi vic tr hon 1 khong thi gian, tuy nhin bn cha th hiu n ngay c.

11

y ch l 1 v d n gin, ti c gng thc hin n theo cch d hiu nht cho bn, v th on code c v hi di dng, bn hy thc hin li on chng trnh chnh bng on code ca bn. Phn cui cng l bin dch on code thnh file intel hex vo chip, nhn phm F7 bin dch. Sau khi bin dch bn s c 1 file tn avr1.hex trong thc mc project, chng ta s dng file ny vo chip sau ny. IV. M phng bng Proteus. Chng ta hy th nghim on chng trnh ca chng ta bng Proteus. Nu bn thc hin ng kt qu s nh minh ha trong hnh 2 Hng dn c th cch v mch in v m phng bng phn mm Proteus bn hy xem bi "M phng Proteus".

12

Bi 2 - Cu Trc AVR
I. Gii thiu. Bi ny tip tc bi u tin trong lot bi gii thiu v AVR, nu sau bi "Lm quen AVR" bn phn no bit cch lp trnh cho AVR bng AVRStudio th trong bi ny, chng ta s tm hiu k hn v cu trc ca AVR. Sau bi ny, bn s:

Hiu c cu trc AVR, cu trc b nh v cch thc hot ng ca chip. Hiu v Stack v cch hot ng. Bit c mt s instruction c bn truy xut b nh. Hc cc instruction r nhnh v vng lp. Chng trnh con (Subroutine) v Macro. Ci tin v d trong bi 1. Vit 1 v d minh ha cch s dng b nh v vng lp.

II. T chc ca AVR. AVR c cu trc Harvard, trong ng truyn cho b nh d liu (data memory bus) v ng truyn cho b nh chng trnh (program memory bus) c tch ring. Data memory bus ch c 8 bit v c kt ni vi hu ht cc thit b ngoi vi, vi register file. Trong khi program memory bus c rng 16 bits v ch phc v cho instruction registers. Hnh 1 m t cu trc b nh ca AVR. B nh chng trnh (Program memory): L b nh Flash lp trnh c, trong cc chip AVR c (nh AT90S1200 hay AT90S2313) b nh chng trnh ch gm 1 phn l Application Flash Section nhng trong cc chip AVR mi chng ta c thm phn Boot Flash setion. Boot section s c kho st trong cc phn sau, trong bi ny khi ni v b nh chng trnh, chng ta t hiu l Application section. Thc cht, application section bao gm 2 phn: phn cha cc instruction (m lnh cho hot ng ca chip) v phn cha cc vector ngt (interrupt vectors). Cc vector ngt nm phn u ca application section (t a ch 0x0000) v di n bao nhiu ty thuc vo loi chip. Phn cha instruction nm lin sau , chng trnh vit cho chip phi c load vo phn ny. Xem li phn u ca v d trong bi 1:

13

.ORG 0x000 RJMP BATDAU .ORG 0x020 Trong v d ny, ngay sau khi set v tr 0x000 bng ch th (DIRECTIVE) .ORG 0x000 chng ta dng instruction RJMP nhy n v tr 0x020, nh th phn b nh chng trnh t 0x00 n 0x01F khng c s dng (v trong v d ny chng ta khng s dng cc vector ngt). Chng trnh chnh c bt u t a ch 0x020, con s 0x020 l do ngi lp trnh chn, tht ra cc vector ngt ca chip ATMEGA8 ch ko di n a ch 0x012, v vy chng trnh chnh c th c bt u t bt c v tr no sau . bit di cc vector ngt ca tng chip bn hy tham kho datasheet ca chip . V chc nng chnh ca b nh chng trnh l cha instruction, chng ta khng c nhiu c hi tc ng ln b nh ny khi lp trnh cho chip, v th i vi ngi lp trnh AVR, b nh ny khng qu quan trng. Tt c cc thanh ghi quan trng cn kho st nm trong b nh d liu ca chip.

Hnh 1. T chc b nh ca AVR. B nh d liu (data memory): y l phn cha cc thanh ghi quan trng nht ca chip, vic lp trnh cho chip phn ln l truy cp b nh ny. B nh d liu trn cc chip AVR c ln khc nhau ty theo mi chip, tuy nhin v c bn phn b nh ny c chia thnh 5 phn: Phn 1: l phn u tin trong b nh d liu, nh m t trong hnh 1, phn ny bao gm 32 thanh ghi c tn gi l register file (RF), hay General
14

Purpose Rgegister GPR, hoc n gin l cc Thanh ghi. Tt c cc thanh ghi ny u l cc thanh ghi 8 bits nh trong hnh 2. Hnh 2. Thanh ghi 8 bits. Tt c cc chip trong h AVR u bao gm 32 thanh ghi Register File c a ch tuyt i t 0x0000 n 0x001F. Mi thanh ghi c th cha gi tr dng t 0 n 255 hoc cc gi tr c du t -128 n 127 hoc m ASCII ca mt k t no Cc thanh ghi ny c t tn theo th t l R0 n R31. Chng c chia thnh 2 phn, phn 1 bao gm cc thanh ghi t R0 n R15 v phn 2 l cc thanh ghi R16 n R31. Cc thanh ghi ny c cc c im sau:

c truy cp trc tip trong cc instruction. Cc ton t, php ton thc hin trn cc thanh ghi ny ch cn 1 chu k xung clock. Register File c kt ni trc tip vi b x l trung tm CPU ca chip. Chng l ngun cha cc s hng trong cc php ton v cng l ch cha kt qu tr li ca php ton.

minh ha, hy xt v d thc hin php cng 2 thanh ghi bng instruction ADD nh sau: ADD R1, R2 Bn thy trong dng lnh trn, 2 thanh ghi R1 v R2 c s dng trc tip vi tn ca chng, dng lnh trn khi c dch sang opcode download vo chip s c dng: 0000110000010010 trong 00001=1 tc thanh ghi R1 v 00010 = 2 ch thanh ghi R2. Sau php cng, kt qu s c lu vo thanh ghi R1. Tt c cc instruction s dng RF lm ton hng u c th truy nhp tt c cc RF mt cch trc tip trong 1 chu k xung clock, ngoi tr SBCI, SUBI, CPI, ANDI v LDI, cc instruction ny ch c th truy nhp cc thanh ghi t R16 n R31. Thanh ghi R0 l thanh ghi duy nht c s dng trong instruction LPM (Load Program Memory). Cc thanh ghi R26, R27, R28, R29, R30 v R31 ngoi chc nng thng thng cn c s dng nh cc con tr (Pointer register) trong mt s instruction truy xut gin tip. Chng ta s kho st vn con tr sau ny. Hnh 3 m t cc chc nng ph ca cc thanh ghi.

15

Hnh 3. Register file. Tm li 32 RF ca AVR c xem l 1 phn ca CPU, v th chng c CPU s dng trc tip v nhanh chng, gi cc thanh ghi ny, chng ta khng cn gi a ch m ch cn gi trc tip tn ca chng. RF thng c s dng nh cc ton hng (operand) ca cc php ton trong lc lp trnh. Phn 2: l phn nm ngay sau register file, phn ny bao gm 64 thanh ghi c gi l 64 thanh ghi nhp/xut (64 I/O register) hay cn gi l vng nh I/O (I/O Memory). Vng nh I/O l ca ng giao tip gia CPU v thit b ngoi vi. Tt c cc thanh ghi iu khin, trng thica thit b ngoi vi u nm y. Xem li v d trong bi 1, trong ti c cp v vic iu khin cc PORT ca AVR, mi PORT lin quan n 3 thanh ghi DDRx, PORTx v PINx, tt c 3 thanh ghi ny u nm trong vng nh I/O. Xa hn, nu mun truy xut cc thit b ngoi vi khc nh Timer, chuyn i Analog/Digital, giao tip USARTu thc hin thng qua vic iu khin cc thanh ghi trong vng nh ny.

16

Vng nh I/O c th c truy cp nh SRAM hay nh cc thanh ghi I/O. Nu s dng instruction truy xut SRAM truy xut vng nh ny th a ch ca chng c tnh t 0x0020 n 0x005F. Nhng nu truy xut nh cc thanh ghi I/O th a ch ca chng c tnh t 0x0000 n 0x003F. Xt v d instruction OUT dng xut gi tr ra cc thanh ghi I/O, lnh ny s dng a ch kiu thanh ghi, cu trc ca lnh nh sau: OUT A, Rr, trong A l a ch ca thanh ghi trong vng nh I/O, Rr l thanh ghi RF, lnh OUT xut gi tr t thanh ghi Rr ra thanh ghi I/O c a ch l A. Gi s chng ta mun xut gi tr cha trong R6 ra thanh ghi iu khin hng ca PORTD, tc thanh ghi DDRD, a ch tnh theo vng I/O ca thanh ghi DDRD l 0x0011, nh th cu lnh ca chng ta s c dng: OUT 0x0011, R6. Tuy nhin trong 1 trng hp khc, nu mun truy xut DDRD theo dng SRAM, v d lnh STS hay LDS, th phi dng a ch tuyt i ca thanh ghi ny, tc gi tr 0x0031, khi lnh OUT trn c vit li l STS 0x0031, R6. thng nht cch s dng t ng, t by gi chng ta dng khi nim a ch I/O cho cc thanh ghi trong vng nh I/O ni n a ch khng tnh phn Register File, khi nim a ch b nh ca thanh ghi l ch a ch tuyt i ca chng trong SRAM. V d thanh ghi DDRD c a ch I/O l 0x0011 v a ch b nh ca n l 0x0031, a ch b nh = a ch I/O + 0x0020. V cc thanh ghi trong vng I/O khng c hiu theo tn gi nh cc Register file, khi lp trnh cho cc thanh ghi ny, ngi lp trnh cn nh a ch ca tng thanh ghi, y l vic tng i kh khn. Tuy nhin, trong hu ht cc phn mm lp trnh cho AVR, a ch ca tt c cc thanh ghi trong vng I/O u c nh ngha trc trong 1 file Definition, bn ch cn nh km file ny vo chng trnh ca bn l c th truy xut cc thanh ghi vi tn gi ca chng. Gi s trong v d bi 1, lp trnh cho chip Atmega8 bng AVRStudio, dng th 2 chng ta s dng INCLUDE "M8DEF.INC" load file nh ngha cho chip ATMega8, file M8DEF.INC. V vy, trong sau ny khi mun s dng thanh ghi DDRD bn ch cn gi tn ca chng, nh: OUT DDRD,R6. Phn 3: RAM tnh, ni (internal SRAM), l vng khng gian cho cha cc bin (tm thi hoc ton cc) trong lc thc thi chng trnh, vng ny tng t cc thanh RAM trong my tnh nhng c dung lng kh nh (khong vi KB, ty thuc vo loi chip). Phn 4: RAM ngoi (external SRAM), cc chip AVR cho php ngi s dng gn thm cc b nh ngoi cha bin, vng ny thc cht ch tn ti khi no ngi s dng gn thm b nh ngoi vo chip.

17

Phn 5: EEPROM (Electrically Ereasable Programmable ROM) l mt phn quan trng ca cc chip AVR mi, v l ROM nn b nh ny khng b xa ngay c khi khng cung cp ngun nui cho chip, rt thch hp cho cc ng dng lu tr d liu. Nh trong hnh 1, phn b nh EEPROM c tch ring v c a ch tnh t 0x0000. Cu hi by gi l AVR hot ng nh th no? Hnh 4 biu din cu trong bn trong ca 1 AVR. Bn thy rng 32 thanh ghi trong Register File c kt ni trc tip vi Arithmetic Logic Unit -ALU (ALU cng c xem l CPU ca AVR) bng 2 line, v th ALU c th truy xut trc tip cng lc 2 thanh ghi RF ch trong 1 chu k xung clock (vng c khoanh trn mu trong hnh 4).

Hnh 4. Cu trc bn trong AVR. Cc instruction c cha trong b nh chng trnh Flash memory di dng cc thanh ghi 16 bit. B nh chng trnh c truy cp trong mi chu k xung clock v 1 instruction cha trong program memory s c load vo trong instruction register, instruction register tc ng v la chn register file cng nh RAM cho ALU thc thi. Trong lc thc thi

18

chng trnh, a ch ca dng lnh ang thc thi c quyt nh bi mt b m chng trnh PC (Program counter). chnh l cch thc hot ng ca AVR. AVR c u im l hu ht cc instruction u c thc thi trong 1 chu k xung clock, v vy c th ngun clock ln nht cho AVR c th nh hn 1 s vi iu khin khc nh PIC nhng thi gian thc thi vn nhanh hn. III. Stack. Stack c hiu nh l 1 thp d liu, d liu c cha vo stack nh thp v d liu cng c ly ra t nh. Kiu truy cp d liu ca stack gi l LIFO (Last In First Out vo sau ra trc). Hnh 5 th hin cch truy cp d liu ca stack.

Hnh 5. Stack. Khi nim v cch thc hot ng ca stack c th c p dng cho AVR, bng cch khai bo mt vng nh trong SRAM l stack ta c th s dng vng nh ny nh mt stack thc th. khai bo mt vng SRAM lm stack chng ta cn xc lp a ch u ca stack bng cch xc lp con tr stack-SP (Stack Pointer). SP l 1 con tr 16 bit bao gm 2 thanh ghi 8 bit SPL v SPH (ch L l LOW ch thanh ghi mang gi tr byte thp ca SP, v H = HIGH), SPL v SPH nm trong vng nh I/O. Gi tr gn cho thanh ghi SP s l a ch khi ng ca stack. Quay li v d bi 1, phn khi to cc iu kin u. ; KHOI TAO CC DIEU KIEN DAU LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND)

19

OUT SPH, R16 OUT SPL, R17 Bn dng khai bo trn mc ch l gn gi tr ca RAMEND cho con tr SP, RAMEND (tc End of Ram) l bin cha a ch ln nht ca RAM ni trong AVR, bin ny c nh ngha trong file M8DEF.INC. Nh th sau 4 dng trn, con tr SP cha gi tr cui cng ca SRAM hay ni cch khc vng stack bt u t v tr cui cng ca b nh SRAM. Nhng ti sao l v tr cui cng m khng l 1 gi tr khc. C th gii thch nh sau: stack trong AVR hot ng t trn xung, sau khi d liu c y vo stack, SP s gim gi tr v th khi ng SP v tr cui cng ca SRAM s trnh c vic mt d liu do ghi . Bn c th khi ng stack vi 1 a ch khc, tuy nhin v l do an ton, nn khi ng stack RAMEND. Hai instruction dng cho truy cp stack l PUSH v POP, trong PUSH dng y d liu vo stack v POP dng ly d liu ra khi stack. D liu c y vo v ly ra khi stack ti v tr m con tr SP tr n. V d cho chip ATMega8, RAMEND=0x045F, sau khi khi ng, con tr SP tr n v tr 0x045F trong SRAM, nu ta vit cc cu lnh sau: LDI R1, PUSH LDI R1, PUSH LDI R1, PUSH R1 Khi ni dung ca stack s nh trong hnh 6. 1 R1 5 R1 8

Hnh 6. Ni dung stack trong v d. Sau mi ln PUSH d liu, SP s gim 1 n v v tr vo v tr tip theo. By gi nu ta dng POP ly d liu t stack, POP R2, th R2 s mang gi tr ca ngn nh 0x045D, tc R2=8. Trc khi instruction POP c

20

thc hin, con tr SP c tng ln 1 n v, sau d liu s c ly ra t v tr m SP tr n trong stack. Stack trong AVR khng phi l v y, ngha l chng ta ch c th PUSH d liu vo stack 1 su nht nh no y (ph thuc vo chip). S dng stack khng ng cch i khi s lm chng trnh thc thi sai hoc tn thi gian thc thi v ch. V th khng nn s dng stack ch lu cc bin thng thng. ng dng ph bin nht ca stack l s dng trong cc chng trnh con (Subroutine), khi chng ta cn nhy t mt v tr trong chng trnh chnh n 1 chng trnh con, sau khi thc hin chng trnh con li mun quay v v tr ban u trong chng trnh chnh th Stack l phng cch ti u dng cha b m chng trnh trong trng hp ny. Xem li v d trong bi 1, trong chng trnh chnh chng ta dng lnh RCALL DELAY nhy n on chng trnh con DELAY, RCALL l lnh nhy n 1 v tr trong b nh chng trnh, trc khi nhy, PC c cng thm 1 v PUSH mt cch t ng vo stack. Cui chng trnh con DELAY, chng ta dng instruction RET, instruction ny POP d liu t stack ra PC mt cch t ng, bng cch ny chng ta c th quay li v tr trc . Chnh v cc lnh RCALL v RET s dng stack mt cch t ng nn ta phi khi ng stack ngay t u, nu khng chng trnh s thc thi sai chc nng. Tm li cn khi ng stack u chng trnh v khng nn s dng stack mt cch ty thch nu cha tht cn thit. IV. Thanh ghi trng thi - SREG (STATUS REGISTRY). Nm trong vng nh I/O, thanh ghi SREG c a ch I/O l 0x003F v a ch b nh l 0x005F (thng y l v tr cui cng ca vng nh I/O) l mt trong s cc thanh ghi quan trng nht ca AVR, v th m ti dnh phn ny gii thiu v thanh ghi ny. Thanh ghi SREG cha 8 bit c (flag) ch trng thi ca b x l, tt c cc bit ny u b xa sau khi reset, cc bit ny cng c th c c v ghi bi chng trnh. Chc nng ca tng bit c m t nh sau:

Hnh 7. Thanh ghi trng thi.

Bit 0 C (Carry Flag: C nh): l bit nh trong cc php i s hoc logic, v d thanh ghi R1 cha gi tr 200, R2 cha 70, chng ta
21

thc hin php cng c nh: ADC R1, R2, sau php cng, kt qu s c lu li trong thanh ghi R1, trong khi kt qu thc l 270 m thanh ghi R1 li ch c kh nng cha ti a gi tr 255 (v c 8 bit) nn trong trng hp ny, gi tr lu li trong R1 thc cht ch l 14, ng thi c C c set ln 1 (v 270=100001110, trong 8 bit sau 00001110 =14 s c lu li trong R1). Bit 1 Z (Zero Flag: C 0): c ny c set nu kt qu php ton i s hay php Logic bng 0. Bit 2 N (Negative Flag: C m): c ny c set nu kt qu php ton i s hay php Logic l s m. Bit 3 V (Twos complement Overflow Flag: C trn ca b 2): hot ng ca c ny c v s kh hiu cho bn v n lin quan n kin thc s nh phn (phn b), chng ta s cp n khi no thy cn thit. Bit 4 S (Sign Bit: Bit du): Bit S l kt qu php XOR gia 1 c N v V, S=N xor V. Bit 5 H (Half Carry Flag: C nh na): c H l c nh trong 1 vi php ton i s v php Logic, c ny hiu qu i vi cc php ton vi s BCD. Bit 6 T (Bit Copy Storage): c s dng trong 2 Instruction BLD (Bit LoaD) v BST (Bit STorage). Ti s gii thch chc nng Bit T trong phn gii thiu v BLD v BST. Bit 7 I (Global Interrupt Enable) : Cho php ngt ton b): Bit ny phi c set ln 1 nu trong chng trnh c s dng ngt. Sau khi set bit ny, bn mun kch hot loi ngt no cn set cc bit ngt ring ca ngt . Hai instruction dng ring Set v Clear bit I l SEI v CLI.

Ch : tt c cc bit trong thanh ghi SREG u c th c xa thng qua cc instruction khng ton hng CLx v set bi SEx, trong x l tn ca Bit.V d CLT l xa Bit T v SEI l set bit I. Ti ch gii thch ngn gn chc nng ca cc bit trong thanh ghi SREG, c th chc nng v cch s dng ca tng bit chng ta s tm hiu trong cc trng hp c th sau ny, ngi c c th t tm hiu thm trong cc ti liu v INSTRUCTION cho AVR. Ti cung cp thm 1 bng tm tt s nh hng ca cc php ton i s, logic ln cc Bit trong thanh ghi SREG.

22

Hnh 8. nh hng ca cc php ton ln SREG. IV. Macro v chng trnh con. Macro l khi nim ch mt on code nh thc hin mt cng vic no , nu c 1 on code no m bn rt hay s dng khi lp trnh th bn nn dng macro trnh vic phi vit i vit li on code . Lp trnh ASM cho AVR cho php bn s dng Macro, to 1 Macro bn s dng DIRECTIVE. .MACRO delay4 NOP NOP NOP NOP .ENDMACRO on Macro trn c tn delay4 thc hin vic delay 4 chu k my bng 4 lnh NOP, nu trong chng trnh bn cn dng Macro ny th ch cn gi delay4 bt k dng no. [] ; code ca bn Delay4 [] ; code ca bn

23

Mi ln tn ca Macro c gi, trnh bin dch s tm n Macro v copy ton b ni dung Macro vo v tr bn gi. Nh vy thc cht con tr chng trnh khng nhy n Macro, Macro khng lm gim dung lng chong trnh m ch lm cho vic lp trnh nh nhng hn. y chnh l khc bit ln nht ca Macro v Subroutine (chng trnh con). Chng trnh con cng l 1 on code thc hin 1 chc nng c bit no . Tuy nhin khc vi Macro, mi khi gi chng trnh con, con tr chng trnh nhy n chng trnh con thc thi chng trnh con v sau quay v chng trnh chnh. Nh th chng trnh con ch c bin dch 1 ln v c th s dng nhiu ln, n lm gim dung lng chong trnh. y l u im v cng l im khc bit ln nht gia chng trnh con v Macro. Tuy nhin cn ch l vic nhy n chng trnh con v nhy v chng trnh chnh cn vi chu k my, c th lm chm chng trnh, y l nhc im ca chng trnh con so vi macro. Chng trnh con cho AVR lun c bt u bng 1 Label, cng l tn v a ch ca chng trnh con. Chng trnh con thng c kt thc vi cu lnh RET (Return). Chng ta bit v chng trnh con qua v d ca bi 1, trong DELAY l 1 chng trnh con. gi chng trnh con t 1 v tr no trong chng trnh, chng ta c th dng lnh CALL hoc RCALL (Relative CALL) (xem li v d bi 1 v cch s dng RCALL). Mi khi cc lnh ny c gi, b m chng trnh c t ng c PUSH vo stack v khi chng trnh con kt thc bng lnh RET, b m chng trnh c POP tr ra v quay v chng trnh chnh. Lnh CALL c th gi 1 chng trnh con bt k v tr no trong khi RCALL ch gi trong khong b nh 4KB, nhng RCALL cn t chu k xung clock hn khi thc thi. Hai instruction khc c th c dng gi chng trnh con l JMP (Jump) v RJMP (Relative Jump). Khc vi cc lnh call, cc lnh jump khng cho php quay li v khng t ng PUSH b m chng trnh vo Stack, s dng cc lnh ny gi chng trnh con bn cn mt s lnh jump khc cui chng trnh con. Tm li bn nn vit 1 chng trnh con ng chun v dng CALL hoc RCALL gi chng cc chng trnh ny, ch nhng trng hp c bit hoc bn hiu rt r v chng th c th dng cc lnh jump. V. V d minh ha. Nu bn c v hiu n thi im ny th bn c th hiu ht hot ng ca chng trnh v d trong bi 1, tht s v d rt n gin v d hiu. Tuy nhin, bn c th ti u ha v d theo hng lm gim
24

dung lng chng trnh v tt nhin, chng trnh s kh hiu hn cho ngi khc. Cc phn khi ng v tr b nh, stack v chng trnh con DELAY chng ta khng thay i, ch thay i phn chng trnh chnh, 1 trong nhng cch vit chng 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 0, NHAY VE MAIN, TIEP TUC QUET ;///////////////////////////////////////////////////////////////////////////////////////// C th khng cn gii thch bn cng c th hiu on code trn, y ch l 1 trong nhng cch c th, bn hy vit li theo cch ca ring bn vi yu cu l chng trnh phi thc hin ng chc nng v ngn gn. By gi chng ta s thc hin mt v d minh ha cho nhng g chng ta hc trong bi 2 ny. Ni dung ca v d th hin trong mch in hnh 9. Hot ng ca mch in t nh sau: 1 chip ATMega8 c s dng nh mt counter, c th dng m ln v m xung, 2 button trong mch in tc ng nh 2 kicker, nhn button 1 m ln v button m xung, gi tr m nm trong khong t 0 n 9. Gi tr m c hin th trn 1 LED 7 on loi anod chung (dng chung), chip 7447 c dng gii m t gi tr BCD xut ra bi ATMega8 sang tn hiu cho LED 7 on anod chung, chng ta cn s dng 7447 v tn hiu xut ra t chip ATMega8 l dng nh phn hoc BCD , tn hiu ny khng th hin th trc tip trn cc LED 7 on, chip 7447 c nhim v chuyn 1 d liu dng digit BCD sang m ph hp cho LED 7 on. thc hin v d, trc ht bn hy v mch in nh trong hnh 9 bng phn mm Proteus (xem cch v mch in bng Proteus), mch in ch c 5 loi linh kin l chip ATMega8 (t kha mega8), 1 LED 7 on anod chung vi tn y trong Proteus l 7SEG-COM-AN-GRN (t kha 7SEG), 1 chip 7447 (t kha 7447), 1 in tr 10 v 2 button (t kha button).

25

Hnh 9. V d cho bi 2. S dng AVRStudio to 1 project mi vi tn gi avr2 (xem li cch to Project mi trong AVRStudio). Vit li phn code bn di vo vo file avr2.asm List 1. V d cu trc AVR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 .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 OUT DDRD, R16 ;DDRD=0xFF, PORTD LA NGO XUAT CLR R25 ;XOA R25, R25 LA THANH GHI DUNG CHUA SO DEM SER R20 ; R20 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

26

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

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

Trong v ny ny, chng ta s dng 2 PORT ca chip ATMega8, PORTD dng xut d liu (s m) ra chip 7447 v sau hin th trn LED 7 on. PORTB dng nh ng nhp, tn hiu t cc button s c chip ATMega8 nhn thng qua 2 chn PB0 v PB1 ca PORTB. Hot ng ca cac PORT v vic xc lp 1 PORT nh cc ng xut chng ta kho st trong bi 1. y chng ta kho st thm v xc lp PORT nh 1 ng nhp, trc ht bn hy quan st mch in tng ng ca 1 chn trong cc PORT xut nhp ca AVR trong hnh 10.

27

Hnh 10. Cu trc chn trong PORT ca AVR. Trong mch in hnh 10, cc diode v t in ch c chc nng bo v chn PORT, nhng in tr Rpu (R Pull up) ng vai tr quan trng nh l in tr ko ln khi chn ca PORT lm nhim v nhn tn hiu (ng nhp). Tuy nhin trong AVR, in tr ko ln ny khng phi lun kch hot, chng ta bit rng mi PORT ca AVR c 3 thanh ghi: DDRx, PORTx v PINx, nu DDRx=0 th PORT x l ng nhp, lc ny thanh ghi PINx l thanh ghi cha d liu nhn v, c bit thanh ghi PORTx vn c s dng trong mode ny, l thanh ghi xc lp in tr ko ln, nh th nu DDRx=0 v PORTx=0xFF th cc chn PORTx l ng nhp v c ko ln bi 1 in tr trong chip, ngha l cc chn ca PORTx lun mc cao, mun kch thay i trng thi chn ny chng ta cn ni chn trc tip vi GND, y l l do ti sao cc button trong mch in ca chng ta c 1 u ni vi chn ca chip cn u kia c ni vi GND. y cng l ngha ca khi nim in tr ko ln (Pull up resistor) trong k thut in t. on code trong phn KHOI DONG CAC PORT ca v d ny xc lp PORTD l ng xut (DDRD=0xFF) , PORTB l ng nhp c s dng in tr ko ln (DDRB=0, PORTB=0xFF). Chng ta s gii thch hot ng ca on chng trnh chnh v cc on chng trnh con. Trc ht, trong chng trnh ny, chng ta s dng 3 thanh ghi chnh l R20, R21 v R25, trong R25 l thanh ghi cha s m, gi tr ca thanh ghi R25 s c xut ra PORTD ca chip, thanh ghi R21 cha trng thi ca thanh ghi PINB v cng l trng thi ca cc button, thanh ghi R20 kt hp vi thanh ghi R21 to thnh 1 b m cnh xung ca cc button. hiu thu o hot ng m (cng l hot ng chnh ca v d ny) chng ta xt trng thi chn PB0 nh trong hnh 11.

28

Hnh 11. Thay i trng thi cc chn I/O. Trong trng thi bnh thng (button khng c nhn), chn PB0 mc cao (do in tr ko ln), b m khng hot ng, gi tr m khng thay i, by gi nu nhn button, chn PB0 c ni trc tip vi GND, chn ny s b ko xung mc thp, bng cch kim tra trng thi chn PB0, nu PB0=0 ta tng gi tr m 1 n v. tng nh th c v hp l, tuy nhin nu p dng th chng trnh s hot ng khng ng chc nng, khi bn nhn 1 ln gi, tr m c th tng n c trm hoc khng kim sot c, hiu ng ny tng t khi bn nhn v gi 1 phm trn bn phm my tnh, l do l v chng ta s dng phng php kim tra mc m, thi gian qut ca chng trnh rt ngn so vi thi gian chng ta gi button. khc phc, chng ta dng phng php kim tra cnh xung, ch khi no pht hin chn PB0 thay i t 1 xung 0 th mi tng gi tr m 1 n v, kt qu l mi ln nhn button th gi tr m ch tng 1 (ngay c khi ta nhn v gi button), thanh ghi R20 c s dng lu trng thi trc ca PINB (cng l trng thi ca cc button). Trong chng trnh, ti s dng 2 istruction mi l SBRC v SBRS kim tra trng thi cc chn ca PORTB (button). SBRC Skip if Bit in Register is Clear, lnh ny s b qua 1 dng lnh ngay sau (ch b qua 1 dng duy nht) nu 1 bit trong thanh ghi mc 0, SBRC Skip if Bit in Register is Set- hot ng tng t SBRC nhng skip s xy ra nu bit trong thanh ghi mc 1. Da vo y chng ta gii thch 4 dng sau: 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 Dng 1 dng kim tra trng thi bit 0 trong R21 (ch R21 cha gi tr ca PINB), nu bit ny bng 1 (set), tc chn PB0=1 hay button khng c nhn, th nhy b qua dng lnh tip theo n dng 3. dng 3 chng trnh kim tra trng thi chn PB1 (button th 2). Quay li dng 1, nu chng trnh kim tra pht hin chn PB0=0 (button th nht c nhn) th

29

dng lnh th 2 c thc thi, kt qu l chng trnh nhy n chng trnh con TANG. TANG: SBRS R20,0 RET INC R25 RET Dng u tin ca chng trnh con TANG l kim tra trng thi trc ca chn PB0 (c lu bit 0 trong thanh ghi R20), nu trng thi ny bng 0, ngha l khng c s chuyn t 1 xung 0 chn PB0, dng 2 (lnh RET) s c thc thi quay v chng trnh chnh. Nhng nu PB0 trc bng 1, ngha l c s thay i t 1->0 chn ny, gi tr m s c tng thm 1 nh INC R25, sau quay v chng trnh chnh. Tm li mun tng gi tr m thm 1 n v cn tha mn 2 iu kin: chn PB0 hin ti =0 (button ang c nhn) v trng thi trc ca PB0 phi l 1 (trnh trng hp tng lin tc). Phng php ny c th p dng cho rt nhiu trng hp m dng m xung. Qu trnh gim gi tr m c hiu tng t, phn cn li ca v d ny bn c hy t gii thch theo nhng gi trn.

30

Bi 3 - Ngt ngoi
I. Ngt trn AVR. Interrupts, thng c gi l ngt, l mt tn hiu khn cp gi n b x l, yu cu b x l tm ngng tc khc cc hot ng hin ti nhy n mt ni khc thc hin mt nhim v khn cp no , nhim v ny gi l trnh phc v ngt isr (interrupt service routine ). Sau khi kt thc nhim v trong isr, b m chng trnh s c tr v gi tr trc b x l quay v thc hin tip cc nhim v cn dang d. Nh vy, ngt c mc u tin x l cao nht, ngt thng c dng x l cc s kin bt ng nhng khng tn qu nhiu thi gian. Cc tn hiu dn n ngt c th xut pht t cc thit b bn trong chip (ngt bo b m timer/counter trn, ngt bo qu trnh gi d liu bng RS232 kt thc) hay do cc tc nhn bn ngoi (ngt bo c 1 button c nhn, ngt bo c 1 gi d liu c nhn). Ngt l mt trong 2 k thut bt s kin c bn bao gm: hi vng (Polling) v ngt. Hy tng tng bn cn thit k mt mch iu khin hon chnh thc hin rt nhiu nhim v bao gm nhn thng tin t ngi dng qua cc button hay keypad (hoc keyboard), nhn tn hiu t cm bin, x l thng tin, xut tn hiu iu khin, hin th thng tin trng thi ln cc LCD(bn hon ton c th lm c vi AVR ), r rng trong cc nhim v, vic nhn thng tin ngi dng (start, stop, setup, change,) rt him xy ra (so vi cc nhim v khc) nhng li rt khn cp, c u tin hang u. Nu dng Polling ngha l bn cn vit 1 on chng trnh chuyn thm d trng thi ca cc button (ti tm gi l Input() ) v bn phi chn on chng trnh ny vo rt nhiu v tr trong chng trnh chnh trnh trng hp b st lnh t ngi dng, iu ny tht lng ph thi gian thc thi. Gii php cho vn ny l s dng ngt, bng cch kt ni cc button vi ng ngt ca chip v s dng chng trnh Input() lm isr ca ngt , bn khng cn phi chn Input() trong lc ang thc thi v v th khng tn thi gian cho n, Input() ch c gi khi ngi dng nhn cc button. l tng ca ngt. Hnh 1 minh ha cch t chc ngt thng thng trong cc chip AVR, s lng ngt trn mi dng chip l khc nhau, ng vi mi ngt s c vector ngt, vector ngt l cc thanh ghi c a ch c nh, c nh ngha trc nm trong phn u ca b nh chng trnh. V d vector ngt ngoi 0
31

(external interrupt 0) ca chip atmega8 c a ch l 0x009 (theo datasheet t Atmel). Trong lc chng trnh chnh ang thc thi, nu c mt s thay i dn n ngt xy ra chn INT0 (chn 4), b m chng trnh (Program Counter) nhy n a ch 0x009, gi s ngay ti a ch 0x009 chng ta c t 1 lnh RJMP n mt trnh phc v ngt (IRS1 chng hn), mt ln na b m chng trnh nhy n IRS1 thc thi trnh phc v ngt, kt thc ISR1, b m chng trnh li quay v v tr trc trong chng trnh chnh, qu trnh ngt kt thc. Khng mang tnh bt buc nhng ti khuyn bn nn t chc chng trnh ngt theo cc ny trnh nhng li lin quan n a ch chng trnh.

Hnh 1. Ngt. Bng 1 tm tt cc vector ngt c trn chip atmega8, cho cc chip khc bn hy tham kho datasheet bit thm.

32

Bng 1: cc vector ngt v Reset trn chip Atmega8.

II. Ngt ngoi (External Interrupt). Phn ny ti dnh gii thiu cc bn cch ci t v s dng ngt ngoi v y l loi ngt duy nht c lp vi cc thit b ngoi vi ca chip, cc ngt khc thng gn vi hot ng ca 1 thit b no nh Timer/Counter, giao tip ni tip USART, chuyn i ADCchng ta s kho st c th khi tm hiu v hot ng ca cc thit b ny. Ngt ngoi l cch rt hiu qu thc hin giao tip gia ngi dng v chip, trn chip atmega8 c 2 ngt ngoi c tn tng ng l INT0 v INT1 tng ng 2 chn s 4 (PD2) v s 5 (PD3). Nh ti cp trong

33

bi AVR2, khi lm vic vi cc thit b ngoi vi ca AVR, hu nh chng ta ch thao tc trn cc thanh ghi chc nng c bit - SFR (Special Function Registers) trn vng nh IO, mi thit b bao gm mt tp hp cc thanh ghi iu khin, trng thi, ngtkhc nhau, iu ny ng ngha chng ta phi nh tt c cc thanh ghi ca AVR. Lc ny datasheet pht huy tc dng, bn phi nhanh chng download file datasheet ca chip mnh ang s dng, c rt nhiu ni download nh ti http://www.atmel.com/ hay trn cc trang web chuyn cung cp IC datasheet free (http://www.alldatasheet.com/ l 1 v d). Quay v vi ngt ngoi, c 3 thanh ghi lin quan n ngt ngoi l MCUCR, GICR v GIFR. C th cc thanh ghi c trnh by bn di. Thanh ghi iu khin MCU MCUCR (MCU Control Register) l thanh ghi xc lp ch ngt cho ngt ngoi, gi s chng ta kt ni cc chn ngt nh hnh 2.

Hnh 2. Kt ni ngt ngoi cho atmega8. Gi s chng ta kt ni cc ngt ngoi trn AVR mega8 nh pha tri hnh 9, cc button dng to ra cc ngt, c 4 kh nng (tm gi l cc MODE) c th xy ra khi chng ta nhn v th cc button. Nu khng nhn, trng thi cc chn INT l HIGH do in tr ko ln, khi va nhn 1 button, s c chuyn trng thi t HIGH sang LOW, chng ta gi l cnh xung Falling Edge, khi button c nhn v gi, trng thi cc chn INT c xc nh l LOW v cui cng khi th cc button, trng thi chuyn t LOW sang HIGH, gi l cnh ln Rising Edge. Trong nhng trng hp c th, 1 trong 4 MODEs trn u hu ch, v d trong cc ng dng m xung (m encoder ca servo motor chng hn) th 2 MODE cnh phi c dng. Thanh ghi MCUCR cha cc bits cho php chng ta chn 1 trong 4 MODE trn cho cc ngt ngoi. Di y l cu trc thanh ghi MCUCR c trch ra t datasheet ca chip atmega8.

34

MCUCR l mt thanh ghi 8 bit nhng i vi hot ng ngt ngoi, chng ta ch quan tm n 4 bit thp ca thanh ghi ny (4 bit cao dng cho Power manager v Sleep Mode), 4 bit thp l cc bit Interrupt Sense Control (ISC), 2 bit ISC11, ISC10 dng cho INT1 v ISC01, ISC00 dng cho INT0. Hy nhn vo bng tm tt bn di bit chc nng ca cc bit trn, y l bng chn tr ca 2 bit ISC11, ISC10. Bng chn tr cho cc bit ISC01, ISC00 hon ton tng t. Bng 2: INT1 Sense Control

Tht d dng hiu chc nng ca cc bit Sense Control, v d bn mun set cho INT1 l ngt cnh xung (Falling Edge) trong khi INT0 l ngt cnh ln (Rising Edge), hy t dng lnh MCUCR =0x0B (0x0B = 00001011 nh phn) trong chng trnh ca bn. Thanh ghi iu khin ngt chung GICR (General Interrupt Control Register) (trn cc chip AVR c, nh cc chip AT90Sxxxx, thanh ghi ny c tn l thanh ghi mt n ngt thng thng GIMSK, bn tham kho thm datasheet ca cc chip ny nu cn s dng n). GICR cng l 1 thanh ghi 8 bit nhng ch c 2 bit cao (bit 6 v bit 7) l c s dng cho iu khin ngt, cu trc thanh ghi nh bn di (trch datasheet).

35

Bit 7 INT1 gi l bit cho php ngt 1(Interrupt Enable), set bit ny bng 1 ngha bn cho php ngt INT1 hot ng, tng t, bit INT0 iu khin ngt INT0. Thanh ghi c ngt chung GIFR (General Interrupt Flag Register) c 2 bit INTF1 v INTF0 l cc bit trng thi (hay bit c - Flag) ca 2 ngt INT1 v INT0, nu c 1 s kin ngt ph hp xy ra trn chn INT1, bit INTF1 c t ng set bng 1 (tng t cho trng hp ca INTF0), chng ta c th s dng cc bit ny nhn ra cc ngt, tuy nhin iu ny l khng cn thit nu chng ta cho php ngt t ng, v vy thanh ghi ny thng khng c quan tm khi lp trnh ngt ngoi. Cu trc thanh ghi GIFR c trnh by trong hnh ngay bn di.

Sau khi xc lp cc bit sn sng cho cc ngt ngoi, vic sau cng chng ta cn lm l set bit I, tc bit cho php ngt ton cc, trong thanh ghi trng thi chung ca chip (thanh ghi SREG, xem li bi AVR2). Mt ch khc l v cc chn PD2, PD3 l cc chn ngt nn bn phi set cc chn ny l Input (set thanh ghi DDRD). Qu trnh thit lp ngt ngoi c trnh by trong hnh 10.

Hnh 3. Thit lp ngt ngoi.


36

Ngt ngoi vi ASM: Di y ti trnh by cch vit chng trnh s dng ngt ngoi bng ngn ng ASM, i vi cc ngt khc bn ch cn thm cc DIRECTIVE nh v cc vector ngt tng ng v vit chng trnh phc v ngt tng ng. List 1. Ngt vi ASM.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 .CSEG .INCLUDE "M8DEF.INC" .ORG 0x000 ; nh v v tr u tin RJMP BATDAU .ORG 0x001; nh v vector ngt ngoi 0 - INT0 (xem bng vector) RJMP INT0_ISR ; Nhy n INT0_ISR nu c ngt INT0 xy ra .ORG 0x002 ; nh v vector ngt ngoi 1 INT1 (xem bng vector) RJMP INT1_ISR ; Nhy n INT1_ISR nu c ngt INT1 xy ra ;Tng t, nh v cc vector ngt khc y.. ;.. .ORG 0x020 ; nh v chng trnh chnh BATDAU: ; khi to Stack LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 ; set chn PD2 v PD3 nh cc chn input LDI R16, 0Bxxxx00xx ; x l trng thi do bn t chn, 0 hoc 1 OUT DDRD, R16 ; PD2 v PD3 l input LDI R16, 0Bxxxx11xx ; x l trng thi do bn t chn, 0 hoc 1 OUT PORTD, R16 ; mc in tr ko ln cho PD2, PD3 ; khi ng ngt LDI R16, $0B ; $0B=00001011, INT1: ngt cnh xung, INT0: ngt cnh ln OUT MCUCR, R16 ; xut gi tr iu khin ra thanh ghi MCUCR LDI R16, $C0 ;$C0=11000000: Enable INT1 v INT0 OUT GICR, R16 ;xut gi tr iu khin ra thanh ghi GICR SEI ;set bit cho php ngt ton cc ; Chng trnh chnh MAIN: ;cc cng vic m chng trnh chnh cn thc hin ;.

37

RJMP MAIN 39 40 41 42 43 44 45 46 47 48 ;v y l nh ngha trnh phc v ngt INT0_ISR INT0_ISR: ; cc cng vic cn thc hin khi c ngt ;. RETI ; phi dng lnh RETI quay v chng trnh chnh ;v y l nh ngha trnh phc v ngt INT1_ISR INT1_ISR: ; cc cng vic cn thc hin khi c ngt ;. RETI ; phi dng lnh RETI quay v chng trnh chnh

Bn thy cc cc ngt c nh v nm gia v tr 0x0000, khi mi khi ng, ti v tr 0x000 l lnh RJMP BATDAU, nh th cc lnh RJMP ti cc vector ngt v cc ISR u khng c thc hin, chng ch c thc hin mt cch t ng khi c ngt. Ngt ngoi vi C: Avr-libc h tr mt th vin hm cho ngt kh hon ho, s dng ngt trong chng trnh vit bng C (avr-gcc) bn ch cn include file interrupt.h nm trong th mc con avr l xong. file header interrupt.h cha nh ngha cc hm v phng thc phc v cho vit trnh phc v ngt, cc vector ngt khng c nh ngha trong file ny m trong file iom8.h (cho atmega8). Nu bn v tnh tm thy 1 chng trnh ngt no khng include file interrupt.h m include file signal.h th bn ng ngc nhin, l cch vit c trong avr-gcc, tht ra bn hon ton c th s dng cch vit c v cc phin bn mi ca avr-libc (i cng vi cc bn WinAVR mi) vn h tr cch vit ny nhng khng khuyn khch bn dng. Trong C cc trnh phc v ngt c tn l ISR (vector_name), trong cc phin bn c, trnh phc v ngt c tn SIGNAL(vector_name) nhng cng nh file header signal.h, trnh ny vn c h tr trong phin bn mi nhng khng c khuyn khch s dng. List 2. Ngt vi C.
1 2 3 4 5 #include <avr/interrupt.h> ISR (vector_name) { //user code here 38

6}

Trong vector_name l tn ca cc vector ngt nh ngha sn avr-libc, ISR l tn bt buc, bn khng c dng cc tn khc ty (nhng c th dng SIGNAL nh trnh by trn). c bit, bn c th t ISR trc hoc sau chng trnh chnh u khng nh hng v tht ra, c kh nhiu cng on c thc hin khi bn gi ISR (nhng bn khng thy v cng khng cn quan tm), ISR lun c trnh bin dch t ngoi vng vector ngt nh cch chng ta thc hin trong ASM, nh th mt chng trnh s dng nhiu loi ngt s phi c s lng trnh ISR tng ng nhng vi vector_name khc nhau, mi khi c ngt xy ra, ty thuc vo gi tr ca vector_name m 1 trong cc trnh ISR c thc thi. i vi cc vector_name, bit c vector_name cho mi loi ngt, bn cn tham kho ti liu avr-libc manual. Bng 10 tm tt cc vector_name ca mt s ngt thng dng trn atmega8, bn ch rng cc vector_name trong avrlibc c nh ngha rt khc nhau cho tng loi chip, bn nht thit phi s dng ti liu avr-libc manual bit chnh xc cc vector_name cho loi chip m bn ang dng. Bng 3: vector_name cho atmega8.
Vector name ADC_vect ANA_COMP_vect EE_RDY_vect INT0_vect INT1_vect SPI_STC_vect SPM_RDY_vect TIMER0_OVF_vect TIMER1_CAPT_vect Old vector name SIG_ADC SIG_COMPARATOR SIG_EEPROM_READY SIG_INTERRUPT0 SIG_INTERRUPT1 SIG_SPI SIG_SPM_READY SIG_OVERFLOW0 SIG_INPUT_CAPTURE1 Description ADC Conversion Complete Analog Comparator EEPROM Ready External Interrupt 0 External Interrupt Request 1 Serial Transfer Complete Store Program Memory Ready Timer/Counter0 Overflow Timer/Counter Capture Event Timer/Counter1 Compare Match A Timer/Counter1 Compare MatchB Timer/Counter1 Overflow Timer/Counter2 Compare Match Timer/Counter2 Overflow 39

TIMER1_COMPA_vect SIG_OUTPUT_COMPARE1A TIMER1_COMPB_vect SIG_OUTPUT_COMPARE1B TIMER1_OVF_vect TIMER2_COMP_vect TIMER2_OVF_vect SIG_OVERFLOW1 SIG_OUTPUT_COMPARE2 SIG_OVERFLOW2

TWI_vect USART3_UDRE_vect

SIG_2WIRE_SERIAL SIG_USART3_DATA

2-wire Serial Interface USART3 Data register Empty

III. V d ngt ngoi vi C. thc hin v d s dng ngt ngoi bng C, ti s vit li chng trnh v d ca bi "cu trc AVR" nhng bng ngn ng C v s dng ngt. Trong chng trnh v d ca bi AVR2, chng ta thc hin vic m ln v m xung dng 2 button, chng ta s vn thc hin trn tng ny nhng c cht thay i trong kt ni, trc ht bn v 1 mch in m phng trong Proteus nh hnh 4.

Hnh 4. Mch in m phng ngt. Kt ni button m ln vi ngt INT0, button m xung vi INT1, PORTB c chn lm PORT xut. Hy chy Programmer Notepad, to 1 Project mi tn AVR2-INT, type on code bn di vo 1 file new v lu vi tn main.c, add file ny vo Project ca bn, sau to mt Makefile cho Project.

40

List 3. v d ngt ngoi bng C.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include <avr/io.h> #include <avr/interrupt.h> #include <avr/delay.h> volatile int8_t val=0; //khai bo 1 bin val 8 bit, c du v gi tr khi to bng 0. int main(void){ DDRD=0x00; //khai bo PORTD l Input s dng 2 chn ngt. PORTD=0xFF; //s dng in tr ni ko ln. DDRB=0xFF; //PORTB l Output xut LED 7 on MCUCR|=(1<<ISC11)|(1<<ISC01); //c 2 ngt l ngt cnh xung GICR |=(1<<INT1)|(1<<INT0); //cho php 2 ngt hot ng sei(); //set bit I cho php ngt ton cc DDRC=0xFF; while (1){ PORTC++; _delay_loop_2(60000); } return 0; } //Trnh phc v ngt ca INT0 ISR(INT0_vect){ val++; //nu c ngt INT0 xy ra, tng val thm 1 if (val>9) val=0; //gii hn khng vt qu 9 PORTB=val; } //Trnh phc v ngt ca INT1 ISR(INT1_vect){ val--; //nu c ngt INT1 xy ra, gim val i 1 if (val<0) val=9; //gii hn khng nh hn 0 PORTB=val; } //PORTC l Output //vng lp v tn //qut PORTC

C l on code ny kh d hiu nu cc bn theo di t u bi hc, ti ch gii thch nhng nt c bn v mi. tng l chng ta s dng 1 bin tm 8 bit, c du lu gi tr m, tn bin val, mi khi c ngt trn
41

chn INT0, tng val 1 n v v ngc li khi c ngt trn INT1, gim val i 1, l ni dung ca 2 trnh phc v ngt. Trong chng trnh chnh, trc ht chng ta thc hin vic xc lp hot ng cho 2 ngt, sau a chng trnh vo 1 vng lp v tn while(1), PORTC c dng kim tra rng chng trnh trong vng lp v tn vn ang hot ng. C l phn kh hiu nht trong on code l cch m ti dng khai bo cho 2 thanh ghi iu khin ngt MCUCR v GICR. Nu xem li bng tm tt cc ton t ca C, ton t << c gi l ton t dch tri dng trn dng nh phn ca cc con s, nu bn thy x=5<<3 ngha l dch cc bit nh phn ca 5 sang tri 3 v tr v gn cho x, nh m t nh sau:

Bn thy ton b cc bit ca 5 dch sang tri 3 v tr v gi tr ca s mi thu c l x=40, ch 40=5x8=5x2^3 . Hy nhn cu lnh MCUCR|=(1<<ISC11)|(1<<ISC01), gi th bn hiu (1<<ISC11) ngha l dch s 1 sang tri ISC11 v tr, v (1<<ISC01) l dch s 1 sang tri ISC01 v tr, nhng ISC11 v ISC01 u ra v gi tr ca chng l bao nhiu? Bn ch , khi bn include file io.h th file iom8.h c chn vo, v trong file ny cha khai bo a ch cc thanh ghi ca chip atmega8, cc tn bit cng c khai bo sn trong file ny, nu bn m file iom8.h (thng nm trong th mc ~\WinAVR\avr\include\avr) bng 1 chng trnh text editor nh notepad, dng chc nng find bn s thy cc dng nh ngha nh sau:
/* MCUCR */ #define SE #define SM2 #define SM1 #define SM0 #define ISC11 #define ISC10 #define ISC01 #define ISC00 7 6 5 4 3 2 1 0

42

y l nh ngha v tr cc bit trong thanh ghi MCUCR, vy l r, ISC11=3, ISC01=1, do : (1<<ISC11) tng ng (1<<3) = 00001000 (Binary) v (1<<ISC01) = 00000010, bn hy tng tng rng bn mang s 1 n cc v tr ca ISC11 v ISC01 trong thanh ghi MCUCR. By gi n lt ton t OR bitwise |. (1<<ISC11) = 00001000 (1<<ISC01) = 00000010 -------------------------------------------------(1<<ISC11)|(1<<ISC01) = 00001010
Gn gi tr ny cho MCUCR, i chiu vi bng cc gi tr ca cc bit ISC (bng 9) bn s thy chng ta ang set cho 2 ngt l falling edge. iu cui cng ca cu lnh set MCUCR l cch rt gn cu lnh MCUCR| =(1<<ISC11)|(1<<ISC01) thc cht l MCUCR= MCUCR| ((1<<ISC11)| (1<<ISC01)), y l cch set mt s bit trong mt thanh ghi m khng mun lm nh hng n cc bit khc (nhng bn phi tht cn thn vi cch lm ny v c th s phn tc dng nu bn khng nm r), bn c th gn trc tip MCUCR=(1<<ISC11)|(1<<ISC01), hay nhanh hn MCUCR=0x0A (0x0A=00001010). Vy l do no khin ti bin 1 cu lnh gn n gin thnh mt bi ton kh hiu, cu tr li chnh l tnh tng qut, trong cc chip AVR khc nhau, v tr cc bit trong cc thanh ghi l rt khc nhau, cu lnh MCUCR=0x0A ng cho atmega8 nhng khng p dng c cho cc chip khc trong khi cu lnh MCUCR=(1<<ISC11)|(1<<ISC01) th hot ng tt, mt l do khc l cch vit gin tip ny gip ngi khc (hay chnh bn) khi c code c th d dng hiu c ngi vit Ti ngh bn qu hiu dng lnh tip theo, GICR |=(1<<INT1)| (1<<INT0). Ti dng gii thch on code y v cng dng bi AVR3, bn hy thc tp bng cch vit li on code trn bng ASM.

43

Bi 4 - Timer - Counter
I. Gii thiu. Trong bi 3 ti gii thiu khi qut phng php lp trnh bng ngn ng C cho AVR vi WinAVR v cch s dng ngt trong AVR. Bi 4 ny chng ta s kho st cc ch hot ng ca phng php iu khin cc b nh thi, m (Timer/Counter) trong AVR. Cng c phc v cho bi ny vn l b cng c WinAVR v phn mm m phng Proteus. Ti vn dng chip Atmega8 lm v d. Mt iu khng may mn l khng phi tt c cc b Timer/Counter trn tt c cc dng chip AVR l nh nhau, v th nhng g ti trnh by trong bi ny c th s khng ng vi cc dng AVR khc nh AT90STuy nhin ti cng s c gng ch ra mt s im khc bit c bn cc bn c th t mnh iu khin cc chip khc. Ni dung bi hc ny bao gm:

Nm bt c bn cc b Timer/Counter c trn AVR. S dng cc Timer/Counter nh cc b nh thi. S dng cc Timer/Counter nh cc b m. S dng cc Timer/Counter nh cc b to xung iu rng PWM. Vit mt v d iu khin ng c RC servo bng PWM.

II. Tng quan cc b Timer/Counter trn chip Atmega8. Timer/Counter l cc module c lp vi CPU. Chc nng chnh ca cc b Timer/Counter, nh tn gi ca chng, l nh th (to ra mt khong thi gian, m thi gian) v m s kin. Trn cc chip AVR, cc b Timer/Counter cn c thm chc nng to ra cc xung iu rng PWM (Pulse Width Modulation), mt s dng AVR, mt s Timer/Counter cn c dng nh cc b canh chnh thi gian (calibration) trong cc ng dng thi gian thc. Cc b Timer/Counter c chia theo rng thanh ghi cha gi tr nh thi hay gi tr m ca chng, c th trn chip Atmega8 c 2 b Timer 8 bit (Timer/Counter0 v Timer/Counter2) v 1 b 16 bit (Timer/Counter1). Ch hot ng v phng php iu khin ca tng Timer/Counter cng khng hon ton ging nhau, v d chip Atmega8: Timer/Counter0: l mt b nh thi, m n gin vi 8 bit. Gi l n gin v b ny ch c 1 ch hot ng (mode) so vi 5 ch ca b Timer/Counter1. Ch hoat ng ca Timer/Counter0 thc cht c th coi nh 2 ch nh (v cng l 2 chc nng c bn) l to ra mt khong
44

thi gian v m s kin. Ch l trn cc chip AVR dng mega sau ny nh Atmega16,32,64chc nng ca Timer/Counter0 c nng ln nh cc b Timer/Counter1 Timer/Counter1: l b nh thi, m a nng 16 bit. B Timer/Counter ny c 5 ch hot ng chnh. Ngoi cc chc nng thng thng, Timer/Counter1 cn c dng to ra xung iu rng PWM dng cho cc mc ch iu khin. C th to 2 tn hiu PWM c lp trn cc chn OC1A (chn 15) v OC1B (chn 16) bng Timer/Counter1. Cc b Timer/Counter kiu ny c tch hp thm kh nhiu trong cc chip AVR sau ny, v d Atmega128 c 2 b, Atmega2561 c 4 b Timer/Counter2: tuy l mt module 8 bit nh Timer/Counter0 nhng Timer/Counter2 c n 4 ch hot ng nh Timer/Counter1, ngoi ra n n cn c s dng nh mt module canh chnh thi gian cho cc ng dng thi gian thc (ch asynchronous). Trong phm vi bi 4 ny, ti ch yu hng dn cch s dng 4 ch hot ng ca cc Timer/Counter. Ch asynchronous ca Timer/Counter2 s c b qua v c th ch ny khng c s dng ph bin. Trc khi kho st hot ng ca cc Timer/Counter, chng ta thng nht cch gi tt tn gi ca cc Timer/Counter l T/C, v d T/C0 ch Timer/Counter0 II. S dng Timer/Counter. C mt s nh ngha quan trng m chng ta cn nm bt trc khi s dng cc T/C trong AVR:

BOTTOM: l gi tr thp nht m mt T/C c th t c, gi tr ny lun l 0. MAX: l gi tr ln nht m mt T/C c th t c, gi tr ny c quy nh bi bi gi tr ln nht m thanh ghi m ca T/C c th cha c. V d vi mt b T/C 8 bit th gi tr MAX lun l 0xFF (tc 255 trong h thp phn), vi b T/C 16 bit th MAX bng 0xFFFF (65535). Nh th MAX l gi tr khng i trong mi T/C. TOP: l gi tr m khi T/C t n n s thay i trng thi, gi tr ny khng nht thit l s ln nht 8 bit hay 16 bit nh MAX, gi tr ca TOP c th thanh i bng cch iu khin cc bit iu khin tng ng hoc c th nhp tr tip thng qua mt s thanh ghi. Chng ta s hiu r v gi tr TOP trong lc kho st T/C1.

45

1. Timer/Counter0: Thanh ghi: c 4 thanh ghi c thit k ring cho hot ng v iu khin T/C0, l:

TCNT0 (Timer/Counter Register): l 1 thanh ghi 8 bit cha gi tr vn hnh ca T/C0. Thanh ghi ny cho php bn c v ghi gi tr mt cch trc tip. TCCR0 (Timer/Counter Control Register): l thanh ghi iu khin hot ng ca T/C0. Tuy l thanh ghi 8 bit nhng thc cht ch c 3 bit c tc dng l CS00, CS01 v CS02.

Cc bit CS00, CS01 v CS02 gi l cc chip chn ngun xung nhp cho T/C0 (Clock Select). Chc nng cc bit ny c m t trong bng 1. Bng 1: chc nng cc bit CS0X

TIMSK (Timer/Counter Interrupt Mask Register): l thanh ghi mt n cho ngt ca tt c cc T/C trong Atmega8, trong ch c bit TOIE0 tc bit s 0 (bit u tin) trong thanh ghi ny l lin quan n T/C0, bit ny c tn l bit cho php ngt khi c trn T/C0. Trn (Overflow) l hin tng xy ra khi b gi tr trong thanh ghi TCNT0 t n MAX (255) v li m thm 1 ln na.

46

Khi bit TOIE0=1, v bit I trong thanh ghi trng thi c set (xem li bi 3 v iu khin ngt), nu mt trn xy ra s dn n ngt trn.

TIFR (Timer/Counter Interrupt Flag Register): l thanh ghi c nh cho tt c cc b T/C. Trong thanh ghi ny bit s 0, TOV0 l c ch th ngt trn ca T/C0. Khi c ngt trn xy ra, bit ny t ng c set ln 1. Thng thng trong iu khin cc T/C vai tr ca thanh ghi TIFR khng qu quan trng.

Hot ng: T/C0 hot ng rt n gin, hot ng ca T/C c kch bi mt tn hiu (signal), c mi ln xut hin tn hiu kch gi tr ca thanh ghi TCNT0 li tng thm 1 n v, thanh ghi ny tng cho n khi n t mc MAX l 255, tn hiu kch tip theo s lm thanh ghi TCNT0 tr v 0 (trn), lc ny bit c trn TOV0 s t ng c set bng 1. Vi cch thc hot ng nh th c v T/C0 v dng v c tng t 0 n 255 ri li quay v khng v qu trnh lp li. Tuy nhin, yu t to s khc bit chnh l tnh hiu kch v ngt trn, kt hp 2 yu t ny chng ta c th to ra 1 b nh thi gian hoc 1 b m s kin. Trc ht bn hy nhn li bng 1 v cc bit chn xung nhp cho T/C0. Xung nhp cho T/C0 chnh l tn hiu kch cho T/C0, xung nhp ny c th to bng ngun to dao ng ca chip (thch anh, dao ng ni trong chip). Bng cch t gi tr cho cc bit CS00, CS01 v CS02 ca thanh ghi iu khin TCCR0 chng ta s quyt nh bao lu th s kch T/C0 mt ln. V d mch ng dng ca bn c ngun dao ng clkI/O = 1MHz tc chu k 1 nhp l 1us ( 1 micro giy), bn t TCCR0=5 (SC02=1, CS01=0, CS00=1), cn c theo bng 1 tn hiu kch cho T/C0 s bng clkI/O/1024 ngha l sau 1024us th T/C0 mi c kch 1 ln, ni cch khc gi tr ca TCNT0 tng thm 1 sau 1024us (ch l tn s c chia cho 1024 th chu k s tng 1024 ln). Quan st 2 dng cui cng trong bng 1 bn s thy rng tn hiu kch cho T/C0 c th ly t bn ngoi (External clock source), y chnh l tng cho hot ng ca chc nng m s kin trn T/C0. Bng cch thay i trng thi chn T0 (chn 6 trn chip Atmega8) chng ta s lm tng gi tr thanh ghi TCNT0 hay ni cch khc T/C0 c th dng m s kin xy ra trn chn T0. Di y chng ta s xem xt c th cch iu khin T/C0 theo 1 ch nh thi gian v m. 1.1 B nh thi gian.
47

Chng ta c th to ra 1 b nh th ci t mt khong thi gian no . V d bn mun rng c sau chnh xc 1ms th chn PB0 thay i trng thi 1 ln (nhp nhy), bn li khng mun dng cc lnh delay nh trc nay vn dng v nhc im ca delay l CPU khng lm g c trong lc delay, v th trong nhiu trng hp cc lnh delay rt hn ch c s dng. By gi chng ta dng T/C0 lm vic ny, tng l chng ta cho b m T/C0 hot ng, khi n m 1ms th n s t kch hot ngt trn, trong trnh phc v ngt trn chng tat hay i trng thi chn PB0. Ti minh ha tng nh trong hnh 1.

Hnh 1. So snh 2 cch lm vic. (CPU nop: CPU khng lm g c) Mt vn ny sinh lc ny, nh ti trnh by trong phn trc, T/C0 ch m t 0 n 255 ri li quay v 0 (xy ra 1 ngt trn), nh th dng nh chng ta khng th ci t gi tr mong mun bt k cho T/C0? Cu tr li l chng ta c th bng cch gn trc mt gi tr cho thanh ghi TCNT0, khi y T/C0 s m t gi tr m chng ta gn trc v kt thc 255. Tuy nhin do khi trn xy ra, TCNT0 li c t ng tr v 0, do vic gn gi tr khi to cho TCNT0 phi c thc hin lin tc sau mi ln xy ra trn, v tr tt nht l t trong trnh phc v ngt trn. Vic cn li v cng l vic quan trng nht l vic tnh ton gi tr chia (prescaler) cho xung nhp ca T/C0 v vic xc nh gi tr khi u cn gn cho thanh ghi TCNT0 c c 1 khong thi gian nh th chnh xc nh mong mun. Trc ht chng ta s chn prescaler sao cho hp l nht (chn gi tr chia bng cch set 3 bit CS02,CS01,CS00). Gi s ngun xung clock nui chip ca chng ta l clkI/O=1MHz tc l 1 nhp mt 1us, nu chng ta prescaler=1, tc l tn s ca T/C0 (tm gi l fT/C0) cng bng clkI/O=1MHz, c 1us T/C0 c kch v TCNT0 s tng 1 n v. Khi gi tr ln nht m T/C0 c th t c l 256 x 1us=256us, gi tr ny nh
48

hn 1ms m ta mong mun. Nu chn prescaler=8 (xem bng 1) ngha l c sau 8 nhp (8us) th TCNT0 mi tng 1 n v, kh nng ln nht m T/C0 m c l 256 x 8us=2048us, ln hn 1ms, vy ta hon ton c th s dng prescaler=8 to ra mt khong nh th 1ms. Bc tip theo l xc nh gi tr khi u ca TCNT0 T/C0 m ng 1ms (1000us). ng vi prescaler=8 chng ta bit l c 8us th TCNT0 tng 1 n v, d dng tnh c b m cn m 1000/8=125 ln ht 1ms, do gi tr ban u ca TCNT0 phi l 256-125=131. Bn c th quan st hnh 2 hiu thu o hn.

Hnh 2. Qu trnh thc hin. Hy to 1 Project bng Programmer Notepad vi tn gi TIMER0 v vit on code cho Project ny nh trong list 1. List 1. nh th 1ms vi T/C0. 1 #include <avr/io.h> 2 #include <avr/interrupt.h> 3 #include <util/delay.h> 4 5 int main(void){ 6 DDRB=0xFF; //PORTB la output PORT 7 PORTB=0x00; 8 9 TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8 10 TCNT0=131; //gan gia tri khoi tao cho T/C0 11 TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0 12 sei(); //set bit I cho phep ngat toan cuc 13 14 while (1){ //vng lp v tn 15 //do nothing 16 } 17 return 0;
49

18 19 20 21 22 23 24

} //trinh phuc vu ngat tran T/C0 ISR (TIMER0_OVF_vect ){ PORTB ^=1; //doi trang thai Bit PB0 TCNT0=131; //gan gia tri khoi tao cho T/C0 }

on code rt n gin, bn ch cn ch n 3 dng khai bo cho T/C0 (dng 9, 10, 11). Vi dng 9: TCCR0=(1<<CS01) l 1 cch set bit CS01 trong thanh ghi iu khin TCCR0 ln 1, 2 bit CS02 v CS00 c gi tr 0 (bn xem li bi 3 v cch set cc bit c bit trong cc thanh ghi), tm li dng ny tng ng TCCR0=2, gi tr Prescaler c chn bng 8 (tham kho bng 1). Dng 10 chng ta gn gi tr khi to cho thanh ghi TCNT0. V dng 11 set bit TIOE0 ln 1 cho php ngt xy ra khi c trn T/C0. Trong trnh phc v ngt trn T/C0, chng ta s thc hin i trng thi chn PB0 bng ton t XOR (^), ch n ngha ca ton t XOR: nu XOR mt bit vi s 1 th bit ny s chuyn trng thi (t 0 sang 1 v ngc li). Cui cng v quan trng l chng ta cn gn li gi tr khi to cho T/C0. Bn c th v mt mch in m phng n gin dng 1 Oscilloscope nh trong hnh 3 kim tra hot ng ca on code.

Hnh 3. M phng nh th ca T/C0. 1.2 B m s kin.


50

Nh ti trnh by trong phn hot ng ca T/C0, chng ta c th dng T/C0 nh mt b m (counter) m cc s kin (s thay i trng thi) xy ra trn chn T0. Bng cch t gi tr cho thanh ghi TCCR0 = 6 (CS02=1, CS01=1, CS00=0) cho php m cnh xung trn chn T0, nu TCCR0 = 7 (CS02=1, CS01=1, CS00=1) th cnh ln trn chn T0 s c m. C s dng ngt hay khng ph thuc vo mc ch s dng. Kho st 1 v d n gin gn ging vi v d m trong bi AVR2 nhng s dng T/C0 v ch m 1 chiu tng. Kt ni mch in nh trong hnh 4, mi ln Button 1 c nhn, gi tr m tng thm 1. Button 2 dng reset gi tr m v 0. on code cho v d th 2 ny c trnh by trong List 2.

Hnh 4. m 1 chiu bng T/C0. List 2. m s kin vi T/C0


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <avr/io.h> #include <avr/interrupt.h> int main(void){ DDRB=0xFF; //PORTB la output PORT PORTB=0x00; DDRD=0x00; //khai bao PORTD la input de ket noi Button kich vao chan T0 PORTD=0xFF; //su dung dien tro keo len cho PORTD TCCR0=(1<<CS02)|(1<<CS01);// CS02=1, CS01=1, CS00=0: xung nhip tu chan T0, down TCNT0=0; while (1){ //vng lp v tn if (TCNT0==10) TCNT0=0; PORTB=TCNT0; //xuat gia tri dem ra led 7 doan if (bit_is_clear(PIND,7)) TCNT0=0; //Reset bo dem neu chan PD7=0 } return 0; }

51

Ni dung trong chng trnh chnh l khai bo cc hng giao tip cho cc PORT, PORTB l ouput xut kt qu m ra led 7 on, PORTD c khi bo input v cc button c ni vi PORT ny. T/C0 c khai bo s dng ngun kch ngoi t T0, dng cnh xung thng qua dng TCCR0=(1<<CS02)|(1<<CS01), bn cng c th khai bo tng ng l TCCR0=6 (tham kho bng 1). Gi tr ca b m s c xut ra PORTB kim tra. im ch trong on chng trnh ny l macro bit_is_clear, y l mt macro c nh ngha trong file sfr_defs.h dng kim tra 1 bit trong mt thanh ghi c bit c c xa (bng 0) hay khng, trong trng hp ca on code trn: if(bit_is_clear(PIND,7)) TCNT0=0; ngha l kim tra xem nu chn PD7 c ko xung 0 (button 2 c nhn) th s reset b m v 0. Nh vy vic s dng T/C0 l tng i n gin, bn ch cn khai bo cc gi tr thch hp cho thanh ghi iu khin TCCR0 bng cch tham kho bng 1, sau khi to gi tr cho TCNT0 (nu cn thit), khai bo c s dng ngt hay khng bng cch set hay khng set bit TOIE0 trong thanh ghi TIMSK l hon tt. 2. Timer/Counter1: Timer/Counter1 l b T/C 16 bits, a chc nng. y l b T/C rt l tng cho lp trnh o lng v iu khin v c phn gii cao (16 bits) v c kh nng to xung iu rng PWM (Pulse Width Modulation thng dng iu khin ng c). Thanh ghi: c kh nhiu thanh ghi lin quan n T/C1. V l T/C 16 bits trong khi rng b nh d liu ca AVR l 8 bit (xem li bi 2) nn i khi cn dng nhng cp thanh ghi 8 bits to thnh 1 thanh ghi 16 bit, 2 thanh ghi 8 bits s c tn kt thc bng cc k t L v H trong L l thanh ghi cha 8 bits thp (LOW) v H l thanh ghi cha 8 bits cao (High) ca gi tr 16 bits m chng to thnh.

TCNT1H v TCNT1L (Timer/Counter Register): l 2 thanh ghi 8 bit to thnh thanh ghi 16 bits (TCNT1) cha gi tr vn hnh ca T/C1. C 2 thanh ghi ny cho php bn c v ghi gi tr mt cch trc tip. 2 thanh ghi c kt hp nh sau:

52

TCCR1A v TCCR1B (Timer/Counter Control Register): l 2 thanh ghi iu khin hot ng ca T/C1. Tt c cc mode hot ng ca T/C1 u c xc nh thng qua cc bit trong 2 thanh ghi ny. Tuy nhin, y khng phi l 2 byte cao v thp ca mt thanh ghi m l 2 thanh ghi hon ton c lp. Cc bit trong 2 thanh ghi ny bao gm cc bit chn mode hay chn dng sng (Waveform Generating Mode WGM), cc bit quy nh dng ng ra (Compare Output Match COM), cc bit chn gi tr chia prescaler cho xung nhp (Clock Select CS)Cu trc ca 2 thanh ghi c trnh by nh bn di.

Nhn chung thuc ht cch phi hp cc bit trong 2 thanh ghi TCCR1A v TCCR1B l tng i phc tp v T/C1 c rt nhiu mode hot ng, chng ta s kho st chng trong phn cc ch hot ng ca T/C1 bn di. y, trong thanh ghi TCCR1B c 3 bit kh quen thuc l CS10, CS11 v CS12. y l cc bit chn xung nhp cho T/C1 nh truong T/C0. Bng 2 s tm tt cc ch xung nhp trong T/C1. Bng 2: chc nng cc bit CS12, CS11 v CS10.

OCR1A v OCR1B (Ouput Compare Register A v B): c mt s khi nim mi m chng ta cn bit khi lm vic vi T/C1, mt trong s l Ouput Compare (sorry, I dont wanna translate it to
53

Vietnamese). Trong lc T/C hot ng, gi tr thanh ghi TCNT1 tng, gi tr ny c lin tc so snh vi cc thanh ghi OCR1A v OCR1B (so snh c lp vi tng thanh ghi), vic so snh ny trn AVR gi l gi l Ouput Compare. Khi gi tr so snh bng nhau th 1 Match xy ra, khi mt ngt hoc 1 s thay i trn chn OC1A (hoc/v chn OC1B) xy ra (y l cch to PWM bi T/C1). Ti sao li c A v B? l v ngi thit k AVR mun m rng kh nng ng dng T/C1 cho bn. A v B i din cho 2 knh (channel) v B. Cng v iu ny m chng ta c th to 2 knh PWM bng T/C1. Tm li, c bn 2 thanh ghi ny cha cc gi tr so snh, chc nng v cc ch hot ng c th ca chng s c kho st trong cc phn sau.

ICR1 (InputCapture Register 1): khi nim mi th 2 ca T/C1 l Input Capture. Khi c 1 s kin trn chn ICP1 (chn 14 trn Atmega8), thanh ghi ICR1s capture gi tr ca thanh ghi m TCNT1. Mt ngt c th xy ra trong trng hp ny, v th Input Capture c th c dng cp nht gi tr TOP ca T/C1. TIMSK (Timer/Counter Interrupt Mask Register): cc b T/C trn AVR dng chung thanh ghi mt n ngt, v th TIMSK cng c dng quy nh ngt cho T/C1. C iu lc ny chng ta ch quan tm n cc bit t 2 n 5 ca TIMSK. C tt c 4 loi ngt trn T/C1 (nh li T/C0 ch c 1 loi ngt trn)

54

Bit 2 trong TIMSK l TOIE1, bit quy nh ngt trn cho thanh T/C1 (tng t trng hp ca T/C0). Bit 3, OCIE1B l bit cho php ngt khi c 1 Match xy ra trong vic so snh TCNT1 vi OCR1B. Bit 4, OCIE1A l bit cho php ngt khi c 1 Match xy ra trong vic so snh TCNT1 vi OCR1A. Bit 5, TICIE1 l bit cho php ngt trong trng hp Input Capture c dng. Cng vi vic set cc bit trn, bit I trong thanh ghi trng thi phi c set nu mun s dng ngt (xem li bi 3 v iu khin ngt).

TIFR (Timer/Counter Interrupt Flag Register): l thanh ghi c nh cho tt c cc b T/C. Cc bit t 2 n 5 trong thanh ghi ny l cc c trng thi ca T/C1.

Cc mode hot ng: c tt c 5 ch hot ng chnh trn T/C1. Cc ch hot ng c bn c quy nh bi 4 bit Waveform Generation Mode (WGM13, WGM12, WGM11 WGM10) v mt s bit ph khc. 4 bit Waveform Generation Mode li c b tr nm trong 2 thanh ghi TCCR1A v TCCR1B (WGM13 l bit 4, WGM12 l bit 3 trong TCCR1B trong khi WGM11 l bit 1 v WGM10 l bit 0 trong thanh ghi TCCR1A) v th cn phi hp 2 thanh ghi TCCR1 trong lc iu khin T/C1. Cc ch hot ng ca T/C1 c tm tt trong bng sau 3: Bng 3: cc bit WGM v cc ch hot ng ca T/C1.

55

2.1 Normal mode (Ch thng). y l ch hot ng n gin nht ca T/C1. Trong ch ny, thanh ghi m TCNT1 c tng gi tr t 0 (BOTTOM) n 65535 hay 0xFFFF (TOP) v quay v 0. Ch ny hon ton ging cch m Timer0 hot ng ch c khc l gi tr m cao nht l 65535 thay v 255 nh trong timer0. Nhn vo bng 3, set T/C1 Normal mode chng ta cn set 4 bit WGM v 0, v 0 l gi tr mc nh ca cc thanh ghi nn thc t chng ta khng cn tc ng n cc bit WGM. Duy nht mt vic quan trng cn lm l set cc bit Clock Select (CS12, SC11, CS10) trong thanh ghi TCCR1B (xem thm bng 2). Bn c th tham kho v d ca Timer0. on code trong list 3 l 1 v d to 1 khong thi gian 10ms bng T/C1, normal mode: List 3. nh th 10ms vi T/C1.
1 2 3 4 5 6 7 8 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main(void){ DDRB=0xFF; PORTB=0x00; //PORTB la output PORT

56

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

TCCR1B=(1<CS10);// CS12=0, CS11=0, CS10=1: chon Prescaler =1 // thanh ghi TCCR1B duoc dung thay vi TCCR0 cua Timer0 TCNT1=55535; //gan gia tri khoi tao cho T/C1 TIMSK=(1<<TOIE1);//cho phep ngat khi co tran o T/C1 sei(); //set bit I cho phep ngat toan cuc while (1){ //vng lp v tn //do nothing } return 0; } //trinh phuc vu ngat tran T/C1 ISR (TIMER1_OVF_vect ){ PORTB ^=1; //doi trang thai Bit PB0 TCNT1=55535; //gan gia tri khoi tao cho T/C1 }

2.2 Clear Timer on Compare Match (xa timer nu xy ra bng trong so snh)-CTC. Mt cch gi tt ca ch hot ng ny l CTC, mt ch hot ng mi trn T/C1. Nhn vo bng 3 bn s thy c 2 mode CTC (mode 4 v mode 12). Ti ly v d mode 4 gii thch hot ng ca CTC. Khi bn set cc bit Waveform Generation Mode tuong ng: WGM13=0, WGM12=1, WGM11=0, WGM10=0 th mode 4 c chn. Trong mode ny, thanh ghi OCR1A cha gi tr TOP (gi tr so snh do ngi dng t), thanh ghi m TCNT1 tng t 0, khi TCNT1 bng gi tr cha trong OCR1A th mt Compare Match xy ra. Khi , mt ngt c th xy ra nu chng ta cho php ngt Compare Match (set bit OCF1A trong thanh ghi TIMSK ln 1). Mode ny cng tng i n gin, mt ng dng c bn ca mode ny l n gin ha vic m cc s kin bn ngoi. V d bn kt ni 1 sensor m s ngi i vo 1 cn phng vi chn T1 (chn counter source ca T/C1), bn mun rng c sau khi m 5 ngi th s thng bo 1 ln. List 4 l on code m t v d ny: List 4. Phi hp CTC vi m s kin.
1 2 3 4 5 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile usigned char val=0; //khai bao 1 bien tam val va khoi tao =0 int main(void){

57

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

DDRB=0xFF; //PORTB la output PORT PORTB=0x00; TCCR1B=GM12)|(1<<CS12)|(1<<CS11);//xung nhip tu chan T1, canh xuong OCR1A=4; //gan gia tri can so sanh TIMSK=(1<OCIE1A);//cho phep ngat khi gia tri dem bang 4 sei(); //set bit I cho phep ngat toan cuc while (1){ //vng lp v tn //do nothing } return 0; } //trinh phuc vu ngat compare match ISR (TIMER1_COMPA_vect){ val++; if (val==10) val=0; //gioi han bien val tu 0 den 9 PORTB =val; //xuat gia tri ra PORTB }

Ti ch gii thch nhng im mi trong List 4. Th nht l attribute volatile dng trc khai bo bin val, bin val c khai bo l unsigned char (8 bit, khng du) dng cha gi tr tm thi xut ra PORTB khi c ngt xy ra. iu c bit l t kha volatile t trc n, volatile l mt thuc tnh (attribute) ca b bin dch gcc-avr, n ni vi trnh dch rng bin val s c dng trong chng trnh chnh v c trong cc trnh phc v ngt. Nu bn mun cp nhp gi tr 1 bin ton cc trong cc trnh phc v ngt m bin khng c ch nh thuc tnh volatile trc th qu trnh cp nht tht bi. Mt cch d hiu hn, bn xem trnh ISR trong v d trn, c mi ln c ngt Compare Match xy ra, bin val c tng thm 1 (dng 21) sau kim tra iu kin bng 10 hay khng v cui cng l gn cho PORTB. Nu trong khai bo ca val (dng 4) chng ta khng ch nh volatile th gi tr xut ra PORTB s lun l 1 khi c ngt. Ch l iu ny ch ng it nht l vi phin bn WinAVR thng 12 nm 2007, cc phin bn sau c th khng cn dng volatile (ti s cp nht sau). Dng 8 set cc bit iu khin: TCCR1B=(1<<WGM12)|(1<<CS12)| (1<<CS11); bn thy ti ch set bit WGM12 trong 4 bit WGM v ti mun chn mode CTC 4 (xem bng 3). Hai bit CS12 v CS11 c set bng 1 trong khi CS10 c gi 0 chn xung clock l t bn ngoi, chn T1 (xem bng 2). Trong dng 10, OCR1A=4; l gi tr cn so snh, chng ta
58

bit rng TCNT1 tng ln t 0, v th m 5 s kin th cn t gi tr so snh l 4 (0, 1, 2, 3, 4). Dng 11 set bit cho php ngt khi c Compare match xy ra (dng cho channel A). Mode 12 ca CTC (WGM13=1, WGM12=1, WGM11=0, WGM10=0) cng tng t mode 4 nhng ci khc l gi tr cn so snh c cha trong thanh ghi ICR1 (khng phi OCR1A hay OCR1B). Khi nu mun dng ngt th bn phi dng ngt Input capture. C th dng 8 trong list 4 i thnh: TCCR1B=(1<<WGM13)|( (1<<WGM12)|(1<<CS12)|(1<<CS11); dng 10: ICR1=4 v dng 20: ISR (TIMER1_CAPT_vect ){ Mt kh nng khc ca CTC l xut tn hiu xung vung trn chn OC1A (chn 15 trn Atmega8) bng cch set cc bit Compare Output Mode trong thanh ghi TCCR1A. Tuy nhin vic to cc tn hiu output trong mode CTC khng tht s th v. V vy chng ta s kho st cch to tn hiu output trong 1 ch chuyn nghip v th v hn, ch PWM. Trc khi bt u lm vic vi cc ch PWM ti ngh cn thit gii thiu th no l PWM v nhc li cc khi nim gi tr m ca Timer1 (hay bt k timer no khc) trn AVR. Trc ht, PWM hay Pulse Width Modulation c hiu theo ngha ting Vit l xung iu rng l khi nim ch tn hiu xung m thng th chu k (Time period) ca n c c nh, duty cycle (thi thi gian tn hiu mc HIGH) ca n c th c thay i. Bn xem 1 v d v PWM trong hnh 5.

Hnh 5. V d v tn hiu PWM. To ra PWM tc l to ra nhng tn hiu xung m ta c th iu khin duty cycle (v c tn s ~ Time period nu cn thit). Timer 1 trsn Atmega8 l 1 module l tng to ra cc tn hiu dng ny. Nhng PWM dng lm g v cch m n c s dng nh th no? Ti ly mt v d nh trong hnh 6: mt ng c DC v mt switch button.

59

Hnh 6. Motor v switch. Nu nhn button th ng c hot ng, th button th ng c dng. Tuy nhin do tc nhn v th ca con ngi c hn, bn s thy ng c hot ng hi sng (ripple). iu g xy ra nu bn nhn v th button vi vn tc 5000 ln/giy. Cu tr li l tay bn s b gy v button s b hng (^^). 5000 ln/s l iu khng tng, tuy nhin nu bn lm c nh th th tng thi gian cho 1 ln nhn+th l 1:5000=0.0002s = 200us. C s khc bit no khng gia trng hp thi gian nhn = 150us, thi gian th 50us v trng hp thi gian nhn l 50us cn thi gian th l 150us. Bn s d dng tm cu tr li, trong trng hp 1 ng c s quay vi vn tc nhanh hn trng hp 2. l tng c bn s dng PWM iu khin vn tc ng c (v iu khin nhiu th khc na). bin ci khng tng trn (5000 ln/s) thnh hin thc, chng ta s thay th ci button c kh kia bng 1 cng tc in t (electronics switch). Thng th cc chip MOSFET c dng lm cc kha in t. MOSFET thng c 3 chn G (gate), D (drain) v S (source). V d 1 MOSFET knh N trng thi thng thng 2 chn D v S ko c dng in chy qua, nu in p chn G ln hn chn S khong 3V tr ln th dng in c th chy t D sang S. hy xem cch m t tng ng 1 MOSFET vi 1 button trong hnh 7.

60

Hnh 7. MOSFET v button. Vic kch cc MOSFET c th thc hin bng cc tn hiu PWM. V th tng iu khin ng c trong hnh 6 c th c thc hin li thng qua PWM nh trong hnh 8.

Hnh 8. M hnh iu khin tc ng c bng PWM n gin. Nh vy l xong phn gii thiu v PWM, by gi chng ta sang cc khi nim s m trong Timer. Hnh 9 minh ha cch b tr cc s m trong Timer1 trn h trc m.

Hnh 9: cc mc gi tr ca T/C1. BOTTOM lun c c nh l 0 (gi tr nh nht), MAX lun l 0xFFFF (65535). TOP l gi tr nh do ngi dng nh ngha, gi tr ca TOP c th c c nh l 0xFF (255), 0x1FF (511), 0x3FF 91023) hoc nh ngha bi cc thanh ghi ICR1 hoc OCR1A. thc cht i vi ng dng
61

PWM th TOP chnh l Time period ca PWM. Do mc ch s dng m c th chn TOP l cc gi tr c nh hay cc thanh ghi, ring vi ti, cho mc ch to tn hiu PWM ti chn TOP nh ngha bi thanh ghi ICR1. Ouput Compare l gi tr so snh ca b Timer. Trong ch PWM th Output Compare quy nh Duty cycle. Vi T/C1, Output Comapre l gi tr trong cc thanh ghi OCR1A v OCR1B. Do c 2 thanh ghi c lp A v B, tng ng chng ta c th to ra 2 tn hiu PWM trn 2 chn OC1A v OC1B bng T/C1. n lc chng ta tm hiu cch to PWM trn AVR. 2.3 Fast PWM (PWM tn s cao). Trong ch Fast PWM, 1 chu k c tnh trong 1 ln m t BOTTOM ln TOP (single-slope), v th m ch ny gi l Fast PWM (PWM nhanh). C tt c 5 mode trong Fast PWM tng ng vi 5 cch chn gi tr TOP khc nhau (tham kho bng 3). Vic xc lp ch hot ng cho Fast PWM thc hin thng qua 4 bit WGM v cc bit chn dng xung ng ra, Compare Output Mode trong thanh ghi TCCR1A, nhn li 2 thanh ghi TCCR1A v TCCR1B.

Ch cc bit COM1A1, COM1A0 v COM1B1, COM1B0 l cc bit chn dng tn hiu ra ca PWM (Compare Output Mode bits). COM1A1, COM1A0 dng cho knh A v COM1B1, COM1B0 dng cho knh B. Hy i chiu bng 4. Bng 4: m t cc bit COM trong ch fast PWM.

Ti s gii thch hot ng ca Fast PWM knh A thng qua 1 trng hp c th, mode 14 (WGM13=1, WGM12=1, WGM11=1, WGM10=0). Trong mode 14, gi tr TOP (cng l chu k ca PWM) c cha trong thanh ghi ICR1, khi hot ng thanh ghi TCNT1 tng gi tr t 0, gi s cc bit ph COM1A=1, COM1A0=0, lc ny trng thi ca chn OC1A (chn
62

15) l HIGH (5V), khi TCNT1 tng n bng gi tr ca thanh ghi OCR1A th chn OC1A c xa v mc LOW (0V), thanh ghi m TCNT1 vn tip tc tng n khi no n bng gi tr TOP cha trong thanh ghi ICR1 th TCNT1 t ng reset v 0 v chn OC1A tr v trng thi HIGH, ci ny gi l Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at TOP m bn thy trong hng 4 bng 4. Hnh 10 m t cch to xung PWM trn chn OC1A mode 14.

Hnh 10: Fast PMW mode 14. R rng chng ta c th iu khin c time period v duty cycle ca PWM bng 2 thanh ghi ICR1 v OCR1A. Thng thng gi tr ca ICR1 c tnh ton v gn c nh, gi tr ca OCR1A c thay i thc hin mc ch iu khin (nh thay i vn tc ng c). Ch l nu chng ta set cc bit ph ngc li: COM1A=0, COM1A0=1, th tn hiu PWM trn chn OC1A s c phn LOW t 0 n OCR1A v HIGH t OCR1A n ICR1, y gi l set OC1A/OC1B on Compare Match, clear OC1A/OC1B at TOP (ngc vi tn hiu trn hnh 10). Hot ng ca fast PWM knh B hon ton tng t, trong thanh ghi ICR1 cng cha TOP ca PWM knh B v thanh ghi ICR1B cha duty cycle. Nh vy 2 knh A v B c cng tn s hay Time period v duty cycle c iu khin c lp. Chn xut tn hiu PWM ca knh B l chn OC1B (chn 16 trn Atmega8). Cc mode 5, 6 v 7 ca Fast PWM hot ng hon ton tng t mode 14. im khc nhau c bn l gi tr TOP(Time period). Trong cc mode ny gi tr TOP khng do thanh thi ICR1 nh ngha m l cc hng s khng i. Vi mode 5, tc mode 8 bits, (WGM13=0, WGM12=1, WGM11=0, WGM10=1) gi tr TOP l 1 hng s, TOP = 255 (s 8 bits ln nht). Vi mode 6, tc mode 9 bits, (WGM13=0, WGM12=1, WGM11=1, WGM10=0) gi tr TOP l 1 hng s, TOP = 511 (s 9 bits ln nht). V vi mode 7, tc mode 10 bits, (WGM13=0, WGM12=1, WGM11=1, WGM10=1) TOP =1023 (s 10 bits ln nht). Mode 15 cng l Fast PWM trong TOP do OCR1A quy nh, v th m tn hiu ra knh A hu nh khng phi l 1 xung, n ch thay i trng thi trong 1 clock. Theo ti, s dng Fast PWM bn nn dng mode 14 c gii thch trn. Cc mode 5, 6, 7 cng c th dng nhng khng nn dng mode 15.
63

Chng ta tin hnh vit 1 v d minh ha dng 2 knh ch fast PWM iu khin 2 ng c RC servo (gi tt l Servo). Mch in minh ha nh trong hnh 11.

Hnh 11: iu khin 2 RC servo bng PWM. Hai button c ni vi 2 ng ngt ngoi INT0 v INT1 iu khin gc xoay ca 2 Servo. Tn ca Servo trong phn mm Proteus l MOTORPWMSERVO. Trc khi vit code iu khin cc Servo, bn cn bit cch iu khin chng, ti gii thiu ngn gn nh sau: RC servo l mt t hp gm 1 ng c DC cng sut nh, hp gim tc v b iu khin gc quay. C 2 loi chnh l Servo thng v digital Servo, trong v d ny ti gii thiu Servo thng (ph bin). Servo thng c 3 dy, dy mu en l dy GND, dy l dy ngun (thng l 5V) v 1 dy trng hoc vng v dy iu khin (c mt s loi Servo c mu dy khc, bn cn tham kho datasheet ca chng). V cc Servo c sn mch iu khin gc quay bn trong nn chng ta khng cn bt c gii thut g m ch cn cp tn hiu PWM cho dy iu khin l Servo c th xoay n 1 v tr no (ch l Servo thng ch xoay na vng, iu khin servo l iu khin gc xoay ch khng phi iu khin cn tc xoay). Hnh 12 l hnh nh servo v cch iu khin servo.

64

Hnh 12. Servo v cch iu khin. Bn xem hnh 12b, iu khin servo bn cn cp cho dy iu khin mt tn hiu PWM c Time Period khong 20ms, duty cycle ca PWM s quyt nh gc xoay ca servo. Vi Duty cycle l 1ms, servo xoay v v tr 0o, khi duty cycle =2ms, gc xoay s l 180o, t bn c th tnh c duty cycle cn thit khi bn mun servo xoay n 1 v tr bt k gia 0o v 180o. Sau khi hiu cch iu khin servo, chng ta c th d dng vit code iu khin chng, ch cn to cc xung PWM bng T/C1. on code cho v d ny c trnh by trong list 5. List 5. iu khin Servo bng PWM.
1 #include <avr/io.h> 2 #include <avr/interrupt.h> 3 4 int main(void){ 5 DDRB=0xFF; //PORTB la output PORT 6 PORTB=0x00; 7 8 MCUCR|=(1<<ISC11)|(1<<ISC01); //ngat canh xuong 9 GICR |=((1<<INT1)|(1<<INT0); //cho php 2 ngat hoat dong 10 11 TCCR1A=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM11); 12 TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10); 13 OCR1A=1000; //Duty cycle servo1=1000us=1ms (0 degree) 14 OCR1B=1500; //Duty cycle servo2=1500us=1.5ms (90 degree) 15 ICR1=20000; //Time period = 20000us=20ms 16 17 sei(); //set bit I cho phep ngat toan cuc 18 while (1){ //vng lp v tn 19 //do nothing 20 }

65

21 22 23 24 25 26 27 28 29 30 31 32

return 0; } //trinh phuc vu ngat ngoai ISR (INT0_vect ){ if (OCR1A==1000) OCR1A=1500; //thay doi goc xoay servo1 den 90 do else OCR1A = 1000; // thay doi goc xoay servo1 den 0 do } ISR (INT1_vect ){ if (OCR1B==1000) OCR1B=1500; //thay doi goc xoay servo1 den 90 do else OCR1B = 1000; // thay doi goc xoay servo1 den 0 do }

Vi v d ny ti ch cn gii thch cc dng t 11 n 15 lin quan n vic xc lp ch hot ng Fast PWM mode 14 inverse, phn cn li bn c t i chiu vi cc bi trc. Dng 11 v 12 thc hin set cc bit iu khin Timer1, trc ht l cc bit COM. Bn thy ti ch set 2 bit COM1A1 v COM1B1: (1<<COM1A1)|(1<<COM1B1). Hai bit COM1A0 v COM1B0 khng set tc mc nh bng 0. i chiu vi bng 4 bn thy chng ta s dng Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at TOP cho tt c 2 knh A v B. Chng ta set 3 bit WGM13, WGM12 (thanh ghi TCCR1B, dng 12) v WGM11 (thanh ghi TCCR1A, dng 11) nh th thu c t hp (WGM13=1, WGM12=1, WGM11=1, WGM10=0) tc l mode 14 c chn (bng 3). Cn li chng ta set bit CS10 khai bo rng ngun xung clock cho Timer1 bng clock cho vi iu khin (prescaler=1) tc l 1us trong tng hp f=1Mhz. (nu bn dng cc trnh bin dch khc khng h tr nh ngha tn cc bit th 2 dng 11 v 12 tng ng: TCCR1A=0xA2; TCCR1B=0x19). Dng 15 chng ta khai nhp gi tr cho ICR1 cng l Time period cho PWM, ICR1=20000 chng ta thu c Time period =20000 us = 20ms tha yu cu ca servo. Hai dng 13 v 14 khai bo gi tr ban u ca cc duty cycle ca 2 knh PWM, cc gi tr ny nh v tr gc xoay ca cc servo. Trong 2 trnh phc v ngt, cc gi tr ny c thay i khi cc button c nhn. 2.3 Phase correct PWM (PWM vi pha chnh xc). Phase correct PWM cung cp mt ch to xung PWM c phn gii cao (high resolution) nn c gi l Phase correct PWM. Tng t Fast PWM, cng c 5 mode hot ng thuc Phase correct PWM l cc mode 1, 2, 3, 10 v 11 (xem bng 3). Nm mode ny tng ng cc mode 5,
66

6, 7, 14 v 15 ca fast PWM. V cch iu khin, Phase correct hu nh ging fast PWM, ngha l nu bn bit cch s dng cc mode ca fast PWM th bn s hon ton iu khin c Phase correct PWM. Khc nhau c bn ca 2 ch ny l trong cch hot ng, nu Fast PWM c chu k hot ng trong 1 single-slope (mt sn) th Phase correct PWM li dualslope (hai sn). Ly v d mode 10 ca Phase correct PWM tng ng vi mode 14 ca Fast PWM, trong mode ny thanh ghi ICR1 cha TOP v OCR1A (hoc OCR1B i vi knh B) cha gi tr so snh. Khi hot ng, thanh ghi TCNT1 tng t 0, khi TCNT1 bng vi OCR1A th chn OC1A c xa xung mc LOW (ti ang ni trng hp COM1A1=1, COM1A0=0), TCNT1 tip tc tng n TOP, khi TCNT1=TOP th TCNT1 KHNG c t ng reset v 0 nh trng hp Fast PWM m TCNT1 bt u m ngc, tc gim tng gi tr t TOP v 0. Trong lc TCNT1 gim, n 1 lc n s bng gi tr ca OCR1A ln th 2, v ln ny, chn OC1A c set ln mc HIGH, TCNT1 tip tc gim n 0 th 1 chu k hon tt. R rng 1 chu k l qu trnh m trong 2 sn nn ta gi Phase correct PWM l dual-slope. Cng v tnh cht dual-slope m tn hiu PWM trong ch ny c tnh i xng, thch hp cho cc ng dng iu khin ng c. Hnh 13 m t cch m Phase correct PWM hot ng tron mode 10 vi ng ra o (COM1A1=1, COM1A0=0).

Hnh 13. Phase correct PWM mode 10. Vic vit code cho ch Phase correct PWM gn nh tng t fast PWM, bn ch cn thay i t hp cc bit WGM da theo bng 3 v sau nhp cc gi tr ph hp cho ICR1 v ORC1A, OCR1B l c. 2.3 Phase correct and frequency correct PWM. Ch ny c 2 mode l 8 v 9. V hu ht cc phng din, 2 mode ny ging vi 2 mode 10 v 11 ca Phase correct PWM. Ci khc nhau duy nht l thi im m thanh ghi OCR1A v OCR1B c cp nht d liu nu c s thay i. Vic ny, nhn chung khng nh hng n hu ht
67

ngi dng PWM iu khin. Bn s rt kh thy s khc bit nu bn khng phi ang vit 1 ng dng m sai s trong 1 micro giy l iu t hi. V th ti khng cp chi tit ch ny, bn c c th tham kho datasheet ca chip hiu r hn nu cn thit. Ngoi ra trn chip atmega8 cn c b timer2 8 bits c PWM v asynchronous operation. V mt chc nng timer2 ging nh phin bn 8 bit ca timer1 ( phn gii thp hn nhng c cng ch v phng thc hot ng). im khc bit v cng l im c bit ca Timer2 l kh nng hot ng khng ng b vi chip, n ging nh vic bn tch timer2 ra thnh 1 chip timer ring, v th cn cung cp 1 ngun xung clock khc cho timer ny (1 thch anh khc). Ch ny c th c dng calip (calibrate), canh chnh sai s v b cho ngun xung clock chnh trn chip.

68

Bi 5 - Giao tip UART


I. Gii thiu.
Bi ny gip cc bn bit cch s dng cch truyn thng ni tip UART trn AVR. Cng c chnh cng l 2 b phn mm quen thuc WinAVR v Proteus nhng trong bi ny (v cc bi sau na) chng ta s s dng chip Atmega32 lm chip minh ha. V c bn vic thay i chip minh ha khng nh hng ln n tnh mch lc ca lot bi v s khc bit ca hai chip Atmega8 v Atmega32 l khng ng k. Tuy nhin, nu c s khc bit ln phn no ti s k ra cho bn tin so snh. Sau bi ny, ti hy vng bn c th hiu v thc hin c:

Nguyn l truyn thng ni tip ng b v khng ng b. Module truyn thng ni tip USART trn AVR. Truyn thng a x l bng UART.

II. Truyn thng ni tip khng ng b. Thut ng USART trong ting anh l vit tt ca cm t: Universal Synchronous & Asynchronous serial Reveiver and Transmitter, ngha l b truyn nhn ni tip ng b v khng ng b. Cn ch rng khi nim USART (hay UART nu ch ni n b truyn nhn khng ng b) thng ch thit b phn cng (device, hardware), khng phi ch mt chun giao tip. USART hay UART cn phi kt hp vi mt thit b chuyn i mc in p to ra mt chun giao tip no . V d, chun RS232 (hay COM) trn cc my tnh c nhn l s kt hp ca chip UART v chip chuyn i mc in p. Tn hiu t chip UART thng theo mc TTL: mc logic high l 5, mc low l 0V. Trong khi , tn hiu theo chun RS232 trn my tnh c nhn thng l -12V cho mc logic high v +12 cho mc low (tham kho hnh 1). Ch l cc gii thch trong ti liu ny theo mc logic TTL ca USART, khng theo RS232.

69

Hnh 1. Tn hiu tng ng ca UART v RS232. Truyn thng ni tip: gi s bn ang xy dng mt ng dng phc tp cn s dng nhiu vi iu khin (hoc vi iu khin v my tnh) kt ni vi nhau. Trong qu trnh lm vic cc vi iu khin cn trao i d liu cho nhau, v d tnh hung Master truyn lnh cho Slaver hoc Slaver gi tn hiu thu thp c v Master x lGi s d liu cn trao i l cc m c chiu di 8 bits, bn c th s ngh n cch kt ni n gin nht l kt ni 1 PORT (8 bit) ca mi vi iu khin vi nhau, mi line trn PORT s chu trch nhim truyn/nhn 1 bit d liu. y gi l cch giao tip song song, cch ny l cch n gin nht v d liu c xut v nhn trc tip khng thng qua bt k mt gii thut bin i no v v th tc truyn cng rt nhanh. Tuy nhin, nh bn thy, nhc im ca cch truyn ny l s ng truyn qu nhiu, bn hy tng tng nu d liu ca bn c gi tr cng ln th s ng truyn cng s nhiu thm. H thng truyn thng song song thng rt cng knh v v th km hiu qu. Truyn thng ni tip s gii quyt vn ny, trong tuyn thng ni tip d liu c truyn tng bit trn 1 (hoc mt t) ng truyn. V l do ny, cho d d liu ca bn c ln n u bn cng ch dng rt t ng truyn. Hnh 2 m t s so snh gia 2 cch truyn song song v ni tip trong vic truyn con s 187 thp phn (tc 10111011 nh phn).

70

Hnh 2. Truyn 8 bit theo phng php song song v ni tip. Mt hn ch rt d nhn thy khi truyn ni tip so vi song song l tc truyn v chnh xc ca d liu khi truyn v nhn. V d liu cn c chia nh thnh tng bit khi truyn/nhn, tc truyn s b gim. Mt khc, m bo tnh chnh xc ca d liu, b truyn v b nhn cn c nhng tha hip hay nhng tiu chun nht nh. Phn tip theo trong chng ny gii thiu cc tiu chun trong truyn thng ni tip khng ng b. Khi nim ng b ch s bo trc trong qu trnh truyn. Ly v d thit b 1 (tb1) kt vi vi thit b 2 (tb2) bi 2 ng, mt ng d liu v 1 ng xung nhp. C mi ln tb1 mun send 1 bit d liu, tb1 iu khin ng xung nhp chuyn t mc thp ln mc cao bo cho tb2 sn sng nhn mt bit. Bng cch bo trc ny tt c cc bit d liu c th truyn/nhn d dng vi t ri ro trong qu trnh truyn. Tuy nhin, cch truyn ny i hi t nht 2 ng truyn cho 1 qu trnh (send or receive), tc truyn cng b hn ch v i hi bn nhn phi lin tc quan st ng xung nhp trc khi c bt k bit d liu no. Giao tip gia my tnh v cc bn phm (tr bn phm kt ni theo chun USB) l mt v d ca cch truyn thng ni tip ng b. Khc vi cch truyn ng b, truyn thng khng ng b ch cn mt ng truyn cho mt qu trnh. Khung d liu c chun ha bi cc thit b nn khng cn ng xung nhp bo trc d liu n. V d 2 thit b ang giao tip vi nhau theo phng php ny, chng c tha thun vi nhau rng c 1ms th s c 1 bit d liu truyn n, nh th thit b nhn ch cn kim tra v c ng truyn mi mili-giy c cc bit d liu v sau kt hp chng li thnh d liu c ngha. Truyn thng ni tip khng ng b v th nhanh v hiu qu hn truyn thng ng b. Tuy nhin, qu trnh truyn thnh cng th vic tun th cc tiu chun truyn l ht sc quan trng. Chng ta s bt u tm hiu cc khi nim quan trng trong phng php truyn thng ny.
71

Baud rate (tc Baud): nh trong v d trn v vic truyn 1 bit trong 1ms, bn thy rng vic truyn v nhn khng ng b xy ra thnh cng th cc thit b tham gia phi thng nht nhau v khong thi dnh cho 1 bit truyn, hay ni cch khc tc truyn phi c ci t nh nhau trc, tc ny gi l tc Baud. Theo nh ngha, tc baud l s bit truyn trong 1 giy. V d nu tc baud c t l 19200 th thi gian dnh cho 1 bit truyn l 1/19200 ~ 52.083us. Frame (khung truyn): do truyn thng ni tip m nht l ni tip khng ng b rt d mt hoc sai lch d liu, qu trnh truyn thng theo kiu ny phi tun theo mt s quy cch nht nh. Bn cnh tc baud, khung truyn l mt yu tc quan trng to nn s thnh cng khi truyn v nhn. Khung truyn bao gm cc quy nh v s bit trong mi ln truyn, cc bit bo nh bit Start v bit Stop, cc bit kim tra nh Parity, ngoi ra s lng cc bit trong mt data cng c quy nh bi khung truyn. Hnh 1 l mt v d ca mt khung truyn theo UART, khung truyn ny c bt u bng mt start bit, tip theo l 8 bit data, sau l 1 bit parity dng kim tra d liu v cui cng l 2 bits stop. Start bit: start l bit u tin c truyn trong mt frame truyn, bit ny c chc nng bo cho thit b nhn bit rng c mt gi d liu sp c truyn ti. module USART trong AVR, ng truyn lun trng thi cao khi ngh (Idle), nu mt chip AVR mun thc hin vic truyn d liu n s gi mt bit start bng cch ko ng truyn xung mc 0. Nh vy, vi AVR bit start l mang gi tr 0 v c gi tr in p 0V (vi chun RS232 gi tr in p ca bit start l ngc li). start l bit bt buc phi c trong khung truyn. Data: data hay d liu cn truyn l thng tin chnh m chng ta cn gi v nhn. Data khng nht thit phi l gi 8 bit, vi AVR bn c th quy nh s lng bit ca data l 5, 6, 7, 8 hoc 9 (tng t cho hu ht cc thit b h tr UART khc). Trong truyn thng ni tip UART, bit c nh hng nh nht (LSB Least Significant Bit, bit bn phi) ca data s c truyn trc v cui cng l bit c nh hng ln nht (MSB Most Significant Bit, bit bn tri). Parity bit: parity l bit dng kim tra d liu truyn ng khng (mt cch tng i). C 2 loi parity l parity chn (even parity) v parity l (odd parity). Parity chn ngha l s lng s 1 trong d liu bao gm bit parity lun l s chn. Ngc li tng s lng cc s 1 trong parity l lun l s l. V d, nu d liu ca bn l 10111011 nh phn, c tt c 6 s 1 trong d liu ny, nu parity chn c dng, bit parity s mang gi tr 0 m bo tng cc s 1 l s chn (6 s 1). Nu parity l c yu cu th gi tr ca parity bit l 1. Hnh 1 m t v d ny vi parity chn c s dng.
72

Parity bit khng phi l bit bt buc v v th chng ta c th loi bit ny khi khung truyn (cc v d trong bi ny ti khng dng bit parity). Stop bits: stop bits l mt hoc cc bit bo cho thit b nhn rng mt gi d liu c gi xong. Sau khi nhn c stop bits, thit b nhn s tin hnh kim tra khung truyn m bo tnh chnh xc ca d liu. Stop bits l cc bits bt buc xut hin trong khung truyn, trong AVR USART c th l 1 hoc 2 bits (Trong cc thit b khc Stop bits c th l 2.5 bits). Trong v d hnh 1, c 2 stop bits c dng cho khung truyn.Gi tr ca stop bit lun l gi tr ngh (Idle) v l ngc vi gi tr ca start bit, gi tr stop bit trong AVR lun l mc cao (5V). (Ch v gi : khung truyn ph bin nht l : start bit+ 8 bit data+1 stop bit) Sau khi nm bt cc khi nim v truyn thng ni tip, phn tip theo chng ta s kho st cch thc hin phng php truyn thng ny trn chip AVR (c th l chip Atmega32). III. Truyn thng ni tip khng ng b vi AVR (UART). Vi iu khin Atmega32 c 1 module truyn thng ni tip USART. C 3 chn chnh lin quan n module ny l chn xung nhp - XCK (chn s 1), chn truyn d liu TxD (Transmitted Data) v chn nhn d liu RxD (Reveived Data). Trong chn XCK ch c s dng nh l chn pht hoc nhn xung gi nhp trong ch truyn ng b. Tuy nhin bi ny chng ta khng kho st ch truyn thng ng b, v th bn ch cn quan tm n 2 chn TxD v RxD. V cc chn truyn/nhn d liu ch m nhim 1 chc nng c lp (hoc l truyn, hoc l nhn), kt ni cc chip AVR vi nhau (hoc kt ni AVR vi thit b h tr UART khc) bn phi u cho 2 chn ny. TxD ca thit b th nht kt ni vi RxD ca thit b 2 v ngc li. Module USART trn chip Atmega32 hot ng song cng (Full Duplex Operation), ngha l qu trnh truyn v nhn d liu c th xy ra ng thi. 1. Thanh ghi: Cng nh cc thit b khc trn AVR, tt c hot ng v trng thi ca module USART c iu khin v quan st thng qua cc thanh ghi trong vng nh I/O. C 5 thanh ghi c thit k ring cho hot ng v iu khin ca USART, l:

73

UDR: hay thanh ghi d liu, l 1 thanh ghi 8 bit cha gi tr nhn c v pht i ca USART. Thc cht thanh ghi ny c th coi nh 2 thanh ghi TXB (Transmit data Buffer) v RXB (Reveive data Buffer) c chung a ch. c UDR thu c gi tr thanh ghi m d liu nhn, vit gi tr vo UDR tng ng t gi tr vo thanh ghi m pht, chun b gi i. Ch trong cc khung truyn s dng 5, 6 hoc 7 bit d liu, cc bit cao ca thanh ghi UDR s khng c s dng

UCSRA (USART Control and Status Register A): l 1 trong 3 thanh ghi iu khin hot ng ca module USART.

Thanh ghi UCSRA ch yu cha cc bit trng thi nh bit bo qu trnh nhn kt thc (RXC), truyn kt thc (TXC), bo thanh ghi d liu trng (UDRE), khung truyn c li (FE), d liu trn (DOR), kim tra parity c li (PE)Bn ch mt s bit quan trng ca thanh ghi ny: * UDRE (USART Data Register Empty) khi bit by bng 1 ngha l thanh ghi d liu UDR ang trng v sn sng cho mt nhim v truyn hay nhn tip theo. V th nu bn mun truyn d liu u tin bn phi kim tra xem bit UDRE c bng 1 hay khng, sau khi chc chn rng UDRE=1 hy vit d liu vo thanh ghi UDR truyn i. * U2X l bit ch nh gp i tc truyn, khi bit ny c set ln 1, tc truyn so cao gp 2 ln so vi khi bit ny mang gi tr 0. * MPCM l bit chn ch hot ng a x l (multi-processor).

UCSRB (USART Control and Status Register B): y l thanh ghi quan trng iu khin USART. V th chng ta s kho st chi tit tng bit ca thanh ghi ny.

74

* RXCIE (Receive Complete Interrupt Enable) l bit cho php ngt khi qu trnh nhn kt thc. Vic nhn d liu truyn bng phng php ni tip khng ng b thng c thc hin thng qua ngt, v th bit ny thng c set bng 1 khi USART c dung nhn d liu. * TXCIE (Transmit Complete Interrupt Enable) bit cho php ngt khi qu trnh truyn kt thc. * UDRIE (USART Data Register Empty Interrupt Enable) l bit cho php ngt khi thanh ghi d liu UDR trng. * RXEN (Receiver Enable) l mt bit quan trng iu khin b nhn ca USART, kch hot chc nng nhn d liu bn phi set bit ny ln 1. * TXEN (Transmitter Enable) l bit iu khin b pht. Set bit ny ln 1 bn s khi ng b pht ca USART. * UCSZ2 (Chracter size) bit ny kt hp vi 2 bit khc trong thanh ghi UCSRC quy nh di ca d liu truyn/nhn. Chng ta s kho st chi tit khi tm hiu thanh ghi UCSRC. * RXB8 (Receive Data Bit 8) gi l bit d liu 8. Bn nh li rng USART trong AVR c h tr truyn d liu c di ti a 9 bit, trong khi thanh ghi d liu l thanh ghi 8 bit. Do , khi c gi d liu 9 bit c nhn, 8 bit u s cha trong thanh ghi UDR, cn c 1 bit khc ng vai tr bit th chn, RXD8 l bit th chn ny. Bn ch l cc bit c nh s t 0, v th bit th chn s c ch s l 8, v l m bit ny c tn l RXD8 (khng phi RXD9). * TXB8 (Transmit Data Bit 8), tng t nh bit RXD8, bit TXB8 cng ng vai tr bit th 9 truyn thng, nhng bit ny c dung trong lc truyn d liu.

UCSRC (USART Control and Status Register C): thanh ghi ny ch yu quy nh khung truyn v ch truyn. Tuy nhin, c mt rc ri nho nh l thanh ghi ny li c cng a ch vi thanh ghi UBRRH (thanh ghi cha byte cao dng xc lp tc baud), ni mt cch khc 2 thanh ghi ny l 1. V th bit 7 trong thanh ghi ny, tc bit URSEL l bit chn thanh ghi. Khi URSEL=1, thanh ghi ny c chip AVR hiu l thanh ghi iu khin UCSRC, nhng nu bit URSEL=0 th thanh ghi UBRRH s c s dng.

75

Cc bit cn li trong thanh ghi UCSRC c m t nh sau: * UMSEL (USART Mode Select) l bit la chn gia 2 ch truyn thng ng b v khng ng b. Nu UMSEL=0, ch khng ng b c chn, ngc li nu UMSEL=1, ch ng b c kch hot. * Hai bit UPM1 v UPM0( Parity Mode) c dng quy nh kim tra pariry. Nu UPM1:0=00, parity khng c s dng (mode ny kh thng dng), UPM1:0=01 khng c s dng, UPM1:0=10 th parity chn c dng, UPM1:0=11 parity l c s dng (xem thm bng 1). Bng 1: chn kim tra parity.

* USBS (Stop bit Select), bit Stop trong khung truyn bng AVR USART c th l 1 hoc 2 bit, nu USBS=0 th Stop bit ch l 1 bit trong khi USBS=1 s c 2 Stop bit c dng. * Hai bit UCSZ1 v UCSZ2 (Character Size) kt hp vi bit UCSZ2 trong thanh ghi UCSRB to thnh 3 bit quy nh di d liu truyn. Bng 2 tm tt cc gi tr c th c ca t hp 3 bit ny v di d liu truyn tng ng. Bng 2: di d liu truyn.

* UCPOL (Clock Pority) l bit ch cc ca xung kch trong ch truyn thng ng b. nu UCPOL=0, d liu s thay i thay i cnh ln ca xung nhp, nu UCPOL=1, d liu thay i cnh xung xung nhp. Nu bn s dng ch truyn thng khng ng b, hy set bit ny bng 0..

76

UBRRL v UBRRH (USART Baud Rate Register): 2 thanh ghi thp v cao quy nh tc baud.

Nhc li l thanh ghi UBRRH dng chung a ch thanh ghi UCSRC, bn phi set bit ny bng 0 nu mun s dng thanh ghi UBRRH. Nh bn quan st trong hnh trn, ch c 4 bit thp ca UBRRH c dng, 4 bit ny kt hp vi 8 bit trong thanh ghi UBRRL to thnh thanh ghi 12 bit quy nh tc baud. Ch l nu bn vit gi tr vo thanh ghi UBRRL, tc baud s tc th c cp nht, v th bn phi vit gi tr vo thanh ghi UBRRH trc khi vit vo thanh ghi UBRRL. Gi tr gn cho thanh ghi UBRR khng phi l tc baud, n ch c USART dng tnh tc baud. Bng 3 hng dn cch tnh tc baud da vo gi tr ca thanh ghi UBRR v ngc li, cch tnh gi tr cn thit gn cho thanh ghi UBRR khi bit tc baud. Bng 3: tnh tc baud.

Trong cc cng thc trong bng 3, fOSC l tc tn s xung nhp ca h thng (thch anh hay ngun xung ni). tin cho bn theo di, ti nh km bng v d cch t gi tr cho UBRR theo tc baud mu. Bng 4: mt s tc baud mu.

77

78

2. S dng UART:. Thng thng, s dng module USART trn AVR bn phi thc hin 3 vic quan trng, l: ci t tc baud (thanh ghi UBRR), nh dng khung truyn (UCSRB, UCSRC) v cui cng kch hot b truyn, b nhn, ngtNh cp, trong ti liu ny ti ch yu cp n phng php truyn thng khng ng b, vic xc lp cc thng s hot ng ch yu da trn ch ny. Trong hu ht cc ng dng, tc baud v khung truyn thng khng i, trong trng hp ny chng ta c th khi to trc tip USART phn u trong main v sau ch cn truyn hoc nhn d liu m khng cn thay i cc ci t. Tuy nhin, nu trng hp giao tip linh hot v d bn ang ch to mt thit b c kh nng giao tip vi mt thit b u cui khc (nh my tnh chng hn), lc ny bn nn cho php ngi dng thay i tc baud hoc cc thng s khc ph hp vi thit b u cui. i vi nhng ng dng kiu ny bn nn vit 1 chng trnh con khi ng USART v c th gi li nhiu ln khi cn thay i. Phn tip theo chng ta s vit mt s chng trnh v d minh ha cch s dng module truyn thng USART t n gin n phc tp. Cc v d s c thc hin cho chip Atmega32 vi gi s ngun xung nhp h thng l 8MHz. 2.1 Truyn d liu. Trc ht chng ta s thc hin mt v d rt n gin hiu cch khi ng USART v truyn cc gi d liu 8 bit. Mch in m phng trong hnh 3. Gi s chng ta mun nh dng cho khung truyn gm 1 bit start, 8 bit d liu, khng kim tra parity v 1 bit stop. Tc baud 57600 (57.6k). D liu cn truyn l cc gi tr lin tc ca bng m ASCII. on code trong list 1 trnh by cch thc hin v d ny. List 1. Khi ng v truyn d liu khng ng b bng USART
1 2 3 4 5 6 7 8 9 10 #include <avr/io.h> #include <avr/delay.h> //chuong trinh con phat du lieu void uart_char_tx(unsigned char chr){ while (bit_is_clear(UCSRA,UDRE)) {}; //cho den khi bit UDRE=1 UDR=chr; } int main(void){
79

11 //set baud, 57.6k ung voi f=8Mhz, xem bang 70 trang 165, Atmega32 datasheet 12 UBRRH=0; 13 UBRRL=8; 14 15 //set khung truyen va kich hoat bo nhan du lieu 16 UCSRA=0x00; 17 UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); 18 UCSRB=(1<<TXEN); 19 20 while(1){ 21 for (char i=32; i<128; i++){ 22 uart_char_tx(i); //phat du lieu 23 _delay_ms(100); 24 } 25 } 26 }

Trc ht ti s gii thch cch khi ng USART trong cc dng code t 12 n 18. Nu bn xem li bng 3 trong trang 9 ca ti liu ny (hoc bng 70, trang 165 datasheet ca chip atmega32), ng vi tn s xung nhp 8Hhz, khng s dng ch nhn i tc (U2X=0), t c tc b baud 57600 th gi tr cn gn cho thanh ghi UBRR l 8 (xem ct 2, bng 3). Hai dng 12 v 13 trong list 1 thc hin gn 8 cho thanh ghi UBRR thng qua 2 thanh ghi UBRRH v UBRRL. Trong dng 16, thanh ghi UCSRA c gn bng 0. Nu bn xem li phn gii thch bn s thy thanh ghi UCSRA ch yu cha cc bit trng thi, ring 2 bit U2X v MPCM l 2 bit iu khin, 2 bit ny bng 0 ngha l chng ta khng s dng ch nhn i tc v khng s dng truyn thng a x l. Phn quan trng nht chnh l t gi tr cho 2 thanh ghi USCRB v UCSRC. Vi thanh ghi UCSRC (dng 17) trc ht chng ta phi set bit URSEL bo rng chng ta khng mun truy cp thanh ghi UBRRH m l thanh ghi UCSRC (2 thanh ghi ny c cng a ch), tip theo chng ta ch set 1 cho 2 bit UCSZ1 v UCSZ0, bn xem li bng 2 thy rng nu UCSZ1=1, UCSZ0=1 cng vi vic bit UCSZ2=0(nm trong thanh ghi UCSRB) th di d liu truyn c chn l 8 bit. Cc bit trong thanh ghi UCSRC khng c set s mc nh mang gi tr 0, bao gm UMSEL = 0 (ch truyn thng khng ng b), UPM1:0=00 ( khng s dng kim tra parity, xem bng 1), USBS=0 (1 bit stop) v UCPOL=0 (bit ny khng s dng khi truyn khng ng b). Sau cng, trong dng 18, chng ta ch set bit TXEN =1 ngha l ch kch hot b pht d liu, cc thnh phn khc nh b nhn, cc ngtkhng c s dng trong v d ny.
80

Trong cc bi trc ti gii thiu bn v trnh phc v ngt v trong phn ny ti s trnh by cch vit mt chng trnh con bng ngn ng C trong WinAVR, l on chng trnh uart_char_tx dng 5. Chng trnh con l 1 on code bao gm cc cu lnh cng thc hin mt nhim v chung c th no . Trong trng hp ny l nhim v truyn 1 tham s 8 bit ra ng TxD ca USART thng qua thanh ghi UDR. Nh trnh by trong phn m t bit UDRE ca thanh ghi UCSRA, qu trnh truyn ch c bt u khi bit UDRE bng 1, v th dng code 6 lm nhim v kim tra bit UDRE, cu lnh while (bit_is_clear(UCSRA,UDRE)) {}; c hiu l qu trnh lp s ln qun nu bit UDRE bng 0 (bit_is_clear). Khi bit UDRE bng 1 th dng code 7 s xut bin chr ra thanh ghi UDR cng l xut ra chn TxD ca module USART. Trong ngn ng C c 2 cch c bn vit chng trnh con. Vi cch 1 chng trnh con c khai bo v vit trc tip pha trc chng trnh chnh main nh cch m ti thc hin trong v d 1 ny. Cch vit ny hiu v thch hp cho cc on chng trnh con ngn nhng chng c th lm tng quan chng trnh ca bn tr nn rc ri khi c qu nhiu chng trnh con vit trc main. Bn c th khc phc nhc im ny bng cch t cc chng trnh con pha sau main nh cch m chng ta lm vi cc trnh phc v ngt. Nu theo ng quy cch ca ngn ng C, khi t chng trnh con sau main bn phi khai bo tn chng trnh pha trc main, nu bn t chng trnh con uart_char_tx pha sau main th phn trc main bn s t dng khai bo trc: void uart_char_tx(unsigned char chr);. Tuy WinAVR cho php bn b qua khai bo trc ny nhng ti khuyn bn nn vit ng cch to thi quen v cng nh d chuyn chng trnh sang cc trnh bin dch C khc sau ny nu cn thit. Phn cui cng trong on code l gi li chng trnh uart_char_tx truyn cc d liu l cc s t 32 n 127. thc hin m phng bng proteus bn hy v mt mch in n gin nh trong hnh 3. Chip Atmega32 c th c tm vi t kha mega32. Trong mch in m phng c mt thit b u cui o (Virtual Terminal) l mt thit b kt ni v hin th kt qu truyn thng khng ng b, chng ta dng kim tra d liu c truyn bng chip AVR. Bn c th tm thit b ny trong trong danh sch cc d c o (virtual instruments), nhn vo nt cng c v sau chn terminal trong danh sch chn thit b u cui o. Kt ni thit b o vi chip Atmega32 nh trong hnh 3, ch l phi u cho 2 chn TxD v RxD. Bn cnh vic gn chng trnh cho chip AVR, bn phi set thng s cho thit b o trc khi thc hin m phng. Hy m hp thoi edit component ca thit b o (bng cch right click ri left click trn thit b o). Theo mc nh thit b u cui c nh dng
81

khung truyn l 1 bit start+8 bit d liu+1 bit stop tng t nh cch chng ta ci t cho AVR trong v d 1, v th bn ch cn thay i tc baud thnh 57600 trong hp thoi edit component l hon tt (xem hnh 4). Khi chy m phng, thit b u cui o s hin th cc k t ASCII ca cc s t 32 n 127.

Hnh 3. M phng v d 1.

Hnh 4. Ci t thng s cho thit b o.


82

2.2 Nhn d liu. Qu trnh nhn d liu ch xy ra khi bit RXEN trong thanh ghi UCSRB c set bng 1 v tt nhin chn nhn d liu RxD phi c ni vi mt ngun pht (chn TxD ca mt chip UART khc chng hn). Cc thng s truyn thng nh tc baud v khung truyn trong b nhn phi c ci t nh ca b pht. Nu khng c li trong qu trnh truyn v nhn d liu, sau khi nhn d liu s c cha trong thanh ghi UDR v bit RXC (Reveice Complete) trong thanh ghi UCSRA s t ng c set ln 1. Sau khi thanh ghi UDR c c, bit RXC li t ng reset v 0 chun b cho qu trnh nhn d liu k tip. Nh th v c bn chng ta c 2 cch c d liu nhn v. Cch th nht l cch hi vng (polling), kim tra nu bit RXC = 1 th c gi tr thanh ghi UDR (v c c bit RXB8 trong thanh ghi UCSRB nu frame truyn 9 bit c dng). Cch th hai l s dng ngt nhn hon tt (Receive Complete Interrupt), bng cch set bit cho php ngt nhn hon tt, tc bit RXCIE trong thanh ghi UCSRB, v bit cho php ngt ton cc (bit I, xem li bi 3) th mt ngt s xy ra khi d liu c nhn v cha trong thanh ghi UDR, chng ta ch cn c gi tr ca thanh ghi UDR trong trnh phc v ngt l xong. Theo kinh nghim, s dng ngt l phng php tt nht cho a s cc trng hp nhn d liu UART, v chng ta khng cn quan tm thi im m d liu gi n, trnh lng ph thi gian dnh cho vic hi vng. V th trong phn tip theo ti s trnh by mt v d minh ha qu trnh nhn d liu bng phng php ngt. phc v cho v d ny, chng ta s kho st mt mch m phng gm 2 chip Atmega32 ni vi nhau qua cc ng TxD v RxD. Chip th l chip pht d liu, nhim v ca chip ny l pht chui d liu t 32 n 127 nh chip Atmega32 trong v d 1. Chn pht TxD ca chip 1 s c ni vi chn nhn RxD ca chip th 2 (chip th 2 c gi l chip nhn d liu). Chip th 2 sau khi nhn d liu s pht d liu ny ra chn TxD ca chnh n c th hin th ln thit b u cui o cho chng qua quan st v so snh kt qu. Bn xem mch in m phng trong hnh 5 hiu r hn. Chng ta s dng on code trong v d 1 cho chip th nht v th ch cn vit on code nhn v pht li d liu cho chip th hai. List 2 trnh by on code cho chip th hai..

83

List 2. Nhn d liu USART khng ng b bng phng php ngt. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> //chuong trinh con phat du lieu void uart_char_tx(unsigned char chr){ while (bit_is_clear(UCSRA,UDRE)) {}; //cho den khi bit UDRE=1 UDR=chr; } volatile unsigned char u_Data; int main(void){ //set baud, 57.6k ung voi f=8Mhz, xem bang 70 trang 165, Atmega32 datasheet UBRRH=0; UBRRL=8; //set khung truyen va kich hoat bo nhan du lieu UCSRA=0x00; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//cho phep ca 2 qua trinh nhan va//truyen, va cho phep ngat sau khi nhan xong sei(); //cho phep ngat toan cuc while(1){ } } ISR(SIG_UART_RECV){ //trinh phuc vu ngat USART hoan tat nhan u_Data=UDR; uart_char_tx(u_Data); }

on code trong v d nhn v pht d liu khng khc on code trong v d 1 l my. dng th 3 ti include file header interrupt.h v chng ta s s dng ngt nhn d liu. Chng ta khai bo mt bin u_Data dng 8 bit khng du lu d liu nhn c, do bin ny s c truy cp trong trnh phc v ngt nn chng ta t attribute volatile (dng 9). im quan trng khi khi ng UART trong v d ny l dng code 18, nu trong v d 1 chng ta ch khi ng duy nht b pht bng cch set bit TXEN trong
84

thanh ghi UCSRB (UCSRB=(1<<TXEN);) th trong v d ny chng ta set thm 2 bit cho php nhn RXEN v cho php ngt RXCIE trong thanh ghi UCSRB. Bit RXEN khi ng b nhn v bit RXCIE khi ng ch ngt khi d liu nhn trong UDR, tuy nhin c th s dng ngt, chng ta cn set them bit I trong thanh ghi trng thi bng dng code 20 (sei();). Phn quan trng nht trong on code trn l trnh phc ngt nhn d liu ISR. Khi d liu c nhn y trong UDR, trnh ngt ISR(SIG_UART_RECV) s c thc hin, chng ta s c gi tr va nhn c vo bin u_Data (dng 26) v sau pht gi tr ny ra chn TxD hin th ln thit b u cui o bng dng lnh 27. Phn mch in m phng c trnh by trong hnh 5. Chng trnh cho chip TRANSMITTER l chng trnh trong v d 1 v chng trnh cho chip RECEIVER l chng trnh trong on code trn. Bn phi set xung clock cho c 2 chip l 8MHz v set tc baud cho thit b u cui o l 56700. Nu khi chy m phng, thit b u cui hin th cc k t ASCII ca cc s t 32 n 127 nh trong hnh 5 th mi th c thc hin chnh xc.

Hnh 5. Truyn v nhn bng UART.

85

Bi 6 - Chuyn i ADC
I. Bn s i n u.
Bi hc ny, nh tn ca n, s gii thiu cch s dng b chuyn i tng t - s (analog to digital converter - ADC). Cng c chnh cng l 2 b phn mm quen thuc WinAVR v Proteus. Sau bi ny, ti hy vng bn c th hiu v thc hin c: Nguyn l chuyn i AD. Chuyn i ADC n knh trn AVR. S dng chuyn i ADC n knh trn AVR, hin th s 4 digit bng LED 7 on. II. Chuyn i d liu tng t (analog) sang d liu s (digital). Trong cc ng dng o lng v iu khin bng vi iu khin b chuyn i tng t-s (ADC) l mt thnh phn rt quan trng. D liu trong th gii ca chng ta l cc d liu tng t (analog). V d nhit khng kh bui sng l 25oC v bui tra l 32oC, gia hai mc gi tr ny c v s cc gi tr lin tc m nhit phi i qua c th t mc 32oC t 25oC, i lng nhit nh th gi l mt i lng analog. Trong khi , r rng vi iu khin l mt thit b s (digital), cc gi tr m mt vi iu khin c th thao tc l cc con s ri rc v thc cht chng c to thnh t s kt hp ca hai mc 0 v 1. V d chng ta mun dng mt thanh ghi 8 bit trong vi iu khin lu li cc gi tr nhit t 0oC n 255 oC, nh chng ta bit, mt thanh ghi 8 bit c th cha ti a 256 (28) gi tr nguyn t 0 n 255, nh th cc mc nhit khng nguyn nh 28.123 oC s khng c ghi li. Ni cch khc, chng ta s ha (digitalize) mt d liu analog thnh mt d liu digital. Qu trnh s ha ny thng c thc hin bi mt thit b gi l b chuyn i tng t s hay n gin l ADC (Analog to Digital Converter). C rt nhiu phng php chuyn i ADC, ti khng c nh gii thch c th cc nguyn l chuyn i ny trong bi hc v AVR, tuy nhin ti s gii thiu mt cch chuyn i rt c bn v ph bin cc bn phn no nm c cch m mt b ADC lm vic. Phng php chuyn i m ti ni l phng php chuyn i trc tip (direct converting) hoc flash ADC. Cc b chuyn i ADC theo phng php ny c cu thnh t
86

mt dy cc b so snh (nh opamp), cc b so snh c mc song song v c kt ni trc tip vi tn hiu analog cn chuyn i. Mt in p tham chiu (reference) v mt mch chia p c s dng to ra cc mc in p so snh khc nhau cho mi b so snh. Hnh 1 m t mt b chuyn i flash ADC c 4 b so snh, Vin l tn hiu analog cn chuyn i v gi tr sau chuyn i l cc con s to thnh t s kt hp cc mc nh phn trn cc chn Vo. Trong hnh 1, bn thy rng do anh hng ca mch chia p (cc in tr mc ni tip t in p +15V n ground), in p trn chn m (chn -) ca cc b so snh s khc nhau. Trong lc chuyn i, gi s in p Vin ln hn in p V- ca b so snh 1 (opamp pha thp nht trong mch) nhng li nh hn in p V- ca cc b so snh khc, khi ng Vo1 mc 1 v cc ng Vo khc mc 0, chng ta thu c mt kt qu s. Mt cch tng t, nu tng in p Vin ta thu c cc t hp s khc nhau. Vi mch in c 4 b so snh nh trong hnh 1, s c tt c 5 trng hp c th xy ra, hay ni theo cch khc in p analog Vin c chia thnh 5 mc s khc nhau. Tuy nhin, bn ch l cc ng Vo khng phi l cc bit ca tn hiu s ng ra, chng ch l i din t hp thnh tn hiu s ng ra, d hiu hn chng ta khng s dng c cc bit Vo trc tip m cn mt b gii m (decoder). Trong bng 1 ti trnh by kt qu sau khi gii m ng vi cc t hp ca cc ng Vo.

Hnh 1. Mch flash ADC vi 4 b so snh.


87

Bng 1 Gi tr s ng ra sau khi gii m.

phn gii (resolution): nh trong v d trn, nu mch in c 4 b so snh, ng ra digital s c 5 mc gi tr. Tng t nu mch in c 7 b so snh th s c 8 mc gi tr c th ng ra digital, khong cch gia cc mc tn hiu trong trng hp 8 mc s nh hn trng hp 4 mc. Ni cch khc, mch chuyn i vi 7 b so snh c gi tr digital ng ra mn hn khi ch c 4 b, mn cng cao tc phn gii (resolution) cng ln. Khi nim phn gii c dng ch s bit cn thit cha ht cc mc gi tr digital ng ra. Trong trng hp c 8 mc gi tr ng ra, chng ta cn 3 bit nh phn m ha ht cc gi tr ny, v th mch chuyn i ADC vi 7 b so snh s c phn gii l 3 bit. Mt cch tng qut, nu mt mch chuyn i ADC c phn gii n bit th s c 2n mc gi tr c th c ng ra digital. to ra mt mch chuyn i flash ADC c phn gii n bit, chng ta cn n 2n-1 b so snh, gi tr ny rt ln khi thit k b chuyn i ADC c phn gii cao, v th cc b chuyn i flash ADC thng c phn gii t hn 8 bit. phn gii lin quan mt thit n cht lng chuyn i ADC, vic la chn phn gii phi ph hp vi chnh xc yu cu v kh nng x l ca b iu khin. Trong 2 m t mt v d s ha mt hm sin analog thnh dng digital.

88

Hnh 2. Analog v digital ca hm sin. in p tham chiu (reference voltage): Cng mt b chuyn i ADC nhng c ngi mun dng cho cc mc in p khc nhau, v d ngi A mun chuyn i in p trong khong 0-1V trong khi ngi B mun dng cho in p t 0V n 5V. R rng nu hai ngi ny dng 2 b chuyn i ADC u c kh nng chuyn i n in p 5V th ngi A ang ph phm tnh chnh xc ca thit b. Vn s c gii quyt bng mt i lng gi l in p tham chiu - Vref (reference voltage). in p tham chiu thng l gi tr in p ln nht m b ADC c th chuyn i. Trong cc b ADC, Vref thng l thng s c t bi ngi dng, n l in p ln nht m thit b c th chuyn i. V d, mt b ADC 10 bit ( phn gii) c Vref=3V, nu in p ng vo l 1V th gi tr s thu c sau khi chuyn i s l: 1023x(1/3)=314. Trong 1023 l gi tr ln nht m mt b ADC 10 bit c th to ra (1023=210-1). V in p tham chiu nh hng n chnh xc ca qu trnh chuyn i, chng ta cn tnh ton chn 1 in p tham chiu ph hp, khng c nh hn gi tr ln nht ca input nhng cng ng qu ln. II. Chuyn i ADC trn AVR. Chip AVR ATmega32 ca Atmel c tch hp sn cc b chuyn i ADC vi phn gii 10 bit. C tt c 8 knh n (cc chn ADC0 n ADC7), 16 t hp chuyn i dng so snh, trong c 2 knh so snh c th khuych i. B chuyn i ADC trn AVR khng hot ng theo nguyn l flash ADC m ti cp phn trn, ADC trong AVR l loi chuyn i xp x ln lt (successive approximation ADC). ADC trn AVR cn c nui bng ngun in p ring chn AVCC, gi tr in p cp cho AVCC khng c khc ngun nui chip (VCC) qu +/-0.3V. Nhiu (noise) l vn rt quan trng khi s dng cc

89

b ADC, gim thiu sai s chuyn i do nhiu, ngun cp cho ADC cn phi c lc (filter) k cng. Mt cch n gin to ngun AVCC l dng mt mch LC kt ni t ngun VCC ca chip nh minh ha trong hnh 3, y l cch c gi bi nh sn xut AVR.

Hnh 3. To ngun AVCC t VCC. in p tham chiu cho ADC trn AVR c th c to bi 3 ngun: dng in p tham chiu ni 2.56V (c nh), dng in p AVCC hoc in p ngoi t trn chn VREF. Mt ln na, bn cn ch n noise khi t in p tham chiu, nu dng in p ngoi t trn chn VREF th in p
90

ny phi c lc tht tt, nu dng in p tham chiu ni 2.56V hoc AVCC th chn VREF cn c ni vi mt t in. Vic chn in p tham chiu s c cp chi tit trong phn s dng ADC. Cc chn trn PORTA ca chip ATmega32 c dng cho b ADC, chn PA0 tng ng knh ADC0 v chn PA7 tng ng vi knh ADC7. 1. Thanh ghi. C 4 thanh trong b ADC trn AVR trong c 2 thanh ghi data cha d liu sau khi chuyn i, 2 thanh ghi iu khin v cha trng thi ca ADC. - ADMUX (ADC Multiplexer Selection Register): l 1 thanh ghi 8 bit iu khin vic chn in p tham chiu, knh v ch hot ng ca ADC. Chc nng ca tng bit trn thanh ghi ny s c trnh by c th nh sau:

Bit 7:6- REFS1:0 (Reference Selection Bits): l cc bit chn in p tham chiu cho ADC, 1 trong 3 ngun in p tham chiu c th c chn l: in p ngoi t chn VREF, in p tham chiu ni 2.56V hoc in p AVCC. Bng 2 tm tt gi tr cc bit v in p tham chiu tng ng.

Bng 2: Chn in p tham chiu

Bit 5-ADLAR (ADC Left Adjust Result): l bit cho php hiu chnh tri kt qu chuyn i. S d c bit ny l v ADC trn AVR c phn gii 10 bit, ngha l kt qu thu c sau chuyn i l 1 s c di 10 bit (ti a 1023), AVR b tr 2 thanh ghi data 8 bit cha
91

gi tr sau chuyn i. Nh th gi tr chuyn i s khng lp y 2 thanh ghi data, trong mt s trng hp ngi dng mun 10 bit kt qu nm lch v pha tri trong khi cng c trng hp ngi dng mun kt qu nm v pha phi. Bit ADLAR s quyt nh v tr ca 10 bit kt qu trong 16 bit ca 2 thanh ghi data. Nu ADLAR=0 kt qu s c hiu chnh v pha phi (thanh ghi ADCL cha trn 8 bit thp v thanh ghi ADCH cha 2 bit cao trong 10 bit kt qu), v nu ADLAR=1 th kt qu c hiu chnh tri (thanh ghi ADCH cha trn 8 bit cao nht, cc bit t 9 n 2, v thanh ADCL cha 2 bit thp nht trong 10 bit kt qu (bn xem hnh cch b tr 2 thanh ghi ADCL v ADCH bn di hiu r hn). Bits 4:0-MUX4:0 (Analog Channel and Gain Selection Bits): l 5 bit cho php chn knh, ch v c h s khuych i cho ADC. Do b ADC trn AVR c nhiu knh v cho php thc hin chuyn i ADC kiu so snh (so snh in p gia 2 chn analog) nn trc khi thc hin chuyn i, chng ta cn set cc bit MUX chn knh v ch cn s dng. Bng 3 tm tt cc ch hot ng ca ADC thng qua cc gi tr ca cc bit MUX. Trong bng ny, ng vi cc gi tr t 00000 n 00111 (nh phn), cc knh ADC c chn ch n knh (tn hiu input ly trc tip t cc chn analog v so snh vi 0V), gi tr t 01000 n 11101 tng ng vi ch chuyn i so snh.

92

Bng 3: Chn ch chuyn i.

93

- ADCSRA (ADC Control and Status RegisterA): l thanh ghi chnh iu khin hot ng v cha trng thi ca module ADC.

Tng bit ca thanh ghi ADCSRA c m t nh bn di:

Bit 7 - ADEN(ADC Enable): vit gi tr 1 vo bit ny tc bn cho php module ADC c s dng. Tuy nhin khi ADEN=1 khng c ngha l ADC hot ng ngay, bn cn set mt bit khc ln 1 bt u qu trnh chuyn i, l bit ADSC. Bit 6 - ADSC(ADC Start Conversion): set bit ny ln 1 l bt u khi ng qu trnh chuyn i. Trong sut qu trnh chuyn i, bit ADSC s c gi nguyn gi tr 1, khi qu trnh chuyn i kt thc (t ng), bit ny s c tr v 0. V vy bn khng cn v cng khng nn vit gi tr 0 vo bit ny bt k tnh hung no. thc hin mt chuyn i, thng thng chng ta s set bit ADEN=1 trc v sau set ADSC=1. Bit 4 ADIF(ADC Interrupt Flag): c bo ngt. Khi mt chuyn i kt thc, bit ny t ng c set ln 1, v th ngi dng cn kim tra gi tr bit ny trc khi thc hin c gi tr chuyn i m bo qu trnh chuyn i thc s hon tt. Bit 3 ADIE(ADC Interrupt Enable): bit cho php ngt, nu bit ny c set bng 1 v bit cho php ngt ton cc (bit I trong thanh ghi trng thi ca chip) c set, mt ngt s xy ra khi mt qu trnh chuyn i ADC kt thc v cc gi tr chuyn i c cp nht (cc gi tr chuyn i cha trong 2 thanh ghi ADCL v ADCH). Bit 2:0 ADPS2:0(ADC Prescaler Select Bits): cc bit chn h s chia xung nhp cho ADC. ADC, cng nh tt c cc module khc trn AVR, cn c gi nhp bng mt ngun xung clock. Xung nhp ny c ly t ngun xung chnh ca chip thng qua mt h s chia. Cc bit ADPS cho php ngi dng chn h s chia t ngun clock chnh n ADC. Tham kho bng 4 bit cch chn h s chia.

94

Bng 4: H s chia xung nhp cho ADC.

- ADCL v ADCH (ADC Data Register): 2 thanh ghi cha gi tr ca qu trnh chuyn i. Do module ADC trn AVR c phn gii ti a 10 bits nn cn 2 thanh ghi cha gi tr chuyn i. Tuy nhin tng s bt ca 2 thanh ghi 8 bit l 16, con s ny nhiu hn 10 bit ca kt qu chuyn i, v th chng ta c php chn cch ghi 10 bit kt qu vo 2 thanh ghi ny. Bit ADLAR trong thanh ghi ADMUX quy nh cch m kt qu c ghi vo. ADLAR=0:

ADLAR=1:

Thng thng, 2 thanh ghi data c sp xp theo nh dng ADLAR=0, ADCL cha 8 bit thp v 2 bit thp ca ADCH cha 2 bit cao nht ca gi tr thu c. Ch th t c gi tr t 2 thanh ghi ny, trnh c sai kt qu, bn cn c thanh ghi ADCL trc v ADCH sau, v

95

sau khi ADCH c c, cc thanh ghi data c th c cp nht gi tr tip theo. - SFIOR(Special FunctionIO Register C): thanh ghi chc nng c bit, 3 bit cao trong thanh ghi ny quy nh ngun kch ADC nu ch Auto Trigger c s dng. l cc bit ADTS2:0 (Auto Trigger Source 2:0). Cc loi ngun kch c trnh by trong bng 5.

Bng 5: Ngun kch ADC trong ch Auto Trigger.

2. S dng ADC- Chuyn i n knh. Khi nim n knh c hiu l i lng cn chuyn i l cc in p t trc tip trn cc chn analog ca chip, gi tr in p ny c so snh vi 0V ca chip, hay ni mt cch khc, in p cn chuyn i v chip AVR c mass chung. Chng ta s minh ha cch s dng ADC trn AVR ch n knh bng v d c v hin th gi tr ADC trn cc LED 7 on. Nh minh ha trong hnh 4, chng ta s dng 4 LED hin th 4 ch s ca kt qu, do chng ta u bit ADC trn AVR c phn gii 10 bit nn kt qu chuyn i ti a l 1023, 4 LED l hin th kt qu ny. 4 chip 7447 c dng iu khin 4 LED, chng ta cn 16 ng xut d liu hin th ln 4 LED v th PORTB v PORTC s c dng cho mc ch ny. 4 bit cao ca PORTC(PC4:7) cha ch s hng nghn ca kt qu, 4 bit thp PC0:3 cha ch s hng trm, 4 bit cao ca PORTB(PB4:7) dng xut ch s hng chc v 4 bit PB0:3 dnh cho ch s hng n v. i
96

lng cn chuyn i l in p trn chn ADC0 (knh 0 ca ADC, chn 0 trong PORTA chip ATmega32), in p c to ra bng mt bin tr RV1. Thay i gi tr bin tr, in p ri trn ADC0 thay i v c cp nht trc tip trn cc LED. Gi tr hin th trn LED khng phi l gi tr in p m l gi tr tng i sau khi chuyn i. Trong v d ny, ti s trnh by dng tng qut, vic c ADC v hin th LED c vit trong cc chng trnh con tng ng. Bng cch ny, cc bn c th d dng sa i v m rng v d sau ny.

Hnh 4. c ADC n knh.

97

List 1 trnh by on code minh ha c ADC n knh v hin th kt qu trn LED 7 on. List 1. c ADC n knh v hin th bng LED 7 on.

Ti tm thi chia on chng trnh thnh 4 phn, phn 1 l cc nh ngha (dng 4 n 7), phn 2 l chng trnh con c ADC n knh (dng
98

10 n 14), phn 3 l chng trnh con hin th mt gi tr 4 ch s ln 4 LED 7 on (t dng 17 n 30) v phn 4 l chng trnh chnh. Chng ta s tm hiu theo tng phn. - Phn 1: ba dng 4, 5 v 6 chng ta nh ngha 3 bin i din tn ca 3 mode in p tham chiu c th dng cho ADC. Xem li bng 2 chng ta bit rng in p tham chiu c chn thng qua 2 bit REFS trong thanh ghi ADMUX, c 3 loi in p c th c chn. Bin AREF_MODE tng ng vi trng hp chng ta mun ly in p trn chn AREF lm in p tham chiu, i chiu bng 2 chng ta cn set 2 bit REFS bng 0, v dng 4 #define AREF_MODE 0 thc hin vic ny. Tng t, bin INT_MODE i din cho trng hp in p tham chiu ni 2.56V v c nh ngha cho php set 1 bit REFS ln 1 #define INT_MODE (1<<REFS1)|(1<<REFS0). Bin AVCC_MODE i din trng hp in p tham chiu ly t chn AVCC. Cui cng, bin ADC_VREF_TYPE c nh ngha l bin chn mode m chng ta thc s mun dng cho ADC, trong v d ny ti chn in p tham chiu ly t chn AVCC v th ti nh ngha #define ADC_VREF_TYPE AVCC_MODE. Bit ADC_VREF_TYPE s c gn cho thanh ghi ADMUX khi khi ng ADC trong chng trnh chnh. - Phn 2-chng trnh con c ADC n knh uint16_t read_adc(unsigned char adc_channel): tn chng trnh l read_adc v adc_channel l tham s cn truyn cho chng trnh con, tham s ny l ch s knh mun c (t knh 0 n knh 7). Gi tr tr v l mt s nguyn khng du 16 bit (kiu unsigned int ca C), tuy nhin trong v d ny ti dng kiu d liu uint16_t thay cho unsigned int, uint16_t l mt cch nh ngha kiu d liu nguyn khng du 16 bit ca ring th vin gcc-avr. Dng u tin ca on chng trnh con (dng 11) l khai bo knh mun c bng cch ghp gi tr knh cho thanh ghi ADMUX ADMUX | =adc_channel;. Xem li cu trc thanh ghi ADMUX, trong thanh ghi ny, ngoi cc bit chn ngun in p tham chiu REFS th 5 bit thp MUX4:0 cho php chn knh ADC cn c. Tham kho them bng 3 chng ta thy rng 8 gi tr u tin ca cc bit MUX4:0 (t 00000 n 00111 nh phn) tng ng vi 8 knh n ADC0:7. Chnh s sp xp ny cho php chng ta ghp trc tip gi tr knh mun c vo thanh ghi ADMUX thng qua dng lnh ADMUX |=adc_channel. Chng ta dng php OR | v chng ta ch mun thay i gi tr c bit MUX m khng mun lm nh hng n gi tr cc bit khc trong thanh ghi ADMUX khi chn knh. Mt ch quan trng l gi tr ca tham s adc_channel ch trong khong t 0 n 7 tng ng vi
99

8 ch c n knh ADC trong bng 3. Sau khi knh c chn, dng 12 set bit ADCS trong thanh ghi ADCSRA bt u qu trnh chuyn i ADCSRA|=(1<<ADSC);. Nh cp trong khi kho st chc nng ca bit ADIF trong thanh ghi ADCSRA, sau khi qu trnh chuyn i kt thc bit ADIF s c t ng set ln 1, v th dng code 13 c dng ch cho bit ny ln 1, tc ch cho qu trnh chuyn i kt thc. Cu lnh loop_until_bit_is_set(ADCSRA,ADIF); c hiu l lp cho n khi bit ADIF trong thanh ghi ADCSRA c set ln 1, lnh loop_until_bit_is_set ny c nh ngha sn trong th vin gcc-avr. Nu qu trnh chuyn i kt thc, kt qu chuyn i s c cha trong 2 thanh ghi ADCL v ADCH, 2 thanh ghi ny c t ng gp thnh thanh ghi 16 bit ADCW (ADC WORD), dng 14 return ADCW tr v kt qu chuyn i. - Phn 3-chng trnh con hin th s c 4 ch s ln 4 LED 7 on void LED7_out(uint16_t val) : val l s cn hin th, chng ta khai bo 4 bin tm dvi, chuc, tram, nghin i din cho cc ch s n v, chc, trm v nghn dng 18. ng thi, mt bin tm temp_val c dng lu gi tr tm thi ca s val nh trong dng 19 temp_val=val;, cch lm ny nhm trnh thay i gi tr ca bn thn val trong qu trnh thao tc. Cc dng code t 21 n 26 thc hin qu trnh tch s val ra thnh 4 cc ch s hng n v, chc, trm v nghn. y ch l phng php i s thng thng nn ti s khng gii thch thm cho on ny. Hai dng 28 v 29 xut gi tr ra 4 LED 7 on. Bn LED 7 on c iu khin bi cc IC chuyn m 7447, gi tr input choc cc IC 7447 l cc s BCD 4 bit. V th, xut 4 ch s ra 4 LED thng qua 7447 chng ta cn 4x4=16 bit, trong v d ny ti dng PORTB v PORTC cho nhim v ny. Bn bit cao ca PORTC s cha ch s hng nghn, bn bit thp cha ch s hng trm, bn bit cao ca PORTB cha ch s hng chc v bn bit thp PORTB cha s n v. Dng code 28 PORTB=(chuc<<4)+dvi; xut 2 ch s chc v n v ra PORTB, trong hm chuc<<4 ngha l dch ch s hng chc sang tri 4 v tr a ch s ny ln 4 bit cao ca PORTB, sau cng ch s n v vo 4 bit thp v cui cng l xut ra PORTB. Tng t chng ta c th xut 2 ch s hng nghn v hng trm ra PORTC thng qua dng code 29 PORTC=(nghin<<4)+tram. - Phn 4-chng trnh chnh: do hu ht cc nhim v c thc hin trong cc on chng trnh con nn chng trnh chnh trong v d ny kh n gin. Hai dng code 32 v 33 set cc thng s cho ADC, dng 32 ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); set cc bit trong thanh ghi iu khin ADCSRA, ADC c cho php hot ng bi bit
100

ADEN, cc bit ADPS2:0 chn prescaler xung clock (xem li phn m t thanh ghi ADCSRA), trong v d ny ti chn prescaler = 32 (bn c th chn gi tr khc). Dng 33 ADMUX=ADC_VREF_TYPE; cho php chn in p tham chiu bng cch gn bin ADC_VREF_TYPE m chng ta nh ngha trong dng code 7 cho thanh ghi ADMUX. Bn cn ch l sau khi thc hin 2 dng code ny, ADC ch mi t th sn sng nhng vn cha hot ng, ADC s hot ng khi chng ta gi chng trnh con c adc. Trong vng lp while ca chng trnh chnh chng ta ln lt c gi tr ADC knh 0 bng cch gi chng trnh con read_adc(0) dng lnh 39 ADC_val=read_adc(0); sau hin th ra LED 7 on dng 40 LED7_out(ADC_val); v cui cng l delay 1 khong thi gian nh (100ms) trc khi lp li qu trnh c v hin th. M phng v d: To 1 project bng Programmer Notepad v type on code trn vo file source (xem phn to Project vi WinAVR). Bin dch v chy m phng vi mch in trong hnh 4. iu chnh gi tr bin tr RV1 thay i gi tr in p input ca ADC knh 0 v xem gi tr hin th trn cc LED 7 on. Hy thay i gi tr bin ADC_VREF_TYPE trong dng code 7 sang cc mode khc nh INT_MODE, bin dch v m phng li chng trnh, quan st v so snh s khc nhau gia cc mode in p tham chiu. Bn s d dng nhn thy rng khi chn in p tham chiu ni 2.56V, khi tng bin tr n khong gia th kt qu chuyn i s l 1023(gi tr ln nht ca s 10 bit) v nu tip tc tng bin tr gi tr ny s khng thay i. iu ny c ngha l nu in p input ln hn in p tham chiu th kt qu chuyn i s l 1023. Phn chuyn i ADC ch so snh s c trnh by trong 1 dp khc phn ng dng.

101

You might also like