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 void delay(int interval){

int i,j; for(i=0;i<255;i++){

for(j=0;j

}

} void main(){ while(1){

//Tre mot khoang thoi gian

P1_0=1; delay(100); P1_0=0; delay(100);

//Tre mot khoang thoi gian

}

}

128

Hệ nhúng

Lập trình cổng vào,ra

 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

Hệ nhúng

Ví dụ

• 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

Hệ nhúng

Ví dụ 1: xuất dữ liệu ra cổng

131

Hệ nhúng

xuất dữ liệu ra cổng

#include void delay(int interval){

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

Hệ nhúng

Ví dụ 2: đọc dữ liệu từ chân vào

133

Hệ nhúng

đọc dữ liệu từ chân vào

#include void delay(int interval){

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); }

}

}

134

Hệ nhúng

Hiện tượng nảy phím (key bounce)

 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.

Lý tưởng

Thực tế

135

Hệ nhúng

Hiện tượng nảy phím (key bounce)

• 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

Chống nảy phím

136

Hệ nhúng

Chống nảy phím

• 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

Hệ nhúng

Chống nảy phím bằng phần mềm

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

}

Hệ nhúng

Lập trình hiển thị led 7 thanh

• Led đơn

139

 Nguyên tắc hoạt động của led 7 thanh

Hệ nhúng

Led 7 thanh

 Cấu thành từ các led đơn

• Anode chung • Cathode chung

140

 Phân loại:

Hệ nhúng

Phân loại led 7 thanh

141

Hệ nhúng

Ví dụ

Liên tục hiển thị lần lượt các số 0,1,2

142

Hệ nhúng

Ví dụ

#include void delay(int interval){

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

Hệ nhúng

Phương pháp ngắt và thăm dò

 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)

Hệ nhúng

Trình phục vụ ngắt

 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)

Hệ nhúng

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

Hệ nhúng

Trình tự phục vụ ngắt của 8051

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

Hệ nhúng

Hoạt động ngắt (tiếp)

148

Hệ nhúng

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ự:

Hệ nhúng

Xử lý ngắt tuần tự (tiếp)

150

Hệ nhúng

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:

Hệ nhúng

Xử lý ngắt ưu tiên

152

Hệ nhúng

Các ngắt của 8051

• 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

Hệ nhúng

Bảng vector ngắt

154

 Bảng vector ngắt của 8051

Hệ nhúng

Lập trình xử lý ngắt

• 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

Hệ nhúng

Khung chương trình con xử lý ngắt

 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

Hệ nhúng

Các nguồn ngắt

• 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 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)

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

• Thiết lập chế độ kích hoạt ngắt qua thanh ghi TCON (bit IT0 cho INT0 và IT1 cho INT1)

157

Hệ nhúng

Thanh ghi TCON

158

Hệ nhúng

Lập trình xử lý ngắt ngoài

 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

Hệ nhúng

Ví dụ 1

 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

Hệ nhúng

Ví dụ 2

 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

Hệ nhúng

Demo

162

Hệ nhúng

Lập trình bộ đếm/định thời

• 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

Hệ nhúng

Cấu tạo và nguyên tắc hoạt độ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:

Hệ nhúng

Cấu tạo và nguyên tắc hoạt động

 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

• 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

165

Hệ nhúng

Các bước lập trình bộ định thời

 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.

Hệ nhúng

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

Hệ nhúng

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

Hệ nhúng

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)

Hệ nhúng

Lập trình ghép nối bàn phím

170

 Cấu trúc bàn phím ma trận

Hệ nhúng

Hoạt động của ma trận phím

 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

Hệ nhúng

Demo

172

Hệ nhúng

Ghép nối vi điều khiển với ma trận phím

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

173

Hệ nhúng

Lập trình điều khiển LCD

• 2 hàng, 16 cột

174

 LCD LM016L

Hệ nhúng

Sơ đồ khối

175

Hệ nhúng

Sơ đồ chân

176

Hệ nhúng

Các bước lập trình điều khiển LCD

• 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

Hệ nhúng

Tập lệnh điều khiển LCD

178

Hệ nhúng

Hàm gửi lệnh điều khiển tới LCD

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

Hệ nhúng

Hàm gửi 1 ký tự tới LCD

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

