首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Atmega16中实现Atmega8的定时器代码

在Atmega16中实现Atmega8的定时器代码
EN

Stack Overflow用户
提问于 2012-12-20 06:23:32
回答 1查看 2.9K关注 0票数 0

这段代码是为取自clapper circuit using Atmega8的Atmega8编写的。任何人都可以转换这段代码的Atmega16和一些解释。因为我正在尝试为Atmega16实现同样的功能,并且在计时器部分遇到了一些麻烦。

代码语言:javascript
运行
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-01-05 10:49:11

尝试使用Atmel的芯片数据表,并比较定时器寄存器,您将找到所需的所有内容

Atmega8:http://www.atmel.com/images/doc2486.pdf有用:寄存器摘要页280

Atmega16:http://www.atmel.com/Images/doc2466.pdf有用:寄存器摘要页331

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

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

代码语言:javascript
运行
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13962256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档