Showing posts with label AVR. Show all posts
Showing posts with label AVR. Show all posts

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

Saturday, January 23, 2016

Đồng hồ để bàn đơn giản với ATmega8


Rảnh ở nhà, kiếm trong hòm đồ còn con atmega8 lôi ra làm cái đồng hồ để bàn chơi chia sẻ với anh em design chơi.
Sơ đồ mạch :
Linh kiện cần mua:
1- Atmega8 1 con
2- trở 120 ôm , trở 10k loại dán 0805.
3- nút bấm 3 cái
4- ds1307 1 con
5- thạch anh 32.768kHz 1con
4- tụ 100u 3 con
5- tụ 10u 1 con
6- tụ 22p 2 con
7- led đồng hồ 4 số 1 cái loại 0.28inch anot chung
 Lúc đâu tôi định mua loại 0.56 inch nhưng họ hết hàng chỉ còn loại 0.28 inch . thôi thì lấy tạm vậy.
8- IC 7805
9- Jac DC loại 3.5mm nhỏ

II- mạch nguyên lý hoàn chỉnh 

Những chỗ đi dây màu đỏ là đoạn câu dây.
fusebit ở tần số 8Mhz nội

Cách sử dụng:
Nút J3 là nút Setup. khi bắt đầu sử dụng thì bạn ấn nút Setup. đèn phút sẽ nhấp nháy sử dụng các phím J1 và J2 để tăng giảm thời gian.
Ấn J3 lần nữa thì đến đèn Giờ sẽ nhấp nháy. tương tự như trên.
Ấn J3 lần nữa để kết thúc . và đồng hồ bắt đầu chạy

PCB và code (C+ file hex)
các bạn download

Mọi sự trợ giúp xin đăng lên Group

Saturday, July 5, 2014

Sử dụng timer/counter 1 của ATmega8 để đo tần số hiển thị LCD

Trong các ứng dụng của vi điều khiển thì đo tần số là 1 ứng dụng hay và có áp dụng trong thực tế
code: viết trên Winavr vì tôi không thích sử dụng Codevision nếu các bạn cần thì có thể nhắn tin cho tôi để lấy code nhé.
#include <avr/io.h>
#include <avr/interrupt.h>
#include "myLCD.h"
#include <stdio.h>
#include <util/delay.h>
#define sbi(sfr,bit) sfr|=_BV(bit)
#define cbi(sfr,bit) sfr&=~(_BV(bit))
static FILE lcd= FDEV_SETUP_STREAM(putChar_LCD, NULL,_FDEV_SETUP_WRITE);
volatile  long sod=0,sodem;
int main()
{
float f_;
unsigned int doi;
init_LCD();
clr_LCD();
TIMSK|=(1<<TOIE1);
sei();
while (1)
{
clr_LCD();
move_LCD(1,1);
fprintf(&lcd,"do tan so");
move_LCD(2,1);
TCNT1=0;
TCCR1B|=(1<<CS11)|(1<<CS12);
_delay_ms(500);
cbi(TCCR1B,CS12);
cbi(TCCR1B,CS11);
sodem=sod*65535+TCNT1;
sod=0;
f_=sodem/0.5;
f_=f_/1000;
doi=f_/1;
fprintf(&lcd,"f=%d",doi);
f_=f_-doi;
doi=f_*100/1;
fprintf(&lcd,".%d kHz",doi);
_delay_ms(50000);
}
}
ISR (TIMER1_OVF_vect )
{
TCNT1=000;
sod++;
}
//-----------------------------------------------------------
download code tai:
http://www.4shared.com/rar/P2x2LpgWce/do_Hz.html

Dể có thể giao lưu và học hỏi tốt hơn bạn hãy vào Nhóm Facebook  https://www.facebook.com/groups/dientuungdung123/