Chương II: Tìm hiểu vi điều khiển AVR
2.1 Giới thiệu Tổng quan về AVR
− AVR là một họ vi điều khiển do hãng Atmel sản xuất. Atmel cung cấp các vi điều
khiển phổ biến như 8051, AT91 ARM7, Atmel AVR 8-bit RISC, và mới đây là DSP
dual-CPU AT57. Atmel AVR32 là một vi điều khiển lai DSP với 7 tầng pipeline và
khả năng thực thi song song AVR là chip vi điều khiển 8 bits với cấu trúc tập lệnh
đơn giản hóa-RISC(Reduced Instruction Set Computer), một kiểu cấu trúc đang thể
hiện ưu thế trong các bộ xử lí.
Hình 1 ảnh một chip AVR
2.1.1 Ưu thế của MCU AVR:
Kết nối phần cứng cho AVR đơn giản với những linh kiện thông dụng như điện trở,
tụ điện, thạch anh. Dòng ra điều khiển Port lớn và không cần dùng điện trở kéo.
Thiết kế mạch nạp cho AVR khá đơn giản giao tiếp qua cổng LPT, COM, USB. Hỗ
trợ ISP lập trình trực tiếp trên mạch.
Hỗ trợ lập trình trên nền ngôn ngữ ASM, C với nhiều công cụ hỗ trợ như
CodeVision, AVR Studio.
Hầu hết các chip AVR có những tính năng (features) sau:
Xung External OSC lên đến 16Mhz và Internal OSC 8Mhz.
Bộ nhớ chương trình Flash có thể lập trình lại rất nhiều lần và dung lượng lớn
có thể ghi và xóa trên 1000 lần. Bên cạnh đó bộ nhớ EEPROM có thể lập trình
được.
32 Port xuất nhập.
8 bits, 16 bits timer/counter tích hợp PWM.
Các bộ chuyển đối Analog – Digital phân giải 10 bits
Analog comparator.
Giao diện nối tiếp USART (tương thích chuẩn nối tiếp RS-232).
•Giao diện nối tiếp Two –Wire –Serial (tương thích chuẩn I2C) Master và Slaver.
Giao diện nối tiếp Serial Peripheral Interface (SPI).
2. 1.2Một số dòng AVR:
Nhìn chung AVR có các dòng chính sau:
Havard tức là bộ nhớ dữ liệu và bộ nhớ chương trình tách biệt nhau cả về vùng nhớ
và đường bus. Bộ nhớ chương trình của AVR là bộ nhớ Flash có dung lượng 128
Kb.
Bộ nhớ chương trình có độ rộng bus là 16 bit. Những địa chỉ đầu tiên của bộ nhớ
chương trình được dùng cho bảng vecto ngắt. Bộ nhớ chương trình Flash được chia
thành 2 phần, phần chương trình khởi động và phần chương trình ứng dụng. Cả hai
phần đều dành những bit khóa cho việc bảo vệ ghi và đọc/ghi. Lệnh SPM dùng ghi
vào phần bộ nhớ chương trình Flash ứng dụng phải ở một nơi nhất định trong phần
bộ nhớ chương trình khởi động.
Bộ nhớ dữ liệu của AVR chia làm 2 phần chính là bộ nhớ SRAM và bộ nhớ
EEPROM. Tuy cùng là bộ nhớ dữ liệu nhưng hai bộ nhớ này lại nằm tách biệt nhau
và được đánh địa chỉ riêng.
Các câu lệnh trong bộ nhớ chương trình được thực hiện với một cấp ống dẫn
riêng. Khi một lệnh được thực hiện thì lệnh tiếp theo được mang về sẵn từ bộ nhớ
chương trình. Ý tưởng này cho phép mỗi lệnh được thực hiện trong chỉ một chu kỳ
xung nhịp. Bộ nhớ chương trình trong hệ thống là bộ nhớ Flash có thể lập trình lại.
Truy cập nhanh tệp thanh ghi chứa 32 thanh ghi 8 bit làm việc mục đích chung
với thời gian truy cập trong một chu kỳ xung nhịp. Điều này cho phép đơn vị xử lý
số học và logic (ALU) hoạt động trong một chu kỳ đơn. Một hoạt động điển hình
của ALU là hai toán hạng được lấy ra từ tệp thanh ghi, hoạt động thực hiện tính
toán giữa các toán hạng, sau đó kết quả lại được lưu vào tệp thanh ghi, tất cả các
công việc đó được thực hiện trong một chu kỳ xung nhịp.
Có 6 trong 32 thanh ghi có thể được sử dụng như 3 con trỏ thanh ghi địa chỉ gián
tiếp 16 bit cho việc ghi địa chỉ vùng nhớ dữ liệu, cho phép có thể tính toán địa chỉ.
Một trong số những con trỏ địa chỉ này có thể dược dùng nhưmột con trỏ địa chỉ để
tra bảng trong bộ nhớ chương trình Flash. Các thanh ghi này là các thanh ghi 16 bit
X, Y và Z.
ALU hỗ trợ các phép tính số học và logic giữa các thanh ghi hoặc giữa hằng số
với một thanh ghi. Các phép tính với 1 thanh ghi riêng lẻ có thể cũng được thực
hiện trong ALU. Sau mỗi phép tính số học thanh ghi trạng thái được cập nhật để
- Dễ dàng tự động hóa.
Việc ứng dụng công nghệ số, sử dụng vi điều khiển trong việc thiết kế và chế tạo bộ
khởi động mềm là hoàn toàn phù hợp với điều kiện thực tế và xu thế chung. Sử dụng
công nghệ số trong thiết kế, chế tạo bộ khởi động mềm có thể giúp ta dễ dàng tạo
dáng đường đặc tính khởi động theo ý muốn mà bằng mạch điều khiển tương tự để
làm được việc này thì sẽ gặp nhiều khó khăn. Vi điều khiển ATmega16 là vi điều
khiển thuộc họ AVR của hãng Atmel, là một dòng vi điều khiển tích hợp cao với
những chức năng cơ bản nhưng rất cần thiết trong những ứng dụng cụ thể.
Vi điều khiển ATmega16 cung cấp những tính năng sau:
- 16K bytes bộ nhớ chương trình dạng flash có thể Read-While-Write .
- 512 bytes EEPROM.
- 1K byte RAM tĩnh (SRAM).
- 32 đường kết nối I/O mục đích chung.
- 32 thanh ghi làm việc mục đích chung được nối trực tiếp với đơn vị xử lý số học và
logic (ALU).
- Một giao diện JATG cho quét ngoại vi.
- Lập trình và hỗ trợ gỡ rối trên chip.
- 3 Timer/Counter linh hoạt với các chế độ so sánh.
- Các ngắt ngoài và ngắt trong (21 nguyên nhân ngắt).
- Chuẩn truyền dữ liệu nối tiếp USART có thể lập trình.
- Một ADC 10 bit, 8 kênh với các kênh đầu vào ADC có thể lựa chọn bằng cách lập
trình.
- Một Watchdog Timer có thể lập trình với bộ tạo dao động bên trong.
- Một cổng nối tiếp SPI ( serial peripheral interface).
- 6 chế độ tiết kiệm năng lượng có thể lựa chọn bằng phần mềm.
- Lựa chọn tần số hoạt động bằng phần mềm.
- Đóng gói 40 chân kiểu PDIP.
- Tần số tối đa 16MHz.
- Điện thế 4,5– 5,5V
2.2.3 Mô tả hoạt động của cấu trúc
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và lưu vị
trí đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ tới vector phuc
vụ ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới khi gặp lệnh RETI (return
from interrup) thì CPU lại lấy PC từ ngăn xếp ra và tiếp tục thực hiện chương trình
mà trước khi có ngăt nó đang thực hiện. Trong trường hợp mà có nhiều ngắt yêu cầu
cùng một lúc thì CPU sẽ lưu các cờ báo ngắt đó lại và thực hiện lần lượt các ngắt
theo mức ưu tiên .Trong khi đang thực hiện ngắt mà xuất hiện ngắt mới thì sẽ xảy ra
hai trường hợp. Trường hớp ngắt này có mức ưu tiên cao hơn thì nó sẽ được phục vụ.
Còn nó mà có mức ưu tiên thấp hơn thì nó sẽ bị bỏ qua.
Bộ nhớ ngăn xếp là vùng bất kì trong SRAM từ địa chỉ 0x60 trở lên. Để truy nhập
vào SRAM thông thường thì ta dùng con trỏ X,Y,Z và để truy nhập vào SRAM theo
kiểu ngăn xếp thì ta dùng con trỏ SP. Con trỏ này là một thanh ghi 16 bit và được
truy nhập như hai thanh ghi 8 bit chung có địa chỉ :SPL :0x3D/0x5D(IO/SRAM) và
SPH:0x3E/0x5E.
Khi chương trình phục vu ngắt hoặc chương trình con thì con trỏ PC được lưu vào
ngăn xếp trong khi con trỏ ngăn xếp giảm hai vị trí.Và con trỏ ngăn xếp sẽ giảm 1
khi thực hiện lệnh push. Ngược lại khi thực hiện lệnh POP thì con trỏ ngăn xếp sẽ
tăng 1 và khi thực hiện lệnh RET hoặc RETI thì con trỏ ngăn xếp sẽ tăng 2. Như vậy
con trỏ ngăn xếp cần được chương trình đặt trước giá trị khởi tạo ngăn xếp trước khi
một chương trình con được gọi hoặc các ngắt được cho phép phục vụ. Và giá trị ngăn
xếp ít nhất cũng phải lớn hơn 60H (0x60) vì 5FH trỏ lại là vùng các thanh ghi.
Ví dụ:
char cSREG;
cSREG = SREG; /* store SREG value */
/* disable interrupts during timed sequence */
CLI();
EECR |= (1<<EEMWE); /* start EEPROM write */
EECR |= (1<<EEWE);
SREG = cSREG; /* restore SREG value (I-bit) */
2.2.4 sơ đồ chân và chức năng của ATmega16
AVCC nên được nối với VCC qua bộ lọc thông thấp.
- AREF: chân điện áp tham chiếu của bộ chuyển đổi A/D
2.3.ngôn ngữ lập trình
Ngôn ngữ lập trình C là ngôn ngữ khá mạnh và được nhiều người sử dụng. Lập
trình bằng ngôn ngữ cấp cao như C giúp xây dựng các ứng dụng nhanh chóng và dễ
dàng hơn. Sau đây sẽ giới thiệu một cách cơ bản nhất về cách viết chương trình cho
AVR sử dụng ngôn ngữ C.
Một chương trình C cho AVR thường bao gồm những thàn phần cơ bản như: chú
thích (comments), biểu thức (expressions), câu lệnh (statements), khối (blocks), các
toán tử, cấu trúc điều khiển (flow controls), hàm (function)….
Chú thích (comments): Chú thích là những đoạn trong chương trình dùng để giải
thích hay bình phẩm những gì ta làm trong chương trình, phần chú thích không được
biên dịch vì vậy nó không có bất kỳ ảnh hưởng nào đến hoạt động của chương trình.
Có hai cách để tạo phần chú thích trong C là chú thích theo từng dòng bằng cách đặt
ở đầu dòng chú thích dấu “//” và chú thích block bằng cách kẹp đoạn cần chú thích
vào giữa /*…*/.
Tiền xử lý (preprocessor): là một tiện ích của ngông ngữ C, các preprocessor được
trình biên dịch xử lý trước tất cả các phần khác. Các preprocessor được bắt đầu bằng
dấu “#”, trong ngôn ngữ C có hai preprocessor được sử dụng phổ biến nhât đó là
#include và #define. Preprocessor #include dùng để chỉ định 1 file được đính kèm
trong quá trình xử lý, và #define dùng để định nghĩa một chuỗi thay thế hoặc 1
macro.
Biểu thức (expressions): là một phần của các câu lệnh, biểu thúc có thể bao gồm
các biến, các toán tử, gọi hàm…. Biểu thức trả về một giá trị đơn. Biểu thức không
phải là một câu lệnh hoàn chỉnh.
Câu lệnh (statements): là một dòng lệnh hoàn chỉnh có thể bao gồm các từ khóa
(key words), các biểu thức các câu lệnh khác và được kết thúc bằng dấu “;”.
Khối (blocks): là sự kết hợp của nhiều câu lệnh để cùng thực hiện một nhiệm vụ
nào đó. Khối được kẹp giữa hai dấu mở khối “{” và đóng khối “}”.
Toán tử (operators): là những ký hiệu báo cho trình biên dịch biết nhũng nhiệm vụ
…
}
- Trong trường hợp có nhiều khả năng xảy ra cho 1 biểu thức (hay một biến) với
mỗi khả năng lại cần thực hiện một công việc nào đó, ta có thể sử dụng cấu trúc
switch:
Switch (biểu thức){
Case hằng _số_1:
Các câu lệnh 1;
Break;
Case hằng_số_2:
Các câu lệnh 2;
Break;
Defaul:
Các câu lệnh khác;
}
Cấu trúc switch hoạt động theo cách thức sau: Đầu tiên chương trình tính giá trị
của biểu thức sau đó lần lượt dem so sánh với các giá trị hằng số đặt phía sau từ khóa
case. Biểu thức có giá trị bằng hằng số nào thì thực hiện các câu lệnh trong case đó
dến khi tìm thấy từ khóa break. Có thể đặt bao nhiêu case tùy ý. Nếu giá trị của biểu
thức không tương ứng với các hằng số thì chương trình thực hiện các câu lệnh trong phần
defaul: (nếu có phần này).
- Cấu trúc lặp While: “while (điều kiện) câu lệnh 1”. Ý nghĩa của cấu trúc lặp while là
thực hiện câu lệnh 1 (hoặc 1 khối câu lệnh đặt trong dấu “{ }”) khi điều kiện còn đúng.
- Cấu trúc lặp for : “for (biểu thức 1; biểu thức 2; biểu thức 3) câu lệnh”. Trong đó biểu
thức 1 là biểu thức khởi tạo, biểu thức 2 là điều kiện, biểu thức 3 là biểu thức thực hiện sau.
Biểu thức 1 được thực hiện 1 lần sau đó chương trình kiểm tra điêu kiện qua biểu thức 2,
nếu điều kiện đúng câu lệnh được thực hiện, sau đó thực hiện biểu thức 3 rồi lại quay lại
kiểm tra điều kiện. Cứ như vậy tới khi điều kiện không còn đúng nữa thì chương trình thoát
khỏi vòng lặp.
Hàm (functions): Trong C có rất nhiều hàm, mỗi hàm dùng để thực hiện một chức năng
63
–1) đến (2
63
–1)
2.3.1 Hướng dẫn cài đặt và tạo một project mới
Cài đặt trình biên dịch CoddeVision AVR C trong thư mục mặc định :
C:/Cvavr. Theo các bước sau
Chạy file cài đặt trong thư mục chứa
Lựa chọn ngôn ngữ cho giao diện chương trình =>chọn ngôn ngữ và ấn phím ok
Chương trình trình yêu cầu đọc hướng dẫn sử dụng và chọn thư mục mặc định sau
khi chọn xong thư mục chứa ta ấn next sẽ có cửa số thong báo như sau
Chọn lntall xuất hiện cửa sổ thông báo hoàn thành cài đăt và chọn finish
Sau khi cài đặt xong ta chạy chương trình bằng file cvavr.exe trong thư mục:
C:/Cvavr/bin
Tạo một project mới bằng cách chọn File/New trong bảng chọn (menu option), cửa
sổ trong hình vẽ hiện ra:
Chọn “Project” sau đó ấn “OK”. Cửa số sau hiện ra:
Ấn “yes” để sử dụng CodeWizardAVR viết chương trình tự động.
2.3.2 Cách sử dụng CodeWizardAVR lập trình tự động :
CodeWizardAVR làm đơn giản hóa việc viết những đoạn code mở đầu cho những
loại vi điều khiển AVR khác nhau. Sau khi ấn “yes” trong cửa số “confirm” ở trên sẽ
hiện ra cửa sổ để chọn lựa:
Trong bài toán điều khiển bộ khởi động mềm này ta chọn chip ATmega16 với tần
số xung nhịp là 16MHz. Định dạng các cổng vào/ra phù hợp với mục đích sử dụng
bằng cách chọn tab “Ports”
Cài đặt mặc định của tất cả các cổng I/O là các đầu vào (input). Nếu muốn sử
dụng bit nào làm nơi xuất dữ liệu ta cần cài đặt cho bit đó thành đầu ra (output) bằng
cách click vào vào bit đó.
Định dạng các Timer bằng cách chọn tab “Timer”
Chọn tần của timer phù hợp với giá trị tần số xung nhịp, chọn chế độ hoạt động và
sử dụng như một phần tích hợp để nạp chính Project đang được biên dịch bởi
CodeVisionAVR, tất cả thông qua hộp thoại Chip Programmer (menu Tools →
Chip Programmer hoặc tổ hợp phím tắt Shift + F4).
Quá trình lập trình cho chip AVR được chia làm 3 thao tác cơ bản bao gồm
Program (nạp xuông), Read (đọc lên), và Compare (so sánh), cá thao tác trên được
đặt trên hệ thống menu của hộp thoại Programmer, các thao tác trên được áp dụng
cho các thành phần sau trên chip:
- Bộ nhớ chương trình (Flash).
- Bộ nhớ không mất nội dung (EEPROM).
- Các bit lưu cấu hình hoạt động (Fuse bits).
- Các bít lưu cấu hình bảo vệ (Lock bits).
Ngoài ra còn một số mục liên quan như Signature byte, Caliblation Byte… Tham
khảo chi tiết trong Datasheet của Atmega16
Trên hộp thoại Programmer có các nút cơ bản bao gồm ProgramAll và
Reset Chip:
- Nút Program All được sử dụng để nạp tất cả các thành phần đã được thiết lập
xuống chíp. Bao gồm Flash, EEPROM, Fuse bits và Lock bits. Cần đặc biệt chú ý
điều này, khuyến cáo là không nên sử dụng tới nút Program All khi bạn chưa hiểu
hết tác dụng của Fuse bits, Lock bits, hơn nữa với nhu cầu thông thường là nạp
chương trình vào bộ nhớ Flash, sử dụng nút này sẽ làm kéo dài thời gian lập trình do
nạp cả các thành phần không cần thiết. (Nút Program All rất có tác dụng khi cần nạp
sản xuất một lượng lớn chíp, giúp làm giảm các thao tác thiết lập).
- Nút Reset Chip sẽ kích hoạt tín hiệu Reset trên mạch đích.
Một thành phần quan trọng khác là hộp thoại chọn chíp, cần chọn đúng loại AVR
trong danh sách trước khi tiến hành các thao tác nạp. Phía bên phải là phần Fuse bits,
liệt kê danh sách các Fuse tương ứng với loại AVR đã chọn (tên và số lượng các fuse
này khác nhau với từng dòng AVR). Mặc định CodeVisionAVR để trống các bit này
( giá trị 1), điều đó không có nghĩa rằng các Fuse bits thực tế trên Chip cũng có giá
trị 1, những người mới sử dụng thường hay nhấn nút Program All mà không biết
rằng các Fuse bits không được thiết lập đúng. Vô tình thay đổi Fuse bits mặc định
2.4.2 Hướng dẫn cài đặt
Click vao file setup7.6 sp4 trong thư mục chứa
Khi đó xuất hiện một bảng chào mừng và yêu cầu cài đặt ta chọn next khi đó sẽ xuất
hiện bảng thỏa thuận người dùng ta chọn yes để sang bước kế tiếp