Giáo trình Vi điều khiển AVR Full

Mục Lục

BÀI 1 : GIỚI THIỆU VỀ VI ĐIỀU KHIỂN AVR. 5

1. Giới thiệu về vi điều khiển. 5

2. Giới thiệu về vi điều khiển AVR . 7

3. Lập trình cho AVR. 10

BÀI 2 : GIAO TIẾP VÀO RA I/O . 17

1. Giới thiệu giao tiếp vào ra I/O . 17

2. Cách cấu hình chức năng IO . 18

3. Ví dụ minh họa. 19

BÀI 3 : GIAO TIẾP VỚI LED 7 THANH. 24

1. Cơ bản về led 7 thanh. 24

2. Nguyên lí lập trình cho led 7 thanh. 26

3. Ví dụ minh họa. 27

BÀI 4 : GIAO TIẾP VỚI BÀN PHÍM . 31

1. Cơ bản về phím bấm . 31

2. Chương trình ví dụ . 32

3. Kĩ thuật chống rung bàn phím. 34

BÀI 5 : BỘ CHUYỂN ĐỔI ADC. 36

1. Giới thiệu về ADC . 36

2. Cách cấu hình ADC trong Code Vision cho Atmega32. . 38

3. Ví dụ minh họa. 39

BÀI 6 : GIAO TIẾP LCD. 41

1. Giới thiệu về LCD 16x2. 41

2. Cách cấu hình cho LCD trong Code Vision cho Atmega32. 47

3. Ví dụ. 49

BÀI 7 : GIAO TIẾP VỚI LED MA TRẬN. 51

1. Cơ bản về led ma trận. 51

2. Tạo font cho led ma trận . 53GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 3 www.dks.edu.vn

3. Ví dụ minh họa. 54

BÀI 8: GIAO TIẾP MÁY TÍNH. 55

1. Cơ bản về giao tiếp RS232. 55

2. Cách cấu hình module UART trong Code Vision . 57

3. Ví dụ. 58

BÀI 9 : GIAO TIẾP I2C. 66

1. Giới thiệu chung về I2C . 66

2. Module I2C trong Atmega32. 74

3. Ví dụ. 76

BÀI 10 : ĐỘNG CƠ BƯỚC. 80

1. Cơ bản về động cơ bước. 80

2. Các mạch điều khiển động cơ bước . 82

3. Ví dụ. 85

BÀI 11 : GIAO TIẾP VỚI CỔNG LPT . 87

1. Cơ bản về cổng LPT. 87

2. Ví dụ minh họa. 90

BÀI 12 : GIAO TIẾP VỚI MA TRẬN PHÍM . 92

1. Cơ bản về ma trận phím . 92

2. Ví dụ minh họa. 94

BÀI 13 : TIMER. 96

1. Giới thiệu về timer . 96

2. Ví dụ minh họa. 100

BÀI 14 : NGẮT . 101

1. Giới thiệu về ngắt. 101

2. Các bước cấu hình cho ngắt hoạt động . 104

3. Ví dụ. 105

BÀI 15 : ĐIỀU KHIỂN ĐỘNG CƠ MỘT CHIỀU. 107

1. Giới thiệu về động cơ một chiều. 107GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 4 www.dks.edu.vn

2. Ví dụ minh họa. 109

BÀI 16 : GIAO TIẾP VỚI GLCD. 111

1. Cơ bản về GLCD. 111

2. Ví dụ minh họa. 116

