You are on page 1of 57

Bi 1: Hng dn lp trnh cho PIC bng CCS ver3.242 1. Tng quan v CCS 1.1. V sao ta s dng CCS?

S ra i ca mt loi vi iu khin i km vi vic pht trin phn mm ng dng cho vic lp trnh cho con vi iu khin . Vi iu khin ch hiu v lm vic vi hai con s 0 v 1. Ban u vic lp trnh cho VK l lm vic vi dy cc con s 0 v 1. Sau ny khi kin trc ca Vi iu khin ngy cng phc tp, s lung thanh ghi lnh nhiu ln, vic lp trnh vi dy cc s 0 v 1 khng cn ph hp na, i hi ra i mt ngn ng mi thay th. V ngn ng lp trnh Assembly. y ta khng ni nhiu n Assmebly. Sau ny khi lp trnh cho Vi iu khin mt cch ngn gn v d hiu hn dn n s ra i cangn ng C ra i, nhu cu dng ngn ng C thay cho ASM trong vic m t cc lnh nhiu chng trnh son tho v bin dch C cho Vi iu khin : Keil C, HTPIC, MikroC,CCS Ti chn CCS cho bi gii thiu ny v CCS l mt cng c lp trnh C mnh cho Vi iu khin PIC. Nhng u v nhc im ca CCS s c cp n trong cc phn di y. 1.2. Gii thiu v CCS CCS l trnh bin dch lp trnh ngn ng C cho Vi iu khin PIC ca hng Microchip. Chng trnh l s tch hp ca 3 trnh bin dich ring bit cho 3 dng PIC khc nhau l: PCB cho dng PIC 12bit opcodes PCM cho dng PIC 14bit opcodes PCH cho dng PIC 16 v 18bit Tt c 3 trnh bin dich ny uc tch hp li vo trong mt chng trnh bao gm c trnh son tho v bin dch l CCS, phin bn mi nht l PCWH Compiler Ver 3.227. Ging nh nhiu trnh bin dich C khc cho PIC, CCS gip cho ngi s dng nm bt nhanh c vi iu khin PIC v s dng PIC trong cc d n. Cc chng trnh diu khin s c thc hin nhanh chng v t hiu qu cao thng qua vic s dng ngn ng lp trnh cp cao Ngn ng C.Ti liu hng dn s dng c rt nhiu, nhng chi tit nht chnh l bn Help i km theo phn mm (ti

liu Ting Anh). Trong bn tr gip nh sn xut m t rt nhiu v hng, bin, ch th tin xa l, cu trc cc cu lnh trong chng trnh, cc hm to sn cho ngi s dng 2. To PROJECT u tin trong CCS to mt Project trong CCS c nhiu cch, c th dng Project Wizard, Manual Creat, hay n gin l to mt Files mi v thm vo cc khai bo ban u cn thit v bt buc. Di y s trnh by cch to mt project hp l theo c 3 phng php. Mt iu ta cn ch khi to mt Project l: khi to bt c mt Project no mi th ta nn to mt th mc mi vi tn lin quan n Project ta nh lm, ri lu cc files vo . Khi lp trnh v bin dch, CCS s to ra rt nhiu files khc nhau, do nu chung cc Project trogn mt th mc s rt mt thi gian trong vic tm kim sau ny. y cng l quy tcchung khi ta lm vic vi bt k phn mm no, thit k mch hay lp trnh. Vic u tin bn cn lm l khi ng my tnh v bt chng trnh PIC C Compiler. 2.1. To mt PROJECT s dng PIC Wizard Trc ht bn khi ng chng trnh lm vic PIC C Compiler. T giao din chng trnh bn di chut chnProject > New > PIC Wizard nhn nt tri chut chn.

Sau khi nhn chut, mt ca s hin ra yu cu ban nhp tn Files cn to. Bn to mt th mc mi, vo th mc v lu tn files cn to ti y.

Ca s Save As

Nh vy l xong bc u tin. Sau khi nhn nt Save, mt ca s New Project hin ra. Trong ca s ny bao gm rt nhiu Tab, mi Tab m t v mt vi tnh nng ca con PIC. Ta s chn tnh nng s dng ti cc Tab tng ng.

Di y s trnh by ngha tng mc chn trong mi Tab. Cc mc chn ny chnh l cp n cc tnh nng ca mt con PIC, ty theo tng loi m s c cc Tab tng ng. i vi tng d n khc nhau, khi ta cn s dng tnh nng no ca con PIC th ta s chn mc . Tng cng c 13 Tab ta la chn. Ti gii thiu nhng Tab chnh thng hay c s dng. 2.1.1. Tab General Tab General cho php ta la chn loi PIC m ta s dng v mt s la chn khc nh chn tn s thch anh dao ng, thit lp cc bit CONFIG nhm thit lp ch hot ng cho PIC.

Tab General

Device: Lit k danh sch cc loi PIC 12F, 16F, 18F Ta s chn tn Vi iu khin PIC m ta s dng trong d n. Ly v d chn PIC16F877A. Oscilator Frequency: Tn s thch anh ta s dng, chn 20 MHz (ty tng loi) Fuses: Thit lp cc bit Config nh: Ch dao ng (HS, RC, Internal ), ch bo v Code, Brownout detected Chn kiu con tr RAM l 16bit hay 8bit. 2.1.2. Tab Communications Tab Communications lit k cc giao tip ni tip m mt con PIC h tr, thng l RS232 v I2C, cng vi cc la chn thit lp ch hot ng cho tng loi giao tip. Giao tip RS232 Mi mt Vi iu khin PIC h tr mt cng truyn thng RS232 chun. Tab ny cho php ta la chn chn Rx, Tx, tc Baud, Data bit, Bit Parity Giao tip I2C s dng I2C ta tch vo nt chn Use I2C, khi ta c cc la chn: Chn SDA, SCL, Tc truyn (Fast Slow), ch Master hay Slave, a ch cho Salve.

Tab Communications

2.1.3. Tab SPI and LCD Tab ny lit k cho ngi dng cc la chn i vi giao tip ni tip SPI, chun giao tip tc cao m PIC h tr v phn cng. Ch khi ta dng I2C th khng th dng SPI v ngc li. c th s dng c hai giao tip ny cng mt lc th buc mt trong 2 giao tip phi lp trnh bng phn mm (ging nh khi dng I2C cho cc chip AT8051, khng c h tr phn cng SSP). Phn cu hnh cho LCD dnh cho cc chp dng 18F v 30F.

Tab SPI and LCD

2.1.4. Tab Timer Lit k cc b m/nh thi m cc con PIC dng Midrange c: Timer0, timer1, timer2, WDT Trong cc la chn cu hnh cho cc b m /nh thi c: chn ngun xung ng h (trong/ngoi), khong thi gian xy ra trn

Tab Timer

2.1.5. Tab Analog Lit k cc la chn cho b chuyn i tng t/s (ADC) ca PIC. Ty vo tng IC c th m c cc la chn khc nhau, bao gm: La chn cng vo tng t Chn chn in p ly mu (Vref) Chn phn gii: 8bit = 0 ~ 255 hay 10bit = 0~1023 Ngun xung ng h cho b ADC (trong hay ngoi), t m ta c c tc ly mu, thng ta chn linternal 26 us.

Khi khng s dng b ADC ta chn none

Tab Analog

2.1.6. Tab Other Tab ny cho php ta thit lp cc thng s cho cc b Capture/Comparator/PWM. Capture Bt gi

Chn bt gi xung theo sn dng (rising edge) hay sn m (falling edge) ca xung vo Chn bt gi sau 1, 4 hay 16 xung (copy gi tr ca TimerX vo thanh ghi lu tr CCCPx sau 1, 4 hay 16 xung). Compare So snh Ta c cc la chn thc hin lnh khi xay ra bng nhau gia 2 i tng so snh l gi tr ca Timer1 vi gi tr lu trong thanh ghi so snh. Bao gm: o Thc hin ngt v thit lp mc 0 o Thc hin ngt v thit lp mc 1 o Thc hin ngt nhng khng thay i trng thi ca chn PIC. o a Timer1 v 0 nhng khng thay i trng thi chn. PWM iu ch rng xung La chn v tn s xung ra v duty cycle. Ta c th la chn sn hay t chn tn s, tt nhin tn s ra phi nm trong mt khong nht nh. Comparator So snh in p La chn mc in p so snh Vref. C rt nhiu mc in p ta la chn. Ngoi ra ta cn c th la chn cho u vo ca cc b so snh.

Tab Other

2.1.7. Tab Interrupts v Tab Driver Tab Interrupts cho php ta la chn ngun ngt m ta mun s dng. Ty vo tng loi PIC m s lng ngun ngt khc nhau, bao gm: ngt ngoi 0(INT0), ngt RS232, ngt Timer, ngt I2CSPI, ngt onchange PORTB.v.v Tab Drivers c dng la chn nhng ngoi vi m trnh dch h tr cc hm giao tip. y l nhng ngoi vi m ta s kt ni vi PIC, trong cc IC m CCS h tr, ng ch l cc loi EEPROM nh 2404, 2416, 2432, 9346, 9356Ngoi ra cn c IC RAM PCF8570, IC thi gian thc DS1302, Keypad 3x4, LCD, ADC Chi tit ta c th xem trong th mc Driver ca chng trnh: \...\PICC\Drivers

