TỔNG QUAN LẬP TRÌNH CHO VI ĐIỀU KHIỂN • Vi điều khiển truyền thông với con người thông qua ngôn ngữ lập trình • Ngôn ngữ lập trình: cấp thấp hoặc cấp cao • Ngôn ngữ lập trình được sử dụn
Trang 1CHƯƠNG 3 NGÔN NGỮ LẬP TRÌNH
VI ðIỀU KHIỂN
GV: Vũ Thị Hồng Nga Khoa Công Nghệ Điện Tử
1 TỔNG QUAN LẬP TRÌNH CHO VI ĐIỀU KHIỂN
• Vi điều khiển truyền thông với con người thông qua ngôn ngữ lập trình
• Ngôn ngữ lập trình: cấp thấp hoặc cấp cao
• Ngôn ngữ lập trình được sử dụng trong bài học này là ngôn ngữ C
2
Trang 2• Hợp ngữ là một tập các qui luật (lệnh) được dùng để viết
chương trình cho vi điều khiển
• Để vi điều khiển có thể hiểu một chương trình được viết bằng
hợp ngữ thì nó cần phải được biên dịch thành ngôn ngữ máy.
• Assembly: là một tập các qui luật (lệnh) được dùng để viết
chương trình cho vi điều khiển
• Assembler: là một chương trình trên máy tính dùng để dịch các
phát biểu hợp ngữ sang ngôn ngữ của các con số 0 hoặc 1.
3
1 TỔNG QUAN LẬP TRÌNH CHO VI ĐIỀU KHIỂN
• Chương trình (Program) / Mã nguồn (Source Code):
• Là tập tin dữ liệu được lưu trên máy tính
• Được thể hiện bằng hợp ngữ (hoặc các ngôn ngữ khác: ngôn ngữ C)
• Định dạng tập tin là ASM và C( ngôn ngữ C)
Trang 3• Thực thi ( Executive ) / Mã máy ( Machine Code ):
• Là tập tin dữ liệu được lưu trên máy tính hoặc nạp PIC
• Được thể hiện bằng các con số 0 hoặc 1
• Định dạng tập tin là HEX (Ví dụ: Program.hex)
5
• Chương trình sau khi biên dịch sẽ được nạp vào vi điều khiển
bằng các bộ lập trình (Programmer) chuyên dụng dành cho PIC.
6
Trang 4• Vi điều khiển sau khi được lập trình sẽ được gắn vào bo mạch
chủ để điều khiển toàn hệ thống hoạt động theo chương trình
mà không cần sự can thiệp của con người.
7
2 Nhắc lại kiến thức ngôn ngữ lập trình C
Các thành phần chính của chương trình
Trang 5Kiểu số nguyên có dấu
• Miền giá trị (số n-bit): -2 n-1 +2 n-1 – 1
9
Kiểu
(Type)
ðộ lớn (Byte)
Miền giá trị (Range)
4
–32.768 … +32.767 –2.147.483.648 … +2.147.483.647
long 4 –2.147.483.648 … +2.147.483.647
long long 8 –9,223,372,036,854,775,808
… 9,223,372,036,854,775,807
Một số môi trường lập trình ñồng nhất kiểu long long với kiểu long
cho nên kiểu này ít ñược sử dụng trong lập trình ứng dụng.
Kiểu số nguyên không dấu
• Miền giá trị (số n-bit): 0 2 n – 1
10
Kiểu
(Type)
ðộ lớn (Byte)
Miền giá trị (Range)
Một số môi trường lập trình ñồng nhất kiểu unsigned long long với kiểu
unsigned long cho nên kiểu này ít ñược sử dụng trong lập trình ứng dụng.
Trang 6• Hằng số nguyên có thể biểu diễn ở 4 dạng
• Bát phân: viết bắt đầu bằng số0
• Nhị phân: viết bắt đầu bằng số0B
• Thập phân: viết bắt đầu bằng số từ1đến9
• Thập lục phân: viết đầu bằng0x
VD: PORTA = 0X4A = 0B01001010
• Các phép toán số học
• Phép cộng: +, phép trừ: –, phép nhân: *
• Phép chia lấy phần nguyên: /
• Phép chia lấy phần dư: %
11
Toán tử trên bit
Trang 7VD: phép toán trên bit cho số nguyên không dấu
Trang 8Phép toán luận lý
Có 3 kiểu phép toán luận lý trong ngôn ngữ C, ñó là AND, OR và
NOT Phép toán logic trả về kết quả true (1) nếu kết quả của biểu thức
khác 0, trả về kết quả false (0) nếu kết quả của biểu thức bằng 0
Phép gán
• Việc tính toán trong chương trình được thực hiện bằng cách
tính toán và chép kết quả tính toán vào một biến nằm bên
trái của phép gán
• Ví dụ:
Trang 9Định dạng dạng dạng dữ dữ dữ liệu liệu liệu nhập nhập nhập xuất xuất
•Đối với NNLT C
•Nhập xuất số nguyên (kiểu char , int )
• Có dấu dạng thập phân: %d hay %i
• short(16-bit): %hd, %hi, %ho, %hu, %hx, %hX
• long: %ld, %li, %lo, %lu, %lx, %lX
• Về việc quy ñịnh ñộng rộng và ñộ chính xác (nếu là
số thực) cho dữ liệu xuất ñược ghi ngay sau dấu %
với dạng wid.pre, ví dụ %9.2f nghĩa là ñộ rộng ít nhất
9 ký tự (thêm khoảng trống vào nếu thiếu) và nhiều
nhất là 2 ký tự cho phần lẻ sau dấu chấm thập phân
18
Trang 10Biến toàn cục & biến cục bộ
• Biến toàn cục (Global variables): vị trí biến đặt bên ngoài tất
cả các hàm, cấu trúc Các biến này có ảnh hưởng đến toàn
bộ chương trình Chu trình sống của nó là bắt đầu chạy
chương trình đến lúc kết thúc chương trình
• Biến cục bộ (Local variables): Vị trí biến đặt bên trong hàm,
cấu trúc… Chỉ ảnh hưởng nội bộ bên trong hàm, cấu trúc
đó… Chu trình sống của nó bắt đầu từ lúc hàm, cấu trúc
được gọi thực hiện đến lúc thực hiện xong
19
Cấu trúc điều khiển có 2 loại:
Cấu trúc điều khiển rẽ nhánh:
Trang 11(biểu_thức_ñiều_kiện) {
Lệnh 1;
Lệnh 2;
… Lệnh n;
Trang 12Lệnh 1;
Lệnh 2;
…Lệnh n;
}
Cấu trúc điều khiển vòng lặp:
Câu
Câu lệnh lệnh lệnh return return
• Trả về dòng điều khiển mà nơi nó gọi, khi lệnh return được
theo sau bởi một biểu thức thì biểu thức đó sẽ được đánh
giá và giá trị này sẽ được trả về cho nơi đã gọi hàm Khi
return được gọi mà không có biểu thức đi kèm thì giá trị trả
về là không xác định
• Câu lệnh return không chỉ thoát khỏi vòng lặp mà nó còn
thoát luôn khỏi hàm mà đang chứa nó
Trang 13Định nghĩa hàm
return-typefunction_name(param-typeparam_name,
…, param-typeparam_name){
• Tiếp theo là thân hàm (đặt trong {}) chứa các câu lệnh hàm sẽ
thực hiện (phải có ít nhất một lệnhreturnnếu kiểu trả về
3 Lưu đồ giải thuật
Trang 14VD: Giải và biện luận phương trình bậc nhất: ax + b = 0
SV chuẩn bị các phần mềm và tài liệu sau
- phần mềm viết code: MPLAB
- phần mềm mô phỏng : PROTEUS
- Sách Thực hành vi xử lý
Trang 15Phần mềm viết code MPLAB
Phần mềm mô phỏng proteus
Trang 16Bộ nạp chip PICKIT 2 KIT RP hoặc mô hình thí nghiệm vi xử lý
VD1: lập trình điều khiển led đơn D4 và D5 chớp tắt với
Ton = Toff = 500ms
RE2
RE1 RE1
MCLR
OSC2
MCLR
OSC2 OSC1
3
RA1/AN1/C12IN1-RA2/AN2/VREF-/CVREF/C2IN+
4 RA4/T0CKI/C1OUT 6
RA5/AN4/SS/C2OUT 7
RB0/AN12/INT 33
34
RB1/AN10/C12IN3-RB2/AN8 35
RA7/OSC1/CLKIN
13 RA6/OSC2/CLKOUT14
RD5/P1B 28RD6/P1C 29RD7/P1D 30
RC4/SDI/SDA 23RC5/SDO 24RC3/SCK/SCL 18RC2/P1A/CCP1 17RC1/T1OSI/CCP2 16RC0/T1OSO/T1CKI 15
RB7/ICSPDAT
40 RB6/ICSPCLK
39 RB5/AN13/T1G
38 RB4/AN1137
RD3 22RD2 21RD1 20RD0 19RC7/RX/DT 26RC6/TX/CK 25
10 RE1/AN6 9RE0/AN5 8
RA3/AN3/VREF+/C1IN+
5
RD4 27RB3/AN9/PGM/C12IN2-
36
RA0/AN0/ULPW 2
U/C12IN0-U2 BAI TAP UNG DUNG DIEU KHIEN XUAT/NHAP CO BAN
Trang 17Cấu hình tất cả Analog Input →→ Digital I/O
Start
Cấu hình Port E Output Loop ðiều khiển LED D4, D5 = OFF
CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
Trang 18Bài tập 1: lập trình điều khiển 8 led đơn D1 và D7 nối với PORTD
chớp tắt với Ton = Toff = 300ms
Ví dụ 2: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng dần
D1 → D8 Led nối với port C
Trang 19• Giải thuật:
37
Begin
Cấu hình tất cả Analog Input →→ Digital I/O Start
Cấu hình Port C Output Loop Xóa giá trị ñộ lệch (vị trí) của
dữ liệu trong bảng Table Loop_1
Lấy giá trị ñộ lệch của
dữ liệu ðọc dữ liệu nhận ñược từ bảng Table (tùy thuộc vào giá trị ñộ lệch) Xuất dữ liệu nhận ñược ra Port C
Delay 500ms
Tăng giá trị ñộ lệch
Kiểm tra
ñã lấy ñủ 9 byte từ bảng Table ?
S
ð
Bảng dữ liệu Table
b'00000000 b'00000001 b'00000011 b'00000111 b'00001111 b'00011111 b'00111111 b'01111111 b'11111111
• #include <htc.h>
• #include <math.h>
• CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF &
CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
• #define _XTAL_FREQ 4000000
38
temp = 0x01;
for(j=1;j<=8;j++) {
PORTC = temp;
delay_ms(500);
temp = temp | (temp << 1);
} } }
void main (void)
Trang 20• Ví dụ 4: Dựa vào sơ đồ, viết chương trình hiển thị số 3 chớp
tắt trên 1 led7SEG (LED4)
39
Hướng dẫn:
- Tìm mà led 7 đoạn cho số 3
- Chọn Ton = ? Toff =?
- Xác định led hien thị nối với port nào?
- Cấu hình port: digital, output
- Xuất dữ liệu ra port
Trang 21- led 7 đoạn dùng loại anode chung 0 sang, 1 tắt
- mã led 7 đoạn cho số 3 là 10110000 = 0XB0
- Chọn Ton = Toff = 500ms
- led hien thị nối với PORTD
- Cấu hình PORTD: digital, output
- Xuất dữ liệu ra portD
Lưu đồ giải thuật
Trang 22#include <htc.h>
#include <math.h>
CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
VD 5: viết chương trình điều khiển nút nhấn
Nhấn nút 1 (RB0) : led7seg hiển thị số 12 trong 1s
Nhấn nút 2 (RB1) : led7seg hiển thị số 24 trong 1s
Trang 23#include <htc.h>
#include <math.h>
CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
for (i=0;i<10;i++) {
delay_ms(100);
} } void so_12 (void) {
PORTC = 0XA4;
delay_1s();
}
Trang 24void main (void)
{
khai_bao_port();
while (1) {
if(!sw0) { delay_ms(10);
}
Ví dụ 5: viết chương trình hiển thị hình “trái tim” trên led
matrix
Trang 25#include <htc.h>
#include <math.h>
CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
for(i=0;i<=7;i++) {
}