[Part1] Liệt kê các lệnh, các hàm của CCS và Ý nghĩa

v Chỉ định các tiền xử lý:
Phần này sẽ chỉ định các tiền xử lý được sử dụng khi biên dịch. Các tiền xử lý được bắt đầu bằng dấu #.
Ví dụ: khai báo các tiền xử lý, chi tiết về từng tiền xử lý sẽ được trình bày chi tiết sau.
# include // Chỉ định tiền xử lý include
# device
·       Tiền xử lý gồm 55 lệnh chi tiết như sau:
#DEFINE ID STRING.
#ELSE.
#ENDIF.
#ERROR.
#IF expr.
#IFDEF id.
#INCLUDE "FILENAME" .
#INCLUDE <FILENAME> .
#LIST.
#NOLIST.
#PRAGMA cmd.
#UNDEF id.
#INLINE
#INT_DEFAULT
#INT_GLOBAL
#INT_xxx
#SEPARATE
__DATE__
__DEVICE__
__FILE__
__LINE__
__PCB__
__PCM__
__PCH__
__TIME__
#DEVICE CHIP
#ID NUMBER
#ID "filename"
#ID CHECKSUM
#FUSES options
#SERIALIZE
#TYPE type=type
#USE DELAY CLOCK
#USE FAST_IO
#USE FIXED_IO
#USE I2C
#USE RS232
#USE STANDARD_IO
#ASM
#BIT id=const.const
#BIT id=id.const
#BYTE id=const
#BYTE id=id
#LOCATE id=const
#ENDASM
#RESERVE
#ROM
#ZERO_RAM
#BUILD
#FILL_ROM
#CASE
#OPT n
#PRIORITY
#ORG
#IGNORE_WARNINGS