Tab Interrupts

Tab Driver

Sau cc bc chn trn, ta nhn OK kt thc qu trnh to mt Project trong CCS, mt Files ten_project.cc to ra, cha nhng khai bo cn thit cho PIC trong mt Files ten_project.h.

Sau y l v d v cu trc 1 chng trnh trong CCS :

#include < 16F877 .h > #device PIC6f877 *=16 ADC=10 #use delay(clock=20000000) .... Int16 a,b; .... Void xu_ly_ADC ( ) {... ... } #INT_TIMER1 Void xu_ly_ngat_timer ( ) {... ... } Main ( ) {...

... } + u tin l cc ch th tin x l : # . . . c nhim v bo cho CCS cn s dng nhng g trong chng trnh C nh dng VXL g , c dng giao tip PC qua cng COM khng , c dng ADC khng , c dng DELAY khng , c bin dch km cc file hay khng . . . + Cc khai bo bin . + Cc hm con do ta vit : xu_ly_ADC () , . . . + Cc hm phc v ngt theo sau bi 1 ch th tin x l cho bit dng ngt no. + Chng trnh chnh . + Mt chng trnh C c th c vit lun tun trong hm main () , nu chng rt ngn v n gin. Nhng khi chng trnh bt u di ra , phc tp ln 1 cht th phi phn chia trong cc hm con . Cc hm ny c th l : 1/ Hm khng tr v tr. V d : Void xu_ly( ) { z= x+y ; } Hm trn ch thc hin cc lnh trong thn hm , khi gi hm ny ch n gin vit : Xu_ly( ) ; 2/ Hm c tr v tr. V d : int xu_ly ( int a , int b) { ...... Return (a+b) ; }

Hm trn s tr v tng (a+b) . khi s dng , v d tnh tng 2 bin e ,f , chng trnh nh sau (trong hm main() ) : Main() { Int e ,f ,g ; e=7 ; f= 4; g = xu_ly(e ,f ); // gi tr g=28 } + Mi hm con nn c vit thc hin 1 chc nng chuyn bit no . Bn trong 1 hm con c th gi 1 hay nhiu hm khc . Cch thc hot ng nh vit 1 chng trnh C trn my tnh . + Nu chng trnh ln hn na c th lm file c rt di v do rt kh kim sot , nn s cn phn chia ra cc file c . trong file chnh cha hm main s c bin dch . Cc file c khc cha cc hm phc v chuyn bit nh : cho LCD , . . .Trong file chnh ch cn thm dng #include < filex.c > l tt c hm cn dng cha trong file x s c bin dch vo file hex chung. Cc v d trong th mc ca CCS nu c s dng LCD s chn 1 dng #include <lcd.c> v do s gi c cc hm trong file ny m khng cn phi vit li . iu ny c ngha l ta c th vit cc file c cha m tng qut c th dng chung cho nhiu project , tc l ti s dng m , thay v phi vit li chuyn bit cho tng project . y l cch lm chuyn nghip cho nhng project ln .

Bi 2: S dng Bin v Hm, Cu trc lnh, Ch th tin x l trong CCS I / KHAI BO V S DNG BIN , HNG , MNG : 1 /Khai bo bin , hng ,mng : + Cc loi bin sau c h tr : int1 s 1 bit = true hay false ( 0 hay 1) int8 s nguyn 1 byte ( 8 bit) int16 s nguyn 16 bit int32 s nguyn 32 bit char k t 8 bit float s thc 32 bit short mc nh nh kiu int1 byte mc nh nh kiu int8 int mc nh nh kiu int8 long mc nh nh kiu int16 + Thm signed hoc unsigned pha trc ch l s c du hay khng du .Khai bo nh trn mc nh l khng du . 4 khai bo cui khng nn dng v d nhm ln . Thay vo nn dng 4 khai bo u .

VD : Signed int8 a ; // s a l 8 bit du ( bit 7 l bit du ). Signed int16 b , c , d ; Signed int32 , . . . + Phm vi bin :

Int8 :0 , 255 signed int8 : -128 , 127 Int16 : 0 ,2^15-1 signed int16 : -2^15 , 2^15-1 Int32 : 0 , 2^32-1 signed int32 : -2^31 , 2^31-1 + Khai bo hng : VD : Int8 const a=231 ; + Khai bo 1 mng hng s : VD : Int8 const a[5] = { 3,5,6,8,6 } ; //5 phn t , ch s mng bt u t 0 : a[0]=3 + Mt mng hng s c kch thc ti a tu thuc loi VK: *NuVK l PIC 14 ( VD :16F877 ) : bn ch c khai bo 1 mng hng s c kch thc ti a l 256byte . Cc khai bo sau l hp l : Int8 const a[5]={ . . .}; // s dng 5 byte , du . . . bn in s vo Int8 const a[256]={ . . .}; // 256 phn t x 1 byte = 256 byte Int16 const a[12] = { . . . }; // 12 x 2= 24 byte Int16 const a[128] = { . . . }; // 128 x 2= 256 byte khng hp l :

Int16 const a[200] = { . . . }; // 200 x 2 =400 byte *Nu VK l PIC 18 : khai bo mng hng s thoi mi , khng gii hn kch thc . + Lu : nu nh khng s phn t vo trong ngoc kp nh khai bo , cc phn t cn li s l 0 . Truy xut gi tr vt qu ch s mng khai bo s lm chng trnh chy v tn .

VD : int8 const a [7] = { 0 , 3,5 ,9 } // cc phn t a[4] ,a[5],a[6] u =0 + Mng hng s thng dng lm bng tra (v d bng tra sin ) , vit d dng v nhanh chng , gn hn so vi khi dng ASM vit . + Khai bo 1 bin mng : kch thc tu thuc khai bo con tr trong #device v loi VDK: *PIC 14 : Nu bn khai bo con tr 8 bit : VD: # device *=8 : khng gian b nh ch c 256 byte cho tt c cc bin chng trnh bt chp VK ca bn c hn 256 byte RAM (Vd : 368 , . . .) v bin mng c kch thc ti a tu thuc phn mnh b nh , vi 16F877 c 368 byte ram , thng th kch thc khng qu 60 byte ,c khi di 40 byte , nu khai bo ln hn s gp li v duyn : "not enough ram for all variable" trong khi thc s VDK cn rt nhiu RAM . Nu khai bo con tr 16 bit : VD : #device *=16 , khng gian b nh l y ( tr i 1 t RAM do CCS chim lm bin tm ) .VD : vi 16F877 bn dng 368 byte RAM . Nhng kch thc mng cng khng qu 60 byte . * PIC 18 : kch thc mng khng gii hn, xi ht RAM th thi . Vi khai bo con tr 8 bit , bn ch c xi ti a 256 byte RAM , nu khai bo con tr 16 bit , bn xi trn b nh RAM thc s . VD: Khai bo bin mng :int16 a[125] ; // bin mng 126 phn t , kch thc 252 byte ram .

2 / Cch s dng bin : + Khi s dng cc php ton cn lu : s trn s , tnh ton vi s m , s chuyn kiu v p kiu .

A ) Mt vi v d v trn s , lm trn : VD : Int8 a=275; // a =275-256=19 Int8 const a=275 //a=19 Int8 a=40 , b=7 , c; C=a * b ; //c=280-256=24 C=a / b ; //c=5 + Bn c th p kiu , thng l tit kim ram , hay mun tit kim thi gian tnh , . . .. VD : Int8 a =8 , b=200; Int16 c ; C= ( int16) a * b ; // c= 1600 , a chuyn sang 16 bit , 16bit*8bit => b t ng chuyn sang 16 bit , kt qu l 16 bit trong c , lu bin a , b vn l 8 bit .

+ 8bit * 8bit => php nhn l 8 bit , KQ l 8 bit + 16bit * 8 bit => php nhn l 16 bit , KQ l 16 bit + 32bit * 16 bit => php nhn l 32 bit , KQ l 32 bit + 16bit * 16 bit => php nhn l 16 bit , KQ l 16 bit ...v.v... + C th p kiu kt qu : VD : 16b*8b => 16bit , nu gn vo bin 8 bit th KQ s ct b 8 bit cao . B )Phm vi s dng bin : + Ging nh C trong lp trnh C cho my tnh . Bin c th c khai bo nh ton cc hay cc b . Bin khai bo trong hm s l cc b v s ch dng c trong hm , k c trong hm main() . Ngoi ra cn c th khai bo ngay trong 1 khi lnh , v cng ch tn ti trong khi lnh . Do vy nu dng MPLAB m phng , th khi nhy vo hm hay khi lnh c cha khai bo bin th bin mi c gi tr , c khi nhy ra ngoi hm th bin s l out of scope khi ta quan st chng trong ca s Watch. + Chi tit v phm vi bin xem ti liu lp trnh C trn my tnh .

