Nội dung chương 3
81
Chương 3: Vi điều khiển và lập trình firmware 3.1. Tổng quan vi điều khiển 3.2. Vi điều khiển họ 8051 3.3. Vi điều khiển ARM
Hệ nhúng
3.1. Tổng quan vi điều khiển
Vi điều khiển <> Vi xử lý
Vi điều khiển: Computer On Chip (bao gồm cả CPU, Bộ nhớ, cổng vào ra)
82
Hệ nhúng
Tổng quan vi điều khiển
• 8051 (AT89C51, AT89S51, AT89S52) • AVR (ATMEGA8, ATMEGA16…) • PIC (PIC16F877A, PIC18F4550, PIC18F2550…) • ARM (ARM7, ARM9, ARM Cortex-Mx, ARM
Cortex-Ax)
• …
83
Một số dòng vi điều khiển phổ biến hiện nay
Hệ nhúng
Lập trình vi điều khiển
Lập trình vào ra các cổng (trên từng cổng hoặc
từng chân của cổng) Lập trình sử dụng ngắt Lập trình với các môđun ngoại vi: UART, SPI,
I2C…
84
…
Hệ nhúng
3.2. Vi điều khiển họ 8051
85
Kiến trúc vi điều khiển 8051 Lập trình firmware cho vi điều khiển 8051
Hệ nhúng
3.2.1. Kiến trúc vi điều khiển 8051
Do hãng Intel thiết kế năm 1981 Gồm 40 chân
Có 4 cổng vào ra, mỗi cổng rộng 8 bit: P0, P1, P2, P3 Nhóm chân nguồn, dao động và điều khiển
Ngoại vi: UART 6 nguồn ngắt (2 ngắt ngoài) 2 bộ Timer/Counter 4KB Flash, 128 Byte Ram Tần số xung nhịp tối đa: 24 MHz
86
Hệ nhúng
Đóng vỏ vi điều khiển 8051
87
Hệ nhúng
Kiến trúc vi điều khiển 8051
88
Hệ nhúng
Các thanh ghi của 8051
Các thanh ghi dùng để lưu tạm thời dữ liệu hoặc
địa chỉ
• Thanh ghi A : thanh ghi tích lũy • Thanh ghi R0->R7 • Thanh ghi con trỏ dữ liệu DPTR (16 bit) • Thanh ghi bộ đếm chương trình PC (16bit)
89
Các thanh ghi này chủ yếu là thanh ghi 8 bit Các thanh ghi thường được sử dụng
Hệ nhúng
3.2.2. Lập trình vi điều khiển 8051
90
Giới thiệu về lập trình hợp ngữ Lập trình C
Hệ nhúng
Giới thiệu lập trình hợp ngữ
Ngôn ngữ máy:
• Chỉ được biểu diễn bằng số nhị phân. • Bộ vi xử lý chỉ hiểu được các chương trình mã máy. • Con người rất khó khăn để tạo lập hay đọc hiểu chương
trình ngôn ngữ máy.
Hợp ngữ (Assembly Language):
• Là ngôn ngữ lập trình bậc thấp (gần ngôn ngữ máy nhất). • Được xây dựng trên cơ sở ký hiệu tập lệnh của bộ vi xử lý
tương ứng.
• Phụ thuộc hoàn toàn vào bộ vi xử lý cụ thể.
Ngôn ngữ lập trình bậc cao:
• Gần với ngôn ngữ tự nhiên hơn. • Được xây dựng độc lập với cấu trúc của máy tính.
91
Hệ nhúng
Tập lệnh
Mỗi bộ xử lý/ vi điều khiển có một tập lệnh xác định
(mang tính kế thừa trong cùng một dòng họ).
Tập lệnh thường có hàng chục đến hàng trăm lệnh. Mỗi lệnh là một chuỗi số nhị phân mà bộ xử lý/ vi điều khiển hiểu được để thực hiện một thao tác xác định. Các lệnh được mô tả bằng các kí hiệu gợi nhớ các
lệnh hợp ngữ.
Ví dụ: Lệnh ADD A, #3Ah
0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0
3Ah
92
Hệ nhúng
Khuôn dạng của một lệnh máy
Mã thao tác Tham chiếu toán hạng
Mã thao tác (Operation Code - Opcode): mã hóa
cho thao tác mà CPU phải thực hiện.
thao tác (CPU sẽ đọc)
• Toán hạng đích (Destination Operand): dữ liệu ra của
thao tác (CPU sẽ ghi)
93
Tham chiếu toán hạng: mã hóa cho toán hạng hoặc nơi chứa toán hạng mà thao tác sẽ tác động. • Toán hạng nguồn (Source Operand): dữ liệu vào của
Hệ nhúng
Các chế độ địa chỉ
Chế độ địa chỉ tức thời • Toán hạng nguồn là hằng số • Trước dữ liệu tức thời cần có dấu # • Ví dụ:
MOV A, #25
; Nạp giá trị 25 và thanh ghi A
94
Hệ nhúng
Các chế độ địa chỉ
• Sử dụng thanh ghi để lưu trữ dữ liệu cần thao tác • Thanh ghi nguồn và đích phải phù hợp về kích
thước
• Không được chuyển dữ liệu giữa các thanh ghi
R0->R7
• Ví dụ:
MOV A, R0 ; Chuyển dữ liệu trong R0 vào A
95
Chế độ định địa chỉ thanh ghi
Hệ nhúng
Các chế độ địa chỉ
• Toán hạng (nguồn hoặc đích) là địa chỉ của ô nhớ • Trước địa chỉ ô nhớ không có dấu # • Ví dụ:
MOV A, 35h ;Dữ liệu trong ô nhớ có địa chỉ
; 35h được chuyển vào thanh ghi A
96
Chế độ địa chỉ trực tiếp
Hệ nhúng
Các chế độ địa chỉ
• Địa chỉ ô nhớ chứa dữ liệu được chứa trong
thanh ghi R0 hoặc R1
• Trước thanh ghi R0 hoặc R1 phải chèn thêm ký
tự “@” để biểu thị cho chế độ địa chỉ này
• Ví dụ:
MOV A,@R0
;chuyển dữ liệu trong ô nhớ có ;địa chỉ được chỉ ra trong thanh ;ghi R0 vào thanh ghi A
97
Chế độ định địa chỉ gián tiếp thanh ghi
Hệ nhúng
Tập lệnh vi điều khiển 8051
98
Lệnh số học Lệnh truyền dữ liệu Lệnh logic Xử lý bit Lệnh rẽ nhánh
Hệ nhúng
Tập lệnh vi điều khiển 8051
Lệnh số học
Lệnh
Giải thích
ADD đích, nguồn
Đích = đích + nguồn
ADDC đích, nguồn
Đích = đích + nguồn + cờ nhớ
SUBB đích, nguồn
Đích = đích – nguồn
INC nguồn
Đích = đích + 1
DEC nguồn
Đích = đích - 1
MUL AB
A*B
DIV AB
A/B
99
Hệ nhúng
Tập lệnh vi điều khiển 8051
Lệnh truyền dữ liệu
Lệnh
Giải thích
MOV đích, nguồn
Đích = nguồn (Bộ nhớ trong)
MOVX đích, nguồn
Đích = nguồn (Thao tác bộ nhớ ngoài) Đẩy dữ liệu vào đỉnh ngăn xếp
PUSH
Lấy dữ liệu từ đỉnh ngăn xếp
POP
Tráo đổi dữ liệu
XCH
Tráo đổi dữ liệu ( 4 bit thấp)
XCHD
100
Hệ nhúng
Tập lệnh vi điều khiển 8051
Lệnh logic
Lệnh
Giải thích
ANL
Lệnh “AND”
ORL
Lệnh “OR”
XRL
Lệnh “XOR”
CLR
Xóa bit
RL, RLC
Lệnh quay trái
RR, RRC
Lệnh quay phải
101
Hệ nhúng
Tập lệnh vi điều khiển 8051
Lệnh rẽ nhánh
Lệnh
Giải thích
ACALL
Gọi chương trình con, địa chỉ 11 bit
LCALL
Gọi chương trình con, địa chỉ 16 bit
RET
Trở về từ chương trình con
JMP
Lệnh nhảy không điều kiện
JZ, JNZ, JB, JNB… Lệnh nhảy có điều kiện (kiểm tra
bit)
102
Hệ nhúng
Cú pháp của hợp ngữ
Một chương trình hợp ngữ bao gồm một chuỗi
các dòng lệnh hợp ngữ
Một lệnh hợp ngữ có một từ gợi nhớ (ADD,
SUBB, MOV…) và tùy vào từng lệnh mà sau đó không, một hay hai toán hạng
Lệnh hợp ngữ gồm có 4 thành phần
[nhãn:] [từ gợi nhớ] [các toán hạng] [;chú giải] Ví dụ:
103
bat_dau: MOV A,#25 ;Khởi gán A=25
Hệ nhúng
Dữ liệu của chương trình
• Số nhị phân: 1011b, 1011B, ... • Số thập phân: 35, 35d, 35D, ... • Số Hexa: 4Ah, 0ABCDh, 0FFFFH, ... • Kí tự: "A", 'HELLO', "Bach Khoa", ...
Hợp ngữ cho phép biểu diễn dưới dạng:
Tất cả các kiểu dữ liệu trên sau đó đều được trình dịch Assembler dịch ra mã nhị phân.
104
Mỗi kí tự được dịch thành mã ASCII tương ứng • Chương trình không phân biệt 'A' với 41h hay 65
Hệ nhúng
Kiểu dữ liệu
Chỉ có một kiểu dữ liệu là kiểu dữ liệu 8 bit (Kiểu byte) Để định nghĩa một dữ liệu kiểu byte, cần sử
105
dụng chỉ dẫn DB
Hệ nhúng
Các chỉ dẫn
• VD: COUNT EQU 25
ORG: Báo địa chỉ bắt đầu EQU: dùng để định nghĩa hằng số
106
END: báo kết thúc file mã nguồn
Hệ nhúng
Một số lệnh cơ bản
ADD A,nguồn ;cộng toán hạng
;nguồn vào thanh ghi A
Lệnh ADD: cộng • Cú pháp:
• Cú pháp
MOV đích, gốc
;chuyển dữ liệu từ toán hạng ;gốc vào toán hạng đích
107
Lệnh MOV: chuyển dữ liệu
Hệ nhúng
Dịch và chạy chương trình
108
Hệ nhúng
Ví dụ sử dụng lệnh ADD, MOV
;Dia chi bat dau cua chuong trinh ;Nap 25h vao R5 #34h ;Nap 34h vao R7 #0 R5 R7
;Nap 0 vao thanh ghi A ;A=A+R5 ;A=A+R7 (A=25h+34h)
;O lai trong vong lap
ORG 000 MOV R5, #25h MOV R7, MOV A, ADD A, ADD A, HERE: SJMP HERE END
Sử dụng các lệnh ADD, MOV
109
Hệ nhúng
Ví dụ nhấp nháy led
;Dia chi bat dau cua chuong trinh
ORG 000 AGAIN:
;Nhap nhay led o chan P1.0
SETB P1.0 ACALL DELAY CLR P1.0 ACALL DELAY SJMP AGAIN
DELAY:
;Tao tre
MOV R1,#255
LOOP:
DJNZ R1,LOOP
RET END
110
Hệ nhúng
2.4.Các cấu trúc lập trình với hợp ngữ
111
2.4.1. Các lệnh liên quan 2.4.2. Cấu trúc điều kiện 2.4.3. Cấu trúc lặp
Hệ nhúng
Các lệnh điều kiện
Lệnh nhảy có điều kiện: JZ, JNZ, DJNZ, JC,
JNC, JB, JNB
Lệnh nhảy không điều kiện: SJMP (nhảy ngắn),
LJMP (nhảy dài)
;A=R5 ;Nhảy tới NEXT nếu A khác 0
A,R5 NEXT R5,#55h
MOV JNZ MOV
NEXT:
Ví dụ:
112
…
Hệ nhúng
Lệnh lặp
thanh_ghi, nhãn
Lệnh DJNZ • Cú pháp DJNZ + Sau mỗi lần nhảy, giá trị thanh ghi bị giảm đi 1 + Nếu giá trị thanh ghi vẫn khác 0 thì nhảy tới nhãn
Ví dụ: Xóa thanh ghi A, cộng 3 vào thanh ghi A 10 lần
MOV A,#0 MOV R2,#10
BACK: ADD A,#3
DJNZ R2,BACK ;Lặp 10 lần MOV R5,A
;Cất A vào R5
113
Hệ nhúng
Các lệnh logic, lệnh quay
Lệnh ANL
ANL đích, nguồn ; đích=đích AND nguồn Mục đích: che, xóa bit VD: - Xóa 4 bit thấp của thanh ghi A
ANL A,#0F0h
Lệnh ORL
ORL đích, nguồn ; đích=đích OR nguồn Mục đích: thiết lập bit VD: - Thiết lập 4 bit cao của thanh ghi A
ORL A,#0F0h
114
Hệ nhúng
Các lệnh logic, lệnh quay
; đích=đích XOR nguồn
đích, nguồn
VD: Xóa thanh ghi A
Lệnh XRL XRL Mục đích: - Xóa thanh ghi (XOR với chính nó) - Đảo bit (XOR với 1)
XRL A,A Đảo các bit của thanh ghi A
XRL A,#0FFh
115
Hệ nhúng
Các lệnh logic, lệnh quay
• Lệnh quay phải: RR
A
• Lệnh quay trái: RL
A
116
Lệnh quay
Hệ nhúng
Các lệnh logic, lệnh quay
• Lệnh quay phải qua cờ nhớ: RRC A
• Lệnh quay trái qua cờ nhớ: RLC A
117
Lệnh quay
Hệ nhúng
Cổng vào/ra và lập trình
8051 có 4 cổng vào ra (mỗi cổng 8 bit): P0, P1,
P2, P3
Sau khi reset, các cổng ở chế độ mặc định là
cổng ra
; Cổng 1 thành cổng vào
Để các cổng/chân làm việc ở chế độ cổng/chân
SETB P1.0 MOV P1,#03
; Chân P1.0 làm chân vào ; Chân P1.0 và P1.1 làm chân vào ; các chân còn lại làm chân ra
118
vào phải tiến hành ghi các bit 1 ra các cổng/chân tương ứng • Ví dụ: MOV P1,#0FF
Hệ nhúng
Nguyên lý bit cổng
Sơ đồ nguyên lý của một bit cổng
119
Hệ nhúng
Nguyên lý bit cổng
• Đọc tín hiệu từ chân IO:
Read Pin =0: Đệm 3 trạng thái thông, tín hiệu từ IO pin được truyền tới Data bus
120
Đọc dữ liệu:
Hệ nhúng
Nguyên lý bit cổng
Ghi dữ liệu: ?
/Q=1 Gate=1 Rds nhỏ, IO pin =0
• Data(i)=1:
/Q=0 Gate=0 Rds >>, IO pin =1
121
Write=1:Q=Data(i). • Data(i)=0:
Hệ nhúng
Lập trình xuất dữ liệu ra cổng/chân
Xuất dữ liệu ra cổng ra
MOV
tên_cổng, giá trị
• Ví dụ:
MOV
P1, #55h
Xuất dữ liệu ra từng chân • Đưa chân lên mức cao:
SETB
bit
Ví dụ: SETB
P1.0
• Đưa chân xuống mức thấp:
CLR
bit
Ví dụ: CLR
P1.0
122
Hệ nhúng
Ví dụ
MOV
P0,#30h
123
Hệ nhúng
Lập trình đọc dữ liệu từ cổng vào
Bước 1: Thiết lập cổng làm việc ở chế độ cổng
vào
Bước 2: Đọc dữ liệu trên cổng
Ví dụ:
MOV MOV P1, #0FFh A, P1
124
MOV P2, A ; Đọc giá trị tại ; cổng P1, lưu vào A ; Xuất ra cổng P2
Hệ nhúng
Ví dụ
MOV P3,#0FFh MOV A,P3 MOV P0,A MOV P2,A
125
Hệ nhúng
Lập trình C cho VĐK 8051
126
Lập trình cổng vào,ra Lập trình hiển thị led 7 thanh Lập trình xử lý ngắt Lập trình bộ đếm và định thời (Timer/Counter) Lập trình ghép nối bàn phím Lập trình điều khiển LCD Lập trình bảng quang báo
Hệ nhúng
Lập trình C cho 8051
Tuân thủ các cú pháp của ngôn ngữ lập trình C chuẩn
ANSI C
Hỗ trợ thêm một số kiểu dữ liệu/từ khóa mới
• sfr: định nghĩa một thanh ghi đặc biệt (Special Function
Register)
VD: sfr P1=0x90; //Từ đây có thể truy xuất cổng P1
//ở địa chỉ 0x90 thông qua biến P1
• sbit: định nghĩa từng bit trong thanh ghi đặc biệt
VD: sbit Led_pin=P1^1; //Từ đây có thể truy xuất chân 1 của
//cổng P1 thông qua biến Led_pin
• bit: kiểu dữ liệu mang hai giá trị 0 hoặc 1 Ví dụ: xem file AT89X51.h Tham khảo: http://www.keil.com/support/man/docs/c51
127
Hệ nhúng
Chương trình Hello World (Nhấp nháy led chân P1_0)
#include
int i,j; for(i=0;i<255;i++){
for(j=0;j } }
void main(){
while(1){ //Tre mot khoang thoi gian //Tre mot khoang thoi gian } } 128 Lập trình xuất dữ liệu ra cổng hoặc chân ra
• Ghi dữ liệu ra cổng: Tên cổng=dữ liệu VD: P1=0xff; • Ghi dữ liệu ra chân: Tên chân ra=bit (0/1) VD: P1_0=1; Lập trình đọc dữ liệu từ cổng hoặc chân vào
• Thiết lập chân hoặc cổng vào(ghi ra các bit 1)
• Đọc dữ liệu từ cổng: Tên biến=Tên cổng VD: unsigned char value; P1=0xff; //Chuyển cổng sang chế độ cổng vào
value=P1; //Đọc dữ liệu từ cổng P1 • Đọc dữ liệu từ chân: Tên biến=Tên chân VD: bit value; P1_0=1; //Chuyển chân P1_0 thành chân vào
value=P1_0; //Đọc dữ liệu từ chân P1_0 129 • Xuất dữ liệu điều khiển 8 led trên cổng P0 nhấp nháy so le. Ví dụ 1: Xuất dữ liệu ra cổng ra • Thêm một nút bấm vào chân P1_0, nếu nút bấm
ở trạng thái mở, 8 led trên cổng P0 sáng nhấp
nháy so le, nếu nút bấm được nhấn thì 8 led dữ
nguyên trạng thái. 130 Ví dụ 2: Đọc dữ liệu từ chân vào 131 #include int i,j;
for(i=0;i<255;i++){ for(j=0;j } }
void main(){
while(1){ P0=0x55;
delay(100);
P0=0xAA;
delay(100); } } 132 133 134 Khi sử dụng các phím bấm cơ khí sẽ có hiện tượng này phím, đó là hiện tượng tín hiệu thay
đổi mức liên tục trong một khoảng thời gian ngắn
trước khi chuyển sang trạng thái ổn định. 135 • Thay vì đọc một ký tự A từ bàn phím thì đọc thành nhiều ký tự A: AAAAAA • Đếm số lần bấm phím sẽ không còn chính xác
• Giữa thời điểm nhấn phím và nhả phím sẽ xuất hiện nhiều lần “giả” bấm và nhả phím Hậu quả của này phím 136 • Thêm một khoảng trễ (tùy thuộc vào từng loại nút
bấm, thông thường khoảng 20ms) sau khi nhận
sự kiện nhấn phím đầu tiên -> bỏ qua thời gian
nảy phím Chống nảy phím bằng phần mềm • Đấu thêm tụ điện song song với công tắc
• Sử dụng trigger smith 137 Chống nảy phím bằng phần cứng void main(){ int count=0;
P1_0=1; //Chan P1_0 lam chan vao
while(1){ if(P1_0==0){ count++; }
delay(10); //Tạo trễ chống nảy phím } 138 } • Led đơn 139 Nguyên tắc hoạt động của led 7 thanh Cấu thành từ các led đơn • Anode chung
• Cathode chung 140 Phân loại: 141 142 #include int i,j;
for(i=0;i<255;i++){ for(j=0;j } }
void main(){
while(1){ //Hien thi so 0 //Hien thi so 1 //Hien thi so 2 P0=0x40;
delay(100);
P0=0x79;
delay(100);
P0=0x24;
delay(100); } } 143 Phương pháp thăm dò: bộ vi điều khiển liên tục
kiểm tra yêu cầu của các thiết bị để phục vụ.
Quá trình phục vụ diễn ra tuần tự nếu có nhiều
thiết bị cùng yêu cầu 144 Phương pháp ngắt: mỗi khi thiết bị yêu cầu phục
vụ, thiết bị gửi tín hiệu yêu cầu tới chân ngắt của
vi điều khiển. Vi điều khiển sẽ xử lý yêu cầu ngắt
đó. Chương trình xử lý ngắt gọi là trình phục vụ
ngắt (ISR-Interrupt Service Routine) Mỗi ngắt luôn có một trình phục vụ ngắt
Khi một ngắt được kích hoạt thì vi điều khiển thực thi trình phục vụ ngắt Trình phục vụ ngắt của mỗi ngắt có một vị trí cố định trong bộ nhớ Tập hợp các ô nhớ lưu giữ địa chỉ của tất cả các 145 trình phục vụ ngắt gọi là bảng vector ngắt
(Interrupt Table) Chu trình xử lý ngắt Được thêm vào cuối chu trình lệnh
Sau khi hoàn thành một lệnh, CPU kiểm tra xem có yêu cầu ngắt gửi đến hay không
• Nếu không có tín hiệu yêu cầu ngắt thì CPU nhận lệnh kế tiếp • Nếu có yêu cầu ngắt và ngắt đó được chấp nhận thì: CPU cất ngữ cảnh hiện tại của chương trình đang thực hiện (các thông tin liên quan đến chương trình bị ngắt) CPU chuyển sang thực hiện chương trình con phục vụ ngắt tương ứng Kết thúc chương trình con đó, CPU khôi phục lại ngữ cảnh
và trở về tiếp tục thực hiện chương trình đang tạm dừng 146 1. Kết thúc lệnh hiện tại, lưu địa chỉ của lệnh kế tiếp (PC) vào ngăn xếp 2. Nhảy đến vị trí cố định trong bảng vector ngắt
3. Nhận địa chỉ của trình phục vụ ngắt, nhảy tới địa chỉ đó và bắt đầu thực thi chương trình con
phục vụ ngắt cho đến lệnh cuối cùng là lệnh
RETI 147 4. Kết thúc chương trình con phục vụ ngắt, bộ vi
điều khiển trở về thực thi tiếp lệnh nơi nó đã bị
ngắt Hoạt động ngắt (tiếp) 148 Xử lý với nhiều tín hiệu yêu cầu ngắt • Khi một ngắt đang được thực hiện, các ngắt khác sẽ bị cấm • Bộ xử lý sẽ bỏ qua các ngắt tiếp theo trong khi đang xử lý một ngắt • Các ngắt vẫn đang đợi và được kiểm tra sau khi ngắt đầu tiên được xử lý xong
• Các ngắt được thực hiện tuần tự 149 Xử lý ngắt tuần tự: Xử lý ngắt tuần tự (tiếp) 150 Xử lý với nhiều tín hiệu yêu cầu ngắt • Các ngắt được định nghĩa mức ưu tiên khác nhau
• Ngắt có mức ưu tiên thấp hơn có thể bị ngắt bởi
ngắt ưu tiên cao hơn ngắt xảy ra lồng nhau 151 Xử lý ngắt ưu tiên: Xử lý ngắt ưu tiên 152 • Ngắt RESET
• 2 ngắt cho bộ đếm và định thời
• 2 ngắt ngoài (INT0, INT1)
• 1 ngắt cho bộ truyền thông nối tiếp UART 153 8051 có 6 nguồn ngắt 154 Bảng vector ngắt của 8051 • Chương trình con xử lý ngắt cũng là một chương trình con. • Điểm khác biệt: chương trình con xử lý
ngắt được gọi bởi bộ vi điều khiển. 155 Dưới góc nhìn của ngôn ngữ C void Tên_chương_trình_con() interrupt Số_hiệu • Tên chương trình con ngắt: do người lập trình đặt, tuân thủ các quy tắc giống như chương trình con thông thường • Số hiệu ngắt: số hiệu vector ngắt (Xem trong file at89x51.h) #define IE0_VECTOR
#define TF0_VECTOR
#define IE1_VECTOR
#define TF1_VECTOR
#define SIO_VECTOR 0 /* External Interrupt 0 */
1 /* Timer 0 */
2 /* External Interrupt 1 */
3 /* Timer 1 */
4 /* Serial port */ 156 • Tín hiệu yêu cầu ngắt được gửi đến chân INT0 (P3_2) và chân INT1 (P3_3) • 8051 có thể nhận ngắt theo 2 kiểu Ngắt phần cứng ngoài (0 và 1) Ngắt theo sườn âm: ngắt được kích hoạt khi có
sườn âm (chuyển từ mức cao xuống mức thấp)
đưa đến chân ngắt 157 158 Bước 1: Thiết lập thanh ghi IE để cho phép ngắt ngoài Bước 2: Chọn chế độ ngắt (theo sườn hay theo mức): thiết lập bit IT0 và IT1 cho thanh ghi
TCON
• Bit IT0 cho ngắt ngoài 0 và IT1 cho ngắt ngoài 1
• ITx=0-> ngắt theo mức, ITx=1->ngắt theo sườn 159 Bước 3: Viết chương trình con xử lý ngắt Viết chương trình xử lý ngắt ngoài 0 theo chế độ void IEX0_Process() interrupt 0 { //Chương trình }
void main(){ IE=0x81; //Cho phép ngắt ngoài 0
IT0=0; //Chế độ ngắt theo mức
while(1){ //Chương trình } } 160 ngắt theo mức Viết chương trình xử lý ngắt ngoài 1 theo chế độ void IEX0_Process() interrupt 2 { //Chương trình }
void main(){ IE=0x84; //Cho phép ngắt ngoài 1
IT1=1; //Chế độ ngắt theo sườn
while(1){ //Chương trình } } 161 ngắt theo sườn 162 • Timer/Counter 1 và Timer/Counter 0 8051 có hai bộ đếm và định thời • Bộ định thời (Timer): tạo độ trễ thời gian chính xác • Bộ đếm (Counter): đếm xung 163 Ứng dụng Cả hai bộ định thời đều có độ dài 16 bit, được chia thành hai thanh ghi 8 bit • Thanh ghi TH0: 8 bit cao
• Thanh ghi TL0: 8 bit thấp Bộ định thời 0: • Thanh ghi TH1: 8 bit cao
• Thanh ghi TL1: 8 bit thấp 164 Bộ định thời 1: Hoạt động ở chế độ bộ định thời (xét chế độ bộ lên 1 sau 12 chu kỳ dao động • Sau khi đạt giá trị tối đa (65535), cờ TF0/TF1 báo tràn bộ định thời sẽ được phát sinh định thời 16 bit)
• Giá trị trong thanh ghi bộ định thời tự động tăng 165 Tính toán giá trị ban đầu cho thanh ghi bộ định thời Nạp giá trị này vào thanh ghi bộ định thời
Khởi động bộ định thời
Thanh ghi bộ định thời sẽ tự động tăng cho đến 166 giá trị tối đa và thiết lập cờ TF báo tràn. Các thanh ghi điều khiển Timer/Counter • TR1/TR0: bit khởi động/tắt bộ đếm/định thoài
• TF1/TF0: cờ báo tràn bộ đếm/định thời
• IE1, IT1, IE0, IT0: liên quan tới ngắt phần cứng ngoài 167 Thanh ghi TCON Các thanh ghi điều khiển Timer/Counter Thanh ghi TMOD • Gate: sử dụng cho bộ đếm
• C/T: chọn chế độ (bộ đếm hay bộ định thời) C/T=0: bộ định thời
C/T=1: bộ đếm • M1,M0: chọn chế độ làm việc. Có hai chế độ thông dụng M1=0, M0=1: chế độ 1, bộ Timer/Counter 16 bit
M1=1, M0=0: chế độ 2, bộ Timer/Counter 8 bit tự động nạp lại 168 Ví dụ: tạo trễ 50ms (với tần số 12MHz) Bước 1: tính toán giá trị ban đầu cho thanh ghi bộ định thời:
• 65535 – 50000 + 1=15536 (0x3CB0) • Với Timer 0: TH0=0x3C, TL0=0xB0
• Với Timer 1: TH1=0x3C, TL1=0xB0 Bước 2: nạp giá trị vào thanh ghi bộ định thời • Với Timer 0: TR0=1
• Với Timer 1: TR1=1 Bước 3: Khởi động bộ định thời Bước 4: Chờ cờ tràn được thiết lập (TF0=1 hoặc 169 TF1=1) 170 Cấu trúc bàn phím ma trận Tín hiệu mức thấp được đưa tới tất cả các hàng
Bình thường, tín hiệu tại các cột là mức cao
Khi có nút được bấm trên cột nào thì tín hiệu đọc tại cột đó sẽ ở mức thấp • Kiểm tra tín hiệu tại các cột 171 Để xác định được chính xác nút ở hàng nào, cột
nào được bấm thì phải thực hiện thủ tục quét
phím
• Mỗi thời điểm chỉ đưa tín hiệu mức thấp tới 1
hàng, các hàng còn lại đưa tín hiệu mức cao 172 Ghép nối vi điều khiển với ma trận phím 173 • 2 hàng, 16 cột 174 LCD LM016L 175 176 • Sử dụng phương thức ghi (0-> R/W)
• Thao tác thanh ghi lệnh (0-> RS)
Bước 2: Gửi dữ liệu hiển thị trên LCD • Chọn vị trí hiển thị (nếu cần)
• Sử dụng phương thức ghi (0-> RW)
• Thao tác thanh ghi dữ liệu (1-> RS)
• Dữ liệu gửi tới LCD là mã ASCII của ký tự cần hiển thị • Gửi đến chân E 1 xung cao xuống thấp để chốt dữ liệu 177 Bước 1: Thiết lập cấu hình làm việc cho LCD 178 void LCD_Send_Command(unsigned char x)
{ LCD_DATA=x;
RS=0; //Chon thanh ghi lenh
RW=0; //De ghi du lieu
EN=1;
Delay_ms(1);
EN=0;
Wait_For_LCD(); //Doi cho LCD san sang
EN=1; } 179 void LCD_Write_One_Char(unsigned char c)
{ LCD_DATA=c; //Dua du lieu vao thanh ghi
RS=1; //Chon thanh ghi du lieu
RW=0;
EN=1;
Delay_ms(1);
EN=0;
Wait_For_LCD();
EN=1; } 180 void LCD_init()
{ //Chon che do 5x7 bit, 2 hang cho LCD
LCD_Send_Command(0x38);
//Bat hien thi, nhap nhay con tro
LCD_Send_Command(0x0E);
LCD_Send_Command(0x01); //Xoa man hinh
LCD_Send_Command(0x80); //Ve dau dong 181 } 182 Ví dụ bảng quang báo: bảng quảng cáo, thông 183 báo… Nguyên tắc hoạt động của bảng quang báo Bảng quang báo hoạt động dựa trên hiện tượng lưu ảnh trên mắt người 184 Các hàng/cột của bảng quang báo được quét với
tốc độ rất nhanh và do hiện tượng lưu ảnh mà
mắt người không cảm nhận được sự thay đổi Bảng quang báo kích thước nhỏ: một hoặc một 185 vài module led 8x8 Bảng quang báo kích thước lớn: hàng chục/hàng trăm module led được ghép nối với nhau
Mỗi một cụm module led sẽ có vi điều khiển
Các vi điều khiển tại các cụm sẽ được kết nối với 186 nhau theo các chuẩn truyền tin
• RS485
• CAN
• I2C
• … Mỗi module led sẽ bao gồm các chân điều khiển hàng và điều khiển cột VD: module led 8x8 có 8 chân điều khiển hàng 187 và 8 chân điều khiển cột Các bước làm ứng dụng quang báo Tạo font chữ mong muốn
Thiết kế mạch ghép nối các module led với nhau và với vi điều khiển 188 Thực hiện thuật toán quét led phù hợp Để hiển thị chữ A trên 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 module led 8x8
• Bước 1: Tạo font chữ
(thường có kích thước
5x8 – chiều rộng 5 pixel
và cao 8 pixel) 1 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
189 190 191 192 193 194 195 196 197 198 Kiến trúc tổng quan lõi vi xử lý ARM
Kiến trúc vi điều khiển lõi ARM920T (S3C2440)
Lập trình ứng dụng trên hệ điều hành Linux 199 nhúng Kiến trúc tổng quan lõi vi xử lý ARM ARM là dòng vi xử lý 32 bit được thiết kế theo kiến trúc tập lệnh RISC (Reduced Instruction Set
Computer) • Advanced RISC Machine
• Acorn RISC Machine ARM viết tắt của ARM là kiến trúc được sử dụng rộng rãi trong 200 các hệ thống nhúng: Mobile phones, PDAs, thiết
bị điện tử gia dụng… Kiến trúc tổng quan vi xử lý lõi ARM Kế thừa các đặc điểm của kiến trúc tập lệnh liệu trực tiếp trên bộ nhớ • Chế độ địa chỉ đơn giản (ít chế độ địa chỉ hơn kiến trúc CISC) Phát triển các đặc trưng mới của ARM • Các lệnh có kết hợp với lệnh dịch hoặc các lệnh logic
• Chế độ địa chỉ tự động tăng-giảm để tối ưu hóa các vòng lặp • Nạp và lưu (load/store) nhiều lệnh cùng lúc cho phép nâng cao thông lượng 201 Kiến trúc tổng quan lõi vi xử lý ARM 202 Thumb Instruction Set: tập lệnh 16 bit cho phép tăng mật độ lệnh Jazelle: công nghệ cho phép tăng tốc các ứng dụng viết bằng Java SIMD, NEON: công nghệ nâng cao hiệu năng cho các ứng dụng Video/Audio 203 TrustZone: công nghệ nâng cao tính bảo mật 204 Kiến trúc tổng quan vi xử lý lõi ARM ARM được rất nhiều hãng phát triển và sản xuất, 205 ở Việt Nam phổ biến chip ARM của các hãng
• ATMEL: AT91SAM7, AT91SAM9…
• NXP: LPC2138, LPC2148, LPC2300…
• TI (Texas Instrument): TMS470, TMS570…
• SAMSUNG: S3C2440
• … • Core: ARM920T core , 16 Kbytes Data Cache, 16 Kbytes Instruction cache Xung nhịp tối đa: 400 MHz • Memories Giao diện bus AMBA (Advanced Micro controller Bus Architecture)
4 KByte SRAM nội 206 Đặc điểm của chip S3C2440 207 • Ngoại vi (Peripherals)
USB Host/Device
10/100 Mbps Ethernet MAC Controller
SPI, I2C…
32 bit Timer/Counter
3 USARTs
Multimedia Card Interface
ADC 10 bit 8 kênh
Giao tiếp cảm biến ảnh (Image Sensor)
Điều khiển LCD
Điều khiển AC97 audio codec 208 Đặc điểm của chip S3C2440 (tiếp) • Hệ thống 4 kênh DMA (Direct Memory Access)
Boot hệ thống từ NOR Flash, NAND Flash, SDCard, Ethernet Bộ điều khiển ngắt nâng cao AIC(Advanced Interrupt Controller) • Vào ra 130 chân vào ra lập trình được 209 Đặc điểm của chip S3C2440(tiếp) 210 R13: Stack Pointer R14: Link Register R15: Program Counter 211 Các cờ kết quả hoạt động của ALU
Điều khiển cho phép/cấm ngắt
Thiết lập chế độ hoạt động 212 213 • Lệnh rẽ nhánh (Branch)
• Lệnh xử lý dữ liệu (Data Processing)
• Trao đổi thanh ghi trạng thái (Status Register Transfer) • Nạp và lưu (Load and Store)
• Phát sinh ngoại lệ (Exception-Generating) 214 Tập lệnh ARM chia thành các nhóm lệnh Bus địa chỉ 32 bit • Địa chỉ bắt đầu: 0x00000000
• Địa chỉ kết thúc: 0x40000000
• Chia thành nhiều bank nhớ, mỗi bank 128 MB, tổng không gian bộ nhớ 1GB 6 bank nhớ cho ROM, SRAM
2 bank nhớ cho ROM, SRAM, SDRAM, …. Hỗ trợ cả hai kiểu lưu trữ: little endian, big endian 215 216 Hỗ trợ hai chế độ khởi động chính
Với chế độ khởi động từ Nand Flash, 4 Kbytes
BootSram được ánh xạ vào vùng nhớ chọn bởi
nGCS0. Với chế độ khởi động từ Nor Flash, Nor Flash
được ánh xạ vào vùng nhớ chọn bởi nGCS0. Vùng nhớ cho SDRAM bắt đầu tại địa chỉ 217 0x30000000 và kết thúc ở địa chỉ 0x34000000. 218 219 220 Thông số kỹ thuật 221 • Hệ điều hành Linux
• Cross toolchains (gcc 4.3.2)
• TFTP (client/server)
• USB push 222 Phần mềm 223 Chạy ứng dụng ở chế độ Stand-alone • Biên dịch chương trình
• Nạp chương trình lên SDRAM và chạy trực tiếp (sử dụng SuperVivi, USB push) Chạy ứng dụng trên nền hệ điều hành • Biên dịch chương trình
• Chạy chương trình trên nền hệ điều hành Linux nhúng Trên KIT cài TFTP client
Trên máy phát triển, cài TFTP server
Trên KIT dùng lệnh TFTP để download chương trình 224 225 226 227 Cài đặt môi trường phát triển
Xây dựng chương trình HelloWorld
Lập trình vào ra căn bản
Lập trình xử lý ngắt
Lập trình giao tiếp cổng COM
Lập trình ứng dụng đồ họa • Hệ điều hành Linux (Ubuntu 9.04)
• Trình biên dịch chéo: ARM Linux GCC 4.3.2 Môi trường phát triển • TFTP Server client/server
• GFTP Server Phần mềm hỗ trợ • Linux host: 192.168.1.30
• Linux target: 192.168.1.230 228 Cấu hình mạng sử dụng Xây dựng chương trình Hello World Bước 1: viết code chương trình
Bước 2: dịch chương trình
-Cách 1: dùng lệnh make
-Cách 2: dùng lệnh tường minh arm-linux-gcc –o OutputFile Source.c Bước 3: dùng tftp download chương trình xuống dưới KIT
tftp –l localfile –r remotefile –g ServerIP 229 Bước 4: chạy chương trình trên KIT 230 Khởi tạo: Khai báo thư viện
Bước 1: Mở cổng
Bước 2: Thiết lập tham số
Bước 3: Đọc, ghi cổng
Bước 4: Đóng cổng 231 #include 232 Sử dụng lệnh mở file
int fd = open ("/dev/ttyUSB0", O_RDWR);
Fd >0 nếu mở file thành công
Fd<0 nếu mở file thất bại 233 Sử dụng cấu trúc termios
struct termios port_settings;
Thiết lập tham số (9600, 8, n, 1)
cfsetispeed(&port_settings, B9600);
cfsetospeed(&port_settings, B9600);
port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &port_settings); Đọc cổng: sử dụng lệnh đọc file n=read(fd,&result,sizeof(result)); N: số ký tự đọc được
Result: chứa kết quả
Ghi cổng: sử dụng lệnh ghi file n=write(fd,“Hello World\r",12); N:số ký tự đã ghi
Fd: file id (có được từ thao tác mở file thành 234 công) Đóng cổng: sử dụng lệnh đóng file 235 close (fd);
Fd: file ID (có được từ thao tác mở file thành công) • Ứng dụng đa nền: Desktop, mobile, embedded computer • Viết code 1 lần duy nhất, chạy trên nhiều nền tảng khác nhau • Sử dụng ngôn ngữ C/C++
• Hỗ trợ các nền tảng: Windows, Linux, Embedded Linux, Win CE, Symbian, Maemo… • Có thể tích hợp với các IDE thông dụng: Visual Studio, Eclipse • Tham khảo: qt.nokia.com; qtcentre.org 236 Sử dụng nền tảng QT của Nokia 237 238 239 Signals: tương tự Event
Slot: tương tự Event Handler
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
VD: đồng bộ hai điều khiển trên QT IDE
1) QT Creator
2) Tích hợp vào Visual Studio, Eclipse 240 Chương trình dịch: qmake
1) Qmake for Windows
2) Qmake for Linux
3) Qmake for Embedded Linux
… 241 242 243P1_0=1;
delay(100);
P1_0=0;
delay(100);
Hệ nhúng
Lập trình cổng vào,ra
Hệ nhúng
Ví dụ
Hệ nhúng
Ví dụ 1: xuất dữ liệu ra cổng
Hệ nhúng
xuất dữ liệu ra cổng
Hệ nhúng
Ví dụ 2: đọc dữ liệu từ chân vào
Hệ nhúng
đọc dữ liệu từ chân vào
#include
int i,j;
for(i=0;i<255;i++){
for(j=0;j
}
}
void main(){
while(1){
//Kiem tra trang thai chan P1_0 (dau voi cong tac)
if(P1_0 == 1){
P0=0x55;
delay(100);
P0=0xAA;
delay(100);
}
}
}
Hệ nhúng
Hiện tượng nảy phím (key bounce)
Lý tưởng
Thực tế
Hệ nhúng
Hiện tượng nảy phím (key bounce)
Chống nảy phím
Hệ nhúng
Chống nảy phím
Hệ nhúng
Chống nảy phím bằng phần mềm
Hệ nhúng
Lập trình hiển thị led 7 thanh
Hệ nhúng
Led 7 thanh
Hệ nhúng
Phân loại led 7 thanh
Hệ nhúng
Ví dụ
Liên tục hiển thị lần lượt các số 0,1,2
Hệ nhúng
Ví dụ
Hệ nhúng
Phương pháp ngắt và thăm dò
Hệ nhúng
Trình phục vụ ngắt
Hệ nhúng
Hệ nhúng
Trình tự phục vụ ngắt của 8051
Hệ nhúng
Hệ nhúng
Hệ nhúng
Hệ nhúng
Hệ nhúng
Hệ nhúng
Các ngắt của 8051
Hệ nhúng
Bảng vector ngắt
Hệ nhúng
Lập trình xử lý ngắt
Hệ nhúng
Khung chương trình con xử lý ngắt
Hệ nhúng
Các nguồn ngắt
Ngắt theo mức thấp: ngắt được kích hoạt khi có tín
hiệu mức thấp đưa đến chân ngắt (Đây là chế độ
mặc định)
• Thiết lập chế độ kích hoạt ngắt qua thanh ghi
TCON (bit IT0 cho INT0 và IT1 cho INT1)
Hệ nhúng
Thanh ghi TCON
Hệ nhúng
Lập trình xử lý ngắt ngoài
Hệ nhúng
Ví dụ 1
Hệ nhúng
Ví dụ 2
Hệ nhúng
Demo
Hệ nhúng
Lập trình bộ đếm/định thời
Hệ nhúng
Cấu tạo và nguyên tắc hoạt động
Hệ nhúng
Cấu tạo và nguyên tắc hoạt động
• VD: chu kỳ dao động đồng hồ là 12MHz -> cứ mỗi
us giá trị thanh ghi bộ định thời sẽ tăng lên 1->
chúng ta có thể tính toán để đưa ra thời gian
trễ chính xác
Hệ nhúng
Các bước lập trình bộ định thời
Hệ nhúng
Hệ nhúng
Hệ nhúng
Hệ nhúng
Lập trình ghép nối bàn phím
Hệ nhúng
Hoạt động của ma trận phím
Hệ nhúng
Demo
Hệ nhúng
Khi có phím bấm, có tín hiệu yêu cầu ngắt gửi tới chân
ngắt ngoài 0
Hệ nhúng
Lập trình điều khiển LCD
Hệ nhúng
Sơ đồ khối
Hệ nhúng
Sơ đồ chân
Hệ nhúng
Các bước lập trình điều khiển LCD
Hệ nhúng
Tập lệnh điều khiển LCD
Hệ nhúng
Hàm gửi lệnh điều khiển tới LCD
Hệ nhúng
Hàm gửi 1 ký tự tới LCD
Hệ nhúng
Hàm khởi tạo LCD
Hệ nhúng
Ví dụ
Hệ nhúng
Lập trình bảng quang báo
Hệ nhúng
Hệ nhúng
Linh kiện làm bảng quang báo
Hệ nhúng
Linh kiện làm bảng quang báo
Hệ nhúng
Cấu tạo module led
Hệ nhúng
Hệ nhúng
Ví dụ
Hệ nhúng
Font chữ B
Hệ nhúng
Font chữ C
Hệ nhúng
Font chữ D
Hệ nhúng
Font chữ E
Hệ nhúng
Font số 0
Hệ nhúng
Font số 1
Hệ nhúng
Font số 2
Hệ nhúng
Font số 3
Hệ nhúng
Font số 4
Hệ nhúng
3.2. Vi điều khiển họ ARM
Hệ nhúng
Hệ nhúng
RISC
• Số lượng thanh ghi lớn và có kích thước giống nhau
• Tập lệnh load/store, không cho phép các thao tác xử lý dữ
Hệ nhúng
Kiến trúc các dòng ARM
Hệ nhúng
Công nghệ đặc trưng
Hệ nhúng
So sánh hiệu năng các dòng ARM
Phân nhóm theo hiệu năng và tính hữu dụng
Hệ nhúng
Hệ nhúng
Kiến trúc vi điều khiển S3C2440
Hệ nhúng
Lõi vi xử lý ARM920T
Hệ nhúng
Kiến trúc vi điều khiển S3C2440
Hệ nhúng
Kiến trúc vi điều khiển S3C2440
Hệ nhúng
Hệ nhúng
Tập thanh ghi và chế độ hoạt động
R0->R12: thanh ghi
công dụng chung
CPSR: Current
Program Status
Register
SPSR_SVC: Saved
Program Status
Register
Hệ nhúng
Thanh ghi trạng thái chương trình
Hệ nhúng
Mode bits
Hệ nhúng
Tập lệnh của S3C2440
Hệ nhúng
Bản đồ bộ nhớ
Hệ nhúng
Hệ nhúng
Bản đồ bộ nhớ
Hệ nhúng
Giới thiệu KIT nhúng mini2440
Hệ nhúng
Giới thiệu KIT nhúng mini2440
Hệ nhúng
Giới thiệu KIT nhúng mini2440
Hệ nhúng
Giới thiệu KIT nhúng mini2440
Hệ nhúng
Môi trường phát triển ứng dụng
Hệ nhúng
Môi trường phát triển ứng dụng
Môi trường phát triển ứng dụng theo nhóm
Hệ nhúng
Quy trình phát triển ứng dụng
Hệ nhúng
Demo
Hệ nhúng
Thảo luận
Hệ nhúng
Lập trình ứng dụng trên Linux
Hệ nhúng
Cài đặt môi trường phát triển
Hệ nhúng
Hệ nhúng
Lập trình giao tiếp cổng COM
Hệ nhúng
Khai báo thư viện
Hệ nhúng
Bước 1: Mở cổng
Hệ nhúng
Bước 2: Thiết lập tham số
Hệ nhúng
Bước 3: Đọc, ghi cổng
Hệ nhúng
Bước 4: Đóng cổng
Hệ nhúng
Lập trình ứng dụng đồ họa
Hệ nhúng
Ứng dụng QT
Hệ nhúng
Kiến trúc QT SDK
Hệ nhúng
Cơ chế Signals and Slot của QT
Hệ nhúng
Môi trường phát triển
Hệ nhúng
QT Creator
Hệ nhúng
Demo
Hệ nhúng
Thảo luận
Hệ nhúng