首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相对输出比较寄存器值更改行为

问相对输出比较寄存器值更改行为
EN

Stack Overflow用户
提问于 2020-04-19 00:48:55
回答 1查看 51关注 0票数 0

我使用Atmega328p Timer0及其两个OCR:

代码语言:javascript
复制
void timer0_ini(void)
{
    TCCR0A = 0;// set entire TCCR0A register to 0
    TCCR0B = 0;// same for TCCR0B
    TCNT0  = 0;//initialize counter value to 0

    OCR0B = 125; // OCR0B is less than OCR0A, so it works
    OCR0A = 250;

    TCCR0A = (0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(1<<COM0B0)|(1<<WGM01)|(0<<WGM00);

    TCCR0B  |=  (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(1<<CS02)|(1<<CS00);
    TIMSK0 = (1 << OCIE0A)|(1 << OCIE0B);
}

ISR (TIMER0_COMPB_vect)
{
    PORTB ^= (1 << PORTB2);
}

ISR (TIMER0_COMPA_vect)
{
    PORTB ^= (1 << PORTB1);
}

只有当OCR0B < OCR0A时,它才能工作。我不明白这有什么意义。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 08:03:17

使用0, 1, 0 for WGM02, WGM01, WGM00,您启用了CTC (在比较匹配模式上清除计时器)-- TCNT0寄存器在达到OCR0A值后将被清除,因此如果OCR0B值高于OCR0A值,则永远不会达到OCR0B值。

更新以回答评论中的问题:

  1. 是的,可以禁用TCNT0的清除。只需将WGM0x位设置为0。参见表description.
  2. No,末尾的表波形生成模式位描述 TCNT0寄存器的最高值为OCR0A或固定的0xFF,请参见相同的表.

从你的问题上还不清楚你想做什么。也许,可以将较大的值放入OCR0A中,将较小的值放置到OCR0B中,并设置一个标志,说明哪个中断应该更改哪个端口位。

如果您想要产生两个独立的频率,请在自由运行模式下设置定时器(所有WGM位等于0)并尝试。

代码语言:javascript
复制
ISR (TIMER0_COMPB_vect)
{
    PORTB ^= (1 << PORTB2);
    OCR0A += 125;
}

ISR (TIMER0_COMPA_vect)
{
    PORTB ^= (1 << PORTB1);
    OCR0B += 250;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61298208

复制
相关文章

相似问题

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