Timer 问:如何在Arduino上启动和停止中断计时器?

Timer 问:如何在Arduino上启动和停止中断计时器?,timer,arduino,interrupt,Timer,Arduino,Interrupt,在Arduino数到500后,我试图停止并再次恢复我在Arduino上的中断计时器。 因此,中断计时器计数为500,然后延迟几秒钟,然后再次恢复中断计时器 #define ledPin 13 int count=0; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); cli();//stop interrupts //set timer0 interrupt at 2kHz TCCR1A = 0;// set entire

在Arduino数到500后,我试图停止并再次恢复我在Arduino上的中断计时器。 因此,中断计时器计数为500,然后延迟几秒钟,然后再次恢复中断计时器

#define ledPin 13
int count=0;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
cli();//stop interrupts
//set timer0 interrupt at 2kHz
  TCCR1A = 0;// set entire TCCR0A register to 0
  TCCR1B = 0;// same for TCCR0B
  TCNT1  = 0;//initialize counter value to 0
  // set compare match register for 2khz increments
  OCR1A = 124;// = (16*10^6) / (2000*64) - 1 (must be <256)
  // turn on CTC mode
  TCCR1A |= (1 << WGM01);
  // Set CS01 and CS00 bits for 64 prescaler
  TCCR1B |= (1 << CS01) | (1 << CS00);   
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
sei();
}

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine
{
count++;
if(count%2==0)digitalWrite(ledPin,HIGH);
if(count%2==1)digitalWrite(ledPin,LOW);
if(count>=500)
{
  count=0;
  TCCR1B=0;
  digitalWrite(ledPin,LOW);
  //TCCR1B |= (1 << CS01) | (1 << CS00); 
}

}

void loop()
{
// your program here...

Serial.println(count);
delay(1000);

}

void berhenti()
{
cli();//stop interrupts
digitalWrite(ledPin,LOW);
count=0;
delay(3000);
sei(); 
}
这是我的代码,我可以停止中断,但不知道如何延迟并再次恢复计时器

#define ledPin 13
int count=0;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
cli();//stop interrupts
//set timer0 interrupt at 2kHz
  TCCR1A = 0;// set entire TCCR0A register to 0
  TCCR1B = 0;// same for TCCR0B
  TCNT1  = 0;//initialize counter value to 0
  // set compare match register for 2khz increments
  OCR1A = 124;// = (16*10^6) / (2000*64) - 1 (must be <256)
  // turn on CTC mode
  TCCR1A |= (1 << WGM01);
  // Set CS01 and CS00 bits for 64 prescaler
  TCCR1B |= (1 << CS01) | (1 << CS00);   
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
sei();
}

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine
{
count++;
if(count%2==0)digitalWrite(ledPin,HIGH);
if(count%2==1)digitalWrite(ledPin,LOW);
if(count>=500)
{
  count=0;
  TCCR1B=0;
  digitalWrite(ledPin,LOW);
  //TCCR1B |= (1 << CS01) | (1 << CS00); 
}

}

void loop()
{
// your program here...

Serial.println(count);
delay(1000);

}

