微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机分时思想

单片机分时思想

时间:11-17 来源:互联网 点击:
下面说的单片机应用也主要是家电控制方面,也就是现在的工作。其它应用不在讨论范围。才识有限,也敬请前辈们勘误,指教。

先用一个小例子引出今天的主题,想象一下,一个基本的家电控制板,肯定或多或少的会包含 : LED 或者 数码管显示, 按键, 继电器或者可控硅的输出 这3部分。数码管需要 10ms到20ms的动态扫描,按键也需要 20ms左右的延时消抖,有没有意识到,其实这些时间是同时在进行的。回想一下咱们的教科书怎么教 按键 的延时消抖的?没错,死循环,绝对是原地踏步死循环,用指令来计时。这样很自然的引发一个问题,单片机在原地踏步死循环的话,那么其它的工作怎么办?如数码管的动态扫描怎么办?唯有等按键扫描之后再进行了,这样出来的效果,数码管肯定会闪烁的,扫描时间过长了,缩短按键消抖时间也不是解决办法,想象如果咱们还有其它很多工作也是同时做的呢?解决办法之一,就是今天的主题,分时扫描的思想。当然不会是唯一的办法,只不过俺一直在用,觉得这个是非常不错的思想,可以解决很多实际问题。大胆妄言一下,分时扫描的思想也是单片机编程最核心的思想了,信不信就由你自己判断了。

程序的执行环境

用的是纯汇编,因为用习惯的汇编,以致于整个脑袋都是汇编的思想,某种程度上说,C的废码确实是多了一点,对于实际工业用的单片机ROM和RAM都不是很充足的情况下,代码还是要求尽量精简的。所以俺一直都在汇编的苦海中沉浮着……说明一点,俺用的是EMC的单片机(Elan公司的),传闻中最烂的单片机,所以代码不值的去学,也正是这个原因,但愿我想表达的思想能表达清楚, 阿门!

核心思想的实现

其实是几个步骤,

第一, 用TCC中断来计时,TCC的中断时间断一点,我习惯是 125us ,为了解红外遥控的码,这个时间是需要的。TCC计时是相当准的,尽量利用。

第二, 在TCC的中断服务程序里面放3个(数量自定)记时器(说白了就是计数器),我的习惯是 2ms 5ms 500ms 这3个是作为基准时间,提供给整个系统来调用的,所以必须准确一点,实际用示波器调一下就OK了,不难。

第三, 在主程序的循环里面放一个专门处理时间的子程序。(注:单片机是不会停的,永远在不断循环的跑,这个跟学校学的貌似有点不同,俺面试的时候被问过这个问题 ….) 将所有的时间处理都放在时间处理子程序里面做,这样是非常方便的,一个单片机系统最起码需要处理 10~20个不同的时间,也需要10~20个计时器了,而且相当多要求同时不同步工作的,如果每个都单独的话是相当的麻烦。

第四, “程序是跑着来等,而不是站着来等”,这话看来有点玄,一个跟俺一起进去公司的工程师讨论的时候提到的这个问题,俺觉得这个也是分时系统的一个比较重要的思想,所以也这样叫,下面有细说。

第五, 下面用程序来说话,注释尽量详细,可以不用看代码,直接看注释就可以了。

(一)先中断服务程序部分:

每 125us 中断一次

;-------------------产生几个基准时间---------------------------

int_2ms:

djz ref_2ms (1)

jmp int_5ms

mov a,@16 ; 恢复原始数据

mov ref_2ms,a

bs flag_time,flag_2ms (2)

int_5ms:

djz ref_5ms

jmp ref_time_end

mov a,@40 125us×40=5ms

mov ref_5ms,a

bs flag_time,flag_5ms

int_500ms:

djz ref_500ms

jmp ref_time_end

mov a,@100

mov ref_500ms,a

bs flag_time,flag_500ms

ref_time_end:

nop

(1) ef_2ms寄存器不断的减1,每次中断减1,一共减 16次,所以这里经过的时间是 125us × 16 = 2ms,这个就是所谓的计时/计数器 了。这样就可以靠一个系统的TCC中断,来实现我们需要的很多个定时时间。

(2)置 2ms 计时结束标志,这个是提供给时间处理程序用的,这是一个计时器的框架,下面的5ms计时完全相同。

这里解释一下:bs flag_time,flag_2ms,其中bs是将某一位置1的指令,该指令的意思是,将 flag_timg寄存器里面第flag_2ms位置1,设立一个溢出标志,后面的程序可以通过读这个标志,就知道 2ms 是否已经计时到了

这程序还用了一个块的框架,比较方便的,不过跟今天的主题无关,以后郁闷的时候再上来写写这个。上面的程序就是中断服务程序里面的计时器,分别定时 2ms 5ms 500ms,计时完毕溢出是flag_time 标志来记录的,程序通过读这个标志就可以知道定时的时间是否已经到了。

(二)下面看那个统一的时间服务子程序

;-------------------时间处理子程序-----------------------------

time_proc:

jbs flag_time,flag_5ms 判

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top