pdf116 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 650 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Vi điều khiển AVR Full, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
I vì GLCD không có 
bộ nhớ CGRAM (Character Generation RAM). GLCD 128x64 có 128 cột và 64 
hàng tương ứng có 128x64=8192 chấm (dot). Mỗi chấm tương ứng với 1 bit dữ 
liệu, và như thế cần 8192 bits hay 1024 bytes RAM để chứa dữ liệu hiển thị đầy 
mỗi 128x64 GLCD. Tùy theo loại chip điều khiển, nguyên lý hoạt động của 
GLCD có thể khác nhau, bài này sẽ giới thiệu loại GLCD được điều khiển bởi 
chip KS0108 của Samsung, có thể nói GLCD với KS0108 là phổ biến nhất trong 
các loại GLCD loại này (chấm, không màu) 
Hình ảnh GLCD 
Chip KS0108 chỉ có 512 bytes RAM (4096 bits = 64x64) và vì thế chỉ điều 
khiển hiển thị được 64 dòng x 64 cột. Để điều khiển GLCD 168x64 cần 2 chip 
KS0108, và thực thế trong các loại GLCD có 2 chip KS0108, GLCD 128x64 do 
đó tương tự 2 GLCD 64x64 ghép lại 
GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 112 www.dks.edu.vn 
Các GLCD 128x64 dùng KS0108 thường có 20 chân trong đó chỉ có 18 chân 
là thực sự điều khiển trực tiếp GLCD, 2 chân (thường là 2 chân cuối 19 và 20) là 2 
chân Anode và Cathode của LED nền. Trong 18 chân còn lại, có 4 chân cung cấp 
nguồn và 14 chân điều khiển+dữ liệu. Khác với các Text LCD HD44780U, GLCD 
KS0108 không hỗ trợ chế độ giao tiếp 4 bit, do đó bạn cần dành ra 14 chân để 
điều khiển 1 GLCD 128x64. 
Sơ đồ chân GLCD 
Chân VSS được nối trực tiếp với GND, chân VDD nối với nguồn +5V, một 
biến trở khoảng 20K được dùng để chia điện áp giửa Vdd và Vee cho chân Vo, 
bằng cách thay đổi giá trị biến trở chúng ta có thể điều chỉnh độ tương phản của 
GLCD. Các chân điều khiển RS, R/W, EN và các đường dữ liệu được nối trực tiếp 
với vi điều khiển. Riêng chân Reset (RST) có thể nối trực tiếp với nguồn 5V. 
EN (Enable): cho phép một quá trình bắt đầu, bình thường chân EN được giữ ở 
mức thấp, khi một thực hiện một quá trình nào đó (đọc hoặc ghi GLCD), các chân 
điều khiển khác sẽ được cài đặt sẵn sàng, sau đó kích chân EN lên mức cao. Khi 
EN được kéo lên cao, GLCD bắt đầu làm thực hiện quá trình được yêu cầu, chúng 
ta cần chờ một khoảng thời gian ngắn cho GLCD đọc hoặc gởi dữ liệu. Cuối cùng 
là kéo EN xuống mức thấp để kết thúc quá trình và cũng để chuẩn bị chân EN cho 
quá trình sau này. 
RS (Register Select): là chân lựa chọn giữa dữ liệu (Data) và lệnh (Instruction), 
vì thế mà trong một số tài liệu bạn có thể thấy chân RS được gọi là chân DI 
(Data/Instruction Select). Chân RS=1 báo rằng tín hiệu trên các đường DATA 
GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 113 www.dks.edu.vn 
(D0:7) là dữ liệu ghi hoặc đọc từ RAM của GLCD. Khi RS=0, tín hiệu trên đương 
DATA là một mã lệnh (Instruction). 
RW (Read/Write Select): chọn lựa giữa việc đọc và ghi. Khi RW=1, chiều truy 
cập từ GLCD ra ngoài (GLCD->AVR). RW=0 cho phép ghi vào GLCD. Giao tiếp 
với GLCD chủ yếu là quá trình ghi (AVR ->GLCD), chỉ duy nhất trường hợp đọc 
dữ liệu từ GLCD là đọc bit BUSY và đọc dữ liệu từ RAM. Đọc bit BUSY thì 
chúng ta đã khảo sát cho Text LCD, bit này báo GLCD có đang bận hay không, 
việc đọc này sẽ được dùng để viết hàm wait_GLCD. Đọc dữ liệu từ RAM của 
GLCD là một khả năng mới mà Text LCD không có, bằng việc đọc ngược từ 
GLCD vào AVR, chúng ta có thể thực hiện nhiều phép logic hình (hay mặt nạ, 
mask) làm cho việc hiển thị GLCD thêm thú vị. 
CS2 và CS1 (Chip Select): như tôi đã trình bày trong phần trên, mỗi chip 
KS0108 chỉ có khả năng điều khiển một GLCD có kích thước 64x64, trên các 
GLCD 128x64 có 2 chip KS0108 làm việc cùng nhau, mỗi chip đảm nhiệm một 
nữa LCD, 2 chân CS2 và CS1 cho phép chọn một chip KS0108 để làm việc. 
Thông thường nếu CS2=0, CS1=1 thì nửa trái được kích hoạt, ngược lại khi 
CS2=1, CS1=0 thì nửa phải được chọn. Chúng ta sẽ hiểu rõ hơn cách phối hợp 
làm việc của 2 nửa GLCD trong phần khảo sát bộ nhớ của LCD. 
Tổ chức bộ nhớ. 
 Chip KS0108 có một loại bộ nhớ duy nhất đó là RAM, không có bộ nhớ 
