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