Một số hàm xử lý trong CCS

Ở đây nói đến một số hàm của trình biên dịch CCS cung cấp để xử lý GPIO cho PIC

I.CÁC HÀM XỬ LÝ GPIO TRONG CCS VÀ VẤN ĐỀ ĐẶT RA.

1.CÁC HÀM XỬ LÝ GPIO TRONG CCS.
Trình biên dịch CCS sẽ cung cấp cho các bạn một số hàm xử lý GPIO cho PIC như sau:

·output_low(pin), output_high(pin): Thiết lập 1 chân vi điều khiển là OUTPUT, điện áp xuất ra là 0V (mức 0) hoặc 5V (mức 1).
Ví dụ:
output_low(PIN_B0); // chân 0 của PORTB xuất ra điện áp 0V (mức logic 0)
output_high(PIN_A0); // chân 0 của PORTA xuất ra điện áp 5V (mức logic 1)

·output_bit(pin,value): Thiết lấp 1 chân vi điều khiển là OUTPUT, mức logic thiết lập là value (0 hoặc 1).
Ví dụ:
output_bit(PIN_B1,0); // chân 1 của PORTB xuất ra mức logic 0 (0V)
output_bit(PIN_C2,1); // chân 2 của PORTC xuất ra mức logic 1 (5V)

·output_x(byte): Thiết lập PORT x là OUTPUT, giá trị xuất ra là byte.
Ví dụ:
output_b(0x35); // giá trị xuất ra ở PORTB là 0x00110101
output_d(0x76); // giá trị xuất ra ở PORTD là 0x01110110
·output_float():

·input(pin)trả về trạng thái của một chân vi điều khiển, giá trị trả về có kiểu bit (0 hoặc 1).
Ví dụ:
if(input(PIN_C5)) output_b(0xFF);
// nếu chân 5 của PORTC ở mức cao thì PORTB xuất ra giá trị 0xff
if(!input(PIN_C5)) output_b(0x00);
// nếu chân 5 của PORTC ở mức thấp thì PORTB xuất ra giá trị 0x00

·input_x(): trả về trạng thái của PORT x, giá trị trả về là 1 byte.
Ví dụ:
int8 DATA;
DATA = input_a(); // biến DATA sẽ chứa giá trị trạng thái của PORTA

·port_b_pullups(value): Với value = 1 àthiết lập điện trở kéo lên cho PORTB khi sử dụng là chức năng INPUT (đối với 16F877A thì chỉ có PORTB có điện trở nội kéo lên).

·set_tris_x(byte): Thiết lập hướng IN/OUT cho PORT x trong đó 0: OUTPUT, 1: INPUT.
Ví dụ:
set_tris_a(0xF0); // chân 0,1,2,3 của PORTA là OUTPUT
// chân 4,5,6,7 của PORTA là INPUT

2.ĐẶT VẤN ĐỀ.
Với các hàm xử lý I/O trong CCS như đã nói ở trên, đối với những bạn từ đầu nghiên cứu thẳng vào PIC thì không có vấn đề gì vì chức năng các hàm khá rõ ràng. Tuy nhiên, với những ai từ đầu đã nghiên cứu qua 8051, AVR thì các hàm GPIO của PIC khá mới và tạo cảm giác khó khăn khi lập trình. Mặt khác, khi có yêu cầu chuyển đổi một Project được viết trên AVR, 8051 sang PIC và ngược lại thì việc cấu hình lại I/O là một việc mất thời gian, đôi khi dẫn đến sai sót.
Vậy để giải quyết những vấn đề đặt ra ở trên, mình sẽ hướng dẫn các bạn tạo ra một thư viện để có thể trực tiếp đặt tên và quản lý các thanh ghi I/O của PIC, cụ thể ở đây là thư viện MH_16F877A cho PIC 16F877A, qua đó giúp cho việc cấu hình I/O với PIC dễ nhìn và gần giống với AVR, 8051.

II.MỘT SỐ CHỈ THỊ TIỀN XỬ LÝ QUAN TRỌNG.
Trước khi đi vào tìm hiểu thư viện MH_16F877A, các bạn cần nắm rõ khái niệm cũng như cách thức khai báo của một số chỉ thị tiền xử lý trong CCS.
1.#byte <tên biến> = <địa chỉ thanh ghi>
Với chỉ thị tiền xử lý này, khi cần truy xuất xử lý thanh ghi có địa chỉ<địa chỉ thanh ghi> bạn chỉ cần sử dụng <tên biến>mà không tốn thêm không gian bộ nhớ của vi điều khiển.
Địa chỉ các thanh ghi I/O trong PIC16F877A:

PORTx: thanh ghi dữ liệu.

TRISx: thanh ghi hướng.
2.#bit <tên biến> = <địa chỉ thanh ghi>.<vị trí bit trong thanh ghi>
Với chỉ thị này, khi cần tác động xử lý đến 1 bit bất kỳ thuôc một thanh ghi bất kỳ, bạn chỉ cần sử dụng <tên biến> mà không tốn thêm không gian bộ nhớ của vi điều khiển.
3.#define <tên thay thế> <chuỗi hoặc số>
Khi sử dụng define thì những nơi xuất hiện <chuỗi hoặc số> có thể thay thế bằng <tên thay thế>. Việc sử dụng tiền xử lý này giúp bạn có thể thay đổi dễ dàng các thống số cố định trong project bằng cách thay đổi <chuỗi hoặc số> mà không phải đi chỉnh sửa lại toàn bộ trong chương trình.
4.Ví Dụ
Để giúp các bạn hiểu rõ hơn 3 chỉ thị tiền xử lý trên, mình sẽ đưa ra ví dụ cụ thể sau, sử dụng PIC 16F877A:

#byte PORTA = 0x05

#byte DDRA = 0x85

 

#bit PORTA0 = PORTA.0

#bit DDRA0 = DDRA.0

 

#define LED PORTA0

 

DDRA0 = 0;    // Pin 0 của PORTA là OUTPUT

LED = 1;        // Giá trị xuất ra là 5V (mức logic 1)

While(TRUE)

{

            LED =~LED;  // Đảo trạng thái Pin 0

            Delay_ms(1000);

}

Ở ví dụ này:
ØVới chỉ thị #byte: PORTA, DDRA sẽ là thanh ghi dữ liệu và thanh ghi hướng I/O (thay vì PORTA và TRISA).
ØVới chỉ thị #bit: PORTA0, DDRA0 sẽ là bit 0 trong 2 thanh ghi PORTA, DDRA.
ØVới chỉ thị #define: nơi nào có LED thì hiểu đấy là PORTA0 tức là bit 0 của thanh ghi PORTA.