Cùng học AVR - AVR1: Làm quen AVR

Tại sao AVR: so với các chip vi điều khiển 8 bits khác, AVR có nhiều đặc tính hơn

hẳn, hơn cả trong tính ứng dụng (dễ sử dụng) và đặc biệt là về chức năng.

· Gần như chúng ta không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng AVR,

thậm chí không cần nguồn tạo xung clock cho chip (thường là các khối thạch anh).

· Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch nạp chỉ cần vài

điện trở là có thể làm được. một số AVR còn hỗ trợ lập trình on – chip bằng

bootloader không cần mạch nạp

· Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích C.

· Nguồn tài nguyên về source code, tài liệu, application note rất lớn trên internet.

pdf23 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 446 | Lượt tải: 1download
Tóm tắt nội dung Cùng học AVR - AVR1: Làm quen AVR, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 khuyên: các bạn nên khởi động 1 chương trình theo cách trên và 
chúng ta sẽ hiểu chúng rõ hơn sau này ! 
 LDI R16, 0xFF 
OUT DDRB, R16 
Bạn chú ý 2 dòng trên và những gì tôi giải thích sau đây, 2 dòng này có tác 
dụng khởi động PORTB của chip ATmega8 tác dụng như các ngõ xuất tín 
hiệu (OUTPUT). Trước hết hãy quan sát chip ATmega8 trong hình sau 
Hình 9: chip ATmega8 
Bạn có thể thấy chip này gồm 28 chân, trông đó có các chân được ghi là 
PB0(chân 14), PB1(chân 15),,PB7(chân 10), đó là các chân của PORTB. 
PORT là khái niệm chỉ các ngõ xuất nhập. Trong AVR, PORT có thể giao 
tiếp theo 2 hướng (bi – directional), có thể dùng để xuất hoặc nhận thông tin, 
mỗi PORT có 8 chân. Chip Atmega8 có 3 PORT có tên tương ứng là 
PORTB, PORTC và PORTD (một số chip AVR khác có 4 hoặc 6 PORT). 
PORT được coi là “cửa ngõ” then chốt của vi điều khiển. 
Trong AVR, mỗi PORT liên quan đến 3 thanh ghi (8 bits) có tên tương ứng 
là DDRx, PINx, và PORTx với “x” là tên của PORT, mỗi bit trong thanh ghi 
tương ứng với mỗi chân của PORT. Trong trường hợp của Atmega8 “x” là B, 
C hoặc D. Ví dụ chúng ta quan tâm đến PORTB thì 3 thanh ghi tương ứng có 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
tên là DDRB, PINB và PORTB, trong đó 2 thanh ghi PORTB và PINB được 
nối trực tiếp với các chân của PORTB, DDRB là thanh ghi điều khiển hướng 
( Input hoặc Output). Viết giá trị 1 vào một bit trong thanh ghi DDRB thì 
chân tương ứng của PORTB sẽ là chân xuất (Output), ngược lại giá trị 0 xác 
lập chân tương ứng là ngõ nhập. Sau khi viết giá trị điều khiển vào DDRB, 
việc truy xuất PORTB được thực hiện thông qua 2 thanh ghi PINB và 
PORTB. 
Quay lại với 2 dòng code của chúng ta, dòng đầu: “LDI R16, 0xFF”, với LDI 
– LoaD Immediately, dòng lệnh có ý nghĩa là load giá trị 0xFF vào thanh ghi 
R16, R16 là tên 1 thanh ghi trong bộ nhớ của AVR, 0xFF là 1 hằng số có 
dạng thập lục phân, ký hiệu “0x” nói lên điều đó, bạn cũng có thể dùng ký 
hiệu khác là “$” để chỉ 1 số thập lục phân, ví dụ &FF, và 0xFF=255(thập 
phân)=0B11111111 (nhị phân). Như thế sau dòng đầu thanh ghi R16 có giá 
trị là 11111111 (nhị phân). Dòng thứ 2: “OUT DDRB, R16” nghĩa là xuất giá 
trị từ thanh ghi R16 ra thanh ghi DDRB, tóm lại sau 2 dòng trên giá trị 
DDRB như sau: 
1 1 1 1 1 1 1 1 
Có thể bạn sẽ hỏi tải sao chúng không sử dụng 1 dòng duy nhất là “LDI 
DDRB, 0xFF” hay “OUT DDRB, 0xFF”, chúng ta không thể vì lệnh LDI chỉ 
cho phép thực hiện trên các thanh ghi R16,R31 và lệnh OUT không thực 
hiện được với các hằng số. 
Và vì DDRB=11111111 nên trong trường hợp này tất cả các chân của 
PORTB đã sẵn sàng cho việc xuất dữ liệu. Lúc này thanh ghi PINB không có 
tác dụng, thanh ghi PORTB sẽ là thanh ghi xuất, ghi giá trị vào thanh ghi này 
sẽ tác động đến các chân của PORTB. 
ii. Phần 3: chương trình chính 
MAIN: 
 LDI R16, 0B00000001 
 OUT PORTB, R16 
 RCALL DELAY 
