Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuận
Tổng quan vi điều khiển
Một số dòng vi điều khiển phổ biến hiện nay
• 8051 (AT89C51, AT89S51, AT89S52)
• AVR (ATMEGA8, ATMEGA16 )
• PIC (PIC16F877A, PIC18F4550, PIC18F2550 )
• ARM (ARM7, ARM9, ARM Cortex-Mx, ARM
Cortex-Ax)
•
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuận", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Hệ nhúng - Chương 3: Vi điều khiển và lập trình firmware - Phạm Văn Thuận
Hệ nhúng 81 Nội dung chương 3 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 82 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) Hệ nhúng 83 Tổng quan vi điều khiển Một số dòng vi điều khiển phổ biến hiện nay • 8051 (AT89C51, AT89S51, AT89S52) • AVR (ATMEGA8, ATMEGA16) • PIC (PIC16F877A, PIC18F4550, PIC18F2550) • ARM (ARM7, ARM9, ARM Cortex-Mx, ARM Cortex-Ax) • Hệ nhúng 84 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 Hệ nhúng 3.2. Vi điều khiển họ 8051 Kiến trúc vi điều khiển 8051 Lập trình firmware cho vi điều khiển 8051 85 Hệ nhúng 86 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 Hệ nhúng 87 Đóng vỏ vi điều khiển 8051 Hệ nhúng 88 Kiến trúc vi điều khiển 8051 Hệ nhúng 89 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ỉ Các thanh ghi này chủ yếu là thanh ghi 8 bit Các thanh ghi thường được sử dụng • 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) Hệ nhúng 3.2.2. Lập trình vi điều khiển 8051 Giới thiệu về lập trình hợp ngữ Lập trình C 90 Hệ nhúng 91 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. Hệ nhúng 92 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 Hệ nhúng 93 Khuôn dạng của một lệnh máy Mã thao tác (Operation Code - Opcode): mã hóa cho thao tác mà CPU phải thực hiện. 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 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) Mã thao tác Tham chiếu toán hạng Hệ nhúng 94 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 Hệ nhúng 95 Các chế độ địa chỉ Chế độ định địa chỉ thanh ghi • 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 Hệ nhúng 96 Các chế độ địa chỉ Chế độ địa chỉ trực tiếp • 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 Hệ nhúng 97 Các chế độ địa chỉ Chế độ định địa chỉ gián tiếp thanh ghi • Đị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 Hệ nhúng 98 Tập lệnh vi điều khiển 8051 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 99 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 Hệ nhúng 100 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) PUSH Đẩy dữ liệu vào đỉnh ngăn xếp POP Lấy dữ liệu từ đỉnh ngăn xếp XCH Tráo đổi dữ liệu XCHD Tráo đổi dữ liệu ( 4 bit thấp) Hệ nhúng 101 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 Hệ nhúng 102 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) Hệ nhúng 103 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ụ: bat_dau: MOV A,#25 ;Khởi gán A=25 Hệ nhúng 104 Dữ liệu của chương trình Hợp ngữ cho phép biểu diễn dưới dạng: • 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", ... 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. 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 105 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ử dụng chỉ dẫn DB Hệ nhúng 106 Các chỉ dẫn ORG: Báo địa chỉ bắt đầu EQU: dùng để định nghĩa hằng số • VD: COUNT EQU 25 END: báo kết thúc file mã nguồn Hệ nhúng 107 Một số lệnh cơ bản Lệnh ADD: cộng • Cú pháp: ADD A,nguồn ;cộng toán hạng ;nguồn vào thanh ghi A Lệnh MOV: chuyển dữ liệu • 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 Hệ nhúng 108 Dịch và chạy chương trình Hệ nhúng 109 Ví dụ sử dụng lệnh ADD, MOV ORG 000 ;Dia chi bat dau cua chuong trinh MOV R5, #25h ;Nap 25h vao R5 MOV R7, #34h ;Nap 34h vao R7 MOV A, #0 ;Nap 0 vao thanh ghi A ADD A, R5 ;A=A+R5 ADD A, R7 ;A=A+R7 (A=25h+34h) HERE: SJMP HERE ;O lai trong vong lap END Sử dụng các lệnh ADD, MOV Hệ nhúng 110 Ví dụ nhấp nháy led ORG 000 ;Dia chi bat dau cua chuong trinh AGAIN: SETB P1.0 ;Nhap nhay led o chan P1.0 ACALL DELAY CLR P1.0 ACALL DELAY SJMP AGAIN DELAY: ;Tao tre MOV R1,#255 LOOP: DJNZ R1,LOOP RET END Hệ nhúng 111 2.4.Các cấu trúc lập trình với hợp ngữ 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 112 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) Ví dụ: MOV A,R5 ;A=R5 JNZ NEXT ;Nhảy tới NEXT nếu A khác 0 MOV R5,#55h NEXT: Hệ nhúng 113 Lệnh lặp Lệnh DJNZ • Cú pháp DJNZ thanh_ghi, nhãn + 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 Hệ nhúng 114 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 Hệ nhúng 115 Các lệnh logic, lệnh quay Lệnh XRL XRL đích, nguồn ; đích=đích XOR nguồn Mục đích: - Xóa thanh ghi (XOR với chính nó) - Đảo bit (XOR với 1) VD: Xóa thanh ghi A XRL A,A Đảo các bit của thanh ghi A XRL A,#0FFh Hệ nhúng 116 Các lệnh logic, lệnh quay Lệnh quay • Lệnh quay phải: RR A • Lệnh quay trái: RL A Hệ nhúng 117 Các lệnh logic, lệnh quay Lệnh quay • Lệnh quay phải qua cờ nhớ: RRC A • Lệnh quay trái qua cờ nhớ: RLC A Hệ nhúng 118 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ác cổng/chân làm việc ở chế độ cổng/chân 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 ; Cổng 1 thành cổng vào SETB P1.0 ; Chân P1.0 làm chân vào MOV P1,#03 ; 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 Hệ nhúng 119 Nguyên lý bit cổng Sơ đồ nguyên lý của một bit cổng Hệ nhúng 120 Nguyên lý bit cổng Đọc dữ liệu: • Đọ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 Hệ nhúng 121 Nguyên lý bit cổng Ghi dữ liệu: ? Write=1:Q=Data(i). • Data(i)=0: /Q=1 Gate=1 Rds nhỏ, IO pin =0 • Data(i)=1: /Q=0 Gate=0 Rds >>, IO pin =1 Hệ nhúng 122 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 Hệ nhúng 123 Ví dụ MOV P0,#30h Hệ nhúng 124 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 P1, #0FFh MOV A, P1 ; Đọc giá trị tại ; cổng P1, lưu vào A MOV P2, A ; Xuất ra cổng P2 Hệ nhúng 125 Ví dụ MOV P3,#0FFh MOV A,P3 MOV P0,A MOV P2,A Hệ nhúng Lập trình C cho VĐK 8051 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 126 Hệ nhúng 127 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: Hệ nhúng 128 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<interval;j++); } } void main(){ while(1){ P1_0=1; delay(100); //Tre mot khoang thoi gian P1_0=0; delay(100); //Tre mot khoang thoi gian } } Hệ nhúng 129 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 Hệ nhúng 130 Ví dụ Ví dụ 1: Xuất dữ liệu ra cổng ra • Xuất dữ liệu điều khiển 8 led trên cổng P0 nhấp nháy so le. Ví dụ 2: Đọc dữ liệu từ chân vào • 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. Hệ nhúng 131 Ví dụ 1: xuất dữ liệu ra cổng Hệ nhúng 132 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<interval;j++); } } void main(){ while(1){ P0=0x55; delay(100); P0=0xAA; delay(100); } } Hệ nhúng 133 Ví dụ 2: đọc dữ liệu từ chân vào Hệ nhúng 134 đọ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<interval;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 135 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ế Hệ nhúng 136 Hiện tượng nảy phím (key bounce) Hậu quả của này phím • 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 Chống nảy phím Hệ nhúng 137 Chống nảy phím Chống nảy phím bằng phần mề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 cứng • Đấu thêm tụ điện song song với công tắc • Sử dụng trigger smith Hệ nhúng 138 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 } } Hệ nhúng 139 Lập trình hiển thị led 7 thanh Nguyên tắc hoạt động của led 7 thanh • Led đơn Hệ nhúng 140 Led 7 thanh Cấu thành từ các led đơn Phân loại: • Anode chung • Cathode chung Hệ nhúng 141 Phân loại led 7 thanh Hệ nhúng 142 Ví dụ Liên tục hiển thị lần lượt các số 0,1,2 Hệ nhúng 143 Ví dụ #include void delay(int interval){ int i,j; for(i=0;i<255;i++){ for(j=0;j<interval;j++); } } void main(){ while(1){ P0=0x40; //Hien thi so 0 delay(100); P0=0x79; //Hien thi so 1 delay(100); P0=0x24; //Hien thi so 2 delay(100); } } Hệ nhúng 144 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 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 145 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 t ... g 158 Thanh ghi TCON Hệ nhúng 159 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 Bước 3: Viết chương trình con xử lý ngắt Hệ nhúng 160 Ví dụ 1 Viết chương trình xử lý ngắt ngoài 0 theo chế độ ngắt theo mức 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 } } Hệ nhúng 161 Ví dụ 2 Viết chương trình xử lý ngắt ngoài 1 theo chế độ ngắt theo sườn 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 } } Hệ nhúng 162 Demo Hệ nhúng 163 Lập trình bộ đếm/định thời 8051 có hai bộ đếm và định thời • Timer/Counter 1 và Timer/Counter 0 Ứng dụng • Bộ định thời (Timer): tạo độ trễ thời gian chính xác • Bộ đếm (Counter): đếm xung Hệ nhúng 164 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 Bộ định thời 0: • Thanh ghi TH0: 8 bit cao • Thanh ghi TL0: 8 bit thấp Bộ định thời 1: • Thanh ghi TH1: 8 bit cao • Thanh ghi TL1: 8 bit thấp Hệ nhúng 165 Cấu tạo và nguyên tắc hoạt động Hoạt động ở chế độ bộ định thời (xét chế độ bộ định thời 16 bit) • Giá trị trong thanh ghi bộ định thời tự động tăng 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 • 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 166 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 giá trị tối đa và thiết lập cờ TF báo tràn. Hệ nhúng 167 Các thanh ghi điều khiển Timer/Counter Thanh ghi TCON • 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 Hệ nhúng 168 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 Hệ nhúng 169 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) Bước 2: nạp giá trị vào thanh ghi bộ định thời • Với Timer 0: TH0=0x3C, TL0=0xB0 • Với Timer 1: TH1=0x3C, TL1=0xB0 Bước 3: Khởi động bộ định thời • Với Timer 0: TR0=1 • Với Timer 1: TR1=1 Bước 4: Chờ cờ tràn được thiết lập (TF0=1 hoặc TF1=1) Hệ nhúng 170 Lập trình ghép nối bàn phím Cấu trúc bàn phím ma trận Hệ nhúng 171 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 Để 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 • Kiểm tra tín hiệu tại các cột Hệ nhúng 172 Demo Hệ nhúng 173 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 Hệ nhúng 174 Lập trình điều khiển LCD LCD LM016L • 2 hàng, 16 cột Hệ nhúng 175 Sơ đồ khối Hệ nhúng 176 Sơ đồ chân Hệ nhúng 177 Các bước lập trình điều khiển LCD Bước 1: Thiết lập cấu hình làm việc cho 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 Hệ nhúng 178 Tập lệnh điều khiển LCD Hệ nhúng 179 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; } Hệ nhúng 180 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; } Hệ nhúng 181 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 } Hệ nhúng 182 Ví dụ Hệ nhúng 183 Lập trình bảng quang báo Ví dụ bảng quang báo: bảng quảng cáo, thông báo Hệ nhúng 184 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 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 185 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 vài module led 8x8 Hệ nhúng 186 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 nhau theo các chuẩn truyền tin • RS485 • CAN • I2C • Hệ nhúng 187 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 và 8 chân điều khiển cột Hệ nhúng 188 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 Thực hiện thuật toán quét led phù hợp Hệ nhúng 189 Ví dụ Để hiển thị chữ A trên 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) 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 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 Hệ nhúng 190 Font chữ B Hệ nhúng 191 Font chữ C Hệ nhúng 192 Font chữ D Hệ nhúng 193 Font chữ E Hệ nhúng 194 Font số 0 Hệ nhúng 195 Font số 1 Hệ nhúng 196 Font số 2 Hệ nhúng 197 Font số 3 Hệ nhúng 198 Font số 4 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 nhúng 199 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) ARM viết tắt của • Advanced RISC Machine • Acorn RISC Machine ARM là kiến trúc được sử dụng rộng rãi trong các hệ thống nhúng: Mobile phones, PDAs, thiết bị điện tử gia dụng 200 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 202 Kiến trúc các dòng ARM Hệ nhúng 203 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 TrustZone: công nghệ nâng cao tính bảo mật Công nghệ đặc trưng Hệ nhúng So sánh hiệu năng các dòng ARM 204 Phân nhóm theo hiệu năng và tính hữu dụng 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, ở 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 • 205 Hệ nhúng Kiến trúc vi điều khiển S3C2440 Đặc điểm của chip 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 Hệ nhúng Lõi vi xử lý ARM920T 207 Hệ nhúng Kiến trúc vi điều khiển S3C2440 Đặc điểm của chip S3C2440 (tiếp) • 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 Hệ nhúng Kiến trúc vi điều khiển S3C2440 Đặ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 Hệ nhúng 210 Hệ nhúng Tập thanh ghi và chế độ hoạt động 211 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 Hệ nhúng Thanh ghi trạng thái chương trình 212 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 Hệ nhúng Mode bits 213 Hệ nhúng 214 Tập lệnh của S3C2440 Tập lệnh ARM chia thành các nhóm lệnh • 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) Hệ nhúng 215 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 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ỉ 0x30000000 và kết thúc ở địa chỉ 0x34000000. 217 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 Thông số kỹ thuật 220 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 Phần mềm • Hệ điều hành Linux • Cross toolchains (gcc 4.3.2) • TFTP (client/server) • USB push 222 Hệ nhúng Môi trường phát triển ứng dụng 223Mô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 225 Demo Hệ nhúng 226 Thảo luận Hệ nhúng Lập trình ứng dụng trên Linux 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 227 Hệ nhúng Cài đặt môi trường phát triển 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 Phần mềm hỗ trợ • TFTP Server client/server • GFTP Server Cấu hình mạng sử dụng • Linux host: 192.168.1.30 • Linux target: 192.168.1.230 228 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 Bước 4: chạy chương trình trên KIT 229 Hệ nhúng Lập trình giao tiếp cổng COM 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 230 Hệ nhúng Khai báo thư viện #include #include #include #include // UNIX standard function #include // File control definitions #include // Error number definitions #include // POSIX terminal control #include // time calls 231 Hệ nhúng Bước 1: Mở cổng 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 232 Hệ nhúng Bước 2: Thiết lập tham số 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); 233 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 công) 234 Hệ nhúng Bước 4: Đóng cổng Đóng cổng: sử dụng lệnh đóng file close (fd); Fd: file ID (có được từ thao tác mở file thành công) 235 Hệ nhúng Lập trình ứng dụng đồ họa Sử dụng nền tảng QT của Nokia • Ứ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 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 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 239 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 Chương trình dịch: qmake 1) Qmake for Windows 2) Qmake for Linux 3) Qmake for Embedded Linux 240 Hệ nhúng QT Creator 241 Hệ nhúng 242 Demo Hệ nhúng 243 Thảo luận
File đính kèm:
- giao_trinh_he_nhung_chuong_3_vi_dieu_khien_va_lap_trinh_firm.pdf