我正在尝试使用计数器检查Timer3的频率。声明为易失性的计数器的值在ISR中递增,并且每秒在主循环中显示总和,并将该值重置为零。
计时器已正确设置。(如果选择3Hz计时器,我会看到LED闪烁)
问题
计数器不增加。这是输出:
Setup Completed
tick: 1
tick: 0
tick: 0
tick: 0
码
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// Initialize Timer
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3B = 20; // 800Hz 5; // 3 Hz
// turn on CTC mode:
TCCR3B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3B);
// enable global interrupts:
sei();
Serial.println("Setup completed");
}
void loop()
{
if (millis() % 1000 == 0)
{
Serial.print(" tick: ");
Serial.println(cont);
cont = 0;
}
}
ISR(TIMER3_COMPB_vect)
{
//digitalWrite(13, digitalRead(13) ^ 1);
cont++;
}
编辑 此计时器用于从加速度计读取模拟值并将其存储在float数组中。但是此刻,我仍停留在此更新问题上。
解决方案1 感谢Gerben
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// Initialize Timer
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3A = 20; // 20; //800Hz 5; // 3 Hz
// turn on CTC mode:
TCCR3B |= (1 << WGM32);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3B);
// enable global interrupts:
sei();
Serial.println("Setup completed");
}
void loop()
{
delay(1000);
Serial.println(cont);
cont = 0;
}
ISR(TIMER3_COMPB_vect)
{
cont++;
}
解决方案2 感谢BrettM
volatile int cont = 0;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
// Initialize Timer
cli(); // disable global interrupts
TCCR3A = 0; // set entire TCCR3A register to 0
TCCR3B = 0; // same for TCCR3B
// set compare match register to desired timer count: 800 Hz
OCR3B = 20; //800Hz 5; // 3 Hz
// turn on CTC mode:
//TCCR3B |= (1 << WGM32);
// Set CS10 and CS12 bits for 1024 prescaler:
TCCR3B |= (1 << CS30) | (1 << CS32);
// enable timer compare interrupt:
TIMSK3 |= (1 << OCIE3B);
// enable global interrupts:
sei();
Serial.println("Setup completed");
}
void loop()
{
Serial.println(cont);
cont = 0;
delay(1000);
}
ISR(TIMER3_COMPB_vect)
{
TCNT3 = 0;
cont++;
}
是的,如果我取消注释
—
UserK 2014年
digitalWrite
并设置OCR3B = 5;
指示灯以大约该频率闪烁。
那真是个谜。您是否尝试过注释
—
里卡多
cont = 0;
循环内部?那会发生什么呢?
尝试增加频率。我认为您的if语句在某种程度上可能比清除中断更频繁地清除计数器。但是随后您应该在输出中看到更多的内容。如果运行更长的时间(例如1分钟),然后粘贴结果。另外,更新问题时,请保留旧的输出,以使您的问题有意义(无需编辑历史记录)。
—
里卡多
我怀疑中断例程仅被调用一次,然后被禁用。我读过某个地方的文章,说在运行中断代码时禁用了中断,在某些情况下您必须重新启用它,但是我真的不确定是否是这种情况。希望会有更多知识渊博的人来救援...
—
Ricardo 2014年
digitalWrite
线路,您会看到LED每秒闪烁约一次(每0.66s)?