Monday, February 1, 2016

Cách lập trình vào I/O ra ATmega với WinAVR giống với VodeVision

WinAVR là 1 trình biên dịch C cho Atmega. Nó là 1 phần mềm miễn phí hiện đang sử dụng rộng rãi trên toàn thế giới mà điển hình đó là Arduino.

Như các bạn đã biết về cơ bản thì WinAVR và CodeVision là giống nhau. Nhưng chỉ có 1 vài cái hơi khác đó là về cách sử dụng các cổng vào ra của Atmega.

Với CodeVision thì điều đó thật dễ dàng.
Ví dụ cổng PB3 được cấu hình là cổng ra thì muốn có tín hiệu "1" thì chúng ta chỉ cần viết là PORTB.3=1 là xong .
Hoặc cổng PD1 được cấu hỉnh là cổng đầu vào thì để đọc được tín hiệu trên chân này chúng ta chỉ cần if(PIND.1==0) là xong.

Với WinAVR thì điều đó hơi phức tạp hơn 1 chút xíu
vẫn ví dụ trên cổng PB3 được cấu hình là cổng ra thì muốn có tín hiệu "1" thì chúng ta cần phải viết:
PORTB|=1<<PB3;
Câu lệnh này chả có gì là khó hiểu nó có nghĩa là PORTB=PORTB|(1<<PB3). Với các bạn hiểu và nắm vững C nó là "muỗi"
Và để xuất tín hiệu "0" thì chúng ta dùng dòng lệnh:
PORTB&=~(1<<PB3);
Với lệnh đọc tín hiệu trên chân PD1 chẳng hạn chúng ta dùng lệnh
if(!(PIND&(1<<PD1)))
Câu lệnh này tức là nếu PD1 về "0) thì PIND&(1<<PD1)=0 sau lệnh đảo sẽ =1 . dòng lệnh if sẽ được thực hiện.
Điều này đòi hỏi bạn phải thành thạo các lệnh logic và nắm vững kỹ năng sử dụng byte và bit.

Để lập trình WinAVR cũng dễ dàng như vậy tôi đã viết 1 file port.h hỗ trợ lập trình WinAVR như Codevision
Các bạn có thể download nó tại :


Cách sử dụng :

Chúng ta làm quen nó qua 1 ví dụ:

Chân PB3 là chân đầu ra, và chân PD1 là chân đầu vào. ấn nút bấm tại chân PD1 thì đèn led tại chân PB3 sáng , nhả tay ra thì đèn tối.

Code :
#include<avr/io.h>
#include "port.h"
void main()
{
DDRB=0x08;//cong PB la dau ra
PORTD=0x02;// gan tro treo cho cong PD1 la dau vao
while(1)
 {
if(_PIND.b1==0)
_PORTB.b3=1;
else
_PORTB.b3=0;
 }
}
Về cơ bản khi sử dụng thì các bạn dùng nó như với Codevision nhưng thêm dấu "_" và "b3".
Toàn bộ mã C và file hex các bạn download tại

No comments:

Post a Comment