+ CCS c h tr c con tr , tuy nhin t dng . + CCs khng h tr lp trnh hng i tng nh C++ . Tuy vy CCS c h tr cc bin cu trc . 3 / Cc php ton , s thc thi v vn ti u m , chng trnh:

+ Trn y l thi gian cn cho 1 php ton . + Khi chng trnh ca bn nh xu v c th kim sot c , v thi gian thc thi l khng quan trng ,ng thi c th khng cn m phng th bn c th dng c kiu float nu thy tin . + Khi chng trnh ln , cn m phng , v thi gian thc thi l quan trng th cc iu sau y nn lm : + Khng xi bin kiu float , v khi m phng khng thy c gi tr thc ca n . kh s thp phn kiu float , hy nhn hay chia cho 2^k . VD : s kiu float : m c th biu din dng : n / 2^8 , vi m bit trc , n nguyn c tnh trc bng cch : n= m* 2^8 , ly c 2 ch s sau du phy (2^8=256 ) . Do vi 1 bng tra sin 361 phn t t 0->360 , nu ly chnh xc ti 2 du phy th cc gi tr sin nhn thm cho 2^8 , ct b phn thp phn v lu vo mng hng s int16 , sau khi truy xut ti cc gi tr ny s dng th hy chia cho 256 bng cch dch phi 8 bit .

+ Cc php tnh nhn chia cho 2^k rt nhanh v ta dng php ton dch bit . VD : Z=Y*2^5 ; th thay bi z = y<<5 ; nhanh gp 20 ln . Z= y / 2^5; thay bi z = y >>5 ; nhanh gp 20 ln . Trong php dch nguyn byte ( 8bit, 16 bit ) l nhanh nht . VD : z= y>>8 ; z=y <<16 ; + Khng dng php tr m dn n kt qu c th m v s m s khng hin th c khi m phng ( s hin th s l dng v d nhin gi tr s khc hn ) .Bin i sao cho php tr lun cho kt qu dng th mi hin th chnh xc . VD : cng thc iu ch sin PWM c dng : z = T * (1 + ma * y ) Trong : ma <1 , y : gi tr hm sin : -1< y < 1 . Bin i nh sau : y= (y +1) 1 = y -1

=> z = T* ( 1-ma ) + T * ma * y trong ( 1-ma ) >=1 . v 0< y <2 => z = [ T * ( 256 MA ) ]>>8 + [T * MA * Y ] >> 15 Trong MA = ma<<8 v Y = y << 7 ; => ch cn lp bng tra sin trong l cc gi tr sin l s nguyn = ( y + 1) * 128 ;

II / CC CU TRC LNH : ( statement ) + Gm cc lnh nh: while . . do , case , . . .

Lu : cc mc trong [ ] l c th c hoc khng . + while (expr) stmt : xt iu kin trc ri thc thi biu thc sau . + do stmt while (expr) : thc thi biu thc ri mi xt iu kin sau . + Return : dng cho hm c tr v tr , hoc khng tr v tr cng c , khi ch cn dng: return ; ( ngha l thot khi hm ti ) . + Break : ngt ngang ( thot khi ) vng lp while. _Continue : quay tr v u vng lp while .

III /CH TH TIN X L :

+ Xem chi tit tt c phn HELP , mc pre_processor . y s gii thiu 1 s ch th thng dng nht :

1 / #ASM v #ENDASM :

+ Cho php t 1 on m ASM gia 2 ch th ny , Ch t trong hm . CCS nh ngha sn 1 bin 8 bit _RETURN_ bn gn gi tr tr v cho hm t on m Assembly. + C mnh thay th Assmemly . V vy nn hn ch lng m Assembly vo v thng gy ra xo trn dn n sau khi bin dch m chy sai , tr phi bn nm r Assembly v c hiu m Assembly sinh ra thng qua mc C/Asm list . + Khi s dng cc bin khng bank hin ti , CCS sinh thm m chuyn bank t ng cho cc bin . Nu s dng #ASM ASIS th CCS khng sinh thm m chuyn bank t ng , bn phi t thm vo trong m ASM .