chứa bộ font hay chứa mã font tự tạo như chip HD44780U của Text LCD. Vì vậy, 
dữ liệu ghi vào RAM sẽ được hiển thị trực tiếp trên GLCD. 
Mỗi chip KS0108 có 512 bytes RAM tương ứng với 4096 chấm trên một 
nửa (64x64) LCD. RAM của KS0108 không cho phép truy cập từng bit mà theo 
từng byte, điều này có nghĩa là mỗi lần chúng ta viết một giá trị vào một byte nào 
đó trên RAM của GLCD, sẽ có 8 chấm bị tác động, 8 chấm này nằm trên cùng 1 
cột. Vì lý do này, 64 dòng GLCD thường được chia thành 8 pages, mỗi page có độ 
cao 8 bit và rộng 128 cột (cả 2 chip gộp lại). Hình 3 mô tả “bề mặt” một GLCD và 
cũng là cách sắp xếp RAM của các chip KS0108. 
Tổ chức RAM của 2 chip KS0108 trái và phải hoàn toàn tương tự, việc đọc 
hay ghi vào RAM của 2 chip cũng được thực hiện như nhau. Chúng ta sẽ chọn 
nửa trái GLCD để khảo sát. Như bạn thấy trên hình 3, 64 dòng từ trên xuống dưới 
được chia thành 8 “dãy” mà ta gọi là 8 pages. Page trên cùng là page 0 và page 
dưới cùng la page 7. Trong các GLCD, page còn được gọi là địa chỉ X (X 
GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 114 www.dks.edu.vn 
address), hay nói cách khác X=0 là địa chỉ của page trên cùng, tương tự như thế, 
X=7 là địa chỉ của page dưới cùng. Mỗi page chứa 64 cột (chỉ xét 1 chip KS0108), 
mỗi cột là một byte RAM 8 bit, mỗi bit tương ứng với 1 chấm trên LCD, bit có 
trọng số thấp (LBS - tức bit D0 như trong hình 3) tương ứng với chấm trên cao 
nhất. Bit có trọng số cao nhất (MBS - tức bit D7 như trong hình 3) tương ứng với 
chấm thấp nhất trong 1 page. Thứ tự các cột trong 1 page gọi là địa chỉ Y (Y 
address), như thế cột đầu tiên có địa chỉ Y = 0 trong khi cột cuối cùng có địa chỉ Y 
là 63. 
Bằng cách phối hợp địa chỉ X và địa chỉ Y chúng ta xác định được vị trí của 
byte cần đọc hoặc ghi. Chip KS0108, tất nhiên, sẽ hỗ trợ các lệnh di chuyển đến 
địa chỉ X và Y để ghi hay đọc RAM 
Tập lệnh cho chip KS0108. 
 So với HD44780U của Text LCD, lệnh cho KS0108 của GLCD đơn giản và 
ít hơn và vì thế viết chương trình điều khiển GLCD cũng tương đối dễ hơn Text 
LCD. Có tất cả 7 lệnh (Instruction) có thể giao tiếp với KS0108. Tôi sẽ lần lượt 
giải thích ý nghĩa và cách sử dụng của từng lệnh. 
 Display ON/OFF – Hiển thị GLCD: lệnh này cho phép GLCD hiển thị nội dung 