Bạn chỉ cần chú ý 4 dòng trên trong toàn bộ phần chương trình chính, trước hết 
“MAIN:” chỉ là 1 nhãn do chúng ta tự đặt tên, giống như 1 “cột mốc” trong 
chương trình thôi. Dòng “LDI R16, 0B00000001” thì bạn đã hiểu, chỉ có 1 
khác biệt nhỏ là tôi sử dụng hằng số dạng nhị phân cho bạn dễ hiểu hơn. Và 
dòng “OUT PORTB, R16” để xuất giá trị 0B00000001 có sẵn trong R16 ra 
thanh ghi PORTB, lúc này chân PB0 của chip sẽ lên 1 (5V) và các chân còn lại 
sẽ ở mức 0 (0V). Dòng thứ 3: “RCALL DELAY” là lệnh gọi chương trình con 
DELAY, tạm hoãn trước khi thực hiện các dòng lệnh tiếp theo: 
 LDI R16, 0B00000010 
 OUT PORTB, R16 
 RCALL DELAY 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Ba dòng lệnh này cũng giống ba dòng trên, nhưng giá trị xuất ra lúc này là 
0B00000010, chân PB1 sẽ lên 5V và các chân khác xuống mức 0V. Và cứ như 
thế đến đoạn cuối: 
 LDI R16, 0B10000000 
 OUT PORTB, R16 
 RCALL DELAY 
 RJMP MAIN 
Sau khi kết thức 3 dòng trên chân PB7 sẽ lên 5V, kết thúc 1 vòng xoay. Cuối 
cùng là quay vế đầu chương trình chính bằng dòng “RJMP MAIN” 
Bây giờ chắc bạn đã đoán được chương trình của chúng ta thực hiện việc gì, đó 
là quét xoay vòng các chân của PORTB, nếu chúng ta kết nối các chân của 
PORTB với các LED, chúng ta sẽ có 1 hiệu ứng quét LED xoay vòng, chúng ta 
thực hiện điều này bằng phần mềm Proteus. 
iii. Phần 4 - chương trinh con DELAY: đoạn chương trình này không làm gì cả 
ngoài việc trì hoãn 1 khoảng thời gian, tuy nhiên bạn chưa thể hiểu nó ngay 
được. 
Đây chỉ là 1 ví dụ đơn giản, tôi cố gắng thực hiện nó theo cách dễ hiểu nhất cho bạn, 
vì thế đoạn code có vẻ hơi dài dòng, bạn hãy thực hiện lại đoạn chương trình chính 
bằng đoạn code của bạn. 
Phần cuối cùng là biên dịch đoạn code thành file intel hex để đổ vào chip, nhấn 
phím F7 để biên dịch. 
Sau khi biên dịch bạn sẽ có 1 file tên “avr1.hex” trong thưc mục project, chúng ta 
sẽ dùng file này đổ vào chip sau này 
IV. Mô phỏng ví dụ của chúng ta bằng Proteus 
Chúng ta hãy thử nghiệm đoạn chương trình của chúng ta bằng Proteus 
- Chạy Proteus: sau đó nhấn vào buton “Comonents” rồi “Pick Devices” để chọn linh 
kiện 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 10: giao diện Proteus 
- Chọn linh kiện: trong dialog Pick Divices, ô “Keywords” nhập mega8, bạn sẽ thấy 1 
linh kiện có tên “ATMEGA8” bên cửa sổ “Results”, double click vào linh kiện đó để 
mang nó ra cửa sổ “Object selector”. 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 11: Pick devices 
- Để tìm điện trở, bạn đánh keyword “res”, chọn “Resistors” trong “category” và 
Double click vào link kiện “RES” trong ô “Results” 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 12: chọn điện trở 
- Thực hiện tương tự để chọn GREEN - LED bằng keyword “green led” 
 Hình 13: chọn Green LED 
