Thông báo

Collapse
No announcement yet.

Nhờ giúp đỡ về diều khiển timer bằng ngắt ngoài hoặc bằng ngắt của timer khác

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nhờ giúp đỡ về diều khiển timer bằng ngắt ngoài hoặc bằng ngắt của timer khác

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

Về tác giả

Collapse

congbinh1989 Tìm hiểu thêm về congbinh1989

Bài viết mới nhất

Collapse

Đang tải...
X