核心思想的实现过程
第一、用RTC中断来计时 , RTC的中断时间短一点 , 我习惯是125us, 为了解红外遥控的码 , 这个时间是需要的 。 RTC计时是相当准的 , 尽量利用 。
第二、在RTC的中断服务程序里面放3个(数量自定)记时器(说白了就是计数器) , 我的习惯是 2ms 5ms 500ms 这3个是作为基准时间 , 提供给整个系统来调用的 , 所以必须准确一点 , 实际用示波器调一下就OK了 , 不难 。
第三、在主程序的循环里面放一个专门处理时间的子程序 。 (注:单片机是不会停的 , 永远在不断循环的跑 , 这个跟学校学的貌似有点不同 , 俺面试的时候被问过这个问题 ….) 将所有的时间处理都放在时间处理子程序里面做 , 这样是非常方便的 , 一个单片机系统最起码需要处理 10~20个不同的时间 , 也需要10~20个计时器了 , 而且相当多要求同时不同步工作的 , 如果每个都单独的话是相当的麻烦 。
第四、“程序是跑着来等 , 而不是站着来等” , 这话看来有点玄 , 一个跟俺一起进去公司的工程师讨论的时候提到的这个问题 , 俺觉得这个也是分时系统的一个比较重要的思想 , 所以也这样叫 , 下面有细说 。
第五、下面用程序来说话 , 注释尽量详细 , 可以不用看代码 , 直接看注释就可以了 。
先中断服务程序部分
每 125us 中断一次 , 产生几个基准时间 。
(1) ref_2ms寄存器不断的减1 , 每次中断减1 , 一共减 16次 , 所以这里经过的时间是 125us × 16 = 2ms , 这个就是所谓的计时/计数器 了 。 这样就可以靠一个系统的RTC中断 , 来实现我们需要的很多个定时时间 。
(2)置2ms 计时结束标志 , 这个是提供给时间处理程序用的 , 这是一个计时器的框架 , 下面的5ms计时完全相同 。
这程序还用了一个块的框架 , 比较方便的 , 不过跟今天的主题无关 , 以后郁闷的时候再上来写写这个 。 上面的程序就是中断服务程序里面的计时器 , 分别定时 2ms 5ms 500ms , 计时完毕溢出是flag_time 标志来记录的 , 程序通过读这个标志就可以知道定时的时间是否已经到了 。
下面看那个统一的时间服务子程序
上面用了按键20ms消抖的计时器作为例子 , 如果理解之后就可以发现 , 我们可以完全模仿那个计时器而在下面放很多很多的计时器 , 则每5ms 进来一下 , 每个计时器都同时在计数了 , 谁先计算完毕就先关掉自己 , 置相应的标志给其它程序调用 , 而对其它计时器完全没有影响!这样 , 我们可以在这里放很多个计时器了 , 一般来说 , 十来二十个是没有问题的 , 完全满足一个单片机系统对多个时间的需求了 。
单个计时器的结构很简单 , 先判断允许计时标志是否进入计时 , 然后一个专用的寄存器在加1或者减1 , 加/减相应的数值之后也就是相应的时间到了 , 关掉计时器 , 置相应需要用到的标志 。
到这里差不多了 , 俺们需要的时间都可以出来了 , 这样做是不是非常方便?咱们再来看看在这段时间里单片机在做了什么东西?只有中断计时够 5ms 或者 500ms, 那个溢出标志才有效 , 才能进入上面的计时程序 , 其它时间都是在做其它事情 。 而且进入上面的计时器的时候 , 可以看出 , 并不是在那里死循环 , 只是单纯的加减一下寄存器就退出了 , 整个过程耗时极其短 , 看代码不同吧 , 5us到 20us左右吧 , 对主程序的执行没有什么影响 。
下面看看具体怎么调用
最开始谈过的按键的消抖时间处理问题 , 现在就用上面介绍的办法来看具体怎么解决问题 。
大概是这样的:判断什么时候有健 , 没有的话跳出 , 有的话开始延时消抖的计时 , 第二次进来的时候直接由标志位控制过去判断时间时候够 。
同样是等待 , 这里就是最后一点所说的 , 咱这是跑着来等 , 不是站着来等 。 跟死循环定时比较 , 在没有定时到20ms 的这段时间里面单片机在做什么?死循环的话 , 肯定就是在原地等 , 什么都不做 , 而看看上面的程序 , 他只是判断是否定时够 , 具体的定时在统一的时间子程序里面做 , 判断没有到时间的话就跳出了 , 继续跑其它的程序 , 直到当时间到了 , 单片机判断出flag_delaykey_flow 符合条件 , 开始进入按键处理程序了 , 在这个期间 , 单片机都在做其它事情 , 只是一个主循环跑回来判断一次 , 所以单片机完全有空跑其它的程序 , 而没有将时间都耗在消抖上面 。
主程序循环体
这个就是用到的循环体了 , 所有功能都做成子程序形式了 , 需要就挂上去就可以了 , 比较方便 , 这样一个总的循环体 , 单片机就是在不断的执行这个循环体 , 如果整个程序都采用上面说的分时扫的思想的话 , 一周循环回来的时间是相当短的 , 其实是不是跟电脑的思想有点像呢?
- apache|虚拟现实+眼动追踪精选实战分享:认知“新”健康
- USB|一个月天挣了624,每天看书30分钟,分享我是怎么做的
- oppo k10|618咱来一波游戏旗舰分享,1K-2K价位——OPPO K10!
- CPU|两种实用用的变频器维修方法
- shopee|Shopee怎么做?电霸来教你,转化率提升多维度易忽视细节分享
- 私有云|外观别致,硬件配置越级,零基础也能快速上手,绿联私有云DH2600详测分享
- 操作系统|美国限制分享安全漏洞将捧起石头砸自己的脚,国产系统获发展契机
- 硬盘|6T硬盘只卖260元?二手服务器硬盘值得买吗?经验分享
- 自媒体|分享一个自媒体副业,认真做可以月入6000+
- 操作系统|美出台新规:禁止向我国分享安全漏洞!国内院士:是时候了
