Trình biên dịch cho PIC18F

Một phần của tài liệu Ứng dụng mạng truyền thông RS-485 điều khiển nhà thông minh (Trang 55 - 63)

CHƯƠNG IV: GIỚI THIỆU VỀ VI ĐIỀU KHIỂN PIC18F452 4.1 Giới thiệu chung

4.3Trình biên dịch cho PIC18F

4.3.1 Tổng quan về ngôn ngữ lập trình C và CCS

v Vì sao ta sử dụng ngôn ngữ C

Sự ra đời của một loại vi điều khiển đi kèm với việc phát triển phần mềm ứng dụng cho việc lập trình cho con vi điều khiển đó. Vi điều khiển chỉ hiểu và làm việc với hai con số 0 và 1. Ban đầu để lập trình cho Vi điều khiển là làm việc với dãy các con số 0 và 1. Sau này khi kiến trúc của Vi điều khiển ngày càng phức tạp, số luợng thanh ghi lệnh nhiều lên, việc lập trình với dãy các số 0 và 1 không còn phù hợp nữa, đòi hỏi ra đời một ngôn ngữ mới thay thế. Và ngôn ngữ lập trình Assembly đã ra đời giúp người lập trình làm việc dễ dàng với nhiều loại vi điều khiển. Ưu điểm của ngôn ngữ lập trình Assembly là giúp người học nắm chắc phần cứng nhưng nhược điểm của nó là chương trình dài dòng, khó hiểu. Và để giải quyết những nhược điểm này thì người ta hay sử dụng ngôn ngữ lập trình C.

Sau này khi ngôn ngữ C ra đời, nhu cầu dùng ngôn ngữ C để thay cho ASM trong việc mô tả các lệnh lập trình cho Vi điều khiển một cách ngắn gọn và dễ hiểu hơn đã dẫn đến sự ra đời của nhiều chương trình soạn thảo và biên dịch C cho Vi điều khiển : Keil C, HT‐PIC, MikroC, CCS…

Tuy nhiên trong đề tài này chúng em chọn ngôn ngữ lập trình C và trình biên dịch CCS là ngôn ngữ lập trình cho PIC 18F452 vì CCS là một công cụ lập trình C mạnh cho Vi điều khiển PIC. Những ưu và nhược điểm của CCS sẽ được đề cập đến trong các phần dưới đây.

v Giới thiệu về CCS

CCS là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng Microchip. Chương trình là sự tích hợp của 3 trình biên dich riêng biết cho 3 dòng PIC khác nhau đó là:

‐ PCB cho dòng PIC 12‐bit opcodes

‐ PCM cho dòng PIC 14‐bit opcodes

‐ PCH cho dòng PIC 16 và 18‐bit

Tất cả 3 trình biên dich này đuợc tích hợp lại vào trong một chương trình bao gồm cả trình soạn thảo và biên dịch là CCS.

Giống như nhiều trình biên dịch C khác cho PIC, CCS giúp cho người sử dụng nắm bắt nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án. Các chương trình điều khiển sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng ngôn ngữ lạp trình cấp cao - Ngôn ngữ C.

Tài liệu hướng dẫn sử dụng có rất nhiều, nhưng chi tiết nhất chính là bản Help đi kèm theo phần mềm (tài liệu Tiếng Anh). Trong bản trợ giúp nhà sản xuất đã mô tả rất nhiều về hằng, biến, chỉ thị tiền xủa lý, cấu trúc các câu lệnh trong chương trình, các hàm tạo sẵn cho người sử dụng…

Để viết một chương trình cho PIC ta có thể tham khảo đoạn code mẫu sau:

Chương trình mẫu cho PIC18F452

//=================================================

#include <18F452.h> #device *=16 ADC=8

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) #use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)

#int_xxx // Khai bao chuong trinh ngat xxx_isr() { …….. } void Ten_chuong_trinh_con(Ten_Bien) { ……… } void main() { ……… }

Mô tả đoạn chương trình

- #include 18f452.h : Đi kèm chương trình dịch, chứa khai báo về các thanh ghi trong mỗi con PIC, dùng cho việc cấu hình cho PIC.

