Bài 1: GPIO VỚI AVR
Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bản CodeVisionAVR Tại Đây
I.TỔNG QUAN VỀ GPIO CỦA AVR.
Xin chào các bạn!
Trong bài viết này tôi xin giới thiệu với các bạn về GPIO của họ vi điều khiển AVR.
-Trong họ vi điều khiển AVR, các PORT là các “của ngõ” then chốt của vi điều khiển. PORT có thể giao tiếp với các thiết bị ngoại vi theo hai hướng: xuất và nhập.
-Số lượng các PORT ứng với mỗi loại vi điều khiển trong họ AVR là khác nhau. Số lượng các chân I/O trong một PORT cũng khác nhau.
-Ngoài chức năng xuất/nhập thông thường, các chân của vi điều khiển còn mang những chức năng đặc biệt khác như: ADC, Ngắt Ngoài, TIMER, …
Sơ đồ GPIO của ATMEGA8:
-Họ AVR cung cấp cho chúng ta 3 thanh ghi (8bit): PORTx, DDRx, PINx (với x là tên PORT) để điều khiển hướng của các PORT một cách dễ dàng. Mỗi bit của các thanh ghi tương ứng với một chân của PORT.
·DDRx: đây là thanh ghi định hướng cho các chân của vi điều khiển.
ØDDRx = 0: cấu hình chân là INPUT.
ØDDRx = 1: cấu hình chân là OUTPUT.
PORTx: đây là thanh ghi cho biết mức điện áp được xuất ra ở chân OUTPUT.
ØPORTx = 0: điện áp xuất ra 0V.
ØPORTx = 1: điện áp xuất ra 5V.
·PINx: đây là thanh ghi đọc trạng thái của chân INPUT.
II.BÀI TOÁN VÍ DỤ.
Để giúp các bạn hiểu rõ cách cấu hình các thanh ghi điều khiển hướng I/O trong AVR, tôi xin đưa ra bài toán:
·Sử dụng vi điều khiển Atmega8, thay đổi trạng thái (sáng/tắt) của LED bằng nút bấm. Mỗi lần nút được bấm, trạng thái của LED sẽ thay đổi.
-Định nghĩa I/O cho các PORT:
#ifndef __GPIO_H
#define __GPIO_H
#include <mega8.h>
#include <delay.h>
//---------- CAU HINH I/0 -------------
// PORTB ------------------------------
// Cau hinh cho LED
// Chan 4 cua PORTB ket noi voi LED don
#define LED PORTB.4
// PORTC ------------------------------
// Cau hinh cho BUTTON
// Chan 7 cua PORTD ket noi voi nut bam
// PORTD ------------------------------
#define BUTTON PIND.7
#endif
Chương trình chính (gồm có cấu hình I/O cho các PORT):
void main(void)
{
// CAU HINH I/O CHO CAC PORT
// CAU HINH PORTB
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00; // Dien ap xuat ra la 0V
DDRB=0x10; // Chan 4 cua PORTB la chan OUTPUT
// CAU HINH PORTC
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// CAU HINH PORTD
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x80; // Co tro noi keo len cho chan 7
DDRD=0x00; // Cac chan cua PORTD la cac chan INPUT
while (1)
{
if(!BUTTON) // Neu BUTTON duoc an
{
delay_ms(10); // Delay chong nhieu
if(!BUTTON) // Neu dung BUTTON duoc an
{
LED =~LED; // Trang thai cua LED duoc thay doi
while(!BUTTON);
}
}
// Place your code here
}
}
– Video demo:
– Các bạn có thể tham khảo CODE mẫu và mô phỏng tại đây:
DOWNLOAD TẠI ĐÂY