Bài trước: +Bài 2: Sử dụng Biến và Hàm, Cấu trúc lệnh, Chỉ thị tiền xử lý trong CCS
Bài sau: +Bài 4: Chuyển Đổi ADC - Các Hàm I/O
Bài 3: Các Hàm Xử Lý Số, Xử Lý Bit, Delay trong CCS
I / CÁC HÀM XỬ LÝ SỐ :
+ Bao gồm các hàm:
Sin() cos() tan() Asin() acos() atan()
Abs() : lấy trị tuyệt đối
Ceil( ) :làm tròn theo hướng tăng
Floor ( ) : làm tròn theo hướng giảm
Exp ( ) : tính e^x
Log ( ) :tính log
Log10 ( ) : log10
Pow ( ) : tính luỹ thừa
Sqrt ( ) :căn thức
+ Các hàm này chạy rất chậm trên các VDK không có bộ nhân phần cứng ( PIC 14 ,12 ) vì chủ yếu tính toán với số thực và trả về cũng số thực ( 32 bit ) và bằng phần mềm .VD: hàm sin mất 3.5 ms ( thạch anh = 20Mhz )để cho KQ . Do đó nếu không đòi hỏi tốc độ thì dùng các hàm này cho đơn giản , như là dùng hàm sin thì khỏi phải lập bảng tra.
+ Xem chi tiết trên HELP CCS.
II / CÁC HÀM XỬ LÝ BIT VÀ CÁC PHÉP TOÁN :
+ Bao gồm các hàmsau :
Shift_right() shift_left()
Rotate_right() rotate_left()
Bit_clear() bit_set() bit_test() Swap()
Make8() make16() make32()
1 / Shift_right ( address , byte , value )
Shift_left ( address , byte , value )
+ Dịch phải (trái ) 1 bit vào 1 mảng hay 1 cấu trúc . Địa chỉ có thể là địa chỉ mảng hay địa chỉ trỏ tới
cấu trúc ( kiểu như &data) . Bit 0 byte thấp nhất là LSB .
2 / Rotate_right () , rotate_left ()
+ Nói chung 4 hàm này ít sử dụng .
3 / Bit_clear ( var , bit )
it_set ( var , bit )
+ Bit_clear ( ) dùng xóa ( set = 0 ) bit được chỉ định bởi vị trí bit trong biến var .
+ Bit_set ( ) dùng set=1 bit được chỉ định bởi vị trí bit trong biến var .
+ var : biến 8 , 16 , 32 bit bất kỳ .
+ bit : vị trí clear ( set ) : từ 0-7 ( biến 8 bit) , 0-15 ( biến 16 bit ) , 0-31 (biến 32 bit ) .
+ Hàm không trả về trị .
VD :
Int x;
X=11 ; //x=1011
Bit_clear ( x ,1 ) ; // x= 1001b = 9
4 / Bit_test ( var , bit ) :
+ Dùng kiểm tra vị trí bit trong biến var .
+ Hàm trả về 0 hay 1 là giá trị bit đó trong var .
+ var : biến 8, 16 ,32 bit .
+ bit : vị trí bit trong var .
+ Giả sử bạn có biến x 32 bit đếm từ 0 lên và muốn kiểm tra xem nó có lớn hơn 4096 không ( 4096= 2^12 =1000000000000b) :
If ( x >= 4096) . . . // phép kiểm tra này mất ~5 us
Trong 1 vòng lặp , việc kiểm tra thường xuyên như vậy sẽ làm mất 1 thời gian đáng kể . Để tối ưu , chỉ cần dùng : if ( bit_test ( x, 12 ) Ỉ chỉ mất ~ 0.4 us . ( 20 Mhz thạch anh ) .
+ Kiểm tra đếm lên tới những giá trị đặc biệt ( 2^ i) thì dùng hàm này rất tiện lợi.
5 / Swap ( var ) :
+ var : biến 1 byte
+ Hàm này tráo vị trí 4 bit trên với 4 bit dưới của var , tương đương var =( var>>4 ) | ( var << 4 )
+ Hàm không trả về trị .
VD :
X= 5 ; //x=00000101b
Swap ( x) ; //x = 01010000b = 80
6 / make8 ( var , offset ) :
+Hàm này trích 1 byte từ biến var .
+ var : biến 8,16,32 bit . offset là vị trí của byte cần trích ( 0,1,2,3) .
+ Hàm trả về giá trị byte cần trích .
VD :
Int16 x = 1453 ; // x=0x5AD
Y = Make(x, 1) ; //Y= 5 = 0x05
7 / make16 ( varhigh , varlow ) :
+Trả về giá trị 16 bit kết hợp từ 2 biến 8 bit varhigh và varlow . Byte cao là varhigh , thấp là varlow .
8 / make32 ( var1 , var2 , var3 , var4 ) :
+ Trả về giá trị 32 bit kết hợp từ các giá trị 8 bit hay 16 bit từ var1 tới var4 . Trong đó var2 đến var4 có thể có hoặc không . Giá trị var1 sẽ là MSB , kế tiếp là var2 , . . .Nếu tổng số bit kết hợp ít hơn 32 bit thì 0 được thêm vào MSB cho đủ 32 bit .
VD:
Int a=0x01 , b=0x02 , c=0x03 , d=0x04 ; // các giá trị hex
Int32 e ;
e = make32 ( a , b , c , d ); // e = 0x01020304
e = make32 ( a , b , c , 5 ) ; // e = 0x01020305
e = make32 ( a, b, 8 ); // e = 0x00010208
e = make32 ( a ,0x1237 ) ; // e = 0x00011237
III / CÁC HÀM DELAY :
+ Để sử dụng các hàm delay , cần có khai báo tiền xử lý ở đầu file , VD : sử dụng OSC 20 Mhz , bạn cần khai báo : #use delay ( clock = 20000000 )
+ Hàm delay không sử dụng bất kỳ timer nào . Chúng thực ra là 1 nhóm lệnh ASM để khi thực thi từ đầu tới cuối thì xong khoảng thời gian mà bạn quy định . Tuỳ thời gian delay yêu cầu dài ngắn mà CCS sinh mã phù hợp . có khi là vài lệnh NOP cho thời gian rất nhỏ . Hay 1 vòng lặp NOP . Hoặc gọi tới 1 hàm phức tạp trong trường hợp delay dài . Các lệnh nói chung là vớ vẩn sao cho đủ thời gian quy định là được . Nếu trong trong thời gian delay lại xảy ra ngắt thì thời gian thực thi ngắt không tính vào thời gian delay , xong ngắt nó quay về chạy tiếp các dòng mã cho tới khi xong hàm delay . Do đó thời gian delay sẽ không đúng .
+ Có 3 hàm phục vụ :
1 / delay_cycles (count )
+ Count : hằng số từ 0 – 255 , là số chu kỳ lệnh .1 chu kỳ lệnh bằng 4 chu kỳ máy .
+ Hàm không trả về trị . Hàm dùng delay 1 số chu kỳ lệnh cho trước .
VD : delay_cycles ( 25 ) ; // với OSC = 20 Mhz , hàm này delay 5 us
2 / delay_us ( time )
+ Time : là biến số thì = 0 – 255 , time là 1 hằng số thì = 0 -65535 .
+ Hàm không trả về trị .
+ Hàm này cho phép delay khoảng thời gian dài hơn theo đơn vị us .
+ Quan sát trong C / asm list bạn sẽ thấy với time dài ngắn khác nhau , CSS sinh mã khác nhau .
3 / delay_ms (time )
+ Time = 0-255 nếu là biến số hay = 0-65535 nếu là hằng số .
+ Hàm không trả về trị .
+ Hàm này cho phép delay dài hơn nữa .
VD :
Int a = 215;
Delay_us ( a ) ; // delay 215 us
Delay_us ( 4356 ) ; // delay 4356 us
Delay_ms ( 2500 ) ; // delay 2 . 5 s
(Nguồn: TRẦN XUÂN TRƯỜNG)
Chủ Nhật, 26 tháng 2, 2012
Hướng Dẫn CCS Cho PIC - Bài 3: Các Hàm Xử Lý Số, Xử Lý Bit, Delay trong CCS
2/26/2012 07:42:00 SA
hàm delay trong ccs, hàm xử lý bit trong ccs, hàm xử lý số trong pic, hướng dẫn lập trình CCS, hướng dẫn lập trình PIC, Vi Xử Lý PIC
No comments
0 nhận xét:
Đăng nhận xét