SU T!M V BIN SO#N B%I NTINSIDE Ntinside 3 Bi 1 - Lm quen AVR
I. Gi-i thi0u. AVR l m*t h- vi .i/u khi1n do hng Atmel s2n xu5t (Atmel c7ng l nh s2n xu5t dng vi .i/u khi1n 89C51 m c th1 b:n . t;ng nghe .>n). AVR l chip vi .i/u khi1n 8 bits v?i c5u trc tAp lBnh .@n gi2n ha-RISC(Reduced Instruction Set Computer), m*t ki1u c5u trc .ang th1 hiBn <u th> trong cc b* xC l. T3i sao AVR: so v?i cc chip vi .i/u khi1n 8 bits khc, AVR c nhi/u .Dc tnh h@n hFn, h@n c2 trong tnh Gng dHng (dI sC dHng) v .Dc biBt l v/ chGc nKng: GLn nh< chng ta khng cLn mMc thm b5t kN linh kiBn phH no khi sC dHng AVR, thAm ch khng cLn nguPn t:o xung clock cho chip (th<Qng l cc khRi th:ch anh). Thi>t bS lAp trnh (m:ch n:p) cho AVR r5t .@n gi2n, c lo:i m:ch n:p chU cLn vi .iBn trW l c th1 lm .<Xc. m*t sR AVR cn hY trX lAp trnh on chip bZng bootloader khng cLn m:ch n:p Bn c:nh lAp trnh bZng ASM, c5u trc AVR .<Xc thi>t k> t<@ng thch C. NguPn ti nguyn v/ source code, ti liBu, application noter5t l?n trn internet. HLu h>t cc chip AVR c nh[ng tnh nKng (features) sau: C th1 sC dHng xung clock ln .>n 16MHz, hoDc sC dHng xung clock n*i ln .>n 8 MHz (sai sR 3%) B* nh? ch<@ng trnh Flash c th1 lAp trnh l:i r5t nhi/u lLn v dung l<Xng l?n, c SRAM (Ram t\nh) l?n, v .Dc biBt c b* nh? l<u tr[ lAp trnh .<Xc EEPROM. B* nh? ch<@ng trnh Flash c th1 lAp trnh l:i r5t nhi/u lLn v dung l<Xng l?n, c SRAM (Ram t\nh) l?n, v .Dc biBt c b* nh? l<u tr[ lAp trnh .<Xc EEPROM. Nhi/u ng vo ra (I/O PORT) 2 h<?ng (bi-directional). 8 bits, 16 bits timer/counter tch hXp PWM. Cc b* chuy1n .Ri Analog Digital phn gi2i 10 bits, nhi/u knh. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 4 ChGc nKng Analog comparator. Giao diBn nRi ti>p USART (t<@ng thch chu]n nRi ti>p RS- 232). Giao diBn nRi ti>p Two Wire Serial (t<@ng thch chu]n I2C) Master v Slaver. Giao diBn nRi ti>p Serial Peripheral Interface (SPI) ... M*t sR chip AVR thng dHng: AT90S1200 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 vi>t ny ti sC dHng chip ATmega8 .1 lm v dH, ti ch-n ATmega8 v .y l lo:i chip thu*c dng AVR m?i nh5t, n c .Ly .^ cc SU T!M V BIN SO#N B%I NTINSIDE Ntinside 5 tnh nKng c^a AVR nh<ng l:i nh_ g-n (gi PDIP c 28 chn) v low cost nn cc b:n c th1 mua .1 t` mnh t:o Gng dHng. T3i sao Assembly (ASM): b:n c th1 khng cLn bi>t v/ c5u trc c^a AVR van c th1 lAp trnh cho AVR bZng cc phLn m/m hY trX ngn ng[ c5p cao nh< BascomAVR (Basic) hay CodevisionAVR (C), tuy nhin . khng ph2i l mHc .ch c^a bi vi>t ny. b1 hi1u th5u .o v/ AVR b:n ph2i lAp trnh bZng chnh ngn ng[ c^a n, ASM. Nh< vAy lAp trnh bZng ASM gip b:n hi1u t<Qng tAn v/ AVR, v t5t nhin .1 lAp trnh .<Xc bZng ASM b:n ph2i hi1u v/ c5u trc AVR.M*t l do khc b:n m ti khuyn b:n nn lAp trnh bZng ASM l cc trnh dSch (compiler) ASM cho AVR l hon ton miIn ph, v nguPn source code cho AVR vi>t bZng ASM l r5t l?n. Tuy nhin m*t khi b:n . thnh th:o AVR v ASM b:n c th1 sC dHng cc ngn ng[ c5p cao nh< C .1 vi>t Gng dHng v <u .i1m c^a ngn ng[ c5p cao l gip b:n dI dng th`c hiBn cc php ton .:i sR 16 hay 32 bit (vRn l v5n ./ kh khKn khi lAp trnh bZng ASM). II. Cng c5. Trnh bin d7ch: c r5t nhi/u trnh bin dSch b:n c th1 sC dHng .> bin dSch code c^a b:n thnh file intel hex .1 n:p vo chip, m*t sR trnh dSch quen thu*c c th1 k1 .>n nh< sau: AvrStudio: l trnh bin dSch ASM chnh thGc cung c5p bWi Atmel, .y l trnh bin dSch hon ton miIn ph v t5t nhin l tRt nh5t cho lAp trnh AVR bZng ASM. Phin b2n hiBn t:i l 4.18 SP1, b:n c th1 download phLn m/m AvrStudio t:itrang web chnh thGc c^a Atmel hoDc b2n 4.623 t:i .y. Wavrasm: c7ng .<Xc cung c5p bWi Atmel, n chnh l ti/n thn c^a AvrStudio. HiBn t:i wavrasm khng cn .<Xc sC dHng nhi/u v so v?i AvrStudio trnh bin dSch ny c nhi/u h:ng ch>, n>u b:n quan tm c th1 download t:i .y. WinAVR hay avr-gcc: l b* trnh dSch .<Xc pht tri1n bWi gnu, ngn ng[ sC dHng l C v c th1 .<Xc dng tch hXp v?i AvrStudio (dng Avrstudio lm trnh bin tAp editor). bDc biBt b* bin dSch ny c7ng miIn ph v .a sR nguPn source code C .<Xc vi>t bZng b* ny, v vAy n r5t l t<Wng cho b:n khi vi>t cc Gng dHng chuyn nghiBp. ViBc lAp trnh bZng avrgcc ti sc ./ cAp trong nh[ng phLn sau. CodeVisionAvr: m*t ch<@ng trnh bZng ngn ng[ C r5t hay cho AVR, hY trX nhi/u th< viBn lAp trnh. Tuy nhin l ch<@ng trnh th<@ng m:i. B:n c th1 download b2n demo (.Ly .^ chGc nKng nh<ng nh<ng gi?i h:n dung l<Xng b* nh? ch<@ng trnh 2KB) t:i Website hpinfotech ICCAVR: lAp trnh C cho avr, download b2n demo. BascomAVR: lAp trnh cho AVR bZng basic, .y l trnh bin dSch kh hay v dI sC dHng, hY trX r5t nhi/u th< viBn. Tuy nhin r5t kh debug lYi v khng thch hXp cho viBc tm hi1u AVR. V vAy ti khng b:n khuy>n khch b:n sC dHng trnh dSch ny. B:n c th1 download b2n demo (4K limit). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 6 V cn r5t nhi/u trnh bin dSch khc cho AVR m ti khng k1 ra .y, nhn chung t5t c2 cc trnh bin dSch ny hY trX C hoDc Basic hoDc thAm ch Pascal. ViBc ch-n 1 trnh bin dSch ty thu*c vo mHc .ch, vo mGc .* Gng dHng, vo kinh nghiBm sC dHng v nhi/u l do khc n[a. V dH ti th<Qng dng Avrstudio v avrgcc khi h-c sC dHng AVR v khi vi>t th< viBn. Nh<ng khi cLn vi>t ch<@ng trnh Gng dHng ti th<Qng ch-n avrgcc v CodeVisionAVR. Trong bi vi>t ny ti h<?ng dan b:n sC dHng AvrStudio .1 vi>t ch<@ng trnh cho AVR bZng ASM. Ch9.ng trnh n3p (Chip Programmer): .a sR cc trnh bin dSch (AvrStudio, CodeVisionAVR, Bascom) ./u tch hXp sdn 1 ch<@ng trnh n:p chip hY trX nhi/u lo:i m:ch n:p nn b:n khng qu lo lMng. Trong tr<Qng hXp khc, b:n c th1 sC dHng cc ch<@ng trnh n:p nh< Icprog hay Ponyprogl cc ch<@ng trnh n:p miIn ph cho AVR. ViBc ch-n v sC dHng ch<@ng trnh n:p sc .<Xc gi?i thiBu trong cc bi sau. M3ch n3p: tham kh2o bi vi>t gi?i thiBu m:ch n:p AVR. Ch9.ng trnh m ph:ng: avr simulator l trnh m ph_ng v debbug .<Xc tch hXp sdn trong Avrstudio, avr simulator cho php b:n quan st tr:ng thi cc thanh ghi bn trong AVR nn r5t ph hXp .1 b:n debug ch<@ng trnh. Proteus l ch<@ng trnh thG hai ti muRn ni .>n, Proteus khng nh[ng m ph_ng ho:t .*ng bn trong chip m cn m ph_ng m:ch .iBn tC. Proteus m ph_ng r5t tr`c quan, n l 1 cng cH h[u ch khi cc b:n ch<a c .i/u kiBn lm cc m:ch .iBn tC. III. V d5 =>u tin c?a b3n. Sau khi download AvrStudio, b:n hy ci .Kt phLn m/m trn my c^a b:n, qu trnh ci .Dt r5t .@n gi2n, b:n hy theo cc mDc .Snh v nh5n next .1 ci .Dt. Trong bi .Lu tin ny chng ta sc vi>t thC 1 ch<@ng trnh .@n gi2n cho AVR sau . ch:y m ph_ng bZng Proteus. C th1 c m*t sR cu lBnh cc b:n sc khng hi1u, nh<ng .;ng lo lMng qu, trong bi thG 2 chng ta sc h-c v/ c5u trc AVR cc b:n sc .<Xc gi2i thich r h@n. b1 th`c hiBn v dH ny, b:n hy t:o m*t Project bZng AVRStudio, phLn h<?ng dan chi ti>t cho viBc t:o Project trong AVRStudio b:n hy tham kh2o W bi h<?ng dan AVRStudio.bo:n code v dH trong bi .Lu tin ny .<Xc trnh by trong List1. List 1. bo:n code .Lu tin c^a b:n. 1 2 .CSEG .INCLUDE "M8DEF.INC" SU T!M V BIN SO#N B%I NTINSIDE Ntinside 7 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 39 40 41 .ORG 0x000 RJMP BATDAU
.ORG 0x020 BATDAU: ; KHOI TAO CAC DIEU KIEN DAU LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 LDI R16, 0xFF; OUT DDRB, R16
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 8 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 LDI R16, 0B01000000 OUT PORTB, R16 RCALL DELAY
LDI R16, 0B10000000 OUT PORTB, R16 RCALL DELAY
RJMP MAIN ; CHUONG TRING CON DELAY 65535 chu ky (khoang 65535us neu xung ;clock cho chip la 1M) DELAY: LDI R20, 0xFF DELAY0: LDI R21, 0xFF DELAY1: DEC R21 BRNE DELAY1 DEC R20 BRNE DELAY0 RET Tr<?c khi tm hi1u ngh\a .o:n code, hy nhn 1 l<Xt qua .o:n code. Tr<?c h>t viBc vi>t HOA hay vi>t th<Qng l khng quan tr-ng, b:n c th1 vi>t .o:n code v?i b5t cG hnh thGc no miIn .ng c php, t; kha l .<Xc. Trong .o:n code: B:n th5y 1 sR t; c mu BLUE (v dH LDI, OUT, RJMP, RCALL, RET). l cc INSTRUCTiON, tGc l cc cu lBnh c^a ngn ng[ ASM, b:n c th1 .-c ti liBu AVR INSTRUCTION .1 tm hi1u t5t c2 cc INSTRUCTION. Cc INSTRUCTION sau . sc .<Xc trnh dSch dSch thnh cc m t<@ng Gng. M*t sR t; bMt .Lu bZng bZng d5u ch5m . l cc DIRECTIVE (v dH .INCLUDE hay .ORG ). c7ng l nh[ng t; kha mDc .Snh c^a ASM AVR, cc DIRECTIVE khng ph2i l m lBnh m chU l cc chU dan v/ .Sa chU b* nh?, khWi .*ng b* nh?, .Snh ngh\a macrov khng .<Xc trnh dSch dSch thnh m. Chi ti>t v/ DIRECTIVE c th1 tm th5y trong cc ti liBu v/ ASM AVR, d<?i .y ti tm tMt cc DIRECTIVE v chGc nKng c^a chng nh< sau: SU T!M V BIN SO#N B%I NTINSIDE Ntinside 9
Thng th<Qng 1 INSTRUCTION .<Xc theo sau bWi 2 ton h:ng operand (tuy nhin c nhi/u tr<Qng hXp chU c 1 ton h:ng hoDc khng c ton h:ng), khi . ton h:ng thG nh5t sc l cc THANH GHI. c^a AVR (nh< . ./ cAp, chng ta sc kh2o st thanh ghi AVR trong cc bi sau), v dH : LDI R16, 0xFF; trong . ton h:ng R16 l tn 1 thanh ghi trong AVR, v 0xFF l 1 hZng sR d:ng hexadecimal c gi trS t<@ng Gng l 255 d:ng thAp phn hay 11111111 nhS phn. Cc t; theo sau bWi d5u : l cc nhn label (v dH MAIN, DELAY), . l t; do chng ta t` .Dt, n th`c ch5t l 1 vS tr trong b* nh? ch<@ng trnh, c th1 sC dHng nhn nh< 1 ch<@ng trnh con. PhLn .i sau d5u ; g-i l gi2i thch comment, phLn ny khng .<Xc bin dSch, b:n c th1 ghi comment W b5t cG .u trong ch<@ng trnh v?i yu cLu ph2i sC dHng d5u ; tr<?c n. Gi@i thch =o3n code:c th1 chia .o:n code trn thnh 4 phLn: phLn .Lu chGa cc DIRECTIVE v lBnh RJMP dng .1 xc .Snh cc .Sa chU b* nh? ch<@ng trnh, phLn 2 l khWi t:o m*t sR .i/u kiBn .Lu cho Stack Pointer v PORT, phLn 3 l ch<@ng trnh chnh, v phLn 4 l ch<@ng trnh con ( ch .y chU l cch bR tr c^a ring ti, m*t khi . quen thu*c, b:n c th1 bR tr ch<@ng trnh theo cch ring c^a b:n). PhLn 1 v phLn 2: .CSEG ChU thS .CSEG: Code Segment bo cho trnh bin dSch rZng phLn code theo sau l phLn ch<@ng trnh th`c thi, phLn ny sc .<Xc download vo b* nh? ch<@ng trnh c^a chip. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 10 .INCLUDE "M8DEF.INC" ChU thS .INCLUDE bo cho trnh bin dSch bMt .Lu .-c 1 file .nh km, trong tr<Qng hXp trn l file M8DEF.INC, .y l file chGa cc khai bo cho chip Atmega8 nh< thanh ghi, ngMtcho viBc truy xu5t trong ch<@ng trnh c^a b:n, .y l dng bMt bu*c, n>u b:n lAp trnh cho chip khc b:n hy .ei tn file .nh km, v dH m32def.inc cho chip ATmega32 b:n c th1 tm th5y cc file ny trong th< mHc C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes. .ORG 0x000 ChU thS .ORG: Set Program Origin, set vS tr trong b* nh? sc .<Xc tc .*ng .>n, trong tr<Qng hXp trn, .ORG 0x000 xc .Snh phLn code theo ngay sau sc nZm W .Sa chU 000, vS tr .Lu tin, trong b* nh? ch<@ng trnh. V dng lnh trong vS tr .Lu tin . l: RJMP BATDAU RJMP: Relative Jump l lBnh nh2y khng .i/u kiBn .>n 1 vS tr trong b* nh?, trong tr<Qng hXp trn l nh2y .>n nhn BATDAU, v nhn BATDAU nZm W vS tr 0x020 (sR hexadecimal, 0x020 =32 decimal) v n .<Xc khai bo ngay sau DIRECTIVE .ORG 0x020. .ORG 0x020 BATDAU Nh< th> phLn b* nh? ch<@ng trnh nZm gi[a 0 v 0x020 khng .<Xc sC dHng trong .o:n code c^a chng ta, phLn ny .<Xc sC dHng cho mHc .ch khc, . l cc vect@ ngMt ( khng .<Xc ./ cAp W .y). Ti>p theo: ; KHOI TAO CC DIEU KIEN DAU LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 BRn dng code trn khWi t:o cho Stack Pointer, chng ta sc tm hi1u phLn ny trong cc bi v/ Stack v ch<@ng trnh con. LAi khuyn: cc b3n nn khCi =Dng 1 ch9.ng trnh theo cch trn v chng ta sE hiGu chng r h.n sau ny ! LDI R16, 0xFF OUT DDRB, R16 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 11 B:n ch 2 dng trn v nh[ng g ti gi2i thch sau .y, 2 dng ny c tc dHng khWi .*ng PORTB c^a chip ATmega8 tc dHng nh< cc ng xu5t tn hiBu (OUTPUT). Tr<?c h>t hy quan st chip ATmega8 trong hnh sau
Hnh 1: chip ATmega8. B:n c th1 th5y chip ny gPm 28 chn, trng . c cc chn .<Xc ghi l PB0(chn 14), PB1(chn 15),,PB7(chn 10), . l cc chn c^a PORTB. PORT l khi niBm chU cc ng xu5t nhAp. Trong AVR, PORT c th1 giao ti>p theo 2 h<?ng (bi directional), c th1 dng .1 xu5t hoDc nhAn thng tin, mYi PORT c 8 chn. Chip Atmega8 c 3 PORT c tn t<@ng Gng l PORTB, PORTC v PORTD (m*t sR chip AVR khc c 4 hoDc 6 PORT). PORT .<Xc coi l cCa ng then chRt c^a vi .i/u khi1n. Trong AVR, mYi PORT lin quan .>n 3 thanh ghi (8 bits) c tn t<@ng Gng l DDRx, PINx, v PORTx v?i x l tn c^a PORT, mYi bit trong thanh ghi t<@ng Gng v?i mYi chn c^a PORT. Trong tr<Qng hXp c^a Atmega8 x l B, C hoDc D. V dH chng ta quan tm .>n PORTB th 3 thanh ghi t<@ng Gng c tn l DDRB, PINB v PORTB, trong . 2 thanh ghi PORTB v PINB .<Xc nRi tr`c ti>p v?i cc chn c^a PORTB, DDRB l thanh ghi .i/u khi1n h<?ng ( Input hoDc Output). Vi>t gi trS 1 vo m*t bit trong thanh ghi DDRB th chn t<@ng Gng c^a PORTB sc l chn xu5t (Output), ng<Xc l:i gi trS 0 xc lAp chn t<@ng Gng l ng nhAp. Sau khi vi>t gi trS .i/u khi1n vo DDRB, viBc truy xu5t PORTB .<Xc th`c hiBn thng qua 2 thanh ghi PINB v PORTB. Quay l:i v?i 2 dng code c^a chng ta, dng .Lu: LDI R16, 0xFF, v?i LDI LoaD Immediately, dng lBnh c ngh\a l load gi trS 0xFF vo thanh ghi R16, R16 l tn 1 thanh ghi trong b* nh? c^a AVR, 0xFF l 1 hZng sR c d:ng thAp lHc phn, k hiBu 0x ni ln .i/u ., b:n c7ng c th1 dng k hiBu khc l $ .1 chU 1 sR thAp lHc phn, v dH &FF, v 0xFF=255(thAp phn)=0B11111111 (nhS phn). Nh< th> sau dng .Lu thanh ghi R16 c gi trS l 11111111 (nhS phn). Dng thG 2: OUT DDRB, R16 ngh\a l xu5t gi trS t; thanh ghi R16 ra thanh ghi DDRB, tm l:i sau 2 dng trn gi trS DDRB nh< sau: 1 1 1 1 1 1 1 1 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 12 C th1 b:n sc h_i t2i sao chng khng sC dHng 1 dng duy nh5t l LDI DDRB, 0xFF hay OUT DDRB, 0xFF, chng ta khng th1 v lBnh LDI chU cho php th`c hiBn trn cc thanh ghi R16,R31 v lBnh OUT khng th`c hiBn .<Xc v?i cc hZng sR. V v DDRB=11111111 nn trong tr<Qng hXp ny t5t c2 cc chn c^a PORTB . sdn sng cho viBc xu5t d[ liBu. Lc ny thanh ghi PINB khng c tc dHng, thanh ghi PORTB sc l thanh ghi xu5t, ghi gi trS vo thanh ghi ny sc tc .*ng .>n cc chn c^a PORTB.1 PhLn 3: Ch<@ng trnh chnh MAIN: LDI R16, 0B00000001 OUT PORTB, R16 RCALL DELAY B:n chU cLn ch 4 dng trn trong ton b* phLn ch<@ng trnh chnh, tr<?c h>t MAIN: chU l 1 nhn do chng ta t` .Dt tn, giRng nh< 1 c*t mRc trong ch<@ng trnh thi. Dng LDI R16, 0B00000001 th b:n . hi1u, chU c 1 khc biBt nh_ l ti sC dHng hZng sR d:ng nhS phn cho b:n dI hi1u h@n. V dng OUT PORTB, R16 .1 xu5t gi trS 0B00000001 c sdn trong R16 ra thanh ghi PORTB, lc ny chn PB0 c^a chip sc ln 1 (5V) v cc chn cn l:i sc W mGc 0 (0V). Dng thG 3: RCALL DELAY l lBnh g-i ch<@ng trnh con DELAY, t:m hon tr<?c khi th`c hiBn cc dng lBnh ti>p theo: LDI R16, 0B00000010 OUT PORTB, R16 RCALL DELAY Ba dng lBnh ny c7ng giRng ba dng trn, nh<ng gi trS xu5t ra lc ny l 0B00000010, chn PB1 sc ln 5V v cc chn khc xuRng mGc 0V. V cG nh< th> .>n .o:n cuRi: LDI R16, 0B10000000 OUT PORTB, R16 RCALL DELAY RJMP MAIN Sau khi k>t thGc 3 dng trn chn PB7 sc ln 5V, k>t thc 1 vng xoay. CuRi cng l quay v> .Lu ch<@ng trnh chnh bZng dng RJMP MAIN By giQ chMc b:n . .on .<Xc ch<@ng trnh c^a chng ta th`c hiBn viBc g, . l qut xoay vng cc chn c^a PORTB, n>u chng ta k>t nRi cc chn c^a PORTB v?i cc LED, chng ta sc c 1 hiBu Gng qut LED xoay vng, chng ta th`c hiBn .i/u ny bZng phLn m/m Proteus. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 13 PhLn 4: ch<@ng trinh con DELAY: .o:n ch<@ng trnh ny khng lm g c2 ngoi viBc tr hon 1 kho2ng thQi gian, tuy nhin b:n ch<a th1 hi1u n ngay .<Xc. by chU l 1 v dH .@n gi2n, ti cR gMng th`c hiBn n theo cch dI hi1u nh5t cho b:n, v th> .o:n code c vf h@i di dng, b:n hy th`c hiBn l:i .o:n ch<@ng trnh chnh bZng .o:n code c^a b:n. Ph>n cuIi cng l bin d7ch =o3n code thnh file intel hex =G =K vo chip, nhLn phm F7 =G bin d7ch. Sau khi bin dSch b:n sc c 1 file tn avr1.hex trong th<c mHc project, chng ta sc dng file ny .e vo chip sau ny. IV. M ph:ng bMng Proteus. Chng ta hy thC nghiBm .o:n ch<@ng trnh c^a chng ta bZng Proteus. N>u b:n th`c hiBn .ng k>t qu2 sc nh< minh h-a trong hnh 2 H<?ng dan cH th1 cch vc m:ch .iBn v m ph_ng bZng phLn m/m Proteus b:n hy xem bi "M ph_ng Proteus".
Hnh 2. M ph_ng.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 14 Bi 2 - Cu Trc AVR
I. Gi-i thi0u. Bi ny ti>p tHc bi .Lu tin trong lo:t bi gi?i thiBu v/ AVR, n>u sau bi "Lm quen AVR" b:n . phLn no bi>t cch lAp trnh cho AVR bZng AVRStudio th trong bi ny, chng ta sc tm hi1u kg h@n v/ c5u trc c^a AVR. Sau bi ny, b:n sc: Hi1u .<Xc c5u trc AVR, c5u trc b* nh? v cch thGc ho:t .*ng c^a chip. Hi1u v/ Stack v cch ho:t .*ng. Bi>t .<Xc m*t sR instruction c@ b2n truy xu5t b* nh?. H-c cc instruction rc nhnh v vng lDp. Ch<@ng trnh con (Subroutine) v Macro. C2i ti>n v dH trong bi 1. Vi>t 1 v dH minh h-a cch sC dHng b* nh? v vng lDp. II. TK chOc c?a AVR. AVR c c5u trc Harvard, trong . .<Qng truy/n cho b* nh? d[ liBu (data memory bus) v .<Qng truy/n cho b* nh? ch<@ng trnh (program memory bus) .<Xc tch ring. Data memory bus chU c 8 bit v .<Xc k>t nRi v?i hLu h>t cc thi>t bS ngo:i vi, v?i register file. Trong khi . program memory bus c .* r*ng 16 bits v chU phHc vH cho instruction registers. Hnh 1 m t2 c5u trc b* nh? c^a AVR. BD nh- ch9.ng trnh (Program memory): L b* nh? Flash lAp trnh .<Xc, trong cc chip AVR c7 (nh< AT90S1200 hay AT90S2313) b* nh? ch<@ng trnh chU gPm 1 phLn l Application Flash Section nh<ng trong cc chip AVR m?i chng ta c thm phLn Boot Flash setion. Boot section sc .<Xc kh2o st trong cc phLn sau, trong bi ny khi ni v/ b* nh? ch<@ng trnh, chng ta t` hi1u l Application section. Th`c ch5t, application section bao gPm 2 phLn: phLn chGa cc instruction (m lBnh cho ho:t .*ng c^a chip) v phLn chGa cc vector ngMt (interrupt vectors). Cc vector ngMt nZm W phLn .Lu c^a application section (t; .Sa chU 0x0000) v di .>n bao nhiu ty thu*c vo lo:i chip. PhLn chGa instruction nZm li/n sau ., ch<@ng trnh vi>t cho chip ph2i .<Xc load vo phLn ny. Xem l:i phLn .Lu c^a v dH trong bi 1: SU T!M V BIN SO#N B%I NTINSIDE Ntinside 15 .ORG 0x000 RJMP BATDAU .ORG 0x020 Trong v dH ny, ngay sau khi set vS tr 0x000 bZng chU thS (DIRECTIVE) .ORG 0x000 chng ta dng instruction RJMP .1 nh2y .>n vS tr 0x020, nh< th> phLn b* nh? ch<@ng trnh t; 0x00 .>n 0x01F khng .<Xc sC dHng (v trong v dH ny chng ta khng sC dHng cc vector ngMt). Ch<@ng trnh chnh .<Xc bMt .Lu t; .Sa chU 0x020, con sR 0x020 l do ng<Qi lAp trnh ch-n, thAt ra cc vector ngMt c^a chip ATMEGA8 chU ko di .>n .Sa chU 0x012, v vAy ch<@ng trnh chnh c th1 .<Xc bMt .Lu t; b5t cG vS tr no sau .. b1 bi>t .* di cc vector ngMt c^a t;ng chip b:n hy tham kh2o datasheet c^a chip .. V chGc nKng chnh c^a b* nh? ch<@ng trnh l chGa instruction, chng ta khng c nhi/u c@ h*i tc .*ng ln b* nh? ny khi lAp trnh cho chip, v th> .Ri v?i ng<Qi lAp trnh AVR, b* nh? ny khng qu quan tr-ng. T5t c2 cc thanh ghi quan tr-ng cLn kh2o st nZm trong b* nh? d[ liBu c^a chip.
Hnh 1. Te chGc b* nh? c^a AVR. BD nh- dP li0u (data memory): by l phLn chGa cc thanh ghi quan tr-ng nh5t c^a chip, viBc lAp trnh cho chip phLn l?n l truy cAp b* nh? ny. B* nh? d[ liBu trn cc chip AVR c .* l?n khc nhau ty theo mYi chip, tuy nhin v/ c@ b2n phLn b* nh? ny .<Xc chia thnh 5 phLn: Ph>n 1: l phLn .Lu tin trong b* nh? d[ liBu, nh< m t2 trong hnh 1, phLn ny bao gPm 32 thanh ghi c tn g-i l register file (RF), hay General SU T!M V BIN SO#N B%I NTINSIDE Ntinside 16 Purpose Rgegister GPR, hoDc .@n gi2n l cc Thanh ghi. T5t c2 cc thanh ghi ny ./u l cc thanh ghi 8 bits nh< trong hnh 2.
Hnh 2. Thanh ghi 8 bits. T5t c2 cc chip trong h- AVR ./u bao gPm 32 thanh ghi Register File c .Sa chU tuyBt .Ri t; 0x0000 .>n 0x001F. MYi thanh ghi c th1 chGa gi trS d<@ng t; 0 .>n 255 hoDc cc gi trS c d5u t; -128 .>n 127 hoDc m ASCII c^a m*t k t` no .Cc thanh ghi ny .<Xc .Dt tn theo thG t` l R0 .>n R31. Chng .<Xc chia thnh 2 phLn, phLn 1 bao gPm cc thanh ghi t; R0 .>n R15 v phLn 2 l cc thanh ghi R16 .>n R31. Cc thanh ghi ny c cc .Dc .i1m sau: b<Xc truy cAp tr`c ti>p trong cc instruction. Cc ton tC, php ton th`c hiBn trn cc thanh ghi ny chU cLn 1 chu kN xung clock. Register File .<Xc k>t nRi tr`c ti>p v?i b* xC l trung tm CPU c^a chip. Chng l nguPn chGa cc sR h:ng trong cc php ton v c7ng l .ch chGa k>t qu2 tr2 l:i c^a php ton. b1 minh h-a, hy xt v dH th`c hiBn php c*ng 2 thanh ghi bZng instruction ADD nh< sau: ADD R1, R2 B:n th5y trong dng lBnh trn, 2 thanh ghi R1 v R2 .<Xc sC dHng tr`c ti>p v?i tn c^a chng, dng lBnh trn khi .<Xc dSch sang opcode .1 download vo chip sc c d:ng: 0000110000010010 trong . 00001=1 tGc thanh ghi R1 v 00010 = 2 chU thanh ghi R2. Sau php c*ng, k>t qu2 sc .<Xc l<u vo thanh ghi R1. T5t c2 cc instruction sC dHng RF lm ton h:ng ./u c th1 truy nhAp t5t c2 cc RF m*t cch tr`c ti>p trong 1 chu kN xung clock, ngo:i tr; SBCI, SUBI, CPI, ANDI v LDI, cc instruction ny chU c th1 truy nhAp cc thanh ghi t; R16 .>n R31. Thanh ghi R0 l thanh ghi duy nh5t .<Xc sC dHng trong instruction LPM (Load Program Memory). Cc thanh ghi R26, R27, R28, R29, R30 v R31 ngoi chGc nKng thng th<Qng cn .<Xc sC dHng nh< cc con tr_ (Pointer register) trong m*t sR instruction truy xu5t gin ti>p. Chng ta sc kh2o st v5n ./ con tr_ sau ny. Hnh 3 m t2 cc chGc nKng phH c^a cc thanh ghi. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 17
Hnh 3. Register file. Tm l:i 32 RF c^a AVR .<Xc xem l 1 phLn c^a CPU, v th> chng .<Xc CPU sC dHng tr`c ti>p v nhanh chng, .1 g-i cc thanh ghi ny, chng ta khng cLn g-i .Sa chU m chU cLn g-i tr`c ti>p tn c^a chng. RF th<Qng .<Xc sC dHng nh< cc ton h:ng (operand) c^a cc php ton trong lc lAp trnh. Ph>n 2: l phLn nZm ngay sau register file, phLn ny bao gPm 64 thanh ghi .<Xc g-i l 64 thanh ghi nhAp/xu5t (64 I/O register) hay cn g-i l vng nh? I/O (I/O Memory). Vng nh? I/O l cCa ng giao ti>p gi[a CPU v thi>t bS ngo:i vi. T5t c2 cc thanh ghi .i/u khi1n, tr:ng thic^a thi>t bS ngo:i vi ./u nZm W .y. Xem l:i v dH trong bi 1, trong . ti c ./ cAp v/ viBc .i/u khi1n cc PORT c^a AVR, mYi PORT lin quan .>n 3 thanh ghi DDRx, PORTx v PINx, t5t c2 3 thanh ghi ny ./u nZm trong vng nh? I/O. Xa h@n, n>u muRn truy xu5t cc thi>t bS ngo:i vi khc nh< Timer, chuy1n .ei Analog/Digital, giao ti>p USART./u th`c hiBn thng qua viBc .i/u khi1n cc thanh ghi trong vng nh? ny. Vng nh I/O c th# '()c truy c+p nh( SRAM hay nh( cc thanh ghi I/O. N-u s/ d1ng instruction truy xu3t SRAM '# truy xu3t vng nh ny th '4a ch6 c8a chng '()c tnh t9 0x0020 '-n 0x005F. Nh(ng n-u truy xu3t nh( cc thanh ghi I/O th '4a ch6 c8a chng ';!c tnh t9 0x0000 '-n 0x003F. Xt v dH instruction OUT dng xu5t gi trS ra cc thanh ghi I/O, lBnh ny sC dHng .Sa chU ki1u thanh ghi, c5u trc c^a lBnh nh< sau: OUT A, Rr, trong . A l .Sa chU c^a thanh ghi trong vng nh? I/O, Rr l thanh ghi RF, lBnh OUT xu5t gi trS t; thanh ghi Rr ra thanh ghi I/O c .Sa chU l A. Gi2 sC chng ta muRn xu5t gi trS chGa trong R6 ra thanh ghi .i/u khi1n h<?ng c^a PORTD, tGc thanh ghi DDRD, .Sa chU tnh theo vng I/O c^a thanh ghi DDRD l 0x0011, nh< th> cu lBnh c^a chng ta sc c d:ng: OUT 0x0011, R6. Tuy nhin trong 1 tr<Qng hXp khc, n>u muRn truy xu5t DDRD theo d:ng SRAM, v dH lBnh STS hay LDS, th ph2i dng .Sa chU tuyBt .Ri c^a thanh ghi ny, tGc gi trS 0x0031, khi . lBnh OUT W trn .<Xc vi>t l:i l STS 0x0031, R6. <# th>ng nh3t cch s/ d1ng t9 ng@, t9 by giB chng ta dng khi niCm '4a ch6 I/O cho cc thanh ghi trong vng nh I/O '# ni '-n '4a ch6 khng tnh phDn Register File, khi niCm '4a ch6 bE nh c8a thanh ghi l ch6 '4a ch6 tuyCt '>i c8a chng trong SRAM. V d1 thanh ghi DDRD c '4a ch6 I/O l 0x0011 v '4a ch6 bE nh c8a n l 0x0031, '4a ch6 bE nh = '4a ch6 I/O + 0x0020. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 18 V cc thanh ghi trong vng I/O khng .<Xc hi1u theo tn g-i nh< cc Register file, khi lAp trnh cho cc thanh ghi ny, ng<Qi lAp trnh cLn nh? .Sa chU c^a t;ng thanh ghi, .y l viBc t<@ng .Ri kh khKn. Tuy nhin, trong hLu h>t cc phLn m/m lAp trnh cho AVR, .Sa chU c^a t5t c2 cc thanh ghi trong vng I/O ./u .<Xc .Snh ngh\a tr<?c trong 1 file Definition, b:n chU cLn .nh km file ny vo ch<@ng trnh c^a b:n l c th1 truy xu5t cc thanh ghi v?i tn g-i c^a chng. Gi2 sC trong v dH W bi 1, .1 lAp trnh cho chip Atmega8 bZng AVRStudio, dng thG 2 chng ta sC dHng INCLUDE "M8DEF.INC" .1 load file .Snh ngh\a cho chip ATMega8, file M8DEF.INC. V vAy, trong sau ny khi muRn sC dHng thanh ghi DDRD b:n chU cLn g-i tn c^a chng, nh<: OUT DDRD,R6. Ph>n 3: RAM t\nh, n*i (internal SRAM), l vng khng gian cho chGa cc bi>n (t:m thQi hoDc ton cHc) trong lc th`c thi ch<@ng trnh, vng ny t<@ng t` cc thanh RAM trong my tnh nh<ng c dung l<Xng kh nh_ (kho2ng vi KB, ty thu*c vo lo:i chip). Ph>n 4: RAM ngo:i (external SRAM), cc chip AVR cho php ng<Qi sC dHng gMn thm cc b* nh? ngoi .1 chGa bi>n, vng ny th`c ch5t chU tPn t:i khi no ng<Qi sC dHng gMn thm b* nh? ngoi vo chip. Ph>n 5: EEPROM (Electrically Ereasable Programmable ROM) l m*t phLn quan tr-ng c^a cc chip AVR m?i, v l ROM nn b* nh? ny khng bS xa ngay c2 khi khng cung c5p nguPn nui cho chip, r5t thch hXp cho cc Gng dHng l<u tr[ d[ liBu. Nh< trong hnh 1, phLn b* nh? EEPROM .<Xc tch ring v c .Sa chU tnh t; 0x0000. Cu h:i by giA l AVR ho3t =Dng nh9 thQ no? Hnh 4 bi1u diIn c5u trong bn trong c^a 1 AVR. B:n th5y rZng 32 thanh ghi trong Register File .<Xc k>t nRi tr`c ti>p v?i Arithmetic Logic Unit -ALU (ALU c7ng .<Xc xem l CPU c^a AVR) bZng 2 line, v th> ALU c th1 truy xu5t tr`c ti>p cng lc 2 thanh ghi RF chU trong 1 chu kN xung clock (vng .<Xc khoanh trn mu ._ trong hnh 4).
Hnh 4. C5u trc bn trong AVR. Cc instruction .<Xc chGa trong b* nh? ch<@ng trnh Flash memory d<?i d:ng cc thanh ghi 16 bit. B* nh? ch<@ng trnh .<Xc truy cAp trong mYi chu kN xung clock v 1 instruction chGa trong program memory sc .<Xc load vo trong instruction register, instruction register tc .*ng v l`a ch-n register file c7ng nh< RAM cho SU T!M V BIN SO#N B%I NTINSIDE Ntinside 19 ALU th`c thi. Trong lc th`c thi ch<@ng trnh, .Sa chU c^a dng lBnh .ang th`c thi .<Xc quy>t .Snh bWi m*t b* .>m ch<@ng trnh PC (Program counter). b chnh l cch thGc ho:t .*ng c^a AVR. AVR c <u .i1m l hLu h>t cc instruction ./u .<Xc th`c thi trong 1 chu kN xung clock, v vAy c th1 nguPn clock l?n nh5t cho AVR c th1 nh_ h@n 1 sR vi .i/u khi1n khc nh< PIC nh<ng thQi gian th`c thi van nhanh h@n. III. Stack. Stack .<Xc hi1u nh< l 1 thp d[ liBu, d[ liBu .<Xc chGa vo stack W .Unh thp v d[ liBu c7ng .<Xc l5y ra t; .Unh. Ki1u truy cAp d[ liBu c^a stack g-i l LIFO (Last In First Out vo sau ra tr<?c). Hnh 5 th1 hiBn cch truy cAp d[ liBu c^a stack.
Hnh 5. Stack. Khi niBm v cch thGc ho:t .*ng c^a stack c th1 .<Xc p dHng cho AVR, bZng cch khai bo m*t vng nh? trong SRAM l stack ta c th1 sC dHng vng nh? ny nh< m*t stack th`c thH. b1 khai bo m*t vng SRAM lm stack chng ta cLn xc lAp .Sa chU .Lu c^a stack bZng cch xc lAp con tr_ stack-SP (Stack Pointer). SP l 1 con tr_ 16 bit bao gPm 2 thanh ghi 8 bit SPL v SPH (ch[ L l LOW chU thanh ghi mang gi trS byte th5p c^a SP, v H = HIGH), SPL v SPH nZm trong vng nh? I/O. Gi trS gn cho thanh ghi SP sc l .Sa chU khWi .*ng c^a stack. Quay l:i v dH W bi 1, phLn khWi t:o cc .i/u kiBn .Lu. ; KHOI TAO CC DIEU KIEN DAU LDI R16, HIGH(RAMEND) LDI R17, LOW(RAMEND) OUT SPH, R16 OUT SPL, R17 BRn dng khai bo trn mHc .ch l gn gi trS c^a RAMEND cho con tr_ SP, RAMEND (tGc End of Ram) l bi>n chGa .Sa chU l?n nh5t c^a RAM n*i trong AVR, bi>n ny .<Xc .Snh ngh\a trong file M8DEF.INC. Nh< th> sau 4 dng trn, con tr_ SP chGa gi trS cuRi cng c^a SRAM hay ni cch khc vng stack bMt .Lu t; vS tr cuRi cng c^a b* nh? SRAM. Nh<ng t:i sao l vS tr cuRi cng m khng l 1 gi trS khc. C th1 gi2i thch nh< sau: stack trong AVR ho:t .*ng t; trn xuRng, sau khi d[ liBu .<Xc .]y vo stack, SP sc gi2m gi trS v th> khWi .*ng SP W vS tr cuRi cng c^a SRAM sc trnh .<Xc viBc m5t d[ liBu do ghi .. B:n c th1 khWi .*ng stack v?i 1 .Sa chU khc, tuy nhin v l do an ton, nn khWi .*ng stack W RAMEND. Hai instruction dng cho truy cAp stack l PUSH v POP, trong . PUSH dng .]y d[ liBu vo stack v POP dng l5y d[ liBu ra kh_i stack. D[ liBu .<Xc .]y vo v l5y ra kh_i stack t:i vS tr m con tr_ SP tr_ .>n. V dH cho chip ATMega8, RAMEND=0x045F, sau khi khWi .*ng, con tr_ SP tr_ .>n vS tr 0x045F trong SRAM, n>u ta vi>t cc cu lBnh sau:
LDI R1, 1 PUSH R1 LDI R1, 5 PUSH R1 LDI R1, 8 PUSH R1 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 20 Khi . n*i dung c^a stack sc nh< trong hnh 6.
Hnh 6. N*i dung stack trong v dH. Sau mYi lLn PUSH d[ liBu, SP sc gi2m 1 .@n vS v tr_ vo vS tr ti>p theo. By giQ n>u ta dng POP .1 l5y d[ liBu t; stack, POP R2, th R2 sc mang gi trS c^a ngKn nh? 0x045D, tGc R2=8. Tr<?c khi instruction POP .<Xc th`c hiBn, con tr_ SP .<Xc tKng ln 1 .@n vS, sau . d[ liBu sc .<Xc l5y ra t; vS tr m SP tr_ .>n trong stack. Stack trong AVR khng ph2i l v .y, ngh\a l chng ta chU c th1 PUSH d[ liBu vo stack W 1 .* su nh5t .Snh no .5y (phH thu*c vo chip). SC dHng stack khng .ng cch .i khi sc lm ch<@ng trnh th`c thi sai hoDc tRn thQi gian th`c thi v ch. V th> khng nn sC dHng stack chU .1 l<u cc bi>n thng th<Qng. (ng dHng phe bi>n nh5t c^a stack l sC dHng trong cc ch<@ng trnh con (Subroutine), khi chng ta cLn nh2y t; m*t vS tr trong ch<@ng trnh chnh .>n 1 ch<@ng trnh con, sau khi th`c hiBn ch<@ng trnh con l:i muRn quay v/ vS tr ban .Lu trong ch<@ng trnh chnh th Stack l ph<@ng cch tRi <u dng .1 chGa b* .>m ch<@ng trnh trong tr<Qng hXp ny. Xem l:i v dH trong bi 1, trong ch<@ng trnh chnh chng ta dng lBnh RCALL DELAY .1 nh2y .>n .o:n ch<@ng trnh con DELAY, RCALL l lBnh nh2y .>n 1 vS tr trong b* nh? ch<@ng trnh, tr<?c khi nh2y, PC .<Xc c*ng thm 1 v PUSH m*t cch t` .*ng vo stack. CuRi ch<@ng trnh con DELAY, chng ta dng instruction RET, instruction ny POP d[ liBu t; stack ra PC m*t cch t` .*ng, bZng cch ny chng ta c th1 quay l:i vS tr tr<?c .. Chnh v cc lBnh RCALL v RET sC dHng stack m*t cch t` .*ng nn ta ph2i khWi .*ng stack ngay t; .Lu, n>u khng ch<@ng trnh sc th`c thi sai chGc nKng. Tm l:i cLn khWi .*ng stack W .Lu ch<@ng trnh v khng nn sC dHng stack m*t cch ty thch n>u ch<a thAt cLn thi>t. IV. Thanh ghi tr3ng thi - SREG (STATUS REGISTRY). NZm trong vng nh? I/O, thanh ghi SREG c .Sa chU I/O l 0x003F v .Sa chU b* nh? l 0x005F (th<Qng .y l vS tr cuRi cng c^a vng nh? I/O) l m*t trong sR cc thanh ghi quan tr-ng nh5t c^a AVR, v th> m ti dnh phLn ny .1 gi?i thiBu v/ thanh ghi ny. Thanh ghi SREG chGa 8 bit cQ (flag) chU tr:ng thi c^a b* xC l, t5t c2 cc bit ny ./u bS xa sau khi reset, cc bit ny c7ng c th1 .<Xc .-c v ghi bWi ch<@ng trnh. ChGc nKng c^a t;ng bit .<Xc m t2 nh< sau:
Hnh 7. Thanh ghi tr:ng thi. Bit 0 C (Carry Flag: CA nh-): l bit nh? trong cc php .:i sR hoDc logic, v dH thanh ghi R1 chGa gi trS 200, R2 chGa 70, chng ta th`c hiBn php c*ng c nh?: ADC R1, R2, sau php c*ng, k>t qu2 sc .<Xc l<u l:i trong thanh ghi R1, trong khi k>t qu2 th`c l 270 m thanh ghi R1 l:i chU c kh2 nKng chGa tRi .a gi trS 255 (v c 8 bit) nn trong tr<Qng hXp ny, gi trS l<u l:i trong R1 th`c ch5t chU l 14, .Png thQi cQ C .<Xc set ln 1 (v 270=100001110, trong . 8 bit sau 00001110 =14 sc .<Xc l<u l:i trong R1). Bit 1 Z (Zero Flag: CA 0): cQ ny .<Xc set n>u k>t qu2 php ton .:i sR hay php Logic bZng 0. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 21 Bit 2 N (Negative Flag: CA m): cQ ny .<Xc set n>u k>t qu2 php ton .:i sR hay php Logic l sR m. Bit 3 V (Twos complement Overflow Flag: CA trn c?a b 2): ho:t .*ng c^a cQ ny c vf sc kh hi1u cho b:n v n lin quan .>n ki>n thGc sR nhS phn (phLn b), chng ta sc ./ cAp .>n khi no th5y cLn thi>t. Bit 4 S (Sign Bit: Bit dLu): Bit S l k>t qu2 php XOR gi[a 1 cQ N v V, S=N xor V. Bit 5 H (Half Carry Flag: CA nhA nPa): cQ H l cQ nh? trong 1 vi php ton .:i sR v php Logic, cQ ny hiBu qu2 .Ri v?i cc php ton v?i sR BCD. Bit 6 T (Bit Copy Storage): .<Xc sC dHng trong 2 Instruction BLD (Bit LoaD) v BST (Bit STorage). Ti sc gi2i thch chGc nKng Bit T trong phLn gi?i thiBu v/ BLD v BST. Bit 7 I (Global Interrupt Enable) : Cho php ngMt ton b*): Bit ny ph2i .<Xc set ln 1 n>u trong ch<@ng trnh c sC dHng ngMt. Sau khi set bit ny, b:n muRn kch ho:t lo:i ngMt no cLn set cc bit ngMt ring c^a ngMt .. Hai instruction dng ring .1 Set v Clear bit I l SEI v CLI. Ch : t5t c2 cc bit trong thanh ghi SREG ./u c th1 .<Xc xa thng qua cc instruction khng ton h:ng CLx v set bWi SEx, trong . x l tn c^a Bit.V dH CLT l xa Bit T v SEI l set bit I. Ti chU gi2i thch ngMn g-n chGc nKng c^a cc bit trong thanh ghi SREG, cH th1 chGc nKng v cch sC dHng c^a t;ng bit chng ta sc tm hi1u trong cc tr<Qng hXp cH th1 sau ny, ng<Qi .-c c th1 t` tm hi1u thm trong cc ti liBu v/ INSTRUCTION cho AVR. Ti cung c5p thm 1 b2ng tm tMt s` 2nh h<Wng c^a cc php ton .:i sR, logic ln cc Bit trong thanh ghi SREG. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 22 Hnh 8. hnh h<Wng c^a cc php ton ln SREG. IV. Macro v ch9.ng trnh con. Macro l khi niBm chU m*t .o:n code nh_ .1 th`c hiBn m*t cng viBc no ., n>u c 1 .o:n code no . m b:n r5t hay sC dHng khi lAp trnh th b:n nn dng macro .1 trnh viBc ph2i vi>t .i vi>t l:i .o:n code .. LAp trnh ASM cho AVR cho php b:n sC dHng Macro, .1 t:o 1 Macro b:n sC dHng DIRECTIVE. .MACRO delay4 NOP NOP NOP NOP .ENDMACRO bo:n Macro trn c tn delay4 th`c hiBn viBc delay 4 chu kN my bZng 4 lBnh NOP, n>u trong ch<@ng trnh b:n cLn dng Macro ny th chU cLn g-i delay4 W b5t kN dng no. [] ; code c^a b:n Delay4 [] ; code c^a b:n MYi lLn tn c^a Macro .<Xc g-i, trnh bin dSch sc tm .>n Macro . v copy ton b* n*i dung Macro vo vS tr b:n g-i. Nh< vAy th`c ch5t con tr_ ch<@ng trnh khng nh2y .>n Macro, Macro khng lm gi2m dung l<@ng ch<ong trnh m chU lm cho viBc lAp trnh nhi nhng h@n. by chnh l khc biBt l?n nh5t c^a Macro v Subroutine (ch<@ng trnh con). Ch9.ng trnh con c7ng l 1 .o:n code th`c hiBn 1 chGc nKng .Dc biBt no .. Tuy nhin khc v?i Macro, mYi khi g-i ch<@ng trnh con, con tr_ ch<@ng trnh nh2y .>n ch<@ng trnh con ./ th`c thi ch<@ng trnh con v sau . quay v/ ch<@ng trnh chnh. Nh< th> ch<@ng trnh con chU .<Xc bin dSch 1 lLn v c th1 sC dHng nhi/u lLn, n lm gi2m dung l<Xng ch<ong trnh. by l <u .i1m v c7ng l .i1m khc biBt l?n nh5t gi[a ch<@ng trnh con v Macro. Tuy nhin cLn ch l viBc nh2y .>n ch<@ng trnh con v nh2y v/ ch<@ng trnh chnh cLn vi chu kN my, c th1 lm chAm ch<@ng trnh, .y l nh<Xc .i1m c^a ch<@ng trnh con so v?i macro. Ch<@ng trnh con cho AVR lun .<Xc bMt .Lu bZng 1 Label, . c7ng l tn v .Sa chU c^a ch<@ng trnh con. Ch<@ng trnh con th<Qng .<Xc k>t thc v?i cu lBnh RET (Return). Chng ta . bi>t v/ ch<@ng trnh con qua v dH c^a bi 1, trong . DELAY l 1 ch<@ng trnh con. b1 g-i ch<@ng trnh con t; 1 vS tr no . trong ch<@ng trnh, chng ta c th1 dng lBnh CALL hoDc RCALL (Relative CALL) (xem l:i v dH bi 1 v/ cch sC dHng RCALL). MYi khi cc lBnh ny .<Xc g-i, b* .>m ch<@ng trnh .<Xc t` .*ng .<Xc PUSH vo stack v khi ch<@ng trnh con k>t thc bZng lBnh RET, b* .>m ch<@ng trnh .<Xc POP trW ra v quay v/ ch<@ng trnh chnh. LBnh CALL c th1 g-i 1 ch<@ng trnh con W b5t kN vS tr no trong khi RCALL chU g-i trong kho2ng b* nh? 4KB, nh<ng RCALL cLn t chu kN xung clock h@n khi th`c thi. Hai instruction khc c th1 .<Xc dng .1 g-i ch<@ng trnh con . l JMP (Jump) v RJMP (Relative Jump). Khc v?i cc lBnh call, cc lBnh jump khng cho php quay l:i v khng t` .*ng PUSH b* .>m ch<@ng trnh vo Stack, .1 sC dHng cc lBnh ny g-i ch<@ng trnh con b:n cLn m*t sR lBnh jump khc W cuRi ch<@ng trnh con. Tm l:i b:n nn vi>t 1 ch<@ng trnh con .ng chu]n v dng CALL hoDc RCALL .1 g-i ch<@ng cc ch<@ng trnh ny, chU nh[ng tr<Qng hXp .Dc biBt hoDc b:n hi1u r5t r v/ chng th c th1 dng cc lBnh jump. V. V d5 minh hRa. N>u b:n . .-c v hi1u .>n thQi .i1m ny th b:n . c th1 hi1u h>t ho:t .*ng c^a ch<@ng trnh v dH trong bi 1, thAt s` v dH . r5t .@n gi2n v dI hi1u. Tuy nhin, b:n c th/ tRi <u ha v dH . theo h<?ng lm gi2m dung l<Xng ch<@ng trnh v t5t nhin, ch<@ng trnh sc kh hi1u h@n cho ng<Qi khc. Cc phLn khWi .*ng vS tr b* nh?, stack v ch<@ng trnh con DELAY chng ta khng thay .ei, chU thay .ei phLn ch<@ng trnh chnh, 1 trong nh[ng cch vi>t ch<@ng trnh chnh nh< cch sau: ; CHUONG TRINH CHINH , BAI 1, VI DU 1, VERSION 2/////////////////////////////// LDI R16, $1 ;LOAD GIA TRI KHOI DONG CHO R16 MAIN: OUT PORTB, R16 ; XUAT GIA TRI TRONG R16 RA PORTB RCALL DELAY ; GOI CHUONG TRINH CON DELAY ROL R16 ; XOAY THANH GHI R16 SANG TRAI 1 VI TRI RJMP MAIN ; NEU R16 j0, NHAY VE MAIN, TIEP TUC QUET ;///////////////////////////////////////////////////////////////////////////////////////// C th1 khng cLn gi2i thch b:n c7ng . c th1 hi1u .o:n code trn, .y chU l 1 trong nh[ng cch c th1, b:n hy vi>t l:i theo cch c^a ring b:n v?i yu cLu l ch<@ng trnh ph2i th`c hiBn .ng chGc nKng v ngMn g-n. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 23 By giQ chng ta sc th`c hiBn m*t v dH minh h-a cho nh[ng g chng ta . h-c trong bi 2 ny. N*i dung c^a v dH th1 hiBn trong m:ch .iBn hnh 9. Ho:t .*ng c^a m:ch .iBn tC nh< sau: 1 chip ATMega8 .<Xc sC dHng nh< m*t counter, c th1 dng .1 .>m ln v .>m xuRng, 2 button trong m:ch .iBn tc .*ng nh< 2 kicker, nh5n button 1 .1 .>m ln v button .1 .>m xuRng, gi trS .>m nZm trong kho2ng t; 0 .>n 9. Gi trS .>m .<Xc hi1n thS trn 1 LED 7 .o:n lo:i anod chung (d<@ng chung), chip 7447 .<Xc dng .1 gi2i m t; gi trS BCD xu5t ra bWi ATMega8 sang tn hiBu cho LED 7 .o:n anod chung, chng ta cLn sC dHng 7447 v tn hiBu xu5t ra t; chip ATMega8 l d:ng nhS phn hoDc BCD , tn hiBu ny khng th1 hi1n thS tr`c ti>p trn cc LED 7 .o:n, chip 7447 c nhiBm vH chuy1n 1 d[ liBu d:ng digit BCD sang m ph hXp cho LED 7 .o:n. b1 th`c hiBn v dH, tr<?c h>t b:n hy vc m:ch .iBn nh< trong hnh 9 bZng phLn m/m Proteus (xem cch vc m:ch .iBn bZng Proteus), m:ch .iBn chU c 5 lo:i linh kiBn l chip ATMega8 (t; kha mega8), 1 LED 7 .o:n anod chung v?i tn .Ly .^ trong Proteus l 7SEG-COM-AN-GRN (t; kha 7SEG), 1 chip 7447 (t; kha 7447), 1 .iBn trW 10 k v 2 button (t; kha button).
Hnh 9. V dH cho bi 2. SC dHng AVRStudio t:o 1 project m?i v?i tn g-i avr2 (xem l:i cch t:o Project m?i trong AVRStudio). Vi>t l:i phLn code bn d<?i vo vo file avr2.asm List 1. V dH c5u trc AVR
10 11 12 13 14 15 16 .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 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 24 17 18 19 20 21 22 23 24 5 26 27 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 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 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 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 25 56 57 DEC R25 RET Trong v ny ny, chng ta sC dHng 2 PORT c^a chip ATMega8, PORTD dng xu5t d[ liBu (sR .>m) ra chip 7447 v sau . hi1n thS trn LED 7 .o:n. PORTB dng nh< ng nhAp, tn hiBu t; cc button sc .<Xc chip ATMega8 nhAn thng qua 2 chn PB0 v PB1 c^a PORTB. Ho:t .*ng c^a cac PORT v viBc xc lAp 1 PORT nh< cc ng xu5t chng ta . kh2o st trong bi 1. % .y chng ta kh2o st thm v/ xc lAp PORT nh< 1 ng nhAp, tr<?c h>t b:n hy quan st m:ch .iBn t<@ng .<@ng c^a 1 chn trong cc PORT xu5t nhAp c^a AVR trong hnh 10.
Hnh 10. C5u trc chn trong PORT c^a AVR. Trong m:ch .iBn hnh 10, cc diode v tH .iBn chU c chGc nKng b2o vB chn PORT, nh<ng .iBn trW Rpu (R Pull up) .ng vai tr quan tr-ng nh< l .iBn trW ko ln khi chn c^a PORT lm nhiBm vH nhAn tn hiBu (ng nhAp). Tuy nhin trong AVR, .iBn trW ko ln ny khng ph2i lun kch ho:t, chng ta bi>t rZng mYi PORT c^a AVR c 3 thanh ghi: DDRx, PORTx v PINx, n>u DDRx=0 th PORT x l ng nhAp, lc ny thanh ghi PINx l thanh ghi chGa d[ liBu nhAn v/, .Dc biBt thanh ghi PORTx van .<Xc sC dHng trong mode ny, . l thanh ghi xc lAp .iBn trW ko ln, nh< th> n>u DDRx=0 v PORTx=0xFF th cc chn PORTx l ng nhAp v .<Xc ko ln bWi 1 .iBn trW trong chip, ngh\a l cc chn c^a PORTx lun W mGc cao, muRn kch .1 thay .Pi tr:ng thi chn ny chng ta cLn nRi chn . tr`c ti>p v?i GND, .5y l l do t:i sao cc button trong m:ch .iBn c^a chng ta c 1 .Lu nRi v?i chn c^a chip cn .Lu kia .<Xc nRi v?i GND. by c7ng l ngh\a c^a khi niBm .iBn trW ko ln (Pull up resistor) trong kg thuAt .iBn tC. bo:n code trong phLn KHOI DONG CAC PORT c^a v dH ny xc lAp PORTD l ng xu5t (DDRD=0xFF) , PORTB l ng nhAp c sC dHng .iBn trW ko ln (DDRB=0, PORTB=0xFF). Chng ta sc gi2i thch ho:t .*ng c^a .o:n ch<@ng trnh chnh v cc .o:n ch<@ng trnh con. Tr<?c h>t, trong ch<@ng trnh ny, chng ta sC dHng 3 thanh ghi chnh l R20, R21 v R25, trong . R25 l thanh ghi chGa sR .>m, gi trS c^a thanh ghi R25 sc .<Xc xu5t ra PORTD c^a chip, thanh ghi R21 chGa tr:ng thi c^a thanh ghi PINB v c7ng l tr:ng thi c^a cc button, thanh ghi R20 k>t hXp v?i thanh ghi R21 t:o thnh 1 b* .>m c:nh xuRng c^a cc button. b1 hi1u th5u .o ho:t .*ng .>m (c7ng l ho:t .*ng chnh c^a v dH ny) chng ta xt tr:ng thi chn PB0 nh< trong hnh 11.
Hnh 11. Thay .ei tr:ng thi W cc chn I/O. Trong tr:ng thi bnh th<Qng (button khng .<Xc nh5n), chn PB0 W mGc cao (do .iBn trW ko ln), b* .>m khng ho:t .*ng, gi trS .>m khng thay .ei, by giQ n>u nh5n button, chn PB0 .<Xc nRi tr`c ti>p v?i GND, chn ny sc bS ko xuRng mGc th5p, bZng cch ki1m tra tr:ng thi chn PB0, n>u PB0=0 ta tKng gi trS .>m 1 .@n vS. t<Wng nh< th> c vf hXp l, tuy nhin n>u p dHng th ch<@ng trnh sc ho:t .*ng khng .ng chGc nKng, khi b:n nh5n 1 lLn gi, trS .>m c th1 tKng .>n c2 trKm hoDc khng ki1m sot .<Xc, hiBu Gng ny t<@ng t` khi SU T!M V BIN SO#N B%I NTINSIDE Ntinside 26 b:n nh5n v gi[ 1 phm trn bn phm my tnh, l do l v chng ta sC dHng ph<@ng php ki1m tra mGc .1 .>m, thQi gian qut c^a ch<@ng trnh r5t ngMn so v?i thQi gian chng ta gi[ button. b1 khMc phHc, chng ta dng ph<@ng php ki1m tra c:nh xuRng, chU khi no pht hiBn chn PB0 thay .ei t; 1 xuRng 0 th m?i tKng gi trS .>m 1 .@n vS, k>t qu2 l mYi lLn nh5n button th gi trS .>m chU tKng 1 (ngay c2 khi ta nh5n v gi[ button), thanh ghi R20 .<Xc sC dHng .1 l<u tr:ng thi tr<?c . c^a PINB (c7ng l tr:ng thi c^a cc button). Trong ch<@ng trnh, ti sC dHng 2 istruction m?i l SBRC v SBRS .1 ki1m tra tr:ng thi cc chn c^a PORTB (button). SBRC Skip if Bit in Register is Clear, lBnh ny sc b_ qua 1 dng lBnh ngay sau . (chU b_ qua 1 dng duy nh5t) n>u 1 bit trong thanh ghi W mGc 0, SBRC Skip if Bit in Register is Set- ho:t .*ng t<@ng t` SBRC nh<ng skip sc x2y ra n>u bit trong thanh ghi W mGc 1. D`a vo .y chng ta gi2i 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 ki1m tra tr:ng thi bit 0 trong R21 (ch R21 chGa gi trS c^a PINB), n>u bit ny bZng 1 (set), tGc chn PB0=1 hay button khng .<Xc nh5n, th nh2y b_ qua dng lBnh ti>p theo .1 .>n dng 3. % dng 3 ch<@ng trnh ki1m tra tr:ng thi chn PB1 (button thG 2). Quay l:i dng 1, n>u ch<@ng trnh ki1m tra pht hiBn chn PB0=0 (button thG nh5t .<Xc nh5n) th dng lBnh thG 2 .<Xc th`c thi, k>t qu2 l ch<@ng trnh nh2y .>n ch<@ng trnh con TANG. TANG: SBRS R20,0 RET INC R25 RET Dng .Lu tin c^a ch<@ng trnh con TANG l ki1m tra tr:ng thi tr<?c . c^a chn PB0 (.<Xc l<u W bit 0 trong thanh ghi R20), n>u tr:ng thi ny bZng 0, ngh\a l khng c s` chuy1n t; 1 xuRng 0 W chn PB0, dng 2 (lBnh RET) sc .<Xc th`c thi .1 quay v/ ch<@ng trnh chnh. Nh<ng n>u PB0 tr<?c . bZng 1, ngh\a l c s` thay .ei t; 1->0 W chn ny, gi trS .>m sc .<Xc tKng thm 1 nhQ INC R25, sau . quay v/ ch<@ng trnh chnh. Tm l:i muRn tKng gi trS .>m thm 1 .@n vS cLn th_a mn 2 .i/u kiBn: chn PB0 hiBn t:i =0 (button .ang .<Xc nh5n) v tr:ng thi tr<?c . c^a PB0 ph2i l 1 (trnh tr<Qng hXp tKng lin tHc). Ph<@ng php ny c th1 p dHng cho r5t nhi/u tr<Qng hXp .>m d:ng .>m xung. Qu trnh gi2m gi trS .>m .<Xc hi1u t<@ng t`, phLn cn l:i c^a v dH ny b:n .-c hy t` gi2i thch theo nh[ng gXi trn.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 27 Bi 3 - Ng"t ngoi
I. NgSt trn AVR. Interrupts, th<Qng .<Xc g-i l ngMt, l m*t tn hiBu kh]n c5p gWi .>n b* xC l, yu cLu b* xC l t:m ng;ng tGc khMc cc ho:t .*ng hiBn t:i .1 nh2y .>n m*t n@i khc th`c hiBn m*t nhiBm vH kh]n c5p no ., nhiBm vH ny g-i l trnh phHc vH ngMt isr (interrupt service routine ). Sau khi k>t thc nhiBm vH trong isr, b* .>m ch<@ng trnh sc .<Xc tr2 v/ gi trS tr<?c . .1 b* xC l quay v/ th`c hiBn ti>p cc nhiBm vH cn dang dW. Nh< vAy, ngMt c mGc .* <u tin xC l cao nh5t, ngMt th<Qng .<Xc dng .1 xC l cc s` kiBn b5t ngQ nh<ng khng tRn qu nhi/u thQi gian. Cc tn hiBu dan .>n ngMt c th1 xu5t pht t; cc thi>t bS bn trong chip (ngMt bo b* .>m timer/counter trn, ngMt bo qu trnh gWi d[ liBu bZng RS232 k>t thc) hay do cc tc nhn bn ngoi (ngMt bo c 1 button .<Xc nh5n, ngMt bo c 1 gi d[ liBu . .<Xc nhAn). NgMt l m*t trong 2 kg thuAt bMt s` kiBn c@ b2n bao gPm: h_i vng (Polling) v ngMt. Hy t<Wng t<Xng b:n cLn thi>t k> m*t m:ch .i/u khi1n hon chUnh th`c hiBn r5t nhi/u nhiBm vH bao gPm nhAn thng tin t; ng<Qi dng qua cc button hay keypad (hoDc keyboard), nhAn tn hiBu t; c2m bi>n, xC l thng tin, xu5t tn hiBu .i/u khi1n, hi1n thS thng tin tr:ng thi ln cc LCD(b:n hon ton c th1 lm .<Xc v?i AVR ), r rng trong cc nhiBm vH, viBc nhAn thng tin ng<Qi dng (start, stop, setup, change,) r5t hi>m x2y ra (so v?i cc nhiBm vH khc) nh<ng l:i r5t kh]n c5p, .<Xc <u tin hang .Lu. N>u dng Polling ngh\a l b:n cLn vi>t 1 .o:n ch<@ng trnh chuyn thKm d tr:ng thi c^a cc button (ti t:m g-i l Input() ) v b:n ph2i chn .o:n ch<@ng trnh ny vo r5t nhi/u vS tr trong ch<@ng trnh chnh .1 trnh tr<Qng hXp b_ st lBnh t; ng<Qi dng, .i/u ny thAt lng ph thQi gian th`c thi. Gi2i php cho v5n ./ ny l sC dHng ngMt, bZng cch k>t nRi cc button v?i .<Qng ngMt c^a chip v sC dHng ch<@ng trnh Input() lm isr c^a ngMt ., b:n khng cLn ph2i chn Input() trong lc .ang th`c thi v v th> khng tRn thQi gian cho n, Input() chU .<Xc g-i khi ng<Qi dng nh5n cc button. b l t<Wng c^a ngMt. Hnh 1 minh h-a cch te chGc ngMt thng th<Qng trong cc chip AVR, sR l<Xng ngMt trn mYi dng chip l khc nhau, Gng v?i mYi ngMt sc c vector ngMt, vector ngMt l cc thanh ghi c .Sa chU cR .Snh, .<Xc .Snh ngh\a tr<?c nZm trong phLn .Lu c^a b* nh? ch<@ng trnh. V dH vector ngMt ngoi 0 (external interrupt 0) c^a chip atmega8 c .Sa chU l 0x009 (theo datasheet t; SU T!M V BIN SO#N B%I NTINSIDE Ntinside 28 Atmel). Trong lc ch<@ng trnh chnh .ang th`c thi, n>u c m*t s` thay .ei dan .>n ngMt x2y ra W chn INT0 (chn 4), b* .>m ch<@ng trnh (Program Counter) nh2y .>n .Sa chU 0x009, gi2 sC ngay t:i .Sa chU 0x009 chng ta c .Dt 1 lBnh RJMP .>n m*t trnh phHc vH ngMt (IRS1 chFng h:n), m*t lLn n[a b* .>m ch<@ng trnh nh2y .>n IRS1 .1 th`c thi trnh phHc vH ngMt, k>t thc ISR1, b* .>m ch<@ng trnh l:i quay v/ vS tr tr<?c . trong ch<@ng trnh chnh, qu trnh ngMt k>t thc. Khng mang tnh bMt bu*c nh<ng ti khuyn b:n nn te chGc ch<@ng trnh ngMt theo cc ny .1 trnh nh[ng lYi lin quan .>n .Sa chU ch<@ng trnh.
Hnh 1. NgMt. B2ng 1 tm tMt cc vector ngMt c trn chip atmega8, cho cc chip khc b:n hy tham kh2o datasheet .1 bi>t thm. B2ng 1 cc vector ngMt v Reset trn chip Atmega8. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 29
II. NgSt ngoi (External Interrupt). PhLn ny ti dnh gi?i thiBu cc b:n cch ci .Dt v sC dHng ngMt ngoi v .y l lo:i ngMt duy nh5t .*c lAp v?i cc thi>t bS ngo:i vi c^a chip, cc ngMt khc th<Qng gMn v?i ho:t .*ng c^a 1 thi>t bS no . nh< Timer/Counter, giao ti>p nRi ti>p USART, chuy1n .ei ADCchng ta sc kh2o st cH th1 khi tm hi1u v/ ho:t .*ng c^a cc thi>t bS ny. NgMt ngoi l cch r5t hiBu qu2 .1 th`c hiBn giao ti>p gi[a ng<Qi dng v chip, trn chip atmega8 c 2 ngMt ngoi c tn t<@ng Gng l INT0 v INT1 t<@ng Gng 2 chn sR 4 (PD2) v sR 5 (PD3). Nh< ti . ./ cAp trong bi AVR2, khi lm viBc v?i cc thi>t bS ngo:i vi c^a AVR, hLu nh< chng ta SU T!M V BIN SO#N B%I NTINSIDE Ntinside 30 chU thao tc trn cc thanh ghi chGc nKng .Dc biBt - SFR (Special Function Registers) trn vng nh? IO, m*i thi>t bS bao gPm m*t tAp hXp cc thanh ghi .i/u khi1n, tr:ng thi, ngMtkhc nhau, .i/u ny .Png ngh\a chng ta ph2i nh? t5t c2 cc thanh ghi c^a AVR. Lc ny datasheet pht huy tc dHng, b:n ph2i nhanh chng download file datasheet c^a chip mnh .ang sC dHng, c r5t nhi/u n@i .1 download nh< t:i www.atmel.com hay trn cc trang web chuyn cung c5p IC datasheet free (www.alldatasheet.com l 1 v dH). Quay v/ v?i ngMt ngoi, c 3 thanh ghi lin quan .>n ngMt ngoi . l MCUCR, GICR v GIFR. CH th1 cc thanh ghi .<Xc trnh by bn d<?i. Thanh ghi =iTu khiGn MCU MCUCR (MCU Control Register) l thanh ghi xc lAp ch> .* ngMt cho ngMt ngoi, gi2 sC chng ta k>t nRi cc chn ngMt nh< hnh 2.
Hnh 2. K>t nRi ngMt ngoi cho atmega8. Gi2 sC chng ta k>t nRi cc ngMt ngoi trn AVR mega8 nh< pha tri hnh 9, cc button dng t:o ra cc ngMt, c 4 kh2 nKng (t:m g-i l cc MODE) c th1 x2y ra khi chng ta nh5n v th2 cc button. N>u khng nh5n, tr:ng thi cc chn INT l HIGH do .iBn trW ko ln, khi v;a nh5n 1 button, sc c chuy1n tr:ng thi t; HIGH sang LOW, chng ta g-i l c:nh xuRng - Falling Edge, khi button .<Xc nh5n v gi[, tr:ng thi cc chn INT .<Xc xc .Snh l LOW v cuRi cng khi th2 cc button, tr:ng thi chuy1n t; LOW sang HIGH, g-i l c:nh ln Rising Edge. Trong nh[ng tr<Qng hXp cH th1, 1 trong 4 MODEs trn ./u h[u ch, v dH trong cc Gng dHng .>m xung (.>m encoder c^a servo motor chFng h:n) th 2 MODE c:nh ph2i .<Xc dng. Thanh ghi MCUCR chGa cc bits cho php chng ta ch-n 1 trong 4 MODE trn cho cc ngMt ngoi. D<?i .y l c5u trc thanh ghi MCUCR .<Xc trch ra t; datasheet c^a chip atmega8. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 31
MCUCR l m*t thanh ghi 8 bit nh<ng .Ri v?i ho:t .*ng ngMt ngoi, chng ta chU quan tm .>n 4 bit th5p c^a thanh ghi ny (4 bit cao dng cho Power manager v Sleep Mode), 4 bit th5p l cc bit Interrupt Sense Control (ISC), 2 bit ISC11, ISC10 dng cho INT1 v ISC01, ISC00 dng cho INT0. Hy nhn vo b2ng tm tMt bn d<?i .1 bi>t chGc nKng c^a cc bit trn, .y l b2ng chn trS c^a 2 bit ISC11, ISC10. B2ng chn trS cho cc bit ISC01, ISC00 hon ton t<@ng t`. B2ng 2: INT1 Sense Control
ThAt dI dng .1 hi1u chGc nKng c^a cc bit Sense Control, v dH b:n muRn set cho INT1 l ngMt c:nh xuRng (Falling Edge) trong khi INT0 l ngMt c:nh ln (Rising Edge), hy .Dt dng lBnh MCUCR =0x0B (0x0B = 00001011 nhS phn) trong ch<@ng trnh c^a b:n. Thanh ghi .i/u khi1n ngMt chung GICR (General Interrupt Control Register) (trn cc chip AVR c7, nh< cc chip AT90Sxxxx, thanh ghi ny c tn l thanh ghi mDt n: ngMt thng th<Qng GIMSK, b:n tham kh2o thm datasheet c^a cc chip ny n>u cLn sC dHng .>n). GICR c7ng l 1 thanh ghi 8 bit nh<ng chU c 2 bit cao (bit 6 v bit 7) l .<Xc sC dHng cho .i/u khi1n ngMt, c5u trc thanh ghi nh< bn d<?i (trch datasheet).
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 32 Bit 7 INT1 g-i l bit cho php ngMt 1(Interrupt Enable), set bit ny bZng 1 ngh\a b:n cho php ngMt INT1 ho:t .*ng, t<@ng t`, bit INT0 .i/u khi1n ngMt INT0. Thanh ghi cQ ngMt chung GIFR (General Interrupt Flag Register) c 2 bit INTF1 v INTF0 l cc bit tr:ng thi (hay bit cQ - Flag) c^a 2 ngMt INT1 v INT0, n>u c 1 s` kiBn ngMt ph hXp x2y ra trn chn INT1, bit INTF1 .<Xc t` .*ng set bZng 1 (t<@ng t` cho tr<Qng hXp c^a INTF0), chng ta c th1 sC dHng cc bit ny .1 nhAn ra cc ngMt, tuy nhin .i/u ny l khng cLn thi>t n>u chng ta cho php ngMt t` .*ng, v vAy thanh ghi ny th<Qng khng .<Xc quan tm khi lAp trnh ngMt ngoi. C5u trc thanh ghi GIFR .<Xc trnh by trong hnh ngay bn d<?i.
Sau khi . xc lAp cc bit sdn sng cho cc ngMt ngoi, vi0c sau cng chng ta c>n lm l set bit I, tOc bit cho php ngSt ton c5c, trong thanh ghi tr:ng thi chung c^a chip (thanh ghi SREG, xem l:i bi AVR2). MDt ch khc l v cc chn PD2, PD3 l cc chn ngSt nn b3n ph@i set cc chn ny l Input (set thanh ghi DDRD). Qu trnh thi>t lAp ngMt ngoi .<Xc trnh by trong hnh 10.
Hnh 3. Thi>t lAp ngMt ngoi. NgSt ngoi v-i ASM: D<?i .y ti trnh by cch vi>t ch<@ng trnh sC dHng ngMt ngoi bZng ngn ng[ ASM, .Ri v?i cc ngMt khc b:n chU cLn thm cc DIRECTIVE .1 .Snh vS cc vector ngMt t<@ng Gng v vi>t ch<@ng trnh phHc vH ngMt t<@ng Gng. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 33 List 1. NgMt v?i 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 ; bSnh vS vS tr .Lu tin RJMP BATDAU .ORG 0x001; bSnh vS vector ngMt ngoi 0 - INT0 (xem b2ng vector) RJMP INT0_ISR ; Nh2y .>n INT0_ISR n>u c ngMt INT0 x2y ra .ORG 0x002 ; bSnh vS vector ngMt ngoi 1 INT1 (xem b2ng vector) RJMP INT1_ISR ; Nh2y .>n INT1_ISR n>u c ngMt INT1 x2y ra ;T<@ng t`, .Snh vS cc vector ngMt khc W .y.. ;.. .ORG 0x020 ; bSnh vS ch<@ng trnh chnh BATDAU: ; khWi t:o 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 tr:ng thi do b:n t` ch-n, 0 hoDc 1 OUT DDRD, R16 ; PD2 v PD3 l input LDI R16, 0Bxxxx11xx ; x l tr:ng thi do b:n t` ch-n, 0 hoDc 1 OUT PORTD, R16 ; mMc .iBn trW ko ln cho PD2, PD3
; khWi .*ng ngMt LDI R16, $0B ; $0B=00001011, INT1: ngMt c:nh xuRng, INT0: ngMt c:nh ln OUT MCUCR, R16 ; xu5t gi trS .i/u khi1n ra thanh ghi MCUCR LDI R16, $C0 ;$C0=11000000: Enable INT1 v INT0 OUT GICR, R16 ;xu5t gi trS .i/u khi1n ra thanh ghi GICR SU T!M V BIN SO#N B%I NTINSIDE Ntinside 34 39 40 41 42 43 44 45 46 47 48 SEI ;set bit cho php ngMt ton cHc ; Ch<@ng trnh chnh MAIN: ;cc cng viBc m ch<@ng trnh chnh cLn th`c hiBn ;. RJMP MAIN ;v .y l .Snh ngh\a trnh phHc vH ngMt INT0_ISR INT0_ISR: ; cc cng viBc cLn th`c hiBn khi c ngMt ;. RETI ; ph2i dng lBnh RETI .1 quay v/ ch<@ng trnh chnh ;v .y l .Snh ngh\a trnh phHc vH ngMt INT1_ISR INT1_ISR: ; cc cng viBc cLn th`c hiBn khi c ngMt ;. RETI ; ph2i dng lBnh RETI .1 quay v/ ch<@ng trnh chnh B:n th5y cc cc ngMt .<Xc .Snh vS nZm gi[a vS tr 0x0000, khi m?i khWi .*ng, t:i v tr 0x000 l lBnh RJMP BATDAU, nh< th> cc lBnh RJMP t:i cc vector ngMt v cc ISR ./u khng .<Xc th`c hiBn, chng chU .<Xc th`c hiBn m*t cch t` .*ng khi c ngMt. NgSt ngoi v-i C: Avr-libc hY trX m*t th< viBn hm cho ngMt kh hon h2o, .1 sC dHng ngMt trong ch<@ng trnh vi>t bZng C (avr-gcc) b:n chU cLn include file interrupt.h nZm trong th< mHc con avr l xong. file header interrupt.h chGa .Snh ngh\a cc hm v ph<@ng thGc phHc vH cho vi>t trnh phHc vH ngMt, cc vector ngMt khng .<Xc .Snh ngh\a trong file ny m trong file iom8.h (cho atmega8). N>u b:n v tnh tm th5y 1 ch<@ng trnh ngMt no . khng include file interrupt.h m include file signal.h th b:n .;ng ng:c nhin, . l cch vi>t c7 trong avr-gcc, thAt ra b:n hon ton c th1 sC dHng cch vi>t c7 v cc phin b2n m?i c^a avr-libc (.i cng v?i cc b2n WinAVR m?i) van hY trX cch vi>t ny nh<ng khng khuyn khch b:n dng. Trong C cc trnh phHc vH ngMt c tn l ISR (vector_name), trong cc phin b2n c7, trnh phHc vH ngMt c tn SIGNAL(vector_name) nh<ng c7ng nh< file header signal.h, trnh ny van .<Xc hY trX trong phin b2n m?i nh<ng khng .<Xc khuy>n khch sC dHng. List 2. NgMt v?i C. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 35 1 2 3 4 5 6 #include <avr/interrupt.h>
ISR (vector_name) { //user code here } Trong . vector_name l tn c^a cc vector ngMt .Snh ngh\a sdn avr-libc, ISR l tn bMt bu*c, b:n khng .<Xc dng cc tn khc ty N (nh<ng c th1 dng SIGNAL nh< . trnh by W trn). bDc biBt, b:n c th1 .Dt ISR W tr<?c hoDc sau ch<@ng trnh chnh ./u khng 2nh h<Wng v thAt ra, . c kh nhi/u cng .o:n .<Xc th`c hiBn khi b:n g-i ISR (nh<ng b:n khng th5y v c7ng khng cLn quan tm), ISR lun .<Xc trnh bin dSch .Dt W ngoi vng vector ngMt nh< cch chng ta th`c hiBn trong ASM, nh< th> m*t ch<@ng trnh sC dHng nhi/u lo:i ngMt sc ph2i c sR l<Xng trnh ISR t<@ng Gng nh<ng v?i vector_name khc nhau, mYi khi c ngMt x2y ra, ty thu*c vo gi trS c^a vector_name m 1 trong cc trnh ISR .<Xc th`c thi. bRi v?i cc vector_name, .1 bi>t .<Xc vector_name cho mYi lo:i ngMt, b:n cLn tham kh2o ti liBu avr-libc manual. B2ng 10 tm tMt cc vector_name c^a m*t sR ngMt thng dHng trn atmega8, b:n ch rZng cc vector_name trong avr- libc .<Xc .Snh ngh\a r5t khc nhau cho t;ng lo:i chip, b:n nh5t thi>t ph2i sC dHng ti liBu avr-libc manual .1 bi>t chnh xc cc vector_name cho lo:i chip m b:n .ang dng. B2ng 3: vector_name cho atmega8. Vector name Old vector name Description ADC_vect SIG_ADC ADC Conversion Complete ANA_COMP_vect SIG_COMPARATOR Analog Comparator EE_RDY_vect SIG_EEPROM_READY EEPROM Ready INT0_vect SIG_INTERRUPT0 External Interrupt 0 INT1_vect SIG_INTERRUPT1 External Interrupt Request 1 SPI_STC_vect SIG_SPI Serial Transfer Complete SPM_RDY_vect SIG_SPM_READY Store Program Memory Ready TIMER0_OVF_vect SIG_OVERFLOW0 Timer/Counter0 Overflow TIMER1_CAPT_vect SIG_INPUT_CAPTURE1 Timer/Counter Capture Event TIMER1_COMPA_vect SIG_OUTPUT_COMPARE1A Timer/Counter1 Compare Match A SU T!M V BIN SO#N B%I NTINSIDE Ntinside 36 TIMER1_COMPB_vect SIG_OUTPUT_COMPARE1B Timer/Counter1 Compare MatchB TIMER1_OVF_vect SIG_OVERFLOW1 Timer/Counter1 Overflow TIMER2_COMP_vect SIG_OUTPUT_COMPARE2 Timer/Counter2 Compare Match TIMER2_OVF_vect SIG_OVERFLOW2 Timer/Counter2 Overflow TWI_vect SIG_2WIRE_SERIAL 2-wire Serial Interface USART3_UDRE_vect SIG_USART3_DATA USART3 Data register Empty III. V d5 ngSt ngoi v-i C. b1 th`c hiBn v dH sC dHng ngMt ngoi bZng C, ti sc vi>t l:i ch<@ng trnh v dH c^a bi "c5u trc AVR" nh<ng bZng ngn ng[ C v sC dHng ngMt. Trong ch<@ng trnh v dH c^a bi AVR2, chng ta th`c hiBn viBc .>m ln v .>m xuRng dng 2 button, chng ta sc van th`c hiBn trn t<Wng ny nh<ng c cht thay .ei trong k>t nRi, tr<?c h>t b:n vc 1 m:ch .iBn m ph_ng trong Proteus nh< hnh 4.
Hnh 4. M:ch .iBn m ph_ng ngMt. K>t nRi button .>m ln v?i ngMt INT0, button .>m xuRng v?i INT1, PORTB .<Xc ch-n lm PORT xu5t. Hy ch:yProgrammer Notepad, t:o 1 Project m?i tn AVR2-INT, type .o:n code bn d<?i vo 1 file new v l<u v?i tn main.c, add file ny vo Project c^a b:n, sau . t:o m*t Makefile cho Project. List 3. v dH ngMt ngoi bZng C. 1 #include <avr/io.h> SU T!M V BIN SO#N B%I NTINSIDE Ntinside 37 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/interrupt.h> #include <avr/delay.h>
volatile int8_t val=0; //khai bo 1 bi>n val 8 bit, c d5u v gi trS khWi t:o bZng 0. int main(void){
DDRD=0x00; //khai bo PORTD l Input .1 sC dHng 2 chn ngMt. PORTD=0xFF; //sC dHng .iBn trW n*i ko ln. DDRB=0xFF; //PORTB l Output .1 xu5t LED 7 .o:n
MCUCR|=(1<<ISC11)|(1<<ISC01); //c2 2 ngMt l ngMt c:nh xuRng GICR |=(1<<INT1)|(1<<INT0); //cho php 2 ngMt ho:t .*ng sei(); //set bit I cho php ngMt ton cHc
DDRC=0xFF; //PORTC l Output while (1){ //vng lDp v tAn PORTC++; //qut PORTC _delay_loop_2(60000); } return 0; }
//Trnh phHc vH ngMt c^a INT0 ISR(INT0_vect){ val++; //n>u c ngMt INT0 x2y ra, tKng val thm 1 if (val>9) val=0; //gi?i h:n khng v<Xt qu 9 PORTB=val; }
//Trnh phHc vH ngMt c^a INT1 ISR(INT1_vect){ val--; //n>u c ngMt INT1 x2y ra, gi2m val .i 1 if (val<0) val=9; //gi?i h:n khng nh_ h@n 0 PORTB=val; SU T!M V BIN SO#N B%I NTINSIDE Ntinside 38 } C lc .o:n code ny kh dI hi1u n>u cc b:n theo di t; .Lu bi h-c, ti chU gi2i thch nh[ng nt c@ b2n v m?i. t<Wng l chng ta sC dHng 1 bi>n t:m 8 bit, c d5u .1 l<u gi trS .>m, tn bi>n val, mYi khi c ngMt trn chn INT0, tKng val 1 .@n vS v ng<Xc l:i khi c ngMt trn INT1, gi2m val .i 1, . l n*i dung c^a 2 trnh phHc vH ngMt. Trong ch<@ng trnh chnh, tr<?c h>t chng ta th`c hiBn viBc xc lAp ho:t .*ng cho 2 ngMt, sau . .<a ch<@ng trnh vo 1 vng lDp v tAn while(1), PORTC .<Xc dng .1 ki1m tra rZng ch<@ng trnh trong vng lDp v tAn van .ang ho:t .*ng. C lc phLn kh hi1u nh5t trong .o:n code l cch m ti dng .1 khai bo cho 2 thanh ghi .i/u khi1n ngMt MCUCR v GICR. N>u xem l:i b2ng tm tMt cc ton tC c^a C, ton tC << .<Xc g-i l ton tC dSch tri dng trn d:ng nhS phn c^a cc con sR, n>u b:n th5y x=5<<3 ngh\a l dSch cc bit nhS phn c^a 5 sang tri 3 vS tr v gn cho x, nh< m t2 nh< sau:
B:n th5y ton b* cc bit c^a 5 . dSch sang tri 3 vS tr v gi trS c^a sR m?i thu .<Xc l x=40, ch 40=5x8=5x2^3 . Hy nhn cu lBnh MCUCR|=(1<<ISC11)|(1<<ISC01), giQ th b:n . hi1u (1<<ISC11) ngh\a l dSch sR 1 sang tri ISC11 vS tr, v (1<<ISC01) l dSch sR 1 sang tri ISC01 vS tr, nh<ng ISC11 v ISC01 W .u ra v gi trS c^a chng l bao nhiu? B:n ch , khi b:n include file io.h th file iom8.h .<Xc chn vo, v trong file ny chGa khai bo .Sa chU cc thanh ghi c^a chip atmega8, cc tn bit c7ng .<Xc khai bo sdn trong file ny, n>u b:n mW file iom8.h (th<Qng nZm trong th< mHc ~\WinAVR\avr\include\avr) bZng 1 ch<@ng trnh text editor nh< notepad, dng chGc nKng find b:n sc th5y cc dng .Snh ngh\a nh< sau: /* MCUCR */ #define SE 7 #define SM2 6 #define SM1 5 #define SM0 4 #define ISC11 3 #define ISC10 2 #define ISC01 1 #define ISC00 0 by l .Snh ngh\a vS tr cc bit trong thanh ghi MCUCR, vAy l . r, ISC11=3, ISC01=1, do .: (1<<ISC11) t<@ng .<@ng (1<<3) = 00001000 (Binary) v (1<<ISC01) = 00000010, b:n hy t<Wng t<Xng rZng b:n . mang sR 1 .>n cc vS tr c^a ISC11 v ISC01 trong thanh ghi MCUCR. By giQ .>n l<Xt ton tC OR bitwise |. (1<<ISC11) = 00001000 (1<<ISC01) = 00000010 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 39 -------------------------------------------------- (1<<ISC11)|(1<<ISC01) = 00001010 Gn gi trS ny cho MCUCR, .Ri chi>u v?i b2ng cc gi trS c^a cc bit ISC (b2ng 9) b:n sc th5y chng ta .ang set cho 2 ngMt l falling edge. bi/u cuRi cng c^a cu lBnh set MCUCR l cch rt g-n cu lBnh MCUCR|=(1<<ISC11)|(1<<ISC01) th`c ch5t l MCUCR= MCUCR| ((1<<ISC11)|(1<<ISC01)), .y l cch set m*t sR bit trong m*t thanh ghi m khng muRn lm 2nh h<Wng .>n cc bit khc (nh<ng b:n ph2i thAt c]n thAn v?i cch lm ny v c th1 sc ph2n tc dHng n>u b:n khng nMm r), b:n c th1 gn tr`c ti>p MCUCR=(1<<ISC11)|(1<<ISC01), hay nhanh h@n MCUCR=0x0A (0x0A=00001010). VAy l do no khi>n ti bi>n 1 cu lBnh gn .@n gi2n thnh m*t bi ton kh hi1u, cu tr2 lQi chnh l tnh teng qut, trong cc chip AVR khc nhau, vS tr cc bit trong cc thanh ghi l r5t khc nhau, cu lBnh MCUCR=0x0A .ng cho atmega8 nh<ng khng p dHng .<Xc cho cc chip khc trong khi cu lBnh MCUCR=(1<<ISC11)|(1<<ISC01) th ho:t .*ng tRt, m*t l do khc l cch vi>t gin ti>p ny gip ng<Qi khc (hay chnh b:n) khi .-c code c th1 dI dng hi1u .<Xc .P ng<Qi vi>t Ti ngh\ b:n . qu hi1u dng lBnh ti>p theo, GICR |=(1<<INT1)|(1<<INT0). Ti d;ng gi2i thch .o:n code W .y v c7ng d;ng bi AVR3, b:n hy th`c tAp bZng cch vi>t l:i .o:n code trn bZng ASM.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 40 Bi 4 - Timer - Counter
I. Gi-i thi0u. Trong bi 3 ti . gi?i thiBu khi qut ph<@ng php lAp trnh bZng ngn ng[ C cho AVR v?i WinAVR v cch sC dHng ngMt trong AVR. Bi 4 ny chng ta sc kh2o st cc ch> .* ho:t .*ng c^a ph<@ng php .i/u khi1n cc b* .Snh thQi, .>m (Timer/Counter) trong AVR. Cng cH phHc vH cho bi ny van l b* cng cH WinAVR v phLn m/m m ph_ng Proteus. Ti van dng chip Atmega8 .1 lm v dH. M*t .i/u khng may mMn l khng ph2i t5t c2 cc b* Timer/Counter trn t5t c2 cc dng chip AVR l nh< nhau, v th> nh[ng g ti trnh by trong bi ny c th1 sc khng .ng v?i cc dng AVR khc nh< AT90STuy nhin ti c7ng sc cR gMng chU ra m*t sR .i1m khc biBt c@ b2n .1 cc b:n c th1 t` mnh .i/u khi1n cc chip khc. N*i dung bi h-c ny bao gPm: NMm bMt c@ b2n cc b* Timer/Counter c trn AVR. SC dHng cc Timer/Counter nh< cc b* .Snh thQi. SC dHng cc Timer/Counter nh< cc b* .>m. SC dHng cc Timer/Counter nh< cc b* t:o xung .i/u r*ng PWM. Vi>t m*t v dH .i/u khi1n .*ng c@ RC servo bZng PWM. II. TKng quan cc bD Timer/Counter trn chip Atmega8. Timer/Counter l cc module .*c lAp v?i CPU. ChGc nKng chnh c^a cc b* Timer/Counter, nh< tn g-i c^a chng, l .Snh th (t:o ra m*t kho2ng thQi gian, .>m thQi gian) v .>m s` kiBn. Trn cc chip AVR, cc b* Timer/Counter cn c thm chGc nKng t:o ra cc xung .i/u r*ng PWM (Pulse Width Modulation), W m*t sR dng AVR, m*t sR Timer/Counter cn .<Xc dng nh< cc b* canh chUnh thQi gian (calibration) trong cc Gng dHng thQi gian th`c. Cc b* Timer/Counter .<Xc chia theo .* r*ng thanh ghi chGa gi trS .Snh thQi hay gi trS .>m c^a chng, cH th1 trn chip Atmega8 c 2 b* Timer 8 bit (Timer/Counter0 v Timer/Counter2) v 1 b* 16 bit (Timer/Counter1). Ch> .* ho:t .*ng v ph<@ng php .i/u khi1n c^a t;ng Timer/Counter c7ng khng hon ton giRng nhau, v dH W chip Atmega8: Timer/Counter0: l m*t b* .Snh thQi, .>m .@n gi2n v?i 8 bit. G-i l .@n gi2n v b* ny chU c 1 ch> .* ho:t .*ng (mode) so v?i 5 ch> .* c^a b* Timer/Counter1. Ch> .* hoat .*ng c^a Timer/Counter0 th`c ch5t c th1 coi nh< 2 ch> .* nh_ (v c7ng l 2 chGc nKng c@ b2n) . l t:o ra m*t kho2ng thQi gian v .>m s` kiBn. Ch l trn cc chip AVR dng mega sau ny SU T!M V BIN SO#N B%I NTINSIDE Ntinside 41 nh< Atmega16,32,64chGc nKng c^a Timer/Counter0 .<Xc nng ln nh< cc b* Timer/Counter1 Timer/Counter1: l b* .Snh thQi, .>m .a nKng 16 bit. B* Timer/Counter ny c 5 ch> .* ho:t .*ng chnh. Ngoi cc chGc nKng thng th<Qng, Timer/Counter1 cn .<Xc dng .1 t:o ra xung .i/u r*ng PWM dng cho cc mHc .ch .i/u khi1n. C th1 t:o 2 tn hiBu PWM .*c lAp trn cc chn OC1A (chn 15) v OC1B (chn 16) bZng Timer/Counter1. Cc b* Timer/Counter ki1u ny .<Xc tch hXp thm kh nhi/u trong cc chip AVR sau ny, v dH Atmega128 c 2 b*, Atmega2561 c 4 b* Timer/Counter2: tuy l m*t module 8 bit nh< Timer/Counter0 nh<ng Timer/Counter2 c .>n 4 ch> .* ho:t .*ng nh< Timer/Counter1, ngoi ra n n cn .<Xc sC dHng nh< m*t module canh chUnh thQi gian cho cc Gng dHng thQi gian th`c (ch> .* asynchronous). Trong ph:m vi bi 4 ny, ti ch^ y>u h<?ng dan cch sC dHng 4 ch> .* ho:t .*ng c^a cc Timer/Counter. Ch> .* asynchronous c^a Timer/Counter2 sc .<Xc b_ qua v c th1 ch> .* ny khng .<Xc sC dHng phe bi>n. Tr<?c khi kh2o st ho:t .*ng c^a cc Timer/Counter, chng ta thRng nh5t cch g-i tMt tn g-i c^a cc Timer/Counter l T/C, v dH T/C0 .1 chU Timer/Counter0 II. SU d5ng Timer/Counter. C m*t sR .Snh ngh\a quan tr-ng m chng ta cLn nMm bMt tr<?c khi sC dHng cc T/C trong AVR: BOTTOM: l gi trS th5p nh5t m m*t T/C c th1 .:t .<Xc, gi trS ny lun l 0. MAX: l gi trS l?n nh5t m m*t T/C c th1 .:t .<Xc, gi trS ny .<Xc quy .Snh bWi bWi gi trS l?n nh5t m thanh ghi .>m c^a T/C c th1 chGa .<Xc. V dH v?i m*t b* T/C 8 bit th gi trS MAX lun l 0xFF (tGc 255 trong hB thAp phn), v?i b* T/C 16 bit th MAX bZng 0xFFFF (65535). Nh< th> MAX l gi trS khng .ei trong mYi T/C. TOP: l gi trS m khi T/C .:t .>n n sc thay .ei tr:ng thi, gi trS ny khng nh5t thi>t l sR l@n nh5t 8 bit hay 16 bit nh< MAX, gi trS c^a MAX c th1 thanh .ei bZng cch .i/u khi1n cc bit .i/u khi1n t<@ng Gng hoDc c th1 nhAp tr; ti>p thng qua m*t sR thanh ghi. Chng ta sc hi1u r v/ gi trS TOP trong lc kh2o st T/C1. 1. Timer/Counter0: Thanh ghi: c 4 thanh ghi .<Xc thi>t k> ring cho ho:t .*ng v .i/u khi1n T/C0, . l: SU T!M V BIN SO#N B%I NTINSIDE Ntinside 42 TCNT0 (Timer/Counter Register): l 1 thanh ghi 8 bit chGa gi trS vAn hnh c^a T/C0. Thanh ghi ny cho php b:n .-c v ghi gi trS m*t cch tr`c ti>p. TCCR0 (Timer/Counter Control Register): l thanh ghi .i/u khi1n ho:t .*ng c^a T/C0. Tuy l thanh ghi 8 bit nh<ng th`c ch5t chU c 3 bit c tc dHng . l CS00, CS01 v CS02.
Cc bit CS00, CS01 v CS02 g-i l cc chip ch-n nguPn xung nhSp cho T/C0 (Clock Select). ChGc nKng cc bit ny .<Xc m t2 trong b2ng 1. B2ng 1: chGc nKng cc bit CS0X
TIMSK (Timer/Counter Interrupt Mask Register): l thanh ghi mDt n: cho ngMt c^a t5t c2 cc T/C trong Atmega8, trong . chU c bit TOIE0 tGc bit sR 0 (bit .Lu tin) trong thanh ghi ny l lin quan .>n T/C0, bit ny c tn l bit cho php ngMt khi c trn W T/C0. Trn (Overflow) l hiBn t<Xng x2y ra khi b* gi trS trong thanh ghi TCNT0 . .:t .>n MAX (255) v l:i .>m thm 1 lLn n[a.
Khi bit TOIE0=1, v bit I trong thanh ghi tr:ng thi .<Xc set (xem l:i bi 3 v/ .i/u khi1n ngMt), n>u m*t trn x2y ra sc dan .>n ngMt trn. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 43 TIFR (Timer/Counter Interrupt Flag Register): l thanh ghi cQ nh? cho t5t c2 cc b* T/C. Trong thanh ghi ny bit sR 0, TOV0 l cQ chU thS ngMt trn c^a T/C0. Khi c ngMt trn x2y ra, bit ny t` .*ng .<Xc set ln 1. Thng th<Qng trong .i/u khi1n cc T/C vai tr c^a thanh ghi TIFR khng qu quan tr-ng. Ho3t =Dng: T/C0 ho:t .*ng r5t .@n gi2n, ho:t .*ng c^a T/C .<Xc kch bWi m*t tn hiBu (signal), cG mYi lLn xu5t hiBn tn hiBu kch gi trS c^a thanh ghi TCNT0 l:i tKng thm 1 .@n vS, thanh ghi ny tKng cho .>n khi n .:t mGc MAX l 255, tn hiBu kch ti>p theo sc lm thanh ghi TCNT0 trW v/ 0 (trn), lc ny bit cQ trn TOV0 sc t` .*ng .<Xc set bZng 1. V?i cch thGc ho:t .*ng nh< th> c vf T/C0 v dHng v cG tKng t; 0 .>n 255 rPi l:i quay v/ khng v qu trnh lDp l:i. Tuy nhin, y>u tR t:o s` khc biBt chnh l tnh hiBu kch v ngMt trn, k>t hXp 2 y>u tR ny chng ta c th1 t:o ra 1 b* .Snh thQi gian hoDc 1 b* .>m s` kiBn. Tr<?c h>t b:n hy nhn l:i b2ng 1 v/ cc bit ch-n xung nhSp cho T/C0. Xung nhSp cho T/C0 chnh l tn hiBu kch cho T/C0, xung nhSp ny c th1 t:o bZng nguPn t:o dao .*ng c^a chip (th:ch anh, dao .*ng n*i trong chip). BZng cch .Dt gi trS cho cc bit CS00, CS01 v CS02 c^a thanh ghi .i/u khi1n TCCR0 chng ta sc quy>t .Snh bao lu th sc kch T/C0 m*t lLn. V dH m:ch Gng dHng c^a b:n c nguPn dao .*ng clkI/O = 1MHz tGc chu kN 1 nhSp l 1us ( 1 micro giy), b:n .Dt TCCR0=5 (SC02=1, CS01=0, CS00=1), cKn cG theo b2ng 1 tn hiBu kch cho T/C0 sc bZng clkI/O/1024 ngh\a l sau 1024us th T/C0 m?i .<Xc kch 1 lLn, ni cch khc gi trS c^a TCNT0 tKng thm 1 sau 1024us (ch l tLn sR .<Xc chia cho 1024 th chu kN sc tKng 1024 lLn). Quan st 2 dng cuRi cng trong b2ng 1 b:n sc th5y rZng tn hiBu kch cho T/C0 c th1 l5y t; bn ngoi (External clock source), .y chnh l t<Wng cho ho:t .*ng c^a chGc nKng .>m s` kiBn trn T/C0. BZng cch thay .ei tr:ng thi chn T0 (chn 6 trn chip Atmega8) chng ta sc lm tKng gi trS thanh ghi TCNT0 hay ni cch khc T/C0 c th1 dng .1 .>m s` kiBn x2y ra trn chn T0. D<?i .y chng ta sc xem xt cH th1 cch .i/u khi1n T/C0 theo 1 ch> .* .Snh thQi gian v .>m. 1.1 B $%nh th'i gian. Chng ta c th1 t:o ra 1 b* .Snh th .1 ci .Dt m*t kho2ng thQi gian no .. V dH b:n muRn rZng cG sau chnh xc 1ms th chn PB0 thay .ei tr:ng thi 1 lLn (nh5p nhy), b:n l:i khng muRn dng cc lBnh delay nh< tr<?c nay van dng v nh<Xc .i1m c^a delay l CPU khng lm g c2 trong lc delay, v th> trong nhi/u tr<Qng hXp cc lBnh delay r5t h:n ch> .<Xc sC dHng. By giQ chng ta dng T/C0 .1 lm viBc ny, t<Wng l chng ta cho SU T!M V BIN SO#N B%I NTINSIDE Ntinside 44 b* .>m T/C0 ho:t .*ng, khi n .>m .^ 1ms th n sc t` kch ho:t ngMt trn, trong trnh phHc vH ngMt trn chng tat hay .ei tr:ng thi chn PB0. Ti minh h-a t<Wng nh< trong hnh 1.
Hnh 1. So snh 2 cch lm viBc. (CPU nop: CPU khng lm g c2) M*t v5n ./ n2y sinh lc ny, nh< ti trnh by trong phLn tr<?c, T/C0 chU .>m t; 0 .>n 255 rPi l:i quay v/ 0 (x2y ra 1 ngMt trn), nh< th> d<Qng nh< chng ta khng th1 ci .Dt gi trS mong muRn b5t kN cho T/C0? Cu tr2 lQi l chng ta c th1 bZng cch gn tr<?c m*t gi trS cho thanh ghi TCNT0, khi 5y T/C0 sc .>m t; gi trS m chng ta gn tr<?c v k>t thc W 255. Tuy nhin do khi trn x2y ra, TCNT0 l:i .<Xc t` .*ng tr2 v/ 0, do . viBc gn gi trS khWi t:o cho TCNT0 ph2i .<Xc th`c hiBn lin tHc sau mYi lLn x2y ra trn, vS tr tRt nh5t l .Dt trong trnh phHc vH ngMt trn. ViBc cn l:i v c7ng l viBc quan tr-ng nh5t l viBc tnh ton gi trS chia (prescaler) cho xung nhSp c^a T/C0 v viBc xc .Snh gi trS khWi .Lu cLn gn cho thanh ghi TCNT0 .1 c .<Xc 1 kho2ng thQi gian .Snh th chnh xc nh< mong muRn. Tr<?c h>t chng ta sc ch-n prescaler sao cho hXp l nh5t (ch-n gi trS chia bZng cch set 3 bit CS02,CS01,CS00). Gi2 sC nguPn xung clock nui chip c^a chng ta l clkI/O=1MHz tGc l 1 nhSp m5t 1us, n>u chng ta .1 prescaler=1, tGc l tLn sR c^a T/C0 (t:m g-i l fT/C0) c7ng bZng clkI/O=1MHz, cG 1us T/C0 .<Xc kch v TCNT0 sc tKng 1 .@n vS. Khi . gi trS l?n nh5t m T/C0 c th1 .:t .<Xc l 256 x 1us=256us, gi trS ny nh_ h@n 1ms m ta mong muRn. N>u ch-n prescaler=8 (xem b2ng 1) ngh\a l cG sau 8 nhSp (8us) th TCNT0 m?i tKng 1 .@n vS, kh2 nKng l?n nh5t m T/C0 .>m .<Xc l 256 x 8us=2048us, l?n h@n 1ms, vAy ta hon ton c th1 sC dHng prescaler=8 .1 t:o ra m*t kho2ng .Snh th 1ms. B<?c ti>p theo l xc .Snh gi trS khWi .Lu c^a TCNT0 .1 T/C0 .>m .ng 1ms (1000us). (ng v?i prescaler=8 chng ta . bi>t l cG 8us th TCNT0 tKng 1 .@n vS, dI dng tnh SU T!M V BIN SO#N B%I NTINSIDE Ntinside 45 .<Xc b* .>m cLn .>m 1000/8=125 lLn .1 h>t 1ms, do . gi trS ban .Lu c^a TCNT0 ph2i l 256-125=131. B:n c th1 quan st hnh 2 .1 hi1u th5u .o h@n.
Hnh 2. Qu trnh th`c hiBn. Hy t:o 1 Project bZng Programmer Notepad v?i tn g-i TIMER0 v vi>t .o:n code cho Project ny nh< trong list 1. List 1. bSnh th 1ms v?i T/C0.
int main(void){ DDRB=0xFF; //PORTB la output PORT PORTB=0x00;
TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8 TCNT0=131; //gan gia tri khoi tao cho T/C0 TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0 sei(); //set bit I cho phep ngat toan cuc
while (1){ //vng lDp v tAn //do nothing } return 0; }
//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 } SU T!M V BIN SO#N B%I NTINSIDE Ntinside 46
bo:n code r5t .@n gi2n, b:n chU cLn ch .>n 3 dng khai bo cho T/C0 (dng 9, 10, 11). V?i dng 9: TCCR0=(1<<CS01) l 1 cch set bit CS01 trong thanh ghi .i/u khi1n TCCR0 ln 1, 2 bit CS02 v CS00 .<Xc .1 gi trS 0 (b:n xem l:i bi 3 v/ cch set cc bit .Dc biBt trong cc thanh ghi), tm l:i dng ny t<@ng .<@ng TCCR0=2, gi trS Prescaler .<Xc ch-n bZng 8 (tham kh2o b2ng 1). Dng 10 chng ta gn gi trS khWi t:o cho thanh ghi TCNT0. V dng 11 set bit TIOE0 ln 1 .1 cho php ngMt x2y ra khi c trn W T/C0. Trong trnh phHc vH ngMt trn T/C0, chng ta sc th`c hiBn .ei tr:ng thi chn PB0 bZng ton t; XOR (^), ch .>n ngh\a c^a ton tC XOR: n>u XOR m*t bit v?i sR 1 th bit ny sc chuy1n tr:ng thi (t; 0 sang 1 v ng<Xc l:i). CuRi cng v quan tr-ng l chng ta cLn gn l:i gi trS khWi t:o cho T/C0. B:n c th1 vc mt m:ch .iBn m ph_ng .@n gi2n dng 1 Oscilloscope nh< trong hnh 3 .1 ki1m tra ho:t .*ng c^a .o:n code.
Hnh 3. M ph_ng .Snh th c^a T/C0. 1.2 B $*m s- ki/n. Nh< ti trnh by trong phLn ho:t .*ng c^a T/C0, chng ta c th1 dng T/C0 nh< m*t b* .>m (counter) .1 .>m cc s` kiBn (s` thay .ei tr:ng thi) x2y ra trn chn T0. BZng cch .Dt gi trS cho thanh ghi TCCR0 = 6 (CS02=1, CS01=1, CS00=0) cho php .>m c:nh xuRng trn chn T0, n>u TCCR0 = 7 (CS02=1, CS01=1, CS00=1) th c:nh ln trn chn T0 sc .<Xc .>m. C sC dHng ngMt hay khng phH thu*c vo mHc .ch sC dHng. Kh2o st 1 v dH .@n gi2n gLn giRng v?i v dH .>m trong bi AVR2 nh<ng sC dHng T/C0 v chU .>m 1 chi/u tKng. K>t nRi m:ch .iBn nh< trong hnh 4, SU T!M V BIN SO#N B%I NTINSIDE Ntinside 47 mYi lLn Button 1 .<Xc nh5n, gi trS .>m tKng thm 1. Button 2 dng reset gi trS .>m v/ 0. bo:n code cho v dH thG 2 ny .<Xc trnh by trong List 2.
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 lDp v tAn 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; } SU T!M V BIN SO#N B%I NTINSIDE Ntinside 48 .<Xc khi bo input v cc button .<Xc nRi v?i PORT ny. T/C0 .<Xc khai bo sC dHng nguPn kch ngoi t; T0, d:ng c:nh xuRng thng qua dng TCCR0=(1<<CS02)|(1<<CS01), b:n c7ng c th1 khai bo t<@ng .<@ng l TCCR0=6 (tham kh2o b2ng 1). Gi trS c^a b* .>m sc .<Xc xu5t ra PORTB .1 ki1m tra. bi1m ch trong .o:n ch<@ng trnh ny l macro bit_is_clear, .y l m*t macro .<Xc .Snh ngh\a trong file sfr_defs.h dng .1 ki1m tra 1 bit trong m*t thanh ghi .Dc biBt c .<Xc xa (bZng 0) hay khng, trong tr<Qng hXp c^a .o:n code trn: if(bit_is_clear(PIND,7)) TCNT0=0; ngh\a l ki1m tra xem n>u chn PD7 .<Xc ko xuRng 0 (button 2 .<Xc nh5n) th sc reset b* .>m v/ 0. Nh< vAy viBc sC dHng T/C0 l t<@ng .Ri .@n gi2n, b:n chU cLn khai bo cc gi trS thch hXp cho thanh ghi .i/u khi1n TCCR0 bZng cch tham kh2o b2ng 1, sau . khWi t:o gi trS cho TCNT0 (n>u cLn thi>t), khai bo c sC dHng ngMt hay khng bZng cch set hay khng set bit TOIE0 trong thanh ghi TIMSK l hon t5t. 2. Timer/Counter1: Timer/Counter1 l b* T/C 16 bits, .a chGc nKng. by l b* T/C r5t l t<Wng cho lAp trnh .o l<Qng v .i/u khi1n v c .* phn gi2i cao (16 bits) v c kh2 nKng t:o xung .i/u r*ng PWM (Pulse Width Modulation th<Qng dng .1 .i/u khi1n .*ng c@). Thanh ghi: c kh nhi/u thanh ghi lin quan .>n T/C1. V l T/C 16 bits trong khi .* r*ng b* nh? d[ liBu c^a AVR l 8 bit (xem l:i bi 2) nn .i khi cLn dng nh[ng cDp thanh ghi 8 bits t:o thnh 1 thanh ghi 16 bit, 2 thanh ghi 8 bits sc c tn k>t thc bZng cc k t` L v H trong . L l thanh ghi chGa 8 bits th5p (LOW) v H l thanh ghi chGa 8 bits cao (High) c^a gi trS 16 bits m chng t:o thnh. TCNT1H v TCNT1L (Timer/Counter Register): l 2 thanh ghi 8 bit t:o thnh thanh ghi 16 bits (TCNT1) chGa gi trS vAn hnh c^a T/C1. C2 2 thanh ghi ny cho php b:n .-c v ghi gi trS m*t cch tr`c ti>p. 2 thanh ghi .<Xc k>t hXp nh< sau:
TCCR1A v TCCR1B (Timer/Counter Control Register): l 2 thanh ghi .i/u khi1n ho:t .*ng c^a T/C1. T5t c2 cc mode ho:t .*ng c^a T/C1 ./u .<Xc xc .Snh thng qua cc bit trong 2 thanh ghi ny. Tuy nhin, .y SU T!M V BIN SO#N B%I NTINSIDE Ntinside 49 khng ph2i l 2 byte cao v th5p c^a m*t thanh ghi m l 2 thanh ghi hon ton .*c lAp. Cc bit trong 2 thanh ghi ny bao gPm cc bit ch-n mode hay ch-n d:ng sng (Waveform Generating Mode WGM), cc bit quy .Snh d:ng ng ra (Compare Output Match COM), cc bit ch-n gi trS chia prescaler cho xung nhSp (Clock Select CS)C5u trc c^a 2 thanh ghi .<Xc trnh by nh< bn d<?i.
Nhn chung .1 thu*c h>t cch phRi hXp cc bit trong 2 thanh ghi TCCR1A v TCCR1B l t<@ng .Ri phGc t:p v T/C1 c r5t nhi/u mode ho:t .*ng, chng ta sc kh2o st chng trong phLn cc ch> .* ho:t .*ng c^a T/C1 bn d<?i. % .y, trong thanh ghi TCCR1B c 3 bit kh quen thu*c l CS10, CS11 v CS12. by l cc bit ch-n xung nhSp cho T/C1 nh< truong T/C0. B2ng 2 sc tm tMt cc ch> .* xung nhSp trong T/C1. B2ng 2: chGc nKng cc bit CS12, CS11 v CS10.
OCR1A v OCR1B (Ouput Compare Register A v B): c m*t sR khi niBm m?i m chng ta cLn bi>t khi lm viBc v?i T/C1, m*t trong sR . l Ouput Compare (sorry, I dont wanna translate it to Vietnamese). Trong lc T/C ho:t .*ng, gi trS thanh ghi TCNT1 tKng, gi trS ny .<Xc lin tHc so snh v?i cc thanh ghi OCR1A v OCR1B (so snh .*c lAp v?i t;ng thanh ghi), viBc so snh ny trn AVR g-i l g-i l Ouput Compare. Khi gi trS so snh bZng nhau th 1 Match x2y ra, khi . m*t ngMt hoDc 1 s` thay .ei trn chn OC1A (hoDc/v chn OC1B) x2y ra (.y l cch t:o PWM bWi T/C1). T:i sao l:i c A v B? b l v ng<Qi thi>t k> AVR muRn mW r*ng kh2 nKng Gng dHng T/C1 cho b:n. A v B .:i diBn cho 2 knh (channel) v B. C7ng v .i/u ny m chng ta c th1 t:o 2 knh PWM bZng T/C1. Tm l:i, c@ b2n 2 thanh ghi ny chGa cc gi trS .1 so snh, chGc nKng v cc ch> .* ho:t .*ng cH th1 c^a chng sc .<Xc kh2o st trong cc phLn sau. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 50
ICR1 (InputCapture Register 1): khi niBm m?i thG 2 c^a T/C1 l Input Capture. Khi c 1 s` kiBn trn chn ICP1 (chn 14 trn Atmega8), thanh ghi ICR1sc capture gi trS c^a thanh ghi .>m TCNT1. M*t ngMt c th1 x2y ra trong tr<Qng hXp ny, v th> Input Capture c th1 .<Xc dng .1 cAp nhAt gi trS TOP c^a T/C1. TIMSK (Timer/Counter Interrupt Mask Register): cc b* T/C trn AVR dng chung thanh ghi mDt n: ngMt, v th> TIMSK c7ng .<Xc dng .1 quy .Snh ngMt cho T/C1. C .i/u lc ny chng ta chU quan tm .>n cc bit t; 2 .>n 5 c^a TIMSK. C t5t c2 4 lo:i ngMt trn T/C1 (nh? l:i T/C0 chU c 1 lo:i ngMt trn)
Bit 2 trong TIMSK l TOIE1, bit quy .Snh ngMt trn cho thanh T/C1 (t<@ng t` tr<Qng hXp c^a T/C0). Bit 3, OCIE1B l bit cho php ngMt khi c 1 Match x2y ra trong viBc so snh TCNT1 v?i OCR1B. Bit 4, OCIE1A l bit cho php ngMt khi c 1 Match x2y ra trong viBc so snh TCNT1 v?i OCR1A. Bit 5, TICIE1 l bit cho php ngMt trong tr<Qng hXp Input Capture .<Xc dng. Cng v?i viBc set cc bit trn, bit I trong thanh ghi tr:ng thi ph2i .<Xc set n>u muRn sC dHng ngMt (xem l:i bi 3v/ .i/u khi1n ngMt). TIFR (Timer/Counter Interrupt Flag Register): l thanh ghi cQ nh? cho t5t c2 cc b* T/C. Cc bit t; 2 .>n 5 trong thanh ghi ny l cc cQ tr:ng thi c^a T/C1.
Cc mode ho:t .*ng: c t5t c2 5 ch> .* ho:t .*ng chnh trn T/C1. Cc ch> .* ho:t .*ng c@ b2n .<Xc quy .Snh bWi 4 bit Waveform Generation Mode (WGM13, WGM12, WGM11 WGM10) v m*t sR bit phH khc. 4 bit Waveform Generation Mode l:i .<Xc bR tr nZm trong 2 thanh ghi TCCR1A SU T!M V BIN SO#N B%I NTINSIDE Ntinside 51 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> cLn phRi hXp 2 thanh ghi TCCR1 trong lc .i/u khi1n T/C1. Cc ch> .* ho:t .*ng c^a T/C1 .<Xc tm tMt trong b2ng sau 3: B2ng 3: cc bit WGM v cc ch> .* ho:t .*ng c^a T/C1. 2.1 Normal mode (Ch* $ th.'ng). by l ch> .* ho:t .*ng .@n gi2n nh5t c^a T/C1. Trong ch> .* ny, thanh ghi .>m TCNT1 .<Xc tKng gi trS t; 0 (BOTTOM) .>n 65535 hay 0xFFFF (TOP) v quay v/ 0. Ch> .* ny hon ton giRng cch m Timer0 ho:t .*ng chU c khc l gi trS .>m cao nh5t l 65535 thay v 255 nh< trong timer0. Nhn vo b2ng 3, .1 set T/C1 W Normal mode chng ta cLn set 4 bit WGM v/ 0, v 0 l gi trS mDc .Snh c^a cc thanh ghi nn th`c t> chng ta khng cLn tc .*ng .>n cc bit WGM. Duy nh5t m*t viBc quan tr-ng cLn lm l set cc bit Clock Select (CS12, SC11, CS10) trong thanh ghi TCCR1B (xem thm b2ng 2). B:n c th1 tham kh2o v dH c^a Timer0. bo:n code trong list 3 l 1 v dH t:o 1 kho2ng thQi gian 10ms bZng T/C1, normal mode: List 3. bSnh th 10ms v?i T/C1.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 int main(void){ DDRB=0xFF; //PORTB la output PORT PORTB=0x00;
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 lDp v tAn //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 n*u x0y ra b3ng trong so snh)-CTC. M*t cch g-i tMt c^a ch> .* ho:t .*ng ny l CTC, m*t ch> .* ho:t .*ng m?i trn T/C1. Nhn vo b2ng 3 b:n sc th5y c 2 mode CTC (mode 4 v mode 12). Ti l5y v dH mode 4 .1 gi2i thch ho:t .*ng c^a CTC. Khi b:n set cc bit Waveform Generation Mode tuong Gng: WGM13=0, WGM12=1, WGM11=0, WGM10=0 th mode 4 .<Xc ch-n. Trong mode ny, thanh ghi OCR1A chGa gi trS TOP (gi trS so snh do ng<Qi dng .Dt), thanh ghi .>m TCNT1 tKng t; 0, khi TCNT1 bZng gi trS chGa trong OCR1A th m*t Compare Match x2y ra. Khi ., m*t ngMt c th1 x2y ra n>u chng ta cho php ngMt Compare Match (set bit OCF1A trong thanh ghi TIMSK ln 1). Mode ny c7ng t<@ng .Ri .@n gi2n, m*t Gng dHng c@ b2n c^a mode ny l .@n gi2n ha viBc .>m cc s` kiBn bn ngoi. V dH b:n k>t nRi 1 sensor .>m sR ng<Qi .i vo 1 cKn phng v?i ch5n T1 (chn counter source c^a T/C1), b:n muRn rZng cG sau khi .>m 5 ng<Qi th sc thng bo 1 lLn. List 4 l .o:n code m t2 v dH ny: List 4. PhRi hXp CTC v?i .>m s` kiBn. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 53
10 11 12 13 14 15 16 17 18 19 20 21 22 23 #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){ 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 lDp v tAn //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 chU gi2i thch nh[ng .i1m m?i trong List 4. ThG nh5t l attribute volatile dng tr<?c khai bo bi>n val, bi>n val .<Xc khai bo l unsigned char (8 bit, khng d5u) dng chGa gi trS t:m thQi .1 xu5t ra PORTB khi c ngMt x2y ra. bi/u .Dc biBt l t; kha volatile .Dt tr<?c n, volatile l m*t thu*c tnh (attribute) c^a b* bin dSch gcc-avr, n ni v?i trnh dSch rZng bi>n val sc .<Xc dng trong ch<@ng trnh chnh v c2 trong cc trnh phHc vH ngMt. N>u b:n muRn cAp nhAp gi trS 1 bi>n ton cHc trong cc trnh phHc vH ngMt m bi>n . khng .<Xc chU .Snh thu*c tnh volatile tr<?c th qu trnh cAp nhAt th5t b:i. M*t cch dI hi1u h@n, b:n xem trnh ISR trong v dH trn, cG mYi lLn c ngMt Compare Match x2y ra, bi>n val .<Xc tKng thm 1 (dng 21) sau . ki1m tra .i/u kiBn bZng 10 hay khng v cuRi cng l gn cho PORTB. N>u trong khai bo c^a val (dng 4) chng ta khng chU .Snh volatile th gi trS xu5t ra PORTB sc lun l 1 khi c ngMt. Ch l .i/u ny chU .ng it nh5t l v?i phin b2n WinAVR thng 12 nKm 2007, cc phin b2n sau c th1 khng cLn dng volatile (ti sc cAp nhAt sau). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 54 Dng 8 set cc bit .i/u khi1n: TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS11); b:n th5y ti chU set bit WGM12 trong 4 bit WGM v ti muRn ch-n mode CTC 4 (xem b2ng 3). Hai bit CS12 v CS11 .<Xc set bZng 1 trong khi CS10 .<Xc gi[ W 0 .1 ch-n xung clock l t; bn ngoi, chn T1 (xem b2ng 2). Trong dng 10, OCR1A=4; l gi trS cLn so snh, chng ta bi>t rZng TCNT1 tKng ln t; 0, v th> .1 .>m 5 s` kiBn th cLn .Dt gi trS so snh l 4 (0, 1, 2, 3, 4). Dng 11 set bit cho php ngMt khi c Compare match x2y ra (dng cho channel A). Mode 12 c^a CTC (WGM13=1, WGM12=1, WGM11=0, WGM10=0) c7ng t<@ng t` mode 4 nh<ng ci khc l gi trS cLn so snh .<Xc chGa trong thanh ghi ICR1 (khng ph2i OCR1A hay OCR1B). Khi . n>u muRn dng ngMt th b:n ph2i dng ngMt Input capture. CH th1 dng 8 trong list 4 .ei thnh: TCCR1B=(1<<WGM13)|( (1<<WGM12)|(1<<CS12)|(1<<CS11); dng 10: ICR1=4 v dng 20: ISR (TIMER1_CAPT_vect ){ M*t kh2 nKng khc c^a CTC l xu5t tn hiBu xung vung trn chn OC1A (chn 15 trn Atmega8) bZng cch set cc bit Compare Output Mode trong thanh ghi TCCR1A. Tuy nhin viBc t:o cc tn hiBu output trong mode CTC khng thAt s` th vS. V vAy chng ta sc kh2o st cch t:o tn hiBu output trong 1 ch> .* chuyn nghiBp v th vS h@n, ch> .* PWM. Tr<?c khi bMt .Lu lm viBc v?i cc ch> .* PWM ti ngh\ cLn thi>t gi?i thiBu th> no l PWM v nhMc l:i cc khi niBm gi trS .>m c^a Timer1 (hay b5t kN timer no khc) trn AVR. Tr<?c h>t, PWM hay Pulse Width Modulation .<Xc hi1u theo ngh\a ti>ng ViBt l xung .i/u r*ng l khi niBm chU tn hiBu xung m th<Qng th chu kN (Time period) c^a n .<Xc cR .Snh, duty cycle (thQi thQi gian tn hiBu W mGc HIGH) c^a n c th1 .<Xc thay .ei. B:n xem 1 v dH v/ PWM trong hnh 5.
Hnh 5. V dH v/ tn hiBu PWM. T:o ra PWM tGc l t:o ra nh[ng tn hiBu xung m ta c th1 .i/u khi1n duty cycle (v c2 tLn sR ~ Time period n>u cLn thi>t). Timer 1 trsn Atmega8 l 1 module l t<Wng .1 t:o ra cc tn hiBu d:ng ny. Nh<ng PWM dng .1 lm g v cch m n .<Xc sC dHng nh< th> no? Ti l5y m*t v dH nh< trong hnh 6: m*t .*ng c@ DC v m*t switch button. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 55
Hnh 6. Motor v switch. N>u nh5n button th .*ng c@ ho:t .*ng, th2 button th .*ng c@ d;ng. Tuy nhin do tRc .* nh5n v th2 c^a con ng<Qi c h:n, b:n sc th5y .*ng c@ ho:t .*ng h@i s<Xng (ripple). bi/u g x2y ra n>u b:n nh5n v th2 button v?i vAn tRc 5000 lLn/giy. Cu tr2 lQi l tay b:n sc bS gy v button sc bS h_ng (^^). 5000 lLn/s l .i/u khng t<Wng, tuy nhin n>u b:n lm .<Xc nh< th> th teng thQi gian cho 1 lLn nh5n+th2 l 1:5000=0.0002s = 200us. C s` khc biBt no khng gi[a tr<Qng hXp thQi gian nh5n = 150us, thQi gian th2 50us v tr<Qng hXp thQi gian nh5n l 50us cn thQi gian th2 l 150us. B:n sc dI dng tm cu tr2 lQi, trong tr<Qng hXp 1 .*ng c@ sc quay v?i vAn tRc nhanh h@n tr<Qng hXp 2. b l t<Wng c@ b2n .1 sC dHng PWM .i/u khi1n vAn tRc .*ng c@ (v .i/u khi1n nhi/u thG khc n[a). .1 bi>n ci khng t<Wng trn (5000 lLn/s) thnh hiBn th`c, chng ta sc thay th> ci button c@ kh kia bZng 1 cng tMc .iBn tC (electronics switch). Th<Qng th cc chip MOSFET .<Xc dng lm cc kha .iBn tC. MOSFET th<Qng c 3 chn G (gate), D (drain) v S (source). V dH 1 MOSFET knh N W tr:ng thi thng th<Qng 2 chn D v S ko c dng .iBn ch:y qua, n>u .iBn p chn G l?n h@n chn S kho2ng 3V trW ln th dng .iBn c th1 ch:y t; D sang S. hy xem cch m t2 t<@ng .<@ng 1 MOSFET v?i 1 button trong hnh 7. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 56
Hnh 7. MOSFET v button. ViBc kch cc MOSFET c th1 th`c hiBn bZng cc tn hiBu PWM. V th> t<Wng .i/u khi/n .*ng c@ trong hnh 6 c th1 .<Xc th`c hiBn l:i thng qua PWM nh< trong hnh 8.
Hnh 8. M hnh .i/u khi1n tRc .* .*ng c@ bZng PWM .@n gi2n. Nh< vAy l xong phLn gi?i thiBu v/ PWM, by giQ chng ta sang cc khi niBm sR .>m trong Timer. Hnh 9 minh h-a cch bR tr cc sR .>m trong Timer1 trn hB trHc .>m.
Hnh 9: cc mRc gi trS c^a T/C1. BOTTOM lun .<Xc cR .Snh l 0 (gi trS nh_ nh5t), MAX lun l 0xFFFF (65535). TOP l gi trS .Unh do ng<Qi dng .Snh ngh\a, gi trS c^a TOP c th1 .<Xc cR .Snh l 0xFF (255), 0x1FF (511), 0x3FF 91023) hoDc .Snh ngh\a bWi cc thanh ghi ICR1 hoDc OCR1A. th`c ch5t .Ri v?i Gng dHng SU T!M V BIN SO#N B%I NTINSIDE Ntinside 57 PWM th TOP chnh l Time period c^a PWM. Do mHc .ch sC dHng m c th1 ch-n TOP l cc gi trS cR .Snh hay cc thanh ghi, ring v?i ti, cho mHc .ch t:o tn hiBu PWM ti ch-n TOP .Snh ngh\a bWi thanh ghi ICR1. Ouput Compare l gi trS so snh c^a b* Timer. Trong ch> .* PWM th Output Compare quy .Snh Duty cycle. V?i T/C1, Output Comapre l gi trS trong cc thanh ghi OCR1A v OCR1B. Do c 2 thanh ghi .*c lAp A v B, t<@ng Gng chng ta c th1 t:o ra 2 tn hiBu PWM trn 2 chn OC1A v OC1B bZng T/C1. b .>n lc chng ta tm hi1u cch t:o PWM trn AVR. 2.3 Fast PWM (PWM t5n s6 cao). Trong ch> .* Fast PWM, 1 chu kN .<Xc tnh trong 1 lLn .>m t; BOTTOM ln TOP (single-slope), v th> m ch> .* ny g-i l Fast PWM (PWM nhanh). C t5t c2 5 mode trong Fast PWM t<@ng Gng v?i 5 cch ch-n gi trS TOP khc nhau (tham kh2o b2ng 3). ViBc xc lAp ch> .* ho:t .*ng cho Fast PWM th`c hiBn thng qua 4 bit WGM v cc bit ch-n d:ng xung ng ra, Compare Output Mode trong thanh ghi TCCR1A, nhn l:i 2 thanh ghi TCCR1A v TCCR1B.
Ch cc bit COM1A1, COM1A0 v COM1B1, COM1B0 l cc bit ch-n d:ng tn hiBu ra c^a PWM (Compare Output Mode bits). COM1A1, COM1A0 dng cho knh A v COM1B1, COM1B0 dng cho knh B. Hy .Ri chi>u b2ng 4. B2ng 4: m t2 cc bit COM trong ch> .* fast PWM.
Ti sc gi2i thch ho:t .*ng c^a Fast PWM knh A thng qua 1 tr<Qng hXp cH th1, mode 14 (WGM13=1, WGM12=1, WGM11=1, WGM10=0). Trong mode 14, gi trS TOP (c7ng l chu kN c^a PWM) .<Xc chGa trong thanh ghi ICR1, khi ho:t .*ng thanh ghi TCNT1 tKng gi trS t; 0, gi2 sC cc bit phH COM1A=1, COM1A0=0, lc ny tr:ng thi c^a chn OC1A (chn 15) l HIGH (5V), khi TCNT1 tKng .>n bZng gi trS c^a thanh ghi OCR1A SU T!M V BIN SO#N B%I NTINSIDE Ntinside 58 th chn OC1A .<Xc xa v/ mGc LOW (0V), thanh ghi .>m TCNT1 van ti>p tHc tKng .>n khi no n bZng gi trS TOP chGa trong thanh ghi ICR1 th TCNT1 t` .*ng reset v/ 0 v chn OC1A trW v/ tr:ng thi HIGH, ci ny g-i l Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at TOP m b:n th5y trong hng 4 b2ng 4. Hnh 10 m t2 cch t:o xung PWM trn chn OC1A W mode 14.
Hnh 10: Fast PMW mode 14. R rng chng ta c th1 .i/u khi1n c2 time period v duty cycle c^a PWM bZng 2 thanh ghi ICR1 v OCR1A. Thng th<Qng gi trS c^a ICR1 .<Xc tnh ton v gn cR .Snh, gi trS c^a OCR1A .<Xc thay .ei .1 th`c hiBn mHc .ch .i/u khi1n (nh< thay .ei vAn tRc .*ng c@). Ch l n>u chng ta set cc bit phH ng<Xc l:i: COM1A=0, COM1A0=1, th tn hiBu PWM trn chn OC1A sc c phLn LOW t; 0 .>n OCR1A v HIGH t; OCR1A .>n ICR1, .y g-i l set OC1A/OC1B on Compare Match, clear OC1A/OC1B at TOP (ng<Xc v?i tn hiBu trn hnh 10). Ho:t .*ng c^a fast PWM knh B hon ton t<@ng t`, trong . thanh ghi ICR1 c7ng chGa TOP c^a PWM knh B v thanh ghi ICR1B chGa duty cycle. Nh< vAy 2 knh A v B c cng tLn sR hay Time period v duty cycle .<Xc .i/u khi1n .*c lAp. Chn xu5t tn hiBu PWM c^a knh B l chn OC1B (chn 16 trn Atmega8). Cc mode 5, 6 v 7 c^a Fast PWM ho:t .*ng hon ton t<@ng t` mode 14. bi1m khc nhau c@ b2n l gi trS TOP(Time period). Trong cc mode ny gi trS TOP khng do thanh thi ICR1 .Snh ngh\a m l cc hZng sR khng .ei. V?i mode 5, tGc mode 8 bits, (WGM13=0, WGM12=1, WGM11=0, WGM10=1) gi trS TOP l 1 hZng sR, TOP = 255 (sR 8 bits l?n nh5t). V?i mode 6, tGc mode 9 bits, (WGM13=0, WGM12=1, WGM11=1, WGM10=0) gi trS TOP l 1 hZng sR, TOP = 511 (sR 9 bits l?n nh5t). V v?i mode 7, tGc mode 10 bits, (WGM13=0, WGM12=1, WGM11=1, WGM10=1) TOP =1023 (sR 10 bits l?n nh5t). Mode 15 c7ng l Fast PWM trong . TOP do OCR1A quy .Snh, v th> m tn hiBu ra W knh A hLu nh< khng ph2i l 1 xung, n chU thay .ei tr:ng thi trong 1 clock. Theo ti, .1 sC dHng Fast PWM b:n nn dng mode 14 . .<Xc gi2i thch trn. Cc mode 5, 6, 7 c7ng c th1 dng nh<ng khng nn dng mode 15. Chng ta ti>n hnh vi>t 1 v dH minh h-a dng 2 knh W ch> .* fast SU T!M V BIN SO#N B%I NTINSIDE Ntinside 59 PWM .i/u khi1n 2 .*ng c@ RC servo (g-i tMt l Servo). M:ch .iBn minh h-a nh< trong hnh 11.
Hnh 11: bi/u khi1n 2 RC servo bZng PWM. Hai button .<Xc nRi v?i 2 ng ngMt ngoi INT0 v INT1 .1 .i/u khi1n gc xoay c^a 2 Servo. Tn c^a Servo trong phLn m/m Proteus l MOTOR- PWMSERVO. Tr<?c khi vi>t code .i/u khi1n cc Servo, b:n cLn bi>t cch .i/u khi1n chng, ti gi?i thiBu ngMn g-n nh< sau: RC servo l m*t te hXp gPm 1 .*ng c@ DC cng su5t nh_, h*p gi2m tRc v b* .i/u khi1n gc quay. C 2 lo:i chnh l Servo th<Qng v digital Servo, trong v dH ny ti gi?i thiBu Servo th<Qng (phe bi>n). Servo th<Qng c 3 dy, dy mu .en l dy GND, dy ._ l dy nguPn (th<Qng l 5V) v 1 dy trMng hoDc vng v dy .i/u khi1n (c m*t sR lo:i Servo c mu dy khc, b:n cLn tham kh2o datasheet c^a chng). V cc Servo . c sdn m:ch .i/u khi1n gc quay bn trong nn chng ta khng cLn b5t cG gi2i thuAt g m chU cLn c5p tn hiBu PWM cho dy .i/u khi1n l Servo c th1 xoay .>n 1 vS tr no . (ch l Servo th<Qng chU xoay n[a vng, .i/u khi1n servo l .i/u khi1n gc xoay chG khng ph2i .i/u khi1n cAn tRc xoay). Hnh 12 l hnh 2nh servo v cch .i/u khi1n servo. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 60
Hnh 12. Servo v cch .i/u khi1n. B:n xem hnh 12b, .1 .i/u khi1n servo b:n cLn c5p cho dy .i/u khi1n m*t tn hiBu PWM c Time Period kho2ng 20ms, duty cycle c^a PWM sc quy>t .Snh gc xoay c^a servo. V?i Duty cycle l 1ms, servo xoay v/ vS tr 0o, khi duty cycle =2ms, gc xoay sc l 180o, t; . b:n c th1 tnh .<Xc duty cycle cLn thi>t khi b:n muRn servo xoay .>n 1 vS tr b5t kN gi[a 0o v 180o. Sau khi hi1u cch .i/u khi1n servo, chng ta c th1 dI dng vi>t code .i/u khi1n chng, chU cLn t:o cc xung PWM bZng T/C1. bo:n code cho v dH ny .<Xc trnh by trong list 5. List 5. bi/u khi1n Servo bZng PWM.
sei(); //set bit I cho phep ngat toan cuc while (1){ //vng lDp v tAn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 61 19 20 21 22 23 24 25 26 27 28 29 30 31 32 //do nothing } 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 }
V?i v dH ny ti chU cLn gi2i thch cc dng t; 11 .>n 15 lin quan .>n viBc xc lAp ch> .* ho:t .*ng Fast PWM mode 14 inverse, phLn cn l:i b:n .-c t` .Ri chi>u v?i cc bi tr<?c. Dng 11 v 12 th`c hiBn set cc bit .i/u khi1n Timer1, tr<?c h>t l cc bit COM. B:n th5y ti chU set 2 bit COM1A1 v COM1B1: (1<<COM1A1)|(1<<COM1B1). Hai bit COM1A0 v COM1B0 khng set tGc mDc .Snh bZng 0. bRi chi>u v?i b2ng 4 b:n th5y chng ta sc dng Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at TOP cho t5t c2 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 .<Xc te hXp (WGM13=1, WGM12=1, WGM11=1, WGM10=0) tGc l mode 14 .<Xc ch-n (b2ng 3). Cn l:i chng ta set bit CS10 .1 khai bo rZng nguPn xung clock cho Timer1 bZng clock cho vi .i/u khi1n (prescaler=1) tGc l 1us trong t<Qng hXp f=1Mhz. (n>u b:n dng cc trnh bin dSch khc khng hY trX .Snh ngh\a tn cc bit th 2 dng 11 v 12 t<@ng .<@ng: TCCR1A=0xA2; TCCR1B=0x19). Dng 15 chng ta khai nhAp gi trS cho ICR1 c7ng l Time period cho PWM, ICR1=20000 chng ta thu .<Xc Time period =20000 us = 20ms th_a yu cLu c^a servo. Hai dng 13 v 14 khai bo gi trS ban .Lu c^a cc duty cycle c^a 2 knh PWM, cc gi trS ny .Snh vS tr gc xoay c^a cc servo. Trong 2 trnh phHc vH ngMt, cc gi trS ny .<Xc thay .ei khi cc button .<Xc nh5n. 2.3 Fast PWM (PWM t5n s6 cao). Phase correct PWM cung c5p m*t ch> .* t:o xung PWM c .* phn gi2i cao (high resolution) nn .<Xc g-i l Phase correct PWM. T<@ng t` SU T!M V BIN SO#N B%I NTINSIDE Ntinside 62 Fast PWM, c7ng c 5 mode ho:t .*ng thu*c Phase correct PWM . l cc mode 1, 2, 3, 10 v 11 (xem b2ng 3). NKm mode ny t<@ng Gng cc mode 5, 6, 7, 14 v 15 c^a fast PWM. V/ cch .i/u khi1n, Phase correct hLu nh< giRng fast PWM, ngh\a l n>u b:n . bi>t cch sC dHng cc mode c^a fast PWM th b:n sc hon ton .i/u khi1n .<Xc Phase correct PWM. Khc nhau c@ b2n c^a 2 ch> .* ny l trong cch ho:t .*ng, n>u Fast PWM c chu kN ho:t .*ng trong 1 single-slope (m*t s<Qn) th Phase correct PWM l:i dual- slope (hai s<Qn). L5y v dH mode 10 c^a Phase correct PWM t<@ng Gng v?i mode 14 c^a Fast PWM, trong mode ny thanh ghi ICR1 chGa TOP v OCR1A (hoDc OCR1B .Ri v?i knh B) chGa gi trS so snh. Khi ho:t .*ng, thanh ghi TCNT1 tKng t; 0, khi TCNT1 bZng v?i OCR1A th chn OC1A .<Xc xa xuRng mGc LOW (ti .ang ni tr<Qng hXp COM1A1=1, COM1A0=0), TCNT1 ti>p tHc tKng .>n TOP, khi TCNT1=TOP th TCNT1 KHNG .<Xc t` .*ng reset v/ 0 nh< tr<Qng hXp Fast PWM m TCNT1 bMt .Lu .>m ng<Xc, tGc gi2m t;ng gi trS t; TOP v/ 0. Trong lc TCNT1 gi2m, .>n 1 lc n sc bZng gi trS c^a OCR1A lLn thG 2, v lLn ny, chn OC1A .<Xc set ln mGc HIGH, TCNT1 ti>p tHc gi2m .>n 0 th 1 chu kN hon t5t. R rng 1 chu kN l qu trnh .>m trong 2 s<Qn nn ta g-i Phase correct PWM l dual-slope. C7ng v tnh ch5t dual-slope m tn hiBu PWM trong ch> .* ny c tnh .Ri xGng, thch hXp cho cc Gng dHng .i/u khi1n .*ng c@. Hnh 13 m t2 cch m Phase correct PWM ho:t .*ng tron mode 10 v?i ng ra .2o (COM1A1=1, COM1A0=0).
Hnh 13. Phase correct PWM mode 10. ViBc vi>t code cho ch> .* Phase correct PWM gLn nh< t<@ng t` fast PWM, b:n chU cLn thay .ei te hXp cc bit WGM d`a theo b2ng 3 v sau . nhp cc gi trS ph hXp cho ICR1 v ORC1A, OCR1B l .<Xc. 2.3 Fast PWM (PWM t5n s6 cao). Ch> .* ny c 2 mode l 8 v 9. V/ hLu h>t cc ph<@ng diBn, 2 mode ny giRng v?i 2 mode 10 v 11 c^a Phase correct PWM. Ci khc nhau duy nh5t l thQi .i1m m thanh ghi OCR1A v OCR1B .<Xc cAp nhAt d[ liBu SU T!M V BIN SO#N B%I NTINSIDE Ntinside 63 n>u c s` thay .ei. ViBc ny, nhn chung khng 2nh h<Wng .>n hLu h>t ng<Qi dng PWM .1 .i/u khi1n. B:n sc r5t kh .1 th5y s` khc biBt n>u b:n khng ph2i .ang vi>t 1 Gng dHng m sai sR trong 1 micro giy l .i/u tB h:i. V th> ti khng ./ cAp chi ti>t ch> .* ny, b:n .-c c th1 tham kh2o datasheet c^a chip .1 hi1u r h@n n>u cLn thi>t. Ngoi ra trn chip atmega8 cn c b* timer2 8 bits c PWM v asynchronous operation. V/ mDt chGc nKng timer2 giRng nh< phin b2n 8 bit c^a timer1 (.* phn gi2i th5p h@n nh<ng c cng ch> .* v ph<@ng thGc ho:t .*ng). bi1m khc biBt v c7ng l .i1m .Dc biBt c^a Timer2 l kh2 nKng ho:t .*ng khng .Png b* v?i chip, n giRng nh< viBc b:n tch timer2 ra thnh 1 chip timer ring, v th> cLn cung c5p 1 nguPn xung clock khc cho timer ny (1 th:ch anh khc). Ch> .* ny c th1 .<Xc dng .1 calip (calibrate), canh chUnh sai sR v b cho nguPn xung clock chnh trn chip.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 64 Bi 5 - Giao ti#p UART
I. Gi-i thi0u. Bi ny gip cc b:n bi>t cch sC dHng cch truy/n thng nRi ti>p UART trn AVR. Cng cH chnh c7ng l 2 b* phLn m/m quen thu*c WinAVR v Proteus nh<ng trong bi ny (v cc bi sau n[a) chng ta sc sC dHng chip Atmega32 lm chip minh h-a. V/ c@ b2n viBc thay .ei chip minh h-a khng 2nh h<Wng l?n .>n tnh m:ch l:c c^a lo:t bi v s` khc biBt c^a hai chip Atmega8 v Atmega32 l khng .ng k1. Tuy nhin, n>u c s` khc biBt l?n W phLn no . ti sc k1 ra cho b:n tiBn so snh. Sau bi ny, ti hy v-ng b:n c th1 hi1u v th`c hiBn .<Xc: Nguyn l truy/n thng nRi ti>p .Png b* v khng .Png b*. Module truy/n thng nRi ti>p USART trn AVR. Truy/n thng .a xC l bZng UART. II. TruyTn thng nIi tiQp khng =Vng bD. ThuAt ng[ USART trong ti>ng anh l vi>t tMt c^a cHm t;: Universal Synchronous & Asynchronous serial Reveiver and Transmitter, ngh\a l b* truy/n nhAn nRi ti>p .Png b* v khng .Png b*. CLn ch rZng khi niBm USART (hay UART n>u chU ni .>n b* truy/n nhAn khng .Png b*) th<Qng .1 chU thi>t bS phLn cGng (device, hardware), khng ph2i chU m*t chu]n giao ti>p. USART hay UART cLn ph2i k>t hXp v?i m*t thi>t bS chuy1n .ei mGc .iBn p .1 t:o ra m*t chu]n giao ti>p no .. V dH, chu]n RS232 (hay COM) trn cc my tnh c nhn l s` k>t hXp c^a chip UART v chip chuy1n .ei mGc .iBn p. Tn hiBu t; chip UART th<Qng theo mGc TTL: mGc logic high l 5, mGc low l 0V. Trong khi ., tn hiBu theo chu]n RS232 trn my tnh c nhn th<Qng l -12V cho mGc logic high v +12 cho mGc low (tham kh2o hnh 1). Ch l cc gi2i thch trong ti liBu ny theo mGc logic TTL c^a USART, khng theo RS232. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 65
Hnh 1. Tn hiBu t<@ng .<@ng c^a UART v RS232. TruyTn thng nIi tiQp: gi2 sC b:n .ang xy d`ng m*t Gng dHng phGc t:p cLn sC dHng nhi/u vi .i/u khi1n (hoDc vi .i/u khi1n v my tnh) k>t nRi v?i nhau. Trong qu trnh lm viBc cc vi .i/u khi1n cLn trao .ei d[ liBu cho nhau, v dH tnh huRng Master truy/n lBnh cho Slaver hoDc Slaver gWi tn hiBu thu thAp .<Xc v/ Master xC lGi2 sC d[ liBu cLn trao .ei l cc m c chi/u di 8 bits, b:n c th1 sc ngh\ .>n cch k>t nRi .@n gi2n nh5t l k>t nRi 1 PORT (8 bit) c^a mYi vi .i/u khi1n v?i nhau, mYi line trn PORT sc chSu trch nhiBm truy/n/nhAn 1 bit d[ liBu. by g-i l cch giao ti>p song song, cch ny l cch .@n gi2n nh5t v d[ liBu .<Xc xu5t v nhAn tr`c ti>p khng thng qua b5t kN m*t gi2i thuAt bi>n .ei no v v th> tRc .* truy/n c7ng r5t nhanh. Tuy nhin, nh< b:n th5y, nh<Xc .i1m c^a cch truy/n ny l sR .<Qng truy/n qu nhi/u, b:n hy t<Wng t<Xng n>u d[ liBu c^a b:n c gi trS cng l?n th sR .<Qng truy/n c7ng sc nhi/u thm. HB thRng truy/n thng song song th<Qng r5t cPng k/nh v v th> km hiBu qu2. Truy/n thng nRi ti>p sc gi2i quy>t vLn ./ ny, trong tuy/n thng nRi ti>p d[ liBu .<Xc truy/n t;ng bit trn 1 (hoDc m*t t) .<Qng truy/n. V l do ny, cho d d[ liBu c^a b:n c l?n .>n .u b:n c7ng chU dng r5t t .<Qng truy/n. Hnh 2 m t2 s` so snh gi[a 2 cch truy/n song song v nRi ti>p trong viBc truy/n con sR 187 thAp phn (tGc 10111011 nhS phn). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 66
Hnh 2. Truy/n 8 bit theo ph<@ng php song song v nRi ti>p. M*t h:n ch> r5t dI nhAn th5y khi truy/n nRi ti>p so v?i song song l tRc .* truy/n v .* chnh xc c^a d[ liBu khi truy/n v nhAn. V d[ liBu cLn .<Xc chia nh_ thnh t;ng bit khi truy/n/nhAn, tRc .* truy/n sc bS gi2m. MDt khc, .1 .2m b2o tnh chnh xc c^a d[ liBu, b* truy/n v b* nhAn cLn c nh[ng th_a hiBp hay nh[ng tiu chu]n nh5t .Snh. PhLn ti>p theo trong ch<@ng ny gi?i thiBu cc tiu chu]n trong truy/n thng nRi ti>p khng .Png b*. Khi niBm .Png b* .1 chU s` bo tr<?c trong qu trnh truy/n. L5y v dH thi>t bS 1 (tb1) k>t v?i v?i thi>t bS 2 (tb2) bWi 2 .<Qng, m*t .<Qng d[ liBu v 1 .<Qng xung nhSp. CG mYi lLn tb1 muRn send 1 bit d[ liBu, tb1 .i/u khi1n .<Qng xung nhSp chuy1n t; mGc th5p ln mGc cao bo cho tb2 sdn sng nhAn m*t bit. BZng cch bo tr<?c ny t5t c2 cc bit d[ liBu c th1 truy/n/nhAn dI dng v?i t r^i ro trong qu trnh truy/n. Tuy nhin, cch truy/n ny .i h_i t nh5t 2 .<Qng truy/n cho 1 qu trnh (send or receive), tRc .* truy/n c7ng bS h:n ch> v .i h_i bn nhAn ph2i lin tHc quan st .<Qng xung nhSp tr<?c khi .-c b5t kN bit d[ liBu no. Giao ti>p gi[a my tnh v cc bn phm (tr; bn phm k>t nRi theo chu]n USB) l m*t v dH c^a cch truy/n thng nRi ti>p .Png b*. Khc v?i cch truy/n .Png b*, truy/n thng khng .Png b* chU cLn m*t .<Qng truy/n cho m*t qu trnh. Khung d[ liBu . .<Xc chu]n ha bWi cc thi>t bS nn khng cLn .<Qng xung nhSp bo tr<?c d[ liBu .>n. V dH 2 thi>t bS .ang giao ti>p v?i nhau theo ph<@ng php ny, chng . .<Xc th_a thuAn v?i nhau rZng cG 1ms th sc c 1 bit d[ liBu truy/n .>n, nh< th> thi>t bS nhAn chU cLn ki1m tra v .-c .<Qng truy/n mYi mili-giy .1 .-c cc bit d[ liBu v sau . k>t hXp chng l:i thnh d[ liBu c ngh\a. Truy/n thng nRi ti>p khng .Png b* v th> nhanh v hiBu qu2 h@n truy/n thng .Png b*. Tuy nhin, .1 qu trnh truy/n thnh cng th viBc tun th^ cc tiu chu]n truy/n l h>t sGc quan tr-ng. Chng ta sc bMt .Lu tm hi1u cc khi niBm quan tr-ng trong ph<@ng php truy/n thng ny. Baud rate (tIc =D Baud): nh< trong v dH trn v/ viBc truy/n 1 bit SU T!M V BIN SO#N B%I NTINSIDE Ntinside 67 trong 1ms, b:n th5y rZng .1 viBc truy/n v nhAn khng .Png b* x2y ra thnh cng th cc thi>t bS tham gia ph2i thRng nh5t nhau v/ kho2ng thQi dnh cho 1 bit truy/n, hay ni cch khc tRc .* truy/n ph2i .<Xc ci .Dt nh< nhau tr<?c, tRc .* ny g-i l tRc .* Baud. Theo .Snh ngh\a, tRc .* baud l sR bit truy/n trong 1 giy. V dH n>u tRc .* baud .<Xc .Dt l 19200 th thQi gian dnh cho 1 bit truy/n l 1/19200 ~ 52.083us. Frame (khung truyTn): do truy/n thng nRi ti>p m nh5t l nRi ti>p khng .Png b* r5t dI m5t hoDc sai lBch d[ liBu, qu trnh truy/n thng theo ki1u ny ph2i tun theo m*t sR quy cch nh5t .Snh. Bn c:nh tRc .* baud, khung truy/n l m*t y>u tRc quan tr-ng t:o nn s` thnh cng khi truy/n v nhAn. Khung truy/n bao gPm cc quy .Snh v/ sR bit trong mYi lLn truy/n, cc bit bo nh< bit Start v bit Stop, cc bit ki1m tra nh< Parity, ngoi ra sR l<Xng cc bit trong m*t data c7ng .<Xc quy .Snh bWi khung truy/n. Hnh 1 l m*t v dH c^a m*t khung truy/n theo UART, khung truy/n ny .<Xc bMt .Lu bZng m*t start bit, ti>p theo l 8 bit data, sau . l 1 bit parity dng ki1m tra d[ liBu v cuRi cng l 2 bits stop. Start bit: start l bit .Lu tin .<Xc truy/n trong m*t frame truy/n, bit ny c chGc nKng bo cho thi>t bS nhAn bi>t rZng c m*t gi d[ liBu sMp .<Xc truy/n t?i. % module USART trong AVR, .<Qng truy/n lun W tr:ng thi cao khi nghU (Idle), n>u m*t chip AVR muRn th`c hiBn viBc truy/n d[ liBu n sc gWi m*t bit start bZng cch ko .<Qng truy/n xuRng mGc 0. Nh< vAy, v?i AVR bit start l mang gi trS 0 v c gi trS .iBn p 0V (v?i chu]n RS232 gi trS .iBn p c^a bit start l ng<Xc l:i). start l bit bMt bu*c ph2i c trong khung truy/n. Data: data hay d[ liBu cLn truy/n l thng tin chnh m chng ta cLn gWi v nhAn. Data khng nh5t thi>t ph2i l gi 8 bit, v?i AVR b:n c th1 quy .Snh sR l<Xng bit c^a data l 5, 6, 7, 8 hoDc 9 (t<@ng t` cho hLu h>t cc thi>t bS hY trX UART khc). Trong truy/n thng nRi ti>p UART, bit c 2nh h<Wng nh_ nh5t (LSB Least Significant Bit, bit bn ph2i) c^a data sc .<Xc truy/n tr<?c v cuRi cng l bit c 2nh h<Wng l?n nh5t (MSB Most Significant Bit, bit bn tri). Parity bit: parity l bit dng ki1m tra d[ liBu truy/n .ng khng (m*t cch t<@ng .Ri). C 2 lo:i parity l parity chdn (even parity) v parity lf (odd parity). Parity chdn ngh\a l sR l<Xng sR 1 trong d[ liBu bao gPm bit parity lun l sR chdn. Ng<Xc l:i teng sR l<Xng cc sR 1 trong parity lf lun l sR lf. V dH, n>u d[ liBu c^a b:n l 10111011 nhS phn, c t5t c2 6 sR 1 trong d[ liBu ny, n>u parity chdn .<Xc dng, bit parity sc mang gi trS 0 .1 .2m b2o teng cc sR 1 l sR chdn (6 sR 1). N>u parity lf .<Xc yu cLu th gi trS c^a parity bit l 1. Hnh 1 m t2 v dH ny v?i parity chdn .<Xc sC dHng. Parity bit khng ph2i l bit bMt bu*c v v th> chng ta c th1 lo:i bit ny SU T!M V BIN SO#N B%I NTINSIDE Ntinside 68 kh_i khung truy/n (cc v dH trong bi ny ti khng dng bit parity). Stop bits: stop bits l m*t hoDc cc bit bo cho thi>t bS nhAn rZng m*t gi d[ liBu . .<Xc gWi xong. Sau khi nhAn .<Xc stop bits, thi>t bS nhAn sc ti>n hnh ki1m tra khung truy/n .1 .2m b2o tnh chnh xc c^a d[ liBu. Stop bits l cc bits bMt bu*c xu5t hiBn trong khung truy/n, trong AVR USART c th1 l 1 hoDc 2 bits (Trong cc thi>t bS khc Stop bits c th1 l 2.5 bits). Trong v dH W hnh 1, c 2 stop bits .<Xc dng cho khung truy/n.Gi trS c^a stop bit lun l gi trS nghU (Idle) v l ng<Xc v?i gi trS c^a start bit, gi trS stop bit trong AVR lun l mGc cao (5V). (Ch v gWi : khung truyTn phK biQn nhLt l : start bit+ 8 bit data+1 stop bit) Sau khi nMm bMt cc khi niBm v/ truy/n thng nRi ti>p, phLn ti>p theo chng ta sc kh2o st cch th`c hiBn ph<@ng php truy/n thng ny trn chip AVR (cH th1 l chip Atmega32). III. TruyTn thng nIi tiQp khng =Vng bD v-i AVR (UART). Vi .i/u khi1n Atmega32 c 1 module truy/n thng nRi ti>p USART. C 3 chn chnh lin quan .>n module ny . l chn xung nhSp - XCK (chn sR 1), chn truy/n d[ liBu TxD (Transmitted Data) v chn nhAn d[ liBu RxD (Reveived Data). Trong . chn XCK chU .<Xc sC dHng nh< l chn pht hoDc nhAn xung gi[ nhSp trong ch> .* truy/n .*ng b*. Tuy nhin bi ny chng ta khng kh2o st ch> .* truy/n thng .Png b*, v th> b:n chU cLn quan tm .>n 2 chn TxD v RxD. V cc chn truy/n/nhAn d[ liBu chU .2m nhiBm 1 chGc nKng .*c lAp (hoDc l truy/n, hoDc l nhAn), .1 k>t nRi cc chip AVR v?i nhau (hoDc k>t nRi AVR v?i thi>t bS hY trX UART khc) b:n ph2i .5u cho 2 chn ny. TxD c^a thi>t bS thG nh5t k>t nRi v?i RxD c^a thi>t bS 2 v ng<Xc l:i. Module USART trn chip Atmega32 ho:t .*ng song cng (Full Duplex Operation), ngh\a l qu trnh truy/n v nhAn d[ liBu c th1 x2y ra .Png thQi. 1. Thanh ghi: C7ng nh< cc thi>t bS khc trn AVR, t5t c2 ho:t .*ng v trng thi c^a module USART .<Xc .i/u khi1n v quan st thng qua cc thanh ghi trong vng nh? I/O. C 5 thanh ghi .<Xc thi>t k> ring cho ho:t .*ng v .i/u khi1n c^a USART, . l: UDR: hay thanh ghi d[ liBu, l 1 thanh ghi 8 bit chGa gi trS nhAn .<Xc v pht .i c^a USART. Th`c ch5t thanh ghi ny c th1 coi nh< 2 thanh ghi TXB (Transmit data Buffer) v RXB (Reveive data Buffer) c chung .Sa chU. b-c UDR thu .<Xc gi trS thanh ghi .Bm d[ liBu nhAn, vi>t gi trS vo SU T!M V BIN SO#N B%I NTINSIDE Ntinside 69 UDR t<@ng .<@ng .Dt gi trS vo thanh ghi .Bm pht, chu]n bS .1 gWi .i. Ch trong cc khung truy/n sC dHng 5, 6 hoDc 7 bit d[ liBu, cc bit cao c^a thanh ghi UDR sc khng .<Xc sC dHng
UCSRA (USART Control and Status Register A): l 1 trong 3 thanh ghi .i/u khi1n ho:t .*ng c^a module USART.
Thanh ghi UCSRA ch^ y>u chGa cc bit tr:ng thi nh< bit bo qu trnh nhAn k>t thc (RXC), truy/n k>t thc (TXC), bo thanh ghi d[ liBu trRng (UDRE), khung truy/n c lYi (FE), d[ liBu trn (DOR), ki1m tra parity c lYi (PE)B:n ch m*t sR bit quan tr-ng c^a thanh ghi ny: * UDRE (USART Data Register Empty) khi bit by bZng 1 ngh\a l thanh ghi d[ liBu UDR .ang trRng v sdn sng cho m*t nhiBm vH truy/n hay nhAn ti>p theo. V th> n>u b:n muRn truy/n d[ liBu .Lu tin b:n ph2i ki1m tra xem bit UDRE c bZng 1 hay khng, sau khi chMc chMn rZng UDRE=1 hy vi>t d[ liBu vo thanh ghi UDR .1 truy/n .i. * U2X l bit chU .Snh g5p .i tRc .* truy/n, khi bit ny .<Xc set ln 1, tRc .* truy/n so cao g5p 2 lLn so v?i khi bit ny mang gi trS 0. * MPCM l bit ch-n ch> .* ho:t .*ng .a xC l (multi-processor). UCSRB (USART Control and Status Register B): .y l thanh ghi quan tr-ng .i/u khi1n USART. V th> chng ta sc kh2o st chi ti>t t;ng bit c^a thanh ghi ny.
* RXCIE (Receive Complete Interrupt Enable) l bit cho php ngMt khi qu trnh nhAn k>t thc. ViBc nhAn d[ liBu truy/n bZng ph<@ng php nRi ti>p khng .Png b* th<Qng .<Xc th`c hiBn thng qua ngMt, v th> bit ny th<Qng .<Xc set bZng 1 khi USART .<Xc dung nhAn d[ liBu. * TXCIE (Transmit Complete Interrupt Enable) bit cho php ngMt khi qu trnh truy/n k>t thc. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 70 * UDRIE (USART Data Register Empty Interrupt Enable) l bit cho php ngMt khi thanh ghi d[ liBu UDR trRng. * RXEN (Receiver Enable) l m*t bit quan tr-ng .i/u khi1n b* nhAn c^a USART, ./ kch ho:t chGc nKng nhAn d[ liBu b:n ph2i set bit ny ln 1. * TXEN (Transmitter Enable) l bit .i/u khi1n b* pht. Set bit ny ln 1 b:n sc khWi .*ng b* pht c^a USART. * UCSZ2 (Chracter size) bit ny k>t hXp v?i 2 bit khc trong thanh ghi UCSRC quy .Snh .* di c^a d[ liBu truy/n/nhAn. Chng ta sc kh2o st chi ti>t khi tm hi1u thanh ghi UCSRC. * RXB8 (Receive Data Bit 8) g-i l bit d[ liBu 8. B:n nh? l:i rZng USART trong AVR c hY trX truy/n d[ liBu c .* di tRi .a 9 bit, trong khi thanh ghi d[ liBu l thanh ghi 8 bit. Do ., khi c gi d[ liBu 9 bit .<Xc nhAn, 8 bit .Lu sc chGa trong thanh ghi UDR, cLn c 1 bit khc .ng vai tr bit thG chn, RXD8 l bit thG chn ny. B:n ch l cc bit .<Xc .nh sR t; 0, v th> bit thG chn sc c chU sR l 8, v lc . m bit ny c tn l RXD8 (khng ph2i RXD9). * TXB8 (Transmit Data Bit 8), t<@ng t` nh< bit RXD8, bit TXB8 c7ng .ng vai tr bit thG 9 truy/n thng, nh<ng bit ny .<Xc dung trong lc truy/n d[ liBu. UCSRC (USART Control and Status Register C): thanh ghi ny ch^ y>u quy .Snh khung truy/n v ch> .* truy/n. Tuy nhin, c m*t rMc rRi nho nh_ l thanh ghi ny l:i c cng .Sa chU v?i thanh ghi UBRRH (thanh ghi chGa byte cao dng .1 xc lAp tRc .* baud), ni m*t cch khc 2 thanh ghi ny l 1. V th> bit 7 trong thanh ghi ny, tGc bit URSEL l bit ch-n thanh ghi. Khi URSEL=1, thanh ghi ny .<Xc chip AVR hi1u l thanh ghi .i/u khi1n UCSRC, nh<ng n>u bit URSEL=0 th thanh ghi UBRRH sc .<Xc sC dHng.
Cc bit cn l:i trong thanh ghi UCSRC .<Xc m t2 nh< sau: * UMSEL (USART Mode Select) l bit l`a ch-n gi[a 2 ch> .* truy/n thng .Png b* v khng .Png b*. N>u UMSEL=0, ch> .* khng .Png b* .<Xc ch-n, ng<Xc l:i n>u UMSEL=1, ch> .* .Png b* .<Xc kch ho:t. * Hai bit UPM1 v UPM0( Parity Mode) .<Xc dng .1 quy .Snh ki1m tra pariry. N>u UPM1:0=00, parity khng .<Xc sC dHng (mode ny kh thng SU T!M V BIN SO#N B%I NTINSIDE Ntinside 71 dHng), UPM1:0=01 khng .<Xc sC dHng, UPM1:0=10 th parity chdn .<Xc dng, UPM1:0=11 parity lf .<Xc sC dHng (xem thm b2ng 1). B2ng 1: ch-n ki1m tra parity.
* USBS (Stop bit Select), bit Stop trong khung truy/n bZng AVR USART c th1 l 1 hoDc 2 bit, n>u USBS=0 th Stop bit chU l 1 bit trong khi USBS=1 sc c 2 Stop bit .<Xc dng. * Hai bit UCSZ1 v UCSZ2 (Character Size) k>t hXp v?i bit UCSZ2 trong thanh ghi UCSRB t:o thnh 3 bit quy .Snh .* di d[ liBu truy/n. B2ng 2 tm tMt cc gi trS c th1 c c^a te hXp 3 bit ny v .* di d[ liBu truy/n t<@ng Gng. B2ng 2: .* di d[ liBu truy/n.
* UCPOL (Clock Pority) l bit chU c`c c^a xung kch trong ch> .* truy/n thng .Png b*. n>u UCPOL=0, d[ liBu sc thay .ei thay .ei W c:nh ln c^a xung nhSp, n>u UCPOL=1, d[ liBu thay .ei W c:nh xuRng xung nhSp. N>u b:n sC dHng ch> .* truy/n thng khng .Png b*, hy set bit ny bZng 0.. UBRRL v UBRRH (USART Baud Rate Register): 2 thanh ghi th5p v cao quy .Snh tRc .* baud.
NhMc l:i l thanh ghi UBRRH dng chung .Sa chU thanh ghi UCSRC, b:n ph2i set bit ny bZng 0 n>u muRn sC dHng thanh ghi UBRRH. Nh< b:n SU T!M V BIN SO#N B%I NTINSIDE Ntinside 72 quan st trong hnh trn, chU c 4 bit th5p c^a UBRRH .<Xc dng, 4 bit ny k>t hXp v?i 8 bit trong thanh ghi UBRRL t:o thnh thanh ghi 12 bit quy .Snh tRc .* baud. Ch l n>u b:n vi>t gi trS vo thanh ghi UBRRL, tRc .* baud sc tGc th .<Xc cAp nhAt, v th> b:n ph2i vi>t gi trS vo thanh ghi UBRRH tr<?c khi vi>t vo thanh ghi UBRRL. Gi trS gn cho thanh ghi UBRR khng ph2i l tRc .* baud, n chU .<Xc USART dng .1 tnh tRc .* baud. B2ng 3 h<?ng dan cch tnh tRc .* baud d`a vo gi trS c^a thanh ghi UBRR v ng<Xc l:i, cch tnh gi trS cLn thi>t gn cho thanh ghi UBRR khi . bi>t tRc .* baud. B2ng 3: tnh tRc .* baud.
Trong cc cng thGc trong b2ng 3, fOSC l tRc tLn sR xung nhSp c^a hB thRng (th:ch anh hay nguPn xung n*i). b1 tiBn cho b:n theo di, ti .nh km b2ng v dH cch .Dt gi trS cho UBRR theo tRc .* baud mau. B2ng 4: m*t sR tRc .* baud mau.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 73
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 74
2. SU d5ng UART:. Thng th<Qng, .1 sC dHng module USART trn AVR b:n ph2i th`c hiBn 3 viBc quan tr-ng, . l: ci .Dt tRc .* baud (thanh ghi UBRR), .Snh d:ng khung truy/n (UCSRB, UCSRC) v cuRi cng kch ho:t b* truy/n, b* nhAn, ngMtNh< . ./ cAp, trong ti liBu ny ti ch^ y>u ./ cAp .>n ph<@ng php truy/n thng khng .Png b*, viBc xc lAp cc thng sR ho:t .*ng ch^ y>u d`a trn ch> .* ny. Trong hLu h>t cc Gng dHng, tRc .* baud v khung truy/n th<Qng khng .ei, trong tr<Qng hXp ny chng ta c th1 khWi t:o tr`c ti>p USART W phLn .Lu trong main v sau . chU cLn truy/n hoDc nhAn d[ liBu m khng cLn thay .ei cc ci .Dt. Tuy nhin, n>u tr<Qng hXp giao ti>p linh ho:t v dH b:n .ang ch> t:o m*t thi>t bS c kh2 nKng giao ti>p v?i m*t thi>t bS .Lu cuRi khc (nh< my tnh chFng h:n), lc ny b:n nn cho php ng<Qi dng thay .ei tRc .* baud hoDc cc thng sR khc .1 ph hXp v?i thi>t bS .Lu cuRi. bRi v?i nh[ng Gng dHng ki1u ny b:n nn vi>t 1 ch<@ng trnh con .1 khWi .*ng USART v c th1 g-i l:i nhi/u lLn khi cLn thay .ei. PhLn ti>p theo chng ta sc vi>t m*t sR ch<@ng trnh v dH minh h-a cch sC dHng module truy/n thng USART t; .@n gi2n .>n phGc t:p. Cc v dH sc .<Xc th`c hiBn cho chip Atmega32 v?i gi2 sC nguPn xung nhSp hB thRng l 8MHz. 2.1 Truy7n d8 li/u. Tr<?c h>t chng ta sc th`c hiBn m*t v dH r5t .@n gi2n .1 hi1u cch khWi .*ng USART v truy/n cc gi d[ liBu 8 bit. M:ch .iBn m ph_ng trong hnh 3. Gi2 sC chng ta muRn .Snh d:ng cho khung truy/n gPm 1 bit start, 8 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 75 bit d[ liBu, khng ki1m tra parity v 1 bit stop. TRc .* baud 57600 (57.6k). D[ liBu cLn truy/n l cc gi trS lin tHc c^a b2ng m ASCII. bo:n code trong list 1 trnh by cch th`c hiBn v dH ny. List 1. KhWi .*ng v truy/n d[ liBu khng .Png b* bZng USART
//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){ //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<<TXEN);
while(1){ for (char i=32; i<128; i++){ uart_char_tx(i); //phat du lieu _delay_ms(100); } } } Tr<?c h>t ti sc gi2i thch cch khWi .*ng USART trong cc dng code t; 12 .>n 18. N>u b:n xem l:i b2ng 3 trong trang 9 c^a ti liBu ny (hoDc b2ng 70, trang 165 datasheet c^a chip atmega32), Gng v?i tLn sR xung nhSp 8Hhz, khng sC dHng ch> .* nhn .i tRc .* (U2X=0), .1 .:t .<Xc tRc b* baud 57600 th gi trS cLn gn cho thanh ghi UBRR l 8 (xem c*t 2, b2ng 3). Hai dng 12 v 13 trong list 1 th`c hiBn gn 8 cho thanh ghi UBRR thng qua 2 thanh ghi UBRRH v UBRRL. Trong dng 16, thanh ghi UCSRA .<Xc gn bZng 0. N>u b:n xem l:i phLn gi2i thch b:n sc th5y thanh ghi SU T!M V BIN SO#N B%I NTINSIDE Ntinside 76 UCSRA ch^ y>u chGa cc bit tr:ng thi, ring 2 bit U2X v MPCM l 2 bit .i/u khi1n, 2 bit ny bZng 0 ngh\a l chng ta khng sC dHng ch> .* nhn .i tRc .* v khng sC dHng truy/n thng .a xC l. PhLn quan tr-ng nh5t chnh l .Dt gi trS cho 2 thanh ghi USCRB v UCSRC. V?i thanh ghi UCSRC (dng 17) tr<?c h>t chng ta ph2i set bit URSEL .1 bo rZng chng ta khng muRn truy cAp thanh ghi UBRRH m l thanh ghi UCSRC (2 thanh ghi ny c cng .Sa chU), ti>p theo chng ta chU set 1 cho 2 bit UCSZ1 v UCSZ0, b:n xem l:i b2ng 2 .1 th5y rZng n>u UCSZ1=1, UCSZ0=1 cng v?i viBc bit UCSZ2=0(nZm trong thanh ghi UCSRB) th .* di d[ liBu truy/n .<Xc ch-n l 8 bit. Cc bit trong thanh ghi UCSRC khng .<Xc set sc mDc .Snh mang gi trS 0, bao gPm UMSEL = 0 (ch> .* truy/n thng khng .Png b*), UPM1:0=00 ( khng sC dHng ki1m tra parity, xem b2ng 1), USBS=0 (1 bit stop) v UCPOL=0 (bit ny khng sC dHng khi truy/n khng .Png b*). Sau cng, trong dng 18, chng ta chU set bit TXEN =1 ngh\a l chU kch ho:t b* pht d[ liBu, cc thnh phLn khc nh< b* nhAn, cc ngMtkhng .<Xc sC dHng trong v dH ny. Trong cc bi tr<?c ti . gi?i thiBu b:n v/ trnh phHc vH ngMt v trong phLn ny ti sc trnh by cch vi>t m*t ch<@ng trnh con bZng ngn ng[ C trong WinAVR, . l .o:n ch<@ng trnh uart_char_tx W dng 5. Ch<@ng trnh con l 1 .o:n code bao gPm cc cu lBnh cng th`c hiBn m*t nhiBm vH chung cH th1 no .. Trong tr<Qng hXp ny l nhiBm vH truy/n 1 tham sR 8 bit ra .<Qng TxD c^a USART thng qua thanh ghi UDR. Nh< trnh by trong phLn m t2 bit UDRE c^a thanh ghi UCSRA, qu trnh truy/n chU .<Xc bMt .Lu khi bit UDRE bZng 1, v th> dng code 6 lm nhiBm vH ki1m tra bit UDRE, cu lBnh while(bit_is_clear(UCSRA,UDRE)) {}; .<Xc hi1u l qu trnh lDp sc l]n qu]n n>u bit UDRE bZng 0 (bit_is_clear). Khi bit UDRE bZng 1 th dng code 7 sc xu5t bi>n chr ra thanh ghi UDR c7ng l xu5t ra chn TxD c^a module USART. Trong ngn ng[ C c 2 cch c@ b2n .1 vi>t ch<@ng trnh con. V?i cch 1 ch<@ng trnh con .<Xc khai bo v vi>t tr`c ti>p pha tr<?c ch<@ng trnh chnh main nh< cch m ti th`c hiBn trong v dH 1 ny. Cch vi>t ny .I hi1u v thch hXp cho cc .o:n ch<@ng trnh con ngMn nh<ng chng c th1 lm teng quan ch<@ng trnh c^a b:n trW nn rMc rRi khi c qu nhi1u ch<@ng trnh con vi>t tr<?c main. B:n c th1 khMc phHc nh<Xc .i1m ny bZng cch .Dt cc ch<@ng trnh con pha sau main nh< cch m chng ta . lm v?i cc trnh phHc vH ngMt. N>u theo .ng quy cch c^a ngn ng[ C, khi .Dt ch<@ng trnh con sau main b:n ph2i khai bo tn ch<@ng trnh pha tr<?c main, n>u b:n .Dt ch<@ng trnh con uart_char_tx pha sau main th phLn tr<?c main b:n sc .Dt dng khai bo tr<?c: void uart_char_tx(unsigned char chr);. Tuy WinAVR cho php b:n SU T!M V BIN SO#N B%I NTINSIDE Ntinside 77 b_ qua khai bo tr<?c ny nh<ng ti khuyn b:n nn vi>t .ng cch .1 t:o thi quen v c7ng nh< .1 dI chuy1n ch<@ng trnh sang cc trnh bin dSch C khc sau ny n>u cLn thi>t. PhLn cuRi cng trong .o:n code l g-i l:i ch<@ng trnh uart_char_tx .1 truy/n cc d[ liBu l cc sR t; 32 .>n 127. b1 th`c hiBn m ph_ng bZng proteus b:n hy vc m*t m:ch .iBn .@n gi2n nh< trong hnh 3. Chip Atmega32 c th1 .<Xc tm v?i t; kha mega32. Trong m:ch .iBn m ph_ng c m*t thi>t bS .Lu cuRi 2o (Virtual Terminal) l m*t thi>t bS k>t nRi v hi1n thS k>t qu2 truy/n thng khng .Png b*, chng ta dng .1 ki1m tra d[ liBu .<Xc truy/n bZng chip AVR. B:n c th1 tm thi>t bS ny trong trong danh sch cc dH cH 2o (virtual instruments), nh5n vo nt cng cH v sau . ch-n terminal trong danh sch .1 ch-n thi>t bS .Lu cuRi 2o. K>t nRi thi>t bS 2o v?i chip Atmega32 nh< trong hnh 3, ch l ph2i .5u cho 2 chn TxD v RxD. Bn c:nh viBc gn ch<@ng trnh cho chip AVR, b:n ph2i set thng sR cho thi>t bS 2o tr<?c khi th`c hiBn m ph_ng. Hy mW h*p tho:i edit component c^a thi>t bS 2o (bZng cch right click rPi left click trn thi>t bS 2o). Theo mDc .Snh thi>t bS .Lu cuRi .<Xc .Snh d:ng khung truy/n l 1 bit start+8 bit d[ liBu+1 bit stop t<@ng t` nh< cch chng ta ci .Dt cho AVR trong v dH 1, v th> b:n chU cLn thay .ei tRc .* baud thnh 57600 trong h*p tho:i edit component l hon t5t (xem hnh 4). Khi ch:y m ph_ng, thi>t bS .Lu cuRi 2o sc hi1n thS cc k t` ASCII c^a cc sR t; 32 .>n 127.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 78 Hnh 3. M ph_ng v dH 1.
Hnh 4. Ci .Dt thng sR cho thi>t bS 2o. 2.2 Nh:n d8 li/u. Qu trnh nhAn d[ liBu chU x2y ra khi bit RXEN trong thanh ghi UCSRB .<Xc set bZng 1 v t5t nhin chn nhAn d[ liBu RxD ph2i .<Xc nRi v?i m*t nguPn pht (chn TxD c^a m*t chip UART khc chFng h:n). Cc thng sR truy/n thng nh< tRc .* baud v khung truy/n trong b* nhAn ph2i .<Xc ci .Dt nh< c^a b* pht. N>u khng c lYi trong qu trnh truy/n v nhAn d[ liBu, sau khi nhAn d[ liBu sc .<Xc chGa trong thanh ghi UDR v bit RXC (Reveice Complete) trong thanh ghi UCSRA sc t` .*ng .<Xc set ln 1. Sau khi thanh ghi UDR .<Xc .-c, bit RXC l:i t` .*ng reset v/ 0 .1 chu]n bS cho qu trnh nhAn d[ liBu k> ti>p. Nh< th> v/ c@ b2n chng ta c 2 cch .-c d[ liBu nhAn v/. Cch thG nh5t l cch h_i vng (polling), ki1m tra n>u bit RXC = 1 th .-c gi trS thanh ghi UDR (v .-c c2 bit RXB8 trong thanh ghi UCSRB n>u frame truy/n 9 bit .<Xc dng). Cch thG hai l sC dHng ngMt nhAn hon t5t (Receive Complete Interrupt), bZng cch set bit cho php ngMt nhAn hon t5t, tGc bit RXCIE trong thanh ghi UCSRB, v bit cho php ngMt ton cHc (bit I, xem l:i bi 3) th m*t ngMt sc x2y ra khi d[ liBu . .<Xc nhAn v chGa trong thanh ghi UDR, chng ta chU cLn .-c gi trS c^a thanh ghi UDR trong trnh phHc vH ngMt l xong. Theo kinh nghiBm, sC dHng ngMt l ph<@ng php tRt nh5t cho .a sR cc tr<Qng hXp nhAn d[ liBu UART, v chng ta khng cLn quan tm thQi .i1m m d[ liBu gWi .>n, trnh lng ph thQi gian dnh cho viBc h_i vng. V th> trong phLn ti>p theo ti sc trnh SU T!M V BIN SO#N B%I NTINSIDE Ntinside 79 by m*t v dH minh h-a qu trnh nhAn d[ liBu bZng ph<@ng php ngMt. b1 phHc vH cho v dH ny, chng ta sc kh2o st m*t m:ch m ph_ng gPm 2 chip Atmega32 nRi v?i nhau qua cc .<Qng TxD v RxD. Chip thG l chip pht d[ liBu, nhiBm vH c^a chip ny l pht chuYi d[ liBu t; 32 .>n 127 nh< chip Atmega32 trong v dH 1. Chn pht TxD c^a chip 1 sc .<Xc nRi v?i chn nhAn RxD c^a chip thG 2 (chip thG 2 .<Xc g-i l chip nhAn d[ liBu). Chip thG 2 sau khi nhAn d[ liBu sc pht d[ liBu ny ra chn TxD c^a chnh n .1 c th1 hi1n thS ln thi>t bS .Lu cuRi 2o cho chng qua quan st v so snh k>t qu2. B:n xem m:ch .iBn m ph_ng trong hnh 5 .1 hi1u r h@n. Chng ta sC dHng .o:n code trong v dH 1 cho chip thG nh5t v th> chU cLn vi>t .o:n code nhAn v pht l:i d[ liBu cho chip thG hai. List 2 trnh by .o:n code cho chip thG hai.. List 2. NhAn d[ liBu USART khng .Png b* bZng ph<@ng php ngMt.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #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; SU T!M V BIN SO#N B%I NTINSIDE Ntinside 80 27 28 uart_char_tx(u_Data); } bo:n code trong v dH nhAn v pht d[ liBu khng khc .o:n code trong v dH 1 l m5y. % dng thG 3 ti include file header interrupt.h v chng ta sc sC dHng ngMt .1 nhAn d[ liBu. Chng ta khai bo m*t bi>n u_Data d:ng 8 bit khng d5u .1 l<u d[ liBu nhAn .<Xc, do bi>n ny sc .<Xc truy cAp trong trnh phHc vH ngMt nn chng ta .Dt attribute volatile (dng 9). bi1m quan tr-ng khi khWi .*ng UART trong v dH ny l dng code 18, n>u trong v dH 1 chng ta chU khWi .*ng duy nh5t b* pht bZng cch set bit TXEN trong thanh ghi UCSRB (UCSRB=(1<<TXEN);) th trong v dH ny chng ta set thm 2 bit cho php nhAn RXEN v cho php ngMt RXCIE trong thanh ghi UCSRB. Bit RXEN khWi .*ng b* nhAn v bit RXCIE khWi .*ng ch> .* ngMt khi d[ liBu . nhAn trong UDR, tuy nhin .1 c th1 sC dHng ngMt, chng ta cLn set them bit I trong thanh ghi tr:ng thi bZng dng code 20 (sei();). PhLn quan tr-ng nh5t trong .o:n code trn l trnh phHc ngMt nhAn d[ liBu ISR. Khi d[ liBu . .<Xc nhAn .Ly trong UDR, trnh ngMt ISR(SIG_UART_RECV) sc .<Xc th`c hiBn, chng ta sc .-c gi trS v;a nhAn .<Xc vo bi>n u_Data (dng 26) v sau . pht gi trS ny ra chn TxD .1 hi1n thS ln thi>t bS .Lu cuRi 2o bZng dng lBnh 27. PhLn m:ch .iBn m ph_ng .<Xc trnh by trong hnh 5. Ch<@ng trnh cho chip TRANSMITTER l ch<@ng trnh trong v dH 1 v ch<@ng trnh cho chip RECEIVER l ch<@ng trnh trong .o:n code trn. B:n ph2i set xung clock cho c2 2 chip l 8MHz v set tRc .* baud cho thi>t bS .Lu cuRi 2o l 56700. N>u khi ch:y m ph_ng, thi>t bS .Lu cuRi hi1n thS cc k t` ASCII c^a cc sR t; 32 .>n 127 nh< trong hnh 5 th m-i thG . .<Xc th`c hiBn chnh xc.
Hnh 5. Truy/n v nhAn bZng UART.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 81 Bi 6 - Chuy%n &'i ADC
I. B3n sE =i =Qn =u. Bi h-c ny, nh< tn c^a n, sc gi?i thiBu cch sC dHng b* chuy1n .ei t<@ng t` - sR (analog to digital converter - ADC). Cng cH chnh c7ng l 2 b* phLn m/m quen thu*c WinAVR v Proteus. Sau bi ny, ti hy v-ng b:n c th1 hi1u v th`c hiBn .<Xc: - Nguyn l chuy1n .ei AD. - Chuy1n .ei ADC .@n knh trn AVR. - SC dHng chuy1n .ei ADC .@n knh trn AVR, hi1n thS sR 4 digit bZng LED 7 .o:n. II. ChuyGn =Ki dP li0u t9.ng tX (analog) sang dP li0u sI (digital). Trong cc Gng dHng .o l<Qng v .i/u khi1n bZng vi .i/u khi1n b* chuy1n .ei t<@ng t`-sR (ADC) l m*t thnh phLn r5t quan tr-ng. D[ liBu trong th> gi?i c^a chng ta l cc d[ liBu t<@ng t` (analog). V dH nhiBt .* khng kh buei sng l 25oC v buei tr<a l 32oC, gi[a hai mGc gi trS ny c v sR cc gi trS lin tHc m nhiBt .* ph2i .i qua .1 c th1 .:t mGc 32oC t; 25oC, .:i l<Xng nhiBt .* nh< th> g-i l m*t .:i l<Xng analog. Trong khi ., r rng vi .i/u khi1n l m*t thi>t bS sR (digital), cc gi trS m m*t vi .i/u khi1n c th1 thao tc l cc con sR rQi r:c v th`c ch5t chng .<Xc t:o thnh t; s` k>t hXp c^a hai mGc 0 v 1. V dH chng ta muRn dng m*t thanh ghi 8 bit trong vi .i/u khi1n .1 l<u l:i cc gi trS nhiBt .* t; 0oC .>n 255 oC, nh< chng ta . bi>t, m*t thanh ghi 8 bit c th1 chGa tRi .a 256 (2 8 ) gi trS nguyn t; 0 .>n 255, nh< th> cc mGc nhiBt .* khng nguyn nh< 28.123 oC sc khng .<Xc ghi l:i. Ni cch khc, chng ta . sR ha (digitalize) m*t d[ liBu analog thnh m*t d[ liBu digital. Qu trnh sR ha ny th<Qng .<Xc th`c hiBn bWi m*t thi>t bS g-i l b* chuy1n .ei t<@ng t` - sR hay .@n gi2n l ADC (Analog to Digital Converter). C r5t nhi/u ph<@ng php chuy1n .ei ADC, ti khng c .Snh gi2i thch cH th1 cc nguyn l chuy1n .ei ny trong bi h-c v/ AVR, tuy nhin ti sc gi?i thiBu m*t cch chuy1n .ei r5t c@ b2n v phe bi>n .1 cc b:n phLn no nMm .<Xc cch m m*t b* ADC lm viBc. Ph<@ng php chuy1n .ei m ti ni l ph<@ng php chuy1n .ei tr`c ti>p (direct converting) hoDc flash ADC. Cc b* chuy1n .ei ADC theo ph<@ng php ny .<Xc c5u thnh t; m*t dy cc b* so snh (nh< opamp), cc b* so snh .<Xc mMc song song v .<Xc k>t nRi tr`c ti>p v?i tn hiBu analog cLn chuy1n .ei. M*t .iBn p tham chi>u (reference) v m*t m:ch chia p .<Xc sC dHng .1 t:o ra cc mGc SU T!M V BIN SO#N B%I NTINSIDE Ntinside 82 .iBn p so snh khc nhau cho mYi b* so snh. Hnh 1 m t2 m*t b* chuy1n .ei flash ADC c 4 b* so snh, Vin l tn hiBu analog cLn chuy1n .ei v gi trS sau chuy1n .ei l cc con sR t:o thnh t; s` k>t hXp cc mGc nhS phn trn cc chn Vo. Trong hnh 1, b:n th5y rZng do anh h<Wng c^a m:ch chia p (cc .iBn trW mMc nRi ti>p t; .iBn p +15V .>n ground), .iBn p trn chn m (chn -) c^a cc b* so snh sc khc nhau. Trong lc chuy1n .ei, gi2 sC .iBn p Vin l?n h@n .iBn p V- c^a b* so snh 1 (opamp W pha th5p nh5t trong m:ch) nh<ng l:i nh_ h@n .iBn p V- c^a cc b* so snh khc, khi . ng Vo1 W mGc 1 v cc ng Vo khc W mGc 0, chng ta thu .<Xc m*t k>t qu2 sR. M*t cch t<@ng t`, n>u tKng .iBn p Vin ta thu .<Xc cc te hXp sR khc nhau. V?i m:ch .iBn c 4 b* so snh nh< trong hnh 1, sc c t5t c2 5 tr<Qng hXp c th1 x2y ra, hay ni theo cch khc .iBn p analog Vin .<Xc chia thnh 5 mGc sR khc nhau. Tuy nhin, b:n ch l cc ng Vo khng ph2i l cc bit c^a tn hiBu sR ng ra, chng chU l .:i diBn .1 te hXp thnh tn hiBu sR ng ra, dI hi1u h@n chng ta khng sC dHng .<Xc cc bit Vo tr`c ti>p m cLn m*t b* gi2i m (decoder). Trong b2ng 1 ti trnh by k>t qu2 sau khi gi2i m Gng v?i cc te hXp c^a cc ng Vo.
Hnh 1. M:ch flash ADC v?i 4 b* so snh. B2ng 1 Gi trS sR ng ra sau khi gi2i m. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 83
(D phn gi@i (resolution): nh< trong v dH trn, n>u m:ch .iBn c 4 b* so snh, ng ra digital sc c 5 mGc gi trS. T<@ng t` n>u m:ch .iBn c 7 b* so snh th sc c 8 mGc gi trS c th1 W ng ra digital, kho2ng cch gi[a cc mGc tn hiBu trong tr<Qng hXp 8 mGc sc nh_ h@n tr<Qng hXp 4 mGc. Ni cch khc, m:ch chuy1n .ei v?i 7 b* so snh c gi trS digital ng ra mSn h@n khi chU c 4 b*, .* mSn cng cao tGc .* phn gi2i (resolution) cng l?n. Khi niBm .* phn gi2i .<Xc dng .1 chU sR bit cLn thi>t .1 chGa h>t cc mGc gi trS digital ng ra. Trong tr<Qng hXp c 8 mGc gi trS ng ra, chng ta cLn 3 bit nhS phn .1 m ha h>t cc gi trS ny, v th> m:ch chuy1n .ei ADC v?i 7 b* so snh sc c .* phn gi2i l 3 bit. M*t cch teng qut, n>u m*t m:ch chuy1n .ei ADC c .* phn gi2i n bit th sc c 2 n mGc gi trS c th1 c W ng ra digital. b1 t:o ra m*t m:ch chuy1n .ei flash ADC c .* phn gi2i n bit, chng ta cLn .>n 2 n -1 b* so snh, gi trS ny r5t l?n khi thi>t k> b* chuy1n .ei ADC c .* phn gi2i cao, v th> cc b* chuy1n .ei flash ADC th<Qng c .* phn gi2i t h@n 8 bit. b* phn gi2i lin quan mAt thi>t .>n ch5t l<Xng chuy1n .ei ADC, viBc l`a ch-n .* phn gi2i ph2i ph hXp v?i .* chnh xc yu cLu v kh2 nKng xC l c^a b .i/u khi1n. Trong 2 m t2 m*t v dH sR ha m*t hm sin analog thnh d:ng digital.
Hnh 2. Analog v digital c^a hm sin. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 84 (i0n p tham chiQu (reference voltage): Cng m*t b* chuy1n .ei ADC nh<ng c ng<Qi muRn dng cho cc mGc .iBn p khc nhau, v dH ng<Qi A muRn chuy1n .ei .iBn p trong kho2ng 0-1V trong khi ng<Qi B muRn dng cho .iBn p t; 0V .>n 5V. R rng n>u hai ng<Qi ny dng 2 b* chuy1n .ei ADC ./u c kh2 nKng chuy1n .ei .>n .iBn p 5V th ng<Qi A .ang ph ph:m tnh chnh xc c^a thi>t bS. V5n ./ sc .<Xc gi2i quy>t bZng m*t .:i l<Xng g-i l .iBn p tham chi>u - Vref (reference voltage). biBn p tham chi>u th<Qng l gi trS .iBn p l?n nh5t m b* ADC c th1 chuy1n .ei. Trong cc b* ADC, Vref th<Qng l thng sR .<Xc .Dt bWi ng<Qi dng, n l .iBn p l?n nh5t m thi>t bS c th1 chuy1n .ei. V dH, m*t b* ADC 10 bit (.* phn gi2i) c Vref=3V, n>u .iBn p W ng vo l 1V th gi trS sR thu .<Xc sau khi chuy1n .ei sc l: 1023x(1/3)=314. Trong . 1023 l gi trS l?n nh5t m m*t b* ADC 10 bit c th1 t:o ra (1023=2 10 -1). V .iBn p tham chi>u 2nh h<Wng .>n .* chnh xc c^a qu trnh chuy1n .ei, chng ta cLn tnh ton .1 ch-n 1 .iBn p tham chi>u ph hXp, khng .<Xc nh_ h@n gi trS l?n nh5t c^a input nh<ng c7ng .;ng qu l?n. II. ChuyGn =Ki ADC trn AVR. Chip AVR ATmega32 c^a Atmel c tch hXp sdn cc b* chuy1n .ei ADC v?i .* phn gi2i 10 bit. C t5t c2 8 knh .@n (cc chn ADC0 .>n ADC7), 16 te hXp chuy1n .ei d:ng so snh, trong . c 2 knh so snh c th1 khuy>ch .:i. B* chuy1n .ei ADC trn AVR khng ho:t .*ng theo nguyn l flash ADC m ti ./ cAp W phLn trn, ADC trong AVR l lo:i chuy1n .ei x5p xU lLn l<Xt (successive approximation ADC). ADC trn AVR cLn .<Xc nui bZng nguPn .iBn p ring W chn AVCC, gi trS .iBn p c5p cho AVCC khng .<Xc khc nguPn nui chip (VCC) qu +/-0.3V. NhiIu (noise) l v5n ./ r5t quan tr-ng khi sC dHng cc b* ADC, .1 gi2m thi1u sai sR chuy1n .ei do nhiIu, nguPn c5p cho ADC cLn ph2i .<Xc l-c (filter) kg cng. M*t cch .@n gi2n .1 t:o nguPn AVCC l dng m*t m:ch LC k>t nRi t; nguPn VCC c^a chip nh< minh h-a trong hnh 3, .y l cch .<Xc gXi bWi nh s2n xu5t AVR. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 85
Hnh 3. T:o nguPn AVCC t; VCC. biBn p tham chi>u cho ADC trn AVR c th1 .<Xc t:o bWi 3 nguPn: dng .iBn p tham chi>u n*i 2.56V (cR .Snh), dng .iBn p AVCC hoDc .iBn p ngoi .Dt trn chn VREF. M*t lLn n[a, b:n cLn ch .>n noise khi .Dt .iBn p tham chi>u, n>u dng .iBn p ngoi .Dt trn chn VREF th .iBn p ny ph2i .<Xc l-c thAt tRt, n>u dng .iBn p tham chi>u n*i 2.56V hoDc AVCC th chn VREF cLn .<Xc nRi v?i m*t tH .iBn. ViBc ch-n .iBn p tham chi>u sc .<Xc ./ cAp chi ti>t trong phLn sC dHng ADC. Cc chn trn PORTA c^a chip ATmega32 .<Xc dng cho b* ADC, chn PA0 t<@ng Gng knh ADC0 v chn PA7 t<@ng Gng v?i knh ADC7. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 86 1. Thanh ghi. C 4 thanh trong b* ADC trn AVR trong . c 2 thanh ghi data chGa d[ liBu sau khi chuy1n .ei, 2 thanh ghi .i/u khi1n v chGa tr:ng thi c^a ADC. - ADMUX (ADC Multiplexer Selection Register): l 1 thanh ghi 8 bit .i/u khi1n viBc ch-n .iBn p tham chi>u, knh v ch> .* ho:t .*ng c^a ADC. ChGc nKng c^a t;ng bit trn thanh ghi ny sc .<Xc trnh by cH th1 nh< sau:
Bit 7:6- REFS1:0 (Reference Selection Bits): l cc bit ch-n .iBn p tham chi>u cho ADC, 1 trong 3 nguPn .iBn p tham chi>u c th1 .<Xc ch-n l: .iBn p ngoi t; chn VREF, .iBn p tham chi>u n*i 2.56V hoDc .iBn p AVCC. B2ng 2 tm tMt gi trS cc bit v .iBn p tham chi>u t<@ng Gng. B2ng 2: Ch-n .iBn p tham chi>u
Bit 5-ADLAR (ADC Left Adjust Result): l bit cho php hiBu chUnh tri k>t qu2 chuy1n .ei. SW d\ c bit ny l v ADC trn AVR c .* phn gi2i 10 bit, ngh\a l k>t qu2 thu .<Xc sau chuy1n .ei l 1 sR c .* di 10 bit (tRi .a 1023), AVR bR tr 2 thanh ghi data 8 bit .1 chGa gi trS sau chuy1n .ei. Nh< th> gi trS chuy1n .ei sc khng lMp .Ly 2 thanh ghi data, trong m*t sR tr<Qng hXp ng<Qi dng muRn 10 bit k>t qu2 nZm lBch v/ pha tri trong khi c7ng c tr<Qng hXp ng<Qi dng muRn k>t qu2 nZm v/ pha ph2i. Bit ADLAR sc quy>t .Snh vS tr c^a 10 bit k>t qu2 trong 16 bit c^a 2 thanh ghi data. N>u ADLAR=0 k>t qu2 sc .<Xc hiBu chUnh v/ pha ph2i (thanh ghi ADCL chGa tr-n 8 bit th5p v thanh ghi ADCH chGa 2 bit cao trong 10 bit k>t qu2), v n>u ADLAR=1 th k>t qu2 .<Xc hiBu chUnh tri (thanh ghi ADCH chGa tr-n 8 bit cao nh5t, cc bit t; 9 .>n 2, v thanh ADCL chGa 2 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 87 bit th5p nh5t trong 10 bit k>t qu2 (b:n xem hnh cch bR tr 2 thanh ghi ADCL v ADCH bn d<?i .1 hi1u r h@n). Bits 4:0-MUX4:0 (Analog Channel and Gain Selection Bits): l 5 bit cho php ch-n knh, ch> .* v c2 hB sR khuy>ch .:i cho ADC. Do b* ADC trn AVR c nhi/u knh v cho php th`c hiBn chuy1n .ei ADC ki1u so snh (so snh .iBn p gi[a 2 chn analog) nn tr<?c khi th`c hiBn chuy1n .ei, chng ta cLn set cc bit MUX .1 ch-n knh v ch> .* cLn sC dHng. B2ng 3 tm tMt cc ch> .* ho:t .*ng c^a ADC thng qua cc gi trS c^a cc bit MUX. Trong b2ng ny, Gng v?i cc gi trS t; 00000 .>n 00111 (nhS phn), cc knh ADC .<Xc ch-n W ch> .* .@n knh (tn hiBu input l5y tr`c ti>p t; cc chn analog v so snh v?i 0V), gi trS t; 01000 .>n 11101 t<@ng Gng v?i ch> .* chuy1n .ei so snh. B2ng 3: Ch-n ch> .* chuy1n .ei. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 88
- ADCSRA (ADC Control and Status RegisterA): l thanh ghi chnh .i/u khi1n ho:t .*ng v chGa tr:ng thi c^a module ADC. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 89
T;ng bit c^a thanh ghi ADCSRA .<Xc m t2 nh< bn d<?i: Bit 7 - ADEN(ADC Enable): vi>t gi trS 1 vo bit ny tGc b:n . cho php module ADC .<Xc sC dHng. Tuy nhin khi ADEN=1 khng c ngh\a l ADC . ho:t .*ng ngay, b:n cLn set m*t bit khc ln 1 .1 bMt .Lu qu trnh chuy1n .ei, . l bit ADSC. Bit 6 - ADSC(ADC Start Conversion): set bit ny ln 1 l bMt .Lu khWi .*ng qu trnh chuy1n .ei. Trong suRt qu trnh chuy1n .ei, bit ADSC sc .<Xc gi[ nguyn gi trS 1, khi qu trnh chuy1n .ei k>t thc (t` .*ng), bit ny sc .<Xc tr2 v/ 0. V vAy b:n khng cLn v c7ng khng nn vi>t gi trS 0 vo bit ny W b5t kN tnh huRng no. b1 th`c hiBn m*t chuy1n .ei, thng th<Qng chng ta sc set bit ADEN=1 tr<?c v sau . set ADSC=1. Bit 4 ADIF(ADC Interrupt Flag): cQ bo ngMt. Khi m*t chuy1n .ei k>t thc, bit ny t` .*ng .<Xc set ln 1, v th> ng<Qi dng cLn ki1m tra gi trS bit ny tr<?c khi th`c hiBn .-c gi trS chuy1n .ei .1 .2m b2o qu trnh chuy1n .ei . th`c s` hon t5t. Bit 3 ADIE(ADC Interrupt Enable): bit cho php ngMt, n>u bit ny .<Xc set bZng 1 v bit cho php ngMt ton cHc (bit I trong thanh ghi tr:ng thi c^a chip) .<Xc set, m*t ngMt sc x2y ra khi m*t qu trnh chuy1n .ei ADC k>t thc v cc gi trS chuy1n .ei . .<Xc cAp nhAt (cc gi trS chuy1n .ei chGa trong 2 thanh ghi ADCL v ADCH). Bit 2:0 ADPS2:0(ADC Prescaler Select Bits): cc bit ch-n hB sR chia xung nhSp cho ADC. ADC, c7ng nh< t5t c2 cc module khc trn AVR, cLn .<Xc gi[ nhSp bZng m*t nguPn xung clock. Xung nhSp ny .<Xc l5y t; nguPn xung chnh c^a chip thng qua m*t hB sR chia. Cc bit ADPS cho php ng<Qi dng ch-n hB sR chia t; nguPn clock chnh .>n ADC. Tham kh2o b2ng 4 .1 bi>t cch ch-n hB sR chia. B2ng 4: HB sR chia xung nhSp cho ADC. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 90
- ADCL v ADCH (ADC Data Register): 2 thanh ghi chGa gi trS c^a qu trnh chuy1n .ei. Do module ADC trn AVR c .* phn gi2i tRi .a 10 bits nn cLn 2 thanh ghi .1 chGa gi trS chuy1n .ei. Tuy nhin teng sR bt c^a 2 thanh ghi 8 bit l 16, con sR ny nhi/u h@n 10 bit c^a k>t qu2 chuy1n .ei, v th> chng ta .<Xc php ch-n cch ghi 10 bit k>t qu2 vo 2 thanh ghi ny. Bit ADLAR trong thanh ghi ADMUX quy .Snh cch m k>t qu2 .<Xc ghi vo. ADLAR=0:
ADLAR=1:
Thng th<Qng, 2 thanh ghi data .<Xc sMp x>p theo .Snh d:ng ADLAR=0, ADCL chGa 8 bit th5p v 2 bit th5p c^a ADCH chGa 2 bit cao nh5t c^a gi trS thu .<Xc. Ch thG t` .-c gi trS t; 2 thanh ghi ny, .1 trnh .-c sai k>t qu2, b:n cLn .-c thanh ghi ADCL tr<?c v ADCH sau, v sau khi ADCH .<Xc .-c, cc thanh ghi data c th1 .<Xc cAp nhAt gi trS ti>p theo. - SFIOR(Special FunctionIO Register C): thanh ghi chGc nKng .Dc biBt, 3 bit cao trong thanh ghi ny quy .Snh nguPn kch ADC n>u ch> .* Auto Trigger .<Xc sC dHng. b l cc bit ADTS2:0 (Auto Trigger Source 2:0). Cc lo:i nguPn kch .<Xc trnh by trong b2ng 5. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 91
B2ng 5: NguPn kch ADC trong ch> .* Auto Trigger.
2. SU d5ng ADC- ChuyGn =Ki =.n knh. Khi niBm .@n knh .<Xc hi1u l .:i l<Xng cLn chuy1n .ei l cc .iBn p .Dt tr`c ti>p trn cc chn analog c^a chip, gi trS .iBn p ny .<Xc so snh v?i 0V c^a chip, hay ni m*t cch khc, .iBn p cLn chuy1n .ei v chip AVR c mass chung. Chng ta sc minh h-a cch sC dHng ADC trn AVR W ch> .* .@n knh bZng v dH .-c v hi1n thS gi trS ADC trn cc LED 7 .o:n. Nh< minh h-a trong hnh 4, chng ta sc dng 4 LED .1 hi1n thS 4 ch[ sR c^a k>t qu2, do chng ta ./u bi>t ADC trn AVR c .* phn gi2i 10 bit nn k>t qu2 chuy1n .ei tRi .a l 1023, 4 LED l .^ .1 hi1n thS k>t qu2 ny. 4 chip 7447 .<Xc dng .1 .i/u khi1n 4 LED, chng ta cLn 16 .<Qng .1 xu5t d[ liBu hi1n thS ln 4 LED v th> PORTB v PORTC sc .<Xc dng cho mHc .ch ny. 4 bit cao c^a PORTC(PC4:7) chGa ch[ sR hng nghn c^a k>t qu2, 4 bit th5p PC0:3 chGa ch[ sR hng trKm, 4 bit cao c^a PORTB(PB4:7) dng xu5t ch[ sR hng chHc v 4 bit PB0:3 dnh cho ch[ sR hng .@n vS. b:i l<Xng cLn chuy1n .ei l .iBn p trn chn ADC0 (knh 0 c^a ADC, chn 0 trong PORTA chip ATmega32), .iBn p .<Xc t:o ra bZng m*t bi>n trW RV1. Thay .ei gi trS bi>n trW, .iBn p r@i trn ADC0 thay .ei v .<Xc cAp nhAt tr`c ti>p trn cc LED. Gi trS hi1n thS trn LED khng ph2i l gi trS .iBn p m l gi trS t<@ng .Ri sau khi chuy1n .ei. Trong v dH ny, ti sc trnh by d:ng teng qut, viBc .-c ADC v hi1n thS LED .<Xc vi>t trong cc ch<@ng trnh con t<@ng Gng. BZng cch ny, cc b:n c th1 dI dng sCa .ei v mW r*ng v dH sau ny. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 92
Hnh 4. b-c ADC .@n knh. List 1 trnh by .o:n code minh h-a .-c ADC .@n knh v hi1n thS k>t qu2 trn LED 7 .o:n. List 1. b-c ADC .@n knh v hi1n thS bZng LED 7 .o:n. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 93 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 94
Ti t:m thQi chia .o:n ch<@ng trnh thnh 4 phLn, phLn 1 l cc .Snh ngh\a (dng 4 .>n 7), phLn 2 l ch<@ng trnh con .-c ADC .@n knh (dng 10 .>n 14), phLn 3 l ch<@ng trnh con hi1n thS mt gi trS 4 ch[ sR ln 4 LED 7 .o:n (t; dng 17 .>n 30) v phLn 4 l ch<@ng trnh chnh. Chng ta sc tm hi1u theo t;ng phLn. - Ph>n 1: ba dng 4, 5 v 6 chng ta .Snh ngh\a 3 bi>n .:i diBn tn c^a 3 mode .iBn p tham chi>u c th1 dng cho ADC. Xem l:i b2ng 2 chng ta bi>t rZng .iBn p tham chi>u .<Xc ch-n thng qua 2 bit REFS trong thanh ghi ADMUX, c 3 lo:i .iBn p c th1 .<Xc ch-n. Bi>n AREF_MODE t<@ng Gng v?i tr<Qng hXp chng ta muRn l5y .iBn p trn chn AREF lm .iBn p tham chi>u, .Ri chi>u b2ng 2 chng ta cLn set 2 bit REFS bZng 0, v dng 4 #define AREF_MODE 0 th`c hiBn viBc ny. T<@ng t`, bi>n INT_MODE .:i diBn cho tr<Qng hXp .iBn p tham chi>u n*i 2.56V v .<Xc .Snh ngh\a cho php set 1 bit REFS ln 1 #define INT_MODE (1<<REFS1)|(1<<REFS0). Bi>n AVCC_MODE .:i diBn tr<Qng hXp .iBn p tham chi>u l5y t; chn AVCC. CuRi cng, bi>n ADC_VREF_TYPE .<Xc .Snh ngh\a l bi>n ch-n mode m chng ta th`c s` muRn dng cho ADC, trong v dH ny ti ch-n .iBn p tham chi>u l5y t; chn AVCC v th> ti .Snh ngh\a #define ADC_VREF_TYPE AVCC_MODE. Bit ADC_VREF_TYPE sc .<Xc gn cho thanh ghi ADMUX khi khWi .*ng ADC trong ch<@ng trnh chnh. - Ph>n 2-ch9.ng trnh con =Rc ADC =.n knh uint16_t read_adc(unsigned char adc_channel): tn ch<@ng trnh l read_adc v adc_channel l tham sR cLn truy/n cho ch<@ng trnh con, tham sR ny l chU sR knh muRn .-c (t; knh 0 .>n knh 7). Gi trS tr2 v/ l m*t sR nguyn khng d5u 16 bit (ki1u unsigned int c^a C), tuy nhin trong v dH ny ti dng ki1u d[ liBu uint16_t thay cho unsigned int, uint16_t l m*t cch .Snh ngh\a ki1u d[ liBu nguyn khng d5u 16 bit c^a ring th< viBn gcc-avr. Dng .Lu tin c^a .o:n ch<@ng trnh con (dng 11) l khai bo knh muRn .-c bZng cch ghp gi trS knh cho thanh ghi ADMUX ADMUX |=adc_channel;. Xem l:i c5u trc thanh ghi ADMUX, trong thanh ghi ny, ngoi cc bit ch-n nguPn .iBn p tham chi>u REFS th 5 bit th5p MUX4:0 cho php ch-n knh ADC cLn .-c. Tham kh2o them b2ng 3 chng ta th5y rZng 8 gi trS .Lu tin c^a cc bit MUX4:0 (t; 00000 .>n 00111 nhS phn) t<@ng Gng v?i 8 knh .@n ADC0:7. Chnh s` sMp x>p ny cho php chng ta ghp tr`c ti>p gi trS knh muRn .-c vo thanh ghi ADMUX thng qua dng lBnh ADMUX |=adc_channel. Chng ta dng php OR | v chng ta chU muRn thay .ei gi trS c bit MUX m khng muRn lm 2nh h<Wng .>n gi trS SU T!M V BIN SO#N B%I NTINSIDE Ntinside 95 cc bit khc trong thanh ghi ADMUX khi ch-n knh. M*t ch quan tr-ng l gi trS c^a tham sR adc_channel chU trong kho2ng t; 0 .>n 7 t<@ng Gng v?i 8 ch> .* .-c .@n knh ADC trong b2ng 3. Sau khi knh . .<Xc ch-n, dng 12 set bit ADCS trong thanh ghi ADCSRA .1 bMt .Lu qu trnh chuy1n .ei ADCSRA|=(1<<ADSC);. Nh< . ./ cAp trong khi kh2o st chGc nKng c^a bit ADIF trong thanh ghi ADCSRA, sau khi qu trnh chuy1n .ei k>t thc bit ADIF sc .<Xc t` .*ng set ln 1, v th> dng code 13 .<Xc dng .1 chQ cho bit ny ln 1, tGc chQ cho qu trnh chuy1n .ei k>t thc. Cu lBnh loop_until_bit_is_set(ADCSRA,ADIF); .<Xc hi1u l lDp cho .>n khi bit ADIF trong thanh ghi ADCSRA .<Xc set ln 1, lBnh loop_until_bit_is_set ny .<Xc .Snh ngh\a sdn trong th< viBn gcc-avr. N>u qu trnh chuy1n .Yi . k>t thc, k>t qu2 chuy1n .ei sc .<Xc chGa trong 2 thanh ghi ADCL v ADCH, 2 thanh ghi ny .<Xc t` .*ng g-p thnh thanh ghi 16 bit ADCW (ADC WORD), dng 14 return ADCW tr2 v/ k>t qu2 chuy1n .ei. - Ph>n 3-ch9.ng trnh con hiGn th7 sI c 4 chP sI ln 4 LED 7 =o3n void LED7_out(uint16_t val) : val l sR cLn hi1n thS, chng ta khai bo 4 bi>n t:m dvi, chuc, tram, nghin .:i diBn cho cc ch[ sR .@n vS, chHc, trKm v nghn W dng 18. bPng thQi, m*t bi>n t:m temp_val .<Xc dng .1 l<u gi trS t:m thQi c^a sR val nh< trong dng 19 temp_val=val;, cch lm ny nhZm trnh thay .ei gi trS c^a b2n thn val trong qu trnh thao tc. Cc dng code t; 21 .>n 26 th`c hiBn qu trnh tch sR val ra thnh 4 cc ch[ sR hng .@n vS, chHc, trKm v nghn. by chU l ph<@ng php .:i sR thng th<Qng nn ti sc khng gi2i thch thm cho .o:n ny. Hai dng 28 v 29 xu5t gi trS ra 4 LED 7 .o:n. BRn LED 7 .o:n .<Xc .i/u khi1n bWi cc IC chuy1n m 7447, gi trS input choc cc IC 7447 l cc sR BCD 4 bit. V th>, .1 xu5t 4 ch[ sR ra 4 LED thng qua 7447 chng ta cLn 4x4=16 bit, trong v dH ny ti dng PORTB v PORTC cho nhiBm vH ny. BRn bit cao c^a PORTC sc chGa ch[ sR hng nghn, bRn bit th5p chGa ch[ sR hng trKm, bRn bit cao c^a PORTB chGa ch[ sR hng chHc v bRn bit th5p PORTB chGa sR .@n vS. Dng code 28 PORTB=(chuc<<4)+dvi; xu5t 2 ch[ sR chHc v .@n vS ra PORTB, trong . hm chuc<<4 ngh\a l dSch ch[ sR hng chHc sang tri 4 vS tr .1 .<a ch[ sR ny ln 4 bit cao c^a PORTB, sau . c*ng ch[ sR .@n vS vo 4 bit th5p v cuRi cng l xu5t ra PORTB. T<@ng t` chng ta c th1 xu5t 2 ch[ sR hng nghn v hng trKm ra PORTC thng qua dng code 29 PORTC=(nghin<<4)+tram. - Ph>n 4-ch9.ng trnh chnh: do hLu h>t cc nhiBm vH . .<Xc th`c hiBn trong cc .o:n ch<@ng trnh con nn ch<@ng trnh chnh trong v dH ny kh .@n gi2n. Hai dng code 32 v 33 set cc thng sR cho ADC, dng 32 ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); set cc bit trong SU T!M V BIN SO#N B%I NTINSIDE Ntinside 96 thanh ghi .i/u khi1n ADCSRA, ADC .<Xc cho php ho:t .*ng bWi bit ADEN, cc bit ADPS2:0 .1 ch-n prescaler xung clock (xem l:i phLn m t2 thanh ghi ADCSRA), trong v dH ny ti ch-n prescaler = 32 (b:n c th1 ch-n gi trS khc). Dng 33 ADMUX=ADC_VREF_TYPE; cho php ch-n .iBn p tham chi>u bZng cch gn bi>n ADC_VREF_TYPE m chng ta . .Snh ngh\a trong dng code 7 cho thanh ghi ADMUX. B:n cLn ch l sau khi th`c hiBn 2 dng code ny, ADC chU m?i W t< th> sdn sng nh<ng van ch<a ho:t .*ng, ADC sc ho:t .*ng khi chng ta g-i ch<@ng trnh con .-c adc. Trong vng lDp while c^a ch<@ng trnh chnh chng ta lLn l<Xt .-c gi trS ADC W knh 0 bZng cch g-i ch<@ng trnh con read_adc(0) W dng lBnh 39 ADC_val=read_adc(0); sau . hi1n thS ra LED 7 .o:n W dng 40 LED7_out(ADC_val); v cuRi cng l delay 1 kho2ng thQi gian nh_ (100ms) tr<?c khi lDp l:i qu trnh .-c v hi1n thS. M ph_ng v dH: T:o 1 project bZng Programmer Notepad v type .o:n code trn vo file source (xem phLn t:o Project v?i WinAVR). Bin dSch v ch:y m ph_ng v?i m:ch .iBn trong hnh 4. bi/u chUnh gi trS bi>n trW RV1 .1 thay .ei gi trS .iBn p input c^a ADC knh 0 v xem gi trS hi1n thS trn cc LED 7 .o:n. Hy thay .ei gi trS bi>n ADC_VREF_TYPE trong dng code 7 sang cc mode khc nh< INT_MODE, bin dSch v m ph_ng l:i ch<@ng trnh, quan st v so snh s` khc nhau gi[a cc mode .iBn p tham chi>u. B:n sc dI dng nhAn th5y rZng khi ch-n .iBn p tham chi>u n*i 2.56V, khi tKng bi>n trW .>n kho2ng gi[a th k>t qu2 chuy1n .ei sc l 1023(gi trS l?n nh5t c^a sR 10 bit) v n>u ti>p tHc tKng bi>n trW gi trS ny sc khng thay .ei. bi/u ny c ngh\a l n>u .iBn p input l?n h@n .iBn p tham chi>u th k>t qu2 chuy1n .ei sc l 1023. PhLn chuy1n .ei ADC W ch> .* so snh sc .<Xc trnh by trong 1 dSp khc W phLn Gng dHng.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 97 Bi 7 - Giao ti#p SPI
I. Gi-i thi0u. Bi ny gip cc b:n bi>t cch sC dHng cch truy/n thng nRi ti>p .Png b* SPI. Cng cH chnh c7ng l 2 b* phLn m/m AVRStudio (+gcc-avr) v Proteus. Th`c ch5t ngn ng[ lAp trnh van l gcc-avr nh<ng ti khng dng Programmer Notepad .1 bi>t code nh< thng th<Qng, thay vo . ti dng AVRStudio lm trnh bin tAp, b:n tham kh2o thm phLn LAp trnh C bZng AVRStudio trong bi h<?ng dan sC dHng AVRStudio .1 bi>t thm cch th`c hiBn. Ti sc dng chip ATmega32 lm minh h-a. Sau bi ny, ti hy v-ng b:n c th1 hi1u v th`c hiBn .<Xc: Nguyn l truy/n thng nRi ti>p SPI. SC dHng module SPI trong AVR W cc ch> .* Master v Slave. II. ChuYn truyTn thng SPI, SPI (Serial Peripheral Bus) l m*t chu]n truy/n thng nRi ti>p tRc .* cao do hang Motorola ./ xu5t. by l ki1u truy/n thng Master-Slave, trong . c 1 chip Master .i/u phRi qu trnh tuy/n thng v cc chip Slaves .<Xc .i/u khi1n bWi Master v th> truy/n thng chU x2y ra gi[a Master v Slave. SPI l m*t cch truy/n song cng (full duplex) ngh\a l t:i cng m*t thQi .i1m qu trnh truy/n v nhAn c th1 x2y ra .Png thQi. SPI .i khi .<Xc g-i l chu]n truy/n thng 4 dy v c 4 .<Qng giao ti>p trong chu]n ny . l SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) v SS (Slave Select). Hnh 1 th1 hiBn m*t k>t SPI gi[a m*t chip Master v 3 chip Slave thng qua 4 .<Qng. SCK: Xung gi[ nhSp cho giao ti>p SPI, v SPI l chu]n truy/n .Png b* nn cLn 1 .<Qng gi[ nhSp, mYi nhSp trn chn SCK bo 1 bit d[ liBu .>n hoDc .i. by l .i1m khc biBt v?i truy/n thng khng .Png b* m chng ta . bi>t trong chu]n UART. S` tPn t:i c^a chn SCK gip qu trnh tuy/n t bS lYi v v th> tRc .* truy/n c^a SPI c th1 .:t r5t cao. Xung nhSp chU .<Xc t:o ra bWi chip Master. MISO Master Input / Slave Output: n>u l chip Master th .y l .<Qng Input cn n>u l chip Slave th MISO l:i l Output. MISO c^a Master v cc Slaves .<Xc nRi tr`c ti>p v?i nhau.. MOSI Master Output / Slave Input: n>u l chip Master th .y l SU T!M V BIN SO#N B%I NTINSIDE Ntinside 98 .<Qng Output cn n>u l chip Slave th MOSI l Input. MOSI c^a Master v cc Slaves .<Xc nRi tr`c ti>p v?i nhau. SS Slave Select: SS l .<Qng ch-n Slave cLn giap ti>p, trn cc chip Slave .<Qng SS sc W mGc cao khi khng lm viBc. N>u chip Master ko .<Qng SS c^a m*t Slave no . xuRng mGc th5p th viBc giao ti>p sc x2y ra gi[a Master v Slave .. ChU c 1 .<Qng SS trn mYi Slave nh<ng c th1 c nhi/u .<Qng .i/u khi1n SS trn Master, ty thu*c vo thi>t k> c^a ng<Qi dng. . Hnh 1. Giao diBn SPI. Ho3t =Dng: mYi chip Master hay Slave c m*t thanh ghi d[ liBu 8 bits. CG mYi xung nhSp do Master t:o ra trn .<Qng gi[ nhSp SCK, m*t bit trong thanh ghi d[ liBu c^a Master .<Xc truy/n qua Slave trn .<Qng MOSI, .Png thQi m*t bit trong thanh ghi d[ liBu c^a chip Slave c7ng .<Xc truy/n qua Master trn .<Qng MISO. Do 2 gi d[ liBu trn 2 chip .<Xc gWi qua l:i .Png thQi nn qu trnh truy/n d[ liBu ny .<Xc g-i l song cng. Hnh 2 m t2 qu trnh truy/n 1 gi d[ liBu th`c hiBn bWi module SPI trong AVR, bn tri l chip Master v bn ph2i l Slave. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 99
Hnh 2. Truy/n d[ liBu SPI. C`c c^a xung gi[ nhSp, phase v cc ch> .* ho:t .*ng: c`c c^a xung gi[ nhSp (Clock Polarity) .<Xc g-i tMt l CPOL l khi niBm dng chU tr:ng thi c^a chn SCK W tr:ng thi nghU. % tr:ng thi nghU (Idle), chn SCK c th1 .<Xc gi[ W mGc cao (CPOL=1) hoDc th5p (CPOL=0). Phase (CPHA) dng .1 chU cch m d[ liBu .<Xc l5y mau (sample) theo xung gi[ nhSp. D[ liBu c th1 .<Xc l5y mau W c:nh ln c^a SCK (CPHA=0) hoDc c:nh xuRng (CPHA=1). S` k>t hXp c^a SPOL v CPHA lm nn 4 ch> .* ho:t .*ng c^a SPI. Nhn chung viBc ch-n 1 trong 4 ch> .* ny khng 2nh h<Wng .>n ch5t l<Xng truy/n thng m chU cRt sao cho c s` t<@ng thch gi[a Master v Slave. III. TruyTn thng SPI trn AVR. Module SPI trong cc chip AVR hLu nh< hon ton giRng v?i chu]n SPI m t2 trong phLn trn. V th>, n>u . hi1u cch truy/n thng SPI th sc khRng qu kh .1 th`c hiBn viBc truy/n thng ny v?i AVR. PhLn bn d<?i ti trnh by m*t sR .i1m quan tr-ng khi .i/u khi1n SPI trn AVR. Cc chn SPI: Cc chn giao ti>p SPI c7ng chnh l cc chn PORT thng th<Qng, v th> n>u muRn sC dHng SPI chng ta cLn xc lAp h<?ng cho cc chn ny. Trn chip ATmega32, cc chn SPI nh< sau: SCK PB7 (chn 8) MISO PB6 (chn 7) MOSI PB5 (chn 6) SS PB4 (chn 5) Khi chip AVR .<Xc sC dHng lm Slave, b:n cLn set cc chn SCK input, MOSI input, MISO output v SS input. N>u l Master th SCK output, MISO output, MOSI input v khi ny chn SS khng quan tr-ng, chng ta SU T!M V BIN SO#N B%I NTINSIDE Ntinside 100 c th1 dng chn ny .1 .i/u khi1n SS c^a Slaves hoDc b5t kN chn PORT thng th<Qng no. Thanh ghi: SPI trn AVR .<Xc vAn hnh bWi 3 thanh ghi bao gPm thanh ghi .i/u khi1n SPCR , thanh ghi tr:ng thi SPSR v thanh ghi d[ liBu SPDR. SPCR (SPI Control Register): l 1 thanh ghi 8 bit .i/u khi1n t5t c2 ho:t .*ng c^a SPI.
* Bit 7- SPIE (SPI Interrupt Enable) bit cho php ngMt SPI. N>u bit ny .<Xc set bZng 1 v bit I trong thanh ghi tr:ng thi .<Xc set bZng 1 (sei), 1 ngMt sc x2y ra sau khi m*t gi d[ liBu .<Xc truy/n hoDc nhAn. Chng ta nn dng ngMt (nh5t l .Ri v?i chip Slave) khi truy/n nhAn d[ liBu v?i SPI. * Bit 6 SPE (SPI Enable). set bit ny ln 1 .1 cho php b* SPI ho:t .*ng. N>u SPIE=0 th module SPI d;ng ho:t .*ng. * Bit 5 DORD (Data Order) bit ny chU .Snh thG t` d[ liBu cc bit .<Xc truy/n v nhAn trn cc .<Qng MISO v MOSI,
khi DORD=0 bit c tr-ng sR l?n nh5t c^a d[ liBu .<Xc truy/n tr<?c (MSB) ng<Xc l:i khi DORD=1, bit LSB .<Xc truy/n tr<?c. ThAt
ra khi giao ti>p gi[a 2 AVR v?i nhau, thG t` ny khng quan tr-ng nh<ng ph2i .2m b2o cc bit DORD giRng nhau trn c2 Master v
Slaves. bit ny chU .Snh thG t` d[ liBu cc bit .<Xc truy/n v nhAn trn cc .<Qng MISO v MOSI, khi DORD=0 bit c tr-ng sR l?n nh5t c^a d[ liBu .<Xc truy/n tr<?c (MSB) ng<Xc l:i khi DORD=1, bit LSB .<Xc truy/n tr<?c. ThAt ra khi giao ti>p gi[a 2 AVR v?i nhau, thG t` ny khng quan tr-ng nh<ng ph2i .2m b2o cc bit DORD giRng nhau trn c2 Master v Slaves. * Bit 4 MSTR (Master/Slave Select) n>u MSTR =1 th chip .<Xc nhAn diBn l Master, ng<Xc l:i MSTR=0 th chip l Slave.. * Bit 3 v 2 CPOL v CPHA .y chnh l 2 bit xc lAp c`c c^a xung gi[ nhSp v c:nh sample d[ liBu m chng ta . kh2o st trong phLn .Lu. S` k>t hXp 2 bit ny t:o thnh 4 ch> .* ho:t .*ng c^a SPI. M*t lLn n[a, ch-n ch> .* no khng quan tr-ng nh<ng ph2i .2m b2o Master v Slave cng ch> .* ho:t .*ng. V th> c th1 .1 2 bit ny bZng 0 trong t5t c2 cc chip. Hnh 3 trnh by cch sample d[ liBu trong 4 ch> .* c^a SPI trn AVR. CPHA=0. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 101
CPHA=1.
Hnh3 Cc ch> .* ho:t .*ng c^a SPI. * Bit 1:0 CPR1:0 hai bit ny k>t hXp v?i bit SPI2X trong thanh ghi SPSR cho php ch-n tRc .* giao ti>p SPI, tRc .* ny .<Xc xc lAp d`a trn tRc .* nguPn xung clock chia cho m*t hB sR chia. B2ng 1 tm tMt cc tRc .* m SPI trong AVR c th1 .:t. Thng th<Qng, tRc b* ny khng .<Xc l?n h@n 1/4 tRc .* xung nhSp cho chip.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 102 SPSR (SPI Status Register): l 1 thanh ghi tr:ng thi c^a module SPI. Trong thanh ghi ny chU c 3 bit .<Xc sC dHng. Bit 7 SPIF l cQ bo SPI, khi m*t gi d[ liBu . .<Xc truy/n hoDc nhAn t; SPI, bit SPIF sc t` .*ng .<Xc set len 1. Bit 6 WCOL l bt bo va ch:m d[ liBu (Write Colision), bit ny .<Xc AVR set ln 1 n>u chng ta cR tnh vi>t 1 gi d[ liBu m?i vo thanh ghi d[ liBu SPDR trong khi qu trnh truy/n nhAn tr<?c ch<a k>t thc. Bit 0 SPI2X g-i l bit nhn .i tRc .* truy/n, bit ny k>t hXp v?i 2 bit SPR1:0 trong thanh ghi .i/u khi1n SPCR xc lAp tRc .* cho SPI.
SPDR (SPI Data Register): l thanh ghi d[ liBu c^a SPI. Trn chip Master, ghi gi trS vo thanh ghi SPDR sc kch qu trnh tuy/n thng SPI. Trn chip Slave, d[ liBu nhAn .<Xc t; Master sc l<u trong thanh ghi SPDR, d[ liBu .<Xc l<u sdn trong SPDR sc .<Xc truy/n cho Master. SU d5ng SPI trn AVR: SPI trn AVR ho:t .*ng khng khc nguyn l chung c^a chu]n SPI l m5y. VAn hnh SPI trn AVR .<Xc th`c hiBn d`a trn viBc ghi v .-c 3 cc thanh ghi SPCR, SPSR v SPDR. Tr<?c khi truy/n nhAn bZng SPI chng ta cLn khWi .*ng SPI, qu trnh khWi .*ng th<Qng bao gPm ch-n h<?ng giao ti>p cho cc chn SPI, ch-n lo:i giao ti>p: Master hay Slave, ch-n ch> .* SPI (SPOL, SPHA) v ch-n tRc .* giao ti>p. Truy/n thng SPI lun .<Xc khWi x<?ng bWi chip Master, khi Master muRn giao ti>p v?i 1 Slave no ., n sc ko chn SS c^a Slave xuRng mGc th5p (g-i l ch-n .Sa chU) v sau . vi>t d[ liBu cLn truy/n vo thanh ghi d[ liBu SPDR, khi d[ liBu v;a .<Xc vi>t vo SPDR xung gi[ nhSp sc .<Xc t` .*ng t:o ra trn SCK v qu trnh truy/n nhAn bMt .Lu. bRi v?i cc chip Slave, khi chn SS bS ko xuRng n sc sdn sng cho qu trnh truy/n nhAn. Khi pht hiBn xung gi[ nhSp trn SCK, Slave sc bMt .Lu sample d[ liBu .>n trn .<Qng MOSI v gWi d[ liBu di trn MISO. b1 minh h-a cho cch truy/n v nhAn d[ liBu SPI trn AVR, ti sc th`c hiBn m*t v dH truy/n nhn 1 chi/u v?i 1 chip Master v 3 chip Slaves. T5t c2 cc chip .<Xc dng l ATmega32, chip Master sc .i/u khi1n cc chip Slaves thng qua 3 .<Qng ch-n chip PB0, PD1 v PD2. Cng viBc th`c hiBn trong v dH ny nh< sau: Master sc lLn l<Xt ch-n 1 trong 3 chip Slaves v gWi cc gi d[ liBu t<@ng Gng .>n chng, chip Slave0 sc nhAn .<Xc cc con sR t; 0 .>n 80, Slave1 nhAn 80 .>n 160 v Slave2 nhAn d[ liBu t; 160 .>n 240. Cc Slave sc hi1n thS gi trS m mnh nhAn .<Xc trn cc Text LCD k>t nRi SU T!M V BIN SO#N B%I NTINSIDE Ntinside 103 v?i PORTD W mYi Slave. S@ .P m:ch .iBn vc bZng Proteus cho v dH ny .<Xc trnh by trong hnh 4.
Hnh 4. M phngv d" giao ti$p SPI trn AVR. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 104 Trong bi ny, ti sc dng phLn m/m AVRStudio k>t hXp v?i gcc-avr trong WinAVR .1 lAp trnh bZng ngn ng[ C cho AVR. B:n hy tham kh2o thm bi AVRStudio .1 bi>t cch t:o 1 Project lAp trnh C cho AVR bZng AVRStudio. Hy t:o 2 Project ring, 1 Project c tn SPI_Master cho chip Master v 1 Project c tn SPI_Slave dng chung cho c2 3 Slaves. Copy file myLCD.h dng cho .i/u khi1n Text LCD .<Xc t:o trong bi Text LCD vo c2 2 th< mHc chGa 2 Projects m?i t:o. Vi>t .o:n code trong list 0 vo file SPI_Master.c v .o:n code trong list 1 vo file SPI_Slave.c. List 1. bo:n code cho SPI Master. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 105 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 106
Ti sc gi2i thch s@ l<Xt m*t sR .i1m chnh trong .o:n code cho chip Master. Cc phLn .Snh ngh\a t; dng thG 10 .>n dng 17 chU c tc dHng lm cho ch<@ng trnh dI .-c hi1u h@n v c tnh t<@ng thch cao h@n, v dH n>u b:n muRn sC dHng v dH ny cho cc chip khc b:n chU cLn thay .ei cc .Snh ngh\a ny m khng ph2i thay .ei trong n*i dung cc ch<@ng trnh con. Chng ta .Snh ngh\a .1 ch-n PORTB .i/u khi1n cc .<Qng ch-n chip SS c^a Slave (g-i l cc .<Qng .Sa chU), dng 18 .Snh ngh\a Slave(i) l thG t` chn trn PORT dng cho chip Slave thG i. DI hi1u h@n, .<Qng SS trn Slave0 sc .<Xc k>t nRi v .i/u khi1n bWi chn 0 c^a PORTB (chn PB0 v t<@ng t` cho cc Slaves cn l:i. Bi>n wData .Snh ngh\a trn dng 20 l m*t m2ng 3 phLn tC chGa cc con sR 8 bits sc truy/n .>n cc Slaves. Ch9.ng trnh con void SPI_MasterInit(void): Ch<@ng trnh ny khWi .*ng cho chip Master, viBc khWi .*ng tr<?c h>t l set h<?ng cho cc chn SPI. bRi v?i Master, cc chn t:o xung gi[ nhSp SCK v chn truy/n d[ liBu MOSI cLn .<Xc set Output nh< trong dng 24, cc chn SPI cn l:i l input. Dng 25 gip ko .iBn trW ko ln W chn nhAn d[ liBu MISO c^a Master. Dng lBnh 26 SPCR=(1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SP R0); thAt s` khWi .*ng SPI v?i viBc set bit SPIE: cho php ngMt SPI=1, bit SPE=1 cho php SPI ho:t .*ng, MSTR=1 xc lAp chip l chip Master. CPHA=1 tGc chn SCK sc W mGc th5p khi SPI khng ho:t .*ng, trong khi CPOL=0 (khng set CPOL th mDc .Snh l 0) th d[ liBu sc .<Xc sample (l5y mau) W c:nh xuRng c^a xung SCK. CuRi cng c2 2 bit SPR1 v SPR0 ./u .<Xc set ln 1, tRc .* SPI sc bZng tRc .* nguPn cung nui chip chia cho 128 (xem b2ng 1). Dng code 29 set h<?ng Output cho cc chn dng lm chn .Sa chU ch-n chip Slaves (cc chn PB0, PB1, PB2), sau . ko cc chn ny ln mGc cao .1 disable t5t c2 cc Slaves (sau ny sc kch ho:t sau). Ch9.ng trnh con void SPI_Transmit(uint8_t i, uint8_t data): ch<@ng trnh truy/n d[ liBu qua SPI c^a chip Master, ch<@ng trnh c 2 tham sR l .Sa chU chip Slave (bi>n i) v d[ liBu cLn truy/n (bi>n data). Tr<?c khi truy/n d[ liBu, Master sc th`c hiBn viBc ch-n Slave, dng 35 cbi(ADDRESS_PORT, Slave(i)); th`c hiBn viBc ny. Th`c ch5t dng ny l ko chn i c^a PORTB xuRng mGc th5p, c7ng l ko chn SS c^a Slave xuRng mGc th5p. Dng 36 gn gi trS cLn truy/n cho thanh ghi d[ liBu SPDR=data, sau khi gn gi trS cho SPDR, xung clock sc t` .*ng .<Xc Master t:o ra trn SCK, qu trnh truy/n bMt .Lu. Qu trnh truy/n k>t thc th bit cQ SPIF trong thanh ghi tr:ng thi SPSR .<Xc set ln 1, dng 36 th`c hiBn viBc chQ bit cQ SPIF .1 k>t thc qu trnh truy/n. Khi k>t thc truy/n 1 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 107 byte cho Slave, set chn SS c^a Slave ln mGc cao .1 v hiBu ha SPI, dng 37. Ch9.ng trnh chnh: ch<@ng trnh chnh cho chip Master SPI t<@ng .Ri .@n gi2n, tr<?c h>t chng ta cLn g-i ch<@ng trnh con khWi .*ng SPI W dng 43. Trong vng lDp v tAn while, lLn l<Xt gWi cc gi trS .>n cc Slaves. Dng 46 g-i ch<@ng trnh con gWi gi trS bi>n wData[0] .>n Slave0, dng 50 truy/n bi>n wData[1] cho Slave1 v dng 54 truy/n bi>n wData[2] cho Slave2 List 2.bo:n code cho Slave SPI. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 108
bo:n code trong list 2 l .o:n code cho chip Slaves, ch dng 3 chng ta include file header interrupt.h v viBc nhAn d[ liBu SPI c^a SLave .<Xc th`c hiBn bZng ngMt SPI. Cc .Snh ngh\a bi>n trong cc dng code t; 8 .>n SU T!M V BIN SO#N B%I NTINSIDE Ntinside 109 15 t<@ng t` nh< trong ch<@ng trnh cho chip Master. Ti sc tAp trung gi2i thch cc .i1m khc biBt cho Slaves. Ch9.ng trnh con void SPI_SlaveInit(void): Ch<@ng trnh ny khWi .*ng cho chip Slave, c7ng giRng nh< tr<Qng hXp c^a Master, viBc khWi .*ng tr<?c h>t l set h<?ng cho cc chn SPI. bRi v?i Slave, chU c chn truy/n d[ liBu MISO l cLn .<Xc set Output nh< trong dng 19, cc chn SPI cn l:i l input. Dng 20 gip ko .iBn trW ko ln W cc chn nhAn d[ liBu MOSI c^a Slave, v chn ch-n Slave SS. ViBc ti>p theo l ci .Dt cc thanh ghi SPI nh< trong dng lBnh 21, SPCR=(1<<SPIE)|(1<<SPE)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); , n>u quan st dng lBnh 26 trong List 1 chop chip Master, dng ny khng khc l m5y, qu trnh khWi .*ng SPI cho Slave t<@ng t` Master v?i m*t .i1m khc duy nh5t l bit MSTR, bit ny khng .<Xc set ln 1 .Ri v?i Slaves. Trnh ph5c v5 ngSt ISR(SPI_STC_vect): SPI trn AVR chU c duy nh5t m*t s` kiBn gy ra ngMt . l khi qu trnh truy/n-nhAn k>t thc. Tn vector ngMt SPI trong ngn ng[ lAp trnh avr-gcc l SPI_STC_vect. Trong v dH ny, khi m*t ngMt SPI x2y ra W Slave, chng ta sc .-c thanh ghi SPDR v sau . hi1n thS gi trS .-c .<Xc trn LCD. Dng 37, rData=SPDR, gn thanh ghi SPDR cho bi>n rData. T; dng 38 .>n 42 l cch hi1n thS gi trS .-c v/ trn Text LCD bZng th< viBn myLCD (xem bi Text LCD). Dng 39 chng ta khai bo 1 bi>n t:m d:ng m2ng .*ng, dis, lm buffer chGa gi trS ascii c^a cc k t` cLn hi1n thS ln LCD. Ch l gi trS nhAn v/ l 1 con sR 8 bit, muRn hi1n thS gi trS ny ln LCD chng ta khng th1 hi1n thS tr`c ti>p bZng lBnh putChar_LCD v hm putChar_LCD xem tham sR nhAp vo l m Ascii, v dH chng ta nhAn v/ sR rData=65, n>u dng hm putChar_LCD(rData) th trn LCD chU th5y k t` A v 65 l m Ascii c^a k t` A. b1 LCD hi1n thS 65 chng ta xem 65 l m*t chuYi cc k t`, tr<?c h>t cLn chuy1n sR 65 thnh cc k t` 6 v 5, hm sprintf(dis,"%i",rData) trong dng code 40 th`c hiBn viBc .Snh d:ng l:i bi>n rData thnh chuYi cc k t` v chGa trong buffer dis, %i l cQ .Snh d:ng, bo cho hm sprintf xem rData l m*t sR nguyn. Sau dng 40, v dH rData=65, th dis=65. Dng 42 in chuYi dis ln LCD: print_LCD(dis);. Ch9.ng trnh chnh: ch<@ng trnh chnh cho chip Slave khng lm nhi/u viBc v cc viBc chnh nh< nhAn v hi1n thS . .<Xc th`c hiBn trong trnh phHc vH ngMt SPI. Dng 27 sei() cho php ngMt ton cHc, .i/u ny l cLn thi>t .1 ngMt SPI c th1 x2y ra, dng 28 g-i ch<@ng trnh con khWi .*ng SPI cho Slave, sau . khWi .*ng LCD W dng 29 v k>t thc. Khng c viBc g cLn th`c hiBn trong vng lDp while().
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 110 Bi 8 - Giao ti#p TWI - I2C
I. B3n sE =i =Qn =u. Bi ny gi?i thiBu cch giao ti>p bZng truy/n thng nRi ti>p .Png b* Two-Wire Serial (TWI) t<@ng thch v?i chu]n I 2 C. Trong bi ny chng ta sc kh2o st 2 mode truy/n v nhAn trn chip Master cng v?i 2 mode truy/n v nhAn trn chip Slave. Cng cH chnh c7ng l 2 b* phLn m/m WinAVR v Proteus. Vi .i/u khi1n ATmega32 sc .<Xc dng lm minh h-a. Sau bi ny, ti hy v-ng b:n c th1 hi1u v th`c hiBn .<Xc: - Nguyn l truy/n thng nRi ti>p TWI v I 2 C. - SC dHng module TWI trong AVR W cc ch> .* Master. - SC dHng module TWI trong AVR W cc ch> .* Slave. - V dH giao ti>p gi[a cc AVR bZng TWI. II. Giao di0n TWI I 2 C. TWI (Two-Wire Serial Intereafce) l m*t module truy/n thng nRi ti>p .Png b* trn cc chip AVR d`a trn chu]n truy/n thng I 2 C. I 2 C l vi>t tMc c^a t; Inter-Integrated Circuit l m*t chu]n truy/n thng do hng .iBn tC Philips Semiconductor sng lAp v xy d`ng thnh chu]n nKm 1990. Phin b2n m?i nh5t c^a I2C l V3.0 pht hnh nKm 2007. b1 hi1u thm v/ I2C b:n c th1 tham kh2o cc ti liBu I2C Specification t; trang web c^a NXP- http://www.nxp.com (lAp bWi Philips). Trong ph:m vi bi h-c ny ti chU gi?i thiBu giao thGc TWI .<Xc gi?i thiBu trong datasheet c^a cc chip AVR t; Atmel. Tuy nhin, v/ c@ b2n TWI trong AVR hon ton t<@ng thch I2C, do . tm hi1u TWI c^a AVR khng chU gip b:n giao ti>p gi[a cc AVR v?i nhau m c th1 dng TWI .1 .i/u khi1n b5t kN m*t thi>t bS no theo chu]n I2C (cc chip nh?, b* chuy1n .ei ADC, DCA, .Png hP thQi gian th`c). TWI (I2C) l m*t truy/n thng nRi ti>p .a chip ch^ (t:m dSch c^a cHm t; multi-master serial computer bus). Khi niBm multi-master (ti sc dng t; ti>ng anh multi-master thay v dng .a chip ch^) .<Xc hi1u l trong trn cng m*t bus c th1 c nhi/u h@n m*t thi>t bS lm Master, .Png thQi m*t Slave c th1 trW thnh m*t Master n>u n c kh2 nKng. V dH trong m*t m:ng TWI c^a nhi/u AVR k>t nRi v?i nhau, b5t kN m*t AVR no ./u c th1 trW thnh Master W m*t thQi .i1m no .. Tuy nhin n>u m*t m:ng dng m*t AVR .i/u khi1n cc chip nh? (nh< EEPROM AT24C1024 chFng h:n) th khi niBm multi-master khng tPn t:i v cc chip nh? .<Xc thi>t k> sdn l Slave, khng c kh2 nKng trW thnh master. TWI (I2C) .<Xc th`c hiBn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 111 trn 2 .<Qng SDA (Serial DATA) v SCL (Serial Clock) trong . SDA l .<Qng truy/n/nhAn d[ liBu v SCL l .<Qng xung nhSp. CKn cG theo chu]n I2C, cc .<Qng SDA v SCL trn cc thi>t bS c c5u hnh c`c gp mW (open-drain hoDc open-collector, tham kh2o cc m:ch sR dng transistor .1 hi1u thm), ngh\a l cLn c cc .iBn trW ko ln (pull-up resistor) cho cc .<Qng ny. % tr:ng thi nghU (Idle), 2 chn SDA v SCL W mGc cao. Hnh 1 m t2 m*t m hnh m:ng TWI (I2C) c@ b2n.
Hnh 1. M:ng TWI (I2C) v?i nhi/u thi>t bS v 2 .iBn trW ko ln cho SDA, SCL. Ti>p theo chng ta tm hi1u m*t sR khi niBm v .Dc .i1m c^a TWI. Cc khi niBm v .Dc .i1m ti ./ cAp d<?i .y .<Xc dng cho c2 TWI v I2C, n>u c s` khc biBt ti sc gi2i thch thm. Master: l chip khWi .*ng qu trnh truy/n nhAn, pht .i .Sa chU c^a thi>t bS cLn giao ti>p v t:o xung gi[ nhSp trn .<Qng SCL. Slave: l chip c m*t .Sa chU cR .Snh, .<Xc g-i bWi Master v phHc vH yu cLu t; Master. SDA- Serial Data: l .<Qng d[ liBu nRi ti>p, t5t c2 cc thng tin v/ .Sa chU hay d[ liBu ./u .<Xc truy/n trn .<Qng ny theo thG t` t;ng bit m*t. Ch l trong chu]n I2C, bit c tr-ng sR l?n nh5t (MSB) .<Xc truy/n tr<?c nh5t, .Dc .i1m ny ng<Xc l:i v?i chu]n UART. SCL Serial Clock: l .<Qng gi[ nhSp nRi ti>p. TWI (I2C) l chuLn truy/n thng nRi ti>p .Png b*, cLn c 1 .<Qng t:o xung gi[ nhSp cho qu trnh truy/n/nhAn, cG mYi xung trn .<Qng gi[ nhSp SCL, m*t bit d[ liBu trn .<Qng SDA sc .<Xc l5y mau (sample). D[ liBu nRi ti>p trn .<Qng SDA .<Xc l5y mau khi .<Qng SCL W mGc cao trong m*t chu kN gi[ nhSp, v th> .<Qng SDA khng .<Xc .ei tr:ng thi khi SCL W mGc cao (tr; START v STOP condition). Chn SDA c th1 .<Xc .ei tr:ng thi khi SCL W mGc th5p. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 112
START Condition-bi/u kiBn bMt .Lu: t; tr:ng thi nghU, khi c2 SDA v SCL W mGc cao n>u Master muRn th`c hiBn m*t cu*c g-i, Master sc ko chn SDA xuRng th5p trong khi SCL van cao. Tr:ng thi ny g-i l START Condition (chng ta g-i tMt l S). STOP Condition-bi/u kiBn k>t thc: sau khi th`c hiBn truy/n/nhAn d[ liBu, n>u Master muRn k>t thc qu trnh n sc t:o ra m*t STOP condition. STOP condition .<Xc Master th`c hiBn bZng cch ko chn SDA ln cao khi .<Qng SCL .ang W mGc cao. STOP condition chU .<Xc t:o ra sau khi .Sa chU hoDc d[ liBu . .<Xc truy/n/nhAn. REPEAT START BSt =>u lZp l3i: kho2ng gi[a START v STOP condition l kho2ng bAn c^a .<Qng truy/n, cc Master khc khng tc .*ng .<Xc vo .<Qng truy/n trong kho2ng ny. Tr<Qng hXp sau khi k>t thc truy/n/nhAn m Master khng gWi STOP condition l:i gWi thm 1 START condition g-i l REPEAT START. Kh2 nKng ny th<Qng .<Xc dng khi Master muRn l5y d[ liBu lin ti>p t; cc Slaves. Hnh bn d<?i m t2 cc Master t:o ra START, STOP v REPEAT START.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 113 Address Packet Format (7nh d3ng gi =7a ch[: trn m:ng TWI (I2C), t5t c2 cc thi>t bS (chip) ./u c th1 l Master hay Slave. MYi thi>t bS c m*t .Sa chU cR .Snh g-i l Device address. Khi m*t Master muRn giao ti>p v?i m*t Slave no ., n tr<?c h>t t:o ra m*t START condition v ti>p theo l gWi .Sa chU Device address c^a Slave cLn giao ti>p trn .<Qng truy/n, v th> xu5t hiBn khi niBm gi .Sa chU (Address Packet). Gi .Sa chU trong TWI (I2C) c .Snh d:ng 9 bits trong . 7 bit .Lu (g-i l SLA, .<Xc gWi li/n sau START condition) chGa .Sa chU Slave, m*t bit READ/WRITE v m*t bit ACK-Ackknowledge (xc nhAn). Do bit .Sa chU c .* di 7 bits nn v/ mDt l thuy>t, trn 1 m:ng TWI (I2C) c th1 tPn t:i tRi .a 27=128 thi>t bS c .Sa chU ring biBt. Tuy nhin, c m*t sR .Sa chU khng .<Xc sC dHng nh< cc .Sa chU c .Snh d:ng 1111xxx (tGc cc .Sa chU l?n h@n hoDc bZng 120 khng .<Xc dng). Ring .Sa chU 0 .<Xc dng cho cu*c g-i chung (General call). Bit READ/WRITE (R/W) .<Xc truy/n ti>p sau 7 bit .Sa chU l bit bo cho Slave bi>t Master muRn .-c hay ghi vo Slave. N>u bit ny bZng 0 (g-i l W) th qu trnh Ghi d[ liBu t; Master .>n Slave .<Xc yu cLu, n>u bit ny bZng 1 (g-i l R) th Master muRn .-c d[ liBu t; Slave v/. Tm bits trn (SLA+R/W) .<Xc Master pht ra sau khi pht START condition, n>u m*t Slave trn m:ng nhAn ra rZng .Sa chU m Master yu cLu trng kh?p v?i Device address c^a chnh mnh, n sc .p tr2 l:i Master bZng cch pht ra 1 tn hiBu xc nhAn ACK bZng cch ko chn SDA xuRng th5p trong xung thG 9. Ng<Xc l:i, n>u khng c Slave .p Gng l:i, chn SDA van W mGc cao trong xung gi[ nhSp thG 9 th g-i l tn hiBu khng xc nhAn NOT ACK, lc ny Master cLn c nh[ng Gng xC ph hXp ty theo mYi tr<Qng hXp cH th1, v dH Master c th1 gWi STOP condition v sau . pht l:i .Sa chU Slave khcNh< vAy, trong 9 bit c^a gi .Sa chU th chU c 8 bit .<Xc gWi bWi Master, bit cn l:i l do Slave. V dH Master muRn yu cLu .-c d[ liBu t; Slave c .Sa chU 43, n cLn pht .i m*t byte nh< sau trn .<Qng truy/n: (43<<1)+1, trong . (43<<1) l dSch sR 43 v/ bn tri 1 vS tr v 7 bit .Sa chU nZm W cc vS tr cao trong gi .Sa chU, sau . c*ng gi trS ny v?i 1 tGc l qu trnh .-c .<Xc yu cLu. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 114
General call CuDc gRi chung: khi Master pht .i gi .Sa chU c d:ng 0 (th`c ch5t l 0+W) tGc n muRn th`c hiBn m*t cu*c g-i chung .>n t5t c2 cc Slave. T5t nhin, cho php hay khng cho php cu*c g-i chung l do Slave quy>t .Snh. N>u cc Slave .<Xc ci .Dt cho php cu*c g-i chung, chng sc .p l:i Master bZng ACK. Cu*c g-i chung th<Qng x2y ra khi Master muRn gWi d[ liBu chung .>n cc Slaves. Ch l cu*c g-i chung c d:ng 0+R l v ngh\a v khng th1 c chuyBn Master nhAn d[ liBu t; t5t c2 cc Slave cng thQi .i1m. Data Packet Format (7nh d3ng gi dP li0u: sau khi .Sa chU . .<Xc pht .i, Slave . .p l:i Master bZng ACK th qu trnh truy/n/nhAn d[ liBu sc diIn ra gi[a cDp Master/Slave ny. Ty vo bit R/W trong gi .Sa chU, d[ liBu c th1 .<Xc truy/n theo h<?ng t; Master .>n Slave hay t; Slave .>n Master. D di chuy1n theo h<?ng no, gi d[ liBu lun bao gPm 9 bits trong . 8 bits .Lu l d[ liBu v 1 bit cuRi l bit ACK. Tm bits d[ liBu do thi>t bS pht gWi v bit ACK do thi>t bS nhAn t:o ra. V dH khi Master th`c hiBn qu trnh gWi d[ liBu .>n Slave, n sc pht ra 8 bits d[ liBu, Slave nhAn v pht l:i ACK (ko SDA xuRng 0 W xung thG 9), sau . Master sc quy>t .Snh gXi ti>p byte d[ liBu khc hay khng. N>u Slave pht tn hiBu NOT ACK (khng tc .*ng SDA W xung thG 9) sau khi nhAn d[ liBu th Master sc k>t thc qu trnh gWi bZng cch pht .i STOP condition. Hnh bn d<?i m t2 .Snh d:ng gi d[ liBu trong TWI (I2C). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 115
PhIi hWp gi =7a ch[ v dP li0u: m*t qu trnh truy/n/nhAn TWI (I2C) th<Qng .<Xc bMt .Lu t; Master, Master pht .i m*t START condition sau . gWi gi .Sa chU SLA+R/W trn .<Qng truy/n. Ti>p theo n>u c m*t Slave .p Gng l:i, d[ liBu c th1 truy/n/nhAn lin ti>p trn .<Qng truy/n (1 hoDc nhi/u byte lin ti>p). Khung truy/n thng th<Qng .<Xc m t2 nh< hnh bn d<?i.
Multi-Master Bus (9Ang truyTn =a chip ch?: nh< . trnh by W trn, TWI (I2C) l chu]n truy/n thng .a chip ch^, ngh\a l t:i m*t thQi .i1m c th1 c nhi/u h@n 1 chip lm Master n>u cc chip ny pht ra START condition cng lc. N>u cc Master c cng yu cLu v thao tc .Ri v?i Slave th chng c th1 cng tPn t:i v qu trnh truy/n/nhAn c th1 thnh cng. Tuy nhin, trong .a sR tr<Qng hXp sc c m*t sR Master bS th5t l:c (lost). M*t Master bS lost khi n truy/n/nhAn 1 mGc cao trn SDA trong khi cc Master khc truy/n/nhAn 1 mGc th5p. Truy/n thng .a chip ch^ t<@ng .Ri phGc t:p v v th> ti sc khng ./ cAp tr<Qng hXp ny trong lc th`c hiBn v dH giao ti>p trong bi h-c ny. NMm .<Xc cc khi niBm v .Dc .i1m trn c^a truy/n thng TWI (I2C) l b:n . sdn sng .1 .i/u khi1n module TWI trn AVR. PhLn ti>p theo ti sc h<?ng dan cch thao tc module TWI trn AVR thng qua m*t v dH cH th1. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 116 III. TWI trn AVR. 1. Thanh ghi: TWI trn AVR .<Xc vAn hnh bWi 5 thanh ghi bao gPm thanh ghi tRc .* gi[ nhSp TWBR, thanh ghi .i/u khi1n TWCR , thanh ghi tr:ng thi TWSR, thanh ghi .Sa chU TWAR v thanh ghi d[ liBu TWDR. - TWBR (TWI Bit Rate Register): l 1 thanh ghi 8 bit quy .Snh tRc .* pht xung gi[ nhSp trn .<Qng SCL c^a chip Master.
TRc .* pht xung gi[ nhSp .<Xc tnh theo cng thGc:
Trong . CPU Clock frequency l tLn sR ho:t .*ng chnh c^a AVR, TWBR l gi trS thanh thi TWBR v TWPS l gi trS c^a 2 bits TWPS1 v TWPS0 nZm trong thanh thi tr:ng thi TWSR. Hai bits ny .<Xc g-i l bit prescaler, thng th<Qng ng<Qi ta hay set TWPS1:0 =00 .1 ch-n Prescaler l 1 (40=1). B2ng 1 tm tMt tRc .* xung gi[ nhSp t:o ra trn SCL .Ri v?i cc gi trS c^a tham sR: B2ng 1. TRc .* xung gi[ nhSp tham kh2o. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 117
- TWCR (TWI Control Register): l thanh ghi 8 bit .i/u khi1n ho:t .*ng c^a TWI.
Bit 7- TWINT (TWI Interrupt Flag): l m*t cQ bo r5t quan tr-ng. TWINT .<Xc t` .*ng set ln 1 khi TWI k>t thc m*t qu trnh b5t kN no . (nh< pht/nhAn START, pht nhAn .Sa chU). Ch l bit ny khng t` .*ng .<Xc xa bWi phLn cGng nh< cc cQ bo trong cc module khc. V th>, khi lAp trnh .i/u khi1n TWI chng ta lun ph2i xa TWINT tr<?c khi muRn th`c hiBn m*t qu trnh no .. M*t .i1m quan tr-ng cLn l<u l bit TWINT .<Xc xa khi chng ta vi>t gi trS 1 vo n. Trong khi lAp trnh cho TWI, chng ta th<Qng xa TWINT bZng cch vi>t 1 vo n, sau . lin tHc ki1m tra TWINT, n>u bit ny .<Xc set ln 1 th qu trnh . hon thnh. Bit 6 TWEA (TWI Enable Acknowledge Bit): t:m hi1u l bit kch ho:t tn hiBu xc nhAn. bRi v?i chip Slave, n>u bit ny .<Xc set th tn hiBu xc ACK sc .<Xc gWi trong cc tr<Qng hXp sau: .Sa chU do Master pht ra trng kh?p v?i .Sa chU c^a Slave; m*t cu*c g-i chung .ang x2y ra v Slave ny cho php cu*c g-i chung; d[ liBu . .<Xc Slave nhAn t; Master. Nh< SU T!M V BIN SO#N B%I NTINSIDE Ntinside 118 th>, khi set m*t chip W ch> .* Slave, chng ta cLn set bit ny .1 n c th1 .p Gng l:i Master b5t cG khi no .<Xc g-i. bRi v?i chip Master, tn hiBu ACK chU .<Xc pht trong 1 tr<Qng hXp duy nh5t . l khi Master nhAn d[ liBu t; Slave, Master pht ACK .1 bo cho Slave l mnh . nhAn .<Xc v muRn ti>p tHc nhAn t; Slave. Bit 5 TWSTA (TWI START Condition Bit): l bit t:o START condition. Khi m*t chip muRn trW thnh Master .1 th`c hiBn 1 cu*c g-i, bit ny cLn .<Xc set v m*t START condition .<Xc t:o ra trn .<Qng truy/n n>u .<Qng truy/n .ang r2nh. N>u .<Qng truy/n khng r2nh, TWI sc chQ cho .>n khi n r2nh (nhAn ra 1 STOP condition) v ti>p tHc gWi START condition. Ch l l bit nay cLn .<Xc xa bWi phLn m/m sau khi START condition . .<Xc gWi (vi>t 0 vo bit ny .1 xa n). Bit 4 TWSTO (TWI STOP Condition Bit): l bit t:o STOP condition cho TWI. Khi Master muRn k>t thc m*t cu*c g-i, n sc pht STOP condition bZng cch vi>t gi trS 1 vo bit TWSTO. Slave c7ng c th1 tc .*ng vo bit ny, n>u m*t cu*c g-i bS lYi, vi>t 1 vo TWSTO trn Slave sc reset .<Qng truy/n v/ tr:ng thi r2nh ban .Lu. Bit 3 TWWC (TWI Write Collision Flag): khi cQ TWINT .ang W mGc th5p tGc TWI .ang bAn, n>u chng ta vi>t d[ liBu vo thanh ghi d[ liBu (TWDR) th m*t lYi x2y ra, khi . bit TWWC t` .*ng .<Xc set ln 1. V th>, trong qu trnh truy/n d[ liBu, bit TWINT cLn .<Xc gi[ mGc cao khi ghi d[ liBu vo thanh ghi TWDR v sau . xa khi d[ liBu . sdn sng. Bit 2 TWEN (TWI Enable Bit): bit kch ho:t TWI trn AVR, khi TWEN .<Xc set ln 1, TWI sdn sng ho:t .*ng. Bit 1 Reserve: khng sC dHng. Bit 0 TWIE (TWI Interrupt Enable Bit): bit cho php ngMt TWI, khi bit nay .<Xc set bZng 1 .Png thQi bit I trong thanh ghi tr:ng thi chung .<Xc set, m*t ngMt TWI x2y ra khi bit TWINT .<Xc set bWi phLn cGng. NgMt TWI c th1 x2y ra sau b5t kN ho:t .*ng no lin quan .>n TWI. Do . cLn sC dHng ngMt hXp l. Thng th<Qng, ngMt chU .<Xc sC dHng cho Slave, .Ri v?i Master ngMt khng cLn thi>t v Master ch^ .*ng khWi .*ng m*t cu*c g-i. M*t .i/u cLn ch l cc bit trong thanh ghi TWCR khng cLn .<Xc set cng lc, ty vo t;ng giai .o:n trong qu trnh giao ti>p TWI cc bit c th1 .<Xc set ring lf. - TWSR (TWI Status Register): l 1 thanh ghi 8 bit trong . c 5 bit chGa code tr:ng thi c^a TWI v 2 bit ch-n prescaler. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 119
C r5t nhi/u b<?c, nhi/u tnh huRng x2y ra khi giao ti>p bZng TWI cho c2 Master v Slave. (ng v?i mYi tr<Qng hXp TWI sc t:o ra 1 code trong thanh ghi TWSR . LAp trnh cho TWI cLn xt code trong 5 bit cao c^a thanh ghi TWSR v .<a ra cc Gng xC hXp l Gng v?i t;ng code. - TWDR (TWI Data Register): l thanh ghi d[ liBu chnh c^a TWI. Trong qu trnh nhAn, d[ liBu nhAn v/ sc .<Xc l<u trong TWDR. Trong qu trnh gWi, d[ liBu chGa trong TWDR sc .<Xc chuy1n ra .<Qng SDA. - TWAR (TWI Address Register): l thanh ghi chGa device address c^a chip Slave. C5u trc thanh ghi .<Xc trnh by trong hnh d<?i.
Nh? l:i .Sa chU Slave .<Xc t:o thnh t; 7 bits, trn thanh ghi TWAR 7 bits .Sa chU ny nZm W 7 vS tr cao. Tr<?c khi sC dHng TWI nh< Slave, chng ta ph2i gn .Sa chU cho chip, viBc vi>t .Sa chU th<Qng .<Xc th`c hiBn bZng lBnh TWAR = (Device_address<<1)+TWGCE. Trong . TWGCE (TWI General Call Enable) l bit cho php cu*c g-i chung. Nh< ti ./ cAp bn trn, Slave co quy/n cho php Master th`c hiBn cu*c g-i chung v?i n hay khng. N>u TWGCE=1, Slave sc .p Gng l:i cu*c g-i chung n>u c, n>u TWGCE=0 th Slave sc b_ qua cu*c g-i chung. 2. Ho3t =Dng c?a TWI: TWI trn AVR .<Xc g-i l byte-oriented (t:m dSch l h<?ng byte) v interrupt-based (d`a trn ngMt). B5t kN m*t s` kiBn no trong qu trnh truy/n/nhAn TWI c7ng c th1 gy ra 1 ngMt TWI. TWI trn AVR v th> ho:t .*ng t<@ng .Ri .*c lAp v?i chip. Tuy nhin, cLn khai thc ngMt trn AVR m*t cch h@p l. V dH, .Ri v?i Master, chng ta khng cLn sC dHng ngMt v chip ny hon ton ch^ .*ng trong viBc truy/n v nhAn. Ring v?i Slave, sC dHng ngMt .1 trnh b_ ll cc cu*c g-i l cLn thi>t. T5t c2 cc AVR trn m:ng TWI ./u c th1 l Master hay Slave, c2 Master v Slave ./u c th1 truy/n v nhAn d[ liBu. V th>, c t5t c2 4 mode trong ho:t .*ng c^a TWI trn AVR. Chng ta sc lLn l<Xt kh2o st cc mode ny nh< sau: Master Transmitter (chip ch^ truy/n), Master Receiver (Chip ch^ nhAn), Slave Reicever (chip t? nhAn) v Slave Transmitter (Chip t? truy/n). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 120 Tr<?c khi kh2o st cc ch> .* ho:t .*ng c^a TWI chng ta qui <?c m*t sR k hiBu th<Qng dng (.y c7ng l cc k hiBu dng trong datasheet c^a cc chip AVR). S: START condition .i/u kiBn bMt .Lu Rs: REPEAT START bMt .Lu lDp l:i R: READ Bit, bit ny bZng 1 .<Xc gWi km v?i gi .Sa chU W: WRITE Bit, bit ny mang gi trS 0, gWi km gi .Sa chU ACK: Ackowledge, bit xc nhAn, chn SDA .<Xc ko xuRng 0 W xung thG 9 NACK: Not Acknowledge, khng xc nhAn, SDA W mGc cao W bit thG 9 Data: 8 bits d[ liBu P: STOP condition .i/u kiBn k>t thc. SLA: Slave address, .Sa chU c^a Slave cLn giao ti>p. A. Master Transmitter mode Master truyTn dP li0u: Trong ch> .* ny, Master truy/n 1 hoDc m*t sR byte d[ liBu .>n m*t hoDc cc Slave. b1 bMt .Lu, Master t:o ra m*t START condition trn .<Qng SDA, n>u .<Qng truy/n .ang r2nh, Master sc ti>p tHc pht .i .Sa chU c^a Slave cLn giao ti>p cng v?i bit W (ghi) theo .Snh d:ng nh< sau: SLA+W. N>u Slave .p l:i bZng m*t ACK trong xung gi[ nhSp thG 9, Master sc ti>p tHc gWi 1 hoDc lin ti>p cc byte d[ liBu trn SDA. CG sau mYi byte d[ liBu, Master sc ki1m tra ACK t; Slave. N>u Slave gWi m*t NACK hoDc Master khng muRn gWi thm d[ liBu .>n Slave n sc pht .i m*t STOP condition hoDc m*t REPEAT START (Rs). N>u STOP .<Xc pht, cu*c g-i k>t thc, n>u Rs .<Xc pht, m*t cu*c g-i m?i bMt .Lu, sau Rs l .Sa chU c^a Slave m?ib l v/ mDt l thuy>t, trn th`c t> lm sao .1 ki1m tra mt START condition c .<Xc gWi ch<a? lm sao bi>t c nhAn .<Xc ACK sau khi pht .Sa chU hoDc d[ liBu? T5t c2 .<Xc TWI m ha thnh cc code chGa trong thanh ghi TWSR (chU 5 bit cao). Chng ta chU thanh ghi ny v .Ri chi>u v?i b2ng code quy .Snh sdn .1 bi>t tr:ng thi .<Qng truy/n v .<a ra quy>t .Snh ti>p theo. Hnh 2 m t2 m*t qu trnh Master truy/n d[ liBu, cc kh2 nKng c th1 x2y ra v gi trS t<@ng Gng c^a thanh ghi TWSR. ngh\a cc code trong thanh ghi TWSR trong lc Master truy/n d[ liBu c th1 tham kh2o thm datasheet c^a chip. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 121 Hnh 2. Master truy/n d[ liBu. T; hnh 2, chng ta nhAn th5y khi Master truy/n d[ liBu, dy code 0x08 -> 0x18 -> 0x28 -> -> 0x28 (-> 0x30) l dy code thnh cng nh5t. Code 0x08 bo rZng START codition .<Xc truy/n thnh cng, code 0x18 bo .Sa chU truy/n thnh cng v . c Slave xc nhAn bZng ACK, code 0x28 tGc d[ liBu .<Xc Master truy/n thnh cng v Slave . nhAn .<Xc, bo ACK l:i cho Master, code 0x30 tGc d[ liBu . .<Xc truy/n nh<ng Slave khng xc nhAn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 122 l:i, lc ny Master c th1 pht .i m*t STOP codition sau code 0x30. Ngoi ra cn m*t sR code khc t<@ng Gng v?i cc tr<Qng hXp khc nh< gWi .Sa chU th5t b:i (code 0x20), Master bS lost (code 0x38)bRi v?i mYi lo:i Gng dHng, cch hnh xC sc khc nhau .Ri v?i cc tr<Qng hXp th5t b:i ny. Trong bi ny, ti sc b_ qua t5t c2 cc tr<Qng hXp th5t b:i, n>u m*t trong cc code th5t b:i x2y ra chng ta sc thot kh_i cu*c g-i v .<a .<Qng truy/n v/ tr:ng thi nghU. B. Master Receiver mode Master nh]n dP li0u: Trong ch> .* ny, Master nhAn m*t hoDc m*t sR byte d[ liBu t; m*t Slave. b1 bMt .Lu, Master t:o ra m*t START condition trn .<Qng SDA, n>u .<Qng truy/n .ang r2nh, Master sc ti>p tHc pht .i .Sa chU c^a Slave cLn giao ti>p cng v?i bit R (.-c) theo .Snh d:ng nh< sau: SLA+R. N>u Slave .p l:i bZng m*t ACK trong xung gi[ nhSp thG 9, Master sc bMt .Lu sample d[ liBu trn SDA. CG sau mYi byte d[ liBu, n>u Master muRn nhAn ti>p byte khc n ph2i pht ra 1 ACK W xung thG 9 bo cho Slave. Khi Master muRn k>t thc qu trnh nhAn n sc pht m*t NOT ACK sau khi nhAn d[ liBu, li/n sau . Master pht STOP .1 k>t thc cu*c g-i hoDc pht .i m*t REPEAT START n>u n muRn ti>p tHc g-i cc Slaves khc. Hnh 3 m t2 m*t qu trnh Master nhAn d[ liBu, cc kh2 nKng c th1 x2y ra v gi trS code t<@ng Gng c^a thanh ghi TWSR. ngh\a cc code trong thanh ghi TWSR trong lc Master truy/n d[ liBu c th1 tham kh2o thm datasheet c^a chip. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 123
Hnh 3. Master nhAn d[ liBu. T; hnh 3, trong qu trnh Master nhAn d[ liBu, dy code 0x08 -> 0x40 -> 0x50 -> -> 0x58 l dy code thnh cng nh5t. Code 0x08 bo rZng START codition .<Xc truy/n thnh cng, code 0x40 bo .Sa chU + R . .<Xc truy/n thnh cng v . c Slave xc nhAn bZng ACK, code 0x50 bo d[ liBu .<Xc Master nhAn thnh cng v Master c7ng . pht m*t ACK bit sau khi nhAn, code 0x58 x2y ra khi Master nhAn d[ liBu thnh cng nh<ng n khng pht ACK m pht NOT ACK, bo cho Slave rZng Master khng muRn nhAn thm d[ liBu, ti>p theo Master sc pht m*t STOP condition hoDc m*t REPEAT START. Cc tr<Qng hXp khc chng ta khng kh2o st. C. Slave Receiver mode Slave nh]n dP li0u: Hnh 4 m t2 m*t qu trnh Slave nhAn d[ liBu, cc kh2 nKng c th1 x2y ra v gi trS code t<@ng Gng c^a thanh ghi TWSR. Ch> .* Slave nhAn d[ liBu SU T!M V BIN SO#N B%I NTINSIDE Ntinside 124 x2y ra khi Master th`c hiBn m*t cu*c g-i pht d[ liBu (SLA+W). Nh< quan st trong hnh 4, Slave chU nhAn ra cu*c g-i ny khi .Sa chU c^a n trng v?i .Sa chU c^a Master (Own address mode) hoDc khi Master th`c hiBn m*t cu*c g-i chung. Khi ., bit TWINT c^a Slave sc .<Xc set ln 1. N>u Slave cho php ngMt TWI (bit TWIE trong thanh ghi TWCR .<Xc set t; lc .Lu) th m*t ngMt x2y ra bo c m*t s` kiBn TWI. N>u code trong thanh ghi TWSR l 0x60 th m*t cu*c g-i .Sa chU ring .<Xc yu cLu v Slave c7ng . .p Gng l:i Master bZng m*t ACK, Slave sau . bMt .Lu nhAn d[ liBu t; .<Qng SDA. CG sau m*t byte d[ liBu Slave ph2i xc nhAn m*t ACK n>u n cn muRn ti>p tHc nhAn. N>u v m*t l do no . m Slave khng th1 ti>p tHc nhAn n c th1 pht m*t NOT ACK sau m*t byte d[ liBu. Cu*c g-i k>t thc khi Slave nhAn .<Xc STOP condition, t<@ng Gng code 0xA0. Cu*c g-i chung c7ng diIn ra hon ton t<@ng t` cu*c g-i .Sa chU ring nh<ng code c gi trS khc. Khi vi>t ch<@ng trnh cho Slave trong ch> .* nhAn d[ liBu, chng ta cLn xt c2 2 tr<Qng hXp cu*c g-i .Sa chU ring v cu*c g-i chung.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 125 Hnh 4. Slave nhAn d[ liBu. D. Slave Transmitter mode Slave truyTn dP li0u: by l ch> .* cuRi cng trong 4 ch> .* c^a AVR TWI. Hnh 5 m t2 m*t qu trnh Slave truy/n d[ liBu, cc kh2 nKng c th1 x2y ra v gi trS code t<@ng Gng c^a thanh ghi TWSR. Ch> .* Slave pht d[ liBu x2y ra khi Master muRn nhAn d[ liBu t; Slave, Master th`c hiBn m*t cu*c g-i nhAn d[ liBu (SLA+R). Nh< quan st trong hnh 5, Slave chU nhAn ra cu*c g-i ny khi .Sa chU c^a n trng v?i .Sa chU c^a Master (Own address mode). Khi ., bit TWINT c^a Slave sc .<Xc set ln 1. N>u Slave .p l:i bZng m*t ACK W xung nhSp thG 9, code trong thanh ghi TWSR sc l 0xA8, Slave sau . bMt .Lu pht d[ liBu ln .<Qng SDA. CG sau mYi byte d[ liBu, Master sc xc nhAn m*t ACK n>u n cn muRn ti>p tHc nhAn, code 0xB8 sc xu5t hiBn trong tr<Qng hXp ny. N>u Master khng muRn ti>p tHc nhAn d[ liBu t; Slave, m*t NOT ACK sc .<Xc pht v code 0xC0 xu5t hiBn, Slave k>t thc qu trnh pht d[ liBu. M*t tr<Qng hXp .Dc biBt khi bit TWEA (bit ACK) trong thanh ghi TWCR c^a Slave .<Xc reset v/ 0 tr<?c khi Slave truy/n d[ liBu, tr<Qng hXp Slave muRn bo rZng n . h>t d[ liBu .1 truy/n, byte ti>p theo c7ng l byte cuRi cng. Sau khi Master nhAn byte ny, n c th1 xc nhAn 1 ACK cho Slave (v thAt ra Master khng h/ bi>t Slave .ang truy/n byte cuRi), code trn Slave trong tr<Qng hXp ny l 0xC8 v Slave sc t` h>t thc qu trnh truy/n m khng cLn chQ Master. Khi lAp trnh cho Slave trong ch> .* pht, cLn ph2i c s` th_a hiBp v?i Master tr<?c .1 trnh code 0xC8 v code ny khng c nhi/u ngh\a. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 126
Hnh 5. Slave truy/n d[ liBu. Kg thuAt chnh dng cho Master khi truy/n hay nhAn cu*c g-i l h_i vng v chQ (polling and waiting). (ng v?i mYi code nhAn v/ t; thanh ghi TWSR (hay Gng v?i mYi tr:ng thi c^a cu*c g-i) m Master set cc bit t<@ng Gng trong thanh ghi .i/u khi1n TWCR v sau . chQ bit TWINT .<Xc set (qu trnh k>t thc) .1 ti>p tHc .-c v xt code TWSR. Qu trnh chQ v xt ny lDp l:i cho .>n khi Master k>t thc cu*c g-i bZng STOP condition. Tuy nhin Slave th khc, Slave khng ch^ .*ng th`c hiBn cu*c g-i m n ph2i chQ yu cLu t; Master .1 phHc vH. V th>, n>u dng h_i vng cho Slave th sc tRn thQi gian chQ v ch v .i khi cn b_ ll cc cu*c g-i. bRi v?i Slave, ngMt l ph<@ng php bMt cu*c g-i tRi <u nh5t. Trong bi h-c ny, viBc truy/n v nhAn c^a Slave sc .<Xc th`c hiBn trong cc trnh phHc vH ngMt TWI. IV. (iTu khiGn AVR TWI. PhLn ny ti h<?ng dan lAp trnh .i/u khi1n module TWI AVR bZng WinAVR. Cc hnh 2, 3, 4 v 5 cLn .<Xc tham kh2o km kg v code trong phLn ny .<Xc pht tri1n t; cc hnh ny. b1 .@n gi2n, chng ta sc vi>t cc hm giao ti>p TWI trong 1 file ring g-i l myTWI.h, .y c th1 coi l th< viBn cho TWI dng trong trang web ny. Nh< . trnh by, chu]n I2C th duy nh5t nh<ng cch sMp x>p d[ liBu c^a cc chip I2C th r5t .a d:ng. V th>, khi muRn giao ti>p v?i m*t chip I2C no b:n nh5t thi>t ph2i .-c datasheet c^a chip . .1 hi1u .Snh d:ng d[ liBu. Cc hm trong th< viBn myTWI chU SU T!M V BIN SO#N B%I NTINSIDE Ntinside 127 phHc vH giao ti>p gi[a cc AVR v?i nhau, n>u muRn sC dHng chng giao chip v?i m*t chip EEPROM 24C1004 chFng h:n, b:n ph2i vi>t thm cc hm mW r*ng khc d`a trn cc hm ny. N*i dung file myTWI.h .<Xc chia thnh 3 phLn, phLn .Lu l cc .Snh ngh\a bi>n, tham sR chung, phLn 2 gPm cc hm truy/n/nhAn cho Master v phLn 3 l trnh phHc vH ngMt TWI cho Slave. List 1 trnh by cc .Snh ngh\a chung trong file myTWI.h. List 1. bSnh ngh\a chung. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 128 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 129 PhLn ny ch^ y>u .Snh ngh\a cc code tr:ng thi trong qu trnh thao tc TWI trn AVR m chng ta . bi>t khi kh2o st cc ch> .* ho:t .*ng c^a TWI. ThAt ra b:n c th1 tham kh2o cc hnh 2-5 v cc b2ng code trong datasheet c^a AVR v sC dHng cc code tr:ng thi tr`c ti>p trong lc lAp trnh, ti .Snh ngh\a nh< trn chU .1 tiBn theo di trong lc lAp trnh. Cc dng t; 12 .>n 25 .Snh ngh\a cc code tr:ng thi cho Slave (c2 truy/n v nhAn). Chng ta c7ng .Snh ngh\a m*t sR bi>n ton cHc dng cho Slave, bi>n SLAVE_wData[100] l m*t m2ng 100 phLn tC dng chGa d[ liBu m Slave sc truy/n, bi>n Tran_Num l chU sR c^a phLn tC trong m2ng SLAVE_wData sc .<Xc truy/n .i. Bi>n SLAVE_buff[100] l d[ liBu nhAn v/ t; TWI v Rec_Num l chU sR c^a d[ liBu sau cng do TWI nhAn v/ (d[ liBu SLAVE_buff[Rec_Num]). Bi>n Device_Addr chGa .Sa chU m khi l Slave c^a chnh AVR chng ta .ang lAp trnh. T<@ng t`, cc dng t; 47 .>n 57 .Snh ngh\a code tr:ng thi cho Master mode. Tr<?c ., chng ta c7ng .Snh ngh\a cc gi trS tRc .* pht xung gi[ nhSp sc gn cho thanh ghi TWBR (dng 37, 38). Hai bi>n TWI_R v TWI_W .:i diBn cho 2 bit R/W .<Xc truy/n trong gi .Sa chU (bo cho Slave bi>t Master muRn truy/n hay nhAn d[ liBu). M*t sR macro trong cc dng 42 .>n 45 bao gPm START, STOP condition v xa bit TWINT bZng cch gn cc gi trS t<@ng Gng cho thanh ghi .i/u khi1n TWI. CuRi cng l ch<@ng trnh con void TWI_Init(void) khWi .*ng TWI. Qu trnh khWi .*ng bao gPm set tRc .* xung gi[ nhSp cho Master (dng 61, 62), gn .Sa chU device (dng 63) v xc lAp TWI sdn sng W ch> .* Slave. Xem l:i thanh ghi TWAR, do 7 bit .Sa chU nZm W vS tr cao nn chng ta cLn ph2i dSch tri .Sa chU 1 vS tr tr<?c khi gn cho TWAR (Device_Addr <<1), .Png thQi set bit 0 trong TWAR .1 cho php nhAn cu*c g-i chung khi .<Xc yu cLu. Dng 64 khWi .*ng TWI v?i bit ACK sdn sng v cho php x2y ra ngMt TWI. Nh< th>, sau khi khWi .*ng TWI sdn sng W ch> .* Slave. List 2. Code cho Master. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 130 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 131 Hm TWI_Master_Send_array(uint8_t Addr, uint8_t Data[], uint8_t len) th`c hiBn truy/n 1 dy cc byte d[ liBu trong mode Master. Tham sR Addr l .Sa chU c^a Slave cLn giao ti>p, Data[] l m2ng d[ liBu v len l chi/u di (sR byte) c^a d[ liBu cLn truy/n. ViBc .Lu tin khi chng ta vo Master mode l tMt ngMt TWI bZng cch xa bit TWIE (dng 3). Trnh t` Master truy/n d[ liBu hon ton t<@ng t` trnh t` trong hnh 2. Dng 5, TWCR=TWI_START, Master bMt .Lu pht 1 START condition. N>u xem l:i .Snh ngh\a c^a macro TWI_START trong list 1 b:n sc th5y dng TWCR=TWI_START t<@ng .<@ng TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) tGc chng ta th`c hiBn xa bit TWINT (bit ny ph2i lun .<Xc xa tr<?c khi muRn th`c hiBn vic g) bZng cch ghi 1 vo TWINT, set bit START (bit TWSTA) v cho php TWI ho:t .*ng bZng bit TWEN. Dng code 6 chQ cho .>n khi bit TWINT .<Xc phLn cGng set ln 1 (k>t thc), sau . chng ta ki1m tra code trong thanh ghi tr:ng thi TWSR. Ch l chU c 5 bit cao trong thanh ghi TWSR chGa tr:ng thi nn chng ta cLn dng gi2i thuAt mDt n: che cc bit th5p l:i, TWSR & 0xF8 chnh l cch .1 che 3 bit th5p c^a TWSR. So snh code .-c .<Xc v?i code t<@ng Gng trong hnh 1, trong tr<Qng hXp ny chng ta so snh v?i _START_Sent, chnh l so snh v?i 0x80 (xem l:i .Snh ngh\a c^a _START_Sent trong list 1). N>u cc code khng trng nhau, m*t lYi truy/n x2y ra v chng ta sc thot kh_i ch<@ng trnh truy/n, gi trS tr2 v/ chnh l code c lYi (xem dng code 7). Cc dng code t; 10 .>n 13 th`c hiBn truy/n .Sa chU + W, ch trong lc pht, d[ liBu cLn pht ph2i .<Xc ghi sdn vao thanh ghi d[ liBu TWDR tr<?c khi xa bit TWINT (dng 10 v 11). Sau khi truy/n .Sa chU chng ta truy/n m2ng d[ liBu lin ti>p v cuRi cng l pht STOP condition, TWCR=TWI_STOP t<@ng .<@ng TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN). CLn khWi .*ng l:i TWI .1 .<a n v/ ch> .* Slave tr<?c khi thot kh_i ch<@ng trnh con truy/n d[ liBu c^a ch> .* Master (dng 24). Hm TWI_Master_Read_array(uint8_t Addr, uint8_t Data[], uint8_t len) th`c hiBn nhAn d[ liBu v/ Master. Cch gi2i thch cho hm ny khng khc nhi/u so v?i hm .-c d[ liBu nn b:n .-c t` tm hi1u. M*t .i1m cLn ch l khi nhAn 1 dy byte chng ta nn .-c n-1 byte .Lu bnh th<Qng, c tr2 ACK cho Slave v byte cuRi cng sc .<Xc nhAn ring, tr2 NOT ACK .1 bo cho Slave rZng Master khng muRn nhAn thm(.o:n code t; dng 55 .>n 59 dng .-c byte cuRi cng). List 3. Code cho Slave. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 132 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 133 Nh< ti . trnh by, ton b* qu trnh truy/n v nhAn c^a Slave .<Xc th<c hiBn trong ch<@ng trnh phHc vH ngMt TWI. Khi ngMt TWI x2y ra, trnh phHc vH ngMt sc .-c v ki1m tra code trong thanh ghi TWSR .1 th`c hiBn cc cng viBc ph hXp. B:n .-c l:i tham kh2o thm hnh 4 v hnh 5 cng v?i cc code trong nh[ng case t<@ng Gng c^a List 3 .1 hi1u .o:n ch<@ng trnh ny. bi1m l<u l?n nh5t m ti muRn ni l cc bi>n .<Xc dng cho ch> .* Slave truy/n v nhAn. Ti dng 2 m2ng SLAVE_wData v SLAVE_buff .1 chGa bi>n truy/n v nhn. Hai bi>n Tran_Num v Rec_Num l chU sR c^a byte hiBn hnh. V th> SLAVE_wData[Tran_Num] chnh l byte ti>p theo sc .<Xc truy/n .i n>u Slave .<Xc yu cLu truy/n, v SLAVE_buff[Rec_Num] l byte cuRi cng m Slave nhAn v/ trong ch> .* Slave nhAn d[ liBu. Hy khi thc cc bi>n ny trong cc ch<@ng trnh Gng dHng. b1 minh h-a cho cc sC dHng cc hm trong th< viBn myTWI, ti th`c hiBn m*t m:ch .iBn m ph_ng m:ng TWI gPm 3 chip ATmega32. Chip thG nh5t l Master, 2 chip cn l:i l Slaves. Ti t:o 2 Project, m*t cho Master v m*t cho 2 Slaves dng chung. PORTD .<Xc set input c .iBn trW ko ln. Ti dng 2 chn PD6 v PD7 .1 ch-n .Sa chU cho 2 Slaves, Slave thG nh5t ti nRi chn PD6 xuRng GND, do . chip ny c .Sa chU Device_Addr l PD7:PD6=10=2 (thAp phn). Slave cn l:i ti .1 2 chn PD6 v PD7 trRng nn .Sa chU c^a n l PD7:PD6=11=3. Trong ch<@ng trnh c^a Slave c phLn .-c 2 chn PD6:PD7 v gn cho bi>n Device_Addr m chng ta . khai bo trong List 1, nh< vAy c th1 dng cc ny .1 set .Sa chU cho Slaves m chng ta g-i l set .Sa chU cGng. Trn chip Master, m*t swich .<Xc nRi v?i chn PD0 .1 ch-n Slave cLn giao ti>p, n>u switch .ng th SLAVE c .Sa chU 2 .<Xc ch-n, n>u switch mW th SLAVE c .Sa chU 3 .<Xc ch-n .1 giao ti>p. M*t nt nh5n .<Xc nRi v?i ngMt INT0 c^a chip Master, khi nh5n nt ny ch<@ng trnh cn .-c d[ liBu t; Slave .<Xc g-i, ty theo switch .ng hay mW m Slave t<@ng Gng .<Xc g-i .1 gWi d[ liBu cho Master. D[ liBu nhAn v/ sc hi1n thS trn 1 Character LCD. Hnh 6 l s@ .P m:ch .iBn m ph_ng bZng phLn m/m Proteus v List 4, List 5 lLn l<Xt trnh by .o:n code cho ch<@ng trnh chnh c^a Master v Slave. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 134
Hnh 6. Demo TWI. List 4. Ch<@ng trnh chnh cho Master. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 135
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 136 V dH c^a Master minh h-a cch dng 2 hm Master truy/n v nhAn m2ng d[ liBu. % dng 27 ti dng hm TWI_Master_Send_array .1 gWi 40 phLn tC c^a m2ng Data .>n Slave c .Sa chU 2, TWI_Master_Send_array(2,Data,40). T<@ng t`, dng 31 gWi 50 phLn tC c^a m2ng Data .>n Slave c .Sa chU 3. Khi button trn m:ch m ph_ng .<Xc nh5n, ngMt INT0 x2y ra, trong trnh phHc vH ngMt INT0 chng ta dng hm TWI_Master_Read_array .1 .-c d[ liBu t; m*t trong 2 Slaves, xem dng code 43: TWI_Master_Read_array(Slave_Addr,rData,1). bSa chU c^a Slave cLn .-c sc do switch nRi v?i chn PD0 quy>t .Snh (xem dng 42). bSa chU c^a Slave .ang giao ti>p sc hi1n thS trn dng 1 c^a LCD, d[ liBu .<Xc hi1n thS trn dng 2. List 5. Ch<@ng trnh chnh cho Slaves. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 137
Ch<@ng trnh demo c^a Slaves minh h-a cc ch> .* Slave truy/n v nhAn d[ liBu. Tuy nhin do cc qu trnh truy/n v nhAn d[ liBu c^a Slave .<Xc th`c hiBn trong trnh phHc vH ngMt TWI .<Xc vi>t sdn trong file myTWI.h. trong ch<@ng trnh chnh c^a Slave chng ta khng cLn ph2i g-i b5t kN hm no trong myTWI. Cng viBc cLn lm trong ch<@ng trnh demo cho Slave l khWi .*ng TWI sau . gn gi trS cho cc bi>n ton cHc c^a Slave (dng 21 gn gi trS cho m2ng SLAVE_wData). Ti c .nh km v dH demo cho TWI, ti th`c hiBn 2 Projetc trong 2 th< mHc: TWI1 cho AMster v TWI2 cho Slave. b1 ch:y demo, ch:y file TWI bZng Proteus, dng switch SW1 .1 ch-n Slave cLn giao ti>p, nh5n button .1 nhAn d[ liBu t; Slave. Thay .ei vS tr switch v ki1m tra k>t qu2. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 138 KeyPad
I. Keypad 4x4. Keypad l m*t "thi>t bS nhAp" chGa cc nt nh5n cho php ng<Qi dng nhAp cc ch[ sR, ch[ ci hoDc k hiBu vo b* .i/u khi1n. Keypad khng chGa t5t c2 b2ng m ASCII nh< keyboard v v th> keypad th<Qng .<Xc tm th5y trong cc thi>t bS chuyn dHng. Cc nt nh5n trn cc my tnh .iBn tC cLm tay l m*t v dH v/ keypad. SR l<Xng nt nh5n c^a m*t keypad thay .ei phH thu*c vo yu cLu Gng dHng. Trong bi ny ti gi?i thiBu cch .i/u khi1n c^a m*t lo:i keypad .@n gi2n, keypad 4x4. G-i l keypad 4x4 v keypad ny c 16 nt nh5n .<Xc bR tr d:ng ma trAn 4 hng v 4 c*t. Cch bR tr ma trAn hng v c*t l cch chung m cc keypad sC dHng. C7ng giRng nh< cc ma trAn LED, cc nt nh5n cng hng v cng c*t .<Xc nRi v?i nhau, v th> v?i keypad 4x4 sc c teng c*ng 8 ng ra (4 hng v 4 c*t). M hnh Keypad 4x4 .<Xc th1 hiBn trong hnh 1.
a) b) Hnh 1. Keypad 4x4. Hnh 1b l m hnh thAt c^a 1 keypad 4x4 v hnh 1a l c5u hnh bn trong c^a n. BRn hng c^a keypad .<Xc .nh d5u l A, B, C v D trong khi 4 c*t .<Xc g-i l 1, 2, 3 v 4. Ho3t =Dng c?a keypad: Gi2 sC nht '2' .<Xc nh5n, khi . .<Qng C v 2 .<Xc nRi v?i nhau. Gi2 sC .<Qng 2 .<Xc nRi v?i GND (mass, 0V) th C c7ng sc l GND. Tuy nhin, cu h_i .Dt ra l bZng cch ki1m tra tr:ng thi .<Qng C chng ta sc c k>t luAn nt '2' .<Xc nh5n? Gi2 sC t5t c2 cc .<Qng 1, 2, 3, 4 ./u n?i v?i GND, n>u C= SU T!M V BIN SO#N B%I NTINSIDE Ntinside 139 GND th r rng chng ta khng th1 k>t luAn nt '1',= hay nt '2' hay nt '3' hay nt '-' .<Xc nh5n. Kg thuAt .1 khMc phHc v5n ./ ny chnh l kg thuAt "qut" keypad. Kg thuAt qut keypad bZng AVR .<Xc trnh by nh< sau: - NRi t5t c2 8 chn c^a keypad v?i 1 PORT c^a AVR, v dH PORTB theo thG t` bn d<?i:
- Cc chn 1, 2, 3, 4 .<Xc set nh< cc chn Output v gi[ W mGc cao, cc chn A, B, C, D l Input v c .iBn trW ko ln.L>n l9Wt ko chn 1, 2, 3, 4 xuRng th5p (lLn l<Xt xu5t gi trS 0 ra t;ng chn), .-c tr:ng thi cc chn A, B, C, D .1 k>t luAn nt no .<Xc nh5n. V dH nh< trong hnh 1, nt '2' .<Xc nh5n th qu trnh qut sc cho k>t qu2 nh< sau: B<?c 1: ko chn 1 xuRng 0 (cc chn 2,3,4 van W mGc cao), ki1m tra 4 chn A, B, C, D thu .<Xc k>t qu2 D=1, C=1, B=1, A=1. (gi trS .-c v/ c^a PINB l 00001111 nhS phn) B<?c 2: ko chn 2 xuRng 0, ki1m tra l:i A, B, C, D, k>t qu2 thu .<Xc D=1, C=0, B=1, A=1 (gi trS .-c v/ c^a PINB l 0b00001011 nhS phn). Chn C=0 tGc c 1 nt W hng thG 3 .<Xc nh5n, chng ta l:i .ang W B9-c thO 2 tGc nt nh5n thu*c c*t thG 2. Chng ta c th1 d;ng qu trnh qut t:i .y v k>t qu2 thu v/ nt W hng 3, c*t 2 (tGc nut '2' .<Xc) .<Xc nh5n. Qu trnh qut cho cc nt khc c7ng x2y ra t<@ng t`. Ch , n>u c 1 nt no . .<Xc nh5n th c 4 kh2 nKng c th1 .-c v/ t; 4 A,B,C,D . l: D=1, C=1, B=1, A=0: nt W hng A .<Xc nh5n, gi trS .-c v/ l 0x0E (cc .<Qng A,B,C,D .<Xc nRi v?i 4 bit th5p c^a PORT trn AVR). D=1, C=1, B=0, A=1: nt W hng B .<Xc nh5n, gi trS .-c v/ l 0x0D . D=1, C=0, B=1, A=1: nt W hng C .<Xc nh5n, gi trS .-c v/ l 0x0B . D=0, C=1, B=1, A=1: nt W hng D .<Xc nh5n, gi trS .-c v/ l 0x07 . b1 tiBn lXi khi so snh k>t qu2 .-c v/, khi lAp trnh .-c keypad chng ta nn lAp 1 m2ng 4 phLn tC chGa 4 sR c th1 .-c v/ t; keypad. V dH uint8_t scan_code[4]={0x0E,0x0D,0x0B,0x07}; Trong phLn ti>p theo chng ta sc kh2o st cch .-c keypad 4x4 bZng 1 chip AVR Atmega32. II. (Rc Keypad 4x4 bMng AVR. Chng ta sc m ph_ng cch .-c v hi1n thS gi trS t; keypad 4x4 bZng phLn mm Proteus. Cc m .-c .<Xc t; keypad sc hiIn thS ln 1 Text LCD 16x2. Th< viBn myLCD.h .<Xc dng .1 hi1n thS ln LCD (xem l:i bi Text LCD). M:ch .iBn m ph_ng th1 hiBn trong hnh 2. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 140 Hnh 2. b-c v hi1n thS t; Keypad 4x4. Hy t:o 1 Project bZng WinAVR v?i tn g-i KEYPAD, t:o file main.c v add vo Project, t:o Makefile, .Png thQi copy file myLCD.h t; bi h-c Text LCD vo th< mHc chGa Project KEYPAD. MW file myLCD.h v sCa phLn khai bo PORT nh< List0. List 0. Khai bo PORT trong file myLCD.h 01 02 03 04 05 .... #define CTRL PORTC #define DDR_CTRL DDRC #define DATA_O PORTC SU T!M V BIN SO#N B%I NTINSIDE Ntinside 141 06 07 08 #define DATA_I PINC #define DDR_DATA DDRC .... Vi>t .o:n code trong List1 vo file main.c List 1. N*i dung file main.c SU T!M V BIN SO#N B%I NTINSIDE Ntinside 142
% dng 3 chng ta include file myLCD.h .1 sC dHng cc hm thao tc Text LCD. Trong cc dng 5, 6 v 7 chng ta .Snh ngh\a PORT giao ti>p v?i Keypad, theo . PORTB .<Xc dng cho Keypad. Dng 9 khai bo m*t m2ng 4 phLn tC chGa m .-c v/ t; Keypad nh< . th2o luAn trong phLn trn. Cc dng code t; 10 .>n 13 khai bo m*t m2ng 2 chi/u c 16 phLn tC chGa m ASCII c^a cc k t` .:i diBn cho cc Button, ti sMp x>p cc k t` d:ng ma trAn .1 dI dng t<@ng Gng v?i cc nt trn keypad. Dng 14 khai bo bi>n key lo:i 8 bit khng d5u, .y SU T!M V BIN SO#N B%I NTINSIDE Ntinside 143 l bi>n chGa m ascii khi .-c keypad. Dng 15 khai bo hm qut Keypad c tn checkpad(). T5t c2 gi2i thuAt qut v .-c keypad ./u nKm trong hm ny, gi trS tr2 v/ c^a hm l m ascii c^a nt .<Xc nh5n. Tr<?c khi kh2o st .o:n code trong ch<@ng trnh main, chng ta sc tm hi1u ch<@ng trnh con checkpad(). % dng 31 trong ch<@ng trnh con checkpad, chng ta khai bo 3 bi>n phH 8 bit khng d5u, i l bi>n .:i diBn cho c*t c^a keypad v j l hng, keyin l gi trS .-c v/ t; cc chn A, B, C, D. Vng lDp for 4 lLn trong dng 32 c^a bi>n i chnh l 4 b<?c qut m ti . trnh by trong v dH trn. % b<?c 1, bi>n i=0, n>u chng ta dSch tri sR 1 nh< (1<<(4+i)) th gi trS thu .<Xc l (1<<(4+i))=0b00010000, k>t hXp v?i dng code 33: KEYPAD_PORT=0xFF-(1<<(4+i)); chng ta thu .<Xc KEYPAD_PORT=0xEF. SR 4 trong php dSch xu5t hiBn v cc c*t c^a Keypad .<Xc nRi v?i 4 bit cao c^a PORT trn AVR. Tm l:i, sau b<?c .Lu tin c*t thG nh5t c^a Keypad .<Xc ko xuRng mGc 0, sdn sng cho qu trnh ki1m tra cc hng A,B,C,D trong cc dng ti>p theo. Dng 35 .-c gi trS t; Keypad v/ bi>n keyin, v chng ta k>t nRi cc chn A,B,C,D c^a Keypad v?i 4 bit th5p c^a PORT nn chng ta chU quan tm .>n gi trS c^a 4 bit th5p ny, viBc AND (&) gi trS .-c v/ v?i 0x0F cho php chng ta b_ qua 4 bit cao. Trong dng 36, chng ta ki1m tra xem n>u gi trS .-c v/ khc 0x0F th th`c hiBn cc dng ti>p theo. N>u keyin =0x0F ngh\a l khng c b5t kN nt no trn c*t 1 .<Xc nh5n, cc dng ti>p theo khng th`c hiBn, vng lDp for cho bi>n i .<Xc ti>p tHc gi trS ti>p theo. N>u bi>n keyin khc 0x0F th chng ta bi>t rZng c 1 nt no . trn c*t i .<Xc nh5n, cc dng ti>p theo sc xc .Snh chnh xc nt no .<Xc nh5n. Dng 37 cho bi>n hng j ch:y t; 0 .>n 4, dng 38 ki1m tra gi trS keyin, n>u keyin bZng phLn tC thG j trong m2ng scan_code m chng ta . .Snh ngh\a tr<?c . th nt trn hng j . .<Xc nh5n, tm l:i nt .<Xc nh5n l nt hng j v c*t i, chng ta tr2 v/ gi trS m ascii c^a nt ny bZng cch l5y gi trS t<@ng Gng c^a m2ng ascii_code .<Xc .Snh ngh\a tr<?c .: return ascii_code[j][i]. N>u qu trnh qut th5t b:i chng ta tr2 v/ gi trS 0. N*i dung c^a ch<@ng trnh chnh l khWi .*ng chip v th`c hiBn demo qu trnh .-c Keypad, Dng 19 chng ta khai bo sC dHng 4 bit th5p c^a KEYPAD_PORT lm input (cc chn A,B,C,D l input) v 4 bit cao lm output. Dng 18 khWi .*ng cc .iBn trW ko ln cho 4 bit th5p. Hai dng 21 v 22 khWi .*ng v xa Text LCD. Trong vng lDp v tAn while(1), chng ta qut keypad W dng 24 v hi1n thS ln LCD W dng 25 (chU hi1n thS n>u qu trnh qut thnh cng). Trong v dH ny ti chU trnh by gi2i thuAt qut Keypad c@ b2n, van cn m*t sR v5n ./ khc nh< ki1m tra s` kiBn nh5n (key down), th2 (key up)...b:n .-c hy t` gi2i tuy>t theo cch c^a ring mnh.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 144 Text LCD
I. B3n sE =i =Qn =u. Bi ny nZm trong phLn Gng dHng AVR thu*c lo:t bi cng h-c AVR. Trong bi Gng dHng ny chng ta khng kh2o st nhi/u c5u trc AVR m ch^ y>u l tm hi1u Text LCD cch .i/u khi1n bZng AVR. Cng cH chnh c7ng l 2 b* phLn m/m quen thu*c WinAVR v Proteus. Sau bi ny, ti hy v-ng b:n c th1 hi1u v th`c hiBn .<Xc: - C5u trc Text LCD. - Nguyn l ho:t .*ng Text LCD - Pht tri1n 1 th< viBn .i/u khi1n Text LCD bZng AVR c2 2 ch> .* 8 bit v 4 bit. - V dH .i/u khi1n Text LCD bZng AVR. II. Text LCD. Text LCD l cc lo:i mn hnh tinh th1 l_ng nh_ dng .1 hi1n thS cc dng ch[ hoDc sR trong b2ng m ASCII. Khng giRng cc lo:i LCD l?n, Text LCD .<Xc chia sdn thnh t;ng v Gng v?i mYi chU c th1 hi1n thS m*t k t` ASCII. C7ng v l do chU hiBn thS .<Xc k t` ASCII nn lo:i LCD ny .<Xc g-i l Text LCD (.1 phn biBt v?i Graphic LCD c th1 hi1n thS hnh 2nh). MYi c^a Text LCD bao gPm cc ch5m tinh th1 l_ng, viBc k>t hXp ]n v hiBn cc ch5m ny sc t:o thnh m*t k t` cLn hi1n thS. Trong cc Text LCD, cc mau k t` .<Xc .Snh ngh\a sdn v th> viBc .i/u khi1n Text LCD sc t<@ng .Ri dI dng h@n cc graphic LCD. Kch th<?c c^a Text LCD .<Xc .Snh ngh\a bZng sR k t` c th1 hi1n thS trn 1 dng v teng sR dng m LCD c. V dH LCD 16x2 l lo:i c 2 dng v mYi dng c th1 hi1n thS tRi .a 16 k t`. M*t sR kch th<?c Text LCD thng th<Qng gPm 16x1, 16x2, 16x4, 20x2, 20x4Hnh 1 l m*t v dH Text LCD 16x2. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 145
Hnh 1. Text LCD 16x2. Text LCD c 2 cch giao ti>p c@ b2n l nRi ti>p (nh< I2C) v song song. Trong ph:m vi bi h-c ny ti chU gi?i thiBu lo:i giao ti>p song song, cH th1 l LCD 16x2 .i/u khi1n bWi chip HD44780U c^a hng Hitachi. bRi v?i cc LCD khc b:n cLn tham kh2o datasheet ring c^a t;ng lo:i. Tuy nhin, HD44780U c7ng .<Xc coi l chu]n chung cho cc lo:i Text LCD, v th> b:n c th1 dng ch<@ng trnh v dH trong bi ny .1 test trn cc LCD khc v?i r5t t hoDc khng cLn chUnh sCa. HD44780U l b* .i/u khi1n cho cc Text LCD d:ng ma trAn .i1m (dot- matrix), chip ny c th1 .<Xc dng cho cc LCD c 1 hoDc 2 dng hi1n thS. HD44780U c 2 mode giao ti>p l 4 bit v 8 bit. N chGa sdn 208 k t` mau kch th<?c font 5x8 v 32 k t` mau font 5x10 (teng c*ng l 240 k t` mau khc nhau). 1. S. =V chn.
Cc Text LCD theo chu]n HD44780U th<Qng c 16 chn trong . 14 chn k>t nRi v?i b* .i/u khi1n v 2 chn nguPn cho .n LED n/n. ThG t` cc chn th<Qng .<Xc sMp x>p nh< sau: B2ng 1. S@ .P chn. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 146 Trong m*t sR LCD 2 chn LED n/n .<Xc .nh sR 15 v 16 nh<ng trong m*t sR tr<Qng hXp 2 chn ny .<Xc ghi l A (Anode) v K (Cathode). Hnh 2 m t2 cch k>t nRi LCD v?i nguPn v m:ch .i/u khi1n. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 147
Hnh 2. K>t nRi Text LCD. Chn 1 v chn 2 l cc chn nguPn, .<Xc nRi v?i GND v nguPn 5V. Chn 3 l chn chUnh .* t<@ng ph2n (contrast), chn ny cLn .<Xc nRi v?i 1 bi>n trW chia p nh< trong hnh 2.Trong khi ho:t .*ng, chUnh .1 thay .ei gi trS bi>n trW .1 .:t .<Xc .* t<@ng ph2n cLn thi>t, sau . gi[ mGc bi>n trW ny. Cc chn .i/u khi1n RS, R/W, EN v cc .<Qng d[ liBu .<Xc nRi tr`c ti>p v?i vi .i/u khi1n. Ty theo ch> .* ho:t .*ng 4 bit hay 8 bit m cc chn t; D0 .>n D3 c th1 b_ qua hoDc nRi v?i vi .i/u khi1n, chng ta sc kh2o st kg cng h@n trong cc phLn sau. 2. Thanh ghi v tK chOc bD nh-. HD44780U c 2 thanh ghi 8 bits l INSTRUCTION REGISTER (IR) v DATA REGISTER (DR). Thanh ghi IR chGa m lBnh .i/u khi1n LCD v l thanh ghi chU ghi (chU c th1 ghi vo thanh ghi ny m khng .-c .<Xc n). Thanh ghi DR chGa cc cc lo:i d[ liBu nh< k t` cLn hi1n thS hoDc d[ liBu .-c ra t; b* nh? LCDC2 2 thanh ghi ./u .<Xc nRi v?i cc .<Qng d[ liBu D0:7 c^a Text LCD v .<Xc l`a ch-n ty theo cc chn .i/u khi1n RS, RW. Th`c t> .1 .i/u khi1n Text LCD chng ta khng cLn quan tm .>n SU T!M V BIN SO#N B%I NTINSIDE Ntinside 148 cch thGc ho:t .*ng c^a 2 thanh ghi ny, v th> c7ng khng cLn kh2o st chi ti>t chng. HD44780U c 3 lo:i b* nh?, . l b* nh? RAM d[ liBu cLn hi1n thS DDRAM (Didplay Data RAM), b* nh? chGa ROM chGa b* font t:o ra k t` CGROM (Character Generator ROM) v b* nh? RAM chGa b* font t:o ra cc symbol ty ch-n CGRAM (Character Generator RAM). b1 .i/u khi1n hi1n thS Text LCD chng ta cLn hi1u te chGc v cch thGc ho:t .*ng c^a cc b* nh? ny: 2.1 DDRAM. DDRAM l b* nh? t:m chGa cc k t` cLn hi1n thS ln LCD, b* nh? ny gPm c 80 .<Xc chia thnh 2 hng, mYi c .* r*ng 8 bit v .<Xc .nh sR t; 0 .>n 39 cho dng 1; t; 64 .>n 103 cho dng 2. MYi nh? t<@ng Gng v?i 1 trn mn hnh LCD. Nh< chng ta bi>t LCD lo:i 16x2 c th1 hi1n thS tRi .a 32 k t` (c 32 hi1n thS), v th> c m*t sR nh? c^a DDRAM khng .<Xc sC dHng lm cc hi1n thS. b1 hi1u r h@n chng ta tham kh2o hnh 3 bn d<?i Hnh 3. Te chGc c^a DDRAM. ChU c 16 nh? c .Sa chU t; 0 .>n 15 v 16 .Sa chU t; 64 .>n 79 l .<Xc hi1n thS trn LCD. V th> muRn hi1n thS m*t k t` no . trn LCD chng ta cLn vi>t k t` . vo DDRAM W 1 trong 32 .Sa chU trn. Cc k t` nZm ngoi 32 nh? trn sc khng .<Xc hi1n thS, tuy nhin van khng bS m5t .i, chng c th1 .<Xc dng cho cc mHc .ch khc n>u cLn thi>t. 2.2 CGROM. CGROM l vng nh? cR .Snh chGa .Snh ngh\a font cho cc k t`. Chng ta khng tr`c ti>p truy xu5t vng nh? ny m chip HD44780U sc t` th`c hiBn khi c yu cLu .-c font .1 hiBn thS. M*t .i/u .ng l<u l .Sa chU font c^a mYi k t` vng nh? CGROM chnh l m ASCII c^a k t` .. V dH k t` a c m ASCII l 97, tham kh2o te chGc c^a vng nh? CGROM trong hnh 4 b:n sc nhAn th5y .Sa chU font c^a a c 4 bit th5p l 0001 v 4 bit cao l 0110, .Sa chU teng hXp l 01100001 = 97. CGROM v DDRAM .<Xc t` .*ng phRi hXp trong qu trnh hi1n thS c^a LCD. Gi2 sC chng ta muRn hi1n thS k t` a t:i vS tr .Lu tin, dng thG 2 c^a LCD th cc b<?c th`c hiBn sc nh< sau: tr<?c h>t chng ta bi>t rZng vS SU T!M V BIN SO#N B%I NTINSIDE Ntinside 149 tr .Lu tin c^a dng 2 c .Sa chU l 64 trong b* nh? DDRAM (xem hnh 3), v th> chng ta sc ghi vo nh? c .Sa chU 64 m*t gi trS l 97 (m ASCII c^a k t` a). Ti>p theo, chip HD44780U .-c gi trS 97 ny v coi nh< l .Sa chU c^a vng nh? CGROM, n sc tm .>n vng nh? CGROM c .Sa chU 97 v .-c b2ng font . .<Xc .Snh ngh\a sdn W .y, sau . xu5t b2n font ny ra cc ch5m trn mn hnh LCD t:i vS tr .Lu tin c^a dng 2 trn LCD. by chnh l cch m 2 b* nh? DDRAM v CGROM phRi hXp v?i nhau .1 hi1n thS cc k t`. Nh< m t2, cng viBc c^a ng<Qi lAp trnh .i/u khi1n LCD t<@ng .Ri .@n gi2n, . l vi>t m ASCII vo b* nh? DDRAM t:i .ng vS tr .<Xc yu cLu, b<?c ti>p theo sc do HD44780U .2m nhiBm. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 150 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 151 Hnh 4. Vng nh? CGROM. 2.3 CGRAM. CGRAM l vng nh? chGa cc symbol do ng<Qi dng t` .Snh ngh\a, mYi symbol .<Xc c kch th<?c 5x8 v .<Xc dnh cho 8 nh? 8 bit. Cc symbol th<Qng .<Xc .Snh ngh\a tr<?c v .<Xc g-i hi1n thS khi cLn thi>t. Vng ny c t5t c2 64 nh? nn c tRi .a 8 symbol c th1 .<Xc .Snh ngh\a. Ti liBu ny khng ./ cAp .>n sC dHng b* nh? CGRAM nn ti sc khng .i chi ti>t phLn ny, b:n c th1 tham kh2o datasheet c^a HD44780U .1 bi>t thm. 3. (iTu khiGn hiGn th7 Text LCD. 3.1 Cc chn $i7u khi;n LCD. Cc chn .i/u khi1n viBc .-c v ghi LCD bao gPm RS, R/W v EN. RS (chn sR 3): Chn l`a ch-n thanh ghi (Select Register), chn ny cho php l`a ch-n 1 trong 2 thanh ghi IR hoDc DR .1 lm viBc. V c2 2 thanh ghi ny ./u .<Xc k>t nRi v?i cc chn Data c^a LCD nn cLn 1 bit .1 l`a ch-n gi[a chng. N>u RS=0, thanh ghi IR .<Xc ch-n v n>u RS=1 thanh ghi DR .<Xc ch-n. Chng ta ./u bi>t thanh ghi IR l thanh ghi chGa m lBnh cho LCD, v th> n>u muRn gWi 1 m lBnh .>n LCD th chn RS ph2i .<Xc reset v/ 0. Ng<Xc l:i, khi muRn ghi m ASCII c^a k t` cLn hi1n thS ln LCD th chng ta sc set RS=1 .1 ch-n thanh ghi DR. Ho:t .*ng c^a chn RS .<Xc m t2 trong hnh 5.
Hnh 5. Ho:t .*ng c^a chn RS. R/W (chn sR 4): Chn l`a ch-n gi[a viBc .-c v ghi. N>u R/W=0 th d[ liBu sc .<Xc ghi t; b* .i/u khi1n ngoi (vi .i/u khi1n AVR chFng h:n) vo LCD. N>u R/W=1 th d[ liBu sc .<Xc .-c t; LCD ra ngoi. Tuy nhin, chU c duy nh5t 1 tr<Qng hXp m d[ liBu c th1 .-c t; LCD ra, . l .-c tr:ng thi LCD .1 bi>t LCD c .ang bAn hay khng (cQ Busy Flag - BF). Do LCD l m*t thi>t bS ho:t .*ng t<@ng .Ri chAm (so v?i vi .i/u khi1n), v th> SU T!M V BIN SO#N B%I NTINSIDE Ntinside 152 m*t cQ BF .<Xc dng .1 bo LCD .ang bAn, n>u BF=1 th chng ta ph2i chQ cho LCD xC l xong nhiBm vH hiBn t:i, .>n khi no BF=0 m*t thao tc m?i sc .<Xc gn cho LCD. V th>, khi lm viBc v?i Text LCD chng ta nh5t thi>t ph2i c m*t ch<@ng trnh con t:m g-i l wait_LCD .1 chQ cho .>n khi LCD r2nh. C 2 cch .1 vi>t ch<@ng trnh wait_LCD. Cch 1 l .-c bit BF v/ ki1m tra v chQ BF=0, cch ny .i h_i lBnh .-c t; LCD v/ b* .i/u khi1n ngoi, do . chn R/W cLn .<Xc nRi v?i b* .i/u khi1n ngoi. Cch 2 l vi>t m*t hm delay m*t kho2ng thQi gian cR .Snh no . (tRt nh5t l trn 1ms). u .i1m c^a cch 2 l s` .@n gi2n v khng cLn .-c LCD, do . chn R/W khng cLn sC dHng v lun .<Xc nRi v?i GND. Tuy nhin, nh<Xc .i1m c^a cch 2 l kho2ng thQi gian delay cR .Snh n>u qu l?n sc lm chAm qu trnh thao tc LCD, n>u qu nh_ sc gy ra lYi hi1n thS. Trong bi ny ti h<?ng dan b:n cch teng qut l cch 1, .1 sC dHng cch 2 b:n chU cLn m*t thay .ei nh_ trong ch<@ng trnh wait_LCD (sc trnh by chi ti>t sau) v k>t nRi chn R/W c^a LCD xuRng GND. EN (chn sR 5): Chn cho php LCD ho:t .*ng (Enable), chn ny cLn .<Xc k>t nRi v?i b* .i/u khi1n .1 cho php thao tc LCD. b1 .-c v ghi data t; LCD chng ta cLn t:o m*t xung c:nh xuRng trn chn EN, ni theo cch khc, muRn ghi d[ liBu vo LCD tr<?c h>t cLn .2m b2o rZng chn EN=0, ti>p .>n xu5t d[ liBu .>n cc chn D0:7, sau . set chn EN ln 1 v cuRi cng l xa EN v/ 0 .1 t:o 1 xung c:nh xuRng. 3.2 T:p l/nh c=a LCD. B2ng 2 tm tMt cc lBnh c th1 ghi vo LCD SU T!M V BIN SO#N B%I NTINSIDE Ntinside 153 Danh sch lBnh trn .<Xc ti t 2 mu khc nhau, cc lBnh mu ._ sc .<Xc dng th<Qng xuyn trong lc hi1n thS LCD v cc lBnh mu xanh th<Qng chU .<Xc dng 1 lLn trong lc khWi .*ng LCD, ring lBnh Read BF c th1 .<Xc dng hoDc khng ty theo cch vi>t ch<@ng trnh wait_LCD. PhLn ti>p theo ti gi2i thch ngh\ c^a cc lBnh v tham sR km theo chng. Tr<?c h>t l nhm lBnh ._: - Clear display xa LCD: lBnh ny xa ton b* n*i dung DDRAM v SU T!M V BIN SO#N B%I NTINSIDE Ntinside 154 v th> xa ton b* hi1n thS trn LCD. V .y l 1 lBnh ghi Instruction nn chn RS ph2i .<Xc reset v/ 0 tr<?c khi ghi lBnh ny ln LCD. M lBnh xa LCD l 0x01(ghi vo D0:D7). - Cursor home .<a con tr_ v/ vS tr .Lu, dng 1 c^a LCD: lBnh ny th`c hiBn viBc .<a con tr_ v/ vS tr .Lu tin c^a b* nh? DDRAM, v th> n>u sau lBnh ny m*t bi>n .<Xc ghi vo DDRAM th bi>n ny sc nZm W vS tr .Lu tin (1;1). RS c7ng ph2i bZng 0 tr<?c khi ghi lBnh. M lBnh l 0x02 hoDc 0x03(ch-n 1 trong 2 m lBnh, ty ). - Set DDRAM address .Snh vS tr con tr_ cho DDRAM: di chuy1n con tr_ .>n m*t vS tr ty trong DDRAM v v th> c th1 .<Xc dng .1 ch-n vS tr cLn hi1n thS trn LCD. b1 th`c hiBn lBnh ny cLn reset RS=0. Bit MSB c^a m lBnh (D7) ph2i bZng 1, 7 bit cn l:i c^a m lBnh chnh l .Sa chU DDRAM muRn di chuy1n .>n. V dH chng ta muRn di chuy1n con tr_ .>n vS tr thG 3 trn dng 2 c^a LCD (.Sa chU 42) chng ta cLn ghi m lBnh 0xAA v 0xAA=10101010 (binary) trong . bit MSB bZng 1, b2y bit cn l:i l 0101010=42, .Sa chU c^a nh? muRn .>n. - Write to CGRAM or DDRAM ghi d[ liBu vo CGRAM hoDc DDRAM: v .y khng ph2i l lBnh ghi instruction m l 1 lBnh ghi d[ liBu nn chn RS cLn .<Xc set ln 1 tr<?c khi ghi lBnh vo LCD. LBnh ny cho php ghi m ASCII c^a m*t k t` cLn hi1n thS vo thanh ghi DDRAM. Tr<Qng hXp ghi vo CGRAM khng .<Xc kh2o st. K> .>n l nhm lBnh mu xanh: nhm lBnh ny th<Qng chU th`c hiBn 1 lLn (t nh5t l trong bi h-c ny) v th<Qng .<Xc vi>t chung trong 1 ch<@ng trnh con khWi .*ng LCD ( chng ta g-i l init_LCD trong bi h-c ny). - Entry mode set xc lAp cc hiBn thS lin ti>p cho LCD: ni m*t cch dI hi1u, lBnh ny chU ra cch m b:n muRn hi1n thS m*t k t` ti>p theo 1 k t` tr<?c .. V dH n>u b:n muRn hiBn thS 2 k t` lin ti>p AB, tr<?c h>t b:n vi>t A t:i vS tr 5, dng 1. Sau . b:n ghi B vo LCD, lc ny c 4 cch m LCD c th1 hi1n thS B nh< sau: hi1n thS B bn ph2i A t:i vS tr sR 6 (cch 1); B c7ng c th1 .<Xc hi1n thS bn tri A, t:i vS tr sR 4(cch 2); hoDc LCD c th1 t` dSch chuy1n A v/ bn tri .>n vS tr 4 sau . hi1n thS B bn ph2i A, t:i vS tr 5(cch 3); v kh2 nKng cuRi cng l LCD dSch chuy1n A v/ bn ph2i .>n vS tr 6 sau . hi1n thS B bn tri A, t:i vS tr 5(cch 4). Chng ta c th1 ch-n 1 trong 4 cch hi1n thS trn thng qua lBnh Entry mode set. by l lBnh ghi Instruction nn RS=0, 5 bit cao D7:3=00000, bit D2=1, hai bit cn l:i D1:0 chGa m lBnh .1 l`a ch-n 1 trong 4 cch hi1n thS. Xem l:i b2ng 2, bit D1 chGa gi trS I/D v D0 chGa S. Trong . I/D ngh\a l tKng hoDc gi2m (Increment or Decrement). I/D= 1 l hi1n thS tKng tGc k t` sau sc hi1n thS bn ph2i k t` tr<?c, n>u I/D=0 th hi1n thS gi2m, tGc k t` sau hi1n thS bn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 155 tri k t` tr<?c. S l gi trS Shift, n>u S=1 th cc k t` tr<?c . sc .<Xc .]y .i, k t` sau chi>m chY k t` tr<?c, ng<Xc l:i n>u S=0 th vS tr hi1n thS c^a cc k t` tr<?c . khng thay .ei. C th1 tm tMt 4 mode hi1n thS Gng v?i 4 m lBnh nh< sau: + D7:0 = 0x04 (00000100) : hi1n thS gi2m v khng shift (nh< cch 2 trong v dH). + D7:0 = 0x05 (00000101) : hi1n thS gi2m v shift (nh< cch 4 trong v dH). + D7:0 = 0x06 (00000110) : hi1n thS tKng v khng shift (nh< cch 1, khuyQn khch). + D7:0 = 0x07 (00000111) : hi1n thS tKng v shift (nh< cch 3 trong v dH). - Display on/off control xc lAp cch hiBn thS cho LCD: lBnh ny bao gPm cc thng sR cho php LCD hi1n thS, cho php hi1n thS cursor v mW/tMt blinking. by c7ng l m*t lBnh ghi Instrcution nn RS ph2i bZng 0. M lBnh cho lBnh ny c d:ng 00001DCB trong . D (Display) cho php hi1n thS LCD n>u mang gi trS 1, C (Cursor) bZng 1 th cursor sc .<Xc hi1n thS v B l blinking cho cursor t:i vS tr hi1n thS (blinking l d:ng 1 .en nh5p nhy t:i vS tr k t` .ang hi1n thS). M lBnh .<Xc dng phe bi>n cho lBnh ny l 0x0E (00001110 - hi1n thS cursor nh<ng khng hi1n thS blinking). - Function set xc lAp chGc nKng cho LCD: .y l lBnh thi>t lAp ph<@ng thGc giao ti>p v?i LCD, kch th<?c font ch[ v sR l<Xng line c^a LCD. RS c7ng ph2i bZng 0 khi sC dHng lBnh ny. M lBnh function set c d:ng 001DLNFxx. Trong . n>u DL=1 (DL: Data Length) th mode giao ti>p 8 bit sc .<Xc dng, lc ny t5t c2 cc chn t; D0 .>n D7 ph2i .<Xc k>t nRi v?i b* .i/u khi1n ngoi. N>u DL=0 th mode 4 bit .<Xc dng, trong tr<Qng hXp ny chU c 4 chn D4:7 .<Xc dng .1 truy/n nhAn d[ liBu v k>t nRi v?i b* .i/u khi1n ngoi, cc chn D0:3 .<Xc .1 trRng. N quy .Snh sR dng c^a LCD, v chng ta .ang kh2o st LCD lo:i hi1n thS 2 dng nn N=1 (N=0 cho tr<Qng hXp LCD 1 dng). F l kch th<?c font ch[ hi1n thS, do LCD c 2 b* font ch[ c sdn trong CGROM nn chng ta cLn l`a ch-n thng qua bit F, n>u F=1 b* font 5x10 .<Xc sC dHng v n>u F=0 th font 5x8 .<Xc hi1n thS. 2 bit th5p trong m lBnh ny c th1 .<Xc gn gi trS ty . M lBnh .<Xc dng phe bi>n cho lBnh function set l 0x38 (00111000 giao ti>p 8 bit, 2 dng v?i font 5x8 ) hoDc 0x28 (00101000 giao ti>p 4 bit, 2 dng v?i font 5x8 ). V dH trong bi ny sC dHng c2 2 m lBnh trn. 3.3 Giao ti*p 8 bit v 4 bit. Nh< trnh by trong lBnh function set, c 2 mode .1 ghi v .-c d[ liBu vo LCD . l mode 8 bit v mode 4 bit: SU T!M V BIN SO#N B%I NTINSIDE Ntinside 156 - Mode 8 bit: N>u bit DL trong lBnh function set bZng 1 th mode 8 bit .<Xc dng. b1 sC dHng mode 8 bit, t5t c2 cc lines d[ liBu c^a LCD t; D0 .>n D7 (t; chn 7 .>n chn 14) ph2i .<Xc nRi v?i 1 PORT c^a chip .i/u khi1n bn ngoi (v dH PORTC c^a ATmega32 trong v dH c^a bi ny) nh< trong hnh 3. u .i1m c^a ph<@ng php giao ti>p ny l d[ liBu .<Xc ghi v .-c r5t nhanh v .@n gi2n v chip .i/u khi1n chU cLn xu5t hoDc nhAn d[ liBu trn 1 PORT. Tuy nhin, ph<@ng php ny c nh<Xc .i1m l teng sR chn dnh cho giao ti>p LCD qu nhi/u, n>u tnh lun c2 3 chn .i/u khi1n th cLn .>n 11 .<Qng cho giao ti>p LCD. - Mode 4 bit: LCD cho php giao ti>p v?i b* .i/u khi1n ngoi theo ch> .* 4 bit. Trong ch> .* ny, cc chn D0, D1, D2 v D3 c^a LCD khng .<Xc sC dHng (.1 trRng), chU c 4 chn t; D4 .>n D7 .<Xc k>t nRi v?i chip b* .i/u khi1n ngoi. Cc instruction v data 8 bit sc .<Xc ghi v .-c bZng cch chia thnh 2 phLn, g-i l cc Nibbles, mYi nibble gPm 4 bit v .<Xc giao ti>p thng qua 4 chn D7:4, nibble cao .<Xc xC l tr<?c v nibble th5p sau. u .i1m l?n nh5t c^a ph<@ng php ny tRi thi1u sR lines dng cho giao ti>p LCD. Tuy nhin, viBc .-c v ghi t;ng nibble t<@ng .Ri kh khKn h@n .-c v ghi d[ liBu 8 bit. Trong bi h-c ny, ti sc trnh by 2 ch<@ng trnh con .<Xc vi>t ring .1 ghi v .-c cc nibbles g-i l Read2Nib v Write2Nib. II. AVR v Text LCD. 1. Trnh tX giao tiQp Text LCD. Trnh t` giao ti>p v?i LCD .<Xc trnh by trong flowchart W hnh 6. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 157
Hnh 6. Trnh t` giao ti>p v?i Text LCD. b1 sC dHng LCD chng ta cLn khWi .*ng LCD, sau khi .<Xc khWi .*ng LCD . sdn sng .1 hi1n thS. Qu trnh khWi .*ng chU cLn th`c hiBn 1 lLn W .Lu ch<@ng trnh. Trong bi ny, qu trnh khWi .*ng .<Xc vi>t trong 1 ch<@ng trnh con tn int_LCD, khWi .*ng LCD th<Qng bao gPm xc lAp cch giao ti>p, kch th<?c font, sR dng LCD (funcstion set), cho php hi1n thS LCD, sursor(Display control), ch> .* hi1n thS tKng/gi2m, shift (Entry mode set). Cc th^ tHc khc nh< xa LCD, vi>t k t` ln LCD, di chuy1n con tr_.<Xc sC dHng lin tHc trong qu trnh hi1n thS LCD v sc .<Xc trnh by trong cc .o:n ch<@ng trnh con ring. 2. AVR giao tiQp v-i Text LCD trong WinAVR. PhLn ny ti trnh by cch .i/u khi1n hi1n thS Text LCD bZng vi .i/u khi1n AVR trong mi tr<Qng C c^a WinAVR. Hnh thGc l m*t th< viBn hm giao ti>p Text LCD trong 1 file header c tn l myLCD.h. Cc hm trong th< viBn bao gPm (ch l phLn code trong List 0 khng nZm trong file myLCD.h). List 0. Cc hm c trong th< viBn myLCD. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 158 1 2 3 4 5 6 7 8 9 10 char Read2Nib(); //.-c 2 nibbles t; LCD void Write2Nib(uint8_t chr); //ghi 2 nibbles vo LCD void Write8Bit(uint8_t chr); //ghi tr` ti>p 8 bit v LCD void wait_LCD(); //chQ LCD r2nh void init_LCD(); //khWi .*ng LCD void clr_LCD(); //xa LCD void home_LCD(); //.<a cursor v/ home void move_LCD(uint8_t y, uint8_t x); //di chuy1n cursor .> vS tr mong muRn (dng, c void putChar_LCD(uint8_t chr); //ghi 1 k t` ln LCD void print_LCD(char* str, unsigned char len); //hi1n thS chuYi k t` Tuy nhin, tr<?c khi vi>t cc hm giao ti>p LCD chng ta cLn .Snh ngh\a m*t sR macro v bi>n. Hy t:o 1 file Header c tn myLCD.h v vi>t cc .o:n code bn d<?i vo file ny (bMt .Lu t; List 1). List 1. bSnh ngh\a cc bi>n thay th>. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 #include <util/delay.h> #define sbi(sfr,bit) sfr|=_BV(bit) #define cbi(sfr,bit) sfr&=~(_BV(bit)) #define EN 2 #define RW 1 #define RS 0 #define CTRL PORTB #define DDR_CTRL DDRB #define DATA_O PORTB #define DATA_I PINB #define DDR_DATA DDRB /* #define LCD8BIT #define DATA_O PORTD #define DATA_I PIND #define DDR_DATA DDRD */ cbi v sbi l 2 macro .<Xc dHng .1 xa v set 1 bit trong 1 thanh ghi. V dH cbi(PORTA, 5) l xa bit 5 trong thanh ghi PORT v/ 0. Do WinAVR khng hY trX tuy xu5t tr`c ti>p cc bit nn cLn .Snh ngh\a 2 macro ny hY trX. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 159 Cc bi>n EN, RW v RS .Snh ngh\a sR thG t` c^a chn trn 1 PORT c^a AVR .<Xc dng .1 k>t nRi v?i cc chn EN, R/W v RS c^a LCD. CTRL l bi>n cho bi>t PORT no c^a AVR .<Xc dng .1 k>t nRi v?i cc chn .i/u khi1n c^a LCD.DDR_CTRL l thanh ghi .i/u khi1n h<?ng c^a PORT k>t nRi v?i cc chn .i/u khi1n, DDR_CTRL lun phH thu*c vo bi>n CTRL. Trong tr<Qng hXp c^a bi ny, b:n th5y ti .Snh ngh\a CTRL l PORTB ngh\a l PORTB .<Xc dng .1 k>t nRi v?i cc chn .i/u khi1n LCD, v CTRL l PORTB nn DDR_CTRL ph2i l DDRB (thanh ghi .i/u khi1n h<?ng c^a PORTB). EN .Snh ngh\a bZng 2 ngh\a l chn EN c^a LCD .<Xc nRi v?i chn 2 c^a PORTB (PB2), t<@ng t` chn R/W nRi v?i chn 1 PORTB (PB1) v chn RS nRi v?i chn 0 PORTB (PB0). ViBc ch-n cc PORT giao ti>p v thG t` chn phH thu*c vo k>t nRi thAt trong m:ch .iBn giao ti>p, b:n ph2i thay .ei cc .Snh ngh\a ny cho ph hXp v?i thi>t k> m:ch .iBn c^a b:n. L do cho viBc .Snh ngh\a cc bi>n thay th> ki1u ny l nhZm t:o ra tnh teng qut cho th< viBn hm. V dH, m*t ng<Qi khng muRn dng PORTB .1 .i/u khi1n LCD m dng PORTA th ng<Qi ny chU cLn thay .ei .Snh ngh\a W 2 dng 7 v 8, khng cLn thay .ei n*i dung cc hm v trong cc hm ny chng ta chU dng tn thay th> l CTRL v DDR_CTRL. T<@ng t`, ti .Snh ngh\a 3 bi>n thay th> l DATA_O ngh\a l PORT xu5t d[ liBu, DATA_I l PORT nhAp d[ liBu v DDR_DATA l thanh ghi .i/u khi1n h<?ng. DATA_O v DATA_I l PORT nRi v?i cc chn D0:7 (mode 8 bit) hoDc D4:7 (mode 4 bit) c^a LCD, .y l cc .<Qng truy/n v nhAn d[ liBu. Trong v dH trn, ti dng chnh PORTB lm .<Qng data v .y l tr<Qng hXp giao ti>p 4 bit, do 3 chn .Lu c^a PORTB k>t nRi v?i cc chn .i/u khi1n nn PORTB chU cn th;a l:i 5 chn, chng ta sc nRi 4 chn PB4, PB5, PB6 v PB7 t<@ng Gng v?i D4, D5, D6 v D7 c^a LCD. Hnh 7 m t2 cch k>t nRi AVR v LCD theo v dH ny. T5t nhin b:n c th1 sC dHng PORT khc lm .<Qng data nh5t l khi b:n muRn sC dHng mode 8 bit, v trong mode ny cLn t?i 11 .<Qng giao ti>p (3 .i/u khi1n + 8 data). PhLn .<Xc che trong 2 d5u comment /* */ l tr<Qng hXp b:n muRn d^ng mode 8 bit. b1 sC dHng mode 8 bit, b:n cLn .Snh ngh\a 1 bi>n c tn LCD8BIT, bit ny sc bo cho cc .o:n ch<@ng trnh con th`c hiBn ghi v .-c d[ liBu theo cch 8 bit. bPng thQi, b:n ph2i .Snh ngh\a l:i .<Qng giao ti>p data (DATA_O, DATA_I, DDR_DATA). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 160
Hnh 7. V dH K>t nRi LCD v?i AVR trong mode 4 bit (chip mega8). PhLn bn d<?i l phLn .Snh ngh\a cc hm trong th< viBn myLCD. BRn hm .Lu tin (xem l:i List 0) l cc hm hY trX, chng chU .<Xc dng bWi cc hm khc trong th< viBn v khng .<Xc g-i trong cc ch<@ng trnh Gng dHng bn ngoi. List 2. b-c 2 nibbles t; LCD. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 char Read2Nib(){ char HNib, LNib; DATA_O |=0xF0; sbi(CTRL,EN); //enable DDR_DATA &=0x0F; //set 4 bits cao cua PORT DATA lam input HNib=DATA_I & 0xF0; cbi(CTRL,EN); //disable
sbi(CTRL,EN); //enable LNib = DATA_I & 0xF0; cbi(CTRL,EN); //disable LNib>>=4; return (HNib|LNib); SU T!M V BIN SO#N B%I NTINSIDE Ntinside 161 15 } Hm ny th`c hiBn viBc .-c d[ liBu t; LCD ra ngoi, .-c theo t;ng nibble 4 bit, k>t qu2 tr2 v/ l 1 sR 8 bit. Hm ny chU .<Xc dng duy nh5t khi .-c cQ Busy (BF) trong ch<@ng trnh chQ LCD r2nh (wait_LCD) W mode 4 bit. Tr<?c h>t cLn .Snh ngh\a 1 bi>n t:m HNib (high nibble) v LNib (Low nibble) .1 chGa 2 nibbles .-c v/ (dng 2, List 2). Dng 5 set chn EN ln mGc 1 .1 chu]n bS cho LCD lm viBc. Chng ta cLn .ei h<?ng c^a PORT d[ liBu trn AVR .1 sdn sng nhAn d[ liBu v/, do chU c 4 bit cao c^a PORT data k>t nRi v?i cc .<Qng data c^a LCD (v .y l mode 4 bit) nn chU cLn set h<?ng cho 4 bit ny trn AVR, dng 6 th`c hiBn viBc set h<?ng. Trong ch> .* 4 bit, LCD sc truy/n v nhAn nibble cao tr<?c v th> dng 7 .-c d[ liBu t; LCD thng qua cc chn DATA_I vo bi>n HNib, ch l chng ta chU cLn l5y 4 bit cao c^a DATA_I nn cLn ph2i dng gi2i thuAt mDt n: (mask) che cc bit th5p l:i (and v?i 0xF0). Dng 8 xa chn EN .1 chu]n bS cho b<?c ti>p theo. T<@ng t`, cc dng 10, 11 v 12 .-c nibble th5p vo bi>n LNib. Hai dng 13 v 14 k>t hXp 2 nibbles .1 t:o thnh sR 8 bit v tr2 k>t qu2 v/ cho .o:n ch<@ng trnh. List 3. Ghi 2 nibbles vo LCD. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 void Write2Nib(uint8_t chr){ uint8_t HNib, LNib, temp_data; temp_data=DATA_O & 0x0F; //doc 4 bit thap cua DATA_O de mask, HNib=chr & 0xF0; LNib=(chr<<4) & 0xF0;
DATA_O =(LNib|temp_data); sbi(CTRL,EN); //enable cbi(CTRL,EN); //disable } Hm Write2Nib th`c hiBn ghi m*t bi>n 8 bit c tn chr vo LCD theo t;ng nibble, hm ny .<Xc sC dHng r5t nhi/u lLn trong mode 4 bit. Dng 2 .Snh ngh\a 3 bi>n t:m l HNib, LNib v temp_data, khng giRng nh< khi .-c t; LCD, viBc ghi vo LCD c th1 lm 2nh h<Wng .>n cc chn c^a SU T!M V BIN SO#N B%I NTINSIDE Ntinside 162 PORT dng lm .<Qng d[ liBu nh5t l khi cc .<Qng .i/u khi1n v d[ liBu dng chung 1 PORT (PORTB). Bi>n temp_data dng trong gi2i thuAt mDt n: .1 khng lm 2nh h<Wng .>n cc bit khc khi ghi LCD. Dng 3 .-c d[ liBu t; PORT DATA_O v che .i cc bit cao, chU l<u l:i cc bit th5p vo bi>n temp_data v cc bit th5p ny khng .<Xc dng xu5t nhAp d[ liBu (xem hnh 7, cc chn th5p c^a PORTB dng lm cc chn .i/u khi1n). b1 ghi 1 gi trS 8 bit c tn l chr theo cch ghi t;ng nibbles chng ta cLn tch bi>n chr thnh 2 nibbles. Dng 5 tch 4 bit cao c^a chr v chGa vo bi>n HNib. Dng 6 th`c hiBn thm viBc di chuy1n 4 bit th5p c^a chr qua tri rPi gn cho bi>n LNib. Nh< vAy sau 2 dng ny cc bi>n HNib v LNib .<Xc m t2 nh< sau:
Do d[ liu . .<Xc sMp x>p sdn sng W cc vS tr cao (Gng v?i cc chn D4:7) nn cng vic ti>p theo chU .@n gi2n l xu5t 2 bi>n HNib v LNib ra .<Qng DATA_O, cLn ph2i t:o 1 xung c:nh xuRng W chn EN mYi lLn xu5t d[ liBu (dng 9, 10). Ch l ph2i xu5t nibble cao tr<?c v nibble th5p theo sau. List 4. Ghi 8 bit tr`c ti>p vo LCD. 01 02 03 04 05 void Write8Bit(uint8_t chr){ DATA_O=chr; //out 8 bits to DATA Line sbi(CTRL,EN); //enable cbi(CTRL,EN); //disable } bo:n ny r5t .@n gi2n l xu5t d[ liBu 8 bit ra DATA_O, dng trong mode 8 bit. Trong mode ny, 8 chn data c^a LCD .<Xc nRi v?i 8 .<Qng DATA_O c^a AVR.
List 5. ChQ LCD r2nh. 01 02 03 04 05 void wait_LCD(){ #ifdef LCD8BIT while(1){ cbi(CTRL,EN); //xa EN cbi(CTRL,RS); //.y l Instruction SU T!M V BIN SO#N B%I NTINSIDE Ntinside 163 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 sbi(CTRL,RW); //chi/u t; LCD ra ngoi
DDR_DATA=0xFF; //h<?ng data out DATA_O=0xFF; // gWi lBnh .-c BF sbi(CTRL,EN); //enable
DDR_DATA=0x00; // bei h<?ng data in if(bit_is_clear(DATA_I,7)) break; } cbi(CTRL,EN); //disable for next step cbi(CTRL,RW); //ready for next step DDR_DATA=0xFF; //Ready to Out #else char temp_val; while(1){ cbi(CTRL,RS); //RS=0, the following data is COMMAND sbi(CTRL,RW); //LCD -> AVR temp_val=Read2Nib(); if (bit_is_clear(temp_val,7)) break; } cbi(CTRL, RW); //ready for next step DDR_DATA=0xFF;//Ready to Out #endif //_delay_ms(1); }
Hm wait_LCD chU lm m*t viBc .@n gi2n l chQ cho .>n khi LCD r2nh .1 gn cc cng viBc khc. bo:n code trong list 5 trnh by cch 1: .-c cQ Busy Flag v chQ .>n khi n bZng 0 (LCD r2nh). ViBc .-c cQ BF phH thu*c v mode .ang sC dHng l 8 bit hay 4 bit, v th> lBnh #ifdef trong dng sR 2 ki1m tra mode ph hXp tr<?c khi ti>n hnh .-c. #ifdef LCD8BIT ngh\a l n>u bi>n LCD8BIT . .<Xc .Snh ngh\a W pha trn (mode 8 bit .<Xc dng) th sc ti>n hnh .-c BF theo mode ny. BZng cch ki1m tra s` c mDt c^a bi>n LCD8BIT ch<@ng trnh sc bi>t cch ghi v .-c LCD ph hXp, ph<@ng php dng #ifdef LCD8BIT .<Xc p dHng cho t5t c2 cc hm sau ny. Cc .o:n code t; dng 4 .>n 17 th`c hiBn trong mode 8 bit. Tr<?c khi .-c BF, chng ta cLn gWi 1 lBnh .-c BF W dng 9, sau . W dng 12 th`c hiBn .ei h<?ng cc chn data .1 nhAn gi trS v/. Trong dng 10, ki1m tra bit thG 7 c^a DATA_I, DATA_I chnh l gi trS .-c v/ v bit thG 7 trong gi trS nhAn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 164 v/ chnh l cQ Busy Flag. N>u BF=0 (bit_is_clear(DATA_I,7)) th k>t thc qu trnh lDp chQ v?i lBnh break;. Trong tr<Qng hXp mode 4 bit .<Xc sC dHng (#else), qu trnh ki1m tra cQ BF c7ng t<@ng t`, .i1m khc nhau duy nh5t l cch .-c d[ liBu v/ c khc, chng ta dng hm Read2Nib . .<Xc vi>t tr<?c . .1 nhAn gi trS v/ (xem dng 23). Nh< . trnh by, chng ta c th1 vi>t hm wait_LCD bZng cch dng hm delay m*t kho2ng thQi gian cR .Snh, trong dng 29 b:n th5y m*t hm _delay_ms(1) khng .<Xc sC dHng, n>u muRn b:n c th1 xa h>t cc dng lBnh tr<?c . trong hm wait_LCD v dng hm delay ny .1 thay th>, LCD van sc ho:t .*ng tRt. List 6. KhWi .*ng LCD. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 void init_LCD(){ DDR_CTRL=0xFF; DDR_DATA=0xFF; //Function set------------------------------------------------------------------------------ cbi(CTRL,RS); // the following data is COMMAND cbi(CTRL, RW); // AVR->LCD cbi(CTRL, EN); #ifdef LCD8BIT Write8Bit(0x38); wait_LCD(); #else sbi(CTRL,EN); //enable sbi(DATA_O, 5); cbi(CTRL,EN); //disable wait_LCD(); Write2Nib(0x28);//4 bit mode, 2 line, 5x8 font wait_LCD(); #endif //Display control------------------------------------------------------------------------- cbi(CTRL,RS); // the following data is COMMAND #ifdef LCD8BIT Write8Bit(0x0E); wait_LCD(); #else Write2Nib(0x0E); wait_LCD(); #endif //Entry mode set------------------------------------------------------------------------ cbi(CTRL,RS); // the following data is COMMAND SU T!M V BIN SO#N B%I NTINSIDE Ntinside 165 30 31 32 33 34 35 36 37 #ifdef LCD8BIT Write8Bit(0x06); wait_LCD(); #else Write2Nib(0x06); wait_LCD(); #endif }
Qu trnh khWi .*ng gPm 3 b<?c: function set, display control v entry mode set. V?i function set, ba dng 5,6 v 7 xc lAp cc chn .i/u khi1n .1 chu]n bS gWi cc lBnh. Hai dng 9 v 10 vi>t lBnh function set vo LCD theo mode 8 bit. Gi trS 0x38, tGc 00111000 l m*t lBnh xc lAp mode 8 bit, LCD 2 dng v font 5x8. N>u mode 4 bit .<Xc dng, chng ta cLn vi>t hm function set khc .i m*t cht. Theo mDc .Snh, khi v;a khWi .*ng LCD th mode 8 bit sc .<Xc ch-n, v th> n>u m*t hm no . .<@c ghi vo LCD .Lu tin, LCD sc cR gMng .-c h>t cc chn D0:7 .1 l5y d[ liBu, do trong mode 4 bit cc chn D0:3 khng .<Xc k>t nRi v?i AVR nn viBc .-c lLn .Lu c th1 dan .>n sai sR. V vAy, viBc .Lu tin cLn lm n>u muRn sC dHng mode 4 bit l gWi m*t lBnh function set v?i tham sR DL=0 (0010xxxx) .>n LCD .1 bo mode chng ta muRn dng. Dng 13 lm viBc ny, dng lBnh chU .@n gi2n set bit D5 nh<ng . chnh l gWi lBnh d:ng0010xxxx .>n LCD, v th> LCD sc vo mode 4 bit sau lBnh ny. Ti>p theo qu trnh thao tc v?i LCD diIn ra bnh th<Qng, dng 16 ghi vo LCD m c^a function set, trong tr<Qng hXp ny l m 0x28, tGc 00101000: mode 4 bit, LCD 2 dng v font 5x8. V?i Display control, m lBnh .<Xc dng l 0x0E, tGc 00001110 trong . 00001 l m c^a lBnh display control, 3 bit theo sau xc lAp hi1n thS LCD, hi1n thS cursor v khng blinking. V?i Entry mode set, m lBnh .<Xc dng l 0x06 tGc hi1n thS tKng v khng shift. Xem l:i phLn gi2i thch tAp lBnh LCD .1 hi1u thm ngh\a c^a m lBnh 0x06. List 7. Di chuy1n cursor. 01 02 03 04 05 void home_LCD(){ cbi(CTRL,RS); // the following data is COMMAND #ifdef LCD8BIT Write8Bit(0x02); wait_LCD(); SU T!M V BIN SO#N B%I NTINSIDE Ntinside 166 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 #else Write2Nib(0x02); wait_LCD(); #endif } void move_LCD(uint8_t y,uint8_t x){ uint8_t Ad; Ad=64*(y-1)+(x-1)+0x80; // tnh m lBnh cbi(CTRL,RS); // the following data is COMMAND #ifdef LCD8BIT Write8Bit(Ad); wait_LCD(); #else Write2Nib(Ad); wait_LCD(); #endif }
List 7 trnh by 2 hm di chuy1n cursor v/ home (home_LCD) v di chuy1n .>n 1 vS tr do ng<Qi dng .Dt. Hmhome_LCD t<@ng .Ri .@n gi2n v chU cLn ghi m lBnh 0x02 vo LCD th cursor sc t` .*ng di chuy1n v/ home (vS tr .Lu tin trn LCD). Hm move_LCD(uint8_t y,uint8_t x) cho php di chuy1n cursor .>n vS tr dng y, c*t x. bi1m cLn ch trong hm ny l cch tnh m lBnh cLn ghi vo LCD. Th`c ch5t .y l lBnh set DDRAM address. Xem l:i b2ng 2 ta th5y m lBnh cho lBnh ny c d:ng 1xxxxxxx trong . xxxxxxx l m*t sR 7 bit chGa .Sa chU c^a DDRAM chng ta cLn di chuy1n .>n. V th> tr<?c khi th`c hiBn ghi m lBnh ny, chng ta cLn tnh tham sR xxxxxxx theo dng y, c*t x. Xem l:i te chGc c^a DDRAM trong hnh 3, gi2 sC m*t nh? W dng y v c*t x trn, do dng 2 bMt .Lu v?i .Sa chU 64, 2 nh? W cng 1 c*t trn 2 dng sc cch nhau 64 vS tr (64*(y-1)). MDt khc do vS tr nh? .<Xc tnh t; 0 trong khi chng ta muRn gn t-a .* x bMt .Lu t; 1, v th> chng ta cLn thm (x-1) vo cng thGc tnh. CuRi cng chng ta cLn ph2i thm m lBnh set .Sa chU DDRAM, m 0x80. Gi trS cuRi cng c^a m lBnh l : Ad=64*(y- 1)+(x-1)+0x80 (dng 13). Cc dng lBnh ti>p theo trong hm move_LCD th`c hiBn ghi gi trS m lBnh vo LCD. CuRi cng l phLn code hi1n thS LCD .<Xc trnh by trong list 8. PhLn hi1n thS bao gPm 1 ch<@ng trnh con: xa LCd, hi1n thS 1 k t` v hi1n thS 1 chuYi cc k t`. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 167 List 8. Hi1n thS trn LCD. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 void clr_LCD(){ //xa ton b* LCD cbi(CTRL,RS); //RS=0 mean the following data is COMMAND (not normal DATA) #ifdef LCD8BIT Write8Bit(0x01); wait_LCD(); #else Write2Nib(0x01); wait_LCD(); #endif } void putChar_LCD(uint8_t chr){ //hi1n thS 1 k t` chr ln LCD sbi(CTRL,RS); //this is a normal DATA #ifdef LCD8BIT Write8Bit(chr); wait_LCD(); #else Write2Nib(chr); wait_LCD(); #endif } void print_LCD(char* str, unsigned char len){ //Hi1n thS 1 chuYi k t` unsigned char i; for (i=0; i<len; i++) if(str[i] > 0) putChar_LCD(str[i]); else putChar_LCD(' '); } }
b1 xa ton b* LCD chng ta cLn gWi 1 instruction c m 0x01 .>n LCD, hm clr_LCD() th`c hiBn viBc ny. L<u m lBnh .1 xa LCD l 1 instruction, v th> cLn xa chn RS xuRng 0 tr<?c khi gWi m ny xuRng LCD (dng 2 xa chn RS). Hm putChar_LCD(uint8_t chr) hi1n thS 1 k t` ln LCD, gi trS tham sR c^a hm ny l m ASCII c^a k t` cLn hi1n thS,chr. N*i dung c^a hm hon ton giRng hm xa LCD, chU khc .y khng ph2i l 1 instruction nn cLn set chn RS ln 1 tr<?c khi gWi m lBnh .>n LCD (dng 12). M lBnh cho hm ny chnh l m ASCII cLn hi1n thS. CuRi cng hmprint_LCD(char* str, unsigned char len) cho php hi1n thS SU T!M V BIN SO#N B%I NTINSIDE Ntinside 168 1 chuYi k t` lin ti>p ln LCD, th`c ch5t .y l qu trnh lDp c^a hm hi1n thS 1 k t`. Ch tham sR len l chi/u di cLn hi1n thS c^a chuYi. I. V d5 =iTu khiGn Text LCD bMng th9 vi0n myLCD. PhLn ny ti sc minh h-a cch sC dHng th< viBn myLCD.h .1 hi1n thS cc k t` ln 1 Text LCD. SC dHng phLn m/m Proteus vc m*t m:ch .iBn gPm 1 LCD 2x16 (keyword: LM016L), 1 chip Atmega32 v 1 bi>n trW (POT-LIN) nh< trong hnh 8. T:o 1 Project bZng WinAVR c tn l TextLCD_Demo v t:o file source l main.c, t:o makefile v?i khai bo s[ dHng chip ATmega32 v clock 8MHz. Copy file myLCD.h vo th< mHc c^a Project m?i t:o. Vi>t code cho file main.c nh< trong list 9. Ch cc .Snh ngh\a chn k>t nRi v?i LCD trong phLn .Lu file myLCD.h ph2i giRng v?i k>t nRi thAt trong hnh 8. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 169
Hnh 8. M:ch .iBn m ph_ng LCD v?i AVR. List 8. Ch<@ng trnh demo .i/u khi1n TextLCD, main.c.
#include <avr/io.h> #include <util/delay.h> #include "myLCD.h" //include th< viBn myLCD int main(){ init_LCD(); //khWi .* LCD clr_LCD(); // xa to b* LCD SU T!M V BIN SO#N B%I NTINSIDE Ntinside 170 putChar_LCD(' '); //ghi 1 kho2ng trMng putChar_LCD(' '); //ghi 1 kho2ng trMng putChar_LCD('D'); //Hi1n thS kt` 'D' print_LCD("emo of the",10); //hi1n thS 1 chuYi k t` move_LCD(2,1); //di chuy1n cursor .>n dng 2, c*t .Lu tin print_LCD("2x16 LCD Display",16); //hi1n thS chuYi thG 2 while(1){
}; }
b1 sC dHng th< viBn myLCD, chng ta cLn include file myLCD.h vo Project nh< trong dng 3, #include "myLCD.h". Hai dng 6 v 7 th`c hiBn khWi .*ng v xa LCD. Sau ., cc dng 9, 10 v 11 .Dt 3 k t` l cc kho2ng trMng v ch[ ci D bZng hm putChat_LCD. Dng 12 in chuYi emo of the ngay ti>p theo ch[ ci D tr<?c . bZng hm print_LCD. Dng 13 th`c hiBn di chuy1n cursor .>n vS tr dng thG 2, c*t .Lu tin c^a LCD tr<?c khi ti>n hnh in chuYi thG 2 2x16 LCD Display W dng code 14. N>u b:n th`c hiBn .ng trnh t` nh< trn, k>t qu2 thu .<Xc sc nh< trong hnh 8.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 171 Graphic LCD
I. B3n sE =i =Qn =u. Trong bi Gng dHng ny ti trnh by v/ c5u trc v cch .i/u khi1n Graphic LCD lo:i dot khng mu. Cng cH chnh c7ng l 2 b* phLn m/m quen thu*c WinAVR, Proteus v phLn m/m bin tAp Graphic LCD, G.Edit. Sau bi ny, ti hy v-ng b:n c th1 hi1u v th`c hiBn .<Xc: - C5u trc Graphic LCD 128x64 v chip .i/u khi1n KS0108. - Nguyn l ho:t .*ng Graphic LCD. - Pht tri1n 1 th< viBn .i/u khi1n Graphic LCD 128x64 cho AVR. - V dH .i/u khi1n Graphic LCD 128x64 bZng AVR. II. Graphic LCD. Graphic LCD (g-i tMt l GLCD) lo:i ch5m khng mu l cc lo:i mn hnh tinh th1 l_ng nh_ dng .1 hi1n thS ch[, sR hoDc hnh 2nh. Khc v?i Text LCD, GLCD khng .<Xc chia thnh cc .1 hi1n thS cc m ASCII v GLCD khng c b* nh? CGRAM (Character Generation RAM). GLCD 128x64 c 128 c*t v 64 hng t<@ng Gng c 128x64=8192 ch5m (dot). MYi ch5m t<@ng Gng v?i 1 bit d[ liBu, v nh< th> cLn 8192 bits hay 1024 bytes RAM .1 chGa d[ liBu hi1n thS .Ly mYi 128x64 GLCD. Ty theo lo:i chip .i/u khi1n, nguyn l ho:t .*ng c^a GLCD c th1 khc nhau, trong bi ny ti gi?i thiBu lo:i GLCD .<Xc .i/u khi1n bWi chip KS0108 c^a Samsung, c th1 ni GLCD v?i KS0108 l phe bi>n nh5t trong cc lo:i GLCD lo:i ny (ch5m, khng mu). Hnh 1 l hnh 2nh thAt c^a 1 GLCD 128x64 .i/u khi1n bWi KS0108. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 172
Hnh 1. Graphic LCD 128x64. Chip KS0108 chU c 512 bytes RAM (4096 bits = 64x64) v v th> chU .i/u khi1n hi1n thS .<Xc 64 dng x 64 c*t. b1 .i/u khi1n GLCD 168x64 cLn 2 chip KS0108, v th`c th> trong cc lo:i GLCD c 2 chip KS0108, GLCD 128x64 do . t<@ng t` 2 GLCD 64x64 ghp l:i. Chng ta sc lLn l<Xt kh2o st s@ .P chn, c5u trc b* nh? v nguyn l ho:t .*ng c^a GLCD, chip KS0108 trong phLn ti>p theo. 1. S. =V chn GLCD 128x64. Cc GLCD 128x64 dng KS0108 th<Qng c 20 chn trong . chU c 18 chn l th`c s` .i/u khi1n tr`c ti>p GLCD, 2 chn (th<Qng l 2 chn cuRi 19 v 20) l 2 chn Anode v Cathode c^a LED n/n. Trong 18 chn cn l:i, c 4 chn cung c5p nguPn v 14 chn .i/u khi1n+d[ liBu. Khc v?i cc Text LCD HD44780U, GLCD KS0108 khng hY trX ch> .* giao ti>p 4 bit, do . b:n cLn dnh ra 14 chn .1 .i/u khi1n 1 GLCD 128x64. S@ .P chn phe bi>n c^a GLCD 128x64 .<Xc m t2 trong b2ng 1. B2ng 1. S@ .P chn GLCD GDM-12864-04. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 173
Ch l trn m*t sR GLCD, thG t` cc chn c th1 khc (nh< GLCD WG12864A2) nh<ng sR l<Xng v chGc nKng chn th khng .ei. Hnh 2 m t2 cch k>t nRi GLCD v?i nguPn v m:ch .i/u khi1n. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 174
Hnh 2. K>t nRi GLCD. Chn VSS .<Xc nRi tr`c ti>p v?i GND, chn VDD nRi v?i nguPn +5V, m*t bi>n trW kho2ng 20K .<Xc dng .1 chia .iBn p giCa Vdd v Vee cho chn Vo, bZng cch thay .ei gi trS bi>n trW chng ta c th1 .i/u chUnh .* t<@ng ph2n c^a GLCD. Cc chn .i/u khi1n RS, R/W, EN v cc .<Qng d[ liBu .<Xc nRi tr`c ti>p v?i vi .i/u khi1n. Ring chn Reset (RST) c th1 nRi tr`c ti>p v?i nguPn 5V. EN (Enable): cho php m*t qu trnh bMt .Lu, bnh th<Qng chn EN .<Xc gi[ W mGc th5p, khi m*t th`c hiBn m*t qu trnh no . (.-c hoDc ghi GLCD), cc chn .i/u khi1n khc sc .<Xc ci .Dt sdn sng, sau . kch chn EN ln mGc cao. Khi EN .<Xc ko ln cao, GLCD bMt .Lu lm th`c hiBn qu trnh .<Xc yu cLu, chng ta cLn chQ m*t kho2ng thQi gian ngMn cho GLCD .-c hoDc gWi d[ liBu. CuRi cng l ko EN xuRng mGc th5p .1 k>t thc qu trnh v c7ng .1 chu]n bS chn EN cho qu trnh sau ny. RS (Register Select): l chn l`a ch-n gi[a d[ liBu (Data) v lBnh (Instruction), v th> m trong m*t sR ti liBu b:n c th1 th5y chn RS .<Xc g-i l chn DI (Data/Instruction Select). Chn RS=1 bo rZng tn hiBu trn cc .<Qng DATA (D0:7) l d[ liBu ghi hoDc .-c t; RAM c^a GLCD. Khi RS=0, tn hiBu trn .<@ng DATA l m*t m lBnh (Instruction). RW (Read/Write Select): ch-n l`a gi[a viBc .-c v ghi. Khi RW=1, chi/u truy cAp t; GLCD ra ngoi (GLCD->AVR). RW=0 cho php ghi vo GLCD. Giao ti>p v?i GLCD ch^ y>u l qu trnh ghi (AVR ->GLCD), chU duy nh5t tr<Qng hXp .-c d[ liBu t; GLCD l .-c bit BUSY v .-c d[ liBu t; SU T!M V BIN SO#N B%I NTINSIDE Ntinside 175 RAM. b-c bit BUSY th chng ta . kh2o st cho Text LCD, bit ny bo GLCD c .ang bAn hay khng, viBc .-c ny sc .<Xc dng .1 vi>t hm wait_GLCD. b-c d[ liBu t; RAM c^a GLCD l m*t kh2 nKng m?i m Text LCD khng c, bZng viBc .-c ng<Xc t; GLCD vo AVR, chng ta c th1 th`c hiBn nhi/u php logic hnh (hay mDt n:, mask) lm cho viBc hi1n thS GLCD thm th vS. CS2 v CS1 (Chip Select): nh< ti . trnh by trong phLn trn, mYi chip KS0108 chU c kh2 nKng .i/u khi1n m*t GLCD c kch th<?c 64x64, trn cc GLCD 128x64 c 2 chip KS0108 lm viBc cng nhau, mYi chip .2m nhiBm m*t n[a LCD, 2 chn CS2 v CS1 cho php ch-n m*t chip KS0108 .1 lm viBc. Thng th<Qng n>u CS2=0, CS1=1 th nCa tri .<Xc kch ho:t, ng<Xc l:i khi CS2=1, CS1=0 th nCa ph2i .<Xc ch-n. Chng ta sc hi1u r h@n cch phRi hXp lm viBc c^a 2 nCa GLCD trong phLn kh2o st b* nh? c^a LCD. 2. TK chOc bD nh-. Chip KS0108 c m*t lo:i b* nh? duy nh5t . l RAM, khng c b* nh? chGa b* font hay chGa m font t` t:o nh< chip HD44780U c^a Text LCD. V vAy, d[ liBu ghi vo RAM sc .<Xc hi1n thS tr`c ti>p trn GLCD. MYi chip KS0108 c 512 bytes RAM t<@ng Gng v?i 4096 ch5m trn m*t nCa (64x64) LCD. RAM c^a KS0108 khng cho php truy cAp t;ng bit m theo t;ng byte, .i/u ny c ngh\a l mYi lLn chng ta vi>t m*t gi trS vo m*t byte no . trn RAM c^a GLCD, sc c 8 ch5m bS tc .*ng, 8 ch5m ny nZm trn cng 1 c*t. V l do ny, 64 dng GLCD th<Qng .<Xc chia thnh 8 pages, mYi page c .* cao 8 bit v r*ng 128 c*t (c2 2 chip g*p l:i). Hnh 3 m t2 b/ mDt m*t GLCD v c7ng l cch sMp x>p RAM c^a cc chip KS0108. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 176 Hnh 3. Te chGc c^a RAM. Te chGc RAM c^a 2 chip KS0108 tri v ph2i hon ton t<@ng t`, viBc .-c hay ghi vo RAM c^a 2 chip c7ng .<Xc th`c hiBn nh< nhau. Chng ta sc ch-n nCa tri GLCD .1 kh2o st. Nh< b:n th5y trn hnh 3, 64 dng t; trn xuRng d<?i .<Xc chia thnh 8 dy m ta g-i l 8 pages. Page trn cng l page 0 v page d<?i cng la page 7. Trong cc GLCD, page cn .<Xc g-i l .Sa chU X (X address), hay ni cch khc X=0 l .Sa chU c^a page trn cng, t<@ng t` nh< th>, X=7 l .Sa chU c^a page d<?i cng. MYi page chGa 64 c*t (chU xt 1 chip KS0108), mYi c*t l m*t byte RAM 8 bit, mYi bit t<@ng Gng v?i 1 ch5m trn LCD, bit c tr-ng sR th5p (LBS - tGc bit D0 nh< trong hnh 3) t<@ng Gng v?i ch5m trn cao nh5t. Bit c tr-ng sR cao nh5t (MBS - tGc bit D7 nh< trong hnh 3) t<@ng Gng v?i ch5m th5p nh5t trong 1 page. ThG t` cc c*t trong 1 page g-i l .Sa chU Y (Y address), nh< th> c*t .Lu tin c .Sa chU Y = 0 trong khi c*t cuRi cng c .Sa chU Y l 63. BZng cch phRi hXp .Sa chU X v .Sa chU Y chng ta xc .Snh .<Xc vS tr c^a byte cLn .-c hoDc ghi. Chip KS0108, t5t nhin, sc hY trX cc lBnh di chuy1n .>n .Sa chU X v Y .1 ghi hay .-c RAM. Hy quan st hnh 4 .1 xem cch m m*t ch[ ci a .<Xc hi1n thS trn GLCD. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 177
Hnh 4. Hi1n thS ch[ ci a trn GLCD. Trong cch hi1n thS W hnh 4, ch[ a chU nZm trong page 0, tGc X=0. MuRn hi1n thS ch[ ci a chng ta cLn ghi vo cc c*t (.Sa chU Y) c^a page 0 lLn l<Xt cc gi trS nh< sau: 0, 228, 146, 74, 252 v 128., xem b2ng bn d<?i.
3. T]p l0nh cho chip KS0108. B2ng 2 tm tMt cc lBnh c^a chip KS0108. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 178
So v?i HD44780U c^a Text LCD, lBnh cho KS0108 c^a GLCD .@n gi2n v t h@n v v th> vi>t ch<@ng trnh .i/u khi1n GLCD c7ng t<@ng .Ri dI h@n Text LCD. C t5t c2 7 lBnh (Instruction) c th1 giao ti>p v?i KS0108. Ti sc lLn l<Xt gi2i thch ngh\a v cch sC dHng c^a t;ng lBnh. - Display ON/OFF Hi1n thS GLCD: lBnh ny cho php GLCD hi1n thS n*i dung trn RAM ra b/ mDt GLCD. b1 vi>t lBnh ny cho GLCD, 2 chn RS v RW cLn .<Xc ko xuRng mGc th5p (RS=0: .y l Instrucion, RW=0: AVR->GLCD). M lBnh (code) .<Xc chGa trong 7 bit cao (D7:1) v bit D0 chGa thng sR. Quan st b2ng 2, dI th5y m lBnh nhS phn cho Display ON/OFF l 0011111x (0x3E+x) trong . x=1: cho php GLCD hi1n thS, x=0: tMt hi1n thS. - Set Address ch-n .Sa chU: .ng h@n .y l lBnh ch-n c*t hay ch-n .Sa chU Y. Hai bit D7 v D6 chGa m lBnh (01000000=0x40=64) v 6 bit cn l:i chGa chU sR c^a c*t muRn di chuy1n .>n. Ch l mYi nCa GLCD c 64 c*t nn cLn 6 bit .1 chGa chU sR ny (26=64). VAy lBnh ny c d:ng 0x40+Y. V dH n>u chng ta muRn di chuy1n .>n c*t 36 chng ta ghi vo GLCD m lBnh: 0x40+36. Hai chn RS v RW .<Xc gi[ W mGc th5p khi th`c hiBn lBnh ny. - Set Page ch-n trang: lBnh cho php ch-n page (hay .Sa chU X) cLn di chuy1n .>n, do GLCD chU c 8 pages nn chU cLn 3 bit .1 chGa .Sa chU page. M lBnh cho lBnh ny c d:ng 0xB8+X. Trong . bi>n X l chU sR page cLn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 179 di chuy1n .>n. Hai chn RS v RW .<Xc gi[ W mGc th5p khi th`c hiBn lBnh ny. - Display Start Line ch-n line .Lu tin: hay cn g-i l lBnh cu*n, lBnh ny cho php di chuy1n ton b* hnh 2nh trn GLCD (hay RAM) ln pha trn m*t sR dng no ., chng ta g-i l LOffset. SR l<Xng LOffset c th1 t; 0 .>n 63 nn cLn 6 bit chGa gi trS ny. M lBnh Display Start Line c d:ng 0xC0+LOffset. Hai chn RS v RW .<Xc gi[ W mGc th5p khi th`c hiBn lBnh ny. Khi di chuy1n GLCD ln pha trn, phLn d[ liBu pha trn bS che khu5t sc cu*n xuRng pha d<?i. Hnh 5 l m*t v dH cu*n GLCD ln 20 dng.
- Status Read .-c tr:ng thi GLCD: .y l m*t trong 2 lBnh .-c t; GLCD. C7ng giRng nh< v?i Text LCD, lBnh .-c tr:ng thi GLCD ch^ y>u .1 xt bit BUSY (bit thG 7) xem GLCD c .ang bAn hay khng, lBnh ny sc .<Xc dng .1 vi>t m*t hm wait_GLCD chQ cho .>n khi GLCD r2nh. V .y l lBnh .-c t; GLCD nn chn RW ph2i .<Xc set ln mGc 1 tr<?c khi th`c hiBn, chn RS van W mGc th5p (.-c Instruction). - Write Display Data ghi d[ liBu cLn hi1n thS vo GLCD hay RAM: v .y l 1 lBnh ghi d[ liBu hi1n thS nn chn RS cLn .<Xc set ln 1 tr<?c khi th`c hiBn, chn RW gi[ W mGc 0. LBnh ny cho php ghi m*t byte d[ liBu vo RAM c^a KS0108 v c7ng l d[ liBu sc hi1n thS ln GLCD t:i vS tr hiBn hnh c^a 2 con tr_ .Sa chU X v Y. 8 bit d[ liBu ny sc t<@ng Gng v?i 8 ch5m trn c*t Y W page X. Ch l sau lBnh Write Display Data, .Sa chU c*t Y t` .*ng .<Xc tKng ln 1 v v th> n>u c m*t d[ liBu m?i .<Xc ghi, d[ liBu m?i sc khng . ln d[ liBu c7. ViBc tKng t` .*ng .Sa chU Y r5t c lXi cho viBc ghi d[ liBu lin ti>p, n gip gi2m thQi gian set l:i .Sa chU c*t Y. Sau khi th`c hiBn ghi W c*t Y=63 (c*t cuRi cng trong 1 page, .Ri v?i 1 chip KS0108), Ysc v/ 0. - Read Display Data .-c d[ liBu hi1n thS t; GLCD (c7ng l d[ liBu t; RAM c^a KS0108): lBnh .-c ny m?i so v?i Text LCD, n cho php chng ta .-c ng<Xc 1 byte d[ liBu t; RAM c^a KS0108 t:i vS tr hiBn hnh v/ SU T!M V BIN SO#N B%I NTINSIDE Ntinside 180 AVR. Sau khi . .-c .<Xc gi trS t:i vS tr hiBn hnh, chng ta c th1 th`c hiBn cc php Logic nh< .2o bit, or hay andlm tKng kh2 nKng thao tc hnh 2nh. Tr<?c khi th`c hiBn .-c chng ta cLn di chuy1n .>n vS tr muRn .-c bZng 2 lBnh set .Sa chU X v Y, sau khi .-c gi trS .Sa chU page X v c*t Y khng thay .ei, do . n>u .-c ti>p m khng di chuy1n .Sa chU th van thu .<Xc gi trS c7. III. AVR v Graphic LCD. 1. Trnh tX giao tiQp GLCD. So v?i Text LCD th viBc giao ti>p v?i GLCD dI h@n nhi/u v GLCD c t Instruction h@n, GLCD chU c m*t lo:i b* nh? l RAM t<@ng Gng tr`c ti>p v?i mn hnh hi1n thS, GLCD khng c cursor nn khng cLn set cursor, GLCD chU hY trX giao ti>p 8 bit nn khng cLn bAn tm ch-n mode, qu trnh khWi .*ng cho GLCD v th1 r5t .@n gi2n bZng cch g-i lnh DISPLAY ON/OFF. Trong hnh 5 ti trnh by qu trnh khWi .*ng v sC dHng GLCD.
Hnh 5. Trnh t` giao ti>p v?i GLCD. Sau khi khWi .*ng GLCD bZng hm DISPLAY ON chng ta c th1 set .Sa chU X v Y .1 ghi d[ liBu, thAm ch c th1 ghi d[ liBu m khng cLn set X, Y. Tuy nhin, cLn nhMc l:i l c .>n 2 chip KS0108 trn GLCD 128x64, v vAy t5t c2 cc qu trnh ./u ph2i th`c hiBn cho 2 chip. 2. AVR giao tiQp v-i GLCD trong WinAVR. PhLn ny ti trnh by cch .i/u khi1n hi1n thS GLCD 128x64 bZng vi .i/u khi1n AVR trong mi tr<Qng C c^a WinAVR. Hnh thGc l m*t th< viBn hm giao ti>p GLCD trong 1 file header c tn l myGLCD.h. Cc hm SU T!M V BIN SO#N B%I NTINSIDE Ntinside 181 trong th< viBn bao gPm (ch l phLn code trong List 0 khng nZm trong file myGLCD.h): List 0. Cc hm c trong th< viBn myGLCD. Tr<?c khi vi>t cc hm giao ti>p LCD chng ta cLn .Snh ngh\a m*t sR macro v bi>n. Hy t:o 1 file Header c tn myGLCD.h v vi>t cc .o:n code bn d<?i vo file ny (bMt .Lu t; List 1). List 1. bSnh ngh\a cc bi>n thay th> SU T!M V BIN SO#N B%I NTINSIDE Ntinside 182 Do GLCD khng hY trX b* font, n>u muRn hi1n thS cc k t` chng ta cLn .Snh ngh\a chng trong m*t b2ng font (t<@ng t` tr<Qng hXp ma trAn LED), file font.h . .<Xc t:o tr<?c v include vo th< viBn myGLCD (dng 2). bPng thQi, b* font sc .<Xc chGa trong b* nh? ch<@ng trnh (FLASH) nn cLn cc hm hY trX .-c FLASH, chng ta include file pgmspace.h phHc vH cho viBc ny (dng 3). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 183 cbi v sbi l 2 macro .<Xc dHng .1 xa v set 1 bit trong 1 thanh ghi. V dH cbi(PORTA, 5) l xa bit 5 trong thanh ghi PORTA v/ 0. Do WinAVR khng hY trX tuy xu5t tr`c ti>p cc bit nn cLn .Snh ngh\a 2 macro ny hY trX (dng 5, 6). Tm .<Qng DATA sc .<Xc dnh cho 1 PORT, cc dng 8, 9 v 10 .Snh ngh\a PORT trn AVR dnh cho DATA, trong v dH ny l PORTB. T<@ng t` cc .<Qng .i/u khi1n c7ng nZm trn cng 1 PORT, cc dng 14, 15, 16 .Snh ngh\a PORT dnh cho cc .<Qng .i/u khi1n (PORTD chFng h:n), sau . chng ta .Snh ngh\a thG t` chn trn PORT .i/u khi1n k>t nRi v?i cc chn EN, RW, RS, CS1 v CS2 c^a GLCD (xem cc dng t; 18 .>n 22). Chng ta .Snh ngh\a ti>p 2 macro .1 kch ho:t v stop GLCD W cc dng 25 v 26 v cc ho:t .*ng ny .<Xc dng r5t nhi/u khi giao ti>p v?i GLCD. Ti>p theo chng ta .Snh ngh\a 4 m lBnh (Instruction code) c^a 4 hm Display on/off, Set Address, Set page v Display Start Line m ti . trnh by W trn (cc dng t; 29 .>n 32). CuRi cng l .Snh ngh\a vS tr bit BUSY khi .-c tr:ng thi GLCD. Sau phLn .Snh ngh\a chng ta sc bMt .Lu vi>t code truy cAp GLCD, .o:n code trnh by trong List 2 chGa cc hm hY trX. List 2. Cc hm hY trX. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 184 Hm GLCD_Delay() th`c hiBn delay kho2ng 16 chu kN my, hm ny .<Xc dng .1 chQ LGCD .-c hay ghi d[ liBu sau khi chn EN .<Xc kch. M*t nt m?i W .y l ti sC dHng ngn ng[ ASM chn vo C, d chU l chn hm nop nh<ng n ni cho b:n bi>t rZng avr-gcc cho php chng ta chn ASM, ti sc trnh by chi ti>t cc v dH chn ASM phGc t:p h@n trong m*t bi khc. Hm GLCD_OUT_Set() W dng 5 set cc PORT giao ti>p trn AVR (DATA v Control) c h<?ng Ouput. Hm GLCD_IN_Set() W dng 12 set SU T!M V BIN SO#N B%I NTINSIDE Ntinside 185 cc PORT giao ti>p c h<?ng Input (dng khi .-c t; GLCD -> AVR). Hm GLCD_SetSide(char Side) W dng 19 ch-n chip KS0108 tri hoDc ph2i .1 thao tc, trong . Side=1 th m*t nCa GLCD bn ph2i .<Xc ch-n bZng cch reset bit CS1=0 v CS2=1 (cc dng 22, 23), ng<Xc l:i nCa bn tri .<Xc kch ho:t, CS1=1, CS2=0 (dng 26 v 27). List 3 trnh by phLn code cho 4 hm truy cAp Instruction GLCD c@ b2n vi>t l:i cho cc hm Status Read, Display On/Off, Set Address, Set page v Display Start Line trch t; b2ng 2. List 3. Cc hm truy cAp Instruction. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 186 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 187 T5t c2 cc hm trong List 3 ./u truy cAp Instruction nn chn RS lun .<Xc ko xuRng mGc th5p, trong 5 hm trn, hm wait_GLCD sC dHng Instruction .-c tr:ng thi t; GLCD nn chn RW sc .<Xc ko ln cao, trong 4 hm cn l:i chn RW W mGc th5p. Hm wait_GLCD(void), c7ng t<@ng t` nh< hm wait_LCD() trong tr<Qng hXp Text LCD, hm ny chQ GLCD r2nh bZng cch .-c tr:ng thi GLCD v ki1m tra bit BUSY, n>u BUSY bZng 1 th GLCD .ang bAn, BUSY=0 tGc GLCD r2nh. Cc dng 4, 5, 6 chu]n bS cc .<Qng DATA, RS, RW cho qu trnh .-c Instruction t; GLCD (RS=0, RW=0), W dng 8 chn EN .<Xc ko ln cao bZng macro GLCD_ENABLE (.Snh ngh\a trong list 1). NhMc l:i chGc nKng c^a chn EN, khi EN=1 GLCD bMt .Lu qu trnh giao ti>p do cc chn RS, RW xc lAp (trong tr<Qng hXp ny l .-c Instruction t; GLCD), chng ta cLn chQ m*t kho2ng thQi gian ngMn cho GLCD .]y thanh ghi tr:ng thi ra cc .<Qng DATA bZng hm GLCD_Delay() trong dng 9. Ti>p theo g-i GLCD_DISABLE .1 ko chn EN xuRng mGc 0 .1 k>t thc qu trnh .-c (m*t xung . .<Xc t:o trn chn EN), v bMt .Lu ki1m tra bit BUSY. Dng 12 l m*t vng lDp while ki1m tra xem n>u bit BUSY trong gi trS .-c v/ (gi trS .-c v/ chGa trong thanh ghi PIN c^a PORT DATA trn AVR), n>u BUSY=1 (bit_is_set) vng lDp ti>p tHc v?i viBc t:o m*t xung khc trn chn EN (cc dng ) rPi quay l:i ki1m tra bit BUSY. N>u BUSY bZng 0, GLCD . r2nh, vng lDp while .<Xc gi2i thot, qu trnh chQ k>t thc. Hm GLCD_SetDISPLAY(uint8_t ON) cho php GLCD hi1n thS khi tham sR ON=1, hoDc tMt khi tham sR ON=0. Tr<?c khi set GLCD chng ta cLn chQ cho GLCD r2nh bZng cch g-i hm wait_GLCD() W dng 20, sau . xc lAp cc chn RS, RW sdn sng cho qu trnh gWi m lBnh vo GLCD (dng 21, 22 v 23). Tr<?c khi kch ho:t qu trnh, cLn chu]n bS m lBnh sdn sng trn .<Qng d[ liBu, dng 25: GLCD_DATA_O=GLCD_DISPLAY+ON, trong . GLCD_DISPLAY l m lBnh c^a hm Display On/Off .<Xc .Snh ngh\a trong List 1, bi>n ON bo GLCD tMt hay mW. Sau khi m-i thG . sdn sng, m*t xung .<Xc t:o ra trn chn EN (cc dng t; 26 .>n 28). Qu trnh set Display th`c hiBn v k>t thc. Hm void GLCD_SetYADDRESS(uint8_t Col) l hm vi>t l:i cho Insrtuction ch-n .Sa chU Y (c*t) cLn thao tc, tham sR Col trong hm ny chnh l chU sR c*t, Col c gi trS t; 0 .>n 63. N*i dung hm ny hon ton giRng hmGLCD_SetDISPLAY, chU c m*t .i1m khc duy nh5t l m hm khc, m GLCD_YADDRESS .<Xc dng (xem dng 36:GLCD_DATA_O = GLCD_YADDRESS+Col). SU T!M V BIN SO#N B%I NTINSIDE Ntinside 188 Hm void GLCD_SetXADDRESS(uint8_t Line) l hm vi>t l:i cho Insrtuction ch-n .Sa chU X (page) cLn thao tc, tham sR Line trong hm ny chnh l chU sR page, Line c gi trS t; 0 .>n 8. N*i dung hm ny hon ton giRng hmGLCD_SetXADDRESS, nh<ng m GLCD_XADDRESS .<Xc dng thay cho GLCD_YADDRESS,(xem dng 36:GLCD_DATA_O = GLCD_XADDRESS+Line). Hm void GLCD_StartLine(uint8_t Offset) l hm vi>t l:i cho Insrtuction cu*n GLCD, chU sR Offset l gi trS cu*n ln. Xem l:i v dH hnh cu*n GLCD trong phLn gi2i thch c^a lBnh Display Start Line, v?i tr<Qng hXp ny hm GLCD_StartLine(20) . .<Xc g-i. List 4 trnh by 2 hm vi>t v .-c d[ liBu hi1n thS ln GLCD. List 4. Cc hm thao tc d[ liBu. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 189 Hai hm trong list 4 thao tc d[ liBu hi1n thS trn GLCD nn chn RS ph2i .<Xc set bZng 1. Hm GLCD_WriteDATA(uint8_t DATA) ghi m*t byte vo RAM c^a KS0108, byte ny c7ng sc .<Xc hi1n thS ln GLCD, vS tr ghi vo l vS tr hiBn hnh c^a con tr_ X v Y (2nh h<Wng bWi cc qu trnh ghi tr<?c . hoDc do cc hm set .Sa chU), tham sR DATA l byte cLn ghi. N*i dung bn trong hm ny c7ng giRng nhG cc hm trong list 3. bi1m khc l chn RS .<Xc SU T!M V BIN SO#N B%I NTINSIDE Ntinside 190 ko ln .1 bo .y l qu trnh thao tc d[ liBu (dng 6: sbi(GLCD_CTRL_O, GLCD_RS)). Gi trS gWi .>n GLCD chnh l tham sR DATA nh< trong dng 8: GLCD_DATA_O=DATA. Hm uint8_t GLCD_ReadDATA(void) .-c gi trS hi1n thS trn t; GLCD vo AVR, chn RW cLn .<Xc set ln 1 .1 bo qu trnh ny l .-c (dng 22: sbi(GLCD_CTRL_O, GLCD_RW)). Chn EN .<Xc kch ln 1 tr<?c (dng 24:GLCD_ENABLE;) v chQ m*t kho2ng thQi gian ngMn tr<?c khi .-c gi trS t; cc .<Qng DATA vo m*t bi>n t:m DATA nh< trong dng 26: DATA=GLCD_DATA_I;. Sau khi tr2 gi trS v/ bZng dng lBnh 30: return DATA, th qu trSnh .-c k>t thc. V?i cc hm . t:o chng ta . c th1 .i/u khi1n .1 hi1n thS GLCD, cc ch<@ng trnh con trong List 5 v List 6 sC dHng cc hm trn .1 th`c hiBn m*t sR nhiBm vH hi1n thS c@ b2n. Chng ta g-i l cc ch<@ng trnh con mW r*ng. List 5. Cc ch<@ng trnh con mW r*ng. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 191 Hm void GLCD_Init(void) khWi .*ng GLCD. Tr<?c h>t, chng ta ph2i ch-n chip KS0108 .1 khWi .*ng, dng 4: GLCD_SetSide(0) ngh\a l ch-n chip KS0108 bn tri tGc nCa tri GLCD. Chng ta khWi .*ng nCa tri GLCD bZng viBc cho php hi1n thS (dng 5: GLCD_SetDISPLAY(1)), di chuy1n con tr_ v/ vS tr .Lu tin trn GLCD v?i 2 hm ch-n .Sa chU W cc SU T!M V BIN SO#N B%I NTINSIDE Ntinside 192 dng 6 v 7, ch-n gi trS cu*n l 0 W dng 8: GLCD_StartLine(0). Sau . lDp l:i qu trnh khWi .*ng cho nCa ph2i c^a GLCD (xem cc dng t; 10 .>n 14). Hm void GLCD_GotoXY(uint8_t Line, uint8_t Col) di chuy1n con tr_ hi1n thS .>n .Sa chU X v Y. Tham sR Line l .Sa chU X (tGc l page, gi trS t; 0 .>n 7), tham sR Col l .Sa chU Y hay chnh l c*t. Hm ny cho php di chuy1n trn ton b* GLCD, ngh\a l bi>n Col c kho2ng gi trS t; 0 .>n 127, v th> tr<?c h>t chng ta ph2i xc .Snh vS tr cLn duy chuy1n .>n thu*c nCa no c^a GLCD, n>u Col<64 th vS tr . thu*c nCa tri, ng<Xc l:i n thu*c v/ nCa ph2i. Dng 19 chng ta chia Col cho 64 v gn phLn nguyn k>t qu2 cho 1 bi>n t:m tn l Side (Side=Col/64 ), r rng n>u Col<64 th Side=0, ng<Xc l:i Side=1. Bi>n Side .<Xc dng lm tham sR cho hm GLCD_SetSide(Side) W dng 20, v?i cch th`c hiBn ny chng ta . t` .*ng ch-n nCa GLCD m .i1m cLn di chuy1n .>n thu*c vo. Do hm ch-n .Sa chU Y (hm GLCD_SetYADDRESS xt W trn) chU ch-n .Sa chU trong ph:m vi 1 nCa LCD, nn chng ta cLn cAp nhAt l:i gi trS c^a c*t Col, dng 21 th`c hiBn viBc ny: Col -= 64*Side. Sau dng 21, gi trS Col .<Xc cAp nhAt l:i t; 0 .>n 63 v .<Xc ch-n lm c*t khi hmGLCD_SetYADDRESS(Col) W dng 22 .<Xc g-i. CuRi cng l ch-n .Sa chU X W dng 23:GLCD_SetXADDRESS(Line). Hm void GLCD_Clr(void) xa ton b* mn hnh GLCD (c2 2 nCa GLCD). M5u chRt c^a viBc xa GLCD l vi>t gi trS 0 vo t5t c2 cc vS tr trong RAM, cu lBnh: GLCD_WriteDATA(0) W 2 dng 29 v 33 th`c hiBn .i/u ny. Qu trnh xa .<Xc th`c hiBn trn t;ng chip KS0108, c 2 vng vDp for .<Xc dng l v th>, ch dng lBnh 28: GLCD_GotoXY(Line,0) .<a con tr_ v/ c*t .Lu c^a page thG Line, nCa tri GLCD. Trong khi ., dng lBnh 32: GLCD_GotoXY(Line,64) .<a con tr_ v/ c*t .Lu c^a page thG Line, nCa ph2i GLCD (c*t 64 c^a GLCD l c*t .Lu tin c^a nCa bn ph2i). List 6. Cc ch<@ng trnh con mW r*ng (tt).. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 193 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 194 by l 3 ch<@ng trnh con cuRi cng trong th< viBn myGLCD. Trong . c 2 hm in cc k c kch th<?c 7x8 (7 c*t, 8 dng) .<Xc .Snh ngh\a trong b2ng font v 1 hm in ton b* mn hnh GLCD v?i m*t hnh kch th<?c 128x64. Hm void GLCD_PutChar78(uint8_t Line, uint8_t Col, uint8_t chr) cho php in k t` c m ascii l bi>n chr, bi>n Line l .Sa chU X (0 .>n 7) v bi>n Col l .Sa chU c*t Y (0 .>n 127). PhLn phGc t:p nh5t trong ch<@ng trnh con ny l viBc xt tr<Qng hXp c s` chuy1n bn (tri qua ph2i) khi in. V mYi k t` .<Xc .Snh ngh\a bZng 7 bytes trong b2ng font, t<@ng Gng v?i 7 c*t trn GLCD, n>u chng ta muRn in k t` t:i vS tr 60 trn GLCD, cc byte thG 0 1, 2, 3 nZm W vS tr c*t 60, 61, 62 v 63 c^a nCa tri trong khi cc byte thG 4, 5 v 6 l:i nZm W cc c*t 0, 1 v 2 c^a nCa bn ph2i. Chng ta ph2i nhAn ra s` chuy1n bn ny .1 chuy1n chip KS0108 cLn thao tc. Chng ta chia qu trnh in ra 2 tr<Qng hXp, tr<Qng hXp c s` chuy1n bn v tr<Qng hXp cn l:i khng chuy1n bn (k t` nZm tr-n bn tri hoDc ph2i). C5u trc If dng trong dng 4 ki1m tra xem c s` chuy1n bn x2y ra hay khng: if ((Col>57) && (Col<64)), n>u c*t Col l?n h@n 57 v nh_ h@n 63 th sc c m*t s` chuy1n bn x2y ra (v 1 k t` chi>m 7 c*t trn GLCD). Chia qu trnh in thnh 2 vng lDp for, vng for thG nh5t (dng 6) in t; vS tr Col .>n vS tr c*t c^a nCa tri v vng lDp for thG 2 W dng 9 in t; c*t .Lu tin c^a nCa GLCD bn ph2i .>n byte cuRi cng c^a k t` cLn in. Tr<Qng hXp ng<Xc l:i, khng c s` chuy1n bn x2y ra, chng ta in bnh th<Qng (xem cc dng t; 12 .>n 15). Ch l d[ liBu ghi vo GLCD l5y t; b2ng font7x8 .<Xc .Snh ngh\a trong file font.h, b2ng font .<Xc vi>t sdn trong b* nh? FLASH c^a AVR, viBc .-c n*i dung FLASH th`c hiBn bZng hm pgm_read_byte, b:n xem l:i bi .i/u khi1n ma trAn LED .1 hi1u thm. Hm void GLCD_Print78(uint8_t Line, uint8_t Col, char* str) cho php in m*t chuYi k t` hay 1 cu ln GLCD, hm ny c7ng giRng hm in chuYi m chng ta . th`c hiBn trong tr<Qng hXp c^a Text LCD (modified code), m*t .i1m khc ti thm vo l cho phep xuRng dng n>u cu cLn in v<Xt qu 1 dng. Cc cu lBnh bn trong .i/u kiBn if (dng 23 .>n 27) th`c hiBn xuRng dng n>u cLn thi>t. Qu trnh in sau . diIn ra bnh th<Qng bZng cch g-i hm GLCD_PutChar78. CuRi cng l hm void GLCD_PutBMP(char *bmp) th`c hiBn in m*t hnh c kch th<?c 128x64 .<Xc .Snh ngh\a tr<?c ln ton b* mn hnh GLCD (in .). Qu trnh in c7ng kh .@n gi2n v?i viBc .-c n*i dung hnh trong FLASH v gWi .>n GLCD. CLn chia thnh 2 qu trnh in cho 2 nCa tri v ph2i (2 vng lDp for trong 2 dng 38 v 43). D[ liBu hnh .<Xc ghi trong FLASH c .Snh kch th<?c 128x8 pages= 1024 bytes, .Snh d:ng l 1 m2ng SU T!M V BIN SO#N B%I NTINSIDE Ntinside 195 c 1024 phLn tC, mYi phLn tC l 1 con sR d:ng byte, mYi sR t<@ng Gng 8 ch5m c^a 1 c*t trong 1 page. Cc con sR .<Xc sMp x>p thnh 8 dng t<@ng Gng 8 pages, mYi dng c 128 phLn tC t<@ng Gng 128 c*t GLCD. GLCD c kh2 nKng ty bi>n hi1n thS cao, . l c@ h*i cho b:n th1 hiBn s` sng t:o ~, trong th< viBn myGLCD ti chU trnh by m*t sR ch<@ng trnh con c@ b2n, phLn cn l:i thu*c v/ b:n. Hy sC dHng cc hm truy xu5t trong myGLCD .1 vi>t cc ch<@ng trnh con hi1n thS khc nh< vc .<Qng thFng, .<Qng trn, hm sine, cosine hay b5t kN hm sR noHope to hear from you soon. IV. V d5 =iTu khiGn Graphic LCD bMng th9 vi0n myGLCD. PhLn ny ti sc minh h-a cch sC dHng th< viBn myGLCD.h .1 in tr`c ti>p d[ liBu ln GLCD, hi1n thS cc k t` trong b2ng font7x8 v hnh 2nh ln GLCD. SC dHng phLn m/m Proteus vc m*t m:ch .iBn gPm 1 GLCD 128x64 (keyword: LGM12641BS1R), 1 chip Atmega32 v 1 bi>n trW (keyword: POT-LIN) nh< trong hnh 6. T:o 1 Project bZng WinAVR c tn l myGLCD v t:o file source l main.c, t:o Makefile v?i khai bo s[ dHng chip ATmega32 v clock 8MHz. Copy file myGLCD.h v font.h vo th< mHc c^a Project m?i t:o. Vi>t code cho file main.c nh< trong list 7. Ch cc .Snh ngh\a chn k>t nRi v?i LCD trong phLn .Lu file myGLCD.h ph2i giRng v?i k>t nRi thAt trong hnh 6. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 196 Hnh 6. M:ch .iBn m ph_ng Graphic LCD v?i AVR. List 7. Ch<@ng trnh demo giao ti>p GLCD. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 197 SU T!M V BIN SO#N B%I NTINSIDE Ntinside 198 b1 sC dHng th< viBn myGLCD, chng ta cLn include file myGLCD.h vo Project nh< trong dng 4, #include "myGLCD.h". Hai dng 9 v 10 th`c hiBn khWi .*ng v xa LCD. Ti th`c hiBn 4 demo in ln GLCD. Trong cc dng t; 12 .>n 17 th`c hiBn ghi tr`c ti>p gi trS ln GLCD bZng hm GLCD_WriteDATA, k>t qu2 l 1 dy cc ch5m c .* r*ng 8 bit nZm W page 4 c^a GLCD (xem hnh bn d<?i). Ch l .1 in h>t c2 chi/u ngang c^a GLCD cLn th`c hiBn 2 lLn in trn 2 nCa GLCD.
Cc dng lBnh t; 21 .>n 27 th`c hiBn in 97 k t` trong b2ng font7x8 bMt .Lu bZng m ascii 33 (k t` !), bi>n Line l .Sa chU page .<Xc khWi t:o bZng 0 khi khai bo trong dng 7. Bi>n Col l .Sa chU c*t, Col c7ng .<Xc khWi t:o bZng 0. Dng 32 in k t` c m i ln GLCD t:i vS tr page=Line, c*t=Col. Sau khi m*t k t` .<Xc in, Col sc .<Xc tKng ln 8 vS tr (dng 24), chng ta dnh 8 c*t trn GLCD cho m*t k t` 7x8 .1 trnh cc k t` dnh v?i nhau. N>u Col l?n h@n 127 th m*t qu trnh xuRng dng cLn th`c hiBn, khi . reset Col v/ 0 v tKng bi>n Line thm 1 (dng 25). Cc k t` sc .<Xc in lLn l<Xt trn GLCD v?i 1 kho2ng delay. Cc dng t; 31 .>n 35 m t2 cch dng hm GLCD_Print78 .1 in cc chuYi k t` hay cc cu. Dng 23 in t; code ln GLCD t:i vS tr page=4, c*t=20. Ch hm sprintf trong dng 33, .y l m*t hm c^a ngn ng[ C, hm ny cho php chuy1n m*t sR thnh m*t chuYi cc k t`, trong v dH ny ti th`c hiBn chuy1n sR 8205 thnh chuYi 8205, k>t qu2 chGa trong bi>n dis, bi>n ny l 1 m2ng cc k t` hay con tr_ .>n m2ng cc k t`. Sau ., dng 34 in chuYi dis ln GLCD. Demo cuRi cng l in 1 hnh 128x64 ln GLCD bZng hm GLCD_PutBMP(hiGLCD) v sau . th`c hiBn animation (m*t ki1u ho:t hnh) bZng hm GLCD_StartLine. Dng 38 in m*t hnh c tn hiGLCD .<Xc .Snh ngh\a tr<?c trong file font.h ra GLCD. Cc dng 40 .>n 44 cu*n mn hnh GLCD ln trn .1 th`c hiBn animation. Bi>n i l bi>n offset .<Xc cho ch:y t; 1 .>n 63, sau mYi lLn cu*n chng ta delay m*t kho2ng thQi gian ngMn .1 th5y GLCD cu*n. Hy tham kh2o thm bi gi?i thiBu phLn m/m G.Edit .1 bi>t cch t:o code hnh 2nh cho Graphic LCD SU T!M V BIN SO#N B%I NTINSIDE Ntinside 199 C cho AVR
Nh< ti . trnh by W cc bi h-c tr<?c, khi b:n . hi1u AVR, .1 th`c hiBn cc Gng dHng, b:n c th1 khng nh5t thi>t ph2i lun lAp trnh bZng Assembly(ASM). Ngn ng[ c5p cao nh< C sc gip cho b:n xy d`ng cc Gng dHng nhanh chng v dI dng h@n, tuy nhin khng v th> m b:n qun ASM, lAp trnh bZng C k>t hXp ASM l gi2i php hay nh5t. M*t ch l chng ta chU sC dHng C .1 .@n gi2n ha lAp trnh tnh ton, c5u trc .i/u khi1nlAp trnh C cho AVR khng c ngh\a l b:n khng cLn bi>t c5u trc v cch thGc ho:t .*ng c^a chip. Ti khng c .Snh ni v/ ngn ng[ C W .y nh<ng chU gi?i thiBu m*t cch c@ b2n nh5t v/ cch vi>t ch<@ng trnh cho AVR bZng C, cH th1 l C trong avr-gcc. b1 c th1 hi1u v vi>t nh[ng ch<@ng trnh phGc t:p h@n, b:n cLn t` trang bS ki>n thGc v/ C, ti liBu ny sc khng gip b:n phLn .. Tuy nhin, n>u b:n ch<a t;ng lAp trnh bZng C th b:n c7ng yn tm .-c ti liBu ny, v t ra ti sc gi2i thch nh[ng g ti vi>t. I. MDt sI khi ni0m C cho AVR. M*t ch<@ng trnh C cho AVR th<Qng bao gPm cc thnh phLn nh<: ch thch (comments), bi1u thGc (expressions), cu lBnh (statements), khRi (blocks), ton tC, c5u trc .i/u khi1n (Flow controls), hm (functions) Ch thch (comments): c 2 cch .1 t:o phLn ch thch trong C l ch thch t;ng dng bZng 2 d5u // nh< trong dng .Lu c^a .o:n v dH //day la chu thich, khong duoc bien dich hoDc ch thch block bZng cch kip block cLn ch thch vo gi[a /* .*/ v dH: /* Ban co the type bat ky chu thich nao trong block nay Ngay ca khi ban xuong dong Phan chu thich thuong co mau chu la green */ TiTn xU l (preprocessor): l m*t tiBn ch c^a ngn ng[ C, cc preprocessor .<Xc trnh bin dSch xC l tr<?c t5t c2 cc phLn khc, cc preprocessor c chGc nKng t<@ng t` cc Directive trong ASM cho AVR.Cc preprocessor .<Xc bMt .Lu bZng d5u #, trong sR cc preprocessors trong ngn ng[ C c hai preprocessors .<Xc sC dHng phe bi>n nh5t l #include v#define. Preprocessor #include chU .Snh 1 file .<Xc .nh km trong qu trnh bin dSch (t<@ng .<@ng .INCLUDE trong ASM) v #define .1 .Snh ngh\a 1 chuei thay th> hoDc 1 macro. Xem cc v dH sau: #include /*.nh km n*i dung file io.h trong lc bin dSch (file io.h nZm trong th< mHc con avr c^a th< mHc include trong th< mHc ci .Dt c^a WinAVR).*/ #define max (a,b) ((a)>(b)? (a): (b)) /*.Snh ngh\a m*t macro tm sR l?n nh5t trong 2 sR a v b, trong ch<@ng trnh n>u b:n g-i x=max(2,3) th k>t qu2 thu .<Xc x=3.*/ SU T!M V BIN SO#N B%I NTINSIDE Ntinside 200 BiGu thOc (Expressions): l 1 phLn c^a cc cu lBnh, bi1u thGc c th1 bao gPm bi>n, ton tC, g-i hm, bi1u thGc tr2 v/ 1 gi trS .@n. Bi1u thGc khng ph2i l 1 cu lBnh hon chUnh. V dH: PORTB=val. Cu l0nh (Statement): th<Qng l 1 dng lBnh hon chUnh, c th1 bao gPm cc keywords, bi1u thGc v cc cu lBnh khc v .<Xc k>t thc bZng d5u ;. V dH: unsigned char val=1; val*=2; l cc cu lBnh. KhIi (Blocks): l s` k>t hXp c^a nhi/u cu lBnh .1 th`c hiBn chung 1 nhiBm vH no ., khRi .<Xc bao bWi 2 d5u mW khRi { v .ng khRi }: v dH 1 khRi: while(1){ PORTB=val; _delay_loop_2(65000); val*=2; if (!val) val=1; } Ton tU (Operators): l nh[ng k hiBu bo cho trnh bin dSch cc nhiBm vH cLn th`c hiBn, cc b2ng bn d<?i tm tMt cc ton tC C dng cho lAp trnh AVR: B@ng 1 cc ton tU =3i sI: dng th`c hiBn cc php ton .:i sR quen thu*c, trong . .ng ch l cc ton tC ++ (tKng thm 1) v -- (b?t .i 1), ch phn biBt y=x++ v y=++x, v dH ta c x=3 trong khi y=x++ ngh\a l gn x cho y rPi sau . tKng x thm 1, .i/u ny khng 2nh h<Wng .>n y (cuRi cng y=3, x=4) trong khi y=++x ngh\a l tKng x tr<?c rPi m?i gn cho y (cuRi cng y=x=4), t<@ng t` cho cc tr<Qng hXp c^a ton tC -- .
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 201 B@ng 2 Ton tU truy c]p v kch thOc: ton tC [] th<Qng .<Xc sC dHng khi b:n dng m2ng trong lc lAp trnh, phLn tC thG c^a m2ng sc .<Xc truy xu5t thng qua [i], ch m2ng trong C bMt .Lu t; 0.
B@ng 3 Ton tU Logic v quan h0: th`c hiBn cc php so snh v logic, th<Qng .<Xc dng lm .i/u kiBn trong cc c5u trc .i/u khi1n, ch ton tC so snh bZng ==, ton tC ny khc v?i ton tC gn =, trong khi y = x ngh\a l l5y gi trS c^a x gn cho y th (y== x) ngh\a l n>u y bZng x.
B@ng 4 Ton tU thao tc Bit (Bitwise operator): l cc ton tC th`c hiBn trn t;ng bit nhS phn c^a cc con sR, cc ton tC dSch tri r5t th<Qng .<Xc sC dHng khi sC l sR. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 202
B@ng 5 cc ton tU khc: l 1 sR ton tC .Dc biBt r5t hay sC dHng nh<ng chng ta th<Qng khng .1 v vai tr c^a chng r5t dI nhAn th5y. bDc biBt ch ton tC ?: l 1 ton tC r5t .Dc biBt c^a C so v?i cc ngn ng[ lAp trnh khc, ?: l ton tC 3 ngi duy nh5t c th1 dng thay th> cho c5u trc if .@n gi2n.
II. CLu trc =iTu khiGn v hm. 2.1 C?u trc $i7u khi;n (Flow Controls). Cc c5u trc .i/u khi1n bi>n t<Wng c^a b:n thnh hiBn th`c. M*t sR c5u trc .i/u khi1n c@ b2n trong C nh< sau: If (=iTu ki0n) statement;: n>u .i/u kiBn l .ng th th`c hiBn statement theo sau, statement c th1 .<Xc trnh by cng dng hoDc dng sau .i/u khi1n If. bi/u kiBn c th1 l m*t bi1u thGc b5t kN, c th1 l s` k>t hXp c^a nhi/u .i/u kiBn bZng cc ton tC quan hB AND (&&), OR (||)bi/u kiBn .<Xc cho l .ng khi n khc 0, v dH if (1) th .i/u kiBn hi1n nhin l .ng. Xt m*t vi v dH dng c5u trc if nh< sau: If (!val) val=1; ngh\a l n>u val bZng 0 th ch<@ng trnh sc gn cho val gi trS l 1, ! l ton tC NOT, NOT c^a m*t sR khc 0 th bZng 0, ng<Xc l:i, NOT c^a 0 th thu .<Xc k>t qu2 l 1. Trong v dH ny, n>u val bZng 0 th !val sc bZng 1, nh< th> .i/u kiBn sc trW thnh .ng v cu lBnh val=1 .<Xc th`c thi. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 203 If (x==1 && y==2) result=A; ngh\a l n>u x bZng 1 v y bZng 2 th gn k t` A cho bi>n result. Trong v dH ny, ton tC logic && .<Xc sC dHng .1 nRi 2 .i/u kiBn l:i, b:n hon ton c th1 sC dHng nhi/u ton tC logic khc n>u cLn thi>t. Trong tr<Qng hXp b:n muRn th`c thi nhi/u cu lBnh cng lc n>u m*t .i/u kiBn no . th_a th b:n cLn .Dt t5t c2 cc cu lBnh . trong 1 khRi nh< bn d<?i: If (.i/u kiBn) { Statement1; Statement2;
} If (=iTu ki0n ) statement1; else statement2; : n>u .i/u kiBn .ng th th`c hiBn statement1, ng<Xc l:i th`c thi statement2. ViBc .Dt cc statement v else..trn cng 1 dng hay trn nh[ng dng khc nhau ./u khng 2nh h<Wng .>n k>t qu2. T<@ng t` tr<Qng hXp trn, n>u c nhi/u statements th cLn .Dt chng trong 1 khRi. If (.i/u kiBn) { Statement1; Statement2;
}else { Statement1; Statement2;
} Ngoi ra, b:n c7ng c th1 .Dt nhi/u c5u trc ifelse lPng vo nhau. CLu trc switch: trong tr<Qng hXp c nhi/u kh2 nKng c th1 x2y ra cho 1 bi1u thGc (hay 1 bi>n), Gng v?i mYi kh2 nKng b:n cLn ch<@ng trnh th`c hiBn m*t viBc no ., khi ny b:n nn sC dHng c5u trc switch. C5u trc ny .<Xc trnh by nh< bn d<?i. switch (bi1u thGc) { case hZng_sR_1: cc statement1; break; case hZng_sR_2: cc statement2; SU T!M V BIN SO#N B%I NTINSIDE Ntinside 204 break;
default: cc statement khc; } Hy xt 1 v dH b:n k>t nRi 2 chip AVR v?i nhau, 1 chip lm Master sc ra cc lBnh .i/u khi1n chip Slaver, chip Slaver nhAn m lBnh t; Master v th`c hiBn cc cng viBc .<Xc tho2 hiBp tr<?c. Gi2 sC m lBnh .<Xc l<u trong bi>n Command, d<?i .y l ch<@ng trnh v dH cch xC l c^a chip Slaver Gng v?i t;ng m lBnh. switch (Command) { case 1: PWM=255; ON_Motor(); break; case 2: PWM=0; OFF_Motor();; break;
default: Get_Cmd(); break; }Ngoi ra, b:n c7ng c th1 .Dt nhi/u c5u trc ifelse lPng vo nhau. N>u Command=1, gn gi trS 255 cho bi>n PWM v g-i ch<@ng trnh con ON_Motor(). Trong tr<Qng hXp ny, break .<Xc sC dHng, break ngh\a l thot kh_i c5u trc .i/u khi1n hiBn t:i ngay lAp tGc, nh< vAy sau khi th`c hiBn 2 lBnh, switch k>t thc m khng cLn xt .>n cc tr<Qng hXp khc. By giQ, n>u Command=2, gn gi trS 0 cho bi>n PWM v g-i ch<@ng trnh con OFF_Motor(), trong t5t c2 cc tr<Qng hXp cn l:i (default), th`c hiBn ch<@ng trnh con Get_Cmd(). while (=iTu ki0n ) statement1;: l m*t c5u trc lDp (Loop), ngh\a c^a c5u trc while l khi .i/u kiBn cn .ng th sc th`c hiBn statement1 (hoDc cc statements n>u chng .<Xc .Dt trong 1 khRi {} nh< trong tr<Qng hXp c^a if .<Xc gi?i thiBu W trn). C]n thAn, b:n r5t dI r@i vo m*t vng lDp khng lRi thot v?i while n>u .i/u kiBn lun lun .ng. for (biGu_thOc_1; biGu_thOc_2; biGu_thOc_3) statement;: l m*t c5u trc lDp khc, trong c5u trc for, bi1u_thGc_1 th<Qng .<Xc hi1u l khWi t:o, SU T!M V BIN SO#N B%I NTINSIDE Ntinside 205 bi1u_thGc_2 l .i/u kiBn v bi1u_thGc_3 l bi1u thGc .<Xc th`c hiBn sau. C5u trc for ny t<@ng .<@ng v?i c5u trc while sau: bi1u_thGc_1; while (bi1u_thGc_2){ statement; bi1u_thGc_3; } Cc bi1u thGc trong c5u trc for c th1 vMng mDt trong c5u trc nhung cc d5u ; th khng .<Xc b_. N>u b:n vi>t for( ; ; ) t<@ng .<@ng v?i vng lDp v tAn while (1). C5u trc for th<Qng .<Xc dng .1 th`c hiBn 1 hay nh[ng cng viBc no . trong sR lLn no ., v dH bn d<?i th`c hiBn xu5t cc gi trS t; 0 .>n 200 ra PORTB, sau mYi lLn xu5t sc g-i lBnh delay trong 65000 chu kN my. for (uint8_t i=0; i<=200; i++){ PORTB=i; _delay_loop_2(65000); } Ch , b:n c th1 th`c hiBn viBc khai bo 1 bi>n (xem phLn khai bo bi>n bn d<?i) ngay trong c5u trc for n>u bi>n lLn .Lu .<Xc sC dHng. V dH trn .<Xc hi1u nh< sau: khai bo 1 bi>n i ki1u byte khng m, gn gi trS khWi .Lu cho i=0 (chU th`c hiBn 1 lLn duy nh5t), ki1m tra .i/u kiBn i<=200 (nh_ h@n hoDc bZng 200), n>u .i/u kiBn cn .ng, th`c hiBn 2 statements trong block {}, sau . quay v/ .1 th`c hiBn i++ (tKng i thm 1) rPi l:i ki1m tra .i/u kiBn i<=200 v qu trnh lDp l:i. Nh< th> .o:n code trong {} .<Xc th`c thi kho2ng 201 lLn tr<?c khi bi>n i bZng 201 v .i/u kiBn i<=200 sai. 2.2 Hm (Functions). Ngn ng[ C bao gPm tAp hXp c^a r5t nhi/u hm, mYi hm th`c hiBn m*t chGc nKng cH th1, cc hm trong C th<Qng .<Xc thi>t k>t r5t nh_ g-n, .1 c cc hm phGc t:p ng<Qi dng cLn t` t:o ra. Hm C cho AVR .<Xc .Snh ngh\a trong th< viBn avr-libc, ngoi cc hm C thng th<Qng, avr-libc cn chGa r5t nhi/u cc hm ring dng ring cho chip AVR, cc hm ny .<Xc khai bo trong cc file header ring, .1 sC dHng hm no, b:n cLn #include file header t<@ng Gng (tham kh2o ti liBu avr-libc user manual .1 bi>t thm chi ti>t, trong ti liBu ny, khi cLn sC dHng m*t hm no ti sc ni r file header cLn thi>t). V dH: _delay_loop_2(65000) l m*t hm .<Xc .Snh ngh\a trong file delay.h (trong th< mHc C:\WinAVR\avr\include\util), hm ny th`c hiBn SU T!M V BIN SO#N B%I NTINSIDE Ntinside 206 viBc delay kho2ng 65000 chu kN my. C 4 hm delay b:n c th1 sC dHng sau khi include file . l: _delay_loop_1(uint8_t __count) : delay theo m*t sR lLn chu kN my nh5t .Snh (bi>n __count), sR l<Xng chu kN delay l sR 8 bit (t; 0 .>n 255). _delay_loop_2(uint16_t __count) : delay theo m*t sR lLn chu kN my nh5t .Snh (bi>n __count), sR l<Xng chu kN delay l sR 16 bit (t; 0 .>n 65535). (Ch : th`c ch5t 2 hm delay trn .<Xc .Snh ngh\a trong file header delay_basic.h). _delay_us(double __us): delay 1 microsecond. _delay_ms(double __ms): delay 1 milisecond. Ch : .1 dng 2 hm _delay_us v _delay_ms cLn .Snh ngh\a tLn sR xung clock trong Makefile (bi>n F_CPU), sC dHng 2 hm ny tr`c ti>p th<Qng cho k>t qu2 khng nh< mong muRn, ti sc trnh by cch sC dHng 2 hm ny trong v dH bn d<?i. Main: m*t ch<@ng trnh C cho AVR ph2i bao gPm 1 ch<@ng trnh chnh main, t5t c2 cc n*i dung chnh sc .<Xc .Dt bn trong ch<@ng trnh chnh. C5u trc ch<@ng trnh chnh c th1 nh< sau: int main(void){ //noi dung chinh return 0; //gia tri tra ve cho chuong trinh chinh } Trong ., int l ki1u gi trS tr2 v/ c^a main, t; kha void ni rZng ch<@ng trnh chnh c^a chng ta khng cLn b5t kN tham sR no km theo. Cn r5t nhi/u cc v5n ./ lin quan .>n C cho AVR, chng ta sc tm hi1u trong lc vi>t cc v dH cH th1. III. V d5 minh hRa. b1 minh h-a cc khi niBm v ph<@ng php lAp trnh C cho AVR, ti sc gi2i thch v dH qut LED vi>t bZng C m chng ta th`c hiBn trong bi h<?ng dan WinAVR. bo:n code .<Xc trnh by trong List 1. List 1. v dH qut LED bZng C.
//file: main.c //Description: AVR1 by GCC, "Cung hoc AVR" Series #include <avr/io.h> SU T!M V BIN SO#N B%I NTINSIDE Ntinside 207
10 11 12 13 14 15 #include <util/delay.h> unsigned char val=1; int main(void){ DDRB=0xFF; //set PORTB as output lines while(1){ PORTB=val; _delay_loop_2(65000); val*=2; if (!val) val=1; } return 0; } Tr<?c h>t l preprocessor .nh km cc file khi bin dSch, #include l .nh km file header io.h, file ny th`c ra khng ph2i l file chGa cc thng tin v/ chip nh<ng n sc lm m*t nhiBm vH trung gian l .nh km 1 file khc t<@ng Gng v?i bi>n MCU trong Makefile, v dH trong Makefile, MCU=atmega8 th dng #include .<Xc th`c thi, file iom8.h .<Xc t` .*ng .nh km km vo v file iom8.h m?i th`c ch5t chGa cc .Snh ngh\a cho chip ATmega8 (cc .Snh ngh\a v/ .Sa chU thanh ghi, kch th<?c b* nh?,). bi/u ny gip b:n khng cLn nh? h>t t5t c2 cc file header c^a t;ng chip AVR. N>u khng an tm, b:n c th1 thm dng #include iom8.h sau khi include io.h (=iTu ny khng th]t sX c>n thiQt). Ngoi ra, m^i l>n include file io.h sE c 4 file header khc =9Wc tX =Dng =nh km l avr/sfr_defs.h, avr/portpins.h, avr/common.h, v avr/version.h. Tm l3i b3n c>n (hoZc ph@i) include file io.h v khai bo lo3i chip AVR trong file Makefile (dng MFile, nh9 h9-ng d`n C trn) l c thG an tm viQt ch9.ng trnh C cho AVR. - Dng thG 4 include file header delay.h .1 sC dHng lBnh delay nh< . ./ cAp W trn. - Dng 5 : khai bo 1 bi>n tn val trong b* nh? SRAM, ki1u c^a val l unsigned char l ki1u d[ liBu 8 bit khng d5u c kho2ng gi trS t; 0 .>n 255. Bi>n val .<Xc dng lm bi>n t:m .1 chGa gi tr<?c khi xu5t ra PORTB. Bi>n trong C .<Xc khai bo bZng cch .Dt ki1u bi>n tr<?c sau . tn bi>n. M*t sR kiu d[ liBu c@ b2n trong C .<Xc tm tMt trong b2ng 6. B2ng 6 cc ki1u d[ liBu trong C. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 208 Tn kiGu dP li0u (Data type) SI byte Kho@ng dP li0u (Range) char 1 127 to 127 or 0 to 255 unsigned char 1 0 to 255 signed char 1 127 to 127 int 2 32,767 to 32,767 unsigned int 2 0 to 65,535 signed int 2 Nh< ki1u int short int 2 Nh< ki1u int unsigned short int 2 0 to 65,535 signed short int 2 Nh< ki1u short int long int 4 2,147,483,647 to 2,147,483,647 signed long int 4 Nh< ki1u long int unsigned long int 4 0 to 4,294,967,295 long long int 8 (2 63 1) to 2 63 1 (C99 only) signed long long int 8 same as long long int (C99 only) unsigned long long int 8 0 to 2 64 1 (C99 only) float 4 6 digits of precision SU T!M V BIN SO#N B%I NTINSIDE Ntinside 209 Tn kiGu dP li0u (Data type) SI byte Kho@ng dP li0u (Range) double 8 10 digits of precision long double 12 10 digits of precision M*t sR ki1u d[ liBu thng dHng nh5t l char (1 byte), int (2 byte) v float. T; kha unsigned .<Xc thm tr<?c 1 ki1u d[ liBu nguyn .1 chU .Snh cc sR nguyn d<@ng, khi . kho2ng gi trS nguyn sc .<Xc tKng ln gLn 2 lLn. V dH char chU cc sR nguyn t; -127 .>n 127 th<Qng .<Xc dng .1 chU m ASCII c^a cc k t` trong b2ng m ASCII, nh<ng unsigned char sc bao gPm cc sR nguyn d<@ng t; 0 .>n 255 v th<Qng .<Xc dng khi lm viBc v?i cc thanh ghi 8 bit. Ngoi ra, avr-libc cn .Snh ngh\a m*t sR ki1u d[ liBu thay th>, chng ta c th1 dng cc ki1u d[ liBu ny thay cho cc ki1u thng th<Qng, xem tm tMt nh< bn d<?i.
M*t khai bo uint8_t val t<@ng .<@ng usigned char val, sC dHng ki1u khai bo no l do thi quen c^a ng<Qi sC dHng. Ch l theo mDc .Snh, m*t bi>n m?i .<Xc khai bo theo cch thng th<Qng nh< trn sc .<Xc .Dt trong SRAM, nh< cc b:n . bi>t SRAM trong AVR t<@ng .Ri nh_ v th> nn khai bo v sC dHng hXp l bi>n, .;ng khai bo qu nhi/u bi>n n>u b:n khng sC dHng h>t, .;ng khai bo ki1u bi>n qu l?n so v?i gi trS thAt sC dHng, tuy nhin c7ng khng .<Xc khai bo ki1u d[ liBu c kch th<?c qu nh_ so v?i gi trS m bi>n . c th1 v<@n t?i. SC dHng b* nh? ch<@ng trnh (flash program memory) .1 l<u tr[ d[ liBu khng .ei l m*t kg thuAt khc .1 ti>t kiBm b* SRAM, ti sc ./ cAp v5n ./ ny trong 1 bi khc. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 210 CuRi cng v/ viBc khai bo bi>n, m*t bi>n c th1 .<Xc gn gi trS khWi t:o ngay lc khai bo nh< trong tr<Qng hXp c^a chng ta, bi>n val=1 lc .<Xc khai bo. - Dng 6 int main(void){ bMt .Lu ch<@ng trnh chnh. - Dng 7: DDRB=0xFF gn gi trS hexadecimal 0xFF (11111111) cho thanh thi .i/u khi1n c^a Port B, DDRB, Port B khi . sc trW thnh Port xu5t - Dng 8 while (1){: bMt .Lu 1 vng lDp v tAn. - Dng 9 v dng 10: xu5t val ra PORTB v g-i lBnh delay. - B:n cLn ch 11 v 12, 2 dng ny c chGc nKng xoay gi trS c^a bi>n val .1 xu5t ra PORTB t:o hiBu Gng xoay vng.val*=2 .<Xc hi1u l val=val*2, .y l 1 ki1u vi>t thu g-n c^a C, n>u ton h:ng thG nh5t v k>t qu2 tr2 v/ l cng 1 bi>n, chng ta c th1 b_ b?t 1 tn bi>n v di chuy1n ton tC v/ bn ph2i ton tC gn =. V dH: i = i + 6 .<Xc rt g-n thnh i + = 6.
Nh< th> sau cu lBnh val*=2 gi trS c^a val .<Xc tKng ln 2 lLn. ngh\a thAt s` c^a viBc g5p .i bi>n val l g? Hy nhn vo gi trS nhS phn c^a val, lc khai bo val, chng ta gn cho val = 1 hay val = 00000001 (nhS phn), sau khi g5p .i lLn thG nh5t, val = 2=00000010, ti>p tHc g5p .i lLn thG hai, val = 4=00000100c th1 b:n . th5y chuyBn g x2y ra? by l cu tr2 lQi: trong thao tc v?i sR nhS phn, g5p .i m*t sR ngh\a l di chuy1n sR . sang tri 1 vS trQu trnh g5p .i sc ti>p diIn .>n lc val = 128=10000000, n>u ti>p tHc g5p .i, b:n ngh\ val = 256 ? Tuy nhin b:n nh? rZng chng ta . khai bo bi>n val c ki1u unsigned char (8 bits), trong khi . 256=100000000 (9 bits), n>u gn val = 256, chU c 8 bits th5p (00000000) c^a 256 sc .<Xc gn cho val, k>t qu2 l val = 0. Ni m*t cch khc, sau khi val=128, val = 0, cu lBnh: if (!val) val=1; sc gip cho qu trnh qut lDp quay l:i t; .Lu n>u val = 0. M-i thG . r. CuRi cng v ch<@ng trnh chnh c^a chng ta c ki1u int (int main) chng ta cLn tr2 v/ m*t gi trS no ., return 0; th`c hiBn tr2 v/ 0 (b:n c th1 tr2 v/ gi trS no ty ).
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 211 Thi#t l)p Fuse Bits
AVR c m*t sR m:ch .iBn hay cc thi>t bS hY trX bn trong, viBc .i/u khi1n cc m:ch .iBn ny .<Xc th`c hiBn thng qua cc Fuse bits. V dH bn trong cc chip AVR c b* t:o dao .*ng cho chip, muRn hay khng muRn sC dHng b* t:o dao .*ng ny chng ta sc set cc Fuse bits t<@ng Gng. Nh< th>, Fuse bits c7ng giRng nh< cc cLu ch hay cc cng tMc cGng nRi AVR v?i cc m:ch .iBn hY trX. V l cc cng tMc cGng nn chng ph2i .<Xc set ring biBt, khng set .<Xc bZng lBnh "m/m". MYi lo:i AVR c sR l<Xng m:ch .iBn hY trX khc nhau v v th> sR l<Xng Fuse bits sc khc nhau. VS tr cc Fuse bits c7ng khc nhau trn mYi lo:i AVR tuy nhin tn g-i th nh< nhau. Ti sc dng chip ATmega32 lm minh h-a. Chip ATmega32 c 16 Fuse bits .<Xc bR tr trong 2 byte g-i l Fuse High Byte v Fuse Low Byte. VS tr cc Fuse bits khng quan tr-ng nh<ng tn g-i v chGc nKng th cLn kh2o st. B2ng 1 tm tMt cc bits trong Fuse High Byte v b2ng 2 tm tMt cc bits trong Fuse Low Byte. B2ng 1. Fuse High Byte
B2ng 2. Fuse Low Byte SU T!M V BIN SO#N B%I NTINSIDE Ntinside 212
ba sR cc ch<@ng trnh n:p chip ./u hY trX n:p Fuse bits. Cc Fuse .<Xc n:p .*c lAp .Ri v?i file ch<@ng trnh. Cc phLn m/m n:p nh< PonyProg, phLn m/m n:p trong CodevisionAVR, Bascom, ICCAVRhY trX set t;ng Fuse bit m*t trong khi m*t sR ch<@ng trnh nh< avrdude chU hY trX n:p cc byte Fuse, n>u muRn sC dHng cc ch<@ng trnh n:p ny .1 n:p Fuse b:n cLn tnh ton gi trS 2 byte Fuse tr<?c. M*t ch r5t quan tr-ng l .Ri v?i cc Fuse bits, gn gi tr7 0 cho 1 Fuse bit .Png ngh\a v?i Fuse bit . .<Xc lAp trnh (programmed), trong khi 1 ngh\a l khng .<Xc lAp trnh (unprogrammed). Ti sc sC dHng phLn m/m PonyProg .1 lm minh h-a n:p Fuse bits cho chip ATmega32. Tr<?c khi n:p Fuse bits b:n cLn ch-n device v lo:i m:ch n:p trong PonyProg (xem l:i bi M:ch n:p). b1 n:p Fuse bits b:n hy ch-n menu Command/Security and Configuration Bits hoDc nh5n Ctrl+S (m:ch n:p ph2i .<Xc nRi sdn v?i my tnh v m:ch AVR). Nh5n nt Read .1 .-c cc c5u hnh Fuse bits trn chip c^a b:n, n>u .y l lLn .Lu tin chip ATmega32 c^a b:n .<Xc n:p Fuse bits th b:n sc thu .<Xc k>t qu2 c5u hnh cc Fuse bits nh< trong hnh 1.
SU T!M V BIN SO#N B%I NTINSIDE Ntinside 213 Hnh 1. C5u hnh Fuse bits mDc .Snh trn chip ATmega32. Chng ta sc lLn l<Xt kh2o st cc Fuse bit theo nhm chGc nKng c^a chng. 1. JTAGEN (JTAG Enable): trn AVR c tch hXp sdn b* JTAG, . l m*t module giao ti>p v?i phLn cGng c^a chip. Nhn chung, JTAG th<Qng .<Xc dng .1 ki1m tra ho:t .*ng c^a chip, trn AVR JTAG th<Qng .<Xc dng .1 n:p ch<@ng trnh v phe bi>n h@n l Debug lYi ch<@ng trnh (gl rRi ch<@ng trnh). Module JTAG lm viBc thng qua 4 chn TCK, TMS, TDO v TDI, trn chip ATmega32 4 chn lLn lLn l<Xt l PC2, PC3, PC4 v PC5. Theo mDc .Snh JTAG .<Xc kch ho:t, bit JTAGEN=0 (programmed) nh< trong hnh 1, v th> v?i cc chip ATmega32 m?i mua v/, cc chn PC2:5 trn PORTC c th1 khng sC dHng .1 xu5t nhAp thng th<Qng .<Xc. N>u b:n khng muRn sC dHng chGc nKng Debug tr`c ti>p trn chip th hy uncheck bit JTAGEN(uncheck t<@ng .<@ng unprogrammed, t<@ng .<@ng JTAGEN=1) .1 dng cc chn JTAG nh< cc chn xu5t nhAp thng th<Qng. 2. OCDEN (On Chip Debug Enable): AVR cho php chng ta gl rRi ch<@ng trnh tr`c ti>p trn chip thng qua module JTAG. Bit OCDEN cho php th`c hiBn Debug trn chip, n>u b:n c m*t m:ch Debug cho AVR nh< m:ch JTAG ICE c^a Atmel (xem bi Debug v?i JTAG ICE) v b:n muRn debug ch<@ng trnh th hy set bit OCDEN bZng 0 (check vo OCDEN). B:n cLn nh? rZng, khi lAp trnh cho bit OCDEN th AVR sc ho:t .*ng trong mode Debug, trong mode ny chip sc W trong tr:ng thi ng^ (Sleep mode), b:n chU c th1 th`c hiBn Debug m khng th1 ch:y ch<@ng trnh thAt. Theo mDc .Snh, OCDEN khng .<Xc lAp trnh v ch> .* Debug .<Xc v hiBu ha. LQi khuyn l b:n nn .1 bit ny unprogrammed tr<?c khi .<a chip vo sC dHng. (.;ng .Hng vo bit ny n>u b:n khng c .Snh Debug trn chip). 3. BODEN (Brown-Out Detection Enable) v BODLEVEL(BOD Level): AVR c sdn m*t m:ch .iBn Brown- Out Detection, hi1u nm na l m:ch pht hiBn sHt .iBn p nguPn, n>u fuse BODEN .<Xc lAp trnh th m:ch BOD .<Xc kch ho:t, khi . fuse bit BODLEVEL ch-n mGc .iBn p c^a BOD, n>u BODLEVEL=1 (unprogrammed) th mGc .iBn p BOD mDc .Snh l 2.7V, ng<Xc l:i n>u BODLEVEL .<Xc lAp trnh th mGc .iBn p BOD l 4.0V. Khi m:ch BOD .<Xc sC dHng, n>u .iBn p VCC gi2m xuRng th5p h@n mGc .iBn p BOD th 1 Reset BOD x2y ra. N>u khng thAt s` cLn thi>t hy .1 cc bit ny khng .<Xc lAp trnh nh< mDc .Snh. Hnh 2 m t2 m*t s` kiBn BOD trn AVR.
Hnh 2. S` kiBn BOD trn AVR. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 214 4. EESAVE (EEPROM Erase SAVE): n>u bit EESAVE .<Xc lAp trnh (bZng 0), th b* nh? EEPROM sc khng bS xa khi xa chip, ng<Xc l:i EESAVE =1 (unprogrammed) th EEPROM sc bS xa theo chip. 5. BOOT LOADER: .y l m*t tnh nKng r5t hay trn cc chip AVR m?i (ch khng ph2i dng AVR no c7ng c Boot Loader), Boot Loader l phLn b* nh? ch<@ng trnh .<Xc kch ho:t .Lu tin khi khWi .*ng chip. Boot Loader trn cc chip AVR .<Xc bR tr pha d<?i c^a b* nh? ch<@ng trnh (xem l:i bi 2, c5u trc AVR). Boot Loader th<Qng .<Xc sC dHng .1 ghi hoDc .-c n*i dung b* nh? ch<@ng trnh, v th> Gng dHng phe bi>n nh5t c^a n l update ch<@ng trnh cho chip m*t m*t cch nhanh chng m khng cLn m:ch n:p. C@ ch> nh< sau: -Tr<?c h>t chng ta cLn c 1 ch<@ng trnh Boot Loader .<Xc n:p sdn trong phLn b* nh? Boot Loader (pha d<?i b* nh? ch<@ng trnh). Ch<@ng trnh ny c kh2 nKng giao ti>p v?i my tnh (thng qua UART chFng h:n) v .-c, ghi b* nh? ch<@ng trnh c^a chip. -Khi cLn update ch<@ng trnh m?i cho AVR, trn my tnh c 1 ch<@ng trnh giao ti>p v?i Boot Loader, k>t nRi AVR v?i my tnh, ch<@ng trnh trn my tnh sc gWi n*i dung cLn update cho AVR, ch<@ng trnh Boot Loader sc .-c n*i dung ny v ghi vo b* nh? ch<@ng trnh c^a AVR. BZng cch ny chng ta . n:p ch<@ng trnh cho AVR m khng cLn dng m:ch n:p. N:p ch<@ng trnh bZng Boot Loader cho php khch hng c^a b:n t` cAp nhAt cc chGc nKng m?i m khng cLn trao chip cho b:n. SC dHng hay khng sC dHng Boot Loader sc .<Xc xc lAp thng qua cc Fuse bits BOOTRST, BOOTSZ1 vBOOTSZ0. -BOOTRST (Select Reset Vector) : N>u Fuse bit BOOTRST khng .<Xc lAp trnh (bZng 1) th khi v;a khWi .*ng chip, con tr_ ch<@ng trnh sc nh2y .>n vS tr .Lu tin trong ch<@ng trnh (0x0000) .1 lLn l<Xt th`c thi phLn ch<@ng trnh nh< thng th<Qng. N>u BOOTRST .<Xc lAp trnh (bZng 0) th vS tr Reset l .Sa chU .Lu c^a phLn Boot Loader, khng ph2i .Sa chU 0x0000 nh< th<Qng lB. Khi . phLn ch<@ng trnh trong Boot Loader sc .<Xc th`c thi thay cho ch<@ng trnh chnh pha trn (xem hnh 3).
Hnh 3. hnh h<Wng c^a Fuse bit BOOTRST. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 215 -BOOTSZ1 v BOOTSZ0 (Select Boot Size): kch th<?c phLn b* nh? dnh cho Boot Loader khng .<Xc .Snh tr<?c, n>u Boot Loader khng .<Xc kch ho:t (fuse BOOTRST=1) th ton b* b* nh? ch<@ng trnh dnh cho ch<@ng trnh chnh. Khi Boot Loader .<Xc kch ho:t, 2 Fuse bits BOOTSZ1 v BOOTSZ0 sc quy>t .Snh kch th<?c Boot Loader. B2ng 3 tm tMt cc kch th<?c c^a phLn Boot Loader phH thu*c vo 2 bit BOOTSZ1:0. Ch l kch th<?c tnh theo INSTRUCTION WORD, v?i AVR 1 INSTRUCTION WORD = 2 bytes. Ph2i nhMc l:i .Ri v?i Fuse bits, gi trS 1 ngh\a l khng .<Xc lAp trnh (khng check trong PonyProg). N>u bit BOOTRST khng .<Xc lAp trnh th 2 bit BOOTSZ khng c tc dHng. B2ng 3. Kch th<?c Boot Loader.
Trong cc Gng dHng lAp trnh thng th<Qng, Boot Loader khng .<Xc quan tm, v th> tRi khuyn b:n nn .1 cc Fuse bit BOOTRST, BOOTSZ1:0 nh< mDc .Snh, khi no cLn sC dHng ti sc ni r (xem bi Debug v?i m:ch JTAG ICE). 6. ChRn NguVn Xung giP nh7p v thAi gian khCi =Dng (start-up times): by l phLn r5t .<Xc quan tm khi set Fuse bits. C .>n 7 Fuse bits tham gia vo viBc ny . l 4 bits CKSEL3:0, 2 bis SUT1:0 v bit CKOPT. Trong . 2 bit SUT1:0 ch^ y>u dng .1 ch-n thQi gian khWi .*ng, phLn ny khng 2nh h<Wng nhi/u trong hLu h>t cc tr<Qng hXp (t nh5t l cc v dH trong Cng h-c AVR) v th> ti sc b_ qua, chng ta .1 2 fuse bits nh< mDc .Snh, n>u start-up time thAt s` 2nh h<Wng .>n ch<@ng trnh c^a b:n, b:n hy tham kh2o thm phLn System Clock and Clock Option trong datasheet c^a chip. PhLn ny ti ch^ y>u trnh by cch ch-n nguPn xung gi[ nhSp cho chip. C t5t c2 5 lo:i nguPn xung gi[ nhSp chnh cho chip nh<ng .1 .@n gi2n chng ta chU xt 2 tr<Qng hXp l dng nguPn th:ch anh ngoi v dng xung gi[ nhSp .<Xc t:o bWi m:ch RC trong chip. Xung gi[ nhSp trong chip (xung n*i): HLu h>t cc chip AVR .<Xc trang bS 1 m:ch t:o xung gi[ nhSp RC bn trong, n>u sC dHng nguPn xung gi` nhSp ny chng ta c th1 b_ qua m:ch t:o xung bn ngoi. NguPn xung gi[ nhSp .<Xc t:o ra bn trong chip .<Xc cR .Snh W 1 trong 4 mGc : 1MHz, 2 MHz, 4 Mhz v 8 MHz. Cc Fuse bits CKSEL3:0 quy>t .Snh viBc ch-n nguPn xung ny. B2ng 4 tm tMt cch phRi hXp cc Fuse bits CKSEL .1 ch-n nguPn xung n*i. B2ng 4. Ch-n xung gi[ nhSp n*i bZng cc Fuse bits CKSEL. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 216
(Nomial frequency: tLn sR danh ngh\a, gi trS th`c c th1 khc do sai sR) bRi v?i chip ATmega32, nguPn xung n*i 1MHz .<Xc set mDc .Snh trn cc chip m?i. Xem l:i hnh 1 b:n th5y CKSEL3=0 (.<Xc checked), CKSEL2=0 (.<Xc checked), CKSEL1=0 (.<Xc checked), CKSEL0=1 (khng check). Cc hnh 4, 5, 6 v 7 bn d<?i gXi b:n cch ch-n nguPn xung n*i bZng phLn m/m n:p PonyProg, ch sau khi ch-n cc bits b:n ph2i nh5n bt Write .1 ghi vo chip.
Hnh 7. Ch-n nguPn xung n*i 8MHz (.Png thQi tMt JTAG, Boot Loader, BOD). Xung gi[ nhSp t; m:ch th:ch anh bn ngoi (Crystal): dng xung n*i c nh<Xc .i1m l t5n sR xung . .<Xc gi[ cR .Snh trong 4 mGc v t5n sR cao nh5t c th1 .:t l 8MHz trong khi AVR cho php lm viBc W 16Mhz, mDc khc sai sR c7ng t<@ng .Ri l?n khi xng xung n*i. Dng th:ch anh .1 t:o xung gi[ nhSp l m*t gi2i php tRt, c th1 t:o m*t m:ch th:ch anh .@n gi2n v nRi v?i 2 chn XTAL1 v XTAL2 c^a AVR nh< trong hnh 8. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 218
Hnh 8. M:ch t:o xung ngoi bZng th:ch anh. b1 bo cho AVR bi>t l chng ta muRn sC dHng th:ch anh ngoi lm m:ch t:o xung, hy set cc Fuse bits CKSEL3:0 thnh 1 trong 2 gi trS: 1111 hoDc 1010 (nhS phn). Trong tr<Qng hXp ny, Fuse bit CKOPT c tc dHng ch-n gi[a 2 ch> .* khuy>ch .:i, ch> .* CKOPT = 0 (programmed) thch hXp v?i th:ch anh c tLn sR l?n nh5t l 16MHz v CKOPT=1 (unprorgammed) khi tLn sR th:ch anh nh_ h@n hoDc bZng 8MHz. Cc hnh 9 v 10 gXi cch set Fuse bits .1 ch-n nguPn xung nhSp l m:ch th:ch anh ngoi v?i cc tLn sR l?n nh5t 8MHz v l?n nh5t 16MHz.
Hnh 9. Ch-n xung gi[ nhSp t; th:ch anh ngoi v?i tLn sR l?n nh5t l 8MHz. SU T!M V BIN SO#N B%I NTINSIDE Ntinside 219
Hnh 10. Ch-n xung gi[ nhSp t; th:ch anh ngoi v?i tLn sR l?n nh5t l 16MHz. Sau khi . ch-n cc Fuse bits, viBc cuRi cng v r5t quan tr-ng l ghi cc Fuse bits ny vo chuip bZng cch nh5n nt Write (PonyProg). bRi v?i cc ch<@ng trnh n:p chip khc, Fuse bits c7ng .<Xc set t<@ng t`.