+ Lu : m Assembly theo ng m tp lnh VDK , khng phi m kiu MPLAB . VD : int find_parity (int data) { int count; #asm movlw 0x8 movwf count movlw 0 loop: xorwf data,w rrf data,f decfsz count,f goto loop movwf _return_ #endasm }

2 / #INCLUDE :

+ C php : #include <filename> Hay #include filename Filename : tn file cho thit b *.h , *.c . Nu ch nh file ng dn khc th thm ng dn vo . Lun phi c khai bo chng trnh vit cho VK no , v lun t dng u tin . VD : #include <16F877.H> // chng trnh s dng cho VK 16F877 #include < C:\INCLUDES\COMLIB\MYRS232.C >

3 / #BIT , #BYTE , #LOCATE v # DEFINE:

+ #BIT id = x . y Vi id : tn bin x : bin C ( 8,16,32,bit) hay hng s a ch thanh ghi. y : v tr bit trong x => to bin 1 bit t byte x v tr bit y, tin dng kim tra hay gn tr cho bit thanh ghi . im khc bit so vi dng bin 1 bit t khai bo int1 l : int1 tn 1 bit b nh , t thanh ghi a mc ch no do CCS t chn , cn #BIT th khng tn thm b nh do id ch l danh nh i din cho bit ch nh bin x , thay i gi tr id ( 0 / 1 ) s thay i gi tr bit tng ng y -> thay i tr x. VD: #bit TMR1Flag = 0xb.2 //bit c ngt timer1 a ch 0xb.2 (PIC16F877)

Khi TMR1Flag = 0 => xo c ngt timer1 Int16 a=35; //a=00000000 00100011 #bit b= a.11 //b=0 , nu b=a.0 th b ch v tr LSB ( bit thp nht , bn tri)

Sau : b=1; //a=00001000 00100011 = 2083

+ Lu khng dng c : if ( 0xb.2 ) m phi khai bo nh trn ri dng : if(TMR1Flag)

+ #BYTE id = x X: a ch id : tn bin C Gn tn bin id cho a ch (thanh ghi ) x , sau mun gn hay kim tra a ch x ch cn dng id. Khng tn thm b nh , tn id thng dng tn gi nh chc nng thanh ghi a ch . Lu rng gi tr thanh ghi c th thay i bt k lc no do hot ng chng trnh nn gi tr id cng t thay i theo gi tr thanh ghi . Khng nn dng id cho thanh ghi a mc ch nh 1 cch dng bin int8 v CCS c th dng cc thanh ghi ny bt k lc no cho chng trnh , nu mun dng ring , hy dng #LOCATE. VD: #byte port_b = 0xc6; // 16F877 :0xc6 l a ch portb Mun port b c gi tr 120 th : port_b=120; #byte status = 0xc3;

+ # LOCATE id = x + Lm vic nh #byte nhng c thm chc nng bo v khng cho CCS s dng a ch vo mc ch khc . VD: # LOCATE temp = 0xc20 // 0xc20 :thanh ghi a mc ch Cch sau tng t : Int8 temp ; #locate temp = 0xc20

+ S dng #LOCATE gn bin cho 1 dy a ch k nhau ( cp thanh ghi ) s tin li hn thay v phi dng 2 bin vi #byte . VD : CCP1 c gi tr l cp thanh ghi 0x15 ( byte thp ) v 0x16 ( byte cao ) . gn tr cho CCP1 :

Int16 CCP1; #locate CCP1= 0x15 // byte thp ca CCP1 0x15 , byte cao ca CCP1 0x16 Gn tr cho CCP1 s t ng gn vo c 2 thanh ghi CCP1 = 1133 ; // = 00000100 01101101 => 0x15 = 00000100 , 0x16 = 01101101

+ # DEFINE id text Text : chui hay s . Dng nh ngha gi tr . VD : #define a 12345

4 / # DEVICE :

# DEVICE chip option chip : tn VK s dng , khng dng tham s ny nu khai bo tn chip #include . option : ton t tiu chun theo tng chip: * = 5 dng pointer 5 bit ( tt c PIC ) * = 8 dng pointer 8 bit ( PIC14 v PIC18 ) * = 16 dng pointer 16 bit ( PIC14 ,PIC 18) ADC = x s dng ADC x bit ( 8 , 10 , . . . bit tu chip ) , khi dng hm read_adc( ) , s tr v gi tr x bit .

ICD = true : to m tng thch debug phn cng Microchip HIGH_INTS = TRUE : cho php dng ngt u tin cao

+ Khai bo pointer 8 bit , bn s dng c ti a 256 byte RAM cho tt c bin chng trnh .

+ Khai bo pointer 16 bit , bn s dng c ht s RAM c ca VDK . + Ch nn dng duy nht 1 khai bo #device cho c pointer v ADC . VD : #device * = 16 ADC = 10

5 / # ORG :

# org start , end # org segment #org start , end { }

Start , end: bt u v kt thc vng ROM dnh ring cho hm theo sau , hoc ring khng dng. VD : Org 0x30 , 0x1F Void xu_ly( ) { } // hm ny bt u a ch 0x30

org 0x1E00 anotherfunc( ) { } //hm ny bt u tu 0x1E00 n 0x1F00

Org 0x30 , 0x1F { } // khng c g c t trong vng ROM ny

+ Thng th khng dng ORG .

6 / # USE :

# USE delay ( clock = speed ) Speed : gi tr OSC m bn dng . VD: dng thch anh dao ng 40Mhz th : #use delay( clock = 40000000) + Ch khi c ch th ny th trong chng trnh bn mi c dng hm delay_us ( ) v delay_ms( ) .

#USE fast_io ( port) Port : l tn port :t A-G ( tu chip ) + Dng ci ny th trong chng trnh khi dng cc lnh io nh output_low() , . . . n s set ch vi 1 lnh , nhanh hn so vi khi khng dng ch th ny. + Trong hm main( ) bn phi dng hm set_tris_x( ) ch r chn vo ra th ch th trn mi c hiu lc , khng th chng trnh s chy sai . + Khng cn dng nu khng c yu cu g c bit . VD : # use fast_io( A )

#USE I2C ( options ) + Thit lp giao tip I2C. Option bao gm cc thng s sau, cch nhau bi du phy : Master : chip ch master

Slave : chip ch slave SCL = pin : ch nh chn SCL SDA = pin : ch nh chn SDA ADDRESS =x : ch nh a ch ch slave FAST : ch nh FAST I2C SLOW : ch nh SLOW I2C RESTART_WDT : restart WDT trong khi ch I2C_READ( ) FORCE_HW : s dng chc nng phn cng I2C ( nu chip h tr ) NOFLOAT_HIGH : khng cho php tn hiu float high ( ??? ) , tn hiu c li

t thp ln cao. SMBUS : bus dng khng phi bus I2C , nhng l ci g tng t . VD : #use I2C ( master , sda=pin_B0 , scl = pin_B1 ) #use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW )

#USE RS232 ( options )

+ Thit lp giao tip RS232 cho chip ( c hiu lc sau khi np chng trnh cho chip , khng phi giao tip RS232 ang s dng np chip ) . Option bao gm : BAUD = x : thit lp tc baud rate : 19200 , 38400 , 9600 , . . . PARITY = x : x= N ,E hay O , vi N : khng dng bit chn l . XMIT = pin : set chn transmit ( chuyn data) RCV = pin : set chn receive ( nhn data ) + Cc thng s trn hay dng nht , cc tham s khc s b sung sau. VD : #use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)

7 /Mt s ch th tin x l khc : #CASE : cho php phn bit ch hoa / thng trong tn bin , dnh cho nhng ai quen lp trnh C .

#OPT n :vi n=0 9 : ch nh cp ti u m , khng cn dng th mc nh l 9 ( very ti u ) .

#PRIORITY ints : vi ints l danh sch cc ngt theo th t u tin thc hin khi c nhiu ngt xy ra ng thi , ngt ng u s l ngt u tin nht , dng ngt no a ngt v . Ch cn dng nu dng hn 1 ngt . Xem c th phn ngt . VD : #priority int_CCP1 , int_timer1 // ngt CCP1 u tin nht

MT S VN QUAN TRNG KHC xem chi tit trong phn HELP : + Biu thc : xem HELP->Expressions , trong : biu th s trong C: 123 : s decimal 0x3 , 0xB1 : s hex 0b100110 : s binary a : k t abcd : chui , k t null c thm pha sau _Cc ton t C : xem Operators >= , < = , = = , != ( khng bng ) && : and || : or ! : not ( o ca bit , khng phi o ca byte )

>>n : dch tri n bit << n : dch phi n bit ++ , - - , += , - = , . . .

Bi 3: Cc Hm X L S, X L Bit, Delay trong CCS

I / CC HM X L S :

+ Bao gm cc hm:

Sin() cos() tan() Asin() acos() atan() Abs() : ly tr tuyt i Ceil( ) :lm trn theo hng tng Floor ( ) : lm trn theo hng gim Exp ( ) : tnh e^x Log ( ) :tnh log Log10 ( ) : log10 Pow ( ) : tnh lu tha Sqrt ( ) :cn thc

+ Cc hm ny chy rt chm trn cc VDK khng c b nhn phn cng ( PIC 14 ,12 ) v ch yu tnh ton vi s thc v tr v cng s thc ( 32 bit ) v bng phn mm .VD: hm sin mt 3.5 ms ( thch anh = 20Mhz ) cho KQ . Do nu khng i hi tc th dng cc hm ny cho n gin , nh l dng hm sin th khi phi lp bng tra. + Xem chi tit trn HELP CCS.

II / CC HM X L BIT V CC PHP TON : + Bao gm cc hmsau : Shift_right() shift_left() Rotate_right() rotate_left() Bit_clear() bit_set() bit_test() Swap() Make8() make16() make32()

1 / Shift_right ( address , byte , value ) Shift_left ( address , byte , value )

+ Dch phi (tri ) 1 bit vo 1 mng hay 1 cu trc . a ch c th l a ch mng hay a ch tr ti cu trc ( kiu nh &data) . Bit 0 byte thp nht l LSB .

2 / Rotate_right () , rotate_left () + Ni chung 4 hm ny t s dng .

3 / Bit_clear ( var , bit ) it_set ( var , bit ) + Bit_clear ( ) dng xa ( set = 0 ) bit c ch nh bi v tr bit trong bin var . + Bit_set ( ) dng set=1 bit c ch nh bi v tr bit trong bin var . + var : bin 8 , 16 , 32 bit bt k . + bit : v tr clear ( set ) : t 0-7 ( bin 8 bit) , 0-15 ( bin 16 bit ) , 0-31 (bin 32 bit ) . + Hm khng tr v tr . VD : Int x; X=11 ; //x=1011 Bit_clear ( x ,1 ) ; // x= 1001b = 9

4 / Bit_test ( var , bit ) : + Dng kim tra v tr bit trong bin var . + Hm tr v 0 hay 1 l gi tr bit trong var . + var : bin 8, 16 ,32 bit . + bit : v tr bit trong var . + Gi s bn c bin x 32 bit m t 0 ln v mun kim tra xem n c ln hn 4096 khng ( 4096= 2^12 =1000000000000b) : If ( x >= 4096) . . . // php kim tra ny mt ~5 us Trong 1 vng lp , vic kim tra thng xuyn nh vy s lm mt 1 thi gian ng k . ti u , ch cn dng : if ( bit_test ( x, 12 ) ch mt ~ 0.4 us . ( 20

Mhz thch anh ) . + Kim tra m ln ti nhng gi tr c bit ( 2^ i) th dng hm ny rt tin li.

5 / Swap ( var ) : + var : bin 1 byte + Hm ny tro v tr 4 bit trn vi 4 bit di ca var , tng ng var =( var>>4 ) | ( var << 4 ) + Hm khng tr v tr . VD : X= 5 ; //x=00000101b Swap ( x) ; //x = 01010000b = 80

6 / make8 ( var , offset ) : +Hm ny trch 1 byte t bin var . + var : bin 8,16,32 bit . offset l v tr ca byte cn trch ( 0,1,2,3) . + Hm tr v gi tr byte cn trch . VD : Int16 x = 1453 ; // x=0x5AD Y = Make(x, 1) ; //Y= 5 = 0x05

7 / make16 ( varhigh , varlow ) : +Tr v gi tr 16 bit kt hp t 2 bin 8 bit varhigh v varlow . Byte cao l varhigh , thp l varlow .

8 / make32 ( var1 , var2 , var3 , var4 ) : + Tr v gi tr 32 bit kt hp t cc gi tr 8 bit hay 16 bit t var1 ti var4 . Trong var2 n var4 c th c hoc khng . Gi tr var1 s l MSB , k tip l var2 , . . .Nu tng s bit kt hp t hn 32 bit th 0 c thm vo MSB cho 32 bit . VD: Int a=0x01 , b=0x02 , c=0x03 , d=0x04 ; // cc gi tr hex

Int32 e ; e = make32 ( a , b , c , d ); // e = 0x01020304 e = make32 ( a , b , c , 5 ) ; // e = 0x01020305 e = make32 ( a, b, 8 ); // e = 0x00010208 e = make32 ( a ,0x1237 ) ; // e = 0x00011237

III / CC HM DELAY :

+ s dng cc hm delay , cn c khai bo tin x l u file , VD : s dng OSC 20 Mhz , bn cn khai bo : #use delay ( clock = 20000000 ) + Hm delay khng s dng bt k timer no . Chng thc ra l 1 nhm lnh ASM khi thc thi t u ti cui th xong khong thi gian m bn quy nh . Tu thi gian delay yu cu di ngn m CCS sinh m ph hp . c khi l vi lnh NOP cho thi gian rt nh . Hay 1 vng lp NOP . Hoc gi ti 1 hm phc tp trong trng hp delay di . Cc lnh ni chung l v vn sao cho thi gian quy nh l c . Nu trong trong thi gian delay li xy ra ngt th thi gian thc thi ngt khng tnh vo thi gian delay , xong ngt n quay v chy tip cc dng m cho ti khi xong hm delay . Do thi gian delay s khng ng . + C 3 hm phc v :

