You are on page 1of 52

I / _ GII THIU: _y la tai liu hng dn s dung CCS lp trinh ngn ng C cho vi iu khin PIC cua Microchip .

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 :

HNG DN S DUNG CCS VIT CHNG TRINH C TRONG CCS

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 :

#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 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 ;

Int32 : 0 , 2^32-1 signed int32 : -2^31 , 2^31-1

_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 :

A ) _Mt vai vi du v tran s , lam tron :

Int8 a=275; // a =275-256=19 Int8 const a=275 //a=19

Int8 a=40 , b=7 , c; C=a * b ; C=a / b ; //c=280-256=24 //c=5

_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 (expr1;expr2;expr3) stmt; printf(%u\r\n,i); switch (expr) {

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;

label: stmt; loop: I++; break;break; continue; expr; i=1; continue;

{[stmt]}

Zero or more b=1;}

{a=1;

Lu y : cac muc trong [ ] la co th co hoc khng .

_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_ {

2 / _ #INCLUDE : _Cu phap : #include <filename>

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>

// chng trinh s dung cho VK 16F877

#include < C:\INCLUDES\COMLIB\MYRS232.C >

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

5 / _ # ORG : # org start , end # org segment #org start , end { }

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

org 0x1E00 anotherfunc( )

14

{ } //ham nay bt u tuy y 0x1E00 n 0x1F00

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( ) .

#USE fast_io ( port) Port : la tn port :t A-G ( tuy chip )

_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

: chi inh ia chi ch slave

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

>>n : dich trai n bit ++ , - - , += , - = , . . .

CHNG 2 :

CACUC HAMM X LYU SA , X LYU BIT , DELAY

I / _ CAC HAM X LY S : _Bao gm cac ham:

17

Sin() cos() tan() Asin() acos()

atan() Abs() : ly tri tuyt i

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()

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

_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 .

2 / Rotate_right () , rotate_left () _Noi chung 4 ham nay it s dung .

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

7 / make16 ( varhigh , varlow ) :

_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 :

X LYU ADC , CACUC HAMM

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

: A0 A1 VRefh = A3 : A0 A1 A5 E0 E1 E2 VRefh=A3 , VRefl=A2 .

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

VD : setup_adc_ports (AN0_AN1_AN3 ) ; cp cho IC se la in ap chun .

// A0 , A1 , A3 nhn analog , ap ngun +5V

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

#DEVCE ADC=8 ADC=10 ADC=11 ADC=16

8 bit

10 bit 11 bit 16 bit 00-255 x x 0-65504 0-65535

0-255 0-255 00-255 x x 0-1023 x x

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

RA2 RA3 RA4 RA5 RE0 RE1 RE2 VDD GND

RB4 RB3 RB2 RB1 RB0 VDD GND RD7

36 35 34 33 32 31 30 29

27

RD6

28

14 15

OSC1 RD5 OSC2 RD4

27 26

J1

Osillator

16 17 18

RC0 RC1 RC2

RC7 RC6 RC5

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) ;

Output_low (pin_B0); Delay_ms (250 ); } }

2 / Output_bit ( pin , value ) : _pin : tn chn value : gia tri 0 hay 1

_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

Trong ham main : Main() { { while (1 ) output_bit( pin_B0 , !x ) ; Delay_ms(250 );

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

Main() { set_tris_B ( 126 ) ; //portB=01111110 b

// 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 ;

Void hieu_chinh ( ) { ADC_delay = read_adc ( 0 ) ; //portB=00000000

Output_B ( 0) ;

Delay_ms ( ADC_delay ); Output_B ( 255 ) ; // portB= 11111111 Delay_ms ( ADC_delay ); }

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

If ( input ( pin_C0 ) { output_B (0 ); // thoat khoi vong lp while nho

Break ; } } }

//while // main

34

CHNG 4 : TRUYNAN THNNG VIUI PC QUA CNNG COM-RS232 - X LYU CHUIAI

_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

%4X 0012 00FE

* Result is undefined - Assume garbage.

VD : Int k =6 ; Printf ( hello ); Printf ( %u , k );

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 :

GIAO TIPAP SPI I2C VA PARALLEL

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

PWM / CAPTURE / COMPARE

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 :

LAMM VICC VIUI NGTET

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

: ngt ngoai : ngt ngoai 1 : ngt ngoai 2 : co hoat ng I 2C

46

#INT_LCD

: co hoat ng LCD : phat hin ap thp

#INT_LOWVOLT #INT_PSP

: co data vao cng Parallel slave

#INT_RB #INT_RC #INT_RDA

: 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_TIMER0 #INT_TIMER1 #INT_TIMER2 #INT_TIMER3 #INT_TIMER5

#INT_OSCF : li OSC #INT_PWMTB : ngt cua PWM time base

#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

IV / CAC CHNG TRINH VD V NGT :

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

RA0 RA1 RA2 RA3 RA4 RA5

RB6 RB5 RB4 RB3 RB2 RB1

38 37 36 35 34 33

1 1

2 2

9 10 11 12 13

RE0 RE1 RE2 VDD GND

RB0 VDD GND RD7 RD6

32 31 30 29 28

LED

R 330

14

OSC1 RD5

27

J1

50

15

OSC2 RD4

26

Osillator

16 17 18

RC0 RC1 RC2

RC7 RC6 RC5

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

#INT_RB Void RB_LED ( ) { portd=portb; } // ham phuc vu ngt

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

while( true ) { //co th thm ma x ly y . . . } } //main

52

You might also like