LINK DOWNLOAD MIỄN PHÍ TÀI LIỆU "Hoc CCS co ban": http://123doc.vn/document/571175-hoc-ccs-co-ban.htm
Trang 54
http://codientu.org
Debug File: File gỡ rối chương trình chạt trên MPLAB. Chọn Standard.COD nếu muốn chạy gỡ
rối chương trình, chọn None nếu không cần chạy gỡ rối.
Error File: Xuất ra file lỗi khi chương trình có lỗi trong quá trình biên dịch. Chọn Standard cho
các MCU chuẩn hiện hành của Microchip, chọn Original cho các MCU thế hệ trước của
Microchip.
List Format:Chọn Simple cho định dạng cơ bản với mã C và ASM. Chọn Standard để định dạng
chuẩn MPASM với mã máy. Chọn Old cho định dạng MPASM thế hệ trước. Chọn Symbolic để
định dạng gồm mã C trong ASSEMBLY.
Object File: Chọn kiểu cho file.hex, Chọn 8 bit HEX cho file hex intel 8 bit và chọn 16 HEX cho
file hex intel 16 bit.
Sau khi đã chọn lựa kiểu định dạng file xuất ra sau khi biên dịch, click OK.
+ Global Defines: Cho phép đặt #define để sử dụng cho biên dịch chương trình. Điều này tương
tự như việc khai báo #define ở đầu chương trình.
+ Debug/Programer: Cho phép xác định thiết bị lập trình được sử dụng khi chọn lựa công cụ lập
trình cho chip.
+ Include Dirs: Tương tự như trong thực đơn Project.
- Compiler: Biên dịch dự án hiện hành.
- View: Thực đơn view gồm các thành phần như hình
+ C/ASM List: Mở file.lst ở chế độ chỉ đọc, file này phải được biên dịch trước từ file.c. Khi được
mở, file này sẽ trình bày theo dạng vừa có mã C vừa có mã Assembly.
Ví dụ File.lst
……………delay_ms(3);
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 55
http://codientu.org
0F2: MOVLW 05
0F3: MOVWF 08
0F4: DESCZ 08,F
0F5: GOTO 0F4
…………….while input(pin_0));
0F6: BSF 0B,3
+ Symbol Map: Mở file dạng mã ASM ở chế độ chỉ đọc. File này phải được biên dịch từ file.c.
File này cho biết địa chỉ của các thanh ghi sử dụng trong chương trình.
+ Binary file: Mở file nhị phân ở chế độ chỉ đọc, File này được hiển thị ở mã HEX và mã ASCII.
- Tool: Thực đơn Tool quản lý một số công cụ đặc biệt. Các thành phần trong thực đơn tool như
hình.
Trong thực đơn tool chỉ có một công cụ khá đặc biệt mà người sử dụng MCU cần lưu ý là
công cụ disassembler, công cụ này cho phép dịch ngược file.bin hoặc file.hex thành file theo kiểu
mã ASM.
- Help: thực đơn trợ giúp, trong thực đơn này chứa phần hướng dẫn sử dụng PIC C compiler
dưới dạng HYML.
c. Lập Trình Cho MCU Của Microchip Dùng PIC C Compiler:
Các bước để lập trình cho MCU PIC dùng PIC C compiler:
- Chạy PIC C Compiler bằng cách double click vào biểu tượng của phần mềm.
- Trên Menu Bar của phần mềm, chọn Project -> New -> PIC Wizard để tạo dự án mới hoặc
chọn Project –> Open để mở dự án trong đã lưu trong đĩa.
- Nếu là dự án mới thì sau khi chọn PIC Wizard, đặt tên cho dự án và click SAVE.
- Sau khi click SAVE, của sổ cho phép chọn thông số cho dự án theo mẫu hiện ra, chọn các
thông số cần thiết cho dự án và click OK.
- Sau khi click OK, cửa sổ soạn thảo chương trình theo mã C xuất hiện, viết mã theo giải thuật để
thực hiện dự án. Chọn File save all để lưu trữ các file trong dự án vào đĩa cứng.
- Sau khi viết mã xong, chọn Compiler -> compiler để biên dịch chương trình thành file.hex. Nếu
chương trình không có lỗi thì file.hex được tạo ra còn ngược lại thì sửa lỗi chươn gtrình rồi biên
dịch lại.
- Sau khi tạo được file.hex, dùng chương trình PIC downloader để nạp chương trình vào bộ nhớ
FLASH của MCU.
3. Viết Chương Trình (Mã Nguồn) Cho PIC Trên PIC C Compiler:
Chương trình được viết trên PIC C compiler gồm 4 phần tử chính, Trong mỗi phần tử sẽ
bao gồm nhiều chi tiết để tạo nên chương trình. Cấu trúc chương trình như sau:
- Phần ghi chú
: Ở phần ghi chú, người lập trình sẽ ghi những chú thích cần thiết cho chương
trình. Phần chú thích được bắt đầu từ dấu // hoặc /* cho tới cuối hàng. Khi biên dịch, trình biên
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 56
http://codientu.or
g
dịch sẽ bỏ qua phần ghi chú. Phần ghi chú có thể xuất hiện bất cứ chỗ nào trong chương trình
thậm chí có thể đặt ngay sau hàng mã lệnh để chú thích cho hàng lệnh.
Ví dụ:
// Đây là phần ghi chú của chương trình
/* những ghi chú này sẽ không ảnh hưởng gì tới chương trình khi biên dịch.
- 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
…
- Định nghĩa các dữ liệu: Đây là phần khai báo hằng, khai báo biến và kiểu dữ liệu sử dụng
trong chương trình.
Ví dụ:
int a,b,c,d; // Khai báo biến a,b,c,d kiểu nguyên
- Định nghĩa các hàm: Định nghĩa các hàm (Function) được dùng để thực hiện giải thuật của
chương trình. Hàm có cấu trúc như sau:
Tên hàm (Các đối số của hàm)
{
Các phát biểu
}
Trong đó Tên hàm được đặt tuỳ ý của người viết chương trình. Các đối số của hàm là các
thông số dùng để trao đổi dữ liệu cũa hàm, đối số có thể là rỗng nếu hàm không trao đổi dữ liệu
hoặc có thể có nhiều đối số, các đối số phân cách nhau bằng dấu ‘,’
Ví dụ:
void lcd_putc(char c ) // Định nghĩa hàm
{
}
Dưới đây trình bày một chương trình mẫu để minh họa cấu trúc của chương trình.
// Phần khai báo chỉ định tiền xử lý
#if defined(
PCB
) // Khai báo tiền
#include <16c56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2) // Jumpers: 11 to 17, 12 to 18
#elif defined(
PCM )
#include <16c74.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#elif defined(
PCH )
#include <18c452.h>
#fuses HS,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif
#include <ltc1298.c>
// Kết thúc phần khai báo tiền chỉ định tiền xử lý.
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 57
htt
p://codientu.org
// Phần khai báo biến, hằng và kiểu dữ liệu
int a,b,c,d;
char *h;
struct data_record {
byte a [2];
byte b : 2; /*2 bits */
byte c : 3; /*3 bits*/
int d;}
// Kết thúc khai báo hằng, biến và kiểu dữ liệu
// Bắt đầu phần định nghĩa các hàm.
void display_data( long int data ) // Khai báo hàm hiển thị data
{ // Từ khóa bắt đầu chương trình
char volt_string[6]; // Khai báo biến
convert_to_volts( data, volt_string ); // Phát biểu
printf(volt_string); // Phát
biểu
printf(" (%4lX)",data); // Phát
biểu
} // từ khoá kết thúc hàm
main() // Định nghĩa hàm
{ // Từ khóa bắt đầu chương
trình
long int value; // Khai báo biến
adc_init(); // Phát biểu gọi hàm
printf("Sampling:\r\n"); // Phát biểu
do // Phát biểu
{ // Từ khóa bắt đầu nhóm phát biểu
delay_ms(1000); // Phát biểu
value = read_analog(0); // Phát biểu gọi hàm
printf("\n\rCh0: "); // Phát biểu
display_data( value ); // Phát biểu gọi hàm
value = read_analog(1); // Phát biểu gọi hàm
printf(" Ch1: "); // Phát biểu
display_data( value ); // Phát biểu gọi hàm
}
while
(TRUE);
}
a. Các lệnh tiền xử lý:
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
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 58
http://codientu.or
g
#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
Ví dụ sau minh họa cách sử dụng cặp lệnh trên vào chương trình.
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 59
http://codientu.org
int find_parity (int data)
{
int count;
#asm //Khai báo bắt đầu đoạn mã assembly
movlw 0x8
movwf count
movlw 0
loop: xorwf data,w
rrf data,f
decfsz count,f
goto loop
movwf _return_
#endasm // khai báo kết thúc đoạn mã assembly
}
- #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.
Ví dụ: ví dụ dưới dây minh hoạ cách sửû dụng lệnh #bit.
#bit T0IF = 0xb.2
T0IF = 0; // Clear Timer 0 interrupt flag
int result;
#bit result_odd = result.0
if (result_odd)
- # 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.
Ví dụ: ví dụ dưới dây minh hoạ cách sử dụng lệnh #build.
#build(memory=0x20000:0x2FFFF) //ấn định không gian nhớ.
#build(reset=0x200,interrupt=0x208) //ấn định vị trí đầu của các vector ngắt và reset
#build(reset=0x200:0x207,
interrupt=0x208:0x2ff) //ấn định giới hạn không gian của các
// vector ngắt và reset
- #BYTE
:
+ Cú pháp:
#byte id = x
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 60
http://codientu.org
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.
Ví dụ: ví dụ dưới dây minh hoạ cách sử dụng lệnh #byte.
#byte status = 3
#byte b_port = 6
struct {
short int r_w;
short int c_d;
int unused : 2;
int data : 4; } a_port;
#byte a_port = 5
a_port.c_d = 1;
- #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
Ví dụ: ví dụ dưới dây minh hoạ cách sủ dụng #define.
#define BITS 8
a=a+BITS; //tương tự như a=a+8;
#define hi(x) (x<<4)
a=hi(a); //tương tự như a=(a<<4);
- # 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.
Ví dụ: ví dụ dưới dây minh hoạ cách sử dụng #device.
#device PIC16C74
#device PIC16C67 *=16
#device *=16 ICD=TRUE
#device PIC16F877 *=16 ADC=10
- DEVICE :
+ Cú pháp
:
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 61
http://codientu.org
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.
Ví dụ: ví dụ dưới dây minh hoạ cách sử dụng
device .
#if
device
==71
SETUP_ADC_PORTS( ALL_DIGITAL );
#endif
- #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ị. Các option được diễn giải chi tiết trong thực
đơn View-> Fuse valid trong PIC C compiler. Cửa sổ FUSE Review như sau:
Tên
MCU
+ 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.
Ví dụ:
#fuses HS,NOWDT
- #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
:
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 62
http://codientu.org
Đị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.
Ví dụ:
#id 0x1234
#id "serial.num"
#id CHECKSUM
- #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.
Ví dụ:
#if MAX_VALUE > 255
value;
#else
int value;
#endif
- #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 đó.
Ví dụ:
#include <16C54.H>
#include<C:\INCLUDES\COMLIB\MYRS232.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.
Ví dụ:
#inline
swapbyte(int &a, int &b)
Lập Trình Cho PIC Dùng PIC C Compiler
Trang 63
http://codientu.or
g
{
int t;
t=a;
a=b;
b=t;
}
- #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. Ha2m 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. Chi tiết về các chỉ dẫn trong
các MCU có thể xem trong thực đơn view -> Valid ints. Cửa sổ interrupt review như sau:
Không có nhận xét nào:
Đăng nhận xét