赞
踩
写这篇文章,纯粹是想为博客拉点点击量。在博客园,游客访问好像是不计入阅读量的,而作为一个十八线博主,注册用户的访问应该以搜索引擎为主,博客园首页为次,个位数的粉丝就别谈了。
所以,希望各位从搜索引擎点进来的朋友,多多评论,有问题咱们一起讨论。
我写过AVR单片机教程,设计过自己的Arduino板,希望你相信我能给你带来收获。
我不想听你放那么多屁,我只想知道周期为1ms的定时器中断怎么写!
什么是定时器
在ATmega328P单片机中,定时/计数器(Timer/Counter)是这样的组件:它需要一个时钟源,驱动一个8或16位的计数器递增或递减,当计数器等于一个值时,会触发一些操作,如产生中断、翻转引脚电平等。由于定时器的时钟源是系统时钟或外接晶振(一种产生频率精准的波的器件)分频得到的,一旦设置好定时器的工作参数,直到下次调整参数,定时器都会按照预期工作,与CPU执行的代码无关。
为什么要用定时器
之前有过这样的经历:跟一个优秀作品设计者聊了几句,他说同时控制舵机和扬声器很难控制好延时,扬声器输出的音乐节奏会乱。我第一反应当然是他没有用定时器中断,一问果然如此,并且他不知道中断也不知道定时器。
还有一位同学,写TI计算器的程序。在他的一个作品中,每次循环的计算量不定,循环间隔也不定,导致游戏效果不好。他的解决方法是根据计算量计算出循环最后需要的延时,使得循环间隔基本保持不变。
这种思路是相当优秀的。但是如果有定时器可用的话,编程难度会降低,循环间隔的一致性也会更好,是更加优秀的解决方案。
其实你一直在用定时器
Arduino Uno Rev3的3、5、6、9、10、11号端口可以使用analogWrite和tone函数,它们的功能都是利用定时器实现的。用函数确实方便,但是只知使用而不知其原理就只能停留在技术的表面——Arduino的强大封装对开发者的学习有两面性。
定时器其实不知道什么3号端口,它只知道OC2B。两种表示之间的对应关系如下表:端口编号硬件符号3PD3(PCINT19/OC2B/INT1)
5PD5(PCINT21/OC0B/T1)
6PD6(PCINT22/OC0A/AIN0)
9PB1(PCINT1/OC1A)
10PB2(PCINT2/SS/OC1B)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。