[VI ĐIỀU KHIỂN PIC] TẬP LỆNH CCS C CHO PIC16F877A - BeeLab

Sunday, June 11, 2017

[VI ĐIỀU KHIỂN PIC] TẬP LỆNH CCS C CHO PIC16F877A

I. GIỚI THIỆU VỀ TRÌNH DỊCH CCS C:
- CCS là trình biên dịch dùng ngôn ngữ C lập trình cho VĐK. Đây là ngôn ngữ lập trình đầy sức mạnh, giúp bạn nhanh chóng trong việc viết chương trình hơn là Assembly
- CCS chứa rất nhiều hàm phục vụ cho mọi mục đích và có rất nhiều cách lập trình mà cho cùng 1 vấn đề với tốc độ thực thi và độ dài chương trình khác nhau. Sự tối ưu là do kĩ năng lập trình của mỗi người
- CCS cung cấp các công cụ tiện ích giám sát hoạt động chương trình như:
  • C/ASM list: cho phép m$ ASM của file bạn biên dịch , giúp bạn quản lý và nắm rõ cách thức nó được sinh ra , là công cụ rất quan trọng giúp bạn có thể gỡ rối chương trình
  • SYMBOL: hiển thị bộ nhớ cấp phát cho từng biến , giúp bạn quản lý bộ nhớ các biến của của chương trình
  • CALLTREE: hiển thị phân bổ bộ nhớ

II. CHỈ THỊ TIỀN XỬ LÝ:
1) #include:
- Cú pháp: 
#include<filename>
Filename: tên file cho thiết bị *.h, *.c . Chỉ định đường dẫn cho trình biên địch, luôn phải có để khai báo chương trình viết cho VĐK nào và phảI luôn đặt ở dòng đầu tiên
VD: #include<16F877A.H>
2) #bit:
- Cú pháp: 
bit name = x.y
Name: tên biến
X: biến C(8,16,32…bit) hay hắng số địa chỉ thanh ghi
Y: vị trí của bit trong x
Tạo biến 1bit đặt ở byte x vị trí y tiện dùng kiểm tra hay gán giá trị cho thanh ghi
VD : #Bit TMR1IF = 0x0B.2;
3) #byte :
- Cú pháp: 
#byte name = x
Name: tên biến
X:địa chỉ
Gán tên biến name cho địa chỉ x , name thường dùng để gán cho các thanh ghi
VD : #Byte portb = 0x06;
4) #define:
- Cú pháp: 
#define name text
Name: tên biến
Text : chuỗi hay số
VD : #Define A 12345
5) #use:
- Cú pháp:
#use delay(clock = speed)
Speed: tốc độ dao động của thạch anh
Có chỉ thị này chúng ta mới dùng được hàm delay_ms hoặc delay_us
VD: #use delay(clock = 4000000);
6) #use fast_io
- Cú pháp: 
#use fast_io(port)
Port : các cổng vào ra của PIC( từ A-G)
Dùng cái này chúng ta có thể điều chỉnh các port với chỉ 1 lệnh
VD: # use fast_io(a);
III. Các hàm delay:
1) 
delay_ms(time)
Time: giá trị thời gian cần tạo trễ
VD : delay_ms(1000); // trễ 1s
2) 
delay_us(time)
Time: giá trị thời gian cần tạo trễ
VD : delay_us(1000); // trễ 1ms
Hàm delay này không sử dụng bất cứ Timer nào cả mà chỉ là 1 nhóm lệnh vô nghĩa thực hiện trong khoảng thời gian bạn đ$ định sẵn
Trước khi sử dụng các hàm này cần phảI khai báo tiền định 
#use_delay(….)
IV. Các hàm vào ra trong CCS C
1) 
Output_low(pin) – Output_high(pin)
Thiết lập mức 0v(low) hoặc 5v(high) cho các chân của PIC
VD : output_low(pin_D0) ;
2) 
Output_bit(pin,value)
Pin: tên chân của PIC
Value: giá trị 0 hay 1
VD: output_bit(pin_C0,1);
3) 
Output_X(value)
X: tên các port trên chíp
Value: giá trị 1 byte
VD: output_B(255);
4) 
Input_X( )
X: tên các port trên chip
Hàm này trả giá trị 8 bit là giá trị hiện hữu của port đó
VD: n = input_A( );
5) 
Set_tris_X(value)
X: tên chân (A – G)
Value: là giá trị 8 bít điều khiển vào ra cho các chân của chip
1: nhập dữ liệu 0: xuất dữ liệu
VD: set_tris_B(0); // tất cả các chân của portb là ngõ ra
V. Hàm sử dụng trong các Timer:
1. TIMER0: 
SETUP_TIMER_0(mode); 
Mode: là một trong 2 constant (nếu dùng 2 thì chèn dấu “ | ” ở giữa) đ-ợc định nghĩa trong file <16F877A.h>
- RTCC_INTERNAL: chọn xung dao động nội
- RTCC_EXT_H_TO_L: chọn kiểu tác động là cạch xuống của xung 
- RTCC_EXT_L_TO_H: chọn kiểu tác động là cạch lên của xung
- RTCC_DIV_2 : Sử dụng bộ chia tần với tỉ lệ 1:2 
- RTCC_DIV_4 : Sử dụng bộ chia tần với tỉ lệ 1:4
- RTCC_DIV_8 : Sử dụng bộ chia tần với tỉ lệ 1:8
- RTCC_DIV_16 : Sử dụng bộ chia tần với tỉ lệ 1:16
- RTCC_DIV_32 : Sử dụng bộ chia tần với tỉ lệ 1:32
- RTCC_DIV_64 : Sử dụng bộ chia tần với tỉ lệ 1:64
- RTCC_DIV_128 : Sử dụng bộ chia tần với tỉ lệ 1:128
- RTCC_DIV_256 : Sử dụng bộ chia tần với tỉ lệ 1:256
setup_COUNTER_0 (rtcc_state , ps_state)
  Rtcc_state: 