- Sau khi chọn 3 loại linh kiện cần thiết bạn hãy nhấn OK và quay về cửa số chính, khi 
đó bạn thấy trong cửa sổ “Object selector” như sau: 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 14: các link kiện cần cho mô phỏng 
- Thao tác với mouse trong Proteus: khác với 1 số chương trình vẽ mạch điện khác, 
tháo tác mouse trong Proteus hơi lạ nên có thể gây bối rối cho bạn, hãy theo hướng 
dẫn sau đây: 
o Chọn linh kiện để vẽ: left – click lên tên linh kiện trong cửa sổ “Object 
selector” 
o Đặt linh kiện: Left – click lên cửa sổ mạch điện Right click lên linh kiện 
trong cửa số mạch điện sẽ làm cho linh kiện đó được bao bởi màu “đỏ”, tức 
bạn đang chọn linh kiện đó. 
o Bỏ chọn linh kiện thực hiện bằng cách Right – click lên một vị trí trống trên 
cửa sổ mạch điện. 
o Delete linh kiện: Right – click 2 lần lên 1 linh kiện là delete linh kiện đó khỏi 
cửa sổ mạch điện, hoặc Right click 1 lần lên 1 linh kiện đã được chọn trước 
đó (có màu đỏ) cũng sẽ xóa linh kiện này. 
o Di chuyển linh kiện: chọn linh kiện trước (right – click) và drag để di chuyển 
linh kiện bằng mouse left 
o Xoay và lật linh kiện: chọn linh kiện cần xoay hay lật (right – click), dùng 
các nút công cụ để xoay hoặc lật linh kiện. 
Hình 15: các nút công cụ xoay và lật linh kiện 
o Hiện cửa sổ thuộc tính linh kiện: rất nhiều khi bạn cần thay đổi 1 số thuộc 
tính của linh kiện (ví dụ giá trị của điện trở), bạn thực hiện điều này trong 
cửa sổ thuộc tính của linh kiện. Để hiện cửa sổ thuộc tính của 1 linh kiện bạn 
hãy right – click trước (để chọn linh kiện – linh kiện sẽ đỏ lên) và sau đó left 
– click sau. 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
- Theo hướng dẫn trên, bạn hãy click vào ATMEGA8 và đặt linh kiện này lên mạch 
điện của bạn (đặt lên cửa sổ làm việc lớn) bằng cách left - click lên bất vị trí nào trên 
cửa sổ mạch điện. Thực hiện tương tự cho 8 LED và 1 điện trở như hình vẽ bên dưới 
Hình 16: đặt linh kiện lên mạch điện 
- Tiếp theo là đặt “mass” cho LED, nhấn vào nút công cụ “Inter – sheet Terminal” như 
hình bên dưới: 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 17: Nút công cụ Inter – sheet Terminal 
- Bạn thấy trong cửa sổ “Object devices” có 1 số thiết bị, hãy chú ý dến “POWER” và 
“GROUND”, đây là nguồn và mass cho mạch điện của bạn. Hãy chọn GROUND và 
đặt lên mạch điện của bạn. 
- Bước tiếp theo, nối dây: không cần công cụ, để nối dây bạn chỉ cần rê mouse đến 
điểm cần nối của linh kiện, bạn sẽ thấy xuất hiện 1 dấu chéo “x”, lúc đó hãy click 
mouse và di chuyển (không cần giữ mouse) đến vị trí tiếp theo và click lần nữa 
Hình 17: nối dây 
- Theo cách này bạn hãy nối dây cho mạch điện của bạn, mạch điện hoàn chỉnh như sau: 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 18: sau khi nối dây 
- Bây giờ hãy thay đổi giá trị của điện trở, giá trị mặc định là 10k, giá trị này quá lớn, 
dòng điện sẽ rất nhỏ, khi mô phỏng bạn sẽ không thấy các LED sang lên. Bạn hãy 
tahy đổi nó thành 100 (100 Ohm). Trước hết cho hiện cửa sổ thuộc tính của điện trở 
(right click rồi left click lên điện trở), thay đổi ô resistance của nó: 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 19: thay đổi giá trị của điện trở 
- Đổ chương trình vào chip Atmega8: hãy hiện cửa sổ thuộc tính của chip Atmega8, 
trong ô “Program file” hãy click và tìm đến file “avr1.hex” mà bạn đã tạo trong thư 
mục Project sau khi biên dịch. Chú ý thay đổi thông số “Clock frequency” là 1 Mhz 
Hình 20: đổ chương trình cho chip 
- Hãy lưu mạch điện của bạn. 
- Đây là việc cuối cùng, chạy mô phỏng, sử dụng thanh công cụ Play để chạy mô phỏng 
mạch điện của bạn, kết quả như sau: 
AUTO.NLU 
For more details and questions, contact me: thanhtam.h@gmail.com 
Hình 21:kết quả mô phỏng 
Chúng ta kết thúc bài 1 ở đây, các bạn quan tâm hãy đọc thật kỹ, mong rằng bài viết này 
giúp cho bạn có cái nhìn ban đầu về AVR, Trong các bài tiếp theo chúng ta sẽ tìm hiểu chi 
tiết hơn về AVR, chúc các bạn thành công. 

File đính kèm:

  • pdfcung_hoc_avr_avr1_lam_quen_avr.pdf