Professional Documents
Culture Documents
CCS Tieng Viet
CCS Tieng Viet
_ay la tai lieu hng dan s dung CCS lap trnh ngon ng C cho vi ieu khien PIC cua Microchip .
Tac gia ten TRAN XUAN TRNG , SV K2001 ,H BK HCM . La thanh vien txt2203 tren dien
an diendandientu.com , thanh vien txt tren dien an picvietnam.com . Moi ong gop y kien ve
tai lieu hay email en a ch : txt2203@yahoo.com . Rat cam n moi ong gop y kien cua cac ban
yeu thch lap trnh vi x ly oi vi tai lieu nay .
_Tai lieu hng dan lap trnh C cho PIC s dung phan mem CCS cac phien ban . Tai lieu cung giai
thch cach thc hoat ong cua 1 so module cua VK e cac ban nam ro hn hoat ong VK nham
s dung ham va viet chng trnh 1 cach chnh xac .
_Tai lieu nay khong chu y thay the hoan toan HELP cua CCS , no ch la phan co ong , la hng
dan va giai thch c ban viet 1 chng trnh bat au t au , gii thieu 1 so ham va cach hoat ong ,
1 so van e khi lap trnh , . . . do o no khong ay u , ban nen oi chieu tai lieu nay vi HELP
tieng Anh e nam ro van e , ong thi hoc ca tieng Anh de dang .
_CCS co phan common questions nhng cau hoi thng gap va tra li , cha c dch ay
du no rat quan trong , nhieu ban hay bo qua , khong e y . Ban nen xem no .
_Trang web i kem la nhng cap nhat sa loi va nang cap qua cac phien ban .
_Tai lieu trnh bay ve cac van e sau :
_ Chng 0 : Gii thieu CCS . Viet 1 chng trnh C trong CCS nh the nao . Cong cu mo
phong . CCS tch hp MPLAB .
_ Chng 1 : S dung bien va ham , cac cau truc lenh , ch th tien x ly.
_ Chng 2 : Cac ham x ly so , x ly bit , delay .
_ Chng 3 : X ly ADC , cac ham vao , ra trong C .
_ Chng 4 : Truyen thong vi PC , x ly chuoi .
_ Chng 5 : van e TIMER.
_ Chng 6 : Truyen thong I2C , SPI va PARALLEL .
_ Chng 7 : Cac van e ve PWM , Capture va Compare .
_ Chng 8 : Van e ngat ( interrupt ).
_Trong moi chng se co cac hng dan s dung cac ham thch hp cho chu e o .
_Nen oc chng 1 trc . Cac chng con lai oc lap nhau .
_Tai lieu nay viet en au a len mang cho moi ngi tham khao en o . Hau het se trnh bay s
dung 1 cach c ban nhat , sau o se bo sung them VD,chng trnh, . . . them en au se thong bao
en o .
1
CHNG 0 :
II / _ S DUNG CCS :
_e viet 1 chng trnh C mi : chay CCS , vao New e tao 1 file C mi . Tren thanh toolbar :
Chon Microchip 12 bit e viet chng trnh cho PIC 12 bit . Microchip 14 bit e viet chng
trnh cho PIC 14 bit . Microchip PIC18 e viet chng trnh cho PIC18 .
_Neu s dung mach dao ong thach anh ngoai th ien gia th xung clock vao o sau :
Phai nhap kep vao mi hieu chnh c .
3
_Muon xem trc ma sinh ra khi hieu chnh bat ky ieu g , chon :
_Tuy thuoc loai PIC muon lap trnh ma muc FUSES se co them nhieu hay t tuy chon , VD 18F4431:
o chng trnh nhan biet va hoat ong tng ng vi no ( nh la kch hoat ngat ngoai , tao xung
timer ngoai , tao tn hieu analog vao chan AD , . . .
_ Thiet lap moi trng CCS : vao MPLAB IDE , vo muc Project-> Set Language Tool Location . . .
Hop thoai m ra , nhan vao dau + cua dong CCS C Compile ->Executable ,sau o chon Browser e
thiet lap ng dan en file ccsc . exe trong th muc cai at CCS ( ten mac nh la PICC ) . Ban co
the them ng dan vao 4 dong cua Default Search Path . . . neu thay can .
MLPAB . Khuyet iem la ban khong the dung cac tien ch cua CCS oc lap c ( C/asm list . . . )
. Tuy vay , sau khi bien dch cac file C/Asm list va file COFF , . . .se co trong th muc d an va ban
co the m chung bang 1 trnh van ban nh la Notepad.
_Ben trai la ca so d an, ni ban co the them vao cac file can thiet.
_e them 1 file *.c , nhan chot phai len source file -> Add file . . .
_e them 1 file *.h , nhan chuot phai len Header file -> add file . . .
_Muc Other files : dung e them vao cac file phuc vu cho d an nh cac file C , file text , . . .Cac
file nay co the c bien dch ma cung co the khong , va dung e ghi cac chu giai , s o thuat toan
,...
_lu y : cac canh bao ( warning ) la co the bo qua , trnh bien dch van tao ra file hex . Nhng loi
error neu co th khong the bo qua , v no khong the tao file hex c . hay nhan kep vao dong
warning hay error nao th se nhay en v tr phat sinh no .
_e mo phong :
_Hnh tren cho thay :bc nhay la 500 ms cho 1 dong lenh C hay ASM , hieu chnh nho hn se lam
tang toc o animate , con cap nhat tren Watch se mat 5x100=500 ms , co the thay oi . Neu muon
Watch cap nhat ngay tc th ( real time ) th anh dau chon tren o
, hay phm F7 , tien li hn khi dung animate .
_e mo phong tng dong lenh , dung
_Ta co the dung moi tien ch trong muc View e phuc vu mo phong . Bao gom :
1 / _ Disassembly listing : the hien ma ASM cho tng dong lenh C . Lu y la se co 1 con tro mo
phong mau xanh ben trai cho ca hop thoai dong lenh C lan ASM ngha la tien trnh mo phong the
hien tren ca 2 hop thoai . Khi mo phong , neu at con tro chuot ben hop ASM , con tro xanh se mo
phong tng dong lenh ASM tng ng cho dong lenh C ben hop lenh C . Ngc lai , neu chon hop
thoai C , se mo phong tng dong lenh C , tng ng ca 1 nhom dong lenh ASM tng ng .
_Nhan Halt
_e giam sat thanh ghi bo nh , chon ten thanh ghi roi nhan Add SFR :
Ten thanh ghi se them vao vung ben di .
_e giam sat ten bien c trong chng trnh cua mnh , chon ten bien va nhan Add symbol.
MPLAB cho phep ti 4 khung Watch lam viec . thng ta ch can 1 .
_e loai bo bien hay thanh ghi bat ky khoi viec giam sat , chon no va nhan nut Delete tren ban
phm.
_Nhan chuot phai tren vung giam sat e co cac la chon them , trong o co muc Properties , tuy
nhien chung khong quan trong tr khi co nhng yeu cau ac biet .
_Click chuot phai len vung nay :
Se o xuong menu sau , cho phep hien th noi dung bien theo dang so hex, thap phan , nh phan , . .
_Click kep vao o gia tr e hieu chnh gia tr bien neu muon .
_Lu y la khi reset lai e mo phong t au , Watch khong t cap nhat . Phai ong no roi m lai .
8 / _Special function Register : cho phep giam sat cac thanh ghi chc nang ac biet .
9 / _ Simulator Trace : ghi lai toan bo tien trnh thc thi ma t luc reset en luc dng .Rat tuyet vi
khi muon xem chng trnh co o dai bao nhieu chu ky lenh , hay quan sat 1 vong lap thc thi xong
th mat bao nhieu thi gian , xem chng trnh chay nh the nao , . . .Lu y la ca so se khong cap
nhat trong luc ang mo phong , ma phai ong no lai roi m lai th no mi update ket qua mi .
Ngoai ra nhan chuot phai len ca so se cho nhieu la chon tuy bien hay .
_Vai thu thuat linh tinh :
_Nhan chuot trai len moi ca so e m menu
->Dockable : ca so luon tren cung .e
bo tnh nang nay , click phai len o va chon undockable .
_Khi m nhieu ca so giam sat , se dan en kho quan sat va chon ca so , do o muon chon cai nao
th vao Window e chon
10
_Mot chng trnh C co the c viet luon tuon trong ham main () , neu chung rat ngan va n gian
. Nhng khi chng trnh bat au dai ra , phc tap len 1 chut th phai phan chia trong cac ham con .
Cac ham nay co the la :
1/ Ham khong tra ve tr . V du :
Void xu_ly( )
{
z= x+y ;
}
Ham tren ch thc hien cac lenh trong than ham , khi goi ham nay ch n gian viet :
Xu_ly( ) ;
2/ Ham co tra ve tr . V du :
int xu_ly ( int a , int b)
{
......
Return (a+b) ;
}
Ham tren se tra ve tong (a+b) . khi s dung , v du tnh tong 2 bien e ,f , chng trnh nh sau ( trong
ham main() ) :
Main()
{
Int e ,f ,g ;
e=7 ;
f= 4;
g = xu_ly(e ,f );
// gia tr g=28
}
_Moi ham con nen c viet e thc hien 1 chc nang chuyen biet nao o . Ben trong 1 ham con
co the goi 1 hay nhieu ham khac . Cach thc hoat ong nh viet 1 chng trnh C tren may tnh .
_Neu chng trnh ln hn na co the lam file c rat dai va do o rat kho kiem soat , nen se can
phan chia ra cac file c . trong o file chnh cha ham main se c bien dch . Cac file c khac cha
cac ham phuc vu chuyen biet nh : cho LCD , . . .Trong file chnh ch can them dong #include < file
x.c > la tat ca ham can dung cha trong file x se c bien dch vao file hex chung . Cac v du trong
th muc cua CCS neu co s dung LCD se chen 1 dong #include < lcd.c> va do o se goi c cac
ham trong file nay ma khong can phai viet lai . ieu nay co ngha la ta co the viet cac file c cha ma
tong quat co the dung chung cho nhieu project , tc la tai s dung ma , thay v phai viet lai chuyen
biet cho tng project . ay la cach lam chuyen nghiep cho nhng project ln .
11
CHNG 1 :
VD :
Signed int8 a ;
// so a la 8 bit dau ( bit 7 la bit dau ).
Signed int16 b , c , d ;
Signed int32 , . . .
_Pham vi bien :
Int8 :0 , 255
signed int8 : -128 , 127
Int16 : 0 ,2^15-1
signed int16 : -2^15 , 2^15-1
Int32 : 0 , 2^32-1
signed int32 : -2^31 , 2^31-1
_Khai bao hang : VD :
Int8 const a=231 ;
_Khai bao 1 mang hang so :
VD : Int8 const a[5] = { 3,5,6,8,6 } ;
//5 phan t , ch so mang bat au t 0 : a[0]=3
_Mot mang hang so co kch thc toi a tuy thuoc loai VK:
*NeuVK la PIC 14 ( VD :16F877 ) : ban ch c khai bao 1 mang hang so co kch thc toi a la
256 byte .
Cac khai bao sau la hp le :
Int8 const a[5]={ . . .};
// s dung 5 byte , dau . . . e ban ien so vao
Int8 const a[256]={ . . .};
// 256 phan t x 1 byte = 256 byte
Int16 const a[12] = { . . . };
// 12 x 2= 24 byte
Int16 const a[128] = { . . . };
// 128 x 2= 256 byte
12
th bien o mi co gia tr , co khi nhay ra ngoai ham th bien o se la out of scope khi ta quan sat
chung trong ca so Watch.
_Chi tiet ve pham vi bien xem tai lieu lap trnh C tren may tnh .
_CCS co ho tr ca con tro , tuy nhien t dung .
_CCs khong ho tr lap trnh hng oi tng nh C++ . Tuy vay CCS co ho tr cac bien cau truc .
z = T* ( 1-ma ) + T * ma * y
trong o ( 1-ma ) >=1 . va 0< y <2
z = [ T * ( 256 MA ) ]>>8 + [T * MA * Y ] >> 15
Trong o MA = ma<<8
va Y = y << 7 ;
ch can lap bang tra sin trong o la cac gia tr sin la so nguyen = ( y + 1) * 128 ;
STATEMENTS
STATEMENT
if (expr) stmt; [else stmt;]
EXAMPLE
if (x==25)
x=1;
else
x=x+1;
while
(get_rtcc()!=0)
while (expr) stmt;
putc(n);
do {
do stmt while (expr);
putc(c=getc());
} while (c!=0);
for (i=1;i<=10;++i)
for (expr1;expr2;expr3) stmt;
printf(%u\r\n,i);
switch
(cmd) {
switch (expr) {
case 0: printf(cmd 0);
case cexpr: stmt; //one or more case
break;
[default:stmt]
case 1: printf(cmd 1);
... }
break;
default: printf(bad cmd);
break; }
return (5);
return [expr];
goto loop;
goto label;
loop: I++;
label: stmt;
break;
break;
continue;
continue;
i=1;
expr;
;
;
{a=1;
{[stmt]}
b=1;}
Zero or more
Lu y : cac muc trong [ ] la co the co hoac khong .
_while (expr) stmt : xet ieu kien trc roi thc thi bieu thc sau .
_ do stmt while (expr) : thc thi bieu thc roi mi xet ieu kien sau .
_Return : dung cho ham co tra ve tr , hoac khong tra ve tr cung c , khi o ch can dung: return
; ( ngha la thoat khoi ham tai o ) .
_Break : ngat ngang ( thoat khoi ) vong lap while. _Continue : quay tr ve au vong lap while .
15
III / _ CH TH TIEN X LY :
_Xem chi tiet tat ca phan HELP , muc pre_processor . ay se gii thieu 1 so ch th thng dung
nhat :
1 /_ #ASM va #ENDASM :
_Cho phep at 1 oan ma ASM gia 2 ch th nay , Ch at trong ham . CCS nh ngha san 1 bien 8
bit _RETURN_ e ban gan gia tr tra ve cho ham t oan ma Assembly.
_C u manh e thay the Assmemly . V vay nen han che long ma Assembly vao v thng gay ra
xao tron dan en sau khi bien dch ma chay sai , tr phi ban nam ro Assembly va oc hieu ma
Assembly sinh ra thong qua muc C/Asm list .
_Khi s dung cac bien khong bank hien tai , CCS sinh them ma chuyen bank t ong cho cac bien
o . Neu s dung #ASM ASIS th CCS khong sinh them ma chuyen bank t ong , ban phai t them
vao trong ma ASM .
_Lu y : ma Assembly theo ung ma tap lenh VDK , khong phai ma kieu MPLAB .
_VD :
int find_parity (int data)
int count;
#asm
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movwf _return_
#endasm
}
2 / _ #INCLUDE :
_Cu phap : #include <filename>
Hay #include filename
Filename : ten file cho thiet b *.h , *.c . Neu ch nh file ng dan khac th them ng dan vao
. Luon phai co e khai bao chng trnh viet cho VK nao , va luon at dong au tien .
_VD :
#include <16F877.H>
Khi o TMR1Flag = 0
xoa c ngat timer1
Int16 a=35;
//a=00000000 00100011
#bit b= a.11
//b=0 , neu b=a.0 th b ch v tr LSB ( bit thap nhat , ben trai)
Sau o : b=1;
//a=00001000 00100011 = 2083
_Lu y khong dung c : if ( 0xb.2 ) ma phai khai bao nh tren roi dung : if(TMR1Flag)
_#BYTE id = x
X: a ch
id : ten bien C
Gan ten bien id cho a ch (thanh ghi ) x , sau o muon gan hay kiem tra a ch x ch can dung id .
Khong ton them bo nh , ten id thng dung ten gi nh chc nang thanh ghi a ch o . Lu y
rang gia tr thanh ghi co the thay oi bat ky luc nao do hoat ong chng trnh nen gia tr id cung t
thay oi theo gia tr thanh ghi o . Khong nen dung id cho thanh ghi a muc ch nh 1 cach dung
bien int8 v CCS co the dung cac thanh ghi nay bat ky luc nao cho chng trnh , neu muon dung
rieng , hay dung #LOCATE.
_VD:
#byte port_b = 0xc6;
// 16F877 :0xc6 la a ch portb
Muon port b co gia tr 120 th : port_b=120;
#byte status = 0xc3;
_ # LOCATE id = x
_Lam viec nh #byte nhng co them chc nang bao ve khong cho CCS s dung a ch o vao muc
ch khac . VD: # LOCATE temp = 0xc20
// 0xc20 :thanh ghi a muc ch
Cach sau tng t :
Int8 temp ;
#locate temp = 0xc20
_ S dung #LOCATE e gan bien cho 1 day a ch ke nhau ( cap thanh ghi ) se tien li hn thay v
phai dung 2 bien vi #byte .
VD : CCP1 co gia tr la cap thanh ghi 0x15 ( byte thap ) va 0x16 ( byte cao ) . e gan tr cho CCP1 :
Int16 CCP1;
#locate CCP1= 0x15
// byte thap cua CCP1 0x15 , byte cao cua CCP1 0x16
Gan tr cho CCP1 se t ong gan vao ca 2 thanh ghi
CCP1 = 1133 ;
// = 00000100 01101101 0x15 = 00000100 , 0x16 = 01101101
_# DEFINE id text
Text : chuoi hay so . Dung nh ngha gia tr .
VD : #define a 12345
4 / _ # DEVICE :
# DEVICE chip option
chip : ten VK s dung , khong dung tham so nay neu a khai bao ten chip # include .
option : toan t tieu chuan theo tng chip:
* = 5 dung pointer 5 bit ( tat 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
ve gia tr x bit .
17
ICD = true
: tao ma tng thch debug phan cng Microchip
HIGH_INTS = TRUE
: cho phep dung ngat u tien cao
_Khai bao pointer 8 bit , ban s dung c toi a 256 byte RAM cho tat ca bien chng trnh .
_Khai bao pointer 16 bit , ban s dung c het so RAM co cua VDK .
_Ch nen dung duy nhat 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: bat au va ket thuc vung ROM danh rieng cho ham theo sau , hoac e rieng khong dung
.
VD :
Org 0x30 , 0x1F
Void xu_ly( )
{
}
// ham nay bat au a ch 0x30
org 0x1E00
anotherfunc( )
{
}
//ham nay bat au tuy y 0x1E00 en 0x1F00
Org 0x30 , 0x1F { }
// khong co g ca at trong vung ROM nay
_Thng th khong dung ORG .
6 / _ # USE :
# USE delay ( clock = speed )
Speed : gia tr OSC ma ban dung . VD: dung thach anh dao ong 40Mhz th :
#use delay( clock = 40000000)
_Ch khi co ch th nay th trong chng trnh ban mi c dung ham delay_us ( ) va delay_ms( ) .
#USE fast_io ( port)
Port : la ten port :t A-G ( tuy chip )
_Dung cai nay th trong chng trnh khi dung cac lenh io nh output_low() , . . . no se set ch vi 1
lenh , nhanh hn so vi khi khong dung ch th nay.
_Trong ham main( ) ban phai dung ham set_tris_x( ) e ch ro chan vao ra th ch th tren mi co
hieu lc , khong th chng trnh se chay sai .
_Khong can dung neu khong co yeu cau g ac biet .
VD : # use fast_io( A )
#USE I2C ( options )
_Thiet lap giao tiep I2C.
Option bao gom cac thong so sau, cach nhau bi dau phay :
Master
: chip che o master
18
Slave
: chip che o slave
SCL = pin
: ch nh chan SCL
SDA = pin
: ch nh chan SDA
ADDRESS =x
: ch nh a ch che o slave
FAST
: ch nh FAST I2C
SLOW
: ch nh SLOW I2C
RESTART_WDT
: restart WDT trong khi ch I2C_READ( )
FORCE_HW
: s dung chuc nang phan cng I2C ( neu chip ho tr )
NOFLOAT_HIGH : khong cho phep tn hieu float high ( ??? ) , tn hieu c lai t thap len cao.
SMBUS
: bus dung khong phai bus I2C , nhng la cai g o tng t .
_VD :
#use I2C ( master , sda=pin_B0 , scl = pin_B1 )
#use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW )
#USE RS232 ( options )
_Thiet lap giao tiep RS232 cho chip ( co hieu lc sau khi nap chng trnh cho chip , khong phai
giao tiep RS232 ang s dung e nap chip ) .
Option bao gom :
BAUD = x
: thiet lap toc o baud rate : 19200 , 38400 , 9600 , . . .
PARITY = x
: x= N ,E hay O , vi N : khong dung bit chan le .
XMIT = pin
: set chan transmit ( chuyen data)
RCV = pin
: set chan receive ( nhan data )
_Cac thong so tren hay dung nhat , cac tham so khac se bo sung sau.
VD :
#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)
MOT SO VAN E QUAN TRONG KHAC xem chi tiet trong phan HELP :
_Bieu thc : xem HELP->Expressions , trong o : bieu th so trong C:
123 : so decimal
0x3 , 0xB1 : so hex
0b100110 : so binary
a : ky t
abcd : chuoi , ky t null c them pha sau
_Cac toan t C : xem Operators
>= , < = , = = , != ( khong bang )
&& : and
|| : or
! : not ( ao cua bit , khong phai ao cua byte )
19
CHNG 2 :
bit_test()
make32()
Swap()
2 / Rotate_right () , rotate_left ()
_Noi chung 4 ham nay t s dung .
3 / Bit_clear ( var , bit )
20
22
CHNG 3 :
I / _ X LY ADC :
_PIC co nhieu chan phuc vu x ly ADC vi nhieu cach thc khac nhau . e dung ADC , ban phai
co khai bao #DEVICE cho biet dung ADC may bit ( tuy chip ho tr , thng la 8 hay 10 bit hoac
hn) . Ban can lu y la: 1 VDK ho tr ADC 10 bit th gia tr vao luon la 10 bit , nhng chia cho 4 th
con 8 bit . Do o 1 bien tr chiet ap cap cho ngo vao ADC ma ban chon che o 10 bit th se rat nhay
so vi che o 8 bit ( v 2 bit cuoi co thay oi cung khong anh hng gia tr 8 bit cao va do o ket qua
8 bit ADC t thay oi ) , neu chng trnh co che o kiem tra ADC e cap nhat tnh toan , hay dung
ngat ADC , th no se chay hoai thoi . Dung ADC 8 bit se han che ieu nay . Do o ma CCS cung
cap chon la ADC 8 hay 10 bit tuy muc ch s dung .
2 / Setup_ADC_ports ( value )
_Xac nh chan lay tn hieu analog va ien the chuan s dung . Tuy thuoc bo tr chan tren chip , so
chan va chan nao dung cho ADC va so chc nang ADC moi chip ma value co the co nhng gia tr
khac nhau. Xem file tng ng trong th muc DEVICES e biet so chc nang tng ng chip o .
e tng thch chng trnh viet cho phien ban cu , 1 so tham so co 2 ten khac nhau ( nhng cung
23
chc nang do nh ngha cung a ch ) , ay dung phien ban 3.227 .Lu y : Vref : ap chuan ,
Vdd : ap nguon
Sau ay la cac gia tr cho value ( ch dung 1 trong cac gia tr ) cua 16F877 :
ALL_ANALOGS
: dung tat ca chan sau lam analog : A0 A1 A2 A3 A5 E0 E1 E2
(Vref=Vdd)
NO_ANALOG
: khong dung analog , cac chan o se la chan 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
( ten th giong nhau cho tat ca thiet b nhng 16F877 ch co portA co 5 chan nen A0 , A1 , A2 , A5
c dung , A6 , A7 khong co )
AN0_AN1_AN3
: A0 A1 A3 , Vref = Vdd
AN0_AN1_VSS_VREF
: A0 A1 VRefh = A3
AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF
: A0 A1 A5 E0 E1 E2 VRefh=A3 ,
VRefl=A2 .
AN0_AN1_AN2_AN3_AN4_AN5
: A0 A1 A2 A3 A5 E0
AN0_AN1_AN2_AN4_AN5_VSS_VREF
: A0 A1 A2 A5 E0 VRefh=A3
AN0_AN1_AN4_AN5_VREF_VREF
: A0 A1 A5 E0 VRefh=A3 VRefl=A2
AN0_AN1_AN4_VREF_VREF
: A0 A1 A5 VRefh=A3 VRefl=A2
AN0_AN1_VREF_VREF
: A0 A1 VRefh=A3 VRefl=A2
AN0
: A0
AN0_VREF_VREF
: A0 VRefh=A3 VRefl=A2
VD : setup_adc_ports (AN0_AN1_AN3 ) ;
cho IC se la ien ap chuan .
3 / Set_ADC_channel ( channel ) :
_Chon chan e oc vao gia tr analog bang lenh Read_ADC ( ) . Gia tr channel tuy so chan chc
nang ADC moi chip .Vi 16F877 , channel co gia tr t 0 -7 :
0-chan A0
1-chan A1
2-chan A2
3-chan A3
4-chan A5
5-chan E0
6-chan E1
7-chan E2
_Ham khong tra ve tr . Nen delay 10 us sau ham nay roi mi dung ham read_ADC ( ) e bao am
ket qua ung . Ham ch hoat ong vi A /D phan cng tren chip.
4 / Read_ADC ( mode ) :
_Dung oc gia tr ADC t thanh ghi (/ cap thanh ghi ) cha ket qua bien oi ADC . Lu y ham nay
se hoi vong c cho ti khi c nay bao a hoan thanh bien oi ADC ( se mat vai us ) th xong ham .
_Neu gia tr ADC la 8 bit nh khai bao trong ch th #DEVICE , gia tr tra ve cua ham la 8 bit ,
ngc lai la 16 bit neu khai bao #DEVICE s dung ADC 10 bit tr len .
_Khi dung ham nay , no se lay ADC t chan ban chon trong ham Set_ADC_channel( ) trc o .
Ngha la moi lan ch oc 1 kenh Muon oi sang oc chan nao , dung ham set_ADC_channel( ) lay
chan o . Neu khong co oi chan , dung read_ADC( ) bao nhieu lan cung c .
_mode co the co hoac khong , gom co :
ADC_START_AND_READ
: gia tr mac nh
ADC_START_ONLY
: bat au chuyen oi va tra ve
ADC_READ_ONLY
: oc ket qua chuyen oi lan cuoi
24
#DEVCE
8 bit
10 bit
11 bit
ADC=8
0-255
0-255
00-255
ADC=10
x
0-1023
x
ADC=11
x
x
0-2047
ADC=16
0-65280 0-65472
0-65504
_16F877 ch ho 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);
16 bit
00-255
x
x
0-65535
_Lu y : tren PIC 18 , cau truc ADC tng oi phc tap , a nang hn nh la cho phep lay 2 mau
cung luc , . . . cung s dung vi cac ham tren , co nhieu thong so trong file *.h , se e cap sau .
5 / _ V du :
_Chng trnh sau lay ADC 8 bit , oc va xuat ra day led port B , va xuat ra man hnh may tnh .
_Ket noi chan tren 16F877 : RA0 la chan lay Analog vao , ap chuan la nguon +5V , mass=0 V
_Hnh sau trch trong tai lieu thay Nguyen Tan Tien viet T6-2002 .
Reset Button
1
2
5V
+
470uF-25V
0.1uF
10K
1
10K
LED
U1
0.1uF
3
OUT
Analog Input
Osillator
20MHz
Digital Output
SCO-060
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0
RE1
RE2
VDD
GND
OSC1
OSC2
RC0
RC1
RC2
RC3
RD0
RD1
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
GND
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
R 330
J1
4
3
2
1
to RS232
PIC16F877
Main( )
{
Setup_ADC ( ADC_internal ) ;
Setup_ADC_ports (AN0);
Set_ADC_channel ( 0 ) ;
Delay_us (10 );
// delay 10 us
While (true )
{
adc = read_adc ( ) ;
Output_B ( adc ) ;
// xuat ra port B gia tri bien adc
Printf( gia tri adc la : %u , adc ) ;
// in ra man hinh
}
}
// gia tr bien adc t 0-255 , dung chng trnh Serial port Monitor trong muc Tools cua CCS e
giam sat gia tr . Nh thiet lap toc o la 19200 nh khai bao tren .
26
_Ham nay cung xuat gia tr 0 / 1 tren pin , tng t 2 ham tren . Thng dung no khi gia tr ra tuy
thuoc gia tr bien 1 bit nao o , hay muon xuat ao cua gia tr ngo ra trc o .
VD :
Khai bao int1 x;
// x mac nh = 0
Trong ham main :
Main()
{
while (1 )
{
output_bit( pin_B0 , !x ) ;
Delay_ms(250 );
}
}
Chng trnh tren cung xuat xung vuong 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 , dch nh vay khong biet ung
khong na ? , chac la thiet lap nh ngo vao tong tr cao th phai ) .
4 / Input ( pin ) :
_Ham nay tra ve gia tr 0 hay 1 la trang thai cua chan IC . Gia tr la 1 bit
5 / Output_X ( value ) :
_X la ten port co tren chip . Value la gia tr 1 byte .
_Ham nay xuat gia tr 1 byte ra port . Tat ca chan cua port o eu la ngo ra .
VD :
Output_B ( 212 ) ;
// xuat gia tr 11010100 ra port B
6 / Input_X ( ) :
_X : la ten port ( a, b ,c ,d e ) .
_Ham nay tra ve gia tr 8 bit la gia tr ang hien hu cua port o .VD : m=input_E();
7 / Port_B_pullups ( value ) :
_Ham nay thiet lap ngo vao port B pullup ( ien tr keo len ?) . Value =1 se kch hoat tnh nang nay
va value =0 se ngng .
_Ch cac chip co port B co tnh nang nay mi dung ham nay .
8 / Set_tris_X ( value ) :
_Ham nay nh ngha chan IO cho 1 port la ngo vao hay ngo ra. Ch c dung vi #use fast_IO . S
dung #byte e tao bien ch en port va thao tac tren bien nay chnh la thao tac tren port .
_Value la gia tr 8 bit . Moi bit ai dien 1 chan va bit=0 se set chan o la ngo vao , bit= 1 set chan
o la ngo ra .
VD : chng trnh sau cho phep thao tac tren portB 1 cach de dang:
#include < 16F877.h >
#use delay(clock=20000000)
#use Fast_IO( B )
#byte portB = 0x6
// 16F877 co port b a ch 6h
#bit B0 = portB. 0
// bien B0 ch en chan B0
#bit B1=portB.1
// bien B1 ch en chan B1
27
#bit B2=portB.2
#bit B3=portB.3
#bit B4=portB.4
#bit B5=portB.5
#bit B6=portB.6
#bit B7=portB.7
Main()
{
set_tris_B ( 126 ) ;
// bien B2 ch en chan B2
// bien B3 ch en chan B3
// bien B4 ch en chan B4
// bien B5 ch en chan B5
// bien B6 ch en chan B6
// bien B7 ch en chan B7
//portB=01111110 b
// B0 la ngo vao , thng lam ngat ngoai
//B1 . . . B6 la ngo ra , Vd lam 6 ngo ra ieu che PWM
//B7 la ngo vao , Vd la nhan tn hieu cho phep chang han
//neu ngo vao chan B7 la 1 th xuat 3 cap xung oi nghch
if ( B7 )
{
B1 = 1 ;
B2 = 0 ;
B3 = 1 ;
B4 = 0 ;
B5 = 1 ;
B6 = 0 ;
}
Else B1=B2=B3=B4=B5=B6= 0;
}
_Lu y :
_Set_tris_B (0 ) : port B =00000000 : tat ca chan portB la ngo ra
_set_tris_B ( 1 ) : portB = 00000001 : ch B0 la ngo vao , con lai la ngo ra
_set_tris_B ( 255 ) : portB=11111111: tat ca chan portB la ngo vao
toi cung tng nham lan khi ngh set_tris_B(1) la set tat ca la ngo vao , rat tai hai . Ban nen
dung gia tr dang nh phan cho de . VD : set_tris_B ( 00110001b ) ;
_en ay la ban co the viet nhieu chng trnh thu v roi o. Vd nh la dung ADC e ieu chnh
toc o nhap nhay cua day en led , truyen gia tr 8 bit t chip nay sang chip khac , . . .
_Chng trnh VD sau dung ADC qua chan A0 e ieu chnh toc o nhap nhay day en led noi vao
port B , co the dung fast_io hay ham output_B () e xuat gia tr eu c . chng trnh dung ham .
Neu ngo vao chan C0 =0 th tiep tuc nhan ADC va xuat ra portB, C0=1 th khong xuat
#include <16F877.h>
#device *=16 ADC= 8
#use delay( clock =20000000)
Int8 ADC_delay ;
Void hieu_chinh ( )
{
ADC_delay = read_adc ( 0 ) ;
Output_B ( 0) ;
//portB=00000000
Delay_ms ( ADC_delay );
Output_B ( 255 ) ;
// portB= 11111111
Delay_ms ( ADC_delay );
}
28
Main()
{
setup_adc_ports(AN0_AN1_AN3);
setup_adc(adc_clock_internal);
set_adc_channel ( 0 );
while(1)
{
hieu_chinh ( ) ;
If ( input ( pin_C0 )
{
output_B (0 );
Break ;
}
}
}
//while
// main
CHNG 4 :
29
_Nhng neu lap trnh ASM cho van e nay roi th ban se thay sao de dang qua vay khi giai quyet
van e nay vi C khi dung CCS . Rat n gian ! CCS cung cap rat nhieu ham phuc vu cho giao tiep
qua cong COM va vo so ham x ly chuoi . Chng nay se giai quyet ieu o .
_Mot yeu to quan trong la khi nao th VK biet PC truyen data co the lap trnh bat tay bang phan
mem hay n gian la dung ngat . Cac v du ve ngat , xem phan ngat .
_Tat ca cac ham tren oi hoi phai khai bao ch th tien x ly #use RS232 ( . . . . .) . Chi tiet ch th
nay xem phan Ch th tien x ly .
_Ham perror ( ) oi hoi them #include<errno.h > . Ham assert() oi hoi them #include<assert.h> .
1 / printf ( string )
Printf ( cstring , values . . . )
_Dung xuat chuoi theo chuan RS232 ra PC .
_string la 1 chuoi hang hay 1 mang ky t ( ket thuc bi ky t null ) .
_value la danh sach cac bien , cach nhau bi dau phay .
_Ban phai khai bao dang format cua value theo kieu %wt .Trong o w co the co hoac khong , co
gia tr t 1-9 ch ro co bao nhieu ky t c xuat ra ( mac nh khong co th co bao nhieu ra bay
nhieu ), hoac 01-09 se chen them 0 cho u ky t hoac 1.1-1.9 cho trng hp so thc . con t la kieu
gia tr .
_ t co the la :
C : 1 ky t
S : chuoi hoac ky t
U : so 8 bit khong dau
x : so 8 bit kieu hex ( ky t viet thng ,VD : 1ef )
X : so 8 bit kieu hex ( ky t viet hoa ,VD : 1EF )
D : so 8 bit co dau
e : so thc co luy tha VD : e12
30
f : so thc
Lx : so hex 16 /32 bit ( ky t viet thng )
LX : hex 16 /32 bit ( ky t viet hoa )
Lu : so thap phan khong dau
Ld : so thap phan co dau
% : ky hieu %
VD :
Specifier
Value=0x12
%03u
018
%u
18
%2u
18
%5
18
%d
18
%x
12
%X
12
%4X
0012
Value=0xfe
254
254
*
254
-2
Fe
FE
00FE
31
CHNG 6 :
CHNG 7 :
Bang tren ( trong datasheet PIC16F877 ) cho thay : neu ca 2 module dung cung chc nang Capture
th se dung chung bo em timer1 , ngha la moi hoat ong va ieu chnh Timer1 eu anh hng ti
ca 2 module . Tng t neu dung cung chc nang PWM se dung chung Timer2 . Con neu 1 module
la Capture , module kia la Compare th phai lu y la chc nang compare co the clear Timer1 , va do
o cung anh hng chc nang con lai . Con 2 TH cuoi th khong co van e g .
_ che o Capture : moi khi co canh len cua xung vao chan CCPx th gia tr Timer1 (16 bit )se c
copy vao thanh ghi CCP ( 16 bit ) .
33
_ che o Compare : khi gia tr nap CCP bang gia tr em Timer1 th cac s kien c ch nh
trc xay ra :chan CCPx c lai ra mc thap / cao / khong co g nhng co ngat hay bien oi AD .
_Che o PWM ( pulse width modulation ieu che o rong xung ) : xuat xung vuong bang phan
cng .
_Ban s dung ham setup_ccpX() e xac nh chc nang muon dung tren module CCP . tham so cu
the co the tra trong HELP , hoac xem tng TH cu the di ay .
II / _CHE O CAPTURE :
_Dung e xac nh toc o quay cua motor . Gia s ta co 1 thiet b o toc o quay ( cam bien Hall )
ma moi khi motor quay 1 vong th thiet b phat 1 xung vuong ( canh len roi canh xuong hay xung
mc 1 , hay canh xuong roi canh len tc la xung mc 0 ) . ay ta gia thiet xung mc 1 . Xung nay
dan vao module capture ( co the qua cach ly an toan ) va gia thiet ta chon che o bat canh len .
Ngha la c moi 1 canh len cua xung vao , gia tr cua timer1 copy vao CCP . V motor khong phai
quay eu nen ta thng chon so lan capture la vai chuc lan . ( hnh nh la vay ??? )
_Viec Capture thng i kem 1 cai ham ngat . Cach thc chng trnh hoat ong nh sau : xung vao
Capture se kch ngat , trong ham ngat ,ta lay gia tr CCPx tnh ra c thi gian cho 1 vong quay
,cong don no vao 1 bien e tnh thi gian tong , set Timer1 ve 0 , tang gia tr bien em vong len 1 ,
roi thoat ngat . Vi 1 ong c ang chay khoang 1200vong / phut , tuy thuoc vao tan suat cap nhat
gia tr so vong quay ( e hien th ra LED 7 oan hay LCD ) ban can o 1 so lng vong nhat nh
e am bao chnh xac , VD o 1500 vong , tc la bien em phai em ti 1500 , tnh tong thi gian
o , VD la 80 s , th toc o ong c = ( 1500 / 80 ) * 60 = 1125 vong / phut .
_Hay quen module nay i neu ban dung 1 encoder e o toc , von phat ra ti 500-2000 xung / vong
.Ngha la can chng o lan ngat e ch o 1 vong VDK se phai dung toan bo thi gian hoat ong
e em , co khi khong kp . Viec chng trnh chnh khong the chay v ngat c xay ra lien tuc goi la
tran , no se chang lam c g ca . e giai quyet , ngi ta dung module QEI hay IC3 von ch co
tren PIC 18 nh 18F4431 .
_Capture con dung e o o rong xung . S dung CCP1 lay canh len , CCP2 lay canh xuong cua
cung 1 xung ,tc la 2 CCP noi nhau . 1 xung vuong i vao kch CCP1 trc ( canh len ), thu c gia
tr timer luc , canh xuong cua xung kch CCP2 thu c gia tr timer luc xuong canh . Lay 2 gia tr
tr nhau c o rong xung . ch can 1 ngat CCP2 la u .
34
IV / _CHE O PWM :
_Xuat chuoi xung vuong , o rong hieu chnh c de dang . Thng dung e ieu chnh ien ap
DC . Xung ra se ong cat 1 linh kien nh la SCR, vi o rong xung xac nh se tao ra 1 ien ap
trung bnh xac nh . Thay oi o rong xung se thay oi ien ap nay , do o co the dung ieu khien
ong c DC nho ( ? ? ?) .
35
_Tuy o phan giai ma gia tr cua value khong phai luc nao cung at ti 1023 . Do o , value = 512
khong co ngha la duty = 50 % .
CHNG 8 :
2 / _ Ngat 2 cap :
_Ch co tren PIC 18 ( va dsPIC ) . Co 2 khai niem : ngat u tien thap (low priority) va ngat u tien
cao ( high priority ) . 2 vector thc thi ngat tng ng thng la 0008h (high) va 0018h ( low ) . Mot
ngat thap ang c phuc vu se b ngng va phuc vu ngat cao 0008h neu ngat cao xay ra . Ngc
lai , ngat cao ang xay ra th khong bao gi b ngat bi ngat thap .
_Neu viet ham ngat bnh thng , khong oi hoi u tien g th CCS sinh ma e tat ca ham ngat eu
la ngat u tien cao . Quy trnh thc hien ngat se nh ngat 1 cap tren . #priority van c dung . So
chu ky thc thi t 0008h en khi nhay vao thc thi ham ngat khoang 30 chu ky , xong ham ngat ti
khi ket thuc ngat cung mat khoang 30 chu ky lenh .
_e s dung ngat 2 cap , khai bao #device phai co high_ints=true . Va ham ngat nao muon u tien
cao th them FAST hay HIGH theo sau ch th tien x ly ham o .
Lu y : khi dung FAST th khong nen dung HIGH cho cac ngat khac th mi co y ngha va ch co
duy nhat 1 ngat c u tien FAST , nhng co the co nhieu ngat at mc HIGH .
VD : #int_timer1 FAST
Void xu_ly ( )
{...
}
#int_timer2 HIGH
Void dinh_thi ()
{...
}
#int_timer5 HIGH
Void vong_lap()
{...
}
_C che sinh ma nh sau : co ngat thap th nhay ti 0018h , sao lu W, STATUS , FSR0/1/2 ,. . . roi
mi hoi vong c ngat thap . chay xong ham ngat th phuc hoi tat ca va RETFIE 0 .
_Rieng ngat cao anh dau FAST khong sinh ma sao lu g ca ma nhay thang vao ham ngat chay
luon . PIC 18 va dsPIC co c che lu sieu toc la FAST STACK REGISTER
( xem datasheet ) .
Khi xay ra ngat bat ky , W, S , BSR t ong lu vao thanh ghi tren , PC counter lu vao stack .
xong ngat th pop ra . Van e cho : khi ngat thap xay ra , FAST STACK REGISTER t ong lu W
,S , BSR , PC -> stack . Trong khi thc hien ham phuc vu ngat th trng hp W, S , BSR thay oi la
co the ( v vay mi sao lu ch ) . nhng neu xay ra ngat cao vao thi iem o ? FAST STACK
REGISTER se b ghi e mat data . Do o , c che sinh ma cua CCS can phai luon ung , ngha la
: luon t sao lu rieng W ,S , BSR, va cac thanh ghi FSR na , khi thc thi ngat thap . Con ngat cao
FAST khi chay xong se RETFIE 1 t ong phuc hoi W, S , BSR t FAST STACK REGISTER .
Co 2 trng hp : 1 la ch co ngat cao , th khong co van e g . 2 la ngat cao ngat 1 ngat thap ang
chay . Phan tch se thay rang cho du b ngat trong khi ang sao lu ,hay cha kp sao lu , hay a sao
lu vao cac bien rieng roi , cuoi cung chng trnh cung quay ra ung a ch ban au vi cac thanh
ghi W, S , BSR nh cu .
_Tuan thu nguyen tac ngat cao thc thi tc thi nen CCS ch cho 1 ngat cao FAST duy nhat bat ky
hoat ong , nen khong sinh ma hoi vong , sao lu them g ca .
_Neu ban muon co nhieu ngat u tien cao , th dung HIGH , chng trnh sao lu bnh thng nh
vi ngat thap , nhng khi o ngat anh dau FAST cung mat tac dung , CCS xem nh la HIGH va x
ly bnh thng .
37
_Nh vay dung FAST hay HIGH eu co y ngha rieng cua nha lap trnh .
_e cho phep ngat o hoat ong phai dung lenh enable_interrupts ( int_xxxx) va enable_interrupts (
global ) .
_Khoa FAST theo sau #int_xxxx e cho ngat o la u tien cao , ch c 1 ngat thoi , ch co PIC
18 va dsPIC .
VD : #int_timer0 FAST NOCLEAR
39
5V
U1
10K
Osillator
20MHz
OUT
Reset
Button
SCO-060
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MCLR
RA0
RA1
RA2
RA3
RA4
RA5
RE0
RE1
RE2
VDD
GND
OSC1
OSC2
RC0
RC1
RC2
RC3
RD0
RD1
Buttons
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
GND
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
1
1
1
1
2
2
2
2
LED
R 330
J1
4
3
2
1
to RS232
PIC16F877
//them khai bao nay neu ctrnh co dung ham delay,OSC=20 Mhz
//tao ten danh nh portb thay the a ch portB la 06h
//tao ten danh nh portd thay the a ch 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 eu la ngo ra
enable_interrupts ( INT_RB ) ;
// cho phep ngat RB
enable_interrupts ( GLOBAL ) ;
// cho phep ngat toan cuc
// do chng trnh khong lam g khac ngoai viec ch ngat nen vong while nay trong khong
while( true )
{ //co the them ma x ly ay . . .
}
} //main
40