1 / delay_cycles (count ) + Count : hng s t 0 255 , l s chu k lnh .1 chu k lnh bng 4 chu k my . + Hm khng tr v tr . Hm dng delay 1 s chu k lnh cho trc . VD : delay_cycles ( 25 ) ; // vi OSC = 20 Mhz , hm ny delay 5 us

2 / delay_us ( time ) + Time : l bin s th = 0 255 , time l 1 hng s th = 0 -65535 .

+ Hm khng tr v tr . + Hm ny cho php delay khong thi gian di hn theo n v us . + Quan st trong C / asm list bn s thy vi time di ngn khc nhau , CSS sinh m khc nhau .

3 / delay_ms (time ) + Time = 0-255 nu l bin s hay = 0-65535 nu l hng s . + Hm khng tr v tr . + Hm ny cho php delay di hn na . VD : Int a = 215; Delay_us ( a ) ; // delay 215 us Delay_us ( 4356 ) ; // delay 4356 us Delay_ms ( 2500 ) ; // delay 2 . 5 s

Bi 4: Chuyn i ADC - Cc Hm Vo/Ra trong CCS

I /X L ADC : + PIC c nhiu chn phc v x l ADC vi nhiu cch thc khc nhau . dng ADC , bn phi c khai bo #DEVICE cho bit dng ADC my bit ( tu chip h tr , thng l 8 hay 10 bit hoc hn) . Bn cn lu l: 1 VDK h tr ADC 10 bit th gi tr vo lun l 10 bit , nhng chia cho 4 th cn 8 bit . Do 1 bin tr chit p cp cho ng vo ADC m bn chn ch 10 bit th s rt nhy so vi ch 8 bit ( v 2 bit cui c thay i cng khng nh hng gi tr 8 bit cao v do kt qu 8 bit ADC t thay i ) , nu chng trnh c ch kim tra ADC cp nht tnh ton , hay dng ngt ADC , th n s chy hoi thi . Dng ADC 8 bit s hn ch iu ny . Do m CCS cung cp chn la ADC 8 hay 10 bit ty mc ch s dng .

Cu hnh b ADC : + Thng dng nht khi dng ADC l s dng 1 bin tr , iu chnh bi 1 nt vn , qua thu c 1 in p nh hn in p tham chiu ( Vref p max ) , a vo chn bin i ADC , kt qu cho 1 gi tr s ADC 8 bit ( 0-255 ) hay ADC 10 bit (0-1023 ) . Thng th p Vref ly bng Vdd ( 5V ). + Trn cc PIC c ng AVdd v AVss ( PIC 18 ) , thng th bn lun ni AVdd ti Vdd , AVss ti Vss m bo hat ng cho lp trnh qua ICD 2 . Cc hm sau phc v ADC : 1 / Setup_ADC ( mode ) : + Khng tr v tr . Dng xc nh cch thc hot ng b bin i ADC . Tham s mode tu thuc file thit b *.h c tn tng ng tn chip bn ang dng , nm trong th mc DEVICES ca CCS . Mun bit c bao nhiu tham s c th dng cho chip , bn m file tng ng c , tm ti ch cc nh ngha cho chc nng ADC dng cho chip tng ng vi hm ny . Sau y l cc gi tr mode ca 16F877 , ( 1 s khc c th khng c hoc c thm nh 16F877A c thm 1 s th l ADC_CLOCK_DIV_2/4/8/16/32/64 . . .) : ADC_OFF : tt hot ng ADC ( tit kim in , dnh chn cho hot ng khc ) . ADC_CLOCK_INTERNAL : thi gian ly mu bng xung clock IC ( mt 2-6 us ) thng l chung cho cc chip . ADC_CLOCK_DIV_2 : thi gian ly mu bng xung clock / 2 ( mt 0.4 us trn thch anh 20MHz ) ADC_CLOCK_DIV_8 : thi gian ly mu bng xung clock / 8 ( 1.6 us ) ADC_CLOCK_DIV_32 : thi gian ly mu bng xung clock / 32 ( 6.4 us )

2 / Setup_ADC_ports ( value ) + Xc nh chn ly tn hiu analog v in th chun s dng . Ty thuc b tr chn trn chip , s chn v chn no dng cho ADC v s chc nng ADC mi chip m value c th c nhng gi tr khc nhau. Xem file tng ng trong th mc DEVICES bit s chc nng tng ng chip . tng thch chng trnh vit cho phin bn c , 1 s tham s c 2 tn khc nhau ( nhng cng chc nng do nh ngha cng a ch ) , y dng phin bn 3.227 .Lu : Vref : p

chun , Vdd : p ngun . Sau y l cc gi tr cho value ( ch dng 1 trong cc gi tr ) ca 16F877 : ALL_ANALOGS .........: dng tt c chn sau lm analog : A0 A1 A2 A3 A5 E0 E1 E2 (Vref=Vdd) NO_ANALOG ..............................................................: khng dng analog , cc chn s l chn I /O . AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF .: A0 A1 A2 A5 E0 E1 E2 VRefh=A3 AN0_AN1_AN2_AN3_AN4 .....................................: A0 A1 A2 A3 A5 ( tn th ging nhau cho tt c thit b nhng 16F877 ch c portA c 5 chn nn A0 , A1 , A2 , A5 c dng , A6 , A7 khng c ) AN0_AN1_AN3 .......................................................: A0 A1 A3 , Vref = Vdd AN0_AN1_VSS_VREF ..............................................: A0 A1 VRefh = A3 AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF ......: A0 A1 A5 E0 E1 E2 VRefh=A3 , VRefl=A2 . AN0_AN1_AN2_AN3_AN4_AN5 ............................: A0 A1 A2 A3 A5 E0 AN0_AN1_AN2_AN4_AN5_VSS_VREF .................. : A0 A1 A2 A5 E0 VRefh=A3 AN0_AN1_AN4_AN5_VREF_VREF .........................: A0 A1 A5 E0 VRefh=A3 VRefl=A2 AN0_AN1_AN4_VREF_VREF .................................. : A0 A1 A5 VRefh=A3 VRefl=A2 AN0_AN1_VREF_VREF ...........................................: A0 A1 VRefh=A3 VRefl=A2 AN0 ..............................................................................: A0 AN0_VREF_VREF ..................................................... : A0 VRefh=A3 VRefl=A2 VD : setup_adc_ports (AN0_AN1_AN3 ) ; // A0 , A1 , A3 nhn analog , p ngun +5V cp cho IC s l in p chun .

3 / Set_ADC_channel ( channel ) : + Chn chn c vo gi tr analog bng lnh Read_ADC ( ) . Gi tr channel tu s chn chc nng ADC mi chip .Vi 16F877 , channel c gi tr t 0 -7 : 0-chn A0, 1-chn A1, 2-chn A2, 3-chn A3, 4-chn A5, 5-chn E0, 6-chn E1,

7-chn E2 +Hm khng tr v tr . Nn delay 10 us sau hm ny ri mi dng hm read_ADC ( ) bo m kt qu ng . Hm ch hot ng vi A /D phn cng trn chip.

4 / Read_ADC ( mode ) : + Dng c gi tr ADC t thanh ghi (/ cp thanh ghi ) cha kt qu bin i ADC . Lu hm ny s hi vng c cho ti khi c ny bo hon thnh bin i ADC ( s mt vi us ) th xong hm . + Nu gi tr ADC l 8 bit nh khai bo trong ch th #DEVICE , gi tr tr v ca hm l 8 bit , ngc li l 16 bit nu khai bo #DEVICE s dng ADC 10 bit tr ln . + Khi dng hm ny , n s ly ADC t chn bn chn trong hm Set_ADC_channel( ) trc . Ngha l mi ln ch c 1 knh Mun i sang c chn no , dng hm set_ADC_channel( ) ly chn . Nu khng c i chn , dng read_ADC( ) bao nhiu ln cng c . + mode c th c hoc khng , gm c : ADC_START_AND_READ : gi tr mc nh ADC_START_ONLY : bt u chuyn i v tr v ADC_READ_ONLY : c kt qu chuyn i ln cui

#DEVCE 8 bit 10 bit 11 bit 16 bit ADC=8 0-255 0-255 00-255 00-255 ADC=10 x 0-1023 x x ADC=11 x x 0-2047 x ADC=16 0-65280 0-65472 0-65504 0-65535 + 16F877 ch h tr ADC 8 v 10 bit . VD : setup_adc( ADC_CLOCK_INTERNAL ); setup_adc_ports( ALL_ANALOG ); set_adc_channel(1); while ( input(PIN_B0) ) { delay_ms( 5000 ); value = read_adc(); printf("A/D value = %2x\n\r", value);

} read_adc(ADC_START_ONLY); sleep(); value=read_adc(ADC_READ_ONLY); + Lu : trn PIC 18 , cu trc ADC tng i phc tp , a nng hn nh l cho php ly 2 mu cng lc , . . . cng s dng vi cc hm trn , c nhiu thng s trong file *.h , s cp sau . 5 / _ V d : + Chng trnh sau ly ADC 8 bit , c v xut ra dy led port B , v xut ra mn hnh my tnh . + Kt ni chn trn 16F877 : RA0 l chn ly Analog vo , p chun l ngun +5V , mass=0 V