Hệ nhúng

Hàm khởi tạo LCD

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

}

Hệ nhúng

Ví dụ

182

Hệ nhúng

Lập trình bảng quang báo

 Ví dụ bảng quang báo: bảng quảng cáo, thông

183

báo…

Hệ nhúng

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

Hệ nhúng

Linh kiện làm bảng quang báo

 Bảng quang báo kích thước nhỏ: một hoặc một

185

vài module led 8x8

Hệ nhúng

Linh kiện làm bảng quang báo

 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 • …

Hệ nhúng

Cấu tạo module led

 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

Hệ nhúng

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

Hệ nhúng

Ví dụ

 Để 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

Hệ nhúng

Font chữ B

190

Hệ nhúng

Font chữ C

191

Hệ nhúng

Font chữ D

192

Hệ nhúng

Font chữ E

193

Hệ nhúng

Font số 0

194

Hệ nhúng

Font số 1

195

Hệ nhúng

Font số 2

196

Hệ nhúng

Font số 3

197

Hệ nhúng

Font số 4

198

Hệ nhúng

3.2. Vi điều khiển họ ARM

 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

Hệ 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…

Hệ nhú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

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ữ

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

Hệ nhúng

Kiến trúc tổng quan lõi vi xử lý ARM

Kiến trúc các dòng ARM

202

Hệ nhúng

Công nghệ đặc trưng

 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

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

204

Hệ nhúng

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 • …

Hệ nhúng

Kiến trúc vi điều khiển 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

Hệ nhúng

Lõi vi xử lý ARM920T

207

Hệ nhúng

Kiến trúc vi điều khiển S3C2440

• 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ệ nhúng

Kiến trúc vi điều khiển S3C2440

• 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)

Hệ nhúng

210

Hệ nhúng

Tập thanh ghi và chế độ hoạt động

R0->R12: thanh ghi công dụng chung

R13: Stack Pointer

R14: Link Register

R15: Program Counter

CPSR: Current Program Status Register

SPSR_SVC: Saved Program Status Register

211

Hệ nhúng

Thanh ghi trạng thái chương trình

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

Hệ nhúng

Mode bits

213

Hệ nhúng

Tập lệnh của S3C2440

• 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

Hệ nhúng

Bản đồ bộ 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

Hệ nhúng

216

Hệ nhúng

Bản đồ bộ nhớ

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.

Hệ nhúng

Giới thiệu KIT nhúng mini2440

218

Hệ nhúng

Giới thiệu KIT nhúng mini2440

219

Hệ nhúng

Giới thiệu KIT nhúng mini2440

220

 Thông số kỹ thuật

Hệ nhúng

Giới thiệu KIT nhúng mini2440

221

Hệ nhúng

Môi trường phát triển ứng dụng

• Hệ điều hành Linux • Cross toolchains (gcc 4.3.2) • TFTP (client/server) • USB push

222

 Phần mềm

Hệ nhúng

Môi trường phát triển ứng dụng

223

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

 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

Hệ nhúng

Demo

225

Hệ nhúng

Thảo luận

226

Hệ nhúng

Lập trình ứng dụng trên Linux

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ệ nhúng

Cài đặt môi trường phát triển

• 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

Hệ nhú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

Hệ nhúng

Lập trình giao tiếp cổng COM

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

Hệ nhúng

Khai báo thư viện

231

 #include  #include  #include  #include // UNIX standard function  #include // File control definitions  #include // Error number definitions  #include // POSIX terminal control  #include // time calls

Hệ nhúng

Bước 1: Mở cổng

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

Hệ nhúng

Bước 2: Thiết lập tham số

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);

Hệ nhúng

Bước 3: Đọc, ghi cổng

 Đọ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)

Hệ nhúng

Bước 4: Đóng 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)

Hệ nhúng

Lập trình ứng dụng đồ họa

• Ứ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

Hệ nhúng

Ứng dụng QT

237

Hệ nhúng

Kiến trúc QT SDK

238

Hệ nhúng

Cơ chế Signals and Slot của QT

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

Hệ nhúng

Môi trường phát triển

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 …

Hệ nhúng

QT Creator

241

Hệ nhúng

Demo

242

Hệ nhúng

Thảo luận

243

Hệ nhúng