- #device *=16 ADC = 10: Khai báo dùng con trỏ 8 hay 16 bit, bộ ADC là 8 hay 10 bit

- #FUSES NOWDT, HS: Khai báo về cấu hình cho PIC - #use delay(clock=20000000): Tần số thạch anh sử dụng

- #use i2c(master, SDA=PIN_C4,…): Khai báo dùng I2C, chế độ hoạt động - #include <tên_file.c>: Khai báo các files thư viện được sử dụng ví dụ LCD_lib_4bit.c

- #INT_xxx : Khai báo địa chỉ chương trình phục vụ ngắt

- Void tên_chương_trình (tên_biến) {}: Chương trình chính hay chương trình con

Ø Tóm lại để viết chương trình CCS cần các bước sau:

- Đầu tiên là các chỉ thị tiền xử lý : # . . . có nhiệm vụ báo cho CCS cần sử dụng những gì trong chương trình C như dùng VXL gì, có dùng giao tiếp PC qua cổng COM không, có dùng ADC không, có dùng DELAY không, có biên dịch kèm các file hay không . . .

- Các khai báo biến . (adsbygoogle = window.adsbygoogle || []).push({});

- Các hàm con do ta viết : xu_ly_ADC () , . . .

- Các hàm phục vụ ngắt theo sau bởi 1 chỉ thị tiền xử lý cho biết dùng ngắt nào. - Chương trình chính .

Một chương trình C có thể được viết luôn tuồn trong hàm main (), nếu chúng rất ngắn và đơn giản. Nhưng khi chương trình bắt đầu dài ra, phức tạp lên 1 chút thì phải phân chia trong các hàm con.

v Cách sử dụng biến và hàm, các cấu trúc lệnh, chỉ thị tiền xử lý i. Khai báo và sử dụng biến, hằng, mảng.

Khai báo biến, hằng, mảng:

- Khai báo biến

Các loại biến sau được hỗ trợ:

int1 số 1 bit = true hay false ( 0 hay 1) int8 số nguyên 1 byte ( 8 bit)

int16 số nguyên 16 bit int32 số nguyên 32 bit char ký tự 8 bit

float số thực 32 bit

short mặc định như kiểu int1 byte mặc định như kiểu int8

int mặc định như kiểu int8 long mặc định như kiểu int16

Thêm signed hoặc unsigned phía trước để chỉ đó là số có dấu hay không dấu. Khai báo như trên mặc định là không dấu. 4 khai báo cuối không nên dùng vì dễ nhầm lẫn. Thay vào đó nên dùng 4 khai báo đầu.

- Khai báo hằng

Ví dụ : Int8 const a=231;

- Khai báo 1 mảng hằng số :

Ví dụ: Int8 const a[5] = { 3,5,6,8,6 }; 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.

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.

Phạm vi sử dụng biến: Giống như C trong lập trình CSS. Biến có thể được khai báo như toàn cục hay cục bộ.

Biến khai báo trong hàm sẽ là cục bộ và sẽ chỉ dùng được trong hàm đó, kể cả trong hàm main()

Ngoài ra còn có thể khai báo ngay trong 1 khối lệnh, và cũng chỉ tồn tại trong khối lệnh đó.

ii. Các cấu trúc lệnh: ( statement ).

Bảng 4.12. Sơ đồ cấu trúc lệnh iii. Chỉ thị tiền xử lý.

Gồm các chỉ thị sau

- #ASM và #ENDASM: Cho phép đặt 1 đoạn mã ASM giữa 2 chỉ thị này, Chỉ

đặt trong hàm.

- #INCLUDE

Cú pháp : #include <filename> Hay #include “ filename” (adsbygoogle = window.adsbygoogle || []).push({});

Filename: tên file cho thiết bị *.h, *.c. Nếu chỉ định file ở đường dẫn khác thì thêm đường dẫn vào. Luôn phải có để khai báo chương trình viết cho VĐK nà , và luôn đặt ở dòng đầu tiên.

