ADuC7026定时器(原创)
0赞在做ADuC7026的实验中,经常需要延时,最简单的就是delay函数,直接deley(),括号内填上适当的数值就可以延时了,但是对于7026这种41.78MHz时钟频率的单片机来说,有时甚至几纳秒的延时都会对整个程序的执行有很大的影响。为了得到精确的时间,我经常采用T1定时器,T1定时器的时间间隔按照公式:
时间间隔=TxLD设定值)/时钟源
只要设置好时间间隔就能直接比较准确的定时了。下面写下程序:
T1LD=0x2000; //设定计数器初值
T1CON=0Xc4; //使能定时器1,周期模式运行,二进制个事,时钟周期CLK/16
一般情况下这样就设置好了定时时间。具体设定值要参照7026的说明书,说明书中对TI定时器的各种寄存器的设置都进行了说明,很简单方便的。(推荐北京航空航天大学出版社的ADuC702x系列嵌入式系统原理及应用)
前两天在看一个德国的程序,发现T1定时器竟然还可以这样用,和大家分享一下。
T1CON = 0x0184; // T1 on
Long = T1VAL + Long * 256/100;
while ((T1VAL - Long) & 0x80000000){}
T1CON = 0x0104; //T1 off
这是程序的调用函数。当我们启用单片机的时候,单片机就赋予了T1VAL一个数值,当程序执行到这一步的时候,我们先定义一个long的值,这样long中就把T1VAL + Long * 256/100值赋给了long,单片机在执行就要进入到while函数了,函数中T1VAL – Long直接就把之前的T1VAL的初始值给消去,清除了单片机开关时对延时函数的影响,这样就能精确的计时了。(T1VAL - Long) & 0x80000000进行与运算,当与运算结果为零的时候跳出循环,下面就啰嗦一下怎么计算的吧!因为已经进行了配制T1CON = 0x0184,所以T1VAL的进行的是加运算,这样呢当T1VAL – Long结果的第三十二为不再为一的时候时候跳出循环。我们来计算一下:
设定long=100,那么long*256/100=256,也就是说当TIVAL为257的时候呢跳出循环,再来计算一下时间:
时间=257*16/41.78M=98.4us,这样就接近了100us。比较精确了。
这个方法很巧妙,和大家分享下。另外,由于本人水平有限,哪里错了欢迎大家批评指正啊!哈哈!
