相对输出比较寄存器值改变行为
Relative Output Compare Registers values change behavior
我使用 Atmega328p Timer0 及其两个 OCR:
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时有效。
我不明白为什么它有道理。
使用 0, 1, 0
作为 WGM02, WGM01, WGM00
,您启用了 CTC(比较匹配模式下的清除计时器)— TCNT0
寄存器在达到 OCR0A
值后将被清除,以便OCR0B
值如果高于 OCR0A
就永远达不到。
已更新以回答评论中的问题:
是的,可以禁止清除 TCNT0。只需将 WGM0x 位设置为 0。请参阅 TCCR0A 描述末尾的 table 波形生成模式位描述 。
不,TCNT0寄存器的最高值是OCR0A或固定0xFF,见同table。
从你的问题中不清楚你想做什么。也许,可以将较大的值放入 OCR0A,将较小的值放入 OCR0B,并设置一个标志,说明哪个中断应更改哪个端口位。
如果你想制作两个独立的频率,将定时器设置为自由-运行模式(所有WGM位等于0)并尝试
ISR (TIMER0_COMPB_vect)
{
PORTB ^= (1 << PORTB2);
OCR0A += 125;
}
ISR (TIMER0_COMPA_vect)
{
PORTB ^= (1 << PORTB1);
OCR0B += 250;
}
我使用 Atmega328p Timer0 及其两个 OCR:
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时有效。 我不明白为什么它有道理。
使用 0, 1, 0
作为 WGM02, WGM01, WGM00
,您启用了 CTC(比较匹配模式下的清除计时器)— TCNT0
寄存器在达到 OCR0A
值后将被清除,以便OCR0B
值如果高于 OCR0A
就永远达不到。
已更新以回答评论中的问题:
是的,可以禁止清除 TCNT0。只需将 WGM0x 位设置为 0。请参阅 TCCR0A 描述末尾的 table 波形生成模式位描述 。
不,TCNT0寄存器的最高值是OCR0A或固定0xFF,见同table。
从你的问题中不清楚你想做什么。也许,可以将较大的值放入 OCR0A,将较小的值放入 OCR0B,并设置一个标志,说明哪个中断应更改哪个端口位。
如果你想制作两个独立的频率,将定时器设置为自由-运行模式(所有WGM位等于0)并尝试
ISR (TIMER0_COMPB_vect)
{
PORTB ^= (1 << PORTB2);
OCR0A += 125;
}
ISR (TIMER0_COMPA_vect)
{
PORTB ^= (1 << PORTB1);
OCR0B += 250;
}