Timer 问:如何在Arduino上启动和停止中断计时器?
在Arduino数到500后,我试图停止并再次恢复我在Arduino上的中断计时器。 因此,中断计时器计数为500,然后延迟几秒钟,然后再次恢复中断计时器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
#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()”的例程的用途是什么?您是否调用过此例程?