trên RAM ra “bề mặt” GLCD. Để viết lệnh này cho GLCD, 2 chân RS và RW cần 
được kéo xuống mức thấp (RS=0: đây là Instrucion, RW=0: AVR->GLCD). Mã 
lệnh (code) được chứa trong 7 bit cao (D7:1) và bit D0 chứa thông số. Quan sát 
bảng 2, dễ thấy mã lệnh nhị phân cho Display ON/OFF là 0011111x (0x3E+x) 
trong đó x=1: cho phép GLCD hiển thị, x=0: tắt hiển thị. 
Set Address – chọn địa chỉ: đúng hơn đây là lệnh chọn cột hay chọn địa chỉ Y. 
Hai bit D7 và D6 chứa mã lệnh (01000000=0x40=64) và 6 bit còn lại chứa chỉ số 
của cột muốn di chuyển đến. Chú ý là mỗi nửa GLCD có 64 cột nên cần 6 bit để 
chứa chỉ số này (26=64). Vậy lệnh này có dạng 0x40+Y. Ví dụ nếu chúng ta muốn 
di chuyển đến cột 36 chúng ta ghi vào GLCD mã lệnh: 0x40+36. Hai chân RS và 
RW được giữ ở mức thấp khi thực hiện lệnh này. 
Set Page – chọn trang: lệnh cho phép chọn page (hay địa chỉ X) cần di chuyển 
đến, do GLCD chỉ có 8 pages nên chỉ cần 3 bit để chứa địa chỉ page. Mã lệnh cho 
lệnh này có dạng 0xB8+X. Trong đó biến X là chỉ số page cần di chuyển đến. Hai 
chân RS và RW được giữ ở mức thấp khi thực hiện lệnh này. 
GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 115 www.dks.edu.vn 
Display Start Line – chọn line đầu tiên: hay còn gọi là lệnh “cuộn”, lệnh này cho 
phép di chuyển toàn bộ hình ảnh trên GLCD (hay RAM) lên phía trên một số 
dòng nào đó, chúng ta gọi là LOffset. Số lượng LOffset có thể từ 0 đến 63 nên cần 
6 bit chứa giá trị này. Mã lệnh Display Start Line có dạng 0xC0+LOffset. Hai 
chân RS và RW được giữ ở mức thấp khi thực hiện lệnh này. Khi di chuyển 
GLCD lên phía trên, phần dữ liệu phía trên bị che khuất sẽ “cuộn” xuống phía 
dưới. Hình 5 là một ví dụ “cuộn” GLCD lên 20 dòng. 
Status Read – đọc trạng thái GLCD: đây là một trong 2 lệnh đọc từ GLCD. Cũng 
giống như với Text LCD, lệnh đọc trạng thái GLCD chủ yếu để xét bit BUSY (bit 
thứ 7) xem GLCD có đang bận hay không, lệnh này sẽ được dùng để viết một hàm 
wait_GLCD chờ cho đến khi GLCD rảnh. Vì đây là lệnh đọc từ GLCD nên chân 
RW phải được set lên mức 1 trước khi thực hiện, chân RS vẫn ở mức thấp (đọc 
Instruction). 
Write Display Data – ghi dữ liệu cần hiển thị vào GLCD hay RAM: vì đây là 1 
lệnh ghi dữ liệu hiển thị nên chân RS cần được set lên 1 trước khi thực hiện, chân 
RW giữ ở mức 0. Lệnh này cho phép ghi một byte dữ liệu vào RAM của KS0108 
và cũng là dữ liệu sẽ hiển thị lên GLCD tại vị trí hiện hành của 2 con trỏ địa chỉ X 
và Y. 8 bit dữ liệu này sẽ tương ứng với 8 chấm trên cột Y ở page X. Chú ý là sau 
lệnh Write Display Data, địa chỉ cột Y tự động được tăng lên 1 và vì thế nếu có 
một dữ liệu mới được ghi, dữ liệu mới sẽ không “đè” lên dữ liệu cũ. Việc tăng tự 
động địa chỉ Y rất có lợi cho việc ghi dữ liệu liên tiếp, nó giúp giảm thời gian set 
lại địa chỉ cột Y. Sau khi thực hiện ghi ở cột Y=63 (cột cuối cùng trong 1 page, 
đối với 1 chip KS0108), Ysẽ về 0. 
Read Display Data – đọc dữ liệu hiển thị từ GLCD (cũng là dữ liệu từ RAM của 
KS0108): lệnh đọc này mới so với Text LCD, nó cho phép chúng ta đọc ngược 1 
byte dữ liệu từ RAM của KS0108 tại vị trí hiện hành về AVR. Sau khi đã đọc 
được giá trị tại vị trí hiện hành, chúng ta có thể thực hiện các phép Logic như đảo 
bit, or hay andlàm tăng khả năng thao tác hình ảnh. Trước khi thực hiện đọc 
chúng ta cần di chuyển đến vị trí muốn đọc bằng 2 lệnh set địa chỉ X và Y, sau khi 
đọc giá trị địa chỉ page X và cột Y không thay đổi, do đó nếu đọc tiếp mà không 
di chuyển địa chỉ thì vẫn thu được giá trị cũ. 
GIÁO TRÌNH VI ĐIỀU KHIỂN AVR 116 www.dks.edu.vn 
2. Ví dụ minh họa 
Phần này sẽ trình bày ví dụ minh họa để giao tiếp với GLCD, các hàm giao 
tiếp với GLCD được viết trong file myglcd.c, sơ đồ chân nối cũng thể hiện rõ 
trong file myglcd.h, sau đây là chương trình : 
Bài tập 
Dựa vào driver đã cung cấp ở trên, bạn hãy lập trình để hiển thị các hình 
2D như hình chữ nhật, hình vuông, hình tròn 

File đính kèm:

  • pdfgiao_trinh_vi_dieu_khien_avr_full.pdf