#include <16F877.h > #use delay( clock=20000000 ) #device *= 16 ADC = 8 // s dng ADC 8 bit , gi tr ADC vo t 0-255

#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7) Int8 adc ; Main( ) { Setup_ADC ( ADC_internal ) ; Setup_ADC_ports (AN0); Set_ADC_channel ( 0 ) ; Delay_us (10 ); // delay 10 us While (true ) { adc = read_adc ( ) ; Output_B ( adc ) ; // xuat ra port B gia tri bien adc Printf( gia tri adc la : %u , adc ) ; // in ra man hinh } } // gi tr bin adc t 0-255 , dng chng trnh Serial port Monitor trong mc Tools ca CCS gim st gi tr . Nh thit lp tc l 19200 nh khai bo trn .

II / CC HM VO RA TRONG C : + Bao gm cc hm sau : Output_low() Output_high() Output_float() Output_bit() Input() Ouput_X() Input_X() port_b_pullups() Set_tris_X() 1 / Output_low ( pin ) , Output_high (pin ) : + Dng thit lp mc 0 ( low, 0V ) hay m c 1 ( high , 5V ) cho chn IC , pin ch v tr chn . + Hm ny s t pin lm ng ra , xem m asm bit c th . + Hm ny di 2-4 chu k my . Cng c th xut xung dng set_tris_X() v #use fast_io. VD : chng trnh sau xut xung vung chu k 500ms , duty =50% ra chn B0 ,ni B0 vi 1 led s lm nhp nhy led . #include <16F877.h> #use delay( clock=20000000) Main() { while(1)

