【问题标题】:Implementing timer code for Atmega8 into Atmega16将 Atmega8 的定时器代码实现到 Atmega16
【发布时间】:2012-12-19 22:23:32
【问题描述】:

这段代码 sn-p 是为 Atmega8 编写的,取自 clapper circuit using Atmega8。任何人都可以将此代码 sn-p 转换为 Atmega16 并稍加解释。因为我正在尝试为 Atmega16 实现相同的功能并且在计时器部分遇到了一些问题。

#define BURST_TIME  70
#define READY_TIME  150
#define TIME_OUT    300

void timer_init()
{
    TIFR |= (1<<TOV0);      
    //set interrupt on overflow
    TIMSK |= (1<<TOIE0);
    TCNT0 = 223;
}

ISR (TIMER0_OVF_vect)
{       
    TCNT0 = 223;
    timer++;

    if (timer == BURST_TIME)
    {
        burst = 1;
        ready = 0;
    } else if (timer == READY_TIME)
    {
        burst = 0;
        ready = 1;
    } else if (timer == TIME_OUT)
    {
        timer = 0;
        burst = 0;
        ready = 0;
        first = 0;
        stop_timer();
    }
}

void start_timer()
{
    TCCR0 |= (1<<CS02);
}

void stop_timer()
{
    TCCR0 &= ~(1<<CS02);
}

【问题讨论】:

    标签: microcontroller code-conversion atmega winavr atmega16


    【解决方案1】:

    尝试使用芯片的 Atmel 数据表并比较定时器寄存器,您会找到所需的一切

    Atmega8:http://www.atmel.com/images/doc2486.pdf 有用:注册摘要第 280 页

    Atmega16:http://www.atmel.com/Images/doc2466.pdf 有用:注册摘要页面 331

    你想使用定时器 0,那是一个 8 位定时器(Atmega16 上的第 71 页)

    现在让我们试着分析一下代码

    TIFR |= (1<<TOV0); // TIFR Thats the Timer/Counter0 Interrupt Flag Register
                       // TOV0: Timer/Counter0 Overflow Flag
                       // The bit TOV0 is set when an overflow occurs in Timer/Counter0.
                       // Datasheet page: 86
    
    TIMSK |= (1<<TOIE0);  // Timer/Counter Interrupt Mask Register
                          // TOIE0: Timer/Counter0 Overflow Interrupt Enable
                          // When the TOIE0 bit is written to one, and the I-bit in the `status Register is set, the
                          // Timer/Counter0 Overflow interrupt is enabled
    
    TCNT0 = 223; // TCNT0:  0 to 255 or 0x00 to 0xFF
                 // with each clock it increases by 1
                 // when the register hits 255, a Timer-Overflow is triggerd (ISR...)
                 // The flag can be queried or used to trigger an interrupt.
                 // Datasheet Page 85
    
    TCCR0 |= (1<<CS02); // TCCR0: Timer/Counter Control Register
                        // CS02: Bit 2:0 – CS02:0: Clock Select
                        // This means that your running the Timer with a                               
                        // Prescaler of 256 (CPU frequency / 256)
                        // This line starts the Timer!
                        // Datasheet Page: 85
    
    ISR (TIMER0_OVF_vect) // will be executed when a overflow is triggerd
    { 
        // Do something
        // Keep the execution time short in this section
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2012-10-25
      相关资源
      最近更新 更多