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



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)

0 nhận xét:

Đăng nhận xét