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

时间:2015-04-14 20:49:11

标签: timer arduino microcontroller interrupt avr

我有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++;

}

1 个答案:

答案 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,而不是希望它倒计时。