- #BIT, #BYTE, #LOCATE và # DEFINE#BIT id = x . y #BIT id = x . y

Với id: tên biến

x: biến C (8,16,32,…bit) hay hằng số địa chỉ thanh ghi. y : vị trí bit trong x

Chức năng: tạo biến 1 bit đặt ở byte x vị trí bit y, tiện dùng kiểm tra hay gán trị cho bit thanh ghi.

#BYTE id = x

x: địa chỉ id : tên biến C

Chức năng: Gán tên biến id cho địa chỉ (thanh ghi ) x, sau đó muốn gán hay kiểm tra địa chỉ x chỉ cần dùng id. Không tốn thêm bộ nhớ, tên id thường dùng tên gợi nhớ chức năng thanh ghi ở địa chỉ đó.

# LOCATE id = x

Chức năng: Làm việc như #byte nhưng có thêm chức năng bảo vệ không cho CCS sử dụng địa chỉ đó vào mục đích khác.

# DEFINE id text

Text: chuỗi hay số. Dùng định nghĩa giá trị. Ví dụ: #define a 12345

- # DEVICE

# DEVICE chip option

Chip: tên vi điều khiển sử dụng option: toán tử tiêu chuẩn theo từng chip: * = 5 dùng pointer 5 bit ( tất cả PIC )

* = 8 dùng pointer 8 bit ( PIC14 và PIC18 ) * = 16 dùng pointer 16 bit ( PIC14 ,PIC 18)

ADC = x sử dụng ADC x bit ( 8 , 10 ,… bit tuỳ chip ), khi dùng hàm read_adc( ), sẽ trả về giá trị x bit .

HIGH_INTS = TRUE: Cho phép dùng ngắt ưu tiên cao.

- # ORG

# org start, end # org segment #org start, end { }

- # USE

# USE delay ( clock = speed )

Speed: giá trị OSC mà bạn dùng. Ví dụ: dùng thạch anh dao động 40Mhz thì: #use delay( clock = 40000000)

Chỉ khi có chỉ thị này thì trong chương trình bạn mới được dùng hàm delay_us ( ) và delay_ms( ).

#USE fast_io ( port)

Port: là tên port: từ A-G ( tuỳ chip )

Dùng cái này thì trong chương trình khi dùng các lệnh io như output_low(…) nó sẽ set chỉ với 1 lệnh, nhanh hơn so với khi không dùng chỉ thị này.

Trong hàm main ( ) bạn phải dùng hàm set_tris_x( ) để chỉ rõ chân vào ra thì chỉ thị trên mới có hiệu lực, không thì chương trình sẽ chạy sai .

#USE I2C ( options )

Thiết lập giao tiếp I2C. (adsbygoogle = window.adsbygoogle || []).push({});

Option bao gồm các thông số sau, cách nhau bởi dấu phẩy: Master: chip ở chế độ master

Slave: chip ở chế độ slave SCL = pin: chỉ định chân SCL SDA = pin: chỉ định chân SDA

ADDRESS = x: chỉ định địa chỉ chế độ slave FAST: chỉ định FAST I2C

SLOW: chỉ định SLOW I2C

FORCE_HW: sử dụng chúc năng phần cứng I2C ( nếu chip hỗ trợ )

NOFLOAT_HIGH: không cho phép tín hiệu ở float high (), tín hiệu được lái từ thấp lên cao.

Option bao gồm :

BAUD = x: thiết lập tốc độ baud rate : 19200 , 38400 , 9600 , . . . PARITY = x: x= N ,E hay O , với N : không dùng bit chẵn, lẻ . XMIT = pin : set chân transmit ( chuyển data)

RCV = pin : set chân receive (nhận data).

iv. Một số chỉ thị tiền xử lý khác

#CASE: cho phép phân biệt chữ hoa.

#OPT n: Với n=0 – 9: chỉ định cấp độ tối ưu mã, không cần dùng thì mặc định là

9.

#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ào.

v. Một số vấn đề quan trọng khác .

Một phần của tài liệu Ứng dụng mạng truyền thông RS-485 điều khiển nhà thông minh (Trang 55 - 63)