void berhenti()
{
cli();//stop interrupts
digitalWrite(ledPin,LOW);
count=0;
delay(3000);
sei(); 
}
#定义LED引脚13
整数计数=0;
无效设置()
{
引脚模式(LED引脚,输出);
Serial.begin(9600);
cli();//停止中断
//将定时器0中断设置为2kHz
TCCR1A=0;//将整个TCCR0A寄存器设置为0
TCCR1B=0;//TCCR0B相同
TCNT1=0;//将计数器值初始化为0
//为2khz增量设置比较匹配寄存器

OCR1A=124;//=(16*10^6)/(2000*64)-1(必须是您可以使用
millis()
函数来计算所需的时间

#define ledPin 13
int count=0;

// A boolean to know if the timer is stopped or not.
// You can use the TIMSK1 bit, but I prefer a seperate variable.
boolean  timerStopped = false; 

// Time when the timer stopped.
long timerStoppedTime = 0;

// Your delay in milliseconds.
// You can use a macro here as well.
long timerStoppedDelay = 1000; 

// I'll explain this variable in the answer.
boolean takeTimeTimerStopped = true; 

void setup()
{
     // I haven't change this function.
}

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine
{
    count++;
    if(count%2==0)digitalWrite(ledPin,HIGH);
    if(count%2==1)digitalWrite(ledPin,LOW);
    if(count>=500)
    {
        count=0;
        TCCR1B=0;
        digitalWrite(ledPin,LOW);
        TIMSK1 |= (0 << OCIE1A); // deactivate timer's interrupt.
        timerStopped = true;
    }

}

void loop()
{
    // your program here...

    Serial.println(count);
    delay(1000);

    if(timerStopped)
    {
        if(takeTimeTimerStopped)
        {
            timerStoppedTime = millis();
            takeTimeTimerStopped = false;
        }
        if((millis() - timerStoppedTime) >= timerStoppedDelay)
        {
            TIMSK1 |= (1 << OCIE1A); // reactivate the timer.
            timerStopped = false;
            takeTimeTimerStopped = true;
        }
    }

 }
#定义LED引脚13
整数计数=0;
//一个布尔值,用于知道计时器是否停止。
//您可以使用TIMSK1位,但我更喜欢一个单独的变量。
布尔timerStopped=false;
//计时器停止的时间。
长时间RSToppedTime=0;
//您的延迟以毫秒为单位。
//您也可以在此处使用宏。
长时间停止延迟=1000;
//我会在答案中解释这个变量。
布尔TakeTimerStopped=true;
无效设置()
{
//我没有改变这个函数。
}
ISR(定时器比较程序)//定时器比较中断服务程序
{
计数++;
如果(计数%2==0)数字写入(ledPin,高);
如果(计数%2==1)数字写入(ledPin,低);
如果(计数>=500)
{
计数=0;
TCCR1B=0;
数字写入(ledPin,低电平);

TIMSK1 |=(0您可以使用
millis()
函数来计算所需的时间

#define ledPin 13
int count=0;

// A boolean to know if the timer is stopped or not.
// You can use the TIMSK1 bit, but I prefer a seperate variable.
boolean  timerStopped = false; 

// Time when the timer stopped.
long timerStoppedTime = 0;

// Your delay in milliseconds.
// You can use a macro here as well.
long timerStoppedDelay = 1000; 

// I'll explain this variable in the answer.
boolean takeTimeTimerStopped = true; 

void setup()
{
     // I haven't change this function.
}

ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine
{
    count++;
    if(count%2==0)digitalWrite(ledPin,HIGH);
    if(count%2==1)digitalWrite(ledPin,LOW);
    if(count>=500)
    {
        count=0;
        TCCR1B=0;
        digitalWrite(ledPin,LOW);
        TIMSK1 |= (0 << OCIE1A); // deactivate timer's interrupt.
        timerStopped = true;
    }

}

void loop()
{
    // your program here...

    Serial.println(count);
    delay(1000);

    if(timerStopped)
    {
        if(takeTimeTimerStopped)
        {
            timerStoppedTime = millis();
            takeTimeTimerStopped = false;
        }
        if((millis() - timerStoppedTime) >= timerStoppedDelay)
        {
            TIMSK1 |= (1 << OCIE1A); // reactivate the timer.
            timerStopped = false;
            takeTimeTimerStopped = true;
        }
    }

 }
#定义LED引脚13
整数计数=0;
//一个布尔值,用于知道计时器是否停止。
//您可以使用TIMSK1位,但我更喜欢一个单独的变量。
布尔timerStopped=false;
//计时器停止的时间。
长时间RSToppedTime=0;
//您的延迟以毫秒为单位。
//您也可以在此处使用宏。
长时间停止延迟=1000;
//我会在答案中解释这个变量。
布尔TakeTimerStopped=true;
无效设置()
{
//我没有改变这个函数。
}
ISR(定时器比较程序)//定时器比较中断服务程序
{
计数++;
如果(计数%2==0)数字写入(ledPin,高);
如果(计数%2==1)数字写入(ledPin,低);
如果(计数>=500)
{
计数=0;
TCCR1B=0;
数字写入(ledPin,低电平);

TIMSK1 |=(0名为“berhenti()”的例程的用途是什么?您是否调用过此例程?名为“berhenti()”的例程的用途是什么?您是否调用过此例程?