Professional Documents
Culture Documents
Su Dung CCS Tieng Viet
Su Dung CCS Tieng Viet
Tac gia tn TRN XUN TRNG , SV K2001 ,H BK HCM . La thanh vin txt2203 trn din an diendandientu.com . Moi ong gop y kin v tai liu xin vao muc Vi x ly-Vi iu khin cua din an hoc email n ia chi : txt2203@yahoo.com . Rt cam n moi ong gop y kin cua cac ban yu thich lp trinh vi x ly i vi tai liu nay .
II / _ VAI VN V TAI LIU NAY : _Tai liu hng dn s dung phn mm CCS cac phin ban , lp trinh C cho VK . Tai liu cung giai thich cach thc hoat ng cua 1 s module cua VK cac ban nm ro hn hoat ng VK nhm s dung ham va vit chng trinh 1 cach chinh xac . _Tai liu nay khng chu y thay th hoan toan HELP cua CCS , no chi la phn c ong , la hng dn vit 1 chng trinh bt u t u , gii thiu 1 s ham va cach hoat ng , 1 s vn khi lp trinh , . . . do o no khng y u , ban nn i chiu tai liu nay vi HELP ting Anh nm ro vn , ng thi hoc ca ting Anh d dang . _CCS co phn common questions nhng cu hoi thng gp va tra li , cha c dich y du no rt quan trong , nhiu ban hay bo qua , khng y . Ban nn xem no . _Tai liu trinh bay v cac vn sau : _ Chng 0 : Gii thiu s lc CCS . Vit 1 chng trinh C trong CCS nh th nao . Cng cu m phong . _ Chng 1 : S dung bin va ham , cac cu truc lnh , chi thi tin x ly. _ Chng 2 : Cac ham x ly s , x ly bit , delay . _ Chng 3 : X ly ADC , cac ham vao , ra trong C . _ Chng 4 : Truyn thng vi PC , x ly chui . _ Chng 5 : vn TIMER. _ Chng 6 : Truyn thng I2C , SPI va PARALLEL . _ Chng 7 : Cac vn v PWM , Capture va Compare . _ Chng 8 : Vn ngt ( interrupt ). _Trong mi chng se co cac hng dn s dung cac ham thich hp cho chu o . _Nn oc chng 1 trc . Cac chng con lai c lp nhau . Thich gi oc ny . _Tai liu nay vit n u a ln mang cho moi ngi tham khao n o . Hu ht se trinh bay s dung 1 cach c ban nht , sau o se b sung thm VD,chng trinh, . . . thm n u se thng bao n o .
CHNG 0 :
I / _ GII THIU CCS : _Chng trinh CCS dung cho tai liu nay la PCW COMPILER version 3.07 (2001 ) hoc 3.222 (2004) , bao gm : PCB , PCM va PCH . Phin ban mi nht la 3.227 co nhiu ham mi va chc nng mi , cp nht mi . Lp trinh cho cac ho PIC 12 bit , 14 bit va PIC 18 . _ vit 1 chng trinh C mi : chay CCS , vao New tao 1 file C mi . Trn thanh toolbar : _Chon Microchip 12 bit vit chng trinh cho PIC 12 bit . Microchip 14 bit vit chng trinh cho PIC 14 bit . Microchip PIC18 vit chng trinh cho PIC18 . _Chon Compiler bin dich chng trinh ban ang vit. _CCS la trinh bin dich dung ngn ng C lp trinh cho VK . y la ngn ng lp trinh y sc manh , giup ban nhanh chong trong vic vit chng trinh hn so vi ngn ng Assembly . _Tuy nhin C khng phai la van nng , co th thc hin moi th nh y mun . Trong 1 s trng hp , no co th sinh ma chay sai (tham khao cac cai tin cac version CCS trn web : info.CCS.com Mt khac , no sinh ma khng theo y mun ( du khng sai , vi du nh sinh nhiu ma lnh khng quan trong khi thc thi ham ngt ) lam chm tc thc thi chng trinh nu ban oi hoi chng trinh x ly vi tc cao , vi du nh iu ch PWM . _Nhng CCS C cho phep ban phi hp ASSEMBLY cunh vi C , iu nay cho phep chng trinh cua ban se tr nn rt uyn chuyn , kt hp c sc manh cua ca 2 ngn ng , du rng vic phi hp se lam cho vic vit chng trinh tr nn kho khn hn . _CCS cung cp cac cng cu tin ich giam sat hoat ng chng trinh nh : C/ASM list : cho phep xem ma ASM cua file ban bin dich , giup ban quan ly ma va nm c cac thc ma sinh ra va no chay nh th nao , la cng cu rt quan trong , ban co th g ri chng trinh va nm c hoat ng cua no ; SYMBOL hin thi b nh cp phat cho tng bin , giup quan ly b nh cac bin chng trinh ,. . . CallTree hin thi phn b b nh . _ Co nhiu tin ich trong muc Tools , nhng do ban crack nn nhiu cai khng xai c .
II / _ CNG CU M PHONG , TICH HP TRONG MPLAB : _Cng cu m phong cho PIC 16Fxxx. . a nng nht chi co th la PIC Simulator IDE 5x , h tr 38 loai PIC 16Fxxx . Co ca Oscilocope , INT ao , . . . va nhiu chc nng khac vi giao din tuyt ep , d dung . Hoat ng c lp , ly file HEX m phong . Co dich ngc ra Assemble . Co b lp trinh BASIC va Assemble rt hay va d dung , du kha n gian nhng u vit cac chng trinh nho cht lng . Ban nn th qua . _ M phong vi PIC 18 , PIC 12 , va nhiu loai PIC 16 ma IDE trn khng h tr ? Ban co th dung CCS tich hp MPLAB .
III / _ CCS TICH HP TRONG MPLAB : _Ban co th soan ma CCS trong mi trng MPLAB va m phong ma C ( khng phai Assemble ) , tng t nh lp trinh va m phong vi MPLAB C18 . _ Thit lp mi trng CCS : vao MPLAB IDE , v muc Project-> Set Language Tool Location . . . Hp thoai m ra , nhn vao du + cua dong CCS C Compile ->Executable ,sau o chon Browser thit lp ng dn n file ccsc . exe trong th muc cai t CCS ( tn la PICC ) . Ban co th thm ng dn vao 4 dong cua Default Search Path . . . nu thy cn . _ Tao 1 d an ( project ) CCS trong MPLAB : vao Project-> Project Wizard , chon VK lam vic , bc 2 : chon b cng cu ( Active toolSuite ) la CCS C Compiler . . . co th khng cn Add file thit bi *.h vi trong file ma ma ban se vit sau o co dong #include file nay ri thi no t include vao thi . th la ban a co mi trng lam vic CCS trong MLPAB . Khuyt im la ban khng th dung cac tin ich cua CCS c lp c ( C/asm list . . . ) . Tuy vy , ban co th soan ma t CCS c lp , nem qua MPLAB , dung c tinh nng m phong C cua MPLAB . _ m phong : sau khi soan ma , chon Compile . Ban co th dung moi tin ich trong muc View m phong . M Watch , chon cac bin C ma ban mun quan sat , thanh ghi c bit mun xem . Sau o m Debugger->Select tool->MPLAB SIM . Tool bar m phong xut hin , chon animate chay tng dong lnh C m phong . _ Lu y : vao Debugger-> Setting . . . thay i cac thit lp cn thit : OSC/TRACK : thay i tn s VK thich hp . ANIMATION / REALTIME UPDATE : thay i tc m phong va cp nht Watch . Muc nay con dung thay i tc m phong cho file ma Assemble ( mc inh no chay nh RUA y 1 s cho 1 lnh ) .
II / _ VIT 1 CHNG TRINH TRONG CCS : _Sau y la vi du 1 chng trinh trong CCS :
#device PIC6f877 *=16 ADC=10 #use delay(clock=20000000) . . . . Int16 a,b; .... Void xu_ly_ADC ( ) {...
... }
_u tin la cac chi thi tin x ly : # . . . co nhim vu bao cho CCS cn s dung nhng gi trong chng trinh C nh dung VXL gi , co dung giao tip PC khng , ADC khng , DELAY khng , . . . _Cac khai bao bin . _Cac ham con . _ Cac ham phuc vu ngt theo sau bi 1 chi thi tin x ly cho bit dung ngt nao. _Chng trinh chinh .
CHNG 1 : CACUCH S DUNNG BINAN VA HAMM , CACUC CUAU TRUCUC LNNH , CHI THI TINAN X LYU
I / _ KHAI BAO VA S DUNG BIN , HNG , MANG : 1 / _ Khai bao bin , hng ,mang : _Cac loai bin sau c h tr : int1 int8 int16 float s 1 bit = true hay false ( 0 hay 1) s nguyn 1 byte ( 8 bit) s nguyn 16 bit int32 s thc 32 bit s nguyn 32 bit char ky t 8 bit
short mc inh nh kiu int1 byte mc inh nh kiu int8 int mc inh nh kiu int8 long mc inh nh kiu int16
_Thm signed hoc unsigned phia trc chi o la s co du hay khng du .Khai bao nh trn mc inh la khng du . 4 khai bao cui khng nn dung vi d nhm ln . Thay vao o nn dung 4 khai bao u .
VD : Signed int8 a ; Signed int32 , . . . _Pham vi bin : Int8 :0 , 255 signed int8 : -128 , 127 Int16 : 0 ,2^15-1 signed int16 : -2^15 , 2^15-1 // s a la 8 bit du ( bit 7 la bit du ). Signed int16 b , c , d ;
_Khai bao hng : VD : Int8 const a=231 ; _Khai bao 1 mang hng s : VD : Int8 const a[5] = { 3,5,6,8,6 } ; //5 phn t , chi s mang bt u t 0 : a[0]=3
_Mt mang hng s co kich thc ti a tuy thuc loai VK: *NuVK la PIC 14 ( VD :16F877 ) : ban chi c khai bao 1 mang hng s co kich thc ti a la 256 byte . Cac khai bao sau la hp l : Int8 const a[5]={ . . .}; Int8 const a[256]={ . . .}; Int16 const a[12] = { . . . }; Int16 const a[128] = { . . . }; Int16 const a[200] = { . . . }; // s dung 5 byte , du . . . ban in s vao // 256 phn t x 1 byte = 256 byte // 12 x 2= 24 byte // 128 x 2= 256 byte // 200 x 2 =400 byte : khng hp l
*Nu VK la PIC 18 : khai bao mang hng s thoai mai , khng gii han kich thc . _Lu y : nu anh khng u s phn t vao trong ngoc kep nh a khai bao , cac phn t con lai se la 0 . Truy xut gia tri vt qua chi s mang khai bao se lam chng trinh chay v tn . _Mang hng s thng dung lam bang tra (vi du bang tra sin ) , vit d dang va nhanh chong , gon hn so vi khi dung ASM vit . _Khai bao 1 bin mang : kich thc tuy thuc khai bao con tro trong #device va loai VDK:
*PIC 14 : Nu ban khai bao con tro 8 bit : VD # device *=8 : khng gian b nh chi co 256 byte cho tt ca cac bin chng trinh bt chp VK cua ban co hn 256 byte RAM (Vd : 368 , . . .) va bin mang co kich thc ti a tuy thuc phn manh b nh , vi 16F877 co 368 byte ram , thng thi kich thc khng qua 60 byte ,co khi di 40 byte , nu khai bao ln hn se gp li v duyn : not enough ram for all variable trong khi thc s VDK con rt nhiu RAM . Nu khai bao con tro 16 bit : VD : #device *=16 , khng gian b nh la y u ( tr i 1 it RAM do CCS chim lam bin tam ) .VD : vi 16F877 ban dung u 368 byte RAM . Nhng kich thc mang cung khng qua 60 byte . * PIC 18 : kich thc mang khng gii han, xai ht RAM thi thi . Vi khai bao con tro 8 bit , ban chi c xai ti a 256 byte RAM , nu khai bao con tro 16 bit , ban xai tron b nh RAM thc s . _VD Khai bao bin mang : int16 a[125] ; // bin mang 126 phn t , kich thc 252 byte ram .
2 / _ Cach s dung bin : _Khi s dung cac phep toan cn lu y : s tran s , tinh toan vi s m , s chuyn kiu va ep kiu .
_VD :
_Ban co th ep kiu , thng la tit kim ram , hay mun tit kim thi gian tinh , . . .. VD : Int8 a =8 , b=200; Int16 c ; C= ( int16) a * b ; // c= 1600 , a chuyn sang 16 bit , 16bit*8bitI b t ng chuyn sang 16 bit , kt qua la 16 bit trong c , lu y bin a , b vn la 8 bit . _8bit * 8bit I phep nhn la 8 bit , KQ la 8 bit _16bit * 8 bit I phep nhn la 16 bit , KQ la 16 bit _32bit * 16 bit I phep nhn la 32 bit , KQ la 32 bit _16bit * 16 bit I phep nhn la 16 bit , KQ la 16 bit ...v.v... _Co th ep kiu kt qua : VD : 16b*8bI16bit , nu gan vao bin 8 bit thi KQ se ct bo 8 bit cao .
II / _ CAC CU TRUC LNH : ( statement ) _Gm cac lnh nh while . . do , case , . . . STATEMENTS
STATEMENT EXAMPLE if (expr) stmt; [else stmt;] if (x==25) x=1; else x=x+1; while (expr) stmt; while (get_rtcc()!=0) putc(n); do stmt while (expr); putc(c=getc()); } while (c!=0); do {
for (i=1;i<=10;++i)
case cexpr: stmt; //one or more case [default:stmt] ... } switch (cmd) { printf(cmd 0);
case 0: break;
case 1: printf(cmd 1); break; default: printf(bad cmd); break; } return [expr]; goto label; return (5);
goto loop;
{[stmt]}
{a=1;
_while (expr) stmt : xet iu kin trc ri thc thi biu thc sau . _ do stmt while (expr) : thc thi biu thc ri mi xet iu kin sau .
10
_Return : dung cho ham co tra v tri , hoc khng tra v tri cung c , khi o chi cn dung: return ; ( nghia la thoat khoi ham tai o ) . _Break : ngt ngang ( thoat khoi ) vong lp while. _Continue : quay tr v u vong lp while .
III / _ CHI THI TIN X LY : _Xem chi tit tt ca phn HELP , muc pre_processor . y se gii thiu 1 s chi thi thng dung nht : 1 /_ #ASM va #ENDASM : _Cho phep t 1 oan ma ASM gia 2 chi thi nay , Chi t trong ham . CCS inh nghia sn 1 bin 8 bit _RETURN_ ban gan gia tri tra v cho ham t oan ma Assembly. _C u manh thay th Assmemly . Vi vy nn han ch lng ma Assembly vao vi thng gy ra xao trn dn n sau khi bin dich ma chay sai , tr phi ban nm ro Assembly va oc hiu ma Assembly sinh ra thng qua muc C/Asm list . _Khi s dung cac bin khng bank hin tai , CCS sinh thm ma chuyn bank t ng cho cac bin o . Nu s dung #ASM ASIS thi CCS khng sinh thm ma chuyn bank t ng , ban phai t thm vao trong ma ASM . _Lu y : ma Assembly theo ung ma tp lnh VDK , khng phai ma kiu MPLAB . _VD : int find_parity (int data) int count; #asm movlw 0x8 movwf count movlw 0 loop: xorwf data,w rrf #endasm } data,f decfsz count,f goto loop movwf _return_ {
11
Hay
#include filename
Filename : tn file cho thit bi *.h , *.c . Nu chi inh file ng dn khac thi thm ng dn vao . Lun phai co khai bao chng trinh vit cho VK nao , va lun t dong u tin . _VD :
#include <16F877.H>
3 / _ #BIT , #BYTE , #LOCATE va # DEFINE: _ #BIT id = x . y Vi id : tn bin x x : bin C ( 8,16,32,bit) hay hng s ia chi thanh ghi. y : vi tri bit trong
I tao bin 1 bit t byte x vi tri bit y, tin dung kim tra hay gan tri cho bit thanh ghi . im khac bit so vi dung bin 1 bit t khai bao int1 la : int1 tn 1 bit b nh , t thanh ghi a muc ich nao o do CCS t chon , con #BIT thi khng tn thm b nh do id chi la danh inh ai din cho bit chi inh bin x , thay i gia tri id ( 0 / 1 ) se thay i gia tri bit tng ng y -> thay i tri x. _VD: #bit TMR1Flag = 0xb.2 //bit c ngt timer1 ia chi 0xb.2 (PIC16F877) Khi o TMR1Flag = 0 I xoa c ngt timer1 Int16 a=35; //a=00000000 00100011 #bit b= a.11 //b=0 , nu b=a.0 thi b chi vi tri LSB ( bit thp nht , bn trai) Sau o : b=1; //a=00001000 00100011 = 2083
_Lu y khng dung c : if ( 0xb.2 ) ma phai khai bao nh trn ri dung : if(TMR1Flag)
_#BYTE id = x
12
X: ia chi
id : tn bin C
Gan tn bin id cho ia chi (thanh ghi ) x , sau o mun gan hay kim tra ia chi x chi cn dung id . Khng tn thm b nh , tn id thng dung tn gi nh chc nng thanh ghi ia chi o . Lu y rng gia tri thanh ghi co th thay i bt ky luc nao do hoat ng chng trinh nn gia tri id cung t thay i theo gia tri thanh ghi o . Khng nn dung id cho thanh ghi a muc ich nh 1 cach dung bin int8 vi CCS co th dung cac thanh ghi nay bt ky luc nao cho chng trinh , nu mun dung ring , hay dung #LOCATE. _VD: #byte port_b = 0xc6; // 16F877 :0xc6 la ia chi portb
Mun port b co gia tri 120 thi : port_b=120; #byte status = 0xc3;
_ # LOCATE id = x _Lam vic nh #byte nhng co thm chc nng bao v khng cho CCS s dung ia chi o vao muc ich khac . VD: # LOCATE temp = 0xc20 // 0xc20 :thanh ghi a muc ich Cach sau tng t : Int8 temp ; #locate temp = 0xc20 _ S dung #LOCATE gan bin cho 1 day ia chi k nhau ( cp thanh ghi ) se tin li hn thay vi phai dung 2 bin vi #byte . VD : CCP1 co gia tri la cp thanh ghi 0x15 ( byte thp ) va 0x16 ( byte cao ) . gan tri cho CCP1 : Int16 CCP1; #locate CCP1= 0x15 // byte thp cua CCP1 0x15 , byte cao cua CCP1 0x16
Gan tri cho CCP1 se t ng gan vao ca 2 thanh ghi CCP1 = 1133 ; // = 00000100 01101101 I 0x15 = 00000100 , 0x16 = 01101101
_# DEFINE id text Text : chui hay s . Dung inh nghia gia tri .
VD : #define a 12345
4 / _ # DEVICE :
13
# DEVICE chip option chip : tn VK s dung , khng dung tham s nay nu a khai bao tn chip # include . option : toan t tiu chun theo tng chip: * = 5 dung pointer 5 bit ( tt ca PIC ) * = 8 dung pointer 8 bit ( PIC14 va PIC18 ) * = 16 dung pointer 16 bit ( PIC14 ,PIC 18) ADC = x s dung ADC x bit ( 8 , 10 , . . . bit tuy chip ) , khi dung ham read_adc( ) , se tra v gia tri x bit . ICD = true : tao ma tng thich debug phn cng Microchip : cho phep dung ngt u tin cao
HIGH_INTS = TRUE
_Khai bao pointer 8 bit , ban s dung c ti a 256 byte RAM cho tt ca bin chng trinh . _Khai bao pointer 16 bit , ban s dung c ht s RAM co cua VDK . _Chi nn dung duy nht 1 khai bao #device cho ca pointer va ADC . VD : #device * = 16 ADC = 10
Start , end: bt u va kt thuc vung ROM danh ring cho ham theo sau , hoc ring khng dung . VD : Org 0x30 , 0x1F Void xu_ly( ) { } // ham nay bt u ia chi 0x30
14
Org 0x30 , 0x1F { } // khng co gi ca t trong vung ROM nay _Thng thi khng dung ORG .
6 / _ # USE : # USE delay ( clock = speed ) Speed : gia tri OSC ma ban dung . VD: dung thach anh dao ng 40Mhz thi : #use delay( clock = 40000000) _Chi khi co chi thi nay thi trong chng trinh ban mi c dung ham delay_us ( ) va delay_ms( ) .
_Dung cai nay thi trong chng trinh khi dung cac lnh io nh output_low() , . . . no se set chi vi 1 lnh , nhanh hn so vi khi khng dung chi thi nay. _Trong ham main( ) ban phai dung ham set_tris_x( ) chi ro chn vao ra thi chi thi trn mi co hiu lc , khng thi chng trinh se chay sai . _Khng cn dung nu khng co yu cu gi c bit . VD : # use fast_io( A )
#USE I2C ( options ) _Thit lp giao tip I2C. Option bao gm cac thng s sau, cach nhau bi du phy : Master master Slave : chip ch slave SCL = pin : chi inh chn SCL SDA = pin : chip ch : chi inh chn SDA
15
ADDRESS =x
FAST : chi inh FAST I2C SLOW : chi inh SLOW I2C RESTART_WDT : restart WDT trong khi ch I2C_READ( ) FORCE_HW nng phn cng I2C ( nu chip h tr ) NOFLOAT_HIGH ln cao. SMBUS _VD : #use I2C ( master , sda=pin_B0 , scl = pin_B1 ) #use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW ) : s dung chuc
: khng cho phep tin hiu float high ( ??? ) , tin hiu c lai t thp : bus dung khng phai bus I2C , nhng la cai gi o tng t .
#USE RS232 ( options ) _Thit lp giao tip RS232 cho chip ( co hiu lc sau khi nap chng trinh cho chip , khng phai giao tip RS232 ang s dung nap chip ) . Option bao gm : BAUD = x : thit lp tc baud rate : 19200 , 38400 , 9600 , . . . PARITY = x : x= N ,E hay O , vi N : khng dung bit chn le . XMIT = pin : set chn transmit ( chuyn data) RCV = pin : set chn receive ( nhn data )
_Cac thng s trn hay dung nht , cac tham s khac se b sung sau. VD : #use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)
7 / _ Mt s chi thi tin x ly khac : #CASE : cho phep phn bit ch hoa / thng trong tn bin , danh cho nhng ai quen lp trinh C .
#OPT n :vi n=0 9 : chi inh cp ti u ma , khng cn dung thi mc inh la 9 ( very ti u ) .
16
#PRIORITY ints : vi ints la danh sach cac ngt theo th t u tin thc hin khi co nhiu ngt xay ra ng thi , ngt ng u se la ngt u tin nht , dung ngt nao a ngt o v . Chi cn dung nu dung hn 1 ngt . Xem cu th phn ngt . VD : #priority int_CCP1 , int_timer1 // ngt CCP1 u tin nht
MT S VN QUAN TRONG KHAC xem chi tit trong phn HELP : _Biu thc : xem HELP->Expressions , trong o : biu thi s trong C: 123 : s decimal a : ky t abcd : chui , ky t null c thm phia sau _Cac toan t C : xem Operators >= , < = , = = , != ( khng bng ) && : and || : or ! : not ( ao cua bit , khng phai ao cua byte ) << n : dich phai n bit 0x3 , 0xB1 : s hex 0b100110 : s binary
CHNG 2 :
17
Ceil( ) :lam tron theo hng tng Floor ( ) :lam tron theo hng giam Exp ( ) : tinh e^x Log ( ) : Log10 ( ) : Pow ( ) : tinh luy tha Sqrt ( ) :cn thc _Cac ham nay chay rt chm trn cac VDK khng co b nhn phn cng ( PIC 14 ,12 ) vi chu yu tinh toan vi s thc va tra v cung s thc ( 32 bit ) va bng phn mm .VD ham sin mt 3.5 ms ( thach anh = 20Mhz ) cho KQ . Do o nu khng oi hoi tc thi dung cac ham nay cho n gian , nh la dung ham sin thi khoi phai lp bang tra. _Xem chi tit trn HELP CCS , cung d oc thi ma. Hn na chung it dung .
II / _ CAC HAM X LY BIT VA CAC PHEP TOAN : _Bao gm cac hamsau : Shift_right() shift_left() Rotate_right() Bit_clear() Make8() rotate_left() bit_test() make32() Swap()
bit_set() make16()
_Dich phai (trai ) 1 bit vao 1 mang hay 1 cu truc . ia chi co th la ia chi mang hay ia chi tro ti cu truc ( kiu nh &data) . Bit 0 byte thp nht la LSB .
18
3 / Bit_clear ( var , bit ) Bit_set ( var , bit ) _Bit_clear ( ) dung xoa ( set = 0 ) bit c chi inh bi vi tri bit trong bin var . _Bit_set ( ) dung set=1 bit c chi inh bi vi tri bit trong bin var . _var : bin 8 , 16 , 32 bit bt ky . _bit : vi tri clear ( set ) : t 0-7 ( bin 8 bit) , 0-15 ( bin 16 bit ) , 0-31 (bin 32 bit ) . _Ham khng tra v tri . VD : Int x; X=11 ; //x=1011 // x= 1001b = 9
Bit_clear ( x ,1 ) ;
4 / Bit_test ( var , bit ) : _Dung kim tra vi tri bit trong bin var . _Ham tra v 0 hay 1 la gia tri bit o trong var . _var : bin 8, 16 ,32 bit . _bit : vi tri bit trong var . _Gia s ban co bin x 32 bit m t 0 ln va mun kim tra xem no co ln hn 4096 khng ( 4096= 2^12 =1000000000000b) : If ( x >= 4096) . . . // phep kim tra nay mt ~5 us Trong 1 vong lp , vic kim tra thng xuyn nh vy se lam mt 1 thi gian ang k . ti u , chi cn dung : if ( bit_test ( x, 12 ) I chi mt ~ 0.4 us . ( 20 Mhz thach anh ) . _Kim tra m ln ti nhng gia tri c bit ( 2^ i) thi dung ham nay rt tin li.
5 / Swap ( var ) : _var : bin 1 byte _Ham nay trao vi tri 4 bit trn vi 4 bit di cua var , tng ng var =( var>>4 ) | ( var << 4 ) _Ham khng tra v tri . VD : X= 5 ; Swap ( x) ; //x=00000101b //x = 01010000b = 80
19
6 / make8 ( var , offset ) : _Ham nay trich 1 byte t bin var . _var : bin 8,16,32 bit . offset la vi tri cua byte cn trich ( 0,1,2,3) . _Ham tra v gia tri byte cn trich . VD : Int16 x = 1453 ; Y = Make(x, 1) ; // x=0x5AD //Y= 5 = 0x05
_Tra v gia tri 16 bit kt hp t 2 bin 8 bit varhigh va varlow . Byte cao la varhigh , thp la varlow .
8 / make32 ( var1 , var2 , var3 , var4 ) : _Tra v gia tri 32 bit kt hp t cac gia tri 8 bit hay 16 bit t var1 ti var4 . Trong o var2 n var4 co th co hoc khng . Gia tri var1 se la MSB , k tip la var2 , . . .Nu tng s bit kt hp it hn 32 bit thi 0 c thm vao MSB cho u 32 bit . VD: Int a=0x01 , b=0x02 , c=0x03 , d=0x04 ; 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 // cac gia tri hex
III / CAC HAM DELAY : _ s dung cac ham delay , cn co khai bao tin x ly u file , VD : s dung OSC 20 Mhz , ban cn khai bao : #use delay ( clock = 20000000 ) _Ham delay khng s dung bt ky timer nao . Chung thc ra la 1 nhom lnh ASM khi thc thi t u ti cui thi xong khoang thi gian ma ban quy inh . Tuy thi gian delay yu cu dai ngn ma CCS sinh ma phu hp . co khi la vai lnh NOP cho thi gian rt nho . Hay 1
20
vong lp NOP . Hoc goi ti 1 ham phc tap trong trng hp delay dai . Cac lnh noi chung la v vn sao cho u thi gian quy inh la c . Nu trong trong thi gian delay lai xay ra ngt thi thi gian thc thi ngt khng tinh vao thi gian delay , xong ngt no quay v chay tip cac dong ma cho ti khi xong ham delay . Do o thi gian delay se khng ung . _Co 3 ham phuc vu : 1 / delay_cycles (count ) Count : hng s t 0 255 , la s chu ky lnh .1 chu ky lnh bng 4 chu ky may . _Ham khng tra v tri . Ham dung delay 1 s chu ky lnh cho trc . VD : delay_cycles ( 25 ); // vi OSC = 20 Mhz , ham nay delay 5 us
2 / delay_us ( time ) Time : la bin s thi = 0 255 , time la 1 hng s thi = 0 -65535 . _Ham khng tra v tri . _Ham nay cho phep delay khoang thi gian dai hn theo n vi us . _Quan sat trong C / asm list ban se thy vi time dai ngn khac nhau , CSS sinh ma khac nhau .
3 / delay_ms (time ) Time = 0-255 nu la bin s hay = 0-65535 nu la hng s . _Ham khng tra v tri . _ Ham nay cho phep delay dai hn na . VD : Int a = 215; Delay_us ( a ) ; // delay 215 us Delay_us ( 4356 ) ; ( 2500 ) ; // delay 2 . 5 s // delay 4356 us Delay_ms
CHNG 3 :
21
I/O
TRONG C
I / _ X LY ADC : _PIC co nhiu chn phuc vu x ly ADC vi nhiu cach thc khac nhau . dung ADC , ban phai co khai bao #DEVICE cho bit dung ADC my bit ( tuy chip h tr , thng la 8 hay 10 bit hoc hn) . Ban cn lu y la: 1 VDK h tr ADC 10 bit thi gia tri vao lun la 10 bit , nhng chia cho 4 thi con 8 bit . Do o 1 bin tr chit ap cp cho ngo vao ADC ma ban chon ch 10 bit thi se rt nhay so vi ch 8 bit ( vi 2 bit cui co thay i cung khng anh hng gia tri 8 bit cao va do o kt qua 8 bit ADC it thay i ) , nu chng trinh co ch kim tra ADC cp nht tinh toan , hay dung ngt ADC , thi no se chay hoai thi . Dung ADC 8 bit se han ch iu nay . Do o ma CCS cung cp chon la ADC 8 hay 10 bit tuy muc ich s dung .
Cu hinh b ADC : _Thng dung nht khi dung ADC la s dung 1 bin tr , iu chinh bi 1 nut vn , qua o thu c 1 in ap nho hn in ap tham chiu ( Vref ap max ) , a vao chn bin i ADC , kt qua cho 1 gia tri s ADC 8 bit ( 0-255 ) hay ADC 10 bit (0-1023 ) . Thng thi ap Vref ly bng Vdd ( 5V ) (??) _Trn cac PIC co ngo AVdd va AVss ( PIC 18 ) , th ng thi ban lun ni AVdd ti Vdd , AVss ti Vss am bao hoat ng cho lp trinh qua ICD 2 . Cac ham sau phuc vu ADC : 1 / Setup_ADC ( mode ) : _Khng tra v tri . Dung xac inh cach thc hoat ng b bin i ADC . Tham s mode tuy thuc file thit bi *.h co tn tng ng tn chip ban ang dung , nm trong th muc DEVICES cua CCS . Mun bit co bao nhiu tham s co th dung cho chip o , ban m file tng ng oc , tim ti ch cac inh nghia cho chc nng ADC dung cho chip o tng ng
22
vi ham nay . Sau y la cac gia tri mode cua 16F877 , ( 1 s khac co th khng co hoc co thm nh 16F877A co thm 1 s th la ADC_CLOCK_DIV_2/4/8/16/32/64 . . .) :
ADC_OFF : tt hoat ng ADC ( tit kim in , danh chn cho hoat ng khac ) . ADC_CLOCK_INTERNAL : thi gian ly mu bng xung clock IC ( mt 2-6 us ) thng la chung cho cac chip . ADC_CLOCK_DIV_2 : thi gian ly mu bng xung clock / 2 ( mt 0.4 us trn thach 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 ) _Xac inh chn ly tin hiu analog va in th chun s dung . Tuy thuc b tri chn trn chip , s chn va chn nao dung cho ADC va s chc nng ADC mi chip ma value co th co nhng gia tri khac nhau. Xem file tng ng trong th muc DEVICES bit s chc nng tng ng chip o . tng thich chng trinh vit cho phin ban cu , 1 s tham s co 2 tn khac nhau ( nhng cung
chc nng do inh nghia cung ia chi ) , y dung phin ban 3.227 .Lu y : Vref : ap chun , Vdd : ap ngun
Sau y la cac gia tri cho value ( chi dung 1 trong cac gia tri ) cua 16F877 : ALL_ANALOGS (Vref=Vdd) : dung tt ca chn sau lam analog : A0 A1 A2 A3 A5 E0 E1 E2
NO_ANALOG : khng dung analog , cac chn o se la 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 thi ging nhau cho tt ca thit bi nhng 16F877 chi co portA co 5 chn nn A0 , A1 , A2 , A5 c dung , A6 , A7 khng co ) AN0_AN1_AN3 : A0 A1 A3 , Vref = Vdd
23
AN0_AN1_VSS_VREF
AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF AN0_AN1_AN2_AN3_AN4_AN5
: A0 A1 A2 A3 A5 E0 : A0 A1 A2 A5 E0 VRefh=A3
AN0_AN1_AN2_AN4_AN5_VSS_VREF
AN0_AN1_AN4_AN5_VREF_VREF : A0 A1 A5 E0 VRefh=A3 VRefl=A2 AN0_AN1_AN4_VREF_VREF AN0_AN1_VREF_VREF AN0 : A0 : A0 VRefh=A3 VRefl=A2 : A0 A1 A5 VRefh=A3 VRefl=A2
: A0 A1 VRefh=A3 VRefl=A2
AN0_VREF_VREF
3 / Set_ADC_channel ( channel ) : _Chon chn oc vao gia tri analog bng lnh Read_ADC ( ) . Gia tri channel tuy s chn chc nng ADC mi chip .Vi 16F877 , channel co gia tri t 0 -7 : 0-chn A0 5-chn E0 1-chn A1 6-chn E1 2-chn A2 7-chn E2 3-chn A3 4-chn A5
_Ham khng tra v tri . Nn delay 10 us sau ham nay ri mi dung ham read_ADC ( ) bao am kt qua ung . Ham chi hoat ng vi A /D phn cng trn chip.
4 / Read_ADC ( mode ) : _Dung oc gia tri ADC t thanh ghi (/ cp thanh ghi ) cha kt qua bin i ADC . Lu y ham nay se hoi vong c cho ti khi c nay bao a hoan thanh bin i ADC ( se mt vai us ) thi xong ham . _Nu gia tri ADC la 8 bit nh khai bao trong chi thi #DEVICE , gia tri tra v cua ham la 8 bit , ngc lai la 16 bit nu khai bao #DEVICE s dung ADC 10 bit tr ln . _Khi dung ham nay , no se ly ADC t chn ban chon trong ham Set_ADC_channel( ) trc o . Nghia la mi ln chi oc 1 knh Mun i sang oc chn nao , dung ham set_ADC_channel( ) ly chn o . Nu khng co i chn , dung read_ADC( ) bao nhiu ln cung c .
24
_mode co th co hoc khng , gm co : ADC_START_AND_READ : gia tri mc inh ADC_START_ONLY : bt u chuyn i va tra v ADC_READ_ONLY : oc kt qua chuyn i ln cui
8 bit
0-2047 0-65472
0-65280
_16F877 chi h tr ADC 8 va 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 y : trn PIC 18 , cu truc ADC tng i phc tap , a nng hn nh la cho phep ly 2 mu cung luc , . . . cung s dung vi cac ham trn , co nhiu thng s trong file *.h , se cp sau . 5 / _ Vi du : _Chng trinh sau ly ADC 8 bit , oc va xut ra day led port B , va xut ra man hinh may tinh . _Kt ni chn trn 16F877 : RA0 la chn ly Analog vao , ap chun la ngun +5V , mass=0 V _Hinh sau trich trong tai liu thy Nguyn Tn Tin vit T6-2002 .
25
Reset Button 5V 1 2
Digital Output
10K
U1 1 2 40 MCLR RB7 39
LED
R 330
+ 470uF-25V
0.1uF
10K
26
0.1uF
3 4
RA0 RA1
RB6 RB5
38 37
Analog Input
5 6 7 8 9 10 11 12 13
36 35 34 33 32 31 30 29
27
RD6
28
14 15
27 26
J1
Osillator
16 17 18
25 24 23
4 3 2
20MHz
19
RC3
RC4
22
20
RD0
RD3
21
to RS232
SCO-060
RD1
RD2
PIC16F877
28
#include <16F877.h > #use delay( clock=20000000 ) #device *= 16 ADC = 8 // s dung ADC 8 bit , gia tri ADC vao 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 ); While (true ) { adc = read_adc ( ) ; // delay 10 us
Output_B ( adc ) ; // xuat ra port B gia tri bien adc Printf( gia tri adc la : %u , adc ) ; } } // gia tri bin adc t 0-255 , dung chng trinh Serial port Monitor trong muc Tools cua CCS giam sat gia tri . Nh thit lp tc la 19200 nh khai bao trn . // in ra man hinh
II / _ CAC HAM VAO RA TRONG C : _Bao gm cac ham sau : Output_low() Output_high() Output_float() Ouput_X() Input_X() port_b_pullups() Set_tris_X() Output_bit() Input()
29
1 / Output_low ( pin ) , Output_high (pin ) : _Dung thit lp mc 0 ( low, 0V ) hay m c 1 ( high , 5V ) cho chn IC , pin chi vi tri chn . _Ham nay se t pin lam ngo ra , xem ma asm bit cu th . _Ham nay dai 2-4 chu ky may . Cung co th xut xung dung set_tris_X() va #use fast_io. VD : chng trinh sau xut xung vung chu ky 500ms , duty =50% ra chn B0 ,ni B0 vi 1 led se lam nhp nhay led . #include <16F877.h> #use delay( clock=20000000) Main() { { while(1) output_high(pin_B0) ; // delay 250ms
Delay_ms(250) ;
_Ham nay cung xut gia tri 0 / 1 trn pin , tng t 2 ham trn . Thng dung no khi gia tri ra tuy thuc gia tri bin 1 bit nao o , hay mun xut ao cua gia tri ngo ra trc o . VD : Khai bao int1 x; // x mc inh = 0
30
} } Chng trinh trn cung xut xung vung chu ky 500ms ,duty =50%
3 / Output_float ( pin ) : _Ham nay set pin nh ngo vao , cho phep pin mc cao nh 1 cc thu h (This will allow the pin to float high to represent a high on an open collector type of connection , dich nh vy khng bit ung khng na ? , chc la thit lp nh ngo vao tng tr cao thi phai ) .
4 / Input ( pin ) : _Ham nay tra v gia tri 0 hay 1 la trang thai cua chn IC . Gia tri la 1 bit
5 / Output_X ( value ) : _X la tn port co trn chip . Value la gia tri 1 byte . _Ham nay xut gia tri 1 byte ra port . Tt ca chn cua port o u la ngo ra . VD : Output_B ( 212 ) ; // xut gia tri 11010100 ra port B
6 / Input_X ( ) : _X : la tn port ( a, b ,c ,d e ) . _Ham nay tra v gia tri 8 bit la gia tri ang hin hu cua port o .VD : m=input_E();
7 / Port_B_pullups ( value ) : _Ham nay thit lp ngo vao port B pullup ( in tr keo ln ?) . Value =1 se kich hoat tinh nng nay va value =0 se ngng . _Chi cac chip co port B co tinh nng nay mi dung ham nay .
31
8 / Set_tris_X ( value ) : _Ham nay inh nghia chn IO cho 1 port la ngo vao hay ngo ra. Chi c dung vi #use fast_IO . S dung #byte tao bin chi n port va thao tac trn bin nay chinh la thao tac trn port . _Value la gia tri 8 bit . Mi bit ai din 1 chn va bit=0 se set chn o la ngo vao , bit= 1 set chn o la ngo ra . VD : chng trinh sau cho phep thao tac trn portB 1 cach d dang: #include < 16F877.h > #use delay(clock=20000000) #use Fast_IO( B ) #byte portB = 0x6 // 16F877 co port b ia chi 6h #bit B0 = portB. 0 // bin B0 chi n chn B0 #bit B1=portB.1 // bin B1 chi n chn B1
#bit B2=portB.2 #bit B3=portB.3 #bit B4=portB.4 #bit B5=portB.5 #bit B6=portB.6 #bit B7=portB.7
// bin B2 chi n chn B2 // bin B3 chi n chn B3 // bin B4 chi n chn B4 // bin B5 chi n chn B5 // bin B6 chi n chn B6 // bin B7 chi n chn B7
// B0 la ngo vao , thng lam ngt ngoai //B1 . . . B6 la ngo ra , Vd lam 6 ngo ra iu ch PWM //B7 la ngo vao , Vd la nhn tin hiu cho phep chng han if ( B7 ) B7 la 1 thi xut 3 cp xung i nghich { B1 = 1 ; //nu ngo vao chn
B2 = 0 ; B3 = 1 ; B4 = 0 ; B5 = 1 ; B6 = 0 ; }
32
Else B1=B2=B3=B4=B5=B6= 0; }
_Lu y : _Set_tris_B (0 ) : port B =00000000 : tt ca chn portB la ngo ra _set_tris_B ( 1 ) : portB = 00000001 : chi B0 la ngo vao , con lai la ngo ra _set_tris_B ( 255 ) : portB=11111111: tt ca chn portB la ngo vao Y ti cung tng nhm ln khi nghi set_tris_B(1) la set tt ca la ngo vao , rt tai hai . Ban nn dung gia tri dang nhi phn cho d . VD : set_tris_B ( 00110001b ) ;
_n y la ban co th vit nhiu chng trinh thu vi ri o. Vd nh la dung ADC iu chinh tc nhp nhay cua day en led , truyn gia tri 8 bit t chip nay sang chip khac , . . . _Chng trinh VD sau dung ADC qua chn A0 iu chinh tc nhp nhay day en led ni vao port B , co th dung fast_io hay ham output_B () xut gia tri u c . chng trinh dung ham . Nu ngo vao chn C0 =0 thi tip tuc nhn ADC va xut ra portB, C0=1 thi khng xut #include <16F877.h> #device *=16 ADC= 8 #use delay( clock =20000000) Int8 ADC_delay ;
Output_B ( 0) ;
Main()
33
{ setup_adc_ports(AN0_AN1_AN3); dung A0 ly tin hiu setup_adc(adc_clock_internal); set_adc_channel ( 0 ); { hieu_chinh ( ) ; // chon oc ADC t chn A0 while(1) // A0 , A1 va A3 la chn analog , ta chi cn
Break ; } } }
//while // main
34
_Chng nay se giup ban vit chng trinh co s dung giao tip PC . iu nay rt cn thit khi ban mun VK khi hoat ng co th truyn d liu cho PC x ly , hoc nhn gia tri t PC x ly va iu khin ( dung PC iu khin ng c , nhit , hay bin PC thanh dung cu o cac ai lng in , Oscilocope , . . .) . _Vit chng trinh lp trinh cho VK giao tip may tinh la cng vic rt phc tap khi vit bng ASM , rt kho hiu i vi nhng ngi mi bt u lp trinh . c bit la khi vit cho nhng con VK khng h tr t phn cng ( 8951 thi phai (?) ) . Tht may la phn ln PIC hin nay u h tr phn nay nn vic lp trinh co d dang hn . Nhng nu chng trinh cua ban yu cu truyn hay nhn nhiu loai d liu ( s 8 , 16 ,32 bit , dng , m , chui , . . .) thi vic vit chng trinh x ly va phn loai chung la iu kinh di .
_Nhng nu lp trinh ASM cho vn nay ri thi ban se thy sao d dang qua vy khi giai quyt vn nay vi C khi dung CCS . Rt n gian ! CCS cung cp rt nhiu ham phuc vu cho giao tip qua RS232 ( cng COM ) va v s ham x ly chui . Chng nay se giai quyt iu o . _Mt yu t quan trong la khi nao thi VK bit PC truyn data I co th lp trinh bt tay bng phn mm hay n gian la dung ngt . Cac vi du v ngt , xem phn ngt .
I / _TRUYN THNG VI PC QUA CNG COM : _ s dung giao thc nay , phai co 2 khai bao nh VD sau : #use delay (clock = 40000000 ) // VDK ang dung OSC 40Mhz
#use rs232 (baud=19200 , parity=n , xmit=pin_C6 , rcv=pin_C7 ) // baud= 19200 , khng chn le , chn truyn C6 , chn nhn C7
35
_Cac ham lin quan : Printf ( ) Getc ( ) putc ( ) Getch ( ) () fputs ( ) Fgets ( ) Kbhit ( ) Assert ( ) Imi trn CCS 3.222 Perror ( ) I mi trn CCS 3.222 Set_uart_speed ( ) Setup_uart ( ) putchar ( ) Getchar ( ) fputc ( ) Fgetc ( ) puts ( ) Gets
_Tt ca cac ham trn oi hoi phai khai bao chi thi tin x ly #use RS232 ( . . . . .) . _Ham perror ( ) oi hoi thm #include<errno.h > . Ham assert() oi hoi thm #include<assert.h> .
1 / printf ( string ) Printf ( cstring , values . . . ) _Dung xut chui theo chun RS232 ra PC . _string la 1 chui hng hay 1 mang ky t ( kt thuc bi ky t null ) . _value la danh sach cac bin , cach nhau bi du phy . _Ban phai khai bao dang format cua value theo kiu %wt .Trong o w co th co hoc khng , co gia tri t 1-9 chi ro co bao nhiu ky t c xut ra ( mc inh khng co thi co bao nhiu ra by nhiu ), hoc 01-09 se chen thm 0 cho u ky t hoc 1.1-1.9 cho trng hp s thc . con t la kiu gia tri . _ t co th la : C : 1 ky t S : chui hoc ky t U : s 8 bit khng du x : s 8 bit kiu hex ( ky t vit thng ,VD : 1ef ) X : s 8 bit kiu hex ( ky t vit hoa ,VD : 1EF ) D : s 8 bit co du e : s thc co luy tha VD : e12 f : s thc
Lx : s hex 16 /32 bit ( ky t vit thng ) LX : hex 16 /32 bit ( ky t vit hoa )
36
Lu : s thp phn khng du Ld : s thp phn co du % : ky hiu % VD : Specifier %03u 018 %u %2u %5 %d %x %X 18 18 18 18 12 12 Value=0x12 Value=0xfe 254 254 * 254 -2 Fe FE
2 / KBHIT ( ) : _Thng thi chung ta dung RC6 va RC7 cho RX va TX trong giao tip cng COM , VDK PIC trang bi phn cng phuc vu vic nay vi thanh ghi gi va nhn va cac bit bao hiu tng ng . Do o khi dung RS232 h tr t phn cng thi KHBIT ( ) tra v TRUE nu 1 ky t a c nhn ( trong b m phn cng ) va sn sang cho vic oc , va tra v 0 nu cha sn sang . _Ham nay co th dung hoi vong xem khi nao co data nhn t RS232 oc .
37
CHNG 6 :
I / GIAO TIP SPI : _y la giao tip d dung nht , n gian nht , tc cao nht trong nhom . hoat ng theo c ch hand-shaking , bt tay . Gia s co 2 VDK , thi 1 la master , 1 la slave . Khi master truyn 1 byte cho slave , no phat 8 xung clock qua ng clock ni ti slave , ng thi truyn 8 bit data t chn SDO
ti chn SDI cua slave . Khng kim tra chn le , li . Do o Vdu nu ang truyn c 3 bit ma master reset hay h dy clock thi data bi mt , slave se khng nhn u 8 bit va do o nu tip tuc nhn no se ly 5 bit byte k tip a vao thanh ghi nhn u 8 bit ( va kich ngt ) . T o tr i la moi gia tri nhn la sai bet tr phi chm dt va sau o thit lp lai giao tip nay ( ca hai ) .
38
_Giao tip nay cn it nht 2 dy tr ln . Nu 1 VDK chi cn gi data thi chi cn dy clock va SDO .VDK nhn se dung SDI va dy clock . Dy clock la ni chung . _Nu co gi va nhn ca 2 VDK thi : dy clock chung , master co SDO ni ti SDI cua slave , SDO cua slave ni ti SDI cua master . _Nu master cn truyn data cho nhiu slave tr ln thi SDO master ni ti cac SDI cua slave . _Chn SS la slave select . _SPI hoat ng t phn cng , vi no co sn thanh ghi gi va nhn , nhn u gia tri thi co c ngt phuc vu . _Danh sach cac ham : 1 / Setup_spi (mode ) Setup_spi2 (mode ) _Dung thit lp giao tip SPI . Ham th 2 dung vi VDK co 2 b SPI . _Tham s mode :la cac hng s sau , co th OR gia cac nhombi du | I SPI_MASTER , SPI_SLAVE , SPI_SS_DISABLED I SPI_L_TO_H , SPI_H_TO_L ISPI_CLK_DIV_4 , SPI_CLK_DIV_16 , SPI_CLK_DIV_64 , SPI_CLK_T2 _Nhom 1 xac inh VDK la master hay slave ,slave select _Nhom 2 xac inh clock canh ln hay xung . _Nhom 3 xac inh tn s xung clock , SPI_CLK_DIV_4 ngia la tn s = FOSC / 4 , tng ng 1 chu ky lnh / xung . _Ham khng tra v tri . _Ngoai ra ,tuy VDK ma co thm 1 s tham s khac , xem file * .h .
2 / Spi_read ( data ) Spi_read2 ( data ) _data co th co thm va la s 8 bit . Ham th 2 cho b SPI th 2 . _Ham tra v gia tri 8 bit value = spi_read ( ) _Ham tra v gia tri oc bi SPI . Nu value phu hp SPI_read ( ) thi data se c phat xung ngoai va data nhn c se c tra v . Nu khng co data sn sang , spi_read ( ) se i data . _Ham chi dung cho SPI hardware ( SPI phn cng ) .
39
3 / spi_write ( value ) Spi_write2 ( value ) _Ham khng tra v tri . value la gia tri 8 bit . _Ham nay gi value ( 1 byte ) ti SPI , ng thi tao 8 xung clock . _ Ham chi dung cho SPI hardware ( SPI phn cng ) .
4 / spi_data_is_in ( ) Spi_data_is_in2 ( ) _Ham tra v TRUE ( 1 ) nu data nhn c y u ( 8 bit ) t SPI , tra v false nu cha nhn u . _Ham nay dung kim tra xem gia tri nhn v SPI a u 1 byte cha dung ham spi_read ( ) oc data vao bin .
CHNG 7 :
MODULE
I / _TNG QUAT PHN CNG : _Module nay co mt hu ht cac dong PIC 16 va PIC 18 , va thng chi co 2 chn cho module nay , ky hiu la CCP1 / CCP2 . Cn phn bit vi module PWM chuyn dung trn PIC 18 va dsPIC vn co 6 ti 8 chn PWMx , cung phuc vu cho iu ch rng xung nhng chuyn dung cho iu khin ng c AC . Mt s PIC 14 va PIC 18 co module ECCP cung dung module CCP nay nhng lai chuyn dung cho iu khin b bin i ap DC->DC , dung cho iu khin ng c DC . y cha cp n ECCP . Chi cp CCP , va thng chi co 2 chn la CCP1 va CCP2 . _Module co 3 chc nng va khi hoat ng ta chi dung c 1 chc nng ng vi 1 chn . Ngoai ra nu khng dung thi co th set no thanh chn I /O .
40
_Mi module cha 1 thanh ghi 16 bit , la kt hp cua 2 thanh ghi 8 bit : CCPR1L(byte thp ) va CCPR1H ( byte cao ) cua CCP1 , CCPR2L va CCPR2H cua CCP2 . _Mi chc nng cua CCPx u oi hoi 1 b m hoat ng : Capture / Compare oi hoi Timer1 , con PWM oi hoi Timer2 .
Bang trn ( trong datasheet PIC16F877 ) cho thy : nu ca 2 module dung cung chc nng Capture thi se dung chung b m timer1 , nghia la moi hoat ng va iu chinh Timer1 u anh hng ti ca 2 module . Tng t nu dung cung chc nng PWM se dung chung Timer2 . Con nu 1 module la Capture , module kia la Compare thi phai lu y la chc nng compare co th clear Timer1 , va do o cung anh hng chc nng con lai . Con 2 TH cui thi khng co vn gi . _ ch Capture : mi khi co canh ln cua xung vao chn CCPx thi gia tri Timer1 (16 bit ) se c copy vao thanh ghi CCP ( 16 bit ) . _ ch Compare : khi gia tri nap CCP bng gia tri m Timer1 thi cac s kin c chi inh trc xay ra :chn CCPx c lai ra mc thp / cao / khng co gi nhng co ngt hay bin i AD . _Ch PWM ( pulse width modulation iu ch rng xung ) : xut xung vung bng phn cng . _Ban s dung ham setup_ccpX() xac inh chc nng mun dung trn module CCP . tham s cu th co th tra trong HELP , hoc xem tng TH cu th di y .
II / _CH CAPTURE :
41
_Dung xac inh tc quay cua motor . Gia s ta co 1 thit bi o tc quay ( cam bin Hall ) ma mi khi motor quay 1 vong thi thit bi phat 1 xung vung ( canh ln ri canh xung hay xung mc 1 , hay canh xung ri canh ln tc la xung mc 0 ) . y ta gia thit xung mc 1 . Xung nay dn vao module capture ( co th qua cach ly an toan ) va gia thit ta chon ch bt canh ln . Nghia la c mi 1 canh ln cua xung vao , gia tri cua timer1 copy vao CCP . Vi motor khng phai quay u nn ta thng chon s ln capture la vai chuc ln . ( hinh nh la vy ??? )
_Vic Capture thng i kem 1 cai ham ngt . Cach thc chng trinh hoat ng nh sau : xung vao Capture se kich ngt , trong ham ngt ,ta ly gia tri CCPx tinh ra c thi gian cho 1 vong quay ,cng dn no vao 1 bin tinh thi gian tng , set Timer1 v 0 , tng gia tri bin m vong ln 1 , ri thoat ngt . Vi 1 ng c ang chay khoang 1200vong / phut , tuy thuc vao tn sut cp nht gia tri s vong quay ( hin thi ra LED 7 oan hay LCD ) ban cn o 1 s lng vong nht inh am bao chinh xac , VD o 1500 vong , tc la bin m phai m ti 1500 , tinh tng thi gian o , VD la 80 s , thi tc ng c = ( 1500 / 80 ) * 60 = 1125 vong / phut . _Hay qun module nay i nu ban dung 1 encoder o tc , vn phat ra ti 500-2000 xung / vong .Nghia la cn chng o ln ngt chi o 1 vong I VDK se phai dung toan b thi gian hoat ng m , co khi khng kip . Vic chng trinh chinh khng th chay vi ngt c xay ra lin tuc goi la tran , no se chng lam c gi ca . giai quyt , ngi ta dung module QEI hay IC3 vn chi co trn PIC 18 nh 18F4431 . _Capture con dung o rng xung . S dung CCP1 ly canh ln , CCP2 ly canh xung cua cung 1 xung ,tc la 2 CCP ni nhau . 1 xung vung i vao kich CCP1 trc ( canh ln ), thu c gia tri timer luc , canh xung cua xung kich CCP2 thu c gia tri timer luc xung canh . Ly 2 gia tri tr nhau c rng xung . chi cn 1 ngt CCP2 la u .
III / _CH COMPARE : _Hoat ng : khi timer1 m ln ti khi bng gia tri ma ta tr trong CCPx, thi chn CCPx se xut ra mc cao / thp / hay khng co nhng co ngt . _ng dung : khng ro . Ban nao bit b sung .
42
IV / _CH PWM : _Xut chui xung vung , rng hiu chinh c d dang . Thng dung iu chinh in ap DC . Xung ra se ong ct 1 linh kin nh la SCR, vi rng xung xac inh se tao ra 1 in ap trung binh xac inh . Thay i rng xung se thay i in ap nay , do o co th dung iu khin ng c DC nho ( ? ? ?) .
V / _DANH SACH HAM: _ CCS lun tao sn cac tn danh inh C nh la cac bin tro ti CCP1 va CCP2 la : CCP_1 ( 16 bit ) , CCP_2 (16 bit ) , CCP_1_HIGH ( byte cao cua CCP1 ) , CCP_1_LOW , CCP_2_HIGH ,
CCP_2_LOW , ban khng cn khai bao . Dung lun cac tn o ly tri khi dung module Cap , hay gan tri khi dung Compare . Ban co th thy iu nay khi m muc RAM symbol map quan sat phn b b nh . 1 / _ Setup_CCPx ( mode ) : _Dung trc tin thit lp ch hoat ng hay v hiu tinh nng CCP . X= 1,2, . . .tn chn CCP co trn chip . Mode la 1 trong cac hng s sau : ( cac hng s khac co th co thm trong file *. h va tuy VDK) CCP_OFF : tt chc nng CCP , RC se la chn I /O . CCP_CAPTURE_RE : capture khi co canh ln CCP_CAPTURE_FE : capture khi co canh xung CCP_CAPTURE_DIV_4 : chi capture sau khi m u 4 canh ln ( 4 xung ). CCP_CAPTURE_DIV_16 : chi capture sau khi m u 16 canh ln ( 16 xung ).
I s dung lam dan thi gian VDK danh cho cng vic khac thay vi c update tng xung . Ch compare : CCP_COMPARE_SET_ON_MATCH : xut xung mc cao khi TMR1=CCPx CCP_COMPARE_CLR_ON_MATCH : xut xung mc thp khi TMR1=CCPx CCP_COMPARE_INT : ngt khi TMR1=CCPx CCP_COMPARE_RESET_TIMER TMR1 =0 khi TMR1=CCPx Ch PWM : CCP_PWM : bt ch PWM CCP_PWM_PLUS_1 : khng ro chc nng CCP_PWM_PLUS_3 : khng ro chc nng CCP_PWM_PLUS_2 : khng ro chc nng
: reset
43
2 / _ Set_CCPx_duty ( value ) : Value : bin hay hng , gia tri 8 hay 16 bit . x= 0 ,1 ,2 . . . :tn chn CCPx _Dung set duty cua xung trong ch PWM . No ghi 10 bit gia tri vao thanh ghi CCPx . Nu value chi la 8 bit, no dich thm 2 u 10 bit nap vao CCPx . _Tuy phn giai ma gia tri cua value khng phai luc nao cung at ti 1023 . Do o , value = 512 khng co nghia la duty = 50 % .
CHNG 8 :
I / C CH HOAT NG CUA NGT : 1 / _ Ngt 1 cp : _Trn PIC 14 , 12 ,10 ,tt ca cac ngt chi co 1 cp u tin . Nghia la ngt nao ang c phuc vu thi khng th bi ngt bi 1 ngt khac xay ra . C ch sinh ma cho ngt cua CCS nh sau : nhay n ia chi ngt , thng la 004h , sao lu thanh ghi W, STATUS , PCLATCH , FSR, va nhiu th v vn khac, sau o no mi hoi vong xem c ngt nao xay ra thi nhay n ham phuc vu ngt o . thc hin xong thi phuc hi tt ca thanh ghi trn , ri mi RETFIE thoat ngt . S chu ky thc thi t ch ngt n khi nhay vao ham ngt c 20 chu ky lnh !, nhay ra cung c o . _iu gi xay ra nu chng trinh dung nhiu ngt va khi co ngt thi co 2 ngt tr ln xay ra ng thi ? Nghia la : 2 ngt xay ra cung luc , hay khi ngt A kich hoat va CCS ang lu cac thanh ghi ( cha ti hoi vong c ngt ) thi ngt B xay ra , di nhin ngt B khng th kich vector ngt nhay ti 004h vi bit cho phep ngt toan cuc ( GIE ) bi khoa t ng khi co ngt , chi co c ngt B bt ma thi. Sau khi lu cac thanh ghi , chng trinh kim tra c ngt , ro rang la nu bit nao c kim tra trc thi phuc vu trc , du no xay ra sau . tranh phuc vu khng ung ch , ban dung #priority xac inh u tin ngt ( xem phn chi thi tin x ly ) . Ngt u tin nht se lun c hoi vong trc .Sau khi xac inh c ngt cn phuc vu , no se thc thi ham ngt tng ng .Xong thi xoa c ngt o va thoat ngt . Phuc vu ngt nao xong thi chi xoa c ngt o .Nu A u tin hn B thi sau khi lam A , chng trinh xoa c ngt A ,
44
nhng c B khng xoa ( vi u co phuc vu ) , nn khi thoat ra ngt A , no se lai ngt tip ( vi c B a bt ), lai hoi vong c ngt t u : nu c A cha bt thi xet B, luc nay B bt nn phuc vu B , xong thi xoa c B va thoat ngt . _Mt chng trinh dung nhiu ngt phai lu y iu nay , tranh trng hp : ngt xay ra lin tuc (tran ngt ) , 1 ngt bi ap ng tr , ngt khng ung , . . .
2 / _ Ngt 2 cp : _Chi co trn PIC 18 ( va dsPIC ) . Co 2 khai nim : ngt u tin thp (low priority) va ngt u tin cao ( high priority ) . 2 vector thc thi ngt tng ng thng la 0008h (high) va 0018h ( low ) . Mt ngt thp ang c phuc vu se bi ngng va phuc vu ngt cao 0008h nu ngt cao xay ra . Ngc lai , ngt cao ang xay ra thi khng bao gi bi ngt bi ngt thp . _Nu vit ham ngt binh thng , khng oi hoi u tin gi thi CCS sinh ma tt ca ham ngt u la ngt u tin cao . Quy trinh thc hin ngt se nh ngt 1 cp trn . #priority vn c dung . S chu ky thc thi t 0008h n khi nhay vao thc thi ham ngt khoang 30 chu ky , xong ham ngt ti khi kt thuc ngt cung mt khoang 30 chu ky lnh . _ s dung ngt 2 cp , khai bao #device phai co high_ints=true . Va ham ngt nao mun u tin cao thi thm FAST theo sau chi thi tin x ly ham o . Lu y : chi co duy nht 1 ngt c u tin cao , y co le la han ch cua CCS , do cach thc sinh ma . VD : {... } #int_timer1 FAST Void xu_ly ( )
_C ch sinh ma nh sau : co ngt thp thi nhay ti 0018h , sao lu W, STATUS , FSR0/1/2 ,. . . ri mi hoi vong c ngt thp . chay xong ham ngt thi phuc hi tt ca va RETFIE 0 . Ring ngt
cao khng sinh ma sao lu gi ca ma nhay thng vao ham ngt chay lun . Vy thi trt lt ri ? Ma chay sai chng ? _Thc ra khng phai vy . PIC 18 va dsPIC co c ch lu siu tc la FAST STACK REGISTER ( xem datasheet ky nhe ) . Khi xay ra ngt bt ky , W, S , BSR t ng lu vao thanh ghi trn , PC counter lu vao stack . xong ngt thi pop ra . Vn ch : khi ngt thp xay ra , FAST STACK REGISTER t ng lu W ,S , BSR , PC -> stack . Trong khi thc hin ham phuc vu ngt thi trng hp W, S , BSR thay i la co th ( vi vy mi sao lu ch ) . nhng nu xay ra ngt cao vao thi im o ? FAST STACK REGISTER se bi ghi e I mt data . Do o , c ch sinh ma cua CCS cn phai lun ung , nghia la : lun t sao lu ring W ,S , BSR, va cac thanh ghi FSR na , khi thc thi ngt thp . Con ngt cao khi chay xong se RETFIE 1 t
45
ng phuc hi W, S , BSR t FAST STACK REGISTER . Co 2 trng hp : 1 la chi co ngt cao , thi khng co vn gi . 2 la ngt cao ngt 1 ngt thp ang chay . Phn tich se thy rng cho du bi ngt trong khi ang sao lu ,hay cha kip sao lu , hay a sao lu vao cac bin ring ri , cui cung chng trinh cung quay ra ung ia chi ban u vi cac thanh ghi W, S , BSR nh cu . _Tun thu nguyn tc ngt cao thc thi tc thi nn CCS chi cho 1 ngt cao duy nht bt ky hoat ng , nn khng sinh ma hoi vong , sao lu thm gi ca . nu ban mun co nhiu ngt u tin cao , thi phai t vit ma ring thi ( khi co ngt cao thi hoi vong cac c ngt , dung lnh ORG chim oan ma t 0008h tr i vit ma x ly ring , trong chng trinh khng c vit bt ky ham ngt nao k ca ngt thp ma chi vit ham binh thng , . . . noi chung la t x ly ht moi vn ngt , phc tap lm y ) .
II / KHAI BAO NGT : _Mi dong VDK co s lng ngt khac nhau : PIC 14 co 14 ngt , PIC 18 co 35 ngt . _Mun bit CCS h tr nhng ngt nao cho VDK cua ban , m file *.h tng ng , cui file la danh sach cac ngt ma CCS h tr no . Cach khac la vao CCS -> View -> Valid interrupts , chon VDK mun xem , no se hin thi danh sach ngt co th co cho VDK o . _Sau y la danh sach 1 s ngt vi chc nng tng ng : #INT_GLOBAL : ngt chung , nghia la khi co ngt xay ra , ham theo sau chi thi nay c thc thi , ban se khng c khai bao thm chi thi ngt nao khac khi s dung chi thi nay . CCS khng sinh bt ky ma lu nao , ham ngt bt u ngay tai vector ngt . Nu bt nhiu c cho phep ngt , co th ban se phai hoi vong xac inh ngt nao . Dung chi thi nay tng ng vit ham ngt 1 cach thu cng ma thi , nh la vit ham ngt vi ASM vy . #INT_AD : chuyn i A /D a hoan tt , thng thi khng nn dung
#INT_ADOF : I dont know #INT_BUSCOL #INT_BUTTON : xung t bus : nut nhn ( khng bit hoat ng th nao )
#INT_CCP1 : co Capture hay compare trn CCP1 #INT_CCP2 : co Capture hay compare trn CCP2 #INT_COMP : kim tra bng nhau trn Comparator #INT_EEPROM #INT_EXT #INT_EXT1 #INT_EXT2 #INT_I2C : hoan thanh ghi EEPROM
46
#INT_LCD
#INT_LOWVOLT #INT_PSP
: bt ky thay i nao trn chn B4 n B7 : bt ky thay i nao trn chn C4 n C7 : data nhn t RS 232 sn sang
#INT_RTCC : tran Timer 0 #INT_SSP #INT_TBE : co hoat ng SPI hay I 2C : b m chuyn RS 232 trng : mt tn khac cua #INT_RTCC : tran Timer 1 : tran Timer 2 : tran Timer 3 : tran Timer 5
#INT_IC3DR : ngt i hng ( direct ) cua IC 3 #INT_IC2QEI #INT_IC1 : ngt cua QEI : ngt IC 1
_Ham i kem phuc vu ngt khng cn tham s vi khng co tac dung . _S dung NOCLEAR sau #int_xxx CCS khng xoa c ngt cua ham o . _ cho phep ngt o hoat ng phai dung lnh enable_interrupts ( int_xxxx) va enable_interrupts ( global ) . _Khoa FAST theo sau #int_xxxx cho ngt o la u tin cao , chi c 1 ngt thi , chi co PIC 18 va dsPIC . VD : #int_timer0 FAST NOCLEAR
47
III / CAC HAM THIT LP HOAT NG NGT : 1 / enable_interrupts ( level ) _level la tn cac ngt a cho trn hay la GLOBAL cho phep ngt cp toan cuc . _Moi ngt cua VDK u co 1 bit c ngt , 1 bit cho phep ngt . Khi co ngt thi bit c ngt bi set =1, nhng ngt co hoat ng c hay khng tuy thuc bit cho phep ngt . enable_interrupts (int_xxx ) se bt bit cho phep ngt . Nhng tt ca cac ngt u khng th thc thi nu bit cho phep ngt toan cuc = 0 , enable_interrupts( global ) se bt bit nay . VD : cho phep ngt timer0 va timer1 hoat ng: enable_interrupts (int_timer0); enable_interrupts (int_timer1 ) ; enable_interrupts ( global ); // chi cn dung 1 ln tr phi mun co thay i c bit
2 / disable_interrupts ( level ) _level ging nh trn . _Ham nay v hiu 1 ngt bng cach set bit cho phep ngt = 0 . _disable_interrupts ( global ) set bit cho phep ngt toan cuc =0 , cm tt ca cac ngt . _Khng dung ham nay trong ham phuc vu ngt vi khng co tac dung , c ngt lun bi xoa t ng .
3 / clear_interupt ( level ) _level khng co GLOBAL . _Ham nay xoa c ngt cua ngt c chi inh bi level .
4 / ext_int_edge ( source , edge ) _Ham nay thit lp ngun ngt ngoai EXTx la canh ln hay canh xung . _source : ngun ngt . Trn PIC 18 co 3 ngun ngt trn 3 chn EXT0 , EXT1 , EXT2 ng vi source = 0 ,1 , 2 . Cac PIC khac chi co 1 ngun EXT nn source = 0 . _edge : chon canh kich ngt , edge = L_TO_H nu chon canh ln ( t mc thp chuyn ln mc cao ) hay H_TO_L nu chon canh xung .
48
1 / _ #INT_RB : _Sau y la 1 chng trinh in hinh v s dung ngt khi co s thay i trn chn B4-B7 . _M ta : mi khi nhn nut bt ky trn B4-B7 , se kich ngt RB , ham phuc vu ngt co tn RB_LED c thc thi , ham nay n gian la xut ra LED vi tri tng ng nhng trn portD t D4 D7 . _VDK la 16F877 . 5V
10K
U1 1 2 40 MCLR RB7 39
Buttons 1 1 2 2
Reset Button
49
3 4 5 6 7 8
38 37 36 35 34 33
1 1
2 2
9 10 11 12 13
32 31 30 29 28
LED
R 330
14
OSC1 RD5
27
J1
50
15
OSC2 RD4
26
Osillator
16 17 18
25 24 23
4 3 2
20MHz
19
RC3
RC4
22
20
RD0
RD3
21
to RS232
SCO-060
RD1
RD2
PIC16F877
51
#include < 16F877.h > #device PIC16F877 *=16 #use delay (clock = 20000000 ) delay,OSC=20 Mhz #byte portb = 0x06 #byte portd = 0x08 //thm khai bao nay nu ctrinh co dung ham
//tao tn danh inh portb thay th ia chi portB la 06h //tao tn danh inh portd thay th ia chi portD la 08h
void main ( ) { set_tris_b ( 0xF0 ) ; // portB = 11110000 , B4-B7 la ngo vao , B0-B3 la ngo ra set_tris_d ( 0x00 ) ; // portD = 00000000 , D0-D7 u la ngo ra enable_interrupts ( INT_RB ) ; // cho phep ngt RB enable_interrupts ( GLOBAL ) ; // cho phep ngt toan cuc // do chng trinh khng lam gi khac ngoai vic ch ngt nn vong while nay trng khng
52