Bài giảng Vi Điều Khiển 2011 Page 10 B/ TÌM HIỂU COMPILER CCS-C VÀ CHƯƠNG TRÌNH MPLAB I/CCS_C: 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.. Bà
Trang 1Bài giảng Vi Điều Khiển 2011 Page 1
I/FD-ICP:
b/ Chương trình nạp: WinPicProg
Trang 2Bài giảng Vi Điều Khiển 2011 Page 2
Main Window
Hardware setting:
Trang 3Bài giảng Vi Điều Khiển 2011 Page 3
II/ PIG-PG1, PIG-PG2, PIG-PG3
a/PIG-PG1
Trang 4Bài giảng Vi Điều Khiển 2011 Page 4
Chương Trình Nạp WinPicProg
b/ PIG-PIG2:
Trang 5Bài giảng Vi Điều Khiển 2011 Page 5
Chương Trình Nạp WinPicProg
C/ PIG-PG3:
Trang 6Bài giảng Vi Điều Khiển 2011 Page 6
Chương Trình Nạp ICPROG : 12Cxx, 16Cxxx, 16Fxx, 16F87x, 18Fxxx, 16F7x, 24Cxx, 93Cxx, 90Sxxx, 59Cxx, 89Cx051, 89S53, 250x0, PIC, AVR , 80C51 etc Main window:
Trang 7Bài giảng Vi Điều Khiển 2011 Page 7
Hardware settings:
Trang 8Bài giảng Vi Điều Khiển 2011 Page 8
Compare buffers:
Smartcard wizard:
Trang 9Bài giảng Vi Điều Khiển 2011 Page 9
Options
Trang 10Bài giảng Vi Điều Khiển 2011 Page 10
B/ TÌM HIỂU COMPILER CCS-C VÀ CHƯƠNG TRÌNH MPLAB
I/CCS_C:
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 12bit opcodes, PCM cho dòng PIC 14bit opcodes và PCH cho dòng PIC 16 bit và 18bit
CCS giúp cho người sử dụng viết 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
a/ Cài đặt CCS-C: việc cài đặt CCS-C hoàn toàn dể dàng, chạy file setup.Chọn
vị trí cài đặt (mặc định C:\program\PICC)…Cài đặt kết thúc
b/ Sử dụng CCS-C
Tạo một project trong CCS-C: Tab Project chọn PIC Wizard
Trang 11Bài giảng Vi Điều Khiển 2011 Page 11
Chọn vị trí lưu project:
Khai báo các thông tin phần cứng thông qua các mục sau: General, Communications, SPI and LCD, Timers, PCH Timers, Analog, Other, Interrupts, Drivers, I/O Pins, High/Low Voltage, Intr Oscillator Config, Header Files, CAN BUS, LCD options, MOD BUS, BOOT LOADER
General: chứa đựng các thôn tin cơ bản về loại PIC mà ta sử dụng và một số lựa chọn khác như chọn tần số thạch anh dao động, thiết lập các bit CONFIG nhằm thiết lập chế độ hoạt động cho PIC
Trang 12Bài giảng Vi Điều Khiển 2011 Page 12
- Device: Liệt kê danh sách các loại PIC 12F, 16F, 18F… Ta sẽ chọn tên Vi điều khiển PIC mà ta sử dụng trong project
- Oscilator Frequency: Tần số thạch anh ta sử dụng, giá trị mặc định 20 MHz, có thể thay đổi được
- Fuses: Thiết lập các bit Config như: Chế độ dao động (HS, RC, Internal ), chế độ bảo vệ Code, Brownout detected…
- Chọn kiểu con trỏ RAM là 16bit hay 8bit
Communications: Mục Communications liệt kê các giao tiếp nối tiếp mà một con PIC hỗ trợ, thường là RS232 và I2C, cùng với các lựa chọn để thiết lập chế độ hoạt động cho từng loại giao tiếp
Trang 13Bài giảng Vi Điều Khiển 2011 Page 13
- Giao tiếp RS232 Mỗi một Vi điều khiển PIC hỗ trợ một cổng truyền thông RS232 chuẩn Mục này cho phép ta lựa chọn chân Rx, Tx, tốc độ Baud, Data bit, Bit Parity…
- Giao tiếp I2C Để sử dụng I2C ta tích vào nút chọn Use I2C, khi đó ta có các lựa chọn: Chân SDA, SCL, Tốc độ truyền (Fast - Slow), chế độ Master hay Slave, địa chỉ cho Salve
SPI and LCD: Mục này liệt kê cho người dùng các lựa chọn đối với giao tiếp nối tiếp SPI, chuẩn giao tiếp tốc độ cao mà PIC hỗ trợ về phần cứng Chú ý khi ta dùng I2C thì không thể dùng SPI và ngược lại Để có thể sử dụng cả hai giao tiếp này cùng một lúc thì buộc một trong 2 giao tiếp phải lập trình bằng phần mềm (giồng như khi dùng I2C cho các chip AT8051, không có hỗ trợ phần cứng SSP) Phần cấu hình cho LCD dành cho các chíp dòng 18F và 30F
Trang 14Bài giảng Vi Điều Khiển 2011 Page 14
Timer: Liệt kê các bộ đếm/định thời mà các con PIC dòng Mid-range có: Timer0, timer1, timer2, WDT…Trong các lựa chọn cấu hình cho các bộ đếm /định thời có: chọn nguồn xung đồng hồ (trong/ngoài), khoảng thời gian xảy ra tràn…
Analog: Liệt kê các lựa chọn cho bộ chuyển đổi tương tự/số (ADC) của PIC Tùy vào từng IC cụ thể mà có các lựa chọn khác nhau
Trang 15Bài giảng Vi Điều Khiển 2011 Page 15
- Lựa chọn cổng vào tương tự
- Chọn chân điện áp lấy mẫu (Vref)
- Chọn độ phân giải: 8bit = 0 ~ 255 hay 10bit = 0~1023
- Nguồn xung đồng hồ cho bộ ADC (trong hay ngoài), từ đó mà ta có được tốc độ lấy mẫu, thường ta chọn là internal 2 6 us
- Khi không sử dụng bộ ADC ta chọn none
Other: Tab này cho phép ta thiết lập các thông số cho các bộ Capture/Comparator/PWM
Trang 16Bài giảng Vi Điều Khiển 2011 Page 16
Ta có các lựa chọn thực hiện lệnh khi xảy ra bằng nhau giữa 2 đối tượng so sánh
là giá trị của Timer1 với giá trị lưu trong thanh ghi để so sánh
Bao gồm:
Thực hiện ngắt và thiết lập mức 0
Thực hiện ngắt và thiết lập mức 1
Thực hiện ngắt nhưng không thay đổi trạng thái của chân PIC
Đưa Timer1 về 0 nhưng không thay đổi trạng thái chân
- PWM - Điều chế độ rộng xung: Lựa chọn về tần số xung ra và duty cycle Ta có thể lựa chọn sẵn hay tự chọn tần số, tất nhiên tần số ra phải nằm trong một khoảng nhất định
Trang 17Bài giảng Vi Điều Khiển 2011 Page 17
- Comparator - So sánh điện áp: Lựa chọn mức điện áp so sánh Vref Có rất nhiều mức điện áp để ta lựa chọn Ngoài ra ta còn có thể lựa chọn cho đầu vào của các
bộ so sánh
Interrupts: cho phép ta lựa chọn nguồn ngắt mà ta muốn sử dụng Tùy vào từng loại PIC mà số lượng nguồn ngắt khác nhau, bao gồm: ngắt ngoài 0(INT0), ngắt RS232, ngắt Timer, ngắt I2C-SPI, ngắt onchange PORTB.v.v…
Drivers: được dùng để lựa chọn những ngoại vi mà trình dịch đã hỗ trợ các hàm giao tiếp Đây là nhưng ngoại vi mà ta sẽ kết nối với PIC, trong các IC mà CCS hỗ trợ, đáng chú ý là các loại EEPROM như 2404, 2416, 2432, 9346, 9356…Ngoài ra còn có IC RAM PCF8570, IC thời gian thực DS1302, Keypad 3x4, LCD, ADC… Chi tiết ta có thể xem trong thư mục Driver của chương trình: \ \PICC\Drivers
Trang 18Bài giảng Vi Điều Khiển 2011 Page 18
I/O Pins: Mục này cho phép ta chọn chân tương ứng là xuất hoặc nhập từ PortA tới PortE
Ngoài ra còn các Tab khác: High/Low Voltage, Intr Oscillator Config, Header Files,Can Bus, LCD options, Mod Bus, Boot Loader
Trang 19Bài giảng Vi Điều Khiển 2011 Page 19
Sau cùng chúng ta đã hoàn tất việc tao một project mới
Kiểm tra lỗi và biên dịch sang dạng hex, ta vào Tab Compile và chọn mục Build All
Các hàm lệnh trong CCS-C
Trang 20Bài giảng Vi Điều Khiển 2011 Page 20
II/ MPLAB:
1/ Cài đặt: chạy setup.exe …
2/ Tạo một Project trong MPLAB
Bước 1: Khời động chương trình MPLAB
Bước 2: Tạo Project bằng công cụ Project Wizard, click Project và chọn Project Wizard
Trang 21Bài giảng Vi Điều Khiển 2011 Page 21
Một thông báo chào nừng xuất hiện ta chọn Next
Bước 3: Chọn loại chíp tương ứng mà ta sử dụng và click Next
Trang 22Bài giảng Vi Điều Khiển 2011 Page 22
Buớc 4: chọn ngôn ngữ sử dụng
Bước 5: Chọn vị trí lưu project, để chọn vị trí lưu ta chọn Browse
Trang 23Bài giảng Vi Điều Khiển 2011 Page 23
Chọn vị trí lưu
Nhập tên project và nhấn Save
Trang 24Bài giảng Vi Điều Khiển 2011 Page 24
Bước 6: Chọn add các Source Files (.ASM), Header Files (.INC), Linker Files (.lkr)….trong mục Microchip khi cài đặt chương trình MPLAB hoặc có thể bỏ qua bước này và tiến hành add sau
Trang 25Bài giảng Vi Điều Khiển 2011 Page 25
Bước 7: Finish để hoàn tất quá trình tạo một project
Sau khi hoàn tất ta có giao diện project như bên dưới, ta có thể chọn add các Source Files (.ASM), Header Files (.INC), Linker Files (.lkr)….như sau:
Nhấp phải chuột vào mục Source Files và chọn Add Files
Trang 26Bài giảng Vi Điều Khiển 2011 Page 26
Tiếp theo ta chọn tới mục chứa files tương ứng với chíp đang sử dụng có đuôi ASM và chọn Open
Tương tự ta add các Source Files và các File khác
Trang 27Bài giảng Vi Điều Khiển 2011 Page 27
Tiếp theo ta vào Tab File và chọn New, ta được cửa sổ giao diện như bên dưới
Vào File chọn Save As
Trang 28Bài giảng Vi Điều Khiển 2011 Page 28
Chọn vị trí lưu và tên cần lưu
Tiếp theo ta add Source Files và add file mới vừa tạo vào
Trang 29Bài giảng Vi Điều Khiển 2011 Page 29
Sau đó ta double click vào file vừa add và thao tác trên file này
Sau khi lập trình xong, ta tiến hành kiểm tra lỗi và biên dịch, ta vào Tab Project
và chọn Build All
Nếu chương trình chúng ta bị lỗi và biên dịch không thành công sẽ có giao diện như bên dưới:
Trang 30Bài giảng Vi Điều Khiển 2011 Page 30
Nếu chương trình chúng ta không bị lỗi và biên dịch thành công sẽ có giao diện như bên dưới
Để tiến hành nạp chương trình vào chíp (chíp được kết nối vào mạch nạp thích hợp), ta vào Tab Programmer và chọn MPLAB ICD2
Trang 31Bài giảng Vi Điều Khiển 2011 Page 31
Chọn Next
Chọn cổng giao tiếp và chọn Next:
Trang 32Bài giảng Vi Điều Khiển 2011 Page 32
Chọn nguồn cung cấp và chọn Next:
Chọn Next để tiến hành nạp chương trình cho chíp
Trang 33Bài giảng Vi Điều Khiển 2011 Page 33
Chọn Finish để hoàn tất quá trình nạp
Trang 34Bài giảng Vi Điều Khiển 2011 Page 34
III/ PHƯƠNG PHÁP NHÚNG TRÌNH DỊCH CCS-C VÀO MPLAB
Để có thể sử dụng trình dịch CCS-C trong môi trường MPLAB, ta cần cài đặt thêm chương trình MPALB PLUGIN
Tiếp theo ta mở chương trình MPLAB và tiến hành tạo Project tương tự như trên, riêng tới bước chọn ngôn ngữ lập trình ta chọn như giao diện bên dưới
Các bước tiếp theo ta tiến hành add các Source Files và Header như bình thường
Trang 35Bài giảng Vi Điều Khiển 2011 Page 35
C/ MỘT SỐ TẬP LỆNH TRONG CCS-C
1 / Khai báo biến, hằng, mảng :
Các loại kiểu dữ liệu sau được hỗ trợ :
- int1 số 1 bit = true hay false ( 0 hay 1)
- int8 số nguyên 1 byte ( 8 bit)
Trang 36Bài giảng Vi Điều Khiển 2011 Page 36
- 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
Khai báo biến: VD: Signed int8 a // a là 8 bit
Khai báo hằng: VD: Int8 const a=231;
Khai báo mảng: VD Int8 const a[5] = { 3,5,6,8,6 } ; // a[0]=3
Int8 const a[5]={ }; // sử dụng 5 byte Int8 const a[256]={ }; // 256 phần tử x 1 byte = 256 byte Int16 const a[12] = { }; // 12 x 2= 24 byte
Int16 const a[128] = { }; // 128 x 2= 256 byte int8 const a [7] = { 0 , 3,5 ,9 } // các phần tử a[4] ,a[5],a[6] đều
=0 Khai báo 1 biến mảng : kích thước tuỳ thuộc khai báo con trỏ trong #device và kích thước mãng phụ thuộc vào loại VDK
VD: # device *= 8 : không gian bộ nhớ chỉ có 256 byte cho tất cả các biến chương trình bất chấp VĐK của chúng ta có hơn 256 byte RAM
Với 16F877 có 368 byte ram , thường thì kích thước để khai báo mãng không quá 60 byte ,có khi dưới 40 byte , nếu khai báo lớn hơn sẽ gặp lỗi : not enough ram for all variable trong khi thực sự VDK còn rất nhiều RAM
Trang 37Bài giảng Vi Điều Khiển 2011 Page 37
Với Pic18 kích thước mãng không bị giới hạn, khai báo #device *=16 mảng sử dụng có thể trọn bộ nhớ RAM
Khai báo biến mảng : int16 a[125] ; // biến mảng 126 phần tử , kích thước 252 byte ram
2/ Cấu trúc lệnh:
- If (expr) stmt; else (stmt): lệnh điều kiện nếu biểu thức đúng thì sẽ làm
những lệnh này không thì làm những lệnh kia
- While (expr) stmt : xét điều kiện trước, nếu điều kiện còn đúng thì làm những lệnh này Điều kiện sai thì thoát khỏi
- Do stmt while (expr) : Làm những câu lệnh này trước rồi sau đó mới kiềm tra điều kiện
- Return : dùng cho hàm có trả về trị, hoặc không trả về trị cũng được, khi đó chỉ cần dùng: return ; ( nghĩa là thoát khỏi hàm tại đó )
- Break : ngắt ngang ( thoát khỏi ) vòng lặp while
- Continue : quay trở về đầu vòng lặp while
Trang 38Bài giảng Vi Điều Khiển 2011 Page 38
3/ Chỉ thị tiền xử lý: xem chi tiết tất cả ở phần HELP, mục pre_processor
a / #ASM và #ENDASM :
- Cho phép đặt 1 đoạn mã ASM giữa 2 chỉ thị này , Chỉ đặt trong hàm CCS định nghĩa sẵn 1 biến 8 bit _RETURN_ để chúng ta gán giá trị trả về cho hàm từ đoạn mã Assembly Tuy nhiên C đủ mạnh để thay thế Assmemly Vì vậy nên hạn chế lồng mã Assembly vào vì thường gây ra xáo trộn dẫn đến sau khi biên dịch mã chạy sai, trừ phi chúng ta nắm rõ Assembly và đọc hiểu
mã Assembly sinh ra thông qua mục C/Asm list
Trang 39Bài giảng Vi Điều Khiển 2011 Page 39
- Khi sử dụng các biến không ở bank hiện tại , CCS sinh thêm mã chuyển bank
tự động cho các biến đó Nếu sử dụng #ASM ASIS thì CCS không sinh thêm mã chuyển bank tự động , chúng ta phải tự thêm vào trong mã ASM
- Lưu ý : mã Assembly theo đúng mã tập lệnh VDK , không phải mã kiểu
Trang 40Bài giảng Vi Điều Khiển 2011 Page 40
b /Chỉ thị: #INCLUDE:
- Cú pháp : #include <filename> Hay #include “ filename” 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ào , và luôn đặt ở dòng đầu tiên
#bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 ở địa chỉ 0xb.2 (PIC16F877)
TMR1Flag = 0 // xoá cờ ngắt timer1
Trang 41Bài giảng Vi Điều Khiển 2011 Page 41
Int16 a=35; //a=00000000 00100011
#bit b= a.11 //b=0 , nếu b= a.0 (b chỉ vị trí LSB )sau đó b = 1
Lưu ý không dùng được : if ( 0xb.2 ) mà phải khai báo như trên rồi dùng :
if(TMR1Flag)
- #BYTE id = x
X: địa chỉ, id : tên biến trong C
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 tên 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ỉ đó Lưu ý
rằng giá trị thanh ghi có thể thay đổi bất kỳ lúc nào do hoạt động chương trình nên giá trị id cũng tự
thay đổi theo giá trị thanh ghi đó
VD:
#byte port_b = 0xc6; // 16F877 :0xc6 là địa chỉ portb
port_b=120; // port b có giá trị 120
- # LOCATE id = x
-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 VD: # LOCATE temp = 0xc20 // 0xc20 :thanh ghi đa mục đích
- Sử dụng #LOCATE để gán biến cho 1 dãy địa chỉ kề nhau ( cặp thanh ghi ) sẽ tiện lợi hơn thay vì
Trang 42Bài giảng Vi Điều Khiển 2011 Page 42
phải dùng 2 biến với #byte
VD : CCP1 có giá trị là cặp thanh ghi 0x15 ( byte thấp ) và 0x16 ( byte cao ) Để gán trị cho CCP1 :
d / # DEVICE : # DEVICE chip option
chip : tên VĐK sử dụng , không dùng tham số này nếu đã khai báo tên chip ở # include
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
Trang 43Bài giảng Vi Điều Khiển 2011 Page 43
ICD = true : tạo mã tương thích debug phần cứng Microchip
HIGH_INTS = TRUE : cho phép dùng ngắt ưu tiên cao
- Khai báo pointer 8 bit , chúng ta sử dụng được tối đa 256 byte RAM cho tất cả biến chương trình
- Khai báo pointer 16 bit , chúng ta sử dụng được hết số RAM có của VDK
- Chỉ nên dùng duy nhất 1 khai báo #device cho cả pointer và ADC
VD : #device * = 16 ADC = 10
e / # ORG :
# org start , end
# org segment
#org start , end { }
Start , end: bắt đầu và kết thúc vùng ROM dành riêng cho hàm theo sau , hoặc để riêng không dùng