有个老师说: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等中断服务函数里跟