DF创客社区
发现
DF创客商城
教程
产品资料库
搜索
热门搜索
人工智能
视觉传感器
AI 人工智能
行空板
主控板
二哈识图
热门活动
关闭
DF创客社区
发现
DF创客商城
教程
产品资料库
WiDo定时器程序编译不通过
2014-12-14
1.1万
liuximing
UID: 29095
1
文章
0
粉丝
0
获取喜欢
0
0
AI 快速预览
详细
收起
本文讨论了将Arduino Uno上的定时器程序移植到WiDo时遇到的编译问题。文章详细描述了具体的编译错误信息,并提供了相应的解决方案。通过本文,您可以了解如何解决WiDo定时器编译不通过的问题,从而顺利完成项目开发。
Arduino
Uno上的程序移植到WiDo上,定时器部分编译不通过,求解
创作许可协议
本项目采用
None(不开放任何权利,保留所有权利)
进行许可。
FAQ
其他平台
添加到合集
0
0
相关推荐
欧盟发布2026版AI教学指南
木子哦
1722
0
【花雕动手做】使用4040铝型材与250W减速电机的底盘小车
驴友花雕
71
0
BLE Arduino开发神器 Bluno Beetle开启免费试用啦!
Ash1
2.3万
0
评论(10)
周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
相应的定时器中断处理如下:
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
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
作者
谢谢各位,可是加载了那个库之后编译还是不通过
回复
lauren
回复
liuximing
不过有库,使用定时器很方便的,肯定比你自己写timer配置方便多了:lol
回复
lauren
回复
liuximing
加载了库之后你的代码要改的。。。timer2相关的代码都是不可能编译过得,学着用库里面的函数和功能吧!
回复
Youyou
上图是atmega32U4的定时器概述,截图自atmega32u4的数据手册,确实没有定时器2。
因此那个库的意思应该是,如果使用了Leonardo,那么切换到它的定时器4来兼容,防止没有定时器2出现错误。
回复
lauren
我记得没有错的话,atmega32u4内核的主控是没有timer2的。。。。o(╯□╰)o
楼主你可以了解下timer4,路线二是去搜一下google,arduino leonardo compatible timer library。。。
回复
我爱小宇宙
因为你的库文件没有更新,你的库里面没有更新,在libraries\MsTimer2文件夹里的MsTimer2.cpp里面写的,你的库应该没有这句话,不知道我说的对不对
库文件压缩包我放附件里了,你试试看,能否解决
回复
我爱小宇宙
回复
lauren
因为吃过这亏,所以记忆犹新啊,想当年也是哥哥你交给我地,嘿嘿嘿
回复
lauren
回复
我爱小宇宙
eric大神,牛逼,兼容的库都找到了。。。
回复
liuximing
作者
恩恩,但是都是AVR的处理器啊,Leonardo是ATmega32U4,也有定时器2
回复
Grey
wido 好像是Leonardo,不是UNO的主控吧
回复
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() );
}
回复
- 没有更多了 -
liuximing
UID: 29095
1
文章
0
粉丝
0
获取喜欢
创作许可协议
本项目采用
None(不开放任何权利,保留所有权利)
进行许可。
相关推荐
欧盟发布2026版AI教学指南
木子哦
1722
0
【花雕动手做】使用4040铝型材与250W减速电机的底盘小车
驴友花雕
71
0
BLE Arduino开发神器 Bluno Beetle开启免费试用啦!
Ash1
2.3万
0
#if defined(__AVR_ATmega32U4__)
#define TIMER_INTR_NAME TIMER1_OVF_vect
#else
#define TIMER_INTR_NAME TIMER2_OVF_vect
#endif
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
}
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<
TCCR2B |= (1<
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR2B |= (1<
} else { // F_CPU > 16Mhz, prescaler set to 128
TCCR2B |= ((1<
}
#elif defined (__AVR_ATmega8__)
TIMSK &= ~(1<
TCCR2 |= (1<
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR2 |= (1<
} else { // F_CPU > 16Mhz, prescaler set to 128
TCCR2 |= ((1<
}
#elif defined (__AVR_ATmega128__)
TIMSK &= ~(1<
TCCR2 |= ((1<
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR2 |= (1<
} else { // F_CPU > 16Mhz, prescaler set to 256
TCCR2 |= (1<
}
#elif defined (__AVR_ATmega32U4__)
TIMSK1 &= ~(1<
TIMSK1 &= ~(1<
TCCR1B |= (1<
} else if (F_CPU < 1000000UL) { // prescaler set to 8
TCCR1B |= (1<
} else { // F_CPU > 16Mhz, prescaler set to 128
TCCR1B |= (1<
}
#endif
tcnt2 = 256 - (int)((float)F_CPU * 0.001 / prescaler);
if (ms == 0)
msecs = 1;
else
msecs = ms;
func = f;
}
上图是atmega32U4的定时器概述,截图自atmega32u4的数据手册,确实没有定时器2。
因此那个库的意思应该是,如果使用了Leonardo,那么切换到它的定时器4来兼容,防止没有定时器2出现错误。
楼主你可以了解下timer4,路线二是去搜一下google,arduino leonardo compatible timer library。。。
库文件压缩包我放附件里了,你试试看,能否解决
int SetupTimer2()
{
TCCR2A = 0; //Timer2 mode 0, normal operating mode
TCCR2B = 1<
}
//************************* 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<
{
if (timer_count > 255)
{
TIMSK2 = 0<
}
}
TIMSK2 = 0<
}