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
}
}
