我在我的CODE中遇到了一些问题,我猜想溢出中断(用于将8位定时器的分辨率从16μs/ step提高到1μs/ step)。看起来像溢出中断触发,而程序是在我的主循环中的if语句,从而螺丝起飞!使用时间溢出中断时出现毛刺
if(pInt == 1) //PCNINT-if-statment
{
pulse16 = (tot_overflow << 8) | TCNT1; //adds tot_overflow and TCNT1 to be able to set if-statements in PCINT-while-loop with µs
if(PINB & (1 << PINB3)) //if PB3 is HIGH
{
TCNT1 = 0; //resets Timer/Counter1
tot_overflow = 0; //resets tot_overflow variable
}
else
{
if (pulse16 >1555) //when stick 1 travels from 1555 µs towards 2006 µs
{
PORTB &= ~(1 << relayPin); //relay pole switch, + & - on motor
PORTB |= (1 << greenLED); //LED green indicates forward motion
PORTB &= ~(1 << redLED); //turn off red LED
}
else if (pulse16 <1490) //when stick 1 travels from 1490 ms towards 920 µs
{
PORTB |= (1 << relayPin); //relay pole switch, - & + on motor
PORTB &= ~(1 << greenLED); //turn off green LED
PORTB |= (1 << redLED); //LED red indicates backward motion
}
else //if µs is 1490> or <1555 - dead-span to prevent gliteches on relay when stick is in centre position
{
}
}
pInt = 0; //resets pInt to exit PCNINT-if-statment
}
的品脱是 “旗变量”,其指示PCINT被触发。 tot_overflow变量在每次触发溢出中断时递增。
我使用ATtiny85作为RC-开关,它应该LOW上PB2针时从接收器微秒高于1555和去HIGH的时候微秒低于1490
会发生什么事是这样的:如果微秒检查时高于1555或低于1490,并且使用溢出中断时,有时在1490-1555的“死区”中将PB2引脚变为高电平/低电平,否则有时会超出“死区”!这里有一个VIDEO的故障。请注意,绿色LED是我的代码中的黄色LED是greenLED。
我对此很新颖,我不确定为什么会发生这种情况,我不明白为什么代码无法工作。我已经看过CTC功能,但是我看不出它会有帮助,因为我仍然需要使用定时器溢出中断来获得1μs/ step的想要的分辨率。
编辑
我已经尝试了几个变化(的@晏-游标的建议),但仍没有得到它正常工作,这是最接近什么得到一个工作代码:
while(1) //leave and/or put your own code here
{
static uint8_t tot_overflow; //variable to count the number of Timer/Counter1 overflows
if (TIFR & (1 << TOV1))
{
TIFR |= (1 << TOV1); // clear timer-overflow-flag
tot_overflow ++;
}
if(GIFR & (1 << PCIF)) //PCINT-flag idicates PCINT
{
uint16_t pulse; //variable to make a 16 bit integer from tot_overflow and TCNT1
// PORTB |= (1 << debugPin); //pin is HIGH on when interrupt is intialized
pulse = (tot_overflow << 8) | TCNT1; //adds tot_overflow and TCNT1 to be able to set if-statements in PCINT-while-loop with µs
这部分我没有得到工作:
if (((TIFR & (1 << TOV1)) && ((pulse & 0xff))) < 0x80)
{
pulse += 0x100; // Overflow had not been counted
}
林不知道我得到了上面发生的事情,我唯一知道的是,我可能做错了!当我评论上述部分时,它与mu旧代码的工作原理相同!
else
{
if(PINB & (1 << PINB3)) //if PB3 is HIGH
{
TCNT1 = 0; //resets Timer/Counter1
tot_overflow = 0; //resets tot_overflow variable
}
else
{
if (pulse > 1555) //when stick 1 travels from 1555 µs towards 2006 µs
{
PORTB &= ~(1 << relayPin); //relay pole switch, + & - on motor
PORTB |= (1 << greenLED); //LED green indicates forward motion
PORTB &= ~(1 << redLED); //turn off red LED
}
else if (pulse < 1490) //when stick 1 travels from 1490 ms towards 920 µs
{
PORTB |= (1 << relayPin); //relay pole switch, - & + on motor
PORTB &= ~(1 << greenLED); //turn off green LED
PORTB |= (1 << redLED); //LED red indicates backward motion
}
else //if µs is 1490> or <1555 - dead-span to prevent gliteches on relay when stick is in centre position
{
// PORTB |= (1 << greenLED); //for debug to indicate dead-span
// PORTB |= (1 << redLED); //for debug to indicate dead-span
}
}
}
GIFR |= (1 << PCIF); //clear PCINT-flag
}
else
{
}
}
}
ISR(TIMER1_OVF_vect) //when Counter/Timer1 overflows
{
}
ISR(PCINT0_vect) //when pin-level changes on PB3
{
}
难道它还是我还是蓝色?
会真正感兴趣的是为什么有人投这个票。对我来说,这似乎是一个很好的记录问题。该OP甚至费心编入视频。正如我所见,你的计时器处理看起来不错。也许你在代码中有一些我不知道的逻辑错误。代码足够小,可能有助于重新编写一次。也许它修复了它自己。 – jwsc
它不在if语句中,但是行设置为pulse16;这两个读取根本不能同时发生。 –
@jwsc我被拒绝的原因可能是因为我编辑之前的帖子看起来如何。在发布帖子后我总是编辑我的帖子,因为我经常在发帖之后错过了一些东西或看到了某些东西,因为我没有第一次添加坏习惯!你可以检查后,我的第一个版本,并判断你想;-) – CrowStudio