我有AVR MCU
我现在正在玩计时器。
我需要的 ?我有一些频率计时器计时器。在每个中断我正在递增变量,在某处我需要检查此变量的值,如果等于100,我需要停止计时器计数,设置频率的新值并继续倒计时。
我无法得到如何停止计时器并设置新值来进行比较
我试图使用多路复用器选择器寄存器选择无时钟源,但它会继续计数
什么是正确的方法来做到这一点。
这是我的代码
// Arduino timer CTC interrupt example
// www.engblaze.com
// avr-libc library includes
#include <avr/io.h>
#include <avr/interrupt.h>
#define LEDPIN_UP 9
#define LEDPIN_DOWN 8
int current_value = 0;
void setup()
{
Serial.begin(9600);
// pinMode(LEDPIN_UP, OUTPUT);
// initialize Timer1
cli(); // disable global interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
// set compare match register to desired timer count:
// OCR1A = 3123;
OCR1A = 1562;
// turn on CTC mode:
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
// enable timer compare interrupt:
TIMSK1 |= (1 << OCIE1A);
// enable global interrupts:
sei();
}
void loop()
{
//digitalWrite(LEDPIN_UP, current_value);
Serial.println(current_value);
if(current_value==255) {
TCCR1B |= (0 << CS10);
TCCR1B |= (0 << CS12);
Serial.println("Reseting timer");
}
}
ISR(TIMER1_COMPA_vect)
{
current_value++;
}
答案 0 :(得分:2)
TCCR1B |= (0 << CS10);
TCCR1B |= (0 << CS12);
不符合您的期望。因为您正在使用&#34;或&#34; |
,返回的值为0|1
,为1,而非0,如您所愿。
通常的清除方法是
TCCR1B &= ~(1 << CS10);
要一次清除两位,请使用
TCCR1B &= ~(1 << CS10 | 1 << CS12);
至于倒计时,您将需要使用变量来指示您当前的方向,然后在ISR中使用该变量。也许,
int dir = 1;
ISR(TIMER1_COMPA_vect)
{
current_value += dir;
}
并将dir更改为-1,而不是希望它倒计时。