【待续】Arduino踩坑手册-《中断故障排查指南》-中断、串口、定时器等片内硬件资源之间的冲突

本文详细探讨了Arduino Uno中定时器、中断和PWM等硬件资源之间的冲突问题,包括tone、delay、millis函数的不稳定性,attachInterrupt中断服务的异常情况,以及PWM输出可能带来的定时器时钟周期变化。同时,文章提醒开发者注意在使用这些功能时可能遇到的问题,并提供了相应的解决策略。
摘要由CSDN通过智能技术生成

有个老师说:Arduino这玩意 更多的时候是儿童玩具 这话说的不错
我还挺愿意把这话推广一下 :过度封装(而不读文档)是万坑之源
各位可以发现:很多稍微高级一些的操作与arduino库函数共用就会出现奇怪的问题
编者本着刨根问底的精神 看了些官方库源码 现将这几天的研究结果总结如下
时间所限,如有疏漏之处还请各位看官指正


一、定时器相关

arduino uno(atmega328p)带有三个定时器T0,T1,T2。T0和T2是8位定时器,T1是16位定时器,当noInterrputs函数执行之后,这三个计时器都会罢工。

1.不靠谱的tone,delay,millis函数

tone函数:
是利用T2定时器实现异步定时蜂鸣的,使用MsTimer2时要注意避免与tone发生冲突(症状:tone会影响MsTimer2的时钟周期)。
这里可以考虑使用外国友人制作的TimerFreeTone库,本质上是软件实现的蜂鸣输出,没直接用定时器,但是用了millis(软蜂鸣音与定时器产生的蜂鸣信号可能不是一个波形,用耳朵仔细听会发现两者音色不同,有强迫症的朋友要小心了)
delay函数与millis函数:
是利用T0定时器实现延时,计时的,只要你不瞎调T0有关的寄存器,正常使用是没问题的。
什么时候T0有关的寄存器会被更改呢?请看“PWM相关”一节。

2.题外话:VisualStudio相关

VisualStudio有个良心插件:VisualMicro,可以为用户提供对Arduino调试的功能,然而Atmega xx8系列(Uno)统统是不支持JTAG调试的(儿童玩具实锤),剩下的方案就只有利用定时器实现软调试,这个良心插件做到了软调试,然而:

已知软调试的不能做的:

  • 在不经任何处理的情况下,在attachInterrupt等中断服务函数里跟
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值