·       #ASM và #ENDASM
Đây là cặp lệnh đi kèm với nhau để cho phép chèn đoạn mã dạng assembly vào chương trình.
Cú pháp của cặp lệnh này như sau:
#asm
mã assembly
# endasm
·       #BIT
+ Cú pháp:
#bit id = x.y
id là tên hợp lệ trong C, x là hằng số hoặc biến trong C, y là hằng số từ 0 -7
+ Mục đích:
Tạo một biến mới (1 bit) trong C và đặt nó vào trong bộ nhớ tại byte x, bit y. Lệnh này thường được sử dụng để truy xuất trực tiếp từ C tới một bit trong thanh ghi chức năng đặc biệt.
·       # BUILD
+ Cú pháp:
#build(segment =address)
#build(segment = address,segment = address)
#build(segment =start:end)
#build(segment = start: end, segment = start: end)
Trong đó: segment là một đoạn bộ nhớ tiếp theo mà đã được ấn định vị trí (Bộ nhớ Reset, ngắt).
Address là địa chỉ của bộ nhớ ROM trong MCU, start và end được sử dụng để xác định địa chỉ
đấu và cuối của vùng nhớ được dùng.
+ Mục đích:
Đối với các MCU PIC18XXX dùng bộ nhớ ngoài hoặc các MCU PIC 18XXX không có bộ nhớ ROM bên trong, lệnh này cho phép biên dịch trực tiếp để sử dụng bộ nhớ ROM.
·       #BYTE
+ Cú pháp:
#byte id = x
Trong đó: id là tên hợp lệ trong C, x là một biến trong C hoặc là hằng số.
+ Mục đích: Nếu id đã được xác định như một biến hợp lệ trong C thì lệnh này sẽ đặt biến C vào trong bộ nhớ tại địa chỉ x, biến C này không được thay đổi khác với định nghĩa ban đầu. Nếu id là biến chứ biết thì một biến C mới sẽ được tạo và đặt vào bộ nhớ tạo địa chỉ x.
·       #DEFINE
+ Cú pháp:
#define id text hoặc #define id(x,y...) text
Trong đó: id là một định nghĩa tiền xử lý. text là đoạn văn bản bất kỳ. x,y là một định nghĩa tiền xử lý nội đặt cách nhau bởi dấu phẩy
+ Mục đích:
Định nghĩa một hằng hay một tham số thường sử dụng trong chương trình
·       # DEVICE
+ Cú pháp:
#device chip options
Trong đó: chip là tên bộ vi xử lý ( ví dụ như: 16f877), Options là các toán tử tiêu chuẩn được quy định trong mỗi chip. Các option bao gồm:
· *=5: Sử dụng con trỏ 5 bit (Cho tất cả các MCU)
· *=8: Sử dụng con trỏ 8 bit (Cho MCU 14 và 16 bit)
· *=16: Sử dụng con trỏ 16 bit (Cho MCU 14 bit)
· ADC=xd9: x là số bit trả về sau khi gọi hàm read_adc()
· ICD=TRUE: Tạo ra mã tương ứng Microchips ICD debugging hardware.
+ Mục đích:
Định nghĩa chip sử dụng. Tất cả các chương trình đều phải sử dụng khai báo này nhằm định nghĩa chân trên chip và một số định nghĩa khác của chip.
·       __ DEVICE__
+ Mục đích:
Định nghĩa này được dùng để nhận dạng số cơ bản của MCU đang dùng (từ # divice).
Thông thường thì số cơ bản là số nằm ngay sau phần chữ trong mã số của MCU. Ví dụ như MCU đang dùng là loại PIC16C71 thì số cơ bản là 71.
·       #FUSE
+ Cú pháp:
#fuse option
Trong đó option thay đổi tuỳ thuộc vào thiết bị. Danh sách các option hợp lệ được đặt tại đầu của file.h trong phần chú thích của mỗi thiết bị.
+ Mục đích:
Định nghĩa này được dùng để chỉ ra fuses nào được đặt vào MCU khi lập trình cho nó. Chỉ dẫn này không ảnh hưởng gì đến quá trình biên dịch như nó được xuất ra file output.
·       #ID
+ Cú pháp:
#ID number 16
#ID number, number, number, number
#ID "filename"
#ID CHECKSUM
Trong đó Number16, 4 lần lượt là các số 16 bit và 4 bit, filename là tên file có thực trong bộ nhớ máy tính, checksum à một loại từ khóa.
+ Mục đích:
Định nghĩa này được dùng để chỉ ra từ id nào được lập trình vào MCU. Chỉ dẫn này không ảnh hưởng gì đến quá trình biên dịch như nó được xuất ra file output.
·       #IF, #ELSE, #ELIF, #ENDIF
+ Cú pháp:
#if biểu thức
phát biểu
#elif biểu thức
phát biểu
#else
phát biểu
#endif
+ Mục đích:
Kiểm tra điều kiện của biểu thức, nếu điều kiện là đúng thì thực hiện phát biểu ở hàng ngay sau đó còn ngược lại nếu biểu thức là sai thì thực hiện phát biểu ngay sau #else.
·       #INCLUDE
+ Cú pháp:
#include <filename> hoặc #include "filename"
Trong đó filename là tên file hợp lệ trong PC.
+ Mục đích:
Bộ tiền xử lý sẽ sử dụng thông tin cần thiết được chỉ ra trong filename trong quá trình biên dịch để thực thi lệnh trong chương trình chính. Tên file nếu đặt trong dấu “ ” sẽ được tìm kiếm trước tiên, nếu đặt trong dấu <> sẽ được tìm sau cùng. Nếu đường dẫn không chỉ rõ, trình biên dịch sẽ thực hiện tìm kiếm trong thư mục chứa project đang thực hiện. Khai báo #include <> được sử dụng hầu hết trong các chương trình để khai báo thiết bị (IC) đang sử dụng cũng như cần kế thừa kết quả một chương trình đã có trước đó.
·       #INLINE
+ Cú pháp:
#inline
+ Mục đích:
Thông báo cho trình biên dịch thực thi tức thời hàm sau khai báo #inline. Tức là sẽ copy nguyên bản code đặt vào bất cứ nơi nào mà hàm được gọi. Điều này sẽ tăng tốc độ xử lý và khoảng trống trong vùng nhớ stack. Nếu không có chỉ thị này, trình biên dịch sẽ lựa chọn thời điểm tốt nhất để thực thi procedures INLINE.
·       #INT_xxxx
+ Cú pháp:
#INT_AD                              Hoàn tất chuyển đổi ADC
#INT_ADOF                     Hết thời gian chuyển đổi ADC
#INT_BUSCOL                Đụng Bus
#INT_BUTTON                Nút nhấn
#INT_CCP1                          CCP1
#INT_CCP2                          CCP2
#INT_COMP                        Phát hiện so sánh
#INT_EEPROM                    Ghi EEPROM hoàn tất
#INT_EXT                            Ngắt ngoài
#INT_EXT1                          Ngắt ngoài 1
#INT_EXT2                         Ngắt ngoài 2
#INT_I2C I2C                      Ngắt(chỉ trong 14000)
#INT_LCD                  LCD tích cực
#INT_LOWVOLT            Phát hiện điện áp thấp
#INT_PSP                            Nhận dữ liệu từ cổng song song
#INT_RB Port B              Thay đổi của bit B4-B7
#INT_RC Port C              Thay đổi của bit C4-C7
#INT_RDA RS232            Đang nhận dữ liệu qua cổng nối tiếp
#INT_RTCC                      Tràn timer 0
#INT_SSP                            SPI hoặc I2C đang làm việc
#INT_TBE RS232            Bộ đệm truyền rỗng
#INT_TIMER0                     Timer 0 tràn
#INT_TIMER1                    Timer 1 tràn
#INT_TIMER2                     Timer 2 tràn
#INT_TIMER3                     Timer 3 tràn
+ Mục đích:
INT_xxxx được dùng để chỉ dẫn cho biết hàm đi kém là một hàm phục vụ ngắt. Hàm phục vụ ngắt có thể là một hàm không có tham số. Không phải các chỉ dẫn trên dùng được cho tất cả các MCU mà có thể có một số MCU chỉ sử dụng một số chỉ dẫn mà thôi.
·       INT_DEFAULT
+ Cú pháp:
#int_default
+ Mục đích:
Hàm theo sau chỉ thị này sẽ được gọi nếu có xung kích ngắt và sẽ không có cờ ngắt nào được set.
Nếu có cờ ngắt nhưng không có một trigger nào cả thì hàm #INT_DEFAULT sẽ được khởi gọi.
·       #INT_GLOBAL
+ Cú pháp:
#int_global
+ Mục đích:
Hàm sau chỉ thị này sẽ được gọi khi có tín hiệu ngắt được gởi đi. Thông thường, không nên sử dụng. Nếu sử dụng, trình biên dịch không tạo code khởi động cũng như code xoá và save trên thanh ghi
·       #LOCATE
+ Cú pháp :
#locate id=x
Trong đó: id là tên biến trong C, x là địa chỉ vùng nhớ.
+ Mục đích:
Hoạt động của #LOCATE tương tự như #BYTE tuy nhiên #LOACTE sẽ không cho xử dụng          vùng nhớ này vao các mục đích khác.
·       #ORG
+ Cú pháp:
#org start, end
Hoặc
#org segment
Hoặc
#org start, end {}
Hoặc
#org start, end auto=0
#org start,end DEFAULT
Hoặc
#org DEFAULT
Trong đó: Start là địa chỉ đầu của vùng nhớ được chỉ định, end là địa chỉ cuối cùng của vùng nhớ được chỉ định, segment là địa chỉ đầu của vùng nhớ ROM ngay sau #ORG trước
+ Mục đích:
Tiền xử lý này sẽ đặt hàm theo sau nó vào vùng nhớ ROM xác định
·       __PCB__ ,  __PCM_  , __PCH__
+ Cú pháp:
__PCB__ ,  __PCM__  , __PCH__
+ Mục đích:
Tiền xử lý này được định nghĩa để xác định trình biện dịch pcb, pcm, pch
·       #USE DELAY
+ Cú pháp:
#use delay (clock=speed)
hoặc
#use delay(clock=speed, restart_wdt)
Trong đó speed là tốc độ xung nhịp của thạch anh, là hằng số nằm trong khoảng từ 0 – 100000000 (Từ 0 – 100 MHz)
+ Mục đích:
Đây là hàm thư viện của PIC C Compiler chứa các hàm delay_ms(), delay_us(). Khai báo tiền xử lý này sẽ cho phép sử dụng các hàm trên trong chương trình.

·       # USE FAST_I/O
+ Cú pháp:
#use fast_io (port)
trong đó port là các ký tự A – G.
+ Mục đích:
Đây là chỉ định tiền xử lý để định dạng vào ra cho các cổng xuất nhập dữ liệu. Khi dùng chỉ định tiền xử lý này người lập trình phải chắc chắn thanh ghi đã được set đúng thông qua lệnh set_tris_X().
·       # USE FIXED_I/O
+ Cú pháp:
#use fixed_io (port_outputs=pin, pin?)
trong đó port là các ký tự A – G, pin là chân tương ứng trong port
+ Mục đích:
Đây là chỉ định tiền xử lý để định dạng vào ra cho các bit trong cổng xuất nhập dữ liệu.
·       #USE I2C
+ Cú pháp:
#use i2c (options)
Trong đó options là các phần như sau và được phân cách bởi dấu ‘,’.
MASTER : Đặt chế độ chủ
SLAVE : Đặt chế độ tớ
SCL=pin : Xác định địa chỉ SCL
SDA=pin : Xác định địa chỉ SDA
ADDRESS=nn :Xác định địa chỉ ở chế độ tớ
FAST : Sử dụng đặc tính nhanh của I2C
SLOW : Sử dụng đặc tính chậm của I2C
RESTART_WDT Khởi động lại WDT trong khi chờ đọc I2C
FORCE_HW Sử dụng các hàm phần cứng của I2C.
NOFLOAT_HIGH : Không cho phép thả nổi tín hiệu
SMBUS : Dùng bus tương tự như bus I2C.
+ Mục đích:
Đây là thư viện chứa các hàm sử dụng trong chế độ I2C như: I2C_START, I2C_STOP, I2C_READ, I2C_WRITE and I2C_POLL. Khai báo tiền xử lý này để dùng các hàm thư viện của nó.
·       #USE RS232
+ Cú pháp:
#use rs232 (options)
Trong đó options là các phần như sau và được phân cách bởi dấu ‘,’.
STREAM=id : Nhận dạng nhóm cổng RS232
BAUD=x : Đặt tốc độ Baud
XMIT=pin: Đặt chân truyền
RCV=pin : Đặt chân nhận
FORCE_SW :sinh mã truyền nối tiếp khi chân UART được xác định.
BRGH1OK :Cho phép huỷ tốc độ baud khi có vấn đề về tốc độ baud trong chip
DEBUGGER :Xác định đường truyền/ nhận dữ liệu thông qua bộ CCS IDC . Mạc nhiên là chân B3, dùng XMIT= và RCV = để thay đổi chân, cả 2 đường tuyền / nhận có thể sử dụng trên 1 chân.
RESTART_WDT : Khởi động lại Watch Dog timer.
INVERT : Đổi cực tính của chân nối tiếp
PARITY=X : Sốbit chẵn lẻ, X là N, E, O
BITS =X : Số bit data, x có giá trị từ 5 - 9
FLOAT_HIGH : Cổng RS232 sẽ ở mức cao khi không có dữ liệu.
RS232_ERRORS: Bit bào lỗi RS232
LONG_DATA : Dữ liệu nhận về từ RS232 sẽ ở dạng int16
DISABLE_INTS: Xoá ngắt RS232
+ Mục đích:
Định cấu hình RS232.
Ví dụ:
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3) // Cổng RS232 với tốc độ buad là 9600, Chân A2 là chân truyền, chân A3 là chân nhận.
·       # USE STANDARD_IO
+ Cú pháp:
#USE STANDARD_IO (port)
Trong đó port là A - G
+ Mục đích:
Dùng để định cấu hình vào ra cho các cổng giao tiếp dữ liệu
·       # ZERO_RAM:
+ Cú pháp:
#zero_ram
+ Mục đích:
Reset tất cả các thanh ghi trước khi thực hiện chương trình.

