WiDo定时器程序编译不通过

2014-12-141.1万
AI 快速预览详细 收起
本文讨论了将Arduino Uno上的定时器程序移植到WiDo时遇到的编译问题。文章详细描述了具体的编译错误信息,并提供了相应的解决方案。通过本文,您可以了解如何解决WiDo定时器编译不通过的问题,从而顺利完成项目开发。
Arduino Uno上的程序移植到WiDo上,定时器部分编译不通过,求解

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(10)
周DF_ZCL
周DF_ZCL
TIMER_INTR_NAME预定义如下:
#if defined(__AVR_ATmega32U4__)
#define TIMER_INTR_NAME TIMER1_OVF_vect
#else
#define TIMER_INTR_NAME TIMER2_OVF_vect
#endif
周DF_ZCL
周DF_ZCL
相应的定时器中断处理如下:
ISR(TIMER_INTR_NAME) {
#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || defined (__AVR_ATmega1280__) || defined (__AVR_ATmega2560__)
TCNT2 = Timerszcl::tcnt2;
#elif defined (__AVR_ATmega128__)
TCNT2 = Timerszcl::tcnt2;
#elif defined (__AVR_ATmega8__)
TCNT2 = Timerszcl::tcnt2;
#elif defined (__AVR_ATmega32U4__)
TCNT1H = 255;
TCNT1L = 0;
#endif
周DF_ZCL
周DF_ZCL
void Timerszcl::set(unsigned long ms, void (*f)()) {
float prescaler = 0.0;
#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega328P__) || defined (__AVR_ATmega1280__) || defined (__AVR_ATmega2560__)
TIMSK2 &= ~(1<TCCR2A &= ~((1<TCCR2B &= ~(1<ASSR &= ~(1<TIMSK2 &= ~(1<if ((F_CPU >= 1000000UL) && (F_CPU <= 16000000UL)) { // prescaler set to 64
TCCR2B |= (1<TCCR2B &= ~((1<prescaler = 64.0;
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR2B |= (1<TCCR2B &= ~((1<prescaler = 8.0;
} else { // F_CPU > 16Mhz, prescaler set to 128
TCCR2B |= ((1<TCCR2B &= ~(1<prescaler = 128.0;
}
#elif defined (__AVR_ATmega8__)
TIMSK &= ~(1<TCCR2 &= ~((1<TIMSK &= ~(1<ASSR &= ~(1<if ((F_CPU >= 1000000UL) && (F_CPU <= 16000000UL)) { // prescaler set to 64
TCCR2 |= (1<TCCR2 &= ~((1<prescaler = 64.0;
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR2 |= (1<TCCR2 &= ~((1<prescaler = 8.0;
} else { // F_CPU > 16Mhz, prescaler set to 128
TCCR2 |= ((1<TCCR2 &= ~(1<prescaler = 128.0;
}
#elif defined (__AVR_ATmega128__)
TIMSK &= ~(1<TCCR2 &= ~((1<TIMSK &= ~(1<if ((F_CPU >= 1000000UL) && (F_CPU <= 16000000UL)) { // prescaler set to 64
TCCR2 |= ((1<TCCR2 &= ~(1<prescaler = 64.0;
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR2 |= (1<TCCR2 &= ~((1<prescaler = 8.0;
} else { // F_CPU > 16Mhz, prescaler set to 256
TCCR2 |= (1<TCCR2 &= ~((1<prescaler = 256.0;
}
#elif defined (__AVR_ATmega32U4__)
TIMSK1 &= ~(1<TCCR1A &= ~((1<TCCR1B &= ~((1<TCCR1C = 0;
TIMSK1 &= ~(1<if ((F_CPU >= 1000000UL) && (F_CPU <= 16000000UL)) { // prescaler set to 64
TCCR1B |= (1<TCCR1B &= ~(1<prescaler = 64.0;
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR1B |= (1<TCCR1B &= ~((1<prescaler = 8.0;
} else { // F_CPU > 16Mhz, prescaler set to 128
TCCR1B |= (1<TCCR1B &= ~((1<prescaler = 128.0;
}
#endif
tcnt2 = 256 - (int)((float)F_CPU * 0.001 / prescaler);
if (ms == 0)
msecs = 1;
else
msecs = ms;
func = f;
}
liuximing
liuximing
作者
谢谢各位,可是加载了那个库之后编译还是不通过
lauren
lauren回复liuximing
不过有库,使用定时器很方便的,肯定比你自己写timer配置方便多了:lol
lauren
lauren回复liuximing
加载了库之后你的代码要改的。。。timer2相关的代码都是不可能编译过得,学着用库里面的函数和功能吧!
Youyou
Youyou

上图是atmega32U4的定时器概述,截图自atmega32u4的数据手册,确实没有定时器2。
因此那个库的意思应该是,如果使用了Leonardo,那么切换到它的定时器4来兼容,防止没有定时器2出现错误。
lauren
lauren
我记得没有错的话,atmega32u4内核的主控是没有timer2的。。。。o(╯□╰)o
楼主你可以了解下timer4,路线二是去搜一下google,arduino leonardo compatible timer library。。。
我爱小宇宙
我爱小宇宙
因为你的库文件没有更新,你的库里面没有更新,在libraries\MsTimer2文件夹里的MsTimer2.cpp里面写的,你的库应该没有这句话,不知道我说的对不对

库文件压缩包我放附件里了,你试试看,能否解决
我爱小宇宙
我爱小宇宙回复lauren
因为吃过这亏,所以记忆犹新啊,想当年也是哥哥你交给我地,嘿嘿嘿
lauren
lauren回复我爱小宇宙
eric大神,牛逼,兼容的库都找到了。。。
liuximing
liuximing
作者
恩恩,但是都是AVR的处理器啊,Leonardo是ATmega32U4,也有定时器2
Grey
Grey
wido 好像是Leonardo,不是UNO的主控吧
liuximing
liuximing
作者
//**************************** Function Set up Timer2 *****************************
int SetupTimer2()
{
TCCR2A = 0; //Timer2 mode 0, normal operating mode
TCCR2B = 1<return(0); //same as TCCR2B = 0x07
}
//************************* Timer2 Interrupt Svc Routine **************************
//Timer2 overflow interrupt-service routine (ISR)
ISR(TIMER2_OVF_vect)
{
TCNT2=Timer2_start_value;
timer_count++;
}
//**************************** Function Serial-Input ******************************
//function to read serial port as soon as it has data ready
byte SerialInput_ND()
{
timer_count = 0;
TCNT2 = Timer2_start_value;
TIMSK2 = 1<while (Serial.available() == 0)
{
if (timer_count > 255)
{
TIMSK2 = 0<return (0);
}
}
TIMSK2 = 0<return ( Serial.read() );
}
- 没有更多了 -