Arduino定时器2中断和程序触发

Arduino定时器2中断和程序触发,arduino,atmega,Arduino,Atmega,我使用的是Arduino Mega2560,我使用timer2作为标志溢出2ms后的中断,但不知何故它只工作一次。正如你们所看到的,我使用了串行监控,这告诉我定时器中断被调用,但中断不再被调用,程序控制也不会回到循环中,因为它只显示一次“13”和“22”。至少它应该在定时器中断被调用后连续显示“22”。有人能告诉我为什么定时器中断没有再次被调用,为什么中断后它没有返回到循环中吗 #include <avr/io.h> #include <avr/interrupt.h>

我使用的是Arduino Mega2560,我使用timer2作为标志溢出2ms后的中断,但不知何故它只工作一次。正如你们所看到的,我使用了串行监控,这告诉我定时器中断被调用,但中断不再被调用,程序控制也不会回到循环中,因为它只显示一次“13”和“22”。至少它应该在定时器中断被调用后连续显示“22”。有人能告诉我为什么定时器中断没有再次被调用,为什么中断后它没有返回到循环中吗

#include <avr/io.h>
#include <avr/interrupt.h>

int eraser=0;             //0=000

ISR(TIMER2_OVF_vect)
{
  TIMSK2=0x00;
  TCCR2B=0x00;
  TCCR2A=0x00;
  TCNT2=0;
  TIFR2=0x00;
  Serial.println(33);

  TCNT2= 131;         //reset timer count to 125 out of 255. 
  TCCR2B=0x6;     //using a prescaler of 6 to use divisor 256.
  TIMSK2=1;      //timer2 Interrupt Mask Register. Set TOIE(Timer Overflow Interrupt Enable).
}


void setup()
{
  /*Timer0 would not be used as it is used for other functions.
    Timer 5(pin D47) for encoder and interrupt 2(pin 21) for encoder.
    Timer2 is 8 bit we'll see if it can be used for time interval between two encoder counts.
    This leaves us with Timers 1,3,4,5.
    Timer 3(5,3,2) and 4(8,7,6) will be used for motors.*/

  Serial.begin(9600);

  TCCR2B&=eraser;
  TCNT2= 131;         //reset timer count to 125 out of 255.
  TIFR2= 0x00;      //timer2 interrupt flag register: Clear Timer Overflow Flag. 
  TIMSK2=0x01;      //timer2 Interrupt Mask Register. Set TOIE(Timer Overflow Interrupt Enable).
  TCCR2B=0x6;     //using a prescaler of 6 to use divisor 256.
  /*
  so it takes 62.5ns per tick in a timer and having set 
  divisor of 256 so it will take 16usecs per inc and setting 
  timer2 to 125 would make it count 250 times so 
  time=62.5nsec * 256 * 125=2msec. 
  clkTn
  TCNTn Timer Counter Register
  TCCRnA has LSB of WGM(wave generation mode bits)
  TCCRnB Timer Counter Control Register: has LSB of CSn2,CSn1,CSn0.*/ 

}

void loop()
{ 

  Serial.println(1);
  while(1)
  {

     Serial.println(22);
  }
}
#包括
#包括
int橡皮擦=0//0=000
行业特殊报告员(时间2\u OVF\u vect)
{
TIMSK2=0x00;
TCCR2B=0x00;
TCCR2A=0x00;
TCNT2=0;
TIFR2=0x00;
序列号:println(33);
TCNT2=131;//将计时器计数重置为255中的125。
TCCR2B=0x6;//使用6的预分频器使用除数256。
TIMSK2=1;//定时器2中断掩码寄存器。设置为E(定时器溢出中断启用)。
}
无效设置()
{
/*Timer0不用于其他功能,因为它用于其他功能。
编码器的定时器5(引脚D47)和编码器的中断2(引脚21)。
Timer2是8位的,我们将看看它是否可以用于两个编码器计数之间的时间间隔。
这就给我们留下了计时器1,3,4,5。
定时器3(5,3,2)和4(8,7,6)将用于电机*/
Serial.begin(9600);
TCCR2B&=橡皮擦;
TCNT2=131;//将计时器计数重置为255中的125。
TIFR2=0x00;//定时器2中断标志寄存器:清除定时器溢出标志。
TIMSK2=0x01;//定时器2中断掩码寄存器。设置为E(定时器溢出中断启用)。
TCCR2B=0x6;//使用6的预分频器使用除数256。
/*
因此,在一个计时器中,每滴答62.5ns,并且已经设置好
256的除数,因此每个inc和设置需要16个usecs
时间2到125将使其计数为250倍,因此
时间=62.5nsec*256*125=2毫秒。
clkTn
定时器计数器寄存器
TCCRnA具有WGM的LSB(波形生成模式位)
TCCRnB定时器计数器控制寄存器:具有CSn2、CSn1、CSn0的LSB。*/
}
void循环()
{ 
序列号println(1);
而(1)
{
序列号:println(22);
}
}

您是否尝试过使用

ISR(TIMER2_OVF_vect)
{
  TIMSK2=0x00;
  TCCR2B=0x00;
  TCCR2A=0x00;
  TCNT2=0;
  TIFR2=0x00;
  Serial.println(33);

  TCNT2= 131;         //reset timer count to 125 out of 255. 
  TCCR2B=0x6;     //using a prescaler of 6 to use divisor 256.
  TIMSK2=1;      //timer2 Interrupt Mask Register. Set TOIE(Timer Overflow Interrupt Enable).
}
阻塞并将部分或全部放入您希望再次启动计时器的位置

setup
只运行一次,所以我猜您需要再次启动计时器