Mình có một chương trình như thế này. dùng cho ATmega8, Mình dùng INT0 và INT1 để điều khiển chạy dừng cho timer1, khi cho dừng thì mình cho CS12=0, CS11=0, CS10=0(nghĩa là mình ngắt nguồn clock), còn khi cho timer1 chạy thì mình đat CS12=0, CS11=1, CS10=0 lấy nguồn clok là 1,5Mhz sử dụng thạch anh 12Mhz. Nhưng khi mình cho chạy thì chương trình lai không chạy theo yêu cầu. Ở đây tại sao mình set 2 chân pb4 và pb5 lên cao rồi sau đó khi xuống thấp thì nó hoàn toàn không phản ứng gì. Các bạn xem mình bị lỗi ở đâu gúp mình với. thank
Code:
//Info:
//Chip:ATmega8
//Clock:12MHz
//Author:
//Company:
//Date: 20//3/2012
//Tools:AVRstudio5.1
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom8.h>
#define pulse_width 150
//**********************************************************************************************
//Cac bien toan cuc
unsigned int time_open=0x3A98;//bien dung tinh toan do tre nap vao OCR1A
unsigned char led=0,led1=0xB1,led2=0xD8,led3=0xE0;//Cac bien su dung de hien thi led
unsigned char half_cycle=0;//Bien dung de xac dinh chu ki duong hay am gay ra ngat
int main(void)
{
//####################################################################################
//THIET LAP THONG SO CAC PORT VAO RA
//PORTB:Phat tin hieu den ban phim, phat tin hieu dieu khien, lay xung tu bo dao dong thach anh
//Dieu huong:PB0=out PB1=out PB2=out PB3=out PB4=out PB5=out PB6=in PB7=in
//Trang thai:PB0=1 PB1=1 PB2=1 PB3=1 PB4=1 PB5=1 PB6=0 PB7=0
DDRB=0x3F;
PORTB=0x3F;
//PORTC:Quet 3 led 7 doan
//Dieu huong:PC0=out PC1=out PC2=out PC3=out PC4=out PC5=out PC6=out
//Trang thai:PC0=1 PC1=1 PC2=1 PC3=1 PC4=1 PC5=1 PC6=1
DDRC=0xFF;
PORTC=0xFF;
//PORTD:Bao cac trang thai loi, nhap du lieu, doc du lieu tu ban phim, loi vao cua ngat
//Dieu huong:PD0=out PD1=out PD2=in PD3=in PD4=in PD5=in PD6=in PD7=in
//Trang thai:PD0=1 PD1=1 PD2=1 PD3=1 PD4=1 PD5=1 PD6=1 PD7=1 PD8=1
DDRD=0x03;
PORTD=0xFF;
//####################################################################################
//THIET LAP CAC CHO CAC TIMER
//TIMER0:Ho tro viec quet led 7 seg, moi lan hien thi 1led trong khoang 2ms
//Clock:46875Hz(256 xung cua mach dao dong thi TCNT0 moi tang 1 don vi) - luon hoat dong
//Timer0 Interrupt:on
TCCR0=0x04;
TCNT0=0xA1;
TIMSK|=(1<<TOIE0);
//TIMER1:Tao thoi gian tre cua goc mo, tao do rong xung cua goc mo
//Clock:1,5Mhz(8 xung cua mach dao dong thi TCNT1 mooi tang 1 don vi) - Chi hoat dong khi co ngat INT0 va INT1
//Timer1 compare match A interrupt:on
//Timer1 compare match B interrupt:on
TCNT1=0x0000;
OCR1A=0x0A98;
OCR1B=OCR1A+pulse_width;
TCCR1A=0x00;
TCCR1B=0x00;//Khong cho phep timer chay tu dong
TIMSK|=((1<<TOIE1)|(1<<OCIE1A)|(1<<OCIE1B));
//##################################################################################
//THIET LAP CHO NGAT NGOAI
//INT0:Lay qua 0 cua chu ki duong
//INT1:Lay qua 0 cua chu ki am
//Interrupt falling of INT0:on
//Interrupt falling of INT1:on
MCUCR|=((1<<ISC11)|(1<<ISC01));
GICR|=((1<<INT0)|(1<<INT1));
//##################################################################################
//CHO PHEP NGAT TOAN CUC
sei();
while(1)
{
//TODO:: Please write your application code
}
}
ISR(INT0_vect)
{
half_cycle=0;
TCNT1=0x0000;//Nap lai gia tri cho timer1
TCCR1A=0x00;
TCCR1B=0x02;//Cho phep timer1 bat dau hoat dong
}
ISR(INT1_vect)
{
half_cycle=1;
TCNT1=0x0000;//Nap lai gia tri cho time1
TCCR1A=0x00;
TCCR1B=0x02;//Cho phep time1 bat dau hoat dong
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0xA1;//Nap lai gia tri cho timer0
led++;
if(led==1) PORTC=led1;
if(led==2) PORTC=led2;
if(led==3) PORTC=led3;
if(led==4) led=0;
}
ISR(TIMER1_COMPA_vect)
{
if(half_cycle==0) PORTB|=(1<<PB4);//Neu do ngat 0 thi dua chan PB4 len muc cao
if(half_cycle==1) PORTB|=(1<<PB5);//Neu do ngat 1 thi dua chan PB5 len muc cao
}
ISR(TIMER1_COMPB_vect)
{
if(half_cycle==0) PORTB&=(~(1<<PB4));//neu do ngat 0 thi dua chan PB4 xuong muc thap
if(half_cycle==1) PORTB&=(~(1<<PB5));//Neu do ngat 1 thi dua chan PB5 xuong muc thap
TCCR1A=0x00;
TCCR1B=0x00;//Dung timer1
}
