Timer 停止定时器设置新值并再次启动AVR(中断)
我有AVR MCU。Timer 停止定时器设置新值并再次启动AVR(中断),timer,arduino,microcontroller,interrupt,avr,Timer,Arduino,Microcontroller,Interrupt,Avr,我有AVR MCU。 我正在玩计时器。 我需要什么?我有一个计时器在以一定的频率计数。在每个中断中,我都在递增变量,在某个地方我需要检查这个变量的值,如果等于100,我需要停止计时器计数,为频率设置新值并继续倒计时。 我无法了解如何停止计时器并设置新值进行比较。 我尝试使用mux选择器寄存器选择无时钟源,但它继续计数。 正确的方法是什么。 这是我的密码 // Arduino timer CTC interrupt example // www.engblaze.com // avr-libc
我正在玩计时器。
我需要什么?我有一个计时器在以一定的频率计数。在每个中断中,我都在递增变量,在某个地方我需要检查这个变量的值,如果等于100,我需要停止计时器计数,为频率设置新值并继续倒计时。
我无法了解如何停止计时器并设置新值进行比较。
我尝试使用mux选择器寄存器选择无时钟源,但它继续计数。
正确的方法是什么。 这是我的密码
// 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++;
}
//Arduino定时器CTC中断示例
//www.engblaze.com
//avr libc库包括
#包括
#包括
#定义LEDPIN_UP 9
#定义LEDPIN_向下8
int当前_值=0;
无效设置()
{
Serial.begin(9600);
//引脚模式(LED引脚向上,输出);
//初始化计时器1
cli();//禁用全局中断
TCCR1A=0;//将整个TCCR1A寄存器设置为0
TCCR1B=0;//TCCR1B相同
//将比较匹配寄存器设置为所需的计时器计数:
//OCR1A=3123;
OCR1A=1562;
//打开CTC模式:
TCCR1B |=(1
要同时清除两位,请使用
TCCR1B &= ~(1 << CS10 | 1 << CS12);
当你想倒计时时,把dir改为-1
TCCR1B &= ~(1 << CS10);
TCCR1B &= ~(1 << CS10 | 1 << CS12);
int dir = 1;
ISR(TIMER1_COMPA_vect)
{
current_value += dir;
}