{ output_high(pin_B0) ; Delay_ms(250) ; // delay 250ms Output_low (pin_B0); Delay_ms (250 ); } }

2 / Output_bit ( pin , value ) : + pin : tn chn value : gi tr 0 hay 1

+ Hm ny cng xut gi tr 0 / 1 trn pin , tng t 2 hm trn . Thng dng n khi gi tr ra tu thuc gi tr bin 1 bit no , hay mun xut o ca gi tr ng ra trc . VD : Chng trnh xut xung vung chu k 500ms ,duty =50% int1 x; // Khai bo x, mc nh = 0 Main() //Trong hm main : { while (1 ) { output_bit( pin_B0 , !x ) ; Delay_ms(250 ); } }

3 / Output_float ( pin ) : + Hm ny set pin nh ng vo , cho php pin mc cao nh 1 cc thu h.

4 / Input ( pin ) : + Hm ny tr v gi tr 0 hay 1 l trng thi ca chn IC . Gi tr l 1 bit

5 / Output_X ( value ) : + X l tn port c trn chip . Value l gi tr 1 byte . + Hm ny xut gi tr 1 byte ra port . Tt c chn ca port u l ng ra . VD : Output_B ( 212 ) ; // xut gi tr 11010100 ra port B

6 / Input_X ( ) : + X : l tn port ( a, b ,c ,d e ) . + Hm ny tr v gi tr 8 bit l gi tr ang hin hu ca port .VD : m=input_E();

7 / Port_B_pullups ( value ) : + Hm ny thit lp ng vo port B pullup ( in tr ko ln) . Value =1 s kch hot tnh nng ny v value =0 s ngng . + Ch cc chip c port B c tnh nng ny mi dng hm ny .

8 / Set_tris_X ( value ) : + Hm ny nh ngha chn IO cho 1 port l ng vo hay ng ra. Ch c dng vi #use fast_IO . S dng#byte to bin ch n port v thao tc trn bin ny chnh l thao tc trn port . + Value l gi tr 8 bit . Mi bit i din 1 chn v bit=0 s set chn l ng vo, bit= 1 set chn l ng ra . VD : chng trnh sau cho php thao tc trn portB 1 cch d dng: #include < 16F877.h > #use delay(clock=20000000) #use Fast_IO( B ) #byte portB = 0x6 // 16F877 c port b a ch 6h #bit B0 = portB. 0 // bin B0 ch n chn B0

#bit B1=portB.1 // bin B1 ch n chn B1

#bit B2=portB.2 // bin B2 ch n chn B2 #bit B3=portB.3 // bin B3 ch n chn B3 #bit B4=portB.4 // bin B4 ch n chn B4 #bit B5=portB.5 // bin B5 ch n chn B5 #bit B6=portB.6 // bin B6 ch n chn B6 #bit B7=portB.7 // bin B7 ch n chn B7 Main() { set_tris_B ( 126 ) ; //portB=01111110 b // B0 l ng vo , thng lm ngt ngoi //B1 . . . B6 l ng ra , Vd lm 6 ng ra iu ch PWM //B7 l ng vo , Vd l nhn tn hiu cho php chng hn if ( B7 ) //nu ng vo chn B7 l 1 th xut 3 cp xung i nghch { B1 = 1 ; B2 = 0 ; B3 = 1 ; B4 = 0 ; B5 = 1 ; B6 = 0 ; } Else B1=B2=B3=B4=B5=B6= 0; }

+ Lu : + Set_tris_B (0 ) : port B =00000000 : tt c chn portB l ng ra + set_tris_B ( 1 ) : portB = 00000001 : ch B0 l ng vo , cn li l ng ra + set_tris_B ( 255 ) : portB=11111111: tt c chn portB l ng vo. Bn nn dng gi tr dng nh phn cho d . VD : set_tris_B ( 00110001b ) ;

+ n y l bn c th vit nhiu chng trnh th v ri . Vd nh l dng ADC iu chnh tc nhp nhy ca dy n led , truyn gi tr 8 bit t chip

ny sang chip khc , . . . + VD: Chng trnh sau dng ADC qua chn A0 iu chnh tc nhp nhy dy n led ni vo portB, c th dng fast_io hay hm output_B () xut gi tr u c . chng trnh dng hm. Nu ng vo chn C0 =0 th tip tc nhn ADC v xut ra portB, C0=1 th khng xut #include <16F877.h> #device *=16 ADC= 8 #use delay( clock =20000000) Int8 ADC_delay ;

Void hieu_chinh ( ) { ADC_delay = read_adc ( 0 ) ; Output_B ( 0) ; //portB=00000000 Delay_ms ( ADC_delay ); Output_B ( 255 ) ; // portB= 11111111 Delay_ms ( ADC_delay ); }

Main() { setup_adc_ports(AN0_AN1_AN3); // A0 , A1 v A3 l chn analog , ta ch cn dng A0 ly tn hiu setup_adc(adc_clock_internal); set_adc_channel ( 0 ); // chn c ADC t chn A0 while(1) { hieu_chinh ( ) ; If ( input ( pin_C0 ) { output_B (0 ); Break ; // thot khi vng lp while nh } } }

Bi 5: Truyn Thng Ni Tip RS232 - X L Chui Trong CCS

+ Phn ny s gip bn vit chng trnh c s dng giao tip vi my tnh (PC) . iu ny rt cn thit khi bn mun VK khi hot ng c th truyn d liu cho PC x l , hoc nhn gi tr t PC x l v iu khin ( dng PC iu khin ng c , nhit , hay bin PC thnh dng c o cc i lng in, Oscilocope , . . .) .

+ Vit chng trnh lp trnh cho VK giao tip my tnh l cng vic rt phc tp khi vit bng ASM , rt kh hiu i vi nhng ngi mi bt u lp trnh . c bit l khi vit cho nhng con VK khng h tr t phn cng ( 8951 th phi (?) ) . Tht may l phn ln PIC hin nay u h tr phn ny nn vic lp trnh c d dng hn . Nhng nu chng trnh ca bn yu cu truyn hay nhn nhiu loi d liu ( s 8 , 16 ,32 bit , dng , m , chui , . . .) th vic vit chng trnh x l v phn loi chng l iu kinh d . + Nu bn lp trnh ASM cho vn ny ri th bn s thy sao d dng qu vy khi gii quyt vn ny vi C khi dng CCS . Rt n gin ! CCS cung cp rt nhiu hm phc v cho giao tip qua cng COM v v s hm x l chui . Chng ny s gii quyt iu . + Mt yu t quan trng l khi no th VK bit PC truyn data => c th lp trnh bt tay bng phn mm hay n gin l dng ngt . Cc v d v ngt , xem phn ngt .

I / TRUYN THNG VI PC QUA CNG COM :

+ s dng giao thc ny , phi c 2 khai bo nh v d sau : #use delay (clock = 40000000 ) // nu VDK ang dng OSC 40Mhz #use rs232 (baud=19200 , parity=n , xmit=pin_C6 , rcv=pin_C7 ) // baud= 19200 , khng chn l , chn truyn C6 , chn nhn C7 +Cc hm lin quan : Printf ( ) Getc ( ) putc ( ) Getch ( ) putchar ( ) Getchar ( ) fputc ( ) Fgetc ( ) puts ( ) Gets ( ) fputs ( ) Fgets ( ) Kbhit ( ) Assert ( ) => mi trn CCS 3.222 Perror ( ) => mi trn CCS 3.222 Set_uart_speed ( ) Setup_uart ( ) + Tt c cc hm trn i hi phi khai bo ch th tin x l #use RS232 ( . . . . .) . Chi tit ch th ny xem phn Ch th tin x l . + Hm perror ( ) i hi thm #include<errno.h > . Hm assert() i hi thm #include<assert.h> . 1 / printf ( string ) Printf ( cstring , values . . . ) + Dng xut chui theo chun RS232 ra PC . + string l 1 chui hng hay 1 mng k t ( kt thc bi k t null ) . + value l danh sch cc bin , cch nhau bi du phy . + Bn phi khai bo dng format ca value theo kiu %wt .Trong w c th c hoc khng, c gi tr t 1-9 ch r c bao nhiu k t c xut ra ( mc nh khng c th c bao nhiu ra by nhiu ), hoc 01-09 s chn thm 0 cho k t hoc 1.1-1.9 cho trng hp s thc . cn t l kiu gi tr . + t c th l : C : 1 k t S : chui hoc k t U : s 8 bit khng du x : s 8 bit kiu hex ( k t vit thng ,VD : 1ef ) X : s 8 bit kiu hex ( k t vit hoa ,VD : 1EF ) D : s 8 bit c du

e : s thc c lu tha VD : e12 f : s thc Lx : s hex 16 /32 bit ( k t vit thng ) LX : hex 16 /32 bit ( k t vit hoa ) Lu : s thp phn khng du Ld : s thp phn c du % : k hiu % VD : Specifier Value=0x12 Value=0xfe %03u 018 254 %u 18 254 %2u 18 * %5 18 254 %d 18 -2 %x 12 Fe %X 12 FE %4X 0012 00FE * Result is undefined - Assume garbage. VD : Int k =6 ; Printf ( hello ); Printf ( %u , k ); 2 / KBHIT ( ) : + Thng th chng ta dng RC6 v RC7 cho RX v TX trong giao tip cng COM , VDK PIC trang b phn cng phc v vic ny vi thanh ghi gi v nhn v cc bit bo hiu tng ng . Do khi dng RS232 h tr t phn cng th KHBIT ( ) tr v TRUE nu 1 k t c nhn ( trong b m phn cng ) v sn sng cho vic c , v tr v 0 nu cha sn sng . + Hm ny c th dng hi vng xem khi no c data nhn t RS232 c .

Bi 6: Giao Tip SPI

I / GIAO TIP SPI

+ y l giao tip d dng nht , n gin nht , tc cao nht trong nhm . hot ng theo c ch hand-shaking, bt tay . Gi s c 2 VDK , th 1 l master , 1 l slave . Khi master truyn 1 byte cho slave , n pht 8 xung clock qua ng clock SCK ni ti slave , ng thi truyn 8 bit data t chn SDO ti chn SDI ca slave. Khng kim tra chn l , li . Do V d nu ang truyn c 3 bit m master reset hay h dy clock th data b mt , slave s khng nhn 8 bit v do nu tip tc nhn n s ly 5 bit byte k tip a vo thanh ghi nhn

8 bit ( v kch ngt ) . T tr i l mi gi tr nhn l sai bt tr phi chm dt v sau thit lp li giao tip ny ( c hai ) .

+ Giao tip ny cn t nht 2 dy tr ln . Nu 1 VDK ch cn gi data th ch cn dy clock v SDO .VDK nhn s dng SDI v dy clock . Dy clock l ni chung . + Nu c gi v nhn c 2 VDK th : dy clock chung , master c SDO ni ti SDI ca slave , SDO ca slave ni ti SDI ca master . + Nu master cn truyn data cho nhiu slave tr ln th SDO master ni ti cc SDI ca slave . + Chn SS l slave select . + SPI hot ng t phn cng , v n c sn thanh ghi gi v nhn , nhn gi tr th c c ngt phc v . + Danh sch cc hm : 1 / Setup_spi (mode ) Setup_spi2 (mode ) + Dng thit lp giao tip SPI . Hm th 2 dng vi VDK c 2 b SPI . + Tham s mode :l cc hng s sau , c th OR gia cc nhm bi du | I SPI_MASTER , SPI_SLAVE , SPI_SS_DISABLED II SPI_L_TO_H , SPI_H_TO_L III SPI_CLK_DIV_4 , SPI_CLK_DIV_16 , SPI_CLK_DIV_64 , SPI_CLK_T2 + Nhm I xc nh VDK l master hay slave ,slave select + Nhm II xc nh clock cnh ln hay xung . + Nhm III xc nh tn s xung clock , SPI_CLK_DIV_4 nga l tn s = FOSC / 4 , tng ng 1 chu k lnh / xung . + Hm khng tr v tr . + Ngoi ra ,tu VDK m c thm 1 s tham s khc , xem file * .h .

2 / Spi_read ( data ) Spi_read2 ( data ) + data c th c thm v l s 8 bit . Hm th 2 cho b SPI th 2 . + Hm tr v gi tr 8 bit: value = spi_read ( )

+ Hm tr v gi tr c bi SPI . Nu value ph hp SPI_read ( ) th data s c pht xung ngoi v data nhn c s c tr v . Nu khng c data sn sng , spi_read ( ) s i data . + Hm ch dng cho SPI hardware ( SPI phn cng ) .

3 / Spi_write ( value ) Spi_write2 ( value )

+ Hm khng tr v tr . value l gi tr 8 bit . + Hm ny gi value ( 1 byte ) ti SPI , ng thi to 8 xung clock . + Hm ch dng cho SPI hardware ( SPI phn cng ) .

4 / Spi_data_is_in ( ) Spi_data_is_in2 ( ) + Hm tr v TRUE ( 1 ) nu data nhn c y ( 8 bit ) t SPI , tr v false nu cha nhn . + Hm ny dng kim tra xem gi tr nhn v SPI 1 byte cha dng hm spi_read ( ) c data vo bin .

Bi 7: Cc Ngt Trong PIC

I / C CH HOT NG CA NGT : 1 / Ngt 1 cp : + Trn PIC 14 , 12 ,10 ,tt c cc ngt ch c 1 cp u tin . Ngha l ngt no ang c phc v th khng th b ngt bi 1 ngt khc xy ra . C ch sinh m cho ngt ca CCS nh sau : nhy n a ch ngt , thng l 004h , sao lu thanh ghi W, STATUS , PCLATCH , FSR, v nhiu th v vn khc, sau n mi hi vng xem c ngt no xy ra th nhy n hm phc v ngt . thc hin xong th phc hi tt c thanh ghi trn , ri mi RETFIE thot ngt . S chu k thc thi t ch ngt n khi nhy vo hm ngt c 20 chu k lnh !, nhy ra cng c

. + iu g xy ra nu chng trnh dng nhiu ngt v khi c ngt th c 2 ngt tr ln xy ra ng thi ? Ngha l : 2 ngt xy ra cng lc , hay khi ngt A kch hot v CCS ang lu cc thanh ghi ( cha ti hi vng c ngt ) th ngt B xy ra , d nhin ngt B khng th kch vector ngt nhy ti 004h v bit cho php ngt ton cc ( GIE ) b kha t ng khi c ngt , ch c c ngt B bt m thi. Sau khi lu cc thanh ghi , chng trnh kim tra c ngt , r rng l nu bit no c kim tra trc th phc v trc , d n xy ra sau . trnh phc v khng ng ch , bn dng #priority xc nh u tin ngt ( xem phn ch th tin x l ) . Ngt u tin nht s lun c hi vng trc .Sau khi xc nh c ngt cn phc v , n s thc thi hm ngt tng ng .Xong th xo c ngt v thot ngt . Phc v ngt no xong th ch xo c ngt .Nu A u tin hn B th sau khi lm A , chng trnh xo c ngt A , nhng c B khng xo ( v u c phc v ) , nn khi thot ra ngt A , n s li ngt tip ( v c B bt ), li hi vng c ngt t u : nu c A cha bt th xt B, lc ny B bt nn phc v B , xong th xo c B v thot ngt . + Mt chng trnh dng nhiu ngt phi lu iu ny , trnh trng hp : ngt xy ra lin tc (trn ngt ) , 1 ngt b p ng tr , ngt khng ng , . . .

2 / Ngt 2 cp : + Ch c trn PIC 18 ( v dsPIC ) . C 2 khi nim : ngt u tin thp (low priority) v ngt u tin cao ( high priority ) . 2 vector thc thi ngt tng ng thng l 0008h (high) v 0018h ( low ) . Mt ngt thp ang c phc v s b ngng v phc v ngt cao 0008h nu ngt cao xy ra . Ngc li , ngt cao ang xy ra th khng bao gi b ngt bi ngt thp . + Nu vit hm ngt bnh thng , khng i hi u tin g th CCS sinh m tt c hm ngt u l ngt u tin cao . Quy trnh thc hin ngt s nh ngt 1 cp trn . #priority vn c dng . S chu k thc thi t 0008h n khi nhy vo thc thi hm ngt khong 30 chu k , xong hm ngt ti khi kt thc ngt cng mt khong 30 chu k lnh . + s dng ngt 2 cp , khai bo #device phi c high_ints=true . V hm ngt no mun u tin cao th thm FAST hay HIGH theo sau ch th tin x l hm . Lu : khi dng FAST th khng nn dng HIGH cho cc ngt khc th mi c ngha v ch c duy nht 1 ngt c u tin FAST , nhng c th c nhiu ngt t mc HIGH . VD :

#int_timer1 FAST Void xu_ly ( ) {... } #int_timer2 HIGH Void dinh_thi () {... } #int_timer5 HIGH Void vong_lap() {... } + C ch sinh m nh sau : c ngt thp th nhy ti 0018h , sao lu W, STATUS , FSR0/1/2 ,. . . ri mi hi vng c ngt thp . chy xong hm ngt th phc hi tt c v RETFIE 0 . + Ring ngt cao nh du FAST khng sinh m sao lu g c m nhy thng vo hm ngt chy lun . PIC 18 v dsPIC c c ch lu siu tc l FAST STACK REGISTER ( xem datasheet ) . Khi xy ra ngt bt k, W, S , BSR t ng lu vo thanh ghi trn , PC counter lu vo stack . xong ngt th pop ra . Vn ch : khi ngt thp xy ra , FAST STACK REGISTER t ng lu W ,S , BSR , PC -> stack . Trong khi thc hin hm phc v ngt th trng hp W, S , BSR thay i l c th ( v vy mi sao lu ch ) . nhng nu xy ra ngt cao vo thi im ? FAST STACK REGISTER s b ghi => mt data . Do , c ch sinh m ca CCS cn phi lun ng , ngha l : lun t sao lu ring W ,S , BSR, v cc thanh ghi FSR na , khi thc thi ngt thp . Cn ngt cao FAST khi chy xong s RETFIE 1 t ng phc hi W, S , BSR t FAST STACK REGISTER . C 2 trng hp : 1 l ch c ngt cao , th khng c vn g . 2 l ngt cao ngt 1 ngt thp ang chy . Phn tch s thy rng cho d b ngt trong khi ang sao lu ,hay cha kp sao lu , hay sao lu vo cc bin ring ri , cui cng chng trnh cng quay ra ng a ch ban u vi cc thanh ghi W, S , BSR nh c . + Tun th nguyn tc ngt cao thc thi tc thi nn CCS ch cho 1 ngt cao FAST duy nht bt k hot ng , nn khng sinh m hi vng , sao lu thm g c . + Nu bn mun c nhiu ngt u tin cao , th dng HIGH , chng trnh sao lu bnh thng nh vi ngt thp , nhng khi ngt nh du FAST cng mt tc dng , CCS xem nh l HIGH v x l bnh thng . _Nh vy dng FAST hay HIGH u c ngha ring ca nh lp trnh .

II / KHAI BO NGT : _Mi dng VDK c s lng ngun ngt ngt khc nhau : PIC 14 c 14 ngt , PIC 18 c 35 ngt . _Mun bit CCS h tr nhng ngt no cho VDK ca bn , m file *.h tng ng , cui file l danh sch cc ngt m CCS h tr n . Cch khc l vo CCS -> View -> Valid interrupts , chn VDK mun xem , n s hin th danh sch ngt c th c cho VDK . _Sau y l danh sch 1 s ngt vi chc nng tng ng : #INT_GLOBAL : ngt chung , ngha l khi c ngt xy ra , hm theo sau ch th ny c thc thi , bn s khng c khai bo thm ch th ngt no khc khi s dng ch th ny . CCS khng sinh bt k m lu no , hm ngt bt u ngay ti vector ngt . Nu bt nhiu c cho php ngt , c th bn s phi hi vng xc nh ngt no . Dng ch th ny tng ng vit hm ngt 1 cch th cng m thi , nh l vit hm ngt vi ASM vy . #INT_AD : chuyn i A /D hon tt , thng th khng nn dng #INT_ADOF : I dont know #INT_BUSCOL : xung t bus #INT_BUTTON : nt nhn ( khng bit hot ng th no ) #INT_CCP1 : c Capture hay compare trn CCP1 #INT_CCP2 : c Capture hay compare trn CCP2 #INT_COMP : kim tra bng nhau trn Comparator #INT_EEPROM : hon thnh ghi EEPROM #INT_EXT : ngt ngoi #INT_EXT1 : ngt ngoi 1 #INT_EXT2 : ngt ngoi 2 #INT_I2C : c hot ng I 2C #INT_LCD : c hot ng LCD #INT_LOWVOLT : pht hin p thp #INT_PSP : c data vo cng Parallel slave #INT_RB : bt k thay i no trn chn B4 n B7 #INT_RC : bt k thay i no trn chn C4 n C7 #INT_RDA : data nhn t RS 232 sn sng #INT_RTCC : trn Timer 0

#INT_SSP : c hot ng SPI hay I 2C #INT_TBE : b m chuyn RS 232 trng #INT_TIMER0 : mt tn khc ca #INT_RTCC #INT_TIMER1 : trn Timer 1 #INT_TIMER2 : trn Timer 2 #INT_TIMER3 : trn Timer 3 #INT_TIMER5 : trn Timer 5 #INT_OSCF : li OSC #INT_PWMTB : ngt cu PWM time base #INT_IC3DR : ngt i hng ( direct ) ca IC 3 #INT_IC2QEI : ngt ca QEI #INT_IC1 : ngt IC 1 + Hm i km phc v ngt khng cn tham s v khng c tc dng . + S dng NOCLEAR sau #int_xxx CCS khng xo c ngt ca hm . + cho php ngt hot ng phi dng lnh enable_interrupts ( int_xxxx) v enable_interrupts (global ) . + Kho FAST theo sau #int_xxxx cho ngt l u tin cao , ch c 1 ngt thi , ch c PIC 18 v dsPIC . VD : #int_timer0 FAST NOCLEAR III / CC HM THIT LP HOT NG NGT : 1 / enable_interrupts ( level ) + level l tn cc ngt cho trn hay l GLOBAL cho php ngt cp ton cc . + Mi ngt ca VDK u c 1 bit c ngt , 1 bit cho php ngt . Khi c ngt th bit c ngt b set =1, nhng ngt c hat ng c hay khng tu thuc bit cho php ngt . enable_interrupts (int_xxx ) s bt bit cho php ngt . Nhng tt c cc ngt u khng th thc thi nu bit cho php ngt ton cc = 0, enable_interrupts( global ) s bt bit ny . VD : cho php ngt timer0 v timer1 hot ng: enable_interrupts (int_timer0); enable_interrupts (int_timer1 ) ; enable_interrupts ( global ); // ch cn dng 1 ln tr phi mun c thay i c bit 2 / disable_interrupts ( level ) + level ging nh trn .

+ Hm ny v hiu 1 ngt bng cch set bit cho php ngt = 0 . + disable_interrupts ( global ) set bit cho php ngt ton cc =0 , cm tt c cc ngt . + Khng dng hm ny trong hm phc v ngt v khng c tc dng , c ngt lun b xo t ng . 3 / clear_interupt ( level ) + level khng c GLOBAL . + Hm ny xo c ngt ca ngt c ch nh bi level . 4 / ext_int_edge ( source , edge ) + Hm ny thit lp ngun ngt ngoi EXTx l cnh ln hay cnh xung . + source : ngun ngt . Trn PIC 18 c 3 ngun ngt trn 3 chn EXT0, EXT1, EXT2 ng vi source =0,1, 2 . Cc PIC khc ch c 1 ngun EXT nn source = 0 . + edge : chn cnh kch ngt , edge = L_TO_H nu chn cnh ln ( t mc thp chuyn ln mc cao ) hay H_TO_L nu chn cnh xung . IV / CC CHNG TRNH VD V NGT : 1 / #INT_RB : + Sau y l 1 chng trnh in hnh v s dng ngt khi c s thay i trn chn B4-B7 . + M t : mi khi nhn nt bt k trn B4-B7 , s kch ngt RB , hm phc v ngt c tn RB_LED c thc thi , hm ny n gin l xut ra LED v tr tng ng nhng trn portD t D4 D7 . + VDK l 16F877 .

#include < 16F877.h > #device PIC16F877 *=16 #use delay (clock = 20000000 ) //thm khai bo ny nu ctrnh c dng hm delay,OSC=20 Mhz #byte portb = 0x06 //to tn danh nh portb thay th a ch portB l 06h #byte portd = 0x08 //to tn danh nh portd thay th a ch portD l 08h #INT_RB Void RB_LED ( ) { portd=portb; } // hm phc v ngt

void main ( ) { set_tris_b ( 0xF0 ) ; // portB = 11110000 , B4-B7 l ng vo , B0-B3 l ng ra set_tris_d ( 0x00 ) ; // portD = 00000000 , D0-D7 u l ng ra enable_interrupts ( INT_RB ) ; // cho php ngt RB enable_interrupts ( GLOBAL ) ; // cho php ngt ton cc

// do chng trnh khng lm g khc ngoi vic ch ngt nn vng while ny trng khng while( true ) { //c th thm m x l y . . . } } //main

You might also like