Xử lí ngõ vào/ngõ ra số trong bộ vi điều khiển AVR
Đầu ra kỹ thuật số (I / O): là tính năng cơ bản được hỗ trợ bởi bộ vi điều khiển AVR. Để tạo điều kiện cho đầu ra/đầu vào số có ba thanh ghi được liên kết với mỗi cổng của bộ vi điều khiển.
Thanh ghi hướng dữ liệu - Thanh ghi này xác định chân nào sẽ đóng vai trò là cổng đầu ra và chân nào là đầu vào.
Thanh ghi đầu ra dữ liệu - Thanh ghi này giữ đầu ra dữ liệu tới cổng.
Thanh ghi nhập dữ liệu - Đọc dữ liệu từ cổng
Bây giờ chúng ta hãy xem xét một ví dụ. Đối với PortA , ba thanh ghi lần lượt là- DDRA, PORTA & PINA. Tương tự như vậy đối với Port B , nó sẽ là- DDRB, PORTB & PINB.
Trước khi đi thảo luận thêm, có một điều quan trọng chúng ta nên đề cập đến. Một cổng có thể phục vụ cho nhiều mục đích. Trách nhiệm của lập trình viên là loại bỏ các lỗi có thể xảy ra. Nếu chương trình và hệ thống không được thiết kế cẩn thận, Chương trình có thể không chạy được.
Sơ đồ mạch sử dụng Atmega32 và Atmega8
Sơ đồ mạch Atmega32
Sơ đồ mạch Atmega8
Phát sáng đèn LED
Chương trình 1: Chương trình cơ bản Hiển thị chức năng đầu ra kỹ thuật số.
#include
#define F_CPU 1000000
#include
int main()
{ DDRB=0x0f;
PORTB=0x00;
while(1)
{ _delay_ms(1500);
PORTB =~PORTB;
}
return 0;
}
Giải thích chương trình:
Chương trình này bao gồm hai câu lệnh đơn giản và một vòng lặp trễ. Kí hiệu ‘~’ là viết tắt của thuật toán đảo. Ở đây, tần số hoạt động của CPU phải được xác định để thực hiện đúng vòng lặp trễ và nó phải được khai báo trước dòng ' delay.h ' trong mã C. Ở đây sử dụng #define F_CPU 1000000 .
Cách khác để xác định tần số hoạt động của CPU là thiết lập sẵn trong Avr Studio, đi tới ‘Project Menu> Configuration Options> General’. Tại đây bạn có thể chọn kiểu máy và tần số hoạt động của nó.
Như đã thảo luận trước đây, thanh ghi hướng dữ liệu phải được thiết lập trước khi thực hiện bất kỳ thao tác nhập / xuất nào.
Kết quả ngõ ra:
Đèn LED được kết nối với Port B nhấp nháy trong khoảng thời gian 3 giây.
Chương trình 2: Nút nhấn kết hợp với LED
#include
int main()
{ DDRB=0x0f;
DDRD=0x00;
while(1)
PORTB =~PIND;
return 0;
}
Giải thích chương trình
Để đọc ngõ ra từ một port, chúng ta sử dụng ' PINX '. Trong đó 'X' là tên của port. Lúc này đặt đầu ra bằng biến 'PORTX', và đọc đầu vào bằng biến 'PINX'. Đối với một Port cụ thể, hai biến này có địa chỉ khác nhau. Nếu bạn viết ' PORTX = PORTY ' việc này có nghĩa cả hai đều là biến đầu vào.
Kết quả ngõ ra:
Khi nhấn nút nhấn, đèn LED tương ứng với nút đó sẽ sáng lên.
Chương trình điều khiển động cơ bước
#include
#define F_CPU 1000000
#include
int main()
{ char ch[]= {0x01,0x02,0x04,0x08};
int i=0;
DDRB=0x0f;
while(1)
{ PORTB =ch[i];
i++; // is equivalent to
i= i%4; // PORTB=ch[(i++)%4];
_delay_ms(1000);
}
return 0;
}
Giải thích chương trình
Động cơ bước có vị trí chính xác và khả năng kiểm soát tốc độ. Đối với động cơ bước DC, cuộn dây trường được cung cấp trực tiếp từ nguồn điện. Dòng điện qua phần ứng được điều khiển bởi bộ vi điều khiển với sự trợ giúp của transistor. Để làm cho phần ứng xoay đúng, duy trì các trình tự trong quá trình cung cấp năng lượng cho cuộn dây. Giả sử một động cơ có cuộn A, B, C & D.
Trong chương trình này, một mảng các ký tự được khai báo trước và chúng được đưa vào Port B một cách tuần tự và lặp đi lặp lại để điều khiển động cơ bước. Một vòng lặp trì hoãn cũng được sử dụng giúp kiểm soát tốc độ.
Kết quả:
Các đèn LED trên bảng sẽ được bật liên tục và sẽ lặp lại theo trình tự. Mỗi đèn LED sẽ được bật trong 1 giây. Sau đó, đèn LED bên cạnh sẽ bật lên, và cứ thế lặp lại. Đèn LED đầu tiên bật sau đèn LED cuối cùng.
Chương trình Nút nhấn chống dội
#include
#define F_CPU 1000000
#include
int main()
{ char ifCondition;
char chkValidity;
DDRB=0x0f;
DDRD=0x00;
while(1)
{ if Condition = 0x0f&(~PIND); //kiểm tra nút nhấn có được nhấn hay không
If (if Condition)
{ _delay_ms(100); // đợi kết thúc kiểm tra
chkValidity =0x0f&(~PIND); // Đọc lại dưc việc chân đầu vào
if(ifCondition==chkValidity)// Kiểm tra điều kiện
// Nếu điều kiện đúng
{ PORTB=chkValidity;// Gán PortB cho biến mới
// Ngõ ra sau khi chống dội
}
}
}
return 0;
}
Giải thích
Chống dội có nghĩa là lấy đầu vào từ một phím/nút loại bỏ các tín hiệu sai được tạo ra bởi nhiễu điện và tín hiệu điện thoáng qua. Một trong những phương pháp phổ biến nhất của kỹ thuật chống dội là kiểm tra lại phím sau khoảng thời gian vài giây.
Trong chương trình trên, sau khi lấy một đầu vào, nó sẽ được kiểm tra nếu nhấn bất kỳ phím nào! Nếu nhấn, sau 100mS, các phím được đọc lại. Nếu cả hai đều có giá trị bằng nhau, đèn LED tương ứng với phím được nhấn sẽ được bật.
Kết quả
Ban đầu, tất cả các đèn LED sẽ tắt. Nếu bất kỳ phím nào được nhấn, phím tương ứng sẽ phát sáng. Nếu nhấn phím mới đèn LED tương ứng với phím / nút đó sẽ phát sáng và đèn LED trước đó sẽ tắt. Nhiều phím cũng có thể được nhấn và trong trường hợp này nhiều đèn LED sẽ phát sáng.
Hotline: 0979 466 469