Bài này hướng dẫn các bạn về cấu trúc cơ bản của một chương trình khi lập trình cho vi điều khiển PIC , dsPIC với CCS.

programccspic

1.  Khai báo đầu tiên ( Khai báo tiền xử lý ):

Bắt đầu một chương trình viết bằng ngôn ngữ CCS là phần khai báo tiền xử lý:

Đầu tiên là phần khai báo file header: #include <tenchip.h> Ví dụ:  # include <16f887.h>

Khai báo này là gọi file 16f887.h vào chương trình file .h này có sẵn trong thư viện của CCS.

File này thực chất là file dùng để định nghĩa tất cả các tên cũng như định nghĩa các hằng sẽ được dùng trong các hàm chức năng của CCS.

Ví dụ : khi chương trình gọi một hàm Output_high(PIN_B1) có nghĩa là đưa chân RB1 của vi điều khiển lên mức cao thì hàng PIN_B1 được định nghĩa trong file 16F887.h là  #define PIN_B1  49

 Thứ hai là phần khai báo cấu hình cho vi điều khiển: 

Vi điều khiển PIC có thể hoạt động ở nhiều chế độ khác nhau, với mỗi cách cấu hình phần cứng của nó cũng có nhiều chế độ. Các chế độ như vậy được khai báo và dùng sẽ ảnh hưởng đến hoạt động của các khối chức năng, cũng như các chân của vi điều khiển. Vì vậy, đối với mỗi ứng dụng, ta phải khai báo cấu hình cho phù hợp.

Nếu bạn chưa quen khai báo cáu hình thì khi tạo một Project mới bạn dùng Project Wizard sau đó chọn các chức năng cần thiết cho mục đích của bạn thì CCS sẽ tự động đưa ra cấu hình phù hợp.  Các bạn có thể xem bài Tạo project trong CCS

#fuses HS,NOWDT,NOPROTECT

Trong ví dụ trên, khai báo cấu hình cho bộ dao động kiểu HS, không sử dụng chức năng Watchdog Timer, và không có chế độ bảo vệ code.

Thứ ba là phần khai báo tần số của thạch anh:

Chú ý tần số thạch anh này phải phù hợp với thạch anh các bạn dùng trong mạch.

# USE Delay(clock=tần số thạch anh)

Ví dụ: # USE Delay(clock=12000000)// Khai báo dùng thạch anh 12 MHz

Các hàm delay_ms(), delay_us()chỉ dùng được sau khi có khai báo này trong chương trình, khai báo này cũng dùng để tính toán trong việc dùng Timer.

Thứ tư Các khai báo khác:

Ngoài ra, khi sử dụng bất cứ khối chức năng đặc biệt nào trong vi điều khiển PIC ta phải dùng  #USE để khai báo. Các khối chức năng đặc biệt là RS232, PWM, SPI, I2C ..v.v

Ví dụ: #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)

#PRIORITY ints  :  với ints là danh sách các ngắt theo thứ tự ưu tiên thực hiện khi có nhiều ngắt xảy ra đồng thời , ngắt đứng đầu sẽ là ngắt ưu tiên nhất , dùng ngắt nào đưa ngắt đó vô . Chỉ cần dùng nếu dùng hơn 1 ngắt .
VD : #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiên nhất

2. Phần khai báo và sử dụng biến, hằng, mảng :

Sau phần khai báo tiền xử lý là phần khai báo biến toàn cục (nếu có), biến toàn cục là biến được sử dụng trong toàn bộ chương trình, cả chương trình chính và chương trình con. Điều này khác với biến cục bộ là biến được khai báo trong các chương trình con, hàm con, các biến này chỉ được tạo ra và sử dụng trong chính mỗi chương trình khai báo nó.

Ví dụ về khai báo biến :

Int1, short: dạng logic 1,0

Int,Int8,byte: dạng số nguyên 8 bit, nếu khai báo dạng số nguyên 8 bit nếu có dấu thêm signed int8

Int16,long: dạng số nguyên 16 bit

Int32: dạng số nguyên 32 bit

Char: dạng kí tự 8 bit

Float: dạng số thực 32 bit

Ví dụ: int8 n; // Khai báo n là biến số nguyên 8 bit,

Khai báo 1 biến mảng : kích thước tuỳ thuộc khai báo con trỏ trong #device  và loại vi điều khiển:

PIC 14 : Nếu bạn khai báo con trỏ 8 bit : VD: # device *=8  : không gian bộ nhớ chỉ có 256 byte cho tất cả các biến

#device *=16 , không gian bộ nhớ là đầy đủ

PIC 18 : kích thước mảng không giới hạn, xài hết RAM thì thôi .

in8 mang[6]={0,0,0,0,0,0} // Khai báo mảng 8 bit

Khai báo hằng số:

Ví dụ: int16 const heso=5000;

Khai báo mảng hằng số: Nếu vi điều khiển là PIC 14 ( VD :16F877A )  : bạn chỉ được khai báo 1 mảng hằng số  có kích thước tối đa là 256byte .

Nếu vi đuều khiển là PIC 18 : khai báo mảng hằng số thoải mái , không giới hạn kích thước .

Ví dụ: int const mang[5]= {5, 10, 15, 20, 25}

Phạm vi biến : 
 Int8 :0 , 255 (Không dấu)  signed int8 : -128 , 127 

 Int16 : 0 ,65535 (Không dấu)  signed int16 : -32768 to 32767

 Int32 : 0 to 4294967295 (Không dấu) signed int32 :-2147483648 to 2147483647

Cách sử dụng biến : 
Khi sử dụng các phép toán cần lưu ý : sự tràn số , tính toán với số âm , sự chuyển kiểu và ép kiểu .
Bạn có thể ép kiểu , thường là tiết kiệm ram , hay muốn tiết kiệm thời gian tính :

Int8 a =10 , b=300; 
Int16 c ; 
C=  ( int16) a * b ; 
// c= 3000 , a chuyển sang 16 bit , 16bit*8bit => b tự động chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b vẫn là 8 bit .  
Epicviet.com