v Định nghĩa các kiểu dữ liệu

Kiểu dữ liệu được dùng để khai báo biến, hằng. Các biến được khai báo như sau:
Kiểu dữ liệu biến1, biến2, …;
Ví dụ: int a,b,c;

·       Các kiểu dữ liệu đơn giản:



·       Dữ liệu kiểu liệt kê:

Dữ liệu kiểu liệt kê là loại dữ liệu mở rộng để dinh nghĩa thêm kiểu dữ liệu. Khai báo kiểu liệt kê được thực hiện như sau:
enum tên biến {liệt kê các giá trị}

·       Dữ liệu kiểu cấu trúc:
Dữ liệu kiểu cấu trúc là một dạng dữ liệu phức tạp được định nghĩa để mở rộng thêm các kiểu dữ
liệu sử dụng trong chương trình. Định nghĩa kiểu cấu trúc như sau:
Struct tên kiểu {kiểu dữ liệu tên biến : miền giá trị}

·       Định nghĩa kiểu
Cho phép định nghĩa thêm các kiểu dữ liệu mới từ các kiểu dữ liệu chuẩn của PIC C compiler.
Việc định nghĩa thêm kiểu dữ liệu theo quy định như sau:

typedef tên kiểu dữ liệu chuẩn tên kiểu dữ liệu mới

. . .
~> Chờ update bạn nhé! Phần tiếp theo sẽ rất thú vị. ;)
Từ khóa :

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

Đăng nhận xét