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 }