[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】02.尝试开启定时器不成功(已经解...

[复制链接]
35183|6
手机看帖
扫描二维码
随时随地手机跟帖
hu9jj|  楼主 | 2021-3-23 14:22 | 显示全部楼层 |阅读模式
本帖最后由 hu9jj 于 2021-3-24 16:11 编辑

    我习惯在项目中开启定时器进行毫秒计时,然后在主循环中根据这个毫秒计时值进行处理,这次测试也不例外。按照以往的经验,使用MCC进行配置是最方便的,不需要去计算参数,只要输入要定时的数值就行。所以我照旧进入MCC配置界面,选择定时器TCB0,设置定时时间为1ms,如下图:
time01.jpg

    定义一个全局变量ms,然后在tcb0.c的中断处理函数ISR()中对这个全局变量进行每毫秒自加:
time03.jpg

    在主函数中启动定时器,并在主循环中对ms变量进行判断和处理:
time05.jpg

    在我以往的测试过程中通过这几步操作就行的,可是这次却毫无反映,似乎定时器没有被启动,测试了几天都没能成功,包括添加了函数TCB0_SetCaptIsrCallback(NULL)也不行。检查了tcb0.h中声明的函数,也看不出有其他需要使用的:
time04.jpg

    在MCC配置中添加了启用溢出中断也不行:
time02.jpg

    英文版的数据手册我也看不懂,本想借助翻译来查看,但该手册又关掉了复制功能,无法直接拷贝粘贴到翻译软件中去。现将项目打包如下,哪位大佬有空帮我看看是什么原因,谢谢了!
Mytest1.X.rar (155.4 KB)

使用特权

评论回复
lcczg| | 2021-3-24 15:36 | 显示全部楼层
ms这种在中断中使用的变量一定要定义为volatile。另外要定义为8位的变量。
//unsigned int ms;
volatile uint8_t ms;

//extern unsigned int ms;
extern volatile uint8_t ms;

使用特权

评论回复
hu9jj|  楼主 | 2021-3-24 16:10 | 显示全部楼层
lcczg 发表于 2021-3-24 15:36
ms这种在中断中使用的变量一定要定义为volatile。另外要定义为8位的变量。
//unsigned int ms;
volatile ui ...

谢谢指教!添加了 volatile 前缀就OK了。数据类型定义为int是毫秒计数值会大于255。

使用特权

评论回复
幸福小强| | 2021-3-24 21:54 | 显示全部楼层
感谢分享了。

使用特权

评论回复
lcczg| | 2021-3-25 09:04 | 显示全部楼层
hu9jj 发表于 2021-3-24 16:10
谢谢指教!添加了 volatile 前缀就OK了。数据类型定义为int是毫秒计数值会大于255。 ...

此种情况下用int 类型非常不安全,因为中断内部和外部同时有操作。比如外面操作了低字节,而中断操作了整个int, 然后出中断又操作高字节,就可能乱掉。所以要用8位类型变量。

使用特权

评论回复
hu9jj|  楼主 | 2021-3-25 12:59 | 显示全部楼层
lcczg 发表于 2021-3-25 09:04
此种情况下用int 类型非常不安全,因为中断内部和外部同时有操作。比如外面操作了低字节,而中断操作了整 ...

    谢谢指教!怪不得我设定500毫秒转换一次LED的状态,也就是每秒闪烁一次,但在实际运行时有时会不足一秒便闪烁一次,即闪烁的频率不稳定,应该是这个原因造成的。增加了一个变量来接替计数后,现在LED闪烁的频率就稳定了。

使用特权

评论回复
TT1000| | 2021-5-13 10:00 | 显示全部楼层
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

144

主题

1031

帖子

11

粉丝