gia thiet bi ve sinh chinh hang, doc truyen truyện tranh cười Việt Nam doc truyen ma kinh di truyen tinh yeu lãng mạn, tin tuc onlinethiet bi nha ve sinh Việt Nam - Voi hoa sen

kiem tien online

[Lập trình PIC] Các Hàm Xử Lý Số, Xử Lý Bit, Delay trong CCS

Được đăng bởi NetVN Chủ Nhật, 26 tháng 2, 2012 0 nhận xét


Bài trước:

+Hướng dẫn lập trình cho PIC bằng CCS ver3.242

Bài sau:
+[Lập trình PIC] Bộ Chuyển Đổi ADC - Các Hàm I/O


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

Lưu trữ bài viết

Người theo dõi

Thống kê truy cập