Tìm hiểu vi điều khiển AVR

Các kiến thức, kinh nghiệm khi tìm hiểu về vi điều khiển avr. Cách lập trình, nạp code và những ứng dụng đơn giản cho avr.

Download

Giới Thiệu

GIỚI THIỆU

 

Điều kiện học AVR.. 1

Kiểm tra mọi thứ đã sẵn sàng?. 1

 

1.      Để học lập trình cho vi điều khiển cụ thể là vi điều khiển avr bạn cần có kiến thức cơ bản về lập trình (cú pháp, thuật toán), kiến thức điện tử cơ bản (điện áp, dòng điện, định luật Ohm).

2.      Tò mò, kiên nhẫn, thích tự mình làm những việc không ai làm.

3.      Chuẩn bị những thứ cần thiết (máy tính, có thể thêm 1 k-avr, thời gian).

Có 2 phương pháp để viết code và biên dịch code (xem thêm các bước để viết 1 chương trình cho máy tính )

v Dùng IDE

v  Không dùng IDE

(^\^) Nếu vừa bắt đầu thì hãy dùng IDE.

Có 2 phương pháp để xem thành quả của mình đạt được

v Mô phỏng trên máy tính

v Làm sản phẩm thực tế.

(^\^) Nếu có điều kiện (kinh phí + thời gian) đầu tư cho mình 1 mạch (k-avr) để thực hành.

Kiểm tra mọi thứ đã sẵn sàng?

Copy đoạn code sau vào trình atmel studio, biên dịch nó. File hex được tạo ra nằm ở thư mục Debug, chạy file hex bằng cách dùng protues hoặc dùng k-avr.

 

#include <avr/io.h>

#define F_CPU 12000000UL

#include <util/delay.h>

 

int main(){

    DDRA = 0xff;

    while(1){

        PORTA = 0x00;

        _delay_ms(1000);

        PORTA = 0xff;

        _delay_ms(1000);

    }

    return 0;

}

 

 

Kết quả chạy sau khi compiler bằng atmel phải:

https://farm2.staticflickr.com/1514/25044890895_d86f20bd23_b.jpg

 

 

Kết quả chạy bằng protues:

Kết quả chạy bằng k-avr:

(^\^) Nếu bạn là người mới bắt đầu hãy theo nguyên lý 80-20, cần chậm ở bước này, khi nào DONE thì mới tiếp tục tìm hiểu tiếp.

BootLoader

Bootloader Là Gì?


Bootloader là một chương trình nhỏ nằm trên vùng nhớ của bộ nhớ không bị mất dữ liệu khi mất điện (Flash, Program memory), chương trình này thường có một hay một vài nhiệm vụ xác định. Đối với vi điều khiển AVR, bootloader sẽ nằm ở bộ nhớ chương trình (Program memory) bắt đầu từ địa chỉ được xác định bởi BOOTSZ[1:0]. Đối với atmega8 thì giá trị của fuse bit BOOTSZ[1:0] sẽ quy định địa chỉ của vùng bootloader và vùng nhớ chương trình thực thi như sau:
BOOTSZ1
BOOTSZ0
Kích thước bootloader
Địa chỉ bắt đầu boot
Vùng nhớ chương trình thực thi
Vùng nhớ boot
1
1
128 words
0xF80
0x000 - 0xF7F
0xF80 - 0xFFF
1
0
256 words
0xF00
0x000 - 0xEFF
0xF00 - 0xFFF
0
1
512 words
0xE00
0x000 - 0xDFF
0xE00 - 0xFFF
0
0
1024 words
0xC00
0x000 - 0xBFF
0xC00 - 0xFFF

Hình minh họa cho kích thước bootlloader được điều chỉnh bởi BOOTSZ

Vậy nếu BOOTSZ0 =  và BOOTSZ1 = 0 thì địa chỉ bắt đầu bootloader là 0xC00 kết thúc tại 0xFFF và vùng còn lại từ 0x000 đến 0xBFF sẽ chứa chương trình thực thi bình thường.
Có đến 2 vùng nhớ mà vi điều khiển có thể chạy được vì vậy phải có một thiết lập để vi điều khiển biết được sẽ thực thi code ở vùng nào khi khởi động. Việc thiết lập này được thực hiện qua fuse bit BOOTRST (bài fuse bit). Khi bit BOOTRST = 0 vi điều khiển sẽ thực thi code ở phần bootloader và khi BOOTRST = 1 chương trình sẽ chạy bình thường tại địa chỉ bắt đầu 0x000.

 Nạp Code Bằng Bootloader

Ứng dụng phổ biến của bootloader là nạp code cho vi điều khiển mà không cần đến mạch nạp. Hoạt động của nó như sau:
v Bootloader giao tiếp với máy tính thông qua một chuẩn giao tiếp nào đó, thông qua UART-RS232 hay USB chẳng hạn.
v Trên máy tính, thực hiện chuyển dữ liệu cần nạp cho vi điều khiển (file hex, file bin) thông qua những chuẩn giao tiếp trên.
v Chương trình bootloader nhận được dữ liệu này và tiến hành ghi dữ liệu vừa nhận được vào vùng nhớ chương trình thực thi.         
v Sau khi ghi xong thì bootloader nhảy đến địa chỉ đầu tiên (0x0000) của vùng nhớ chương trình thực thi để thực hiện code vừa nạp được.

           
AVR có rất nhiều bootloader được phát triển và sử dụng rộng rãi, phổ biến và được dùng nhiều nhất có thể kể đến là bootloader của Ardunio, Ardunio là một hướng tiếp cận khác khi đã rành rẽ những thứ cơ bản của AVR, học vi điều khiển từ Ardunio cũng có cái hay tuy nhiên tự tìm hiểu từ những thứ cơ bản nhất cũng là một thú vị.
            Ở đây tôi có một bootloader mà tôi đang sử dụng là bootloader dùng USB-HID để giao tiếp với máy tính, và một bootloader cũ hơn là bootloader dùng UART-RS232 để giao tiếp.