Mình đang có một project ATmega8 như thế này(yêu cầu là phải sử dụng ngắt):
Mỗi khi có một ngắt ở chân INT0 hoặc INT1, sau 1 thời gian t1=10ms thì đưa chân PB4 lên mức cao, sau tiếp 1 thời gian t2=10us thì lại phải đưa chân PB4 xuống mức thấp. Mình sử dụng timer1 để tạo khoảng thời gian t1, dùng timer2 để tạo thời gian t2,từ t1 và t2 này mình đã tính đc giá trị nạp cho TCNT1 là 0xc567 và TCNT2 là 0x69. Khi có ngắt INT0, INT1 mình bắt đầu cho timer1 đếm từ a tới 0xffff, khi xảy nha ngắt thì mình đưa PB4 lên mức cao và cũng bắt đầu cho timer2 chay tới khi có ngắt thì mình đưa PB4 xuống mức thấp. Đây là chương trình của mình. Phần chương trình main() ở đây mình chưa kịp viết.phần main() mình đã sử dụng vào việc khác rồi. Các bạn giúp mình tìm lỗi tại sao mà timer1 và timer2 khong hoạt động và chân PB4 không phát xung đc như mình tính toán
Mỗi khi có một ngắt ở chân INT0 hoặc INT1, sau 1 thời gian t1=10ms thì đưa chân PB4 lên mức cao, sau tiếp 1 thời gian t2=10us thì lại phải đưa chân PB4 xuống mức thấp. Mình sử dụng timer1 để tạo khoảng thời gian t1, dùng timer2 để tạo thời gian t2,từ t1 và t2 này mình đã tính đc giá trị nạp cho TCNT1 là 0xc567 và TCNT2 là 0x69. Khi có ngắt INT0, INT1 mình bắt đầu cho timer1 đếm từ a tới 0xffff, khi xảy nha ngắt thì mình đưa PB4 lên mức cao và cũng bắt đầu cho timer2 chay tới khi có ngắt thì mình đưa PB4 xuống mức thấp. Đây là chương trình của mình. Phần chương trình main() ở đây mình chưa kịp viết.phần main() mình đã sử dụng vào việc khác rồi. Các bạn giúp mình tìm lỗi tại sao mà timer1 và timer2 khong hoạt động và chân PB4 không phát xung đc như mình tính toán
Code:
/***************************************************** CodeWizardAVR V2.05.0 Professional Project : ATmega8 Version : Chip : ATmega8 Tan so bo dao dong: 12,000000 MHz Data Stack size : 256 *****************************************************/ // Cac bien toan cuc su dung cho cac chuong trinh int data_timer1 = 50535;//Gia tri nap vao timmer1, mac dinh la 50535 unsigned char led1 =0xbf,led2 =0xd6,led3=0xe0;//Cac bien luu gia tri de hien thi led 7seg o cong C unsigned char cycle =0;//Dinh nghia cac chu ki phat xung 0 la duon, 1 la am unsigned char led=0; #include <mega8.h>; // INT0 : Lay qua 0 cua chu ki duong interrupt [EXT_INT0] void ext_int0_isr(void) { cycle=0;//Chu ki duong gay ra ngat TCNT1 = data_timer1;// Nap gia tri cho timmer1 TCCR1A=0x00; TCCR1B=0x02; //TIMSK|=(1<<TOIE1);//Cho phep timer1 ngat (TOIE1 la bit so 2) } // INT1:Lay qua 0 cua chu ki am interrupt [EXT_INT1] void ext_int1_isr(void) { cycle = 1;//Chu ki am gay ra ngat TCNT1 = data_timer1;// Nap gia tri cho timmer1 TCCR1A=0x00; TCCR1B=0x02; TIMSK |=0x04;//Cho phep timer1 ngat (TOIE1 la bit so 2) } // Timer 0:Moi la timer0 tran thi lai quet tin hieu cua 3 den led 1 lan interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0=0xfd;//Chu ki quet la 100us led++; if(led==1) PORTC = led1;//Hien thi led1 if(led==2) PORTC = led2;//Hien thi led2 if(led==3) PORTC = led3;//Hien thi led3 if(led==4) led=0; } // Timer1:Phat tin hieu dieu khien interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT2=0x69;//Nap gia tri cho timmer2 de tinh do rong cua xung if(cycle==0)PORTB |= (1<<PORTC4);//Phat tin hieu dieu khien mo c if(cycle==1)PORTB |= (1<<PORTC4);//Phat tin hieu dieu khien mo TCCR1A=0x00; TCCR1B=0x00; TCCR2=0x02; TIMSK |=0x40;//Cho phep timer 2 bat dau ngat } // Timer2:Tat tin hieu dieu khien Thyristor interrupt [TIM2_OVF] void timer2_ovf_isr(void) { if(cycle==0)PORTB &= ~(1<<PORTC4);//Tat tin hieu dieu khien if(cycle==1)PORTB &= ~(1<<PORTC5);//Tat tin hieu dieu khien TCCR2=0x00; } void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=T State6=T State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0x3F; DDRB=0x3F; // Port C initialization // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTC=0xFF; DDRC=0xFF; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out // State7=P State6=P State5=P State4=P State3=P State2=P State1=1 State0=1 PORTD=0xFF; DDRD=0x03; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 46,875 kHz TCCR0=0x04; TCNT0=0xD0; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1500,000 kHz // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off //TCCR1A=0x00; //TCCR1B=0x02; TCNT1H=0xC5; TCNT1L=0x67; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 1500,000 kHz // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00; TCNT2=0x69; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: On // INT1 Mode: Rising Edge GICR|=0xC0; MCUCR=0x0A; GIFR=0xC0; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x45; // Global enable interrupts #asm("sei") while (1) { // Place your code here } }