2 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
3 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 1 : Ci t MPLAB IDE 8.36
1.1 Gii thiu MPLAB IDE l phn mm c h tr bi Microchip, dng soan tho code cho cc ng dung ca PIC. Hin tai, thng 8/2010 MPLAB IDE c phin bn 8.51. Trong ti liu ny ti chon phin bn 8.36 v n c kh nhiu li v cu hnh . Cc phin bn khc nh 8.43, ban c th khng chon cu hnh ban u nhng bn thn n c th tu ng tm kim cc th vin cn thit trong qu trnh bin dich. Vi phin bn 8.36 chng ta phi cu hnh ton b cho IDE. 1.2 Ci t MPLAB IDE 8.36 Bc 1 : Double Click vo file setup trong th muc MPLAB IDE 8.36. Mn hnh Welcome s hin ra nh sau. Ban chon Next tip tuc.
Hnh 1.1 : Welcome to MPLAB IDE 8.36
Bc 2 : Chon I accept the term of the license agreement v chon Next. 4 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 1.2 : License Agreement
Bc 3 : ch mc inh l ci t Complete v chon Next tip tuc.
Hnh 1.3 : Chon ci t complete
Bc 4 : Chon ng dn ci t, ta nn mc inh l C:\Program Files\Microchip\ 5 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 1.4 : Chon ng dn ci t
Bc 5 : Tip tuc chon I accept cho Maestro License v C32 License.
Bc 6 : Giao din sau tng kt lai cc lua chon ca ban, nhn Next tin hnh ci t. Nu mun hiu chnh ban nhn Back.
Hnh 1.7 : Bt u ci t
7 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 1.8 : Ch ci t xong
Bc 7 : Khi ci t xong MPLAB IDE s hi ban c cn ci Hi Tech khng. y l compiler C h tr cho MPLAB IDE, tuy nhin ta s khng dng compiler ny m s dng MPLAB C18. Ban chon No nhn Finish hon tt vic ci t MPLAB IDE.
Hnh 1.9 : Ci t hon tt
Thng bo di u xut hin, thng k cc ti liu hng dn i km. Cc ti liu ny u nm trong th muc ci t C:\Program Files\Microchip\ 8 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 1.10 : Cc ti liu hng dn
9 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 2 : Ci t compi!" MPLAB C18
2.1 Gii thiu Khi ci t xong MPLAB IDE, compiler mc inh cho n l MPASM, dng dich project vit bng ASM sang file HEX. Mun vit chong trnh bng C, ta cn phi ci t thm 1 compiler khc c h tr cho chip PIC ang dng. Trong phn ny, ti th nghim trn vi iu khin PIC18F4520 v chon compiler C18 h tr cho lp trnh C chun. 2.2 C#c $%c ci t Bc 1 : Double Click vo file MPLAB C18 V1.0.exe tin hnh ci t, mn hnh welcome ca MPLAB C18 s hin ra nh sau :
Hnh 2.1 : Welcome MPLAB C18
Bc 2 : Chon noi lu tr cho cc file bin dich ca MPLAB C18, ta c th mc inh l C:\mcc18 .
Hnh 2.2 : Chon ng dn lu tr
Bc 3 : Chon lua cc thnh phn ca gi MCC18, thng thng ta s chon ht tt c cc gi trong compier C18. 10 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 2.3 : Chon cc gi ci t
Bc 4 : Nhn Next tin hnh ci t
Hnh 2.4 : Ci t C18
Ch cho n khi ci t xong. 11 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 2.5 : Ch ci t C18
Bc 5 : Nhn Finish kt thc ci t MPLAB C18.
Hnh 2.6 : Kt thc ci t C18
2.3 C&p 'h&t (' C18 )!"*io' 3.+1 Phin bn m ta va ci t l C18 v1.0. cp nht ln v3.01, ta s double click v file MPLAB-C18-pgrade-doc-v3_01.exe. Mn hnh welcome s hin ra nh sau:
Hnh 2.7 : Welcome C18 update
Chon I Accept v nhn Next tip tuc ci t. 12 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 2.8 : License Agreement
Cc ti liu h tr lp trnh cho compiler C18 i km.
Hnh 2.9 : Cc ti liu hng dn
Chon th muc mc inh cho vic update (ging vi th muc ci t C18) 13 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
mc inh cc thnh phn s c ci t, khng cn phi check thm.
Hnh 2.10 : Cc gi ci t C18 v3.01
Check chon thm cc option di y MPLAB IDE tu ng cu hnh cc thng s tong thch vi phin bn C18 v3.01 14 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 2.11 : Chon cu hnh update cho MPLAB IDE
Chon Next tin hnh Update
Hnh 2.12 : Tin hnh ci t
Ch cho n khi hon tt. 15 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 2.13 : Ch cho n khi hon tt
Nhn Finish kt thc.
Hnh 2.14 : Ci t hon tt
16 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 3 : ,-o p"o.!ct t"(' MPLAB 8.36 ) C18 3.+1
Tao 1 project ln u trn MPLAB kh phc tap. Ngi s dung cn phi cu hnh cho MPLAB kh nhiu. Tuy nhin hu ht cc thng s cu hnh ny s c lu lai cho ln sau, chng ta ch cn phi thit lp 1 ln. Phn ny hng dn cch tao 1 project on gin trn MPLAB cho chip 18F4520 v mach nap PICKit2 trn board BKIT PIC. 3.1 ,-o mi p"o.!ct Kch hoat chong trnh MPLAB IDE 8.36 t biu tng Microchip trn mn hnh Desktop, ca s sau y s hin ra.
Hnh 3.1 : Mn hnh khi ng ca MPLAB IDE 8.36
Chon menu Project v chon New
Hnh 3.2 : Tao mi project
Ca s sau y hin ra, ban t tn cho project khung Project Name v chon ng dn cho n khung Project Directory. 17 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.3 : t tn v chon th muc lu tr
Ca s lm vic ca project s hin ra bn tri nh hnh di y. Nu ca s project khng hin ra ban s chon menu View v chon Project.
Hnh 3.4 : Ca s project
Chon compile C18 cho project ny bng cch chon vo menu Project v chon Select Language Toolsuite. 18 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.5 : Chon Language ToolSuite (Compiler)
Chon Active Toolsuite l Microchip C18 Toolsuite. Cc ng dn ca cc chong trnh trong gi compiler cho C18 c cu hnh trong lc ci t C18 upgrade, ban khng cn phi chnh lai. Cc gi ny u nm trong th muc C:\mcc18.
Hnh 3.6 : Chon compiler C18 3.2 C/u h0'h cho chip Phn ny c nh hng i vi qu trnh dich v nap cho chip. Chon menu Configure v chon Select Device. chon chip. 19 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.7 : Select Device
Giao din di y hin ra v ban chon cho ng chip m mnh ang dng. y ti chon chip PIC18F4520.
Nhn OK ng ca s ny lai. Tip theo l vic lua chon cu hnh thach anh v 1 s cu hnh khc. Ban vo lai menu Configure v chon Configuration Bits. 20 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.8 : Configuration Bits
Mn hnh ban cu hnh cho ch hoat ng ca chip di y hin ra. Check b du chon Configuration Bits set in code ban c th thay i cc thng s. Thng s u tin l ch thach anh, ty vo mi loai chip v thach anh m chon lua khc nhau. y ti s dung thach anh ngoi 12MHz nn s chon ch thach anh l HS (High Speed). Cc ch thach anh ca PIC18F4520 s c cp cc bi sau.
PORTB bit 4-0 ch mt inh l cc chn analog. Khi khng s dung analog ban cn phi chnh sang ch Digital khi reset.
Disable chc nng Low Voltage Programming (LVP - Nap in p thp), mach PICKit2 khng h tr chc nng ny.
Sau khi hon thnh ban check lai Configuration Bits set in code v ng ca s ny lai. 21 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.9 : Thit lp thach anh, PortB, LVP
3.3 ,-o mi 1i! ) 233 th% )i' cho p"o.!ct Bc tip theo l tao file source vit code. T toolbar ban c th chon New File hoc v menu File v chon New.
Hnh 3.10 : Tao mi source file 22 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Mt file mi c tao ra vi tn mc inh l Untitled nh hnh di y.
Hnh 3.11 : File mi c tao ra
Ban nhn v menu File v chon Save As. lu lai file ny. Ca s di y hin ra v ban chon ng dn lu cho chnh xc. Thng thng ta s lu trong th muc cha project hin tai cho d qun l.
Hnh 3.12 : Lu file trong th muc cha project
Nhn Save lu file vi tn mi l main.c v ng ca s trn lai. Bc tip theo l add file va mi lu (main.c) v th muc Source File ca project. Click chut phi vo Source File v chon Add Files. 23 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.13 : Add file vo Source Files
Chon ng dn n file main.c v nhn Open.
Hnh 3.14 : Browse ng dn n main.c
File main.c s c add vo muc Source File ca project nh hnh bn di. 24 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.15 : Add xong main.c cho Source Files
Tip theo ta s add cc th vin cho project. u tin l Header Files. Cng tong tu nh khi add file vo Source File, click chut phi v chon Add Files. Browse ng dn n C:\mcc18\h v chon file p18f4520.h hoc g tn file ny vo muc File name ri nhn Open.
Hnh 3.16 : Add Header File
Add file vo muc Linker Script, browse ng dn n C:\mcc18\lkr v chon file 18f4520.lkr. 25 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.17 : Add file Linker Script
Add file lib vo muc Library Files, 18f4520.lib tai th muc C:\mcc18\lib
Hnh 3.18 : Add Library File 3.4 C/u h0'h cho 5u# t"0'h 36ch p"o.!ct Khi dich project, compiler cn 1 s file object ca n (chng han nh c018i.o), ta cn phi ch ng dn tm kim cc file object ny cho compiler. i vi 1 s phin bn MPLAB, n tu ng tm ng cc file ny. Tuy nhin i vi phin bn 8.36 ta cn phi ch inh ng dn tm kim. T menu Project, chon Build Option v chon Project. 26 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Giao din Build Option hin ra, tai muc Show Directories for ban chon Include Search Path, chon New v Browse ng dn n C:\mcc18\h. Sau chnh sang Library Search Path v tao mi 1 ng dn C:\mcc18\lib
Hnh 3.19 : Tao ng dn cho include file
27 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.20 : Tao ng dn cho Library File
Nhn OK hon tt vic cu hnh ca qu trnh dich. 3.7 8i9t co3! cho p"o.!ct Double Click vo file main.c v bt u vit code cho project. Ta vit 1 oan code nh lm cho cc led ni vi PORTB ca vi iu khin sng xen k (PORTB 0xAA) Code: #include <p18f4520.h> void main() { TRISB = 0x00; PORTB = 0xAA; while(1); } 28 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.21 : Double Click v main.c v vit code
kim tra code vit c li hay khng ban vo menu Project v chon Build All hoc nhn t hp phm nng Ctrl F10. Nu khng c li thng bo BUILD SUCCEEDED s xut hin.
Hnh 3.22 : Bin dich thnh cng 3.6 :9t ';i )i $o2"3 Sau khi bin dich thnh cng, ban kt ni my tnh vi board nap v chay th chong trnh. Vi mach BKIT PIC ban cm dy USB vo chn mach nap, bt cng tt ngun v gat tt c cc switch ca SW2 ln ON kt ni mach nap PICKit2. 29 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.23 : Kt ni vi PICKit2 trn BKIT PIC
Gat tt c cc switch ca SW1 ln ON enable nt Reset, Led PortB v chn thach anh ngoi.
Hnh 3.24 : Enable Reset, Led v XTAL ngoi 3.< C/u h0'h m-ch '-p T menu Programmer chon Select Programmer v chon mach nap tong ng l PICKit2. Mun chon mach nap khc hoc kt ni vi mach nap li ban phi chon lai None ri sau mi chon lai mach nap.
Hnh 3.25 : Chon mach nap
thun tin cho qu trnh lp trnh, ta nn thit lp thm 1 s thng s cho mach nap c th tu ng nap v chay chong trnh khi bin dich khng c li. lm c iu ny ta s chon Programmer v chon Settings. 30 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.26 : Setting cho mach nap
Giao din sau hin ra v ban check chon Program after successful build (Nap chong trnh khi bin dich thnh cng) v Run after a successful program (Chay chong trnh khi nap thnh cng). Nhn OK kt thc.
Hnh 3.27 : Cu hnh nap v chay chong trnh
By gi ban nhn lai t hp phm Ctrl F10 (Build All), MPLAB s lm 1 loat cc thao tc nu khng c li : Dich chong trnh Nap chong trnh Ko chn VDD ln mc cao th chn Reset v chong trnh bt u chay trn board. 31 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.28 : Dich - Nap - Chay chong trnh
Hnh nh chong trnh chay trn board BKIT PIC nh sau :
Hnh 3.29 : Chong trnh chay trn BKIT PIC
32 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 4 : :h=o *#t c#c ch9 > 32o >'?
1.1 Gii thiu Dng PIC18F c 10 ch dao ng khc nhau, k hiu v tn goi ca chng nh sau: 1. LP : Low Power Crystal , thach anh c tn s dao ng thp (khong vi chuc kHz). 2. XT : Crystal/ Resonator, thach anh/resonator c tn s trung bnh (di 4MHz). 3. HS : High Speed Crystal/Resonator, thach anh/resonator c tn s cao (trn 4Mhz). 4. HSPLL : High Speed Crystal/Resonator with Phase Locked Loop enabled, thach anh tn s cao vi b khuyt ai PLL. 5. RC : External Resistor/Capacitor with Fosc/4 output on RA6, dao ng RC ngoi,output vi tn s chia 4 chn RA6. 6. RCIO : External Resistor/Capacitor with I/O on RA6, chn RA6 l I/O. 7. INTIO1 : Internal Oscillator with Fosc/4 output on RA6 and I/O on RA7, dao ng ni, output chn RA6, input/output chn RA7 vi tn s Fosc/4 . 8. INTIO2 : Internal Oscillator with I/O on RA6 and RA7, dao ng ni vi RA6, RA7 l I/O. 9. EC : External Clock with Fosc/4 output, clock ngoi, RA6 l output tn s Fosc/4. 10. ECIO : External Clock with I/O on RA6, clock ngoi, RA6 l chn I/O. 1.2 C"@*t2 ) A!*o'2to" y l loai dao ng on gin nht. Resonator cn c tn goi khc l Ceramic Resonator. Hnh nh ca Crystal v Resonator nh hnh bn di. Cc loai dao ng LP, XT, HS, HSPLL s dng Crystal hoc Resonator.
ch hoat ng ny, Crystal/Resonator s c kt ni vi 2 chn OSC1 v OSC2 ca vi iu khin nh hnh di y.
Khi dng Crystal, gi tri ca tu in phu thuc vo tn s ca Crystal nh bng di y
Bng 2 1 : Gi tri Capacitor cho Crystal
Gi tri ca tu in cng cao th dao ng cng n inh, nhng b lai thi giai khi ng s lu hon. Khi dng Resonator, gi tri ca tu in nh sau: 33 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bng 2 2 : Gi tri Capacitor cho Resonator
Khi tn s resonator ln hon 3.5 MHz ta nn cu hnh l HS thay v XT. 1.3 EBt!"'2 CocC Ngun dao ng clock ngoi c ni vo chn OSC1. c im ca loai dao ng ny l vi iu khin hoat ng ngay khi c ngun cp (hoc thc dy t ch sleep) m khng cn tn thi gian khi ng (start-up time). i vi chip PIC18F th dao ng ny c 2 loai : EC : chn RA6 output vi tn s Fosc/4 (Fosc l tn s clock a vo chn OSC1). Chn output ny c th dng kim tra hoc lm chn clock cho 1 s ng dung (nh 1 tn hiu ng b). Trong ca s Configuration Bits, tn goi ca ch ny l EC-CLKOUT on RA6.
ECIO : chn RA6 truy xut nh 1 I/O bnh thng. Trong ca s Configuration Bits, tn goi ca ch ny l EC-Port on RA6.
1.4 D2o >'? AC i vi 1 vi ng dung khng i hi chnh xc v inh thi cao th dao ng RC l 1 lua chon tit kim. Do tn s dao ng tai chn OSC1 phu thuc vo in p cp, in tr, tu in, nhit v thm ch l hng sn xut chip, nn tn s dao ng RC khng c chnh xc. Ch ny cng c 2 loai l RC (RC-CLKOUT on RA6, Port on RA7) : Clock out vi tn s chia 4 chn RA6 v RCIO (RC-Port on RA6, Port on RA7) : RA6, RA7 s dung nh I/O. 1.7 B> Chu9ch -i tD' *; PLL PLL l 1 mach tch hp bn trong chip, c tc dung nng tn s input ln nhiu ln, nng cao tc thuc thi chong trnh ca vi iu khin. B PLL c th c dng kt hp vi nhiu ch hoat ng thach anh ca vi iu khin PIC. HSPLL : PLL khi dng vi ch HS c th nhn gp 4 ln tn s input. Khi tn s input ti a l 10Mhz, tn s khuch ai at 40MHz. Trong ca s Configuration Bits tn 34 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
goi ca ch ny l HS-PLL enabled freq 4xFosc1. Trong ch ny bit PLLEN khng c tc dung. PLL v INTOSC : PLL cng c th c dng kt hp vi b dao ng ni, khi tn s khuch ai c th at 32Mhz. Ch ny phi c thit lp bng phn mm, khng c option chon lua trong ca s Configuration Bits. PLLEN bit dng kch hoat ch ny. 1.6 B> 32o >'? '>i Gn tong tu vi b dao ng External Clock, b dao ng ni (Internal Oscillator Block) cng c 2 ch , output tn s Fosc/4 chn RA6 v ch I/O chn ny. Tn s ca b dao ng ni c lp trnh software. Cc thanh ghi nh hng n tn s ny l OSCCON v OSCTUNE. b dao ng ni c 2 ngun clock, ngun clock 8MHz v ngun clock RC 31kHz. B ngun clock 8MHz s i qua 1 b chia (Prescaller) v cp clock cho thit bi hoat ng. Gi tri ca b chia ny c xc inh bi 3 bit IRCF2:IRCF0 trong thanh ghi OSCCON.
Khi gi tri cc bit u l 0 th vic chon clock source dua vo bit INTRC trong thanh ghi OSCTUN. Nu INTRC 0 th tn s ly t clock source th 2, 31kHz. Ngc lai tn s s l 8MHz/256 31.5kHz (b chia l 256 cho clock 8MHz).
Khi tn s ca b dao ng ni l 4MHz hoc 8MHz (OSCCON6:4 110 hoc 111) th n c th c s dung kt hp vi b PLL. kch hoat b PLL ta phi set bit PLLEN thanh ghi OSCTUNE ln 1.
1.< D!mo Kit BKIT PIC c thit k dng switch gat kt ni vi thach anh (crystal) 20MHz, nn ta c th s dung ch thach anh ngoi khng PLL (PLL ch dng c vi thach anh nh hon 10MHz) hoc dng thach anh ni kt hp vi PLL.
demo tn s cung cp cho chip, ta s vit chong trnh c 1s tng gi tri ca PORTB ln 1 on vi. Mt cu lnh trong PIC chim 4 chu k dao ng.
1.7.1 Thch anh ngoi 20MHz
Ta s dng 2 vng lp for tao hiu ng delay. Vi chu k 20MHz ta phi m 5 000 000 chu k lnh (do 1 chu k lnh chim 4 chu k dao ng).
Khi mun tnh ton chnh xc thi gian, ta phi dng cc cu lnh ASM. Khi vit bng ngn ng C, ta ch c th c lng gn ng. Cu lnh (for i0 I MAX_I i) tn khong 4 chu k lnh : i tn 2 chu k lnh, i MAX_I tn 2 chu k lnh, lnh gn i 0 ch thuc hin 1 ln nn ta c th b qua.
Vy hm tao hiu ng tr hon 1s vi tn s 20MHz ta s vit nh sau: Code: void delay1s_20MHz() { int i,j; for(i=0;i<250;i++) { for(j=0;j<1250;j++) { } } }
Nh cp trn, 1 vng for thuc hin khong 4 chu k lnh nn tng s chu k lnh ca 2 vng for trn l (250 4) (1250 4) 5 000 000. 35 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hm main ta c th vit nh sau: Code: void main() { TRISB = 0x00; //setup PORTB is output PORTB = 0x00; //init value while(1) { PORTB++; //increase PORTB Delay1s_20MHz(); //call delay 1s } } Chnh ch thach anh trong ca s Configuration Bits l HS, PORTB l Digital (mc inh l analog), Disable chc nng nap in p thp (LVP), dich v nap chong trnh ta s thy gi tri PORTB tng dn sau 1s. Chnh ch thach anh sang ch LP hoc XT, dich v nap lai chong trnh ban s thy chong trnh khng chay hoc chay sai. Do vi thach anh 20MHz ta phi chon l HS nh datasheet ca PIC18F4520.
1.7.2 Thch anh ni 8MHz
Cng tong tu nh trn, ch thach anh ni 8MHz ta phi thuc hin 2 000 000 chu k lnh.
Hm tao hiu ng tr hon 1s vi tn s 20MHz ta s vit nh sau: Code: void delay1s_8MHz() { int i,j; for(i=0;i<250;i++) { for(j=0;j<1250;j++) { } } } s dung c thach anh ni 8MHz, trc tin ta phi cu hnh l dng thach anh ni trong ca s Configuration Bits (chon INT RC Port on RA6, Port on RA7), sau vit code trong hm main lua chon b Prescaller cho ngun clock 8MHz. Ta s set 3 bit 6:4 ca thanh ghi OSCCON ln 1. Hm main s vit nh sau: Code: void main() { TRISB = 0x00; //setup PORTB is output PORTB = 0x00; //init value OSCCON |= 0x70 //set bit <6:4> -> freq = 8MHz while(1) { PORTB++; //increase PORTB Delay1s_8MHz(); //call delay 1s } }
1.7.3 Thch anh ni 8MHz v PLL
Khi s dung thach anh ni 8MHz v b PLL nhn 4, tn s dao ng cp cho chip s l 32MHz, vy ta phi m 8 000 000 chu k lnh. Hm tao hiu ng delay s nh sau: Code: 36 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
void delay1s_8MHzPLL() { int i,j; for(i=0;i<500;i++) { for(j=0;j<1000;j++) { } } } Hm main ngoi vic chon Prescaller cho clock ni ta phi set thm bit PLLEN (bit 6) trong thanh ghi OSCTUNE: Code: void main() { TRISB = 0x00; //setup PORTB is output PORTB = 0x00; //init value OSCCON |= 0x70 //set bit <6:4> -> freq = 8MHz OSCTUNE |= 0x40 //enable PLL while(1) { PORTB++; //increase PORTB Delay1s_8MHzPLL(); //call delay 1s } }
37 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 7 : I't!""upt ) '?Et ,im!"
2.1 I't!""upt t"o'? PIC Dng PIC18F4520 (2420, 2520, 4420) c nhiu ngun ngt (interrupt source) v 2 mc u tin ngt (high priority interrupt v low priority interrupt). Vector ngt c mc u tin cao c ia ch 0x08 cn ngt c mc u tin thp c ia ch 0x18. Khi hm phuc vu ngt qung cho ngt u tin thp ang xy ra, ngt u tin cao xy ra s tam dng ngt u tin thp v phuc vu cho ngt u tin cao.
i vi 1 ngt, thng thng c 3 bit iu khin n: Flag bit : C bo hiu interrupt, khi flag bit c set, ngt s xy ra. Enable bit : Cho php ngt i vi cc ngt c mt na (maskabled interrupt) Priority bit : Thit lp u tin ngt, khi c set ngt s c mc u tin cao. c th thit lp mc u tin cho cc ngun ngt, ta phi enable chc nng u tin ngt bng cch set IPEN bit (Interrupt Priority Enable bit : RCON7).
Khi IPEN 1 : GIEH bit (INTCON7) s enable cc ngt c mc u tin cao, GIEL bit (INTCON6) s enable cc ngt c mc u tin thp. Khi ngt ton cuc, Flag bit, Enable bit c set, ngt s c kch hoat, con tr chong trnh s nhy ti ia ch 0x08 hoc 0x18 ty theo ngt c thip lp l u tin cao (Priority bit l 1) hay u tin thp (Priority bit l 0).
Khi IPEN 0 : y l trng hp mc inh, disable chc nng u tin ngt (goi l ch compatibility mode). INTCON6 lc ny l PEIE bit, enable hay disable cc ngt ngoai vi (peripheral interrupt). INTCON7 lc ny l GIE bit, enable hay disable tt c cc ngun ngt. ch compatibility ny, tt c cc ngt s nhy n ia ch 0x08.
Khi cc ngun ngt c cng u tin, chng s cng nhy n 1 ia ch ngt. Hm phuc vu ngt qung cn phi kim tra tt c cc c xc inh ngun ngt no ang gy ra ngt. C ngt cn c xa trnh hin tng ngt quy (recursive interrupt), vi iu khin s lp v tn trong hm ngt cho n khi trn stack.
im ch quan trong trong thanh ghi INTCON l khi IPEN 1 : INTCON7 1 s enable tt c cc ngt c u tin cao nhng khi INTCON7 0 n lai disable tt c cc ngt, bao gm c ngt u tin thp. Mt ngt u tin thp ngoi vic thit lp GIEL (INTCON6) cn phi set lun c bit GIEH (INTCON7).
2.2 Gii thiu ,im!"+ Timer0 c 2 ch 16 bit hoc 8 bit. Clock cp cho timer 0 c th l clock ni hoc clock ngoai (ly t chn T0CKI). Ngoi ra Timer0 cn c b Prescaller chia tn s clock.
Hnh 2.1 : Thanh ghi iu khin T0CON
Timer0 c iu khin bi thanh ghi T0CON. ngha cc bit trong thanh ghi ny nh sau: Bit < ,MA+FG : Bt tt Timer 0. 1 : Bt Timer 0 . 0 : Tt Timer 0. Bit 6 ,+8BI, : Chon cu hnh cho Timer 0. 1 : Timer 16 bit. 0 : Timer 8 bit. Khi hoat ng ch 16 bit, gi tri ca b inh thi (counter)/ b m Timer 0 c ghi vo 2 thanh ghi TMR0H v TMR0L. Ngc lai, ch 8 bit, gi tri m c lu trong thanh ghi TMR0L. Bit 7 ,+CH : Chon ngun clock cho Timer 0. 1 : Clock ngoi t chn T0CKI. 38 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
0 : Clock ni (Fosc/4). Bit 4 ,+HE : Chon ch kch Timer 0 khi dng ngun ngoi. 1 : Timer 0 m ln khi c tn hiu t High sang Low chn T0CKI. 0 : Timer 0 m ln khi c tn hiu t Low sang High chn T0CKI. Bit 3 PHA : Bt/ Tt ch Prescaller cho Timer 0. 1 : Tt Prescaller. 0 : Cho php Prescaller. Bit 2 : + ,+PH2 :,+PH+ : Chon gi tri Prescaller. 111 : 1:256 011 : 1:16 110 : 1:128 010 : 1:8 101 : 1:64 001 : 1:4 100 : 1:32 000 : 1:2 Khi chon b Prescaller, tn s ca Timer 0 s bi chia xung. V du thach anh dng cho mach l 20MHz, th tn s ca clock ni l Fosc/4 5MHz. Nu ta chon Prescaller l 1:2 th tn s m ca timer 0 l 2.5MHz.
Khi Timer 0 m trn t FF :FF (ch 16 bit) hoc FF (ch 8 bit) ln 0, c TMR0IF s c bt ln 1 v gy ra ngt nu cc bit cho php ngt (ngt ton cuc, ngt timer0) c set ln 1.
2.3 L&p t"0'h mo3u! ,im!"+ 2.3.1 H ini!"!i#$0 Trong phn ny, chng ta s khi tao timer0 ch 16 bit, s dung clock ni v prescaller 1:2, ngt timer0 s c cu hnh l ngt u tin thp v sau mi 1ms s xy ra ngt 1 ln.
Timer0 s m ln sau mi ln tch cuc ca clock. Trong ch 16 bit, khi gi tri trong 2 thanh ghi TMR0H:TMR0L chuyn t FFFF sang 0000 s xy ra ngt, c TMR0IF s c bt ln 1.
Mach BKIT PIC s dung thach anh 20MHz, nn clock ni cho timer0 s l 5MHz (timer0 s m 5 000 000 on vi trong 1 giy). c c ngt 1ms ta s nap cho thanh ghi TMR0H:TMR0L gi tri thp hon FFFF 7+++ on vi.
V Timer0 c cu hnh s dung prescaller 1:2, nn con s ny s thp hon FFFF 27++ on vi : 65535 2500 63035 I63B. Vic nap gi tri ny cho thanh ghi TMR0 s c thuc hin trong hm phuc vu ngt qung timer0_isr.
enable ngt timer 0, ta cn set bit ngt ton cuc GIE, set bit ngt thp GIEL, set bit enable timer 0 TMR0IE v c ngt timer 0 TMR0IF trong thanh ghi INTCON. Cu hnh u tin ngt timer 0 l ngt thp bng cch clear bit TMR0IP trong thanh ghi INTCON2.
Hm ngt timer0 s c khi tao nh sau: Code: void init_timer0() { counter0 = 0;//counter for virtual timer timer0_flag = 0;//flag for virtual timer T0CON = 0x00;//timer0 16bit mode, internal clock, Prescaller 1:2 RCONbits.IPEN = 1;//enable interrupt priority INTCON2bits.TMR0IP = 0;//low interrupt priority INTCONbits.GIE = 1;//enable global interrupt INTCONbits.GIEL =1;//enable low priority interrupt INTCONbits.TMR0IE = 1;//enable timer0 interrupt INTCONbits.TMR0IF = 1;//force timer0 interrupt
} 2.3.2 H !i#$0"i%$ Hm ny c goi khi ngt Timer0 xy ra. i vi tt c cc ngt ca PIC, ta cn phi xa c ngt trc tin v n khng c tu ng xa bng phn cng. Trong hm phuc vu ngt qung Timer0 ny ta nn tt n i bng cch xa bit TMR0ON, nap lai gi tri cho 2 thanh ghi m 39 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Timer0. cui hm phuc vu ngt qung ta s bt cho Timer0 m ln (set bit TMR0ON). Gi tri trong 2 thanh ghi m Timer0 s tng dn theo mi xung nhip ca clock, v khi at gi tri FFFF n s xy ra ngt ln tip theo. Code: void timer0_isr() { INTCONbits.TMR0IF = 0; //clear interrupt flag T0CONbits.TMR0ON = 0; //stop timer 0
//CODE HERE virtual_timer(); //END CODE T0CONbits.TMR0ON = 1; //start timer 0 } goi c hm ny, ta phi dng thm ch thi pragma dich 1 hm tai ia ch nht inh v ch thi pragma interrupt dich hm ny l dang hm interrupt. Timer0 c cu hnh l ngt u tin mc thp (low priority interrupt), nn khi ngt xy ra, con tr chong trnh s nhy ti ia ch 0x18. Chong trnh hin thuc lnh goi hm timer0_isr c hin thuc cui file main.c Code: #pragma code #pragma interrupt low_interrupt_isr void low_interrupt_isr() { if(INTCONbits.TMR0IF == 1) timer0_isr(); } #pragma code _vector_low = 0x18 void _vector_low(void) { low_interrupt_isr(); } #pragma code void main() { while(1) { } } Vi ch thi u tin, hm vecter_low s c dich tai ia ch 0x18, l ia ch vector ngt thp. Do 2 ia ch ngt ca PIC l 0x08 cho ngt cao v 0x18 cho ngt thp cch gn nhau, nn ta s ch t tht t lnh tai 2 ia ch ny. Trn y ch t 1 lnh goi hm low_interrupt_isr tai ia ch 0x18. Trong hm ny ta s kim tra ngt ang xy ra c phi l Timer0 hay khng bng cch xt bit th 2 ca thanh ghi INTCON (bit TMR0IF) trc khi goi hm timer0_isr. Hm main() by gi phi thm ch thi #pragma code compiler dich hm ny 1 vng nh khc trong vng code memory.
Ngoi Timer0, PIC cn c thm 3 Timer na. V cc chc nng co bn nh Timer0, chng cn c thm 1 vi chc nng c bit khc.
2.4 Gii thiu ,im!" 1 Khc vi Timer0 l 1 interrupt, Timer1 l 1 Peripheral Interrupt. V vy c th enable cho ngt Timer1, ta phi set bit PEIE. 40 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Tong tu vi Timer0, Timer1 cng c chc nng counter t clock ngoi ( chn T13CKI) v tng gi tri ln 1 mi khi c clock canh ln chn T13CKI.
Khi chon clock ngoi, T1SNC bit dng chon ch cho counter, l Ansynchronous Counter hoc Synchronous Counter. Hai loai counter ny u tng gi tri m ln 1 sau mi ln tch cuc ca clock, im khc bit ca chng nm kt ni phn cng. Synchronous Counter cp clock cho tt c cc flip flop trong khi Ansynchronous Counter ch cp clock cho flip flop u tin.
Hnh 2.2: Synchronous Counter
Hnh 2.3 : Ansynchronous Counter
Bn canh , Timer1 cn c th m ln nh dao ng ngoi 2 chn T1OSI v T1OSO. Ngi ta thng dng thach anh 32,768kHz v bin Timer1 thnh 1 b Real Time Clock (ng h thi gian thuc) . So kt ni nh sau: 41 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 2.4 : Timer1 Osillator
s dung c chc nng ny ta cn phi set bit T1OSCEN.
Chc nng c bit cui, Timer1 l ngn clock cho module CCP. Chi tit v module ny s c trnh by Bi 16. Hai timer cn lai thng c dng tch hp vi cc module khc, Timer2 (c thm b Post Scaller) s c dng cho module PWM Bi 14 v Timer3 s c dng cho module Capture Bi 16. 2.7. G?Et ,im!"1 ) ,im!"2 Ti#$ 1& Khi khng c interrupt priority : GIE enable all interrupts, PEIE/GIEL enable all peripheral interrupt.
Khi c interrupt priority : GIE enable all high interrupt, nhng nu bng 0 s disable all interrupts. Nn nu set timer 1 l interrupt mc thp th phi set GIEH ln enable, sau set tip GIEL enable interrupt u tin thp. Nu timer1 mc cao th phi set GIEH enable high interrupt v set PEIE v timer1 l peripheral interrupt. Ti#$ 2& Timer 8 bit, gi tri trong thanh ghi TMR2 khi bng vi PR2 s set c TMR2IF v gy ra ngt. Prescaller l b chia tn s input. (1,4,16) PostScaller l b chia tn s output. (1-16) Timer 2 l peripheral interrupt. Code: 42 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
43 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 6 : M2 t"&' phJm
3.1 :h#i 'im Ma trn phm l cch kt ni cc phm theo hng v ct. Cch kt ni nh vy s tit kim c ti nguyn ca vi iu khin. V du di y l cch mc ma trn phm 4x4 :
Hnh 3.1 : Ma trn phm 4x4
Ta c 16 phm v 8 tn hiu iu khin. Nu mc 16 phm ny nh cc phm on, ta phi cn n 16 tn hiu iu khin. 3.2 Gi=i mK m2 t"&' phJm Ta xt 1 ma trn phm 2x2 nh hnh di y:
Hnh 3.2 : Ma trn 2x2
Khi phm A c nhn th in p tai C1 s bng R1. Nh vy nu ban u tai C1 v C2 l mc cao, R1 l mc thp v R2 l mc cao, th khi phm A c nhn, in p tai C1 (ban u l mc cao) s bi ko xung mc thp. 44 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 3.3 : Phm A c nhn
Tong tu nu phm B c nhn th C2 s bi ko xung mc thp. xc inh 2 phm C v D c c nhn hay khng, ta s nng in p tai R1 ln mc cao, ko in p tai R2 ln mc cao (chuyn hng tch cuc).
Hnh 3.4 : Phm D c nhn
Nh vy, xc inh vi tr ca phm no c nhn, ta s duyt qua tt c cc hng v xt cc phm hng . uy c tn hin DEACTIVE l mc 1 v tn hin ACTIVE l mc 0, tng bc gii m ma trn phm nh sau: Cho tn hiu cc ct l DEACTIVE Ci t tn hin tai cc ct l INPUT Cho tn hin cc hng l DEACTIVE Ci t tn hiu cc hng l OUTPUT Lp qua cc hng o Cho tn hiu hng ang xt l ACTIVE. o Xt cc ct trong hng ang cho ACTIVE, ct no c tn hiu ACTIVE l phm tong ng c nhn. Kt thc vng lp 3.3 8i9t ch%L'? t"0'h
45 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Chong trnh dnh cho gii m ma trn gm 2 phn : phn u dng khi tao cc chn vi iu khin, phn 2 l duyt qua cc hng v ct xc inh phm no c nhn. File key_matrix.h inh ngha cc hng s v 2 hm dng trong ma trn phm: Code: #define TRIS_BUTTON TRISC #define PORT_BUTTON PORTC #define MAX_COL 4 #define MAX_ROW 4 extern char key_data[]; extern char key_code[]; void init_key_matrix(); void scan_key_matrix(); '#("co)# l 1 mng 16 phn t tong ng vi 16 phm, nu phm c nhn th phn t tong ng c gi tri l 1.
'#(")a!a cng l 1 mng 16 phn t, ta c th dng lu thng tin cho phm vi tr th nht, chng han nh data hin thi s 0 (0x3F) trn led 7 oan. 3.3.1 *h+i !o a !$,n -h. Theo nh so kt ni ma trn phm hnh 4.1, ta s khi tao cc hng l output v cc ct l input. uy inh DEACTIVE l mc 1 nn ta s gn gi tri ban u ca PORTC l 0xFF. Code: void init_key_matrix() { TRIS_BUTTON = 0x0F; //C3-C0:input C7-C4:output PORT_BUTTON = 0xFF; } 3.3.2 /01! a !$,n -h. Nh cp gii thut trn, ta s ln lt duyt qua tt c cc hng bng cch xut tn hiu ca hng l ACTIVE (mc 0) ri xt tng ct. Code: void scan_key_matrix() { int i,j; //loop all rows for(i=0;i<MAX_ROW;i++) { //pull down row i PORT_BUTTON &= ~(1<<(7-i)); //loop all cols for(j=0;j<MAX_COL;j++){ //reset key code key_code[i*MAX_ROW+j] = 0;
//when col j is activated if((PORT_BUTTON & (1<<j)) == 0){ //set key code key_code[i*MAX_ROW+j] = 1; } } //pull up row i PORT_BUTTON |= (1<<(7-i)); } } 3.3.3 H ain file main.c, ta s include file key_matrix.h c th goi c cc hm ca n. Bin key_code c extern file key_matrix.h nn ta cng c th truy xut file main.c. Code: 46 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
#include "KEY_MATRIX\\key_matrix.h" void main() { int i; TRISB = 0x00; //init PORTB for output PORTB = 0x00; //initial value init_key_matrix(); while(1) { scan_key_matrix(); for(i=0;i<16;i++) { if(key_code[i] != 0) { PORTB = i; break; } } } } Code chi tit ca ma trn phm cc ban c th tham kho Bai7.
47 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi < : Ch;'? "u'? cho m2 t"&' phJm
4.1 G?u@(' J ch;'? "u'?
Hnh 4.1 : Hin tng rung phm
Hnh trn minh hoa mc in p ca 1 phm nhn tch cuc mc 0, trang thi bnh thng, in p vi iu khin nhn vo l 5V cn khi nhn l 0V. Tuy nhin, do rung co hoc ca phm, tai thi im va nhn xung, in p s khng n inh trong 1 khong thi gian, trc khi n inh mc 0V. Hiu tng ny goi l rung phm. Mc d khong thi gian in p mc 0 trong giai oan rung phm l nh nhng cng vi iu khin nhn c. V vy khi ta xt nu in p l 0 th goi hm func() th hm ny s c goi rt nhiu ln, l iu m ta khng mong mun. khc phuc hin tng rung phm, c 2 hng gii quyt : dng phn cng v phn mm. V gii php phn cng : thay v mc on gin nh kit th nghim ny (xem lai so ), ta c th dng thm tu in han ch vic thay i in p t ngt, so nguyn l nh sau:
so trn, khi khng nhn l mc 1, khi nhn l mc 0. Phm nhn trn tch cuc mc 0. Mach trn cn goi l mach RC. Nu nt nhn c 2 cuc (3 chn), ta c th chon gii php dng mach RS flip flop, y l mach phn cng chng rung tt nht, so nguyn l nh sau:
Hnh 4.3 : Chng rung bng phn cng (tt)
V gii php phn mm : Ta s inh k oc tn hiu t nt nhn, cho n khi no chng trng nhau n ln th mi x l. Hnh di y minh hoa trong trng hp 2 ln l 0 th mi xc nhn l phm c nhn v mi x l tc vu m ta mong mun.
Hnh 4.4 : Chng rung bng phn mm
Khong thi gian gia 2 ln oc l khong 10ms, ta s hin thuc hm oc ny v goi n trong timer. Gii thut on gin x l chng rung c th hin thuc nh sau: Code:
previous_key = current_key; current_key = Port_key; If(previous_key == current_key) effective_key = current_key; Trong : previous_key : bin lu gi tri phm trc . current_key : bin lu gi tri phm hin tai. Port_key : Port ca vi iu khin kt ni vi phm. y chng ta goi hm oc ma trn phm tr v gi tri ca phm c nhn. effective_key : gi tri phm hp l (gi tri trong giai oan n inh) tng tnh chnh xc, ta c th dng nhiu bin previous_key lu lai cc gi tri v so snh nhiu ln. oan code trn ch so snh trng nhau 2 ln. 4.2 :9t ';i phD' cM'? 49 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
So nguyn l ca phm trong kit ny nh sau :
Hnh 4.5 : So kt ni nt nhn
Phm nhn ny tnh cuc mc 0, c kt ni kh on gin, nn ta s dng phn mm chng rung. Ta s dng 3 bin so snh 2 ln trng nhau, 2 ln lin tip cch nhau 10ms.
Trong trng hp nhn 1 phm, ta s dng bin TimeOutForKeyPress xc inh thi gian tch cuc tip theo. Bin ny s quan trong trong trng hp ta vit 1 ng dung chng han nh soan tho vn bn. Nu khng c bin ny qun l, nu ta th trong 1s c ti 100 ln tch cuc. 4.3 8i9t ch%L'? t"0'h Module ny c 2 hm nh sau :
void initKey() : Khi ng cc thng s ban u void getKey() : Hm ny c goi trong timer0, dng qut phm. void SubKeyProcess() : Hm ny hin thuc tc vu ban cn thuc hin khi nhn phm.
kit th nghim ny, cc nt nhn c ni thnh dang ma trn v c ni vi PORTC nn ta inh ngha thm u file Key.c : Code: #define KEY_PORT PORTC
4.3.1 H ini!'#(23
Code: void initKey() { KeyReg0 = 0x00; KeyReg1 = 0x00; KeyReg2 = 0x00; KeyReg3 = 0x00; } Trong KeyReg0, KeyReg1, KeyReg2 dng lu 3 ln lin tip. Khi 3 bin ny bng nhau, bin KeyReg3 mi c cp nht. Bin KeyReg3 l gi tri hp l ca phm nhn. 4.3.2 H g#!*#(23 Hm ny c chia lm 2 phn, phn u l chng rung phm dng 2 ln so snh trng nhau. Phn th 2 x l khi 1 phm c , phi sau 1 khong thi gian TimeOutForKeyPress mi c tch cuc. Code: 50 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
void getKey(){ KeyReg2 = KeyReg1; KeyReg1 = KeyReg0; KeyReg0 = read_matrix_key();// Cho phep nut nhan nao duoc tich cuc. if ((KeyReg1 == KeyReg0) && (KeyReg1 == KeyReg2)) { TimeOutForKeyPress --; if (TimeOutForKeyPress == 0) { KeyReg3 = 0x00; } if (KeyReg2 != KeyReg3) { KeyReg3 = KeyReg2; If (FlagFirstTimeKeyPress == 1)//Day la lan dau phim duoc nhan. { TimeOutForKeyPress = 100; SubKeyProcess(); FlagFirstTimeKeyPress = 0; } else { if (KeyReg2 == 0x00) FlagFirstTimeKeyPress = 1; else { TimeOutForKeyPress = 100; SubKeyProcess(); } } } } } 4.4. Co3! mNu
Download code mu tai y
51 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 8 : LCD 16B2 ) $' phJm i' tho-i
7.1 ChMc 'O'? c#c chP' cQ2 LCD
Hnh 5.1 : LCD 16x2
LCD thng s dung 14 chn, ch 16 chn khi cn iu khin n nn. Chc nng ca cc chn nh sau:
52 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
7.2 :9t ';i m' h0'h LCD
Hnh 5.2 : Kt ni mn hnh LCD
Hnh trn m t kt ni LCD vi ch 16 chn, 2 chn K v A dng kt ni vi n nn.
7.3 C#c )R'? 'h cQ2 LCD 5.3.1 4i%-5a( 4a!a 6a 24467M3 Lu tr m k tu hin thi ra mn hnh. M ny ging vi m ASCII. C tt c 80 nh DDRAM. Vng hin thi tong ng vi ca s gm 16 nh hng u tin v 16 nh hng th hai. Chng ta c th tao hiu ng dich ch bng cch s dung lnh dich , khi ca s hin thi s dich em lai hiu ng dich ch.
Hnh 5.3 : Vng nh DDRAM 5.3.2 8ha$ac!#$ 9#n#$a!o$ 6a 28967M3 Lu tr tm mu k tu do ngi dng inh ngha. Tm mu k tu ny tong ng vi cc m k tu D7-D0 0000D2D1D0 ( mang gi tri ty inh 0 hay 1). 53 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 5.4 : Vng nh CGRAM 5.3.3 B nh 896:M B nh dng lu tr cc k tu hin thi trn LCD. Cc gi tri lu trong b nh ny nh sau: 54 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 5.5 : Vng nh CGROM Chng ta mun hin thi ch CE gia hng u tin, gi s ca s hin thi ang bt u t vi tr u tin (hng th nht hin thi d liu ca nh t 0x00 n 0x0f, hng th hai hin thi d liu ca nh t 0x40 n 0x4f, y l vi tr home). Gi tri ca nh 0x07 l 0x43 (k tu C), ca nh 0x08 l 0x45 (k tu E).
Chng ta mun hin thi ch gi hng th hai, gi s c s hin thi ang vi tr home. Trong bng mu k tu chng ta thy khng c mu . Lc ny chng ta phi inh ngha mu 5x8 im, gm c 8 byte, sau lu vo vi tr ca mu k tu CGRAM th nht. Lc ny gi tri ca nh 0x47 l 0x00 hoc 0x08 (vi tr ca mu k tu CGRAM th nht ).
7.4 C#c 'h cL $=' cQ2 LCD truyn lnh cho LCD th chn RS 0, khi cc tn hin trn D0-D7 c xem l lnh. ngha ca cc lnh iu khin LCD nh sau: 55 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
I/D 1 = Increment (by 1) 0 = Decrement (by 1) RL 1 = Shift right 0 = Shift left S 1 = Display shift on 0 = Display shift off DL 1 = 8-bit interface 0 = 4-bit interface D 1 = Display on 0 = Display off N 1 = Display in two lines 0 = Display in one line U 1 = Cursor on 0 = Cursor off 56 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
F 1 = Character format 5x10 dots 0 = Character format 5x7 dots B 1 = Cursor blink on 0 = Cursor blink off D/C
1 = Display shift 0 = Cursor shift
7.7 :9t ';i LCD )i )i iSu ChiT' LCD c 2 ch 8 bit v 4 bit. ch 8 bit, ta dng ton b 8 chn D0-D7 giao tip. ch 4 bit, ta ch dng 4 bit cao D4-D7 giao tip vi LCD. D liu gi cho LCD ch ny bao gm 4bit cao gi trc, sau s n 4bit thp. So kt ni 2 ch nh sau:
Hnh 5.6 : Kt ni LCD vi vi iu khin
Nu mun tit kim chn, R/W c th ni xung GND. ch 4bit th 4 bit thp ca LCD c th ni xung GND. 7.6 :hUi t-o LCD u trnh khi tao LCD ch 8 bit nh sau: 57 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 5.7 : Khi tao LCD 8 bit
u trnh khi tao ch 4 bit nh sau: 58 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 5.8 : Khi tao LCD 4 bit 7.< :9t ';i phD' cM'? LCD c kt ni vi Port B ca vi iu khin PIC nh sau: Trch: LED_BACKLIGHT PortB.0 PIN_RS : PortB.1 PIN_RW : PortB.2 PIN_EN : PortB.3 D4 : PortB.4 59 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
D5 : PortB.5 D6 : PortB.6 D7 : PortB.7 7.8 8i9t ch%L'? t"0'h V 7.W C#c hm cL $=' qu trnh iu khin LCD hiu qu, ta inh ngha 1 s hm co bn nh sau: Hm delay: trung bnh PIC thuc hin 5 lnh mt 1us vi thach anh 20Mhz. Code: void lcd_delay(int time) { while(--time); } Hm ghi d liu ra LCD: Code: //Ghi 4 bit void lcd_write_4bits(unsigned char dat) { RW(WRITE); //ko chn RW xung 0 EN(SET); //set chn Enable ln 1 LCD_DATA_OUT(dat & 0xF0); //Gi data ra lcd_delay(10); EN(CLR); //ko chn Enable xung 0 lcd_delay(10); } //Ghi 1 byte : ghi 4 bit 2 ln void lcd_write_cmd(unsigned char cmd){ lcd_wait_busy();
RS(CMD); lcd_write_4bits(cmd); lcd_write_4bits(cmd << 4); } Mt s macro trong file lcd.h, v du nh: Code: #define RS(x) ( (x) ? ( LCD_PORT |= 0x02 ) : ( LCD_PORT &= 0xFD ) ) //Nu x = 1 th thc hin lnh LCD_PORT |=0x02, x=0 th thc hin LCD_PORT &=0xFD . 7.1+ :hUi t-o LCD ch9 > 4 $it Code: 60 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
void init_lcd() { lcd_delay(15000); //1 RS(CMD); //2 lcd_write_4bits(0x03 << 4); //3 lcd_delay(4100); //4 lcd_write_4bits(0x03 << 4); //5 lcd_delay(100); //6 lcd_write_4bits(0x03 << 4); //7 lcd_write_4bits(0x02 << 4); //8 lcd_write_cmd(0x28) ; //9 lcd_write_cmd(0x0C); //10 lcd_write_cmd(0x06); //11 } ngha cc lnh trn nh sau: Lnh 1 : goi hm lcd_delay(15000) delay 15ms. Lnh 2 : ko chn RS (ni vi LCD_PORT tai bit 1) xung 0. Lnh ny c inh ngha l 1 macro trong file lcd.h: #define RS(x) ( (x) ? ( LCD_PORT |= 0x02 ) : ( LCD_PORT &= 0xFD ) ) CMD c define l 0 nn lnh RS(CMD) s c iu kin (x) l false v s thuc hin phn th 2 ca lnh trn : LCD_PORT 0xFD (ko bit 1 xung 0 : 1111 1101). Lnh 3 : thuc hin trang thi u tin sau khi ch 15ms, ghi D7 D6 D5 D4 0011. Cc chn ny c ni vi 4 bit cao ca vi iu khin nn ta phi dich tri gi tri 0x03 4 bit. Lnh 4 : delay khong 41ms. Lnh 5,6,7,8 : Thuc hin cc trang thi 2,3 v 4. Sau lnh 7 th LCD chuyn sang ch 4 bit, v gi 1 byte, ta s gi 2 ln 4 bit cao trc ri ti 4 bit thp. Lnh 9 : goi hm lcd_write_cmd ghi 4 bit 2 ln, gi tri 0x28 tong ng vi N 1 (hin thi trn 2 hng ca LCD) v B 0 (font inh dang 5x7 im). Lnh 10 : thuc hin lnh display on (xem thm trong bng lnh), D 1. Lnh 11 : thuc hin lnh entry set mode, 0x06 tong ng vi ch dich phi tng dn. 7.11 Xo# m' h0'h Hm ny ch on gin l gi lnh clear mn hnh lcd (xem thm trong bng lnh ca LCD). Code: void lcd_clear() { lcd_write_cmd(0x01); lcd_goto_xy(0, 0); }
7.12 ,hi9t &p )6 t"J co' t"Y Hm ny thit lp vi tr bt u xut d liu trn mn hnh LCD 2 hng 16 ct. hin thuc hm ny ta phi tnh c ia ch tong ng vi toa (row,col) v dng lnh SET DDRAM ADDRESS (bit 7 ca lnh ny bng 1). Code: 61 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
7.13 I' CJ tZ "2 m' h0'h Hm ny nhn thng s l 1 k tu v hin thi k tu ra mn hnh LCD. Vic hin thuc hm ny kh on gin, ta ch cn ko chn RS xung 0 l LCD s hiu cc bit D7-D4 l d liu. Code: void lcd_print_char(unsigned char dat) { lcd_wait_busy(); //find next position if(current_row == 0 && current_col == 16) lcd_goto_xy(1,0);
if(current_row == 1 && current_col ==16) lcd_goto_xy(0,0); RS(DAT); //RS = 0 lcd_write_4bits(dat); lcd_write_4bits(dat << 4); current_col ++; //update new position } T nhng hm co bn ny, ban c th hin thuc thm cc hm xut 1 string hay 1 gi tri s ra mn hnh LCD. Code chi tit c th xem thm file nh km.
7.14 ,hi9t &p $' phJm i' tho-i Tm tt : bn phm 4x4 c nh cc k tu s (0-9) v ch (A,B,C,D,,) s l cc phm chc nng m phng theo bn phm in thoai. Cc trang thi cng nh thng tin s c hin thi trn mn hnh LCD. lm c bi ny cc ban cn c nhng hm v qut ma trn phm (trong th muc button_matrix) cng nh xut ra LCD (trong th muc lcd).
Trc ht ban cn phi bit qua bi qut ma trn phm. Trong Button.c chng ta c hm button_process(void) Hm ny c goi inh k trong timer kim tra xem c nt no c nhn khng.Hm read_matrix_key(void) khi khng c nt no c nhn, n s tr v gi tri 0. Khi c nt nhn n s tr v gi tri t 1-16 ty theo vi tr ca nt nhn. Vic kim tra ny c thuc hin nhiu ln v chng ta s ch x l n khi c t nht 3 ln oc gi tri ging nhau (theo nguyn l chng rung, oc thm bi chng rung cho phm).
Bi th 2 cn bit l bi v xut lcd. Trong lcd.c h tr cho ban sn cc hm ghi ln lcd (Tham kho thm trong lcd.h).
Chng ta bt u bng vic tao mt project mi vi nhng thit lp ph hp. copy th muc button_matrix, lcd, timer, interrupt vo noi cha chong trnh hon chnh project mi. Thm nhng file .h trong cc th muc ny vo main.c. Tao th muc Phone v cha cc file phone.c, phone.h . add vo project. Cc su kin v trang thi ca chic in thoai ca chng ta s c x l chnh trong file phone.c ny. Include file .h ca button_matrix v lcd. 62 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
inh hnh: trc ht chng ta inh hnh lai vi tr v chc nng ca tng nt. V thuc hin c chc nng nhn tin cng nh goi in nn mi nt t 0-9 c thm cc chc nng ring. Ta khai bo mt mng lu gi nhng gi tri m ta mun nt nhn c th thuc hin. Code: unsigned char key[16][5] = { '0',' ',0,0,0, '1','.',',',0,0, '2','a','b','c',0, '3','d','e','f',0, '4','g','h','i',0, '5','j','k','l',0, '6','m','n','o',0, '7','p','q','r','s', '8','t','u','v',0, '9','w','x','y','z', '*',0,0,0,0, '#',0,0,0,0, 'A',0,0,0,0, 'B',0,0,0,0, 'C',0,0,0,0, 'D',0,0,0,0}; y c cc nt c nhiu k tu (7-p-q-r-s) cng c nt c t k tu (1-.) nn thun tin ta tao thm mt mng cha gi tri l s k tu c s dung ca nt : Code: unsigned char limit_key[16]={2,3,4,4,4,4,4,5,4,5,1,1,1,1,1,1}; By gi coi lai trong button.c c hm qut ma trn phm. Tuy nhin, gi tri tr v ca hm ny l vi tr ca cc nt trn bn phm (vd:11,22,33,A4.). Ta s cn phi chuyn i sang mt h khc thun tin trong vic lp trnh thng qua mt mng sau: Code: unsigned char convert_key[16]={1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15};
Chong trnh chnh ca chng ta l hm Phone() c goi lin tuc trong hm main(). Hm ny u tin s xt bin ActiveKey xem c nt nhn no c nhn khng . Khi c nt nhn th s c mt chuyn i nh Code: KeyPress = convert_key[ActiveKey-1]; V bin KeyPress ny chnh l gi tri chng ta x l chnh.
Bin PhoneStatus cha gi tri ca ca cc trang thi ca in thoai. Cc trang thi chnh l i (WAIT_STATUS), goi in (ENTERING_NUMBER_STATUS, CALLING_STATUS,ENDCALL_STATUS), nhn tin (MESS_STATUS, TYPING_MESS_STATUS, SENDING_STATUS, ENDSEND_STATUS). Vi mi trang thi ta x l nt C l quay lai, D l xa k tu, A l enter. ty theo quy inh mi ngi.
Tip theo chng ta x l nt nhn tai mi trang thi. Tai trang thi i, nu nhp vo l s th s ch hin s keyKeyPress0. Cn nu trong ch nhn tin th nu nh phm c nhn lp lai trong khong thi gian timeout th coi nh s chuyn k tu ngay tai nt : Code: KeyMessIndex = (KeyMessIndex +1)%(limit_key[KeyPress]); lcd_putChar(key[KeyPress][KeyMessIndex]); , nu khng th in k tu mi.: Code: KeyMessIndex = 1; lcd_putChar(key[KeyPress][KeyMessIndex]); Do['o23 co3! mNu Tai y
63 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi W : \u]t !3 < o-' ) !3 m2 t"&'
6.1 ^iSu ChiT' !3 < o-' ) !3 m2 t"&'. 6.1.1 8;0 !o L#) 7 <on LED 7 oan gm c 7 oan c nh du: a, b, c, d, e, f, g v mt im dp. Mi oan l mt led, kt hp tt/sng ca cc led ny hin thi s m chng ta hiu c.
Hnh 6 1 Led 7 oan LED 7 oan c hai loai l Common Anode v Common Cathode, tong ng cc LED ni chung Anode hay ni chung Cathode. Mach th nghim BKIT PIC s dung loai Common Anode.
Hnh 6.1 : So nguyn l led 7 oan 6.1.2 8;0 !o 5#) a !$,n LED ma trn 8x8 hai mu c b tr thnh 8 hng v 8 ct.
Hnh 6 3. Led ma trn Mi im c hai LED tong ng vi hai mu. Cc LED trn cng mt hng ni chung Anode, cc LED cng mu trn cng mt ct ni chung Cathode. 64 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 6 4 So nguyn l led ma trn 6.1.3 =g0(>n 5? @01! LA4 hin thi 1 led 7 oan, ta cn 8 ng tn hiu gi d liu cho n. Nh vy, vi 8 led 7 oan, theo kt ni bnh thng, ta cn tng cng 64 ng tn hiu thp sng 8 led cng lc. Vic ny rt tn ti nguyn v phn cng. khc phuc, ngi ta dng k thut qut led. Cc ng d liu ca cc led s c ni vi nhau.
Hnh 6 5 Kt ni khi qut led 7 oan Vi k thut qut led ny, tai 1 thi im, ch c 1 led sng. Tai thi im t1 ch c led 1 sng, tai thi im t2 t1 t0 ch c led 2 sng, khi t0 rt nh, mt ngi khng th nhn bit c nhp nhy gia 2 ln lun chuyn, v s c cm gic l 2 n sng cng lc. Thng th t0 ny phi nh hon 1/24 giy, tc l trong mt giy s c nhiu hon 24 ln lun chuyn gia cc led.
Bng m t qu trnh qut Led 7 oan: 65 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Tong tu i vi led ma trn, ta dng 16 ng tn hiu iu khin hai mu led v 8 ng tn hiu tch cuc dng (ROW). Tai mi thi im ch c mt dng led ma trn c hin thi d liu.
Hnh 6 6 Nguyn l qut led ma trn 6.2 HL _ C9t ';i m-ch
66 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 6-7 So kt ni led 7 oan v led ma trn Muc ch ca bi ny l moi ngi lm quen vi led 7 oan v led ma trn cho nn cc led 7 oan v led ma trn c kt ni theo kiu song song, cc chn d liu v iu khin led c gn truc tip vi chn vi iu khin PIC, v vy chong trnh s on gin v d thuc hin hon.
6.3 XP@ 3Z'? ch%L'? t"0'h 6.3.1 B !+ng hiCn !hDc c th hin thuc gii thut qut led chng ta cn s dung ti b inh thi(timer) v ngt qung thit lp thi gian qut. V du chng ta qut 1 led vi tn s 50Hz(ngha l led sng 50 ln/giy) nh vy ta cn cu hnh cho timer l c sau 1000ms/50 20ms th ngt 1 ln v trong hm x l ngt ta s a d liu ra cho led. Nu s led nhiu hon th ta ch cn ly tn s chun cho mi led nhn vi s lng led. V du nu qut cng luc 8 led 7 oan vi tn s mi led l 50Hz th tn s ngt ca timer l 850 400Hz. 6.3.2 8Ec h -hFc vF @01! 5#) 2.6.3.1 Hm qut led 7 on Code: void display_led7(void) { PORTE = 0; PORTD = led7_buffer[index_led7]; PORTE = 1 << index_led7; index_led7 = (index_led7 + 1) % 3; } Theo so nguyn l PORTD l port a d liu ra led 7 oan v PORTE l port chon led( y chng ta c 3 led 7 oan).Trc mi ln xut led, ta cn phi tt tt c cc led trnh trng hp d liu c c a vo led c chon tip theo,hay ngc lai d liu mi c a vo led trc .
2.6.3.2 Hm qut led ma trn Code: 67 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
void display_ledmatrix(void) { PORTA = 0; PORTB = green_buffer[index_matrix]; PORTC = red_buffer[index_matrix]; PORTA = 1 << index_matrix; index_matrix = (index_matrix + 1) % 8; } Theo so nguyn l, PORTA l port lua chon led, PORTB v PORTC tong ng l cc d liu xanh v ca led ma trn, cch qut vn ging vi vic qut led 7 oan. i vi vic qut led ta nn tao ra nhng mng buffer tin cho vic xut d liu v cp nhp chng, cng vi vic hin thuc 1 s hm cp nhp buffer nh update_led7_buffer(), update_green_bugffer(), update_red_buffer() chong trnh ca chng ta tr nn thn thin, trong sng, on gin hon rt nhiu v ph hp vi vic pht trin ln thnh nhng bi kh hon nh chay ch hay cc hiu ng led river.
68 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 1+ : Gi2o ti9p ';i ti9p HPI
<.1 Gii thiu )S HPI SPI (Serial Peripheral Interface) l mt dang giao thc truyn ni tip c dng giao tip vi cc thit bi ngoai vi(EEPROM,SDcard.) v cc vi iu khin khc. <.2 Ch9 > HPI t"o'? )i iSu ChiT' PIC Giao tip SPI c hin thuc qua 4 chn ca vi iu khin: G4H( Serial Data In ): Tn hiu ni tip c a vo vi iu khin G4:( Serial Data Out): Tn hiu ni tip t vi iu khin i ra 8L*(Clock): xung clock tao ra bi master GG(Slave Select): tch cuc mc thp, dng chon slave truyn d liu
Hnh 7-1 So khi ca SPI
7.2.1 8Ec !hanh ghi <iI0 'hiJn GPH Ch SPI c iu khin bng 4 thanh ghi sau
MSSP Control Register 1 (SSPCON1) MSSP Status Register (SSPSTAT) Serial Receive/Transmit Buffer Register(SSPBUF) MSSP Shift Register(SSPSR) thanh ghi ny khng c truy xut bi ngi dng
69 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hai thanh ghi SSPCON1 v SSPSTAT l hai thanh ghi iu khin, cn than ghi SSPSR l thanh ghi dng dich d liu ra/vo vi iu khin, SSPBUF l thanh ghi dng oc d liu t ngoi vo hoc ghi d liu truyn ra ngoi. ch nhn, 2 thanh SSPBUF v SSPSR l 1 b buffer i, khi d liu t ngoi truyn vo c lu y trong SSPSR(8 bits) th d liu ny c truyn ti thanh ghi SSPBUF ngi dng ly ra. Cn ch truyn th khi d liu c ghi vo thanh ghi SSPBUF th cng lc d liu cng c ghi vo thanh ghi SSPSR dich ra ngoi.
2.7.2.1 Thanh ghi GGPGT7T
Bit 7: SMP Sample bit SPI Master mode 1 d liu vo s c ly cui chu k xung clock 0 d liu vo s c ly gia chu k cung clock SPI Slave mode SMP phi c gn bng 0 Bit 6: CKE SPI Clock Select bit Bit 0: BF BuFffer Full Status bit(dnh cho qu trnh nhn) 1 qu trnh nhn hon thnh, SSPBUF y 0 qu trnh nhn ang thuc hin, SSPBUF trng
2.7.2.1 Thanh ghi GGP8:=1
Bit 7: WCOL Write Collision Detect bit(ch dng ch truyn tn hiu) 1 thanh ghi SSPBUF c ghi d liu trong khi d liu c truyn cha ht 0 khng c ung Bit 6: SSPOV Receive Overflow Indicator bit(dng ch nhn tn hiu) 1 c d liu mi nhn v ghi ln thanh ghi SSPBUF trong khi d liu trc cha c oc. 0 d liu khng bi ghi Bit 5: SSPEN Synchronous Serial Port Enable bit 1 bt ch SPI v cc chn SDI, SDO, SCK, SS c cu hnh tong ng. 0 tt ch SPI Bit 4: CKP Clock Polarity Select bit 1 thit lp trang thi rnh khi xung clock mc cao 0 thit lp trang thi rnh khi xung clock mc thp Bit 3-0: SSPM3:SSPM0 Synchronous Serial Port Mode Select bit 0101 ch slave, clock chn SCK, tt chc nng ca chn SS 0100 ch slave, clock chn SCK, bt chc nng ca chn SS 70 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
7.2.2 8;0 hKnh GPH cu hnh ch SPI cho vi iu khin PIC ta s dung cc bit HHPCFG1`7:+a v HHPH,A,`<:6a, khi cu hnh cc bit ny SPI ca PIC s c cu hnh ch master hoc slave, cung clock cho SPI, v thit lp vic nhn d liu xy ra canh ln hoc xung ca xung clock. Thanh ghi HHPHA c chc nng dich d liu ra v vo vi iu khin v lun l bit trong s cao trc. trong ch truyn, thanh ghi HHPBbI s ch cho n khi thanh ghi HHPHA sn sng nhn d liu ri mi ghi d liu ln thanh ghi HHPHA, nu c hnh ng ghi d liu vo thanh ghi HHPBbI trong lc d liu truyn cha xong th hnh ng c b qua v bitcCFL c bt ln bo hiu c xy ra ung . trong ch nhn, sau khi HHPHA nhn 8 bit d liu s c chuyn n thanh ghi HHPBbI v bit BI c bt ln bo hiu, nu d liu trc c lu trong thanh ghi HHPBbI cha c oc m lai c thm d liu mi th d liu mi s ghi ln d liu c v bitHHPF8 c bt ln.
Hnh 7-2 Kt ni SPI master/slave
Hm cu hnh ch SPI master cho vi iu khin PIC Code: void init_spi_master(void) { SSPSTATbits.CKE = 1; // when CKP = 0,CKE = 0 transmit data on falling clock,CKE = 1 transmit data on rising clock // when CKP = 1,CKE = 1 transmit data on rising clock,CKE = 1 transmit data on falling clock SSPCON1bits.CKP = 1; // CKP=0 data first,second is clock; CKP=1 clock SSPCON1bits.SSPEN = 1; // enable SPI master SSPCON1bits.SSPM0 = 0; // SSPCON1bits.SSPM1 = 0; // SSPCON1bits.SSPM2 = 0; // SSPCON1bits.SSPM3 = 0; // preacaler 1:4 }
71 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 11 : ^iSu ChiT' !3 < o-' ) mP t"' $d'? HPI
8.1 :9t ';i phD' cM'?
Hnh 8-1 So kt ni led 7 v led ma trn
bi ny chng ta s s dung mach ri s1, mach bao gm 8 led 7 oan v 1 led ma trn c s dung giao tip vi vi iu khin thng qua giao thc SPI. Trong mach ny vi iu khin PIC ng vai tr l master v cc IC TPIC595, 74HC595 ng vai tr l slave vi chc nng dich bit, ngoi chc nng dich bit IC TPIC595 cn c tc dung m v o tn hiu u vo, IC ny c s dung ph hp vi nguyn l hoat ng ca led 7 oan v led ma trn. Cch thc hoat ng ca mach l vi iu khin s dich d liu cn xut ra ngoi n cc con IC dich, v khi no dich d liu cn xut ra ngoi vi iu khin s kha d liu lai bng cch tao mt xung t thp ln cao trn chn LATCH ca cc IC dich ny, lc ny cc IC dich s ly d liu c ct trong b m trong qu trnh dich d liu ca vi iu khin v xut ra ngoi. 8.2 XP@ 3Z'? ch%L'? t"0'h Ngoi hm cu hnh ch SPI cho PIC nhu bi trn, chng ta cn hin thuc thm hm tao tn hiu LATCH, hm qut led 7 oan v led ma trn, hm xa led 7 oan v led ma trn. 72 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Ngoi ra chng ta cng cn b sung thm cc hm tin ch trong vic xut led 7 oan v led ma trn, chi tit cc ban c th tham kho trong th vin source code. 8.2.1 H !o !.n hiC0 L7T8H Code: void latch_spi(void) { unsigned char j; LATCH = 0;// create a rising clock to push data into output register for (j = 0; j <10;j++); LATCH = 1; for (j = 0; j< 10; j++); } 8.2.2 H L0;! 5#) 7 <on v 5#) a !$,n Vi cng gii thut qut led nh bi trn ch khc l trong chong trnh ngt ca timer ta goi hm xut truc tip d liu ra cc port ca vi iu khin th ra goi hm dich d liu t vi iu khin ra cc IC ngoai vi.Chi tit hm dich nh sau: Code: void scan_led7_matrix(void) { SSPBUF = 0x00; // select column for led matrix while (!SSPSTATbits.BF); SSPBUF = 0x00; // green matrix's data while (!SSPSTATbits.BF); SSPBUF = 0x00; // red matrix's data while (!SSPSTATbits.BF); SSPBUF = column[index]; // select column for led 7 segment while (!SSPSTATbits.BF); SSPBUF = code[buffer[index]]; // led7's data while (!SSPSTATbits.BF); latch_spi(); index = (index+1) % 8; } 8.2.3 H LMa )N 5iC0 !$>n 5#) 7 <on v 5#) a !$,n Code: void clear_spi(void) { unsigned char i; for (i =0; i< 5; i++) { SSPBUF = 0xff; while (!SSPSTATbits.BF); } latch_spi(); }
73 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 12 : \u]t 2 !3 m2 t"&' $d'? HPI
W.1 :9t ';i phD' cM'?
Hnh 9 1 So kt ni 2 led ma trn trong bi ny chng ta s dung mach ri c 2 led ma trn. Trong so ny ng d liu(16 bits) c truyn theo giao thc SPI, dich tng bit d liu ra cho con IC TPIC595 cn ng chon hng ca led ma trn(8 bits) c kt ni truc tip vi PORTD ca vi iu khin PIC,nn co ch truyn y l truyn theo kiu song song. W.2 XP@ 3Z'? ch%L'? t"0'h Tong tu i vi nhng bi qut led trn, ch khc y chng ta kt hp c phong php truyn song song v phong php truyn ni tip SPI.Vi mach ri c thit k 2 led ma trn s tao thm iu kin thuc hin nhng hiu ng chay ch a dang p mt, nh nhng bng quang bo hay thy thuc t. Code: void scan_2_led_matrix(void) { PORTD = 0; SSPBUF = green_buffer[index]; // high byte green color while (!SSPSTATbits.BF); SSPBUF = green_buffer[MAX + index]; // low byte green color while (!SSPSTATbits.BF); SSPBUF = red_buffer[index]; // low byte red color while (!SSPSTATbits.BF); SSPBUF = red_buffer[MAX + index]; // high byte red color while (!SSPSTATbits.BF); latch_spi(); PORTD = 1 << index; index = (index+1) % 8; } Trong th vin source code, chng ti co demo mu hiu ng ch chay vi hai mu xanh v , cc ban c th tham kho trong ti liu nh km. W.3 Co3! mNu Download tai y 74 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 13 : Gi2o ti9p ';i ti9p I2C ) DH13+< MFc <.ch& Tm hiu chun giao tip I2C v module I2C ca PIC18F. Tm hiu IC thi gian thuc DS1307. O>0 cP0& Vit chong trnh hin thi thng tin ngy gi ln LCD. 1+.1 Gii thiu I2C I2C l 1 chun truyn ni tip theo m hnh Master Slave. Mt Master c th giao tip vi nhiu Slave. Mun giao tip vi slave no, master phi gi ng ia ch tch cuc slave ri mi c php ghi hoc oc d liu t slave.
Hnh 10.1 : I2C interface
Bus I2C gm 2 dy tn hiu SCL (Serial Clock Line) v SDA (Serial Data Line) u c ko ln ngun. D liu c truyn tng bit SDA theo tng clock ca SCL.
Hnh 10.2 : I2C Protocol
Hnh 11.2 l giao thc I2C. Trc khi truyn d liu, ta cn khi ng I2C bng cch ko ln lt SDA v SCL xung mc thp. Sau 8 bit d liu s c ra tun tu theo tng canh xung chn SCL. Clock th 9 s dnh cho bit ACK. Bit ACK ny c th l do master gi xung hoc do slave gi v. Khi kt thc giao tip I2C, ta phi stop n bng cch ko 2 chn SCL v SDA ln mc cao. 1+.2 I2C t"o'? PIC18I472+ Module I2C trong PIC18F4520 h tr mode master v c slave (7bit ia ch v 10bit ia ch). Trong ti liu ny chng ti ch gii thiu chnh mode master ca PIC18F4520 giao tip vi 75 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
IC real time clock DS1307. File i2c.h inh ngha 1 s hng s v 4 hm co bn ca giao tip I2C. Code: #ifndef __I2C_H #define __I2C_H /* PIC18 I2C peripheral library header */ /* SSPCON1 REGISTER */ #define SSPENB 0x20 // Enable serial I2C port #define SLAVE_7 6 // I2C Slave 7bit mode #define SLAVE_10 7 // I2C Slave 10bit mode #define MASTER 8 // I2C Master mode /*I2C interface*/ void i2c_init(unsigned char sync_mode,unsigned char slew, unsigned char baudrate ); //open I2C port void i2c_start(); //start condition void i2c_stop(); //stop condition void i2c_write_byte(unsigned char abyte); unsigned char i2c_read_byte(unsigned char ACK); #endif 10.2.1 H i2c"ini! u tin ta phi thit lp chiu input cho 2 chn SCL v SDA bng cch thit lp 2 bit tong ng trong thanh ghi TRISC l 1.
PIC18F4520 s ng vai tr l master gi clock, ni dung trong thanh ghi SSPADD s c dng cho b sinh clock. Tn s cho giao tip I2C s c tnh theo cng thc sau y Code: f = Fosc/4*(SSPADD + 1) Ta s chon tn s cho SCL l 100kHz v phi nap vo thanh ghi ny gi tri 49 (0x31) cho thanh anh 20MHz.
Tip theo l chon mode master cho PIC18F4520, thit lp SSPM3:SSPM0 1000 v enable bit SSPEN trong thanh ghi SSPCON1. Code: void i2c_init(unsigned char sync_mode,unsigned char baudrate ) { SSPSTAT &= 0x3F; // power on state SSPCON1 = 0x00; // power on state SSPCON2 = 0x00; // power on state SSPCON1 |= sync_mode; // select serial mode DDRCbits.RC3 = 1; //Set SCL to input DDRCbits.RC4 = 1; //Set SDA to input SSPADD = baudrate; SSPCON1 |= SSPENB;//enable I2C } 10.2.2 H i2c"%!a$! khi ng I2C (Start condition) ta ch cn set bit Start Enable, SEN (SSPCON20) v ch cho n khi qu trnh ny kt thc. u trnh khi ng I2C gm nhiu gian oan, kt thc mi giai oan s c cc c bo hiu. 76 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 10.3 : Khi ng I2C
Ban u 2 chn SDA v SCL mc cao. Khi SEN 1, b sinh baudrate bt u m v khi ht time out, chn SDA ko xung mc thp, bit S (SSPSTAT3) bt ln 1 bo hiu giai oan 1 ca qu trnh khi ng I2C kt thc. Sau b sinh baudrate c load lai v bt u m. Khi ht time out, chn SCL s c ko xung thp, kt thc qu trnh khi ng I2C. Lc ny bit SEN c xa bng phn cng v bit SSPIF c bt ln 1.
Khi hin thuc code nu vit k ta c th ch tng giai oan, tuy nhin module I2C c tch hp sn trong PIC nn xc sut li cng rt thp. Ta c th lm on gin hon bng cch set bit SEN ln v ch cho n khi SSPIF bt ln 1. Ta cn phi xa SSPIF cho ln kim tra tip theo v bit ny khng c tu ng xa bng phn cng. Code: void i2c_wait() { while(PIR1bits.SSPIF != 1){}; //wait SSPIF set PIR1bits.SSPIF = 0; //clear SSPIF } void i2c_start() { SSPCON2bits.SEN = 1; //set start enable bit i2c_wait(); //wait SSPIF set } 10.2.3 H i2c"%!o-
77 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 10.4 : Stop I2C
u trnh kt thc I2C c bt u bng cch set bit PEN (SSPCON22). Cng ging nh qu trnh khi ng, qu trnh kt thc gm 2 giai oan chnh v mi giai oan u c bit bo hiu nhng ta c th lp trnh on gin bng cch set bit PEN v ch cho n khi SSPIF c set ln 1. Code: void i2c_stop() { SSPCON2bits.PEN = 1; //set stop enable bit i2c_wait(); //wait SSPIF is set } 10.2.4 H i2c"Q$i!#"R(!# Vic gi 1 byte d liu t master xung slave c bt u khi c lnh gn vo thanh ghi SSPBUF. Ngay lc ny c BF (Buffer Full) s bt ln 1. u trnh gi d liu bt u theo tng xung clock chn SCL. Sau 8 clock, 8 bit d liu trong thanh ghi SSPBUF c shift ht v c BF bt xung 0. Master s th chn SDA slave c th gi tn hiu ACK v master. Nu nhn c ACK, bit ACKSTAT s c xa, ngc lai bit ny s c bt ln 1. Gi tri ACK c lu trong bit ACKDT. u trnh gi ACK t slave ln master c thuc hin trong clock th 9 ca SCL v sau bit SSPIF c set ln 1. Ngi lp trnh c th check qua cc c BF, ACKSTAT v sau cng l SSPIF kim tra li. oan code di y ch kim tra c nhn c ACK hay khng ch cha kim tra ACK ng hay sai. Code: void i2c_write_byte(unsigned char abyte) { SSPBUF = abyte; //wait BF is set while(SSPSTATbits.BF != 0){} //wait ACK received, ACKSTAT is set
while(SSPCON2bits.ACKSTAT != 0){} i2c_wait(); } Tuy nhin trong 1 vi ng dung on gin ta c th vit nh sau: Code: 78 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
void i2c_write_byte(unsigned char abyte) { SSPBUF = abyte; //byte to send i2c_wait(); //wait SSPIF is set } 10.2.5 H i2c"$#a)"R(!# Hm ny dng oc 1 byte d liu t slave v. Khi bit RCEN (SSPCON23) c set ln 1, d liu t slave bt u gi vo thanh ghi SSPBUF. Sau 8 clock d liu s c shift vo thanh ghi SSPBUF v c BF s c bt ln 1. ng thi c SSPIF cng c set v RCEN c clear bng phn cng. Khi oc xong, c SSPIF s c xa, ta cn set ACKEN ln 1 (SSPCON24) gi ACK v cho slave. Bit ACK l 0 hay 1 c quy inh trong bit ACKDT (SSPCON25). Khi gi xong ACK clock th 9, c SSPIF s c bt ln lai. Code: unsigned char i2c_read_byte(unsigned char ack) { SSPCON2bits.RCEN = 1; //enable receive i2c_wait(); //wait SSPIF is set
SSPCON2bits.ACKDT = ack; //set ACK value i2c_wait(); //wait SSPIF is set SSPCON2bits.ACKEN = 1; //enable ACK feedback return SSPBUF; } 1+.3 A!2 ,im! CocC DH13+< DS1307 l IC thi gian thuc (Real time clock) m gi, pht, giy, thng, ngy ca thng, ngy ca tun, nm k c nm nhun (n nm 2100).
56 byte Ram lu tr d liu, nhng d liu khng bi mt khi tt ngun. S dung 2 dy tn hiu truyn d liu theo giao thc I2C.
C th lp trnh c xut tn hiu xung vung. Tu ng pht hin ra ngun cung cp bi li (ngt ngun) v chuyn qua mach bo v s dng ngun pin du tr.
10.3.1 =g0(>n 5? ho! <ng DS1307 hoat ng nh mt slaver trn bus d liu ni tip. truy xut ni dung ta phi thit lp mt iu kin Start v cung cp m nhn dang ca IC (Device Identification Code) theo sau bi thanh ghi ia ch. Cc thanh ghi theo sau c truy xut tun tu cho n khi gp tn hiu Stop. Khi VCC 1.25Vbat th DS1307 s kt thc vic truy xut v reset lai b m ia ch. Cc Input s khng c nhn ra tai thi im ny ngn nga mt s lng ln d liu c ghi ti DS1307 t h thng bn ngoi. Khi VCC Vbat th ic ny s chuyn sang mode s dung pin du tr. Khi ngun chnh c bt ln th IC ny s chuyn t dng ngun pin sang dng ngun chnh. Hnh sau m t nhng phn chnh ca DS1307. 79 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 10.5 : So khi DS1307 10.3.2 8Ec !.n hiC0 Hn-0! v :0!-0! VCC, GND : Ngun DC c cung cp cho IC qua nhng chn ny. Khi gn vo ngun 5V th IC ny c th oc ghi bnh thng. Nhng khi ngun gim xung cn 3V th vic oc ghi s khng c php. Tuy nhin, cc chc nng ca timer vn tip tuc vi ngun cung cp thp. Khi Vcc gim xung di VBAT th RAM v timekeeper c chuyn qua s dung ngun cung cp tai VBAT.
VBAT : Cung cp ngun d tr 3V. hoat ng ch s dung ngun Vbat th 2.0V Vbat 3.5V. Khi VCC gn bng 1.25VBAT th chng ta s khng c php truy xut vo RTC (Real time clock) v Ram bn trong ca IC.
SCL (Serial Clock Input) : SCL c dng ng b d liu trn ng truyn ni tip.
SDA (Serial Data Input/Output) : SDA l chn I/O. SDA l chn Open drain nn cn c in tr ko ln bn ngoi.
SW/OUT (Square Wave/Output Driver) : Khi c bt ln, th bit SWE set ln 1, v chn ny s output ra 1 trong 4 tn s sng vung l 1hz, 4khz, 8khz, 32khz. Chn ny cng l chn Open drain nn cng yu cu c in tr ko ln ngun bn ngoi. SW/OUT s hoat ng khi c ngun cung cp vo cho d l ngun VCC hay l VBAT.
X1, X2 : Kt ni vi thach anh 32.768Khz. Mach tao xung bn trong c thit k hoat ng vi thach anh v tu CL 12.5 pF.
80 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
10.3.3 6T8 v %S <T <Ua chV 6a So ia ch ca RTC v cc thanh ghi Ram ca DS1307 nh hnh di. Cc thanh ghi RTC c inh ia ch t 00h n 07h. Cc thanh ghi Ram c inh ia ch tip theo sau v t 08h n 3fh. Trong khi truy sut nhiu byte v khi con tr ia ch ch ti 3fh, vi tr cui ca vng nh Ram, th n s quay lai ia ch 00h truy xut tip.
Hnh 10.6 : RTC v so RAM 10.3.4 ThWng !in !hXi gian v 5Uch Thng tin thi gian v lich c cha trong trong cc thanh ghi tong ng. Cc thanh ghi RTC nh hnh trn. Thi gian v lich c set hoc khi tao bng cch ghi ra cc byte thanh khi tong ng. Ni dung ca cc thanh ghi thi gian v lich c inh dang theo kiu BCD. Bit 7 ca thanh ghi 0 l clock halt bit (CH). Khi bt ny c set ln 1 th mach dao ng s bi n khng c s dung na, khi clear xung 0 th mach dao ng s c kch hoat tr lai.
DS1307 c th chay ch 12h hay 24h. Bt th 6 ca thanh ghi hours c inh ngha set xem s dung IC ny ch no. Khi bit ny bng 1 th ch 12h c chon. Trong ch 12h th bit 5 ch AM/PM (PM khi bit ny l 1). Trong ch 24h, th bt 5 l bt th 2 ca 10hour (20:23).
Hnh 10.7 : inh dang d liu 10.3.5 9hi )N 5iC0 vo 4G1307 81 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 10.8 : Ghi d liu vo DS1307 y l qu trnh truyn d liu t master xung slave. Khi master gi xong 1 byte, slave s gi lai bit ACK. u trnh giao tip nh sau: Master gi tn hiu Start. Master gi ia ch ca DS1307 (1101 000) v bit R/W, trong trng hp ny l 0. Byte u tin m master gi xung sau khi start l D0. Master gi ia ch pointer d liu cn ghi, chng han l 0x00 (register pointer, word address) Master gi cc byte data cn ghi. Master gi tn hin stop. Code hin thuc cho qu trnh ny nh sau Code: void rtc_write(unsigned char *buff) { i2c_start(); i2c_write_byte(0xD0); //Address + Write bit i2c_write_byte(0x00); //Pointer i2c_write_byte (*(buff+0)); //Second i2c_write_byte (*(buff+1)); //Minute i2c_write_byte (*(buff+2)); //Hour i2c_write_byte (*(buff+3)); //Day i2c_write_byte (*(buff+4)); //Date i2c_write_byte (*(buff+5)); //Month i2c_write_byte (*(buff+6)); //Year i2c_stop(); } buff l 1 mng c 7 phn t, tong ng vi cc gi tri giy, pht, gi, th, ngy, thng v nm.
10.3.6 YZc )N 5iC0 ![ 4G1307
Hnh 10.9 : oc d liu t DS1307 y l qu trnh truyn d liu t slave ln master. Nh trnh by phn trc, khi gi nhn tng byte, s c bit ACK i km ngoai tr byte cui cng trc khi stop. c th oc chnh xc gi tri mong mun, thng thng ta phi ghi vo thanh ghi ia con tr d liu (register pointer). u trnh ny chnh l trnh truyn d liu t master xung slave nn R/W bit s l 0. Sau khi ghi d liu v register pointer xong, qu trnh oc d liu mi bt u, v bit R/W s l 1. Tng bc oc d liu t DS1307 nh sau: 82 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Master gi tn hiu start. Master gi ia ch DS1307 R/W 0 : 0xD0. Master gi byte ghi vo register pointer : 0x00. Master gi tn hiu start Master gi ia ch DS1307 R/W 1 : 0xD1. Master oc cc byte d liu v gi bit ACK. Byte cui cng trc khi stop, master gi bit NACK. Master gi tn hin stop. Code hin thuc cho qu trnh ny nh sau Code: void rtc_read(unsigned char * buff) { //send address to slave and reset pointer i2c_start(); i2c_write_byte(0xD0); //Address + Write bit i2c_write_byte(0x00); //Pointer i2c_start(); //Restart i2c_write_byte(0xD0); //Address + Read bit *(buff+0)=i2c_read_byte(ACK); // Second *(buff+1)= i2c_read_byte(ACK); // Minute *(buff+2)= i2c_read_byte(ACK); // Hour *(buff+3)= i2c_read_byte(ACK); // Day *(buff+4)= i2c_read_byte(ACK); // Date *(buff+5)= i2c_read_byte(ACK); // Month *(buff+6)= i2c_read_byte(ACK); // Year i2c_stop(); } 1+.4 XP@ 3Z'? ch%L'? t"0'h y s gii thiu cu trc chong trnh hin thi thng tin ngy thng nm, gi pht giy ca DS1307 ln LCD. Chong trnh gm 3 module 9 l I2C, RTC v LCD.
Hnh 10.10 : Cu trc chong trnh Chi tit chong trnh c hin thuc trong th muc Bai11_I2C. chay c chong trnh ban cn bt 2 switch ca RTC (SW4) ln ON, bt ngun ca LCD (SW3) v tt led PortB (SW1). 83 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
84 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 14 : A'2o? to Di?it2 Co')!"t!" ADC
MFc <.ch& Tm hiu module ADC ca PIC18F. O>0 cP0& Vit chong trnh hin thi gi tri ADC chn AN0 ln LCD. 11.1 Gii thiu Vi iu khin ch c th x l c tn hiu s ri rac (digital signal), chng khng th x l c cc tn hiu tong tu (analog signal). B chuyn i tn hiu tong tu sang s (analog to digital converter) hay cn goi l ADC, s chuyn in p tong tu (analog voltage hay analog signal) sang dang s ri rac (digital number). Vi x l s biu din tn hiu in p tong tu thnh 1 s nguyn (non-fractional number) v s x l trn s nguyn ny.
Hnh 11.1: Analog to Digital Converter Theo v du trn, in p 2.343volt s c chuyn i thnh s nguyn 87. Ngi lp trnh c th dng s 87 ny biu din cho gi tri in p ng vo 2.343 volt. Vic vi iu khin x l trn s 87 s at hiu qu cao hon, v n l 1 s nguyn. 11.2 G?u@(' e chu@T' fi ADC
Hnh 11.2 : Chuyn i ADC u trnh chuyn i ADC gm 3 giai oan: Giai oan 1 : Nap in cho tu chn ADC (Holding Capacitor). Giai oan ny tn 1 khong thi gian c goi l Acquisition time (TAC). Trong vi iu khin PIC, thi gian ny c th c cu hnh bng tay hoc tu ng. Khi chon cu hnh bng tay, ngi lp trnh phi tu tnh ton thi gian delay c th nap y tu trc khi ban hnh lnh chuyn i. Khi chon cu hnh tu ng, vi iu khin s m bo l sau khi ban hnh lnh chuyn i 1 khong TAC, qu trnh chuyn i mi bt u. Thi gian ny l 1 hng s v ty thuc vo vi iu khin. Chng ta cn oc k datasheet ca n xc inh cho ng. Giai oan 2 : Ngt kt ni vi tu Holding Capacitor bng 1 lnh SLEEP. u trnh ny c thuc hin tu ng bi vi iu khin, ngi lp trnh khng cn phi quan tm. Thi gian chuyn i phu thuc vo phn gii ca gi tri ADC (8bit, 10bit hay 13 bit) v clock cp cho module ADC. Khi lp trnh, chng ta thng khng quan tm n thi gian ny v khi chuyn i xong, vi iu khin s set c bo hiu. Ngi lp trnh ch cn polling xt c ny hoc s dung ngt ly gi tri chuyn i. Giai oan 3 : X tu Holding Capacitor. Giai oan ny ch chim 1 khong thi gian nh v n c thuc hin tu ng bi vi iu khin. Giai oan ny xy ra sau khi c bo hiu chuyn i hon tt. c th bt u tip vic chuyn i ln th 2, vi iu khin s cn phi ch thm 1 khong thi gian x tu v acquisition time. Nu khng ch ng thi gian ny, qu trnh chuyn i bt u sm hon, kt qu thu c c th khng cn chnh xc na. 11.3 ADC t"o'? PIC18I i vi dng chip PIC 40/44 chn c 13 knh ADC, dng 28 chn th c 10 knh ADC. Module ADC s chuyn i tn hiu tong tu thnh tn hiu s 10 bit. Module ADC trong PIC c 5 thanh ghi: 85 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
ADRESH : Thanh ghi kt qu, cha phn bit cao. ADRESL: Thanh ghi kt qu, cha phn bit thp. ADCON0, ADCON1, ADCON2 : Cc thanh ghi iu khin.
,h2'h ?hi ADCFG+
Hnh 11.3 : Thanh ghi ADCON0
Bit <g6 : Khng s dung. Bit 7g2 ChH3gChH+ : Lua chon knh Analog. 0000 : Knh 0 (AN0) 0001 : Knh 1 (AN1) 0010 : Knh 2 (AN2) 1101 : Knh 11 (AN11) 1100 : Knh 12 (AN12) 1101,1110,1111 : Khng s dung. Bit 1 GFiDFGE : Bit trang thi ca qu trnh chuyn i khi ADON 1. 1 : ang chuyn i A/D. 0 : Chuyn i hon tt. Bit + ADFG : A/D On bit 1 : Cho php chuyn i. 0 : Tt chc nng chuyn i. ,h2'h ?hi ADCFG1
Hnh 11.4 : Thanh ghi ADCON1 Bit < j 6 : Khng s dung. Bit 7 : VCFG1 Voltage Reference Configuration bit (bit cu hnh in p tham kho VREF-) 1 : in p tham kho VREF- l in p chn AN2 0 : in p thao kho VREF- VSS Bit 4 : VCFG0 Voltage Reference Configuration bit (bit cn hnh in p tham kho VREF) 1 : in p tham kho VREF l in p chn AN3 0 : in p tham kho VREF l VDD Bit 3g+ A/D Port Configuration Control bits : Cu hnh chn l Analog hay Digital
,h2'h ?hi ADCFG2
Hnh 11.5 : Thanh ghi ADCON2 Bit < ADIM : inh dang kt qu trong 2 thanh ghi ADRESH v ADRESL 1 : Canh phi
0 : Canh tri
Bit 6 : Khng s dung Bit 7g3 : A/D Acquisition Time Select bit : Bit chon thi gian nap cho tu Holding Capacitor. 86 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
111 : 20 TAD 110 : 16 TAD 101 : 12 TAD 100 : 8 TAD 011 : 6 TAD 010 : 4 TAD 001 : 2 TAD 000 : 0 TAD TAD l thi gian chuyn i 1 bit ADC, phu thuc vo clock c lua chon bn di. Thi gian nap cho tu Holding Capacitor c inh l 2.4us, sau khi chon clock cho module ADC, ta s phi tnh ton chon h s nhn vi TAD
Lu trong trng hp 000, y l ch lp trnh bng tay cho thi gian Acquisition Time, ngi lp trnh phi tu tao 1 khong thi gian delay cho qu trnh nap tu Holding Capacitor.
Bit 2g+ : A/D Conversion Clock Selection bit : Bit chon clock cho b chuyn i A/D 111 : FRC 110 : FOSC/64 101 : FOSC/16 100 : FOSC/4 011 : FRC 010 : FOSC/32 001 : FOSC/8 000 : FOSC/2 Nu ta chon l 000 th TAD 2 TOSC 2/FOSC, FOSC l chu k lnh, bng tn s dao ng.
11.4 C/u h0'h ADC t"o'? PIC18I Vic cu hnh module ADC trong PIC18F i theo trnh tu sau: Cu hnh chn A/D (s knh AD, chiu ca chn AD l input), in p tham kho (ADCON1) Chon knh A/D (ADCON0) Chon thi gian acquisition time (ADCON2) Chon clock. Bt ch AD (bit ADON trong ADCON0). Nu chon lua ch acquisition time l tu ng, ban ch cn set bit GO_DONE bt u qu trnh chuyn i v polling bit ny ch cho n khi qu trnh chuyn i hon tt.
Nu acquisition time c chon l ch chnh bng tay (manual mode), ban phi tu vit delay ch, sau mi c php set bit GO_DONE. 11.7 hi' thZc ch%L'? t"0'h
Hnh 11.6 : Kin trc chong trnh ADC
11.5.1 H ini!"a)c23 Hm ny dng khi tao ban u cho module ADC, c hin thuc ng theo trnh tu cu hnh ADC trong PIC 18F. mach BKIT PIC, ch c 1 knh ADC ni vi chn AN0, bit 0 ca PortA.
thanh ghi ADCON1, ta s ln lt chon in p tham kho l VSS v VDD, cc bit 5,4 set l 0.
Cu hnh ch dng 1 knh AD chn AN0, bit 3:0 PCFG3:PCFG0 1110, ADCON1 0x0E. Cu hnh chiu input cho chn ADC ny.
Chon clock l FOSC /2 (ADCS2:ADCS0 000), lc TAD 2TOSC 2/(5MHz) 2/(5106) (s). 87 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Thi gian acquisition time l hng s 2.4us 2.4 10-6 (s). Ta phi tha mn c 2.4 10-6 2k/(5106) k 1.2 Ta s chon k 2 ACT2:ACT0 001. Nh vy ADCON2 0x04. Bt bit ADON thanh ghi ADCON0. Code: void init_adc() { TRISA = 0x01; //input for analog pin ADCON1 = 0x0E; //config ADC pins ADCON0 = 0x00; //select AN0 ADCON2 = 0x04; //select acquisition time ADCON0bits.ADON = 1; //enable ADC }
11.5.2 H g#!"a)c"va50# Sau khi khi tao xong module ADC, ta c th ly kt qu bt c lc no. Trc tin ta s set bit GO_DONE ln 1 bt u qu trnh chuyn i v ch cho n xung 0, vic chuyn i hon tt, kt qu s c lu trong 2 thanh ghi ADRESH:ADRESL (ch canh tri). Code: int get_adc_value() { int result = 0; ADCON0bits.GO_DONE = 1; //start conversion while(ADCON0bits.GO_DONE == 1){} //polling result = ADRESH; result = (result<<2) + (ADRESL>>6); return result; } Nu ngi dng ch cn 8 bit th c th s dung gi tri trong thanh ghi ADRESH l .
88 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 17 : ^iSu ch9 Bu'? PcM
MFc <.ch& Tm hiu module CCP1 ca PIC18F, thit lp ch hoat ng PWM. O>0 cP0& Vit chong trnh iu khin tc ng co, hin thi tc ra mn hnh LCD. 12.1 :h#i 'im PcM PWM vit tt ca t Pulse Width Modulation. PWM c s dung nhiu trong h thng iu khin tu ng ngy nay. N c ng dung trong iu khin tc ng co, sng ti ca led, mn hnh LCD, pha mu cho bang quang bo, s dung trong cc thut ton iu khin vn tc cho Robot nh PI, PD, PID .
Hiu on gin PWM hoat ng nh mt cng tc ng m rt nhiu ln trong 1 giy. Nu tn s ng m cng nhanh th in p cp trung bnh cng ln.
Mt s khi nim co bn ca PWM : Tn s (Hz, Khz.). Chu k T, thi gian xung mc cao TH thi gian xung mc thp TL. Duty Cycle: t l thi gian xung mc v thi gian xung mc thp.
Nh hnh trn ta c Duty Cycle ln lt l 0, 25, 50, 75, 100. Mt s cng thc : 89 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Khi nu TOn 0 th VoltOutput 0 (V) cn TOn TTotal th VoltOutput VoltInput .
12.2 PcM t"o'? PIC18I472+ PIC18F4520 c 2 module CCP. y chng ti gii thiu module CCP1. Module ny ngoi chc nng PWM thng thng, n cn c chc nng Enhanced PWM dng iu khin mt s loai mach cu H thng dung.
Nguyn l hoat ng chung ca cc module PWM tch hp sn trong vi iu khin l n s s dung 1 b timer m. Khi gi tri m ca timer bng vi Chu k hoc Duty Cycle th ng ra s thay i. Hnh di y minh hoa cch hoat ng ca module PWM trong PIC18F4520, n s dung timer2 cho b m.
Hnh 12.1 : Nguyn l hot ng ca PWM
Trnh tu thit lp PWM trong PIC18F4520 nh sau:
12.2.1 Thi\! 5,- ch0 'K P]M Chu k ca module CCP1 c tnh nh sau :
PWM Period (PR2 1)4TOSC(TMR2 Prescaller)
Trong TOSC 1/FOSC, FOSC 20MHz nu s dung thach anh ngoi.
TMR2 Prescaller c xc inh trong thanh ghi T2CON. ch mc inh ban u, TMR2 Prescaller1.
Trn thuc t, ngi ta dng thut ng tn s PWM, l nghich o ca chu k : 90 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
PWM Frequence FOSC/ (PR21) 4 (TMR2 Prescaller)
Tn s iu khin PWM ty thuc vo tng loai thit bi. i vi ng co, tn s PWM phi ph hp vi p ng ca driver iu khin ng co.
Trong mach BKIT PIC, chng ti chon tn s l 2 kHz. Gi s ta chon TMR2 Prescaller l 16 (T2CKPS1 1), th gi tri ca PR2 l
PR2 20MHz/ (4 16 2KHz) - 1 155
12.2.2 Thi\! 5,- P]M 40!( 8(c5# Duty Cycle ca CCP1 c thit lp trong 2 thanh ghi CCPR1L (8bit) v 2 bit DC1B1:0 trong thanh ghi CCP1CON. Tuy nhin i vi ng co nh th vi 8 bit l , ta c th mc inh DC1B1:0 00 ngay khi khi tao. Gi tri ca CCPR1L cng cao th duty cycle cng ln, v nh vy in p ng ra ca CCP1 (RC2) cng cao.
Sau khi thit lp xong 2 thng s trn, cc bc cn lai l thit lp chiu output cho chn RC2, cho php timer2 m bng cch set bit TMR2ON ln 1, v cu hnh CCP1CON l ch Single PWM.
12.3 XP@ 3Z'? ch%L'? t"0'h Kin trc chong trnh gm c 2 module chnh PWM v LCD.
Hnh 12.2 : Kin trc chong trnh PWM
Module PWM gm c 2 file pwm.h khai bo cc interface v pwm.c hin thuc cc interface . Interface trong pwm.h nh sau: Code: #ifndef _PWM_H_ #define _PWM_H_ #include <P18F4520.h> void init_pwm(); void set_DC(unsigned char duty_cycle); #endif 12.3.1 H ini!"-Q Hm ny hin thuc qu trnh khi ng cho module PWM. Trc tin l cu hnh prescaller cho timer2, nap gi tri PWM Period v chon ch PWM trong thanh ghi CCP1CON. Code: 91 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
void init_pwm() { T2CONbits.TMR2ON = 0; //turn off timer2
T2CONbits.T2CKPS0 = 0; T2CONbits.T2CKPS1 = 1; //prescaler 1:16 PR2 = 155; //PWM period CCP1CONbits.DC1B0 = 0; //PWM duty cycle CCP1CONbits.DC1B1 = 0; //2 bits LSB CCPR1L = 0x00; //8bits MSB CCP1CONbits.P1M0 = 0; //PWM single mode CCP1CONbits.P1M1 = 0; CCP1CONbits.CCP1M0 = 0;//select PWM function CCP1CONbits.CCP1M1 = 0; CCP1CONbits.CCP1M2 = 1; CCP1CONbits.CCP1M3 = 1; TRISCbits.TRISC2 = 0; //config RC2 output T2CONbits.TMR2ON = 1; //start timer2 } 12.3.2 H %#!"48 Hm ny ch on gin l thit lp duty cycle trong thanh ghi CCPR1L. Gi tri trong thanh ghi ny cng cao th p ra chn RC2 cng cao, gi tri ti a l 255 tong ng vi khong 5V. Code: void set_DC(unsigned char duty_cycle) { CCPR1L = duty_cycle; } Chong trnh demo cho phn ny c hin thuc trong th muc Bai13_PWM. Hm main s tng dn duty cycle ln v ng co s quay nhanh dn. Gi tri ca duty cycle (hay tc ca ng co) s c hin thi ra LCD.
12.4 Co3! mNu Download tai y
92 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 16 : Gi2o ti9p bAA, AH232 13.1 G?u@(' e ?i2o ti9p bAA, Uart RS232 l chun giao tip kh ph bin v c h tr hu ht cc dng vi iu khin v khong cch xa v chi ph thp. Dng 8051 h tr 1 knh giao tip uart. D liu c truyn i trn chn TX gm 1 start bit (mc 0), data v 1 stop bit (mc 1).
Tc truyn : on vi bit per second (bps) cn goi l Baud (s ln thay i tn hiu trong 1 giy thng s dung cho modem). i vi ng truyn th Baud v bps l nh nhau. UART l phong thc truyn nhn bt ng b. ngha l bn nhn v bn pht khng cn phi c chung tc xung clock (v du : xung clock ca vi iu khin khc xung clock ca my tnh) . Khi bn truyn mun truyn d liu s gi start bit (bit 0) bo cho bn thu bit bt u nhn d liu v khi truyn xong d liu th stop bit (bit 1) s c gi bo cho bn thu bit kt thc qu trnh truyn. Khi c start bit th c hai bn s dng chung 1 xung clock (c th sai khc mt t) vi rng 1 tn hiu (0 hoc 1) c quy inh bi baud rate, v du baud rate 9600bps ngha l rng ca tn hiu 0(hoc 1) l 1/9600 104 ms v khi pht th bn pht s dng baud rate chnh xc (v du 9600bps) cn bn thu c th dng baud rate sai lch 1 t(9800bps chng han). Truyn bt ng b s truyn theo tng frame v mi frame c cu trc nh sau:
Ngoi ra trong frame truyn c th c thm bit odd parity (bit l) hoc even parity (bit chn) kim tra li trong qu trnh truyn. Bit parity ny c c im nu s dung odd parity th s cc bit 1 odd parity bit s ra 1 s l cn nu s dung even parity th s cc bit 1 even parity bit s ra 1 s chn. 13.2 Gi2o ti9p bAA, )i m#@ tJ'h giao tip COM gia vi iu khin v my tnh, ta kt ni mach theo so nh sau: 93 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 13.1 : Kt ni my tnh v vi iu khin Do mc in p ca tn hiu logic 1/0 cng COM ca my tnh khc vi vi iu khin, nn MAX 232 c tc dung chun ho mc in p gia my tnh v iu khin trong qu trnh truyn nhn d liu. Nu giao tip truc tip gia 2 vi iu khin, ta khng cn phi s dung MAX 232.
13.3 bAA, t"o'? PIC18I Trong phn ny xin gii thiu cc bc thit lp vic truyn 1 byte UART, vic cu hnh nhn UART cng tong tu nh truyn. Trnh tu cc bc nh sau : Nap gi tri vo 2 thanh ghi BRGH: BRG thit lp tc truyn theo cng thc Baudrate Fosc/ (64 (BRGH : BRG 1)). Enable serial port bng cch clear bit SNC v set bit SPEN Nu mun thit lp interrupt, th set thm TXIE, GIE v PEIE. Set bit TXEN cho php truyn. Nap d liu vo thanh ghi TXREG. Khi truyn xong c TXIF s bt ln 1, ta s kim tra c ny trc khi truyn d liu mi. Hin thuc bng code nh sau : 94 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
//step 4 : disable bit 9 TXSTAbits.TX9 = 0; //step 5 : enable transmission TXSTAbits.TXEN = 1; } Sau khi enable vic truyn, ta ch cn ghi d liu v thanh ghi TXREG v kim tra c TXIF bt ln: Code: void uart_transmit(unsigned char data) { TXREG = data; while(PIR1bits.TXIF == 1){} } 13.4 :iTm t"2 t"u@S' 'h&' bAA, kim tra vic truyn nhn uart c ng hay khng ta thng dng 1 s ng dung hyper terminal kim tra. Lc ny my tnh ca chng ta s l i tng dng giao tip vi BKIT PIC. Trong a CD ny c phn mm hyper terminal kh thng dung cha trong th muc Terminal, ban ch cn double click vo file Terminal.exe l khi ng c chong trnh. 95 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 13.2 : Hyper Terminal Cng vic cn lai l cu hnh cho cng COM truyn nhn uart cho tong thch vi giao thc truyn nhn ca board 89. Cc thng s thng thng l Baud rate 9600, Data bit 8bit, khng c Parity (chon none) v 1 Stop bit. Nhn nt Connect kt ni. K t y nu board 89 c gi d liu ln, d liu ny s nm trong phn Receive. Ngc lai, mun gi d liu xung board 89 ta g vo textbox v n Send. 13.7 Do['o23 Code mu Phn mm Terminal
96 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 1< : Gi2o ti9p )i $' phJm PH2 13.6 G?Et '?oi 13.6.1 9ii !hiC0 ng^! ngoi Ngt ngoi trn vi iu khin thng l mt chn vo c kh nng pht hin su thay i tn hiu bn ngoi. C th chia ngt thnh hai loai : Ngt canh v ngt mc. Ngt canh c hai loai: ngt canh ln xy ra khi c su chuyn tn hiu t mc thp ln mc cao chn ngt ngoi. Tong tu ngt canh xung xy ra khi c su chuyn tn hiu t mc cao xung mc thp. Ngt mc cng c hai loai: ngt mc cao v mc thp. Ngt mc cao (thp) xy ra khi tn hiu tai chn ngt ngoi mc cao (thp) trong ti thiu 1 chu k. Trong vi iu khin PIC ch c ch ngt canh(ln/xung) khng tn tai ch ngt mc. 13.6.2 =g^! ngoi !$ong vi <iI0 'hiJn PH8 Trong vi iu khin PIC, c 3 ngt ngoi INT0, INT1, INT2 nm tong ng vi cc chn RB0, RB1, RB2. V trong vi iu khin PIC ch c hai loai ngt l ngt canh ln v ngt canh xung. i vi ngt ngoi INT1 v INT2 c hai mc u tin ngt l ngt c u tin cao v u tin thp, cn i vi ngt ngoi INT0 th lun c inh l ngt c u tin cao. Cc chn ngt ngoi khi s dung phi c cu hnh ch input. 13.6.3 8Ec !hanh ghi <J c;0 hKnh ng^! ngoi cho PH8 Ngt trong ci iu khin PIC c cu hnh qua cc thanh ghi INTCON, INTCON2, INTCON3. ,h2'h ?hi IG,CFG
Code: Bit 7 GIE Global Interrupt Enable Nu IPEN = 0 1 = cho php ngt 0 = cm tt c cc ngt Nu IPEN = 1 1 = cho php ngt mc cao 0 = cm tt c cc ngt Bit 6 PEIE Peripheral Interrupr Enable Nu IPEN = 0 1 = cho php ngt ngoi vi 0 = cm cc ngt ngoi vi Nu IPEN = 0 1 = cho php ngt mc thp 0 = cm ngt mc thp Bit 4 INT0IE External Interrupt 0 Enable 1 = cho php ngt ngoi 0 0 = tt ngt ngoi 0 Bit 0 INT0IF External Interrupt Flag 97 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
1 = c bo ngt ca ngt ngoi 0 0 = khng c tn hiu ngt ngoi 0 ,h2'h ?hi IG,CFG2
Code: Bit 6 INTEDG0 External Interrupr 0 Edge Select 1 = ngt ngoi 0 khi c cnh ln 0 = ngt ngoi 0 khi c cnh xung Bit 5 INTEDG1 External Interrupr 1 Edge Select 1 = ngt ngoi 1 khi c cnh ln 0 = ngt ngoi 1 khi c cnh xung Bit 4 INTEDEG2 External Interrupt 2 Edge Select 1 = ngt ngoi 2 khi c cnh ln 0 = ngt ngoi 2 khi c cnh xung ,h2'h ?hi IG,CFG3
Code: Bit 7 INT2IP External Interrupt 2 Priority 1 = u tin cao 0 = u tin thp Bit 6 INT1IP External Interrupt 1 Priority 1 = u tin cao 0 = u tin thp Bit 4 INT2IE External Interrupt 2 Enable 1 = cho php ngt ngoi 2 0 = tt ngt ngoi 2 Bit 3 INT1IE External Interrupt 1 Enable 1 = cho php ngt ngoi 1 0 = tt ngt ngoi 1 Bit 1 INT2IF External Interrupt 1 Flag 1 = c bo ngt ca ngt ngoi 0 0 = khng c tn hiu ngt ngoi 0 Bit 0 INT1IF External Interrupt 1 Flag 1 = c bo ngt ca ngt ngoi 0 0 = khng c tn hiu ngt ngoi 0 Cc c ngt ngoi INT0IF, INT1IF, INT2IF phi c xa bng chong trnh trong hm x l ngt ca chng. 13.< Gi2o ti9p PHi2 D liu trong giao tip PS/2 c truyn ni tip tng bit. Khi mt phm c nhn, 11 bit bao gm Start bit, 8 bit d liu (bit trong s thp truyn trc), 1 bit parity v 1 stop bit s c gi i: 98 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 14.1 Dang sng ca giao tip PS/2 Ta s ly d liu tai canh xung ca clock, chn ca clock c ni vo chn ngt ngoi INT0 ca vi iu khin Atmega32 (PD2) nh sau:
Hnh 14 14.2 So kt ni PS/2 Khi 1 phm c nhn xung, m make_code s c gi ln. Trong khong thi gian phm c xung th m make_code vn c inh k gi ln. Khi th phm ra th bn phm gi ln m break_code v make_code. Bng m make_code v break_code ca cc phm nh sau: 99 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
D dng nhn ra m break_code ca 1 phm gm 0xF0 v m make_code ca phm . 13.8 XP@ 3Z'? ch%L'? t"0'h Gat bit 2 ca Switch3 ln ON gn in tr ko ln cho chn CLOCK v DATA ca bn phm PS/2 13.8.1 *h+i !o ng^! ngoi Code: void init_ext_int0(void) { INTCONbits.INT0IE = 1; // set external interrupt0 INTCONbits.INT0IF = 0; // clear external interrupt0 flag INTCON2bits.INTEDG0 = 0;// interrupt when appear an falling edge on RB0/INT0 TRISBbits.TRISB0 = 1; // set input for CLOCK pin TRISBbits.TRISB1 = 1; // set input for DATA pin } 100 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
13.8.2 _` 5? ng^! Phn chnh ca bi thuc hnh ny l ly cho c d liu truyn ln t bn phm. u trnh dich tng bit ly d liu 8 bit trong chui 10 bit c hin thuc trong hm phuc vu ngt ngoi INT0. Code: #pragma code #pragma interrupt high_isr void high_isr(void) { if (INTCONbits.INT0IF) { INTCONbits.INT0IF = 0; count_bits ++; if (count_bits == 1) ps2_scan_code = 0; if (count_bits >1 && count_bits < 10) { ps2_scan_code = ps2_scan_code >> 1; if (PS2_DATA == 1) ps2_scan_code |= 0x80; parity ^= PS2_DATA; } if (count_bits == 12) { scan_code = ps2_scan_code; ps2_scan_code = 0; parity = 0; } } } Bin count_bits dng m s bit gi v, khi count_bit_input 11 ta s c c d liu scan_code t bn phm truyn ln. Ban s phi x l phn loai y l m make_code hay break_code, c c nhn km vi phm Shift hay Caps Lock hay khng chuyn sang m ASCII cho k tu c nhn. 13.W Do['o23 Code mu
101 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 18 : G"2phic* LCD 128B64 14.1 Gii thiu GLCD 128B64 Graphic LCD c s dung trn mach BKIT PIC l loai LCD chm, khng mu, c phn gii 128x64 tc 8192 chm. GLCD c thit k iu khin c tng chm, nn c th dng hin thi bt k k tu hay hnh nh no. Vi mi chm tong ng mt bit d liu, GLCD 128x64 cn 8192 bits RAM hay 1024 bytes RAM hin thi ton mn hnh. Loai GLCD M12864 s dung 2 chip iu khin KS0108 rt ph bin ca Samsung, mi chip c 512 bytes RAM. Do , n tong tu nh 2 LCD 64x64 ghp lai vi nhau.
102 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Cc chn t 4 n 17 c kt ni truc tip n vi iu khin. Cc chn cn lai c kt ni ty theo chc nng tong ng ca n. 8hcn A= Khi thuc hin mt qu trnh giao tip vi GLCD, ban u, chn EN c ko xung thp. Trong khi , cc chn iu khin khc c thit lp. Sau khi thit lp xong, chn EN c kch ln mc cao cho php tn hiu. Sau khong thi gian cn thit cho qu trnh hon tt, chn EN lai c ko xung thp sn sng cho mt qu trnh khc. 8hcn 6G v 6] Hai chn ny c kt hp thit lp cho cc thanh ghi ca GLCD theo bng sau:
8hcn 8G1 v 8G2 Chon chip iu khin GLCD KS0108 giao tip, tch cuc mc cao. 14.1.2 Te chac R nh 67M Chip iu khin GLCD KS0108 ch c mt loai b nh l RAM, khng c b nh cha b font CGROM hay cha m font tu tao CGRAM nh ca Text LCD. D liu ghi vo RAM s c hin thi truc tip trn GLCD. Mi chip KS0108 c 512 bytes RAM tong ng vi 4096 chm trn mt na (64x64) LCD. RAM ca KS0108 c truy cp theo tng byte, ngha l mi ln vit mt gi tri vo mt byte no trn RAM ca GLCD, s c 8 chm bi tc ng, 8 chm ny nm trn cng 1 ct. Do , 64 dng GLCD c chia thnh 8 pages, mi page c cao 8 bit v rng 128 ct (tnh c 2 chip). So b tr RAM:
Hnh 15 2 So b tr RAM ca GLCD 128x64 103 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Vi mi chip KS0108, RAM chia thnh 8 page, mi page bao gm 64 ct, mi ct bao gm 8 chm. Cc page c goi l ia ch X, mang gi tri t 0 n 7, X 0 tong ng vi page 0 v tong tu. Cc ct c goi l ia ch , ct u tin c gi tri 0 v ct cui cng c gi tri 63. Mi ct l mt byte RAM, D0 n D7, vi D0 tong ng im trn cao v D7 tong ng im bn di. Cc lnh di chuyn c h tr theo cp ia ch X, . Minh hoa hin thi k tu a trn GLCD:
Hnh 15 3 K tu a trn GLCD Nh hnh trn, k tu a c xc inh bng cch ghi d liu vo X 0 v 0...7 theo bng sau:
Hnh 15 4 D liu RAM cho k tu a Gi tri Data l cc gi tri cn nap cho vng RAM tong ng. 14.1.3 8Ec 5Cnh cda 9L84 128L64 Bng lnh 104 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
1. LCnh hiJn !hU :=f:gg D liu c hin thi ln mn hnh khi bit D (DB0) bng 1 v ngc lai khi D bng 0. Khi D bng 0, d liu vn tn tai trong DDRAM. Lp trnh: RW 0 RS 0 Opcode 0x3E D (D 0:1) 2. HiJn !hU G!a$! Lin# Chon mt dng no ca RAM lm dng u tin c hin thi ln, ngha l cun hnh nh trong RAM ln mt khong LOffset, vi LOffset c gi tri t 0 n 63. Phn bi che khut khi cun s c hin thi tip ngay bn di. V du vi LOffset 20:
Thit lp ia ch X truy xut RAM. Lp trnh: RS 0 RW 0 Opcode 0xB8 X 4. Thi\! 5,- <Ua chV O Thit lp ia ch truy xut RAM. Lp trnh: RS 0 RW 0 Opcode 0x40 5. YZc !$ng !hEi oc trang thi ca GLCD, ch yu kim tra bit BUS (bit 7). Lp trnh: RS 0 RW 1 6. 9hi )N 5iC0 hiJn !hU Ghi d liu vo RAM tai ia ch X, . Sau khi ghi xong, gi tri s tu ng c tng ln 1 on vi, chuyn sang ct tip theo hoc tr v ct u tin, tc 0. Lp trnh: RS 1 RW 0 7. YZc )N 5iC0 hiJn !hU oc d liu t RAM tai ia ch X, . Sau khi oc xong, gi tri s tu ng c tng ln 1 on vi, chuyn sang ct tip theo hoc tr v ct u tin, tc 0. Lp trnh: RS 1 RW 1
14.2 XP@ 3Z'? ch%L'? t"0'h 14.2.1 *h+i !o g$a-hic L84 u trnh khi tao c thuc hin nh sau: Khi tao cc chn lin kt vi glcd(thit lp input/output). Chon chip iu khin th nht. Thit lp chn RS ch ghi lnh. Gi lnh bt mn hnh (0x3F). Gi lnh thit lp ia ch (0x40 ). Gi lnh thit lp ia ch X (ia ch trang) (0xB8 X). Gi lnh chon dng no trong RAM hin thi ln. Lm tong t bc th 2 cho chip th 2. Tong ng vi tng lnh trn trong chong trnh nh sau: Code: 106 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
glcd_write_byte(GLCD_ON_DISPLAY); glcd_write_byte(GLCD_SET_Y_ADDR); glcd_write_byte(GLCD_SET_PAGE); glcd_write_byte(GLCD_START_LINE); Vi cc tham s truyn vo c gi tri nh sau: Code: #define GLCD_ON_DISPLAY 0x3F // DB0: turn display on #define GLCD_START_LINE 0xC0 // 11XXXXXX: set lcd start line #define GLCD_SET_PAGE 0xB8 // 10111XXX: set lcd page (X) address #define GLCD_SET_Y_ADDR 0x40 // 01YYYYYY: set lcd Y address
14.2.2 9hi )N 5i>0 5>n 9L84 Hm ghi d liu(mt byte) c th vit nh sau: Code: GLCD_CTRL_PORTbits.GLCD_CTRL_RW = 0;// ch ghi GLCD_DATA_PORT = abyte; // ghi d liu GLCD_CTRL_PORTbits.GLCD_CTRL_E = 1; // sau khi ghi bt chn EN ln 1 cho php tn hiu _nop();_nop();_nop(); GLCD_CTRL_PORTbits.GLCD_CTRL_E = 0;// cho chn EN xung 0 li chun b cho ln thit lp tip theo _nop();_nop();_nop(); Chi tit cu th v qu trnh xut d liu ln GLCD cc ban c th tham kho chong trnh mu km theo. 14.3 Do['o23 Code mu
107 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bi 1W : Gi2o ti9p HD C2"3 $d'? HPI 17.1 Gii thiu tf'? 5u2' )S H3c2"3 15.1.1 GS 5hc vI G4 ca$)
Hnh 18 18.1 Cc loai SD Card Secure Digital (SD) Card l b nh flash tch hp cao vi kh nng truy xut tun tu v ngu nhin. Vi tc truyn nhn d liu nhanh v n inh, kch thc nh gon, kh nng lu tr cao t 4MB n 2GB, SD thch hp cho cc thit bi ky thut s cm tay nh my nghe nhac, in thoai di ng, PDA, my quay phim, chup nh. 15.1.2 GS <T 'hii cda G4 ca$)
Hnh 18 18.2 So khi ca SD Card 108 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
15.1.3 GS <T chcn
17.1.4 C#c th2'h ?hi $(' t"o'?
15.1.5 8h0jn giao !i\- vi G4 ca$) SD Card h tr 2 ch giao tip l ch SD Card v SPI. Host (h thng ch - vi iu khin) c th chon mt trong hai ch ny thuc hin giao tip vi SD Card. Ch SD Card h tr 2 ch con l 1-bit v 4-bit, tc truyn d liu nhanh. Ch SPI tuy c tc thp hon nhng d s dung v c h tr trong hu ht cc h thng vi iu khin. Trong ti liu ny, chng ta s s dung SPI giao tip vi SD Card.
17.2 Gii thiu )S IA, 15.2.1 Teng @0an g7T FAT (File Allocation Table Bng cp pht tp tin) l kin trc h thng tp tin c s dung cho my tnh v hu ht cc loai th nh. c pht trin bi Microsoft t nm 1976.
FAT qun l b nh bng cch chia nh b nh (sector, cluster) v nh du cc khi nh bng cc bit ia ch. Mt sector cha 512 byte b nh. Mt cluster cha nhiu sector. S sector 109 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
trong mt cluster l c inh v do ngi dng chon lc inh dang b nh.
ch mc inh mt cluster cha 8 sector. Khi lu tr mt file, FAT cp pht mt hoc nhiu cluster c tng kch thc khng nh hon kch thc file . V du file c kch thc 5kB s c cp pht 2 cluster (8 sector/cluster) lu tr. Nu s sector trong mi cluster cng ln s gy nhiu lng ph b nh, ngc lai nu s ny cng nh th h thng hoat ng cng chm.
Cc phin bn FAT l FAT12, FAT16, FAT32. im khc nhau co bn gia cc phin bn l v gii han qun l b nh. FAT12 dng 12 bit nh du ia ch cc cluster, nn c th qun l gn 212 cluster (tr mt s ia ch nh du cc vng c bit). Tong tu FAT16 dng 16 bit, FAT32 dng 28 bit nh du ia ch. 15.2.2 8;0 !$kc -hcn vlng g7T Mt h thng file FAT gm 4 phn: 1. Reserved sectors: Nm vi tr u tin (sector 0) l Boot sector (tn y l Partition Boot Record). Sector ny cha mt vng goi l BIOS Parameter Block (vi mt s thng tin ca h thng file, chi tit v kiu file, v con tr ti cc phn khc) v thng cha boot loader code ca h iu hnh. Tng s Reverved sector cng c lu trong mt trng ca Boot sector. Nhng thng tin quan trong ca Boot sector mt cu trc goi l Drive Parameter Block trong DOC v OS/2. Ring FAT32 c thm mt File System Information Sector (sector 1) v mt Backup Boot Sector (sector 6). 2. FAT Region: Gm hai bng, l bn ca vng Data Region, cho bit nhng cluster no c dng. 3. Root Directory Region: y l Directory Table, cha thng tin v file v th muc trong th muc gc (root directory), ch c trn FAT12 v FAT16. 4. Data Region: y l noi thuc su file v th muc c lu tr v chim hu ht dung lng ca phn vng a. FAT32 ly cluster u tin ca Data Region lm Root Directory Table. 15.2.3 Bmng c;- -hE! !,- !in Phn vng b nh c chia nh thnh nhng phn nh k nhau, c kch thc bng nhau goi l cluster. Kch thc ca cluster thng t 2kB n 32kB, phu thuc vo kiu FAT, kch thc phn vng b nh v lua chon ca ngi dng. Mi file chim mt hoc nhiu cluster ty thuc vo kch thc ca file nh vy, mt file c cha bi mt dy cc cluster tao thnh mt danh sch lin kt. Cc cluster ca mt file khng nht thit phi lin k nhau, iu ny thng gy ra tnh trang phn mnh (fragmented). Bng cp pht tp tin FAT l mt danh sch cc muc (entry) v nn bn ca tng cluster trn phn vng a. Mi entry cha cc thng tin: s ca cluster tip theo trong dy cc cluster entry nh kt thc ca dy cluster (end of clusterchain EOC) entry c bit nh du mt cluster li (bad cluster) entry c bit nh du cluster khng dng c zero nh du cluster cha dng Kch thc FAT entry khc nhau mi phin bn. FAT12 v FAT16 dng 12 v 16 bit cho mi entry. Trong FAT32, mi entry l 32 bit, nhng thuc su ch dng 28 bit, 4 bit cao du tr (khng dng, thng l 0). 15.2.4 4i$#c!o$( !aR5# 110 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Mi file/directory (cng hiu l mt folder) khi lu tr c biu thi l mt entry 32-byte trong bng Directory Table. Mi entry ghi: tn, thuc tnh (attributes: archive, directory, hidden, read-only, system and volume), ngy tao lp, ia ch ca cluster d liu u tin, v kch thc ca file/directory. Tt c cc Directory Table u c cha trong vng Data Region (tr FAT12 v FAT16, Root Directory Table chim mt vng ring goi l vng Root Directory Region). M t mt Directory entry (c Root Directory v subdirectory):
17.3 Gii thiu $> th% )i' MDD SD card giao tip thng qua SPI, chng ta c th lm tt c cc bc t cu hnh SPI cho PIC, sau gi lnh t vi iu khin xung SD card ri ch tn hiu tr v, oc master boot record, boot sector, oc ghi FAT .Vi cch lm ny i hi ban tn nhiu thi gian hon xy dung cc hm API giao tip vi SDcard nhng ban s nm c nhiu kin thc hon v SDcard. Ngoi ra cn mt cch khc na lm l s dung th vin cc hm c sn trn mang s dung nh vy chng ta s tn t thi gian hon cho vic vit cc hm giao tip th nh v tp trung hon vo xy dung ng dung s dung SD card. MDD l th vin cha cc hm v thit lp giao tip vi SD card,nm trong b th vin y h tr cc chc nng gm SD card, mTouch, GraphicLCD, USB, audio. do Microchip cung cp v c t tn l Microchip solutions. y chng ti tp trung vo cch s dung th vin MDD vo giao tip vi SD card bng SPI. 15.3.1 Hng )nn %` )Fng M44 y l mt b th vin ca Microchip cung cp c th chay trn cc dng PIC 8 bit (PIC18F), PIC 16bit (PIC24F, PIC24H, dsPIC30) v PIC 32bit (dsPIC33) nn th vin cng kh ln, i hi b chong trnh ca vi iu khin s dung cng phi nhiu, cu th nu s dung th vin v ch c th oc file t SDcard th cn gn 22000 bytes b nh chong trnh lu tr(ch tnh khng gian lu tr cho code chong trnh ng dung tu vit) v s dung ton b chc nng ca th vin (c th oc ghi file, format th nh, tm kim file, tao xa qun l th muc, s dung cc hm m rng pgm, s dung c hm Fsfprintf, h tr th nh inh dang FAT32) th cn gn 35000 bytes b nh chong trnh. l thng tin do Microchip cung cp nhng thuc th s dung th vi vi iu khin ch c 32KB b nh chong trnh th hon ton khng th s dung c b th vin(tr ch ch oc file) m vi iu khin PIC18F4520 ch c 32KB b nh chong trnh nn chng ti chon mt chip khc cng dng vi vi iu khin l vi iu khin PIC18F4620 vi b nh chong trnh l 64KB, nhng vn cn mt vi chc nng phu m chng ti b khng s dung thu gon chong trnh sau khi bin dich, nn nu ban mun s dung ton b chc nng ca th vin th nn chon vi iu khin c b nh chong trnh 96KB tr ln. 111 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 18-3 Chi tit s dung b nh chong trnh cho th vin MDD
Hnh 18-4 Cc tnh nng c lua chon ca th vin
Mun b bt chc nng no ca th vin chng ta cn phi tm v kha tt c cc dng code define cho tnh nng (vd ifdef ALLOWS_DIRS . endif). Bc 1: Tao 1 project mi, sau vo trang ca Microchip download xung th vin Microchip Solutions(hoc c sn trong a CD km theo) , trong bao gm lun c th vin MDD. Vo th muc Microchip Solutions chp th muc MDD File System v th muc Microchip vo th muc cha project. Sau vo th muc MDD File System xa ht nhng file khng cn thit tr th muc PIC18F, tong tu trong th muc Microchip chng ta ch lai th muc PIC18 salloc v th muc Include, trong th muc Include chng ta cng xa ht v ch lai nhng file .h trong th muc ny v th muc PIC18 salloc,MDD File System. Tip theo chng ta include nhng file sau vo project vi ng dn ./ l th muc m cha project. .\Microchip\MDD File System\FSIO.c .\Microchip\MDD File System\SD-SPI.c .\Microchip\PIC18 salloc\salloc.c .\MDD File System-SD Card\PIC18F\Fsconfig.h .\MDD File System-SD Card\PIC18F\HardwareProfile.h .\Microchip\Include\MDD File System\FSIO.h .\Microchip\Include\MDD File System\SD-SPI.h .\Microchip\Include\MDD File System\FSDefs.h 112 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 18-5 Project sau khi thm cc file header File tmp.c l file cha hm main do chng ta tu vit. Sau vo tab Project Build Options Project, chon Include Search Path, chon New sau thm vo cc ng dn nh trn. 113 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 18-6 Thm ng dn cho project
Bc 2: Thit lp buffer oc v ghi, buffer cho FAT M file linker tong ng vi vi iu khin PIC ang s dung( y l file 18f4620.lkr ), ri chnh sa lai vi ni dung nh sau 114 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 18-7 Chnh sa file linker cho project
Bc 3: Thit lp b nh cache v xung clock Thi\! 5,- R nh cach# Trong file Fsconfig.h cu hnh sn b nh cache s dung l 512bytes thng qua cu lnh inh ngha Code: #define MEDIA_SECTOR_SIZE 512
Nu ban mun thay i b nh ca cache th ch cn chnh sa trong cu lnh ny nhng nh l b nh cache l bi s ca 512.Ngoi ra cn mt s thit lp chc nng khc nh bt/tt chc nng ghi, tm file. u c trong file FSconfig.h cc ban c th tu oc tm hiu thm. Thi\! 5,- L0ng c5oc' cu hnh xung clock ban m file HardwareProfile.h tm n dng lnh define sau Code: #define GetSystemClock() 20000000 // System clock frequency (Hz) y vi iu khin ang c cu hnh s dung xung tn s 20MHz, v ty vo nhu cu s dung cc ban c th thay i con s ny. 115 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bc 4: Thit lp cc chn giao tip v cc thanh ghi ca ch SPI Trong th vin ny ca Microchip ch h tr cho mt s con PIC18F (PIC18F8750, PIC18F8722, PIC18F4650), ton b PIC24F,PIC32F v dsPIC.Cho nn s dung cho nhng con PIC khc(v du l PIC18F4620) th cn phi chnh sa thm mt s file sau. Trong file HardwareProfile.h ban thm vo trong muc define dnh cho PIC18F nhng dng inh ngha sau Code:
116 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
#elif defined PIC18F4520_PIM #define USE_PIC18 #define USE_SD_INTERFACE_WITH_SPI
// Will generate an error if the clock speed is too low to interface to the card #if (GetSystemClock() < 400000) #error System clock speed must exceed 400 kHz #endif V trc ban cn phi inh ngha cc nhn PIC18F4520_PIM bng cch phn inh ngha nhn cho cc con PIC khc ban thm vo oan code sau Code:
117 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Bc 5: Cu hnh b nh Trong MPLAB IDE, chon Project Build Options Project, chon th MPLAB C18 ri chon Memory Model trong Categories v thit lp nh sau: Code model : Small code model Data model : Large code model Stack model : Multibank model
Hnh 18-8 Cu hnh Memory Model Cc bc thit lp s dung hon tt, by gi cc ban c th tao 1 file source ca mnh v s dung cc hm c sn trong th vin giao tip vi SDcard. 118 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 18-9 Chong trnh mu 15.3.2 8Ec h !$ong !h viCn gGHni! Initializes the card,loads the master boot record(partition information),loads the boot sector and updates the parameters passed into it with its information gGoc5o%# Updates the file information, writes the remaining entry in and frees the RAM from the heap that was used to hold the information about the file.This also updates the time-stamp information for thr file. gGo#oo Verifies if the end of the file has been reached gGoo-#n Allocates space in the heap for file information.If the file being opened already exist, Fsfopen can open it so that the data would be appended at the end of the line, erase it and create a new file qith the same name to be written to,or simply open it for reading.If the file does nont exist, Fsfopen can creat it. This function then returns a pointer to the tructure in the heap that contains information for this file gGo$#a) Reads information from an open file to a buffer. The number of bytes written can be specified by its parameters. If Fsfread is called consecutively on the same open file, the read will continue from the place it stopped after the previous read. This function returns the number of data objects read g%o%##' Changes the position in a file. When a user calls FSfseek, they specify the base address to set, which can either be at the beginning or end of the file, or at the current position in the file. The user also specifies an offset to add to the base (note that if the base address is at the end of the file, the offset will be subtracted). Hence, if FSfseek is called with the base set to the beginning of the file and a specified offset of 0, the position would be changed to the first byte of the file. g%o!#55 Returns the current position in the file. The first position in the file is the first byte in the first sector of the first cluster, which has the value 0. Hence, if a file was 119 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
created and 2000 bytes were written to it, FSftell would return the number 1999 if it was called. g%oQ$i!# Writes information from a buffer to an open file. The algorithm it uses reads a sector from the data region of the disk to SRAM, modifies the relevant bytes and then writes the sector back to the disk. Because each FSfwrite call reads the data first, the ability to open multiple files at a time is supported. This also means that writing data in larger blocks takes less time than writing the same data in smaller blocks as fewer sector reads and writes will be needed. g%$#ov# Searches for a file based on a filename parameter passed into it. If the file is found, its directory entry is marked as deleted and its FAT entry is erased. g%$#ov#-g Deletes the file identified by a given filename. If the file is opened with FSfopen, it must be closed before calling FSremovepgm. The filename must be specified in ROM. This function is necessary only on the PIC18 architecture. g%oo-#n-g Opens a file on the SD card and associates an FSFILE structure (stream) with it using arguments specified in ROM. This function is necessary only on the PIC18 architecture. gG$#na# Changes the name of a file or directory. If the pointer passed into this function is NULL, the name of the current working directory will be changed. g%$#Qin) Resets the position of the file to the beginning of the file. g%')i$ Creates a new subdirectory in the current working directory. g%ch)i$ Changes the current working directory to the one specified by the user. gG$)i$ Deletes the specified directory. The user may also choose to specify whether subdirectories and files contained within the deleted directory are removed. If the user does not permit the function to delete subdirectories, it fails if the user attempts to delete a non-empty directory. g%g#!cQ) Returns the name of the current working directory to the user. gin)gi$%! Locates files in the current working directory that meet the name and attribute criteria. A SearchRec Structure Pointer will be passed into the function. Once a file is located, the file-name, file size, create time and date stamp, and attributes fields in the SearchRec structure will be updated with the correct file information. gin)gi$%!-g Operates in the same manner as the FindFirst function, except the name criteria for the file to be found will be passed into the function in ROM. This function is necessary only on the PIC18 architecture. Ii'3G!Bt Locates the next file in the current working directory that matches the criteria specified in the last call of FindFirst or FindFirstpgm. It will then update the SearchRec structure provided by the user with the file information. g%oo$a! Erases the root directory and file allocation table of a card. The user may also call the function in a mode that causes it to create a new boot sector based on the information in the master boot record. g%o-$in!o Writes a formatted string to a file. It automatically replaces any format specifiers in the string with dynamic values from variables passed into the function. Integer promotion must be enabled in the build options menu when using this function with the PIC18 architecture. G#!85oc'pa$% Used in user-defined Clock mode to manually set the current date and time. This date and time would be applied to files as they are created or modified.
17.4 XP@ 3Z'? ch%L'? t"0'h 15.4.1 *\! nii -hPn cang
Hnh 18-10 So kt ni Sdcard V SDcard hoat ng in p 3V3 m tn hiu ra ca vi iu khin l 5V nn cc chn SDI,SDO,SS,SCK c gn thng qua cc in tr chia p xung 3V3 cho ph hp vi giao tip SDcard. 120 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
15.4.2 8hSng !$Knh n0 Code: 1 #include <p18f4520.h> 2 #include <FSIO.H> 3 void blocking(void) 4 { 5 while (1); 6 } 7 void main(void) 8 { 9 FSFILE *file1; 10 unsigned char txt[] = "Giao tiep SDcard!!"; 11 while (!MDD_MediaDetect()); 12 while(!FSInit()); 13 file1 = FSfopenpgm("file_test_1.txt","w+"); 14 if (file1 == NULL) 15 blocking(); 16 if (FSfwrite((void*)txt,1,18,file1) != 18) 17 blocking(); 18 if (FSfclose(file1) != 0) 19 blocking(); 20 while (1); 21 } 9imi !h.ch cEc 5Cnh& Dng 2: include file header chnh ca th vin. Dng 36: tao hm blocking h thng nu c li. Dng 9: khai bo con tr s tr n file cn x l. Dng 10: khai bo chui s c ghi vo file. Dng 11: i tn hiu bo c th nh thng qua chn card dectec. Dng 12: khi tao th nh bt u giao tip vi th nh. Dng 13: khi tao cho file, t tn file , truyn vo i s cho php ghi ln file. Dng 1415: kim tra c khi tao c file hay khng. Dng 1617: ghi chui vo file. Dng 1819: ng file 121 Lp trnh VK PIC vi MPLAB C18 HBK TP HCM - BKIT4U 4RUM EITTER ! TRI - IUH
Hnh 18-11 Kt qu ca chong trnh 17.7 Do['o23 Code mu