Thứ Hai, 3 tháng 12, 2018

CHƯƠNG 2 : CÁC HÀM XỬ LÝ SỐ, XỬ LÝ BIT, DELAY


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 ( ) :
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.
II / CÁC HÀM XỬ LÝ BIT VÀ CÁC PHÉP TOÁN :
Bao gồm các hàm sau :
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 ()  
3 / Bit_clear ( var ,bit ) , Bit_set ( varbit )
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 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 )
 với 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 )
 với 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 )
 với 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

Không có nhận xét nào:

Đăng nhận xét

Bài đăng mới nhất

Valdes Fernando - Microcontrollers Applications With Pic

Bài đăng phổ biến