Timer 停止定时器设置新值并再次启动AVR(中断)

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

我有AVR MCU。
我正在玩计时器。
我需要什么?我有一个计时器在以一定的频率计数。在每个中断中,我都在递增变量,在某个地方我需要检查这个变量的值,如果等于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;
}