Thông báo

Collapse
No announcement yet.

Cần giúp về Timer/Counter ATMEGA8.

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

  • Cần giúp về Timer/Counter ATMEGA8.

    Mình cần sử dụng 2 timer 8 bit là timer0 và timer2 trong atmega8 để thực hiện băm xung. Với at89 thì có 1 đoạn code rất hay dùng 2 timer:
    Code:
    #include <regx51.h>
     
    unsigned int code mang_t0[]={0,2000,4000,6000,8000,10000,12000,14000,16000,18000,20000};
     
    unsigned int code mang_t1[]={20000,18000,16000,14000,12000,10000,8000,6000,4000,2000,0};
     
     
    unsigned char count_s;
    unsigned char count;
    void T0_ISR();
    void T1_ISR();
    void init();
     
    void main() {
        init();
        while(1);
    }
     
    void init() {
        count=0;//10 cap do
        count_s=0;
        TMOD=0x11;//timer 0, 1 che do 1 16 bit
        P1=0xff;
        TR0=1;
        TF0=1;//ngat luon
        EA=1;
        ET0=1;
        ET1=1;
    }
     
    void T0_ISR() interrupt TF0_VECTOR {
        TR0=0;
        TH1=(0xffff-mang_t1[count])>>8;
        TL1=(0xffff-mang_t1[count])&0xff;
        //P1=mp[count];
        P1=0xff;
        TR1=1;
    }
     
    void T1_ISR() interrupt TF1_VECTOR {
        TR1=0;
        TH0=(0xffff-mang_t0[count])>>8;
        TL0=(0xffff-mang_t0[count])&0xff;
        ++count_s;
        if(count_s==5) {
            count_s=0;
            ++count;
            if(count==11) {
                count=0;
            }
        }
        P1=0x00;
        TR0=1;
    }
    ..
    Tức là 1 timer cho xuất mức logic 0, timer kia xuất mức 1. Khi ngắt tràn timer này chính là lúc bắt đầu khởi tạo timer kia...cứ thế sẽ điều được xung để xuất ra. Cái này dùng cho led sáng dần, mờ dần rất hay.
    _ Tuy nhiên khi mình áp dụng với ATMEGA8 thì chưa biết cách biến đổi như thế nào.
    Đây là code mình định làm cho con led mờ mờ (thời gian xuất 1 =1/3 thời gian xuất 0)

    Code:
    #include <mega8.h>
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {   TCCR2 = 0x05;
        TCNT2 = 0X10;
        PORTD = 0Xff;
          }
    
    // Timer2 overflow interrupt service routine
    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {  TCNT0 = 0XAA;
       PORTD = 0X00;
        }
    
    // Declare your global variables here
    
    void main(void)
    {
    
    PORTB=0x00;
    DDRB=0xFF;
    
    PORTC=0x00;
    DDRC=0xFF;
    
    PORTD=0x00;
    DDRD=0xFF;
    
    TCCR0=0x05; // thực hiện chia tần cho 1024
    TCNT0=0x01;
              // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x41; // cho phép ngắt trên timer0 và timer2
    
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
          {
          // Place your code here
    
          }
    }
    ......
    Khi building thì không có lỗi nhưng lắp mạch thì không thực hiện được.
    Mọi người xem giúp mình nhé.
    p/s: Mục đích là muốn điều xung trên tất cả các PORT dùng 2 timer0 và timer2

Về tác giả

Collapse

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

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

Collapse

Đang tải...
X