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.
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:
- cung_hoc_avr_avr1_lam_quen_avr.pdf