- RTCC_INTERNAL: chọn xung dao động nội
- RTCC_EXT_H_TO_L: chọn kiểu tác động là cạch xuống của xung 
- RTCC_EXT_L_TO_H: chọn kiểu tác động là cạch lên của xung
     Ps_state:
- RTCC_DIV_2 : Sử dụng bộ chia tần với tỉ lệ 1:2
- RTCC_DIV_4 : Sử dụng bộ chia tần với tỉ lệ 1:4
- RTCC_DIV_8 : Sử dụng bộ chia tần với tỉ lệ 1:8
- RTCC_DIV_16 : Sử dụng bộ chia tần với tỉ lệ 1:16
- RTCC_DIV_32 : Sử dụng bộ chia tần với tỉ lệ 1:32
- RTCC_DIV_64 : Sử dụng bộ chia tần với tỉ lệ 1:64
- RTCC_DIV_128 : Sử dụng bộ chia tần với tỉ lệ 1:128
- RTCC_DIV_256 : Sử dụng bộ chia tần với tỉ lệ 1:256
set_timer0(value)
xác định giá trị 8 bit ban đầu của Timer0(value=TMR0)
GET_TIMER0( ) 
trả lại giá trị 8 bit cho Timer0 
2. TIMER1:
 SETUP_TIMER_1(mode); 
Mode: có thể kết hợp với nhau bằng đấu “ | ”
- T1_DISABLED : tắt hoạt động của Timer1
- T1_INTERNAL : sử dụng giao động nội
- T1_EXTERNAL : chọn xung clock trên chân RC0 
- T1_EXTERNAL_SYNC : chọn xung lock ngoài đồng bộ
- T1_DIV_BY_1 : Sử dụng bộ chia tần với tỉ lệ 1:1  
- T1_DIV_BY_2 : Sử dụng bộ chia tần với tỉ lệ 1:2 
- T1_DIV_BY_4 : Sử dụng bộ chia tần với tỉ lệ 1:4
- T1_DIV_BY_8 : Sử dụng bộ chia tần với tỉ lệ 1:8
set_timer0(value)
xác định giá trị 8 bit ban đầu của Timer1(value=TMR1)
GET_TIMER0( )
trả lại giá trị 8 bit cho Timer1
3. TIMER2:  
SETUP_TIMER_1(mode , period , postcale);
Mode: có thể kết hợp với nhau bằng đấu “ | ”
- T2_DISABLED: tắt hoạt động của Timer2    
- T2_DIV_BY_1: Sử dụng bộ chia tần với tỉ lệ 1:1 
- T2_DIV_BY_4: Sử dụng bộ chia tần với tỉ lệ 1:4
- T2_DIV_BY_16: Sử dụng bộ chia tần với tỉ lệ 1:16
Period: số nguyên từ 0_255 xác định giá trị xung reset
Postcale: xác định số reset trước khi ngắt
set_timer2(value);
xác định giá trị 8 bit ban đầu của Timer2(value=TMR2)
GET_TIMER2( )
trả lại giá trị 8 bit cho Timer2
VI. Các hàm phục vụ ngắt (Interupt)
enable_interrupts( level)
Level:
+GLOBAL : cho phép ngắt toàn cục
+INT_TIMER0 : ngắt do tràn Timer0
+INT_TIMER1 : ngắt do tràn Timer1
+INT_TIMER2 : ngắt do tràn Timer2
+INT_RB : có thay đổi 1 trong các chân RB4  RB7
+INT_EXT : ngắt ngoài trên chân RB0
Chú ý : sau khi khai báo trên thì để vào chương trình ngắt cần khai báo
#INT_.....
VD:
#INT_TIMER1
void ngắt_Timer1()
{    
      //chương trình ngắt viết ở đây
}
VII. Các hàm điều chế độ rộng xung (CCP-PWM)
SETUP_CCPx(mode);
Dùng trước hết để thiết lập chế độ hoạt động hay vô hiệu hoá tính năng CCP
x: tên chân CCP trên chip (với PIC 16F877A đó là các chân RC1-CCP2 ; RC2-CCP1)
Mode: CCP_PWM (bật chế độ PWM)
SET_CCPx_DUTY(value)
X: tên chân CCP trên chip
Value: giá trị 8 hay 16 bit
- Nó ghi 10 bit giá trị vào thanh ghi CCPx , nếu value chỉ có 8 bit thì nó sẽ dịch thêm 2 bit nữa để đủ 10 bit nạp vào CCPx
- Tuỳ độ phân giả mà giá trị của value không phảI lúc nào cũng đạt tới giá trị 1023