找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 7220|回復(fù): 11
收起左側(cè)

[討論]菜鳥(niǎo)糾結(jié)于精確計(jì)時(shí)

[復(fù)制鏈接]
ID:44260 發(fā)表于 2012-8-30 14:31 | 顯示全部樓層 |閱讀模式

首先聲明下我只是個(gè)菜鳥(niǎo),
只會(huì)1點(diǎn)C語(yǔ)言,匯編什么的~對(duì)我而言是天書,看不懂
開(kāi)發(fā)板也周日下午到的手,
“十天學(xué)會(huì)單片機(jī)和C語(yǔ)言編程”也才看完 Lesson3,講到 T0 中斷。
試著做教程里的 課后練習(xí),第1題,
題目是:第一個(gè)發(fā)光管以間隔200ms閃爍

 

題目說(shuō)了200ms,我的強(qiáng)迫癥啊,發(fā)作了,就想讓他很精確的間隔200ms
看了其它的例子,
比如:http://www.torrancerestoration.com/bbs/dpj-13914-1.html
都沒(méi)有很精確~

 

然后就試著自己寫1個(gè),
用我目前學(xué)會(huì)的辦法,寫了1段代碼,
用Keil的軟件模擬,看間隔時(shí)間,
結(jié)果是閃爍1次慢1微秒,折換到1小時(shí)就是慢 18ms
也就是只能做到 “第一個(gè)發(fā)光管以間隔199.999ms閃爍”
再精確~我目前是無(wú)能為力了 =_=!

 

下面是我寫的程序代碼[數(shù)碼管的干擾什么的請(qǐng)無(wú)視]
另外,代碼我只是剛在公司寫完,還沒(méi)在開(kāi)法板上測(cè)試過(guò) ^=^

 

 

111.png

 

//第一個(gè)發(fā)光管以間隔200ms閃爍
//計(jì)時(shí)器 T0 中斷的使用
//使用 12MHz 晶振,方便計(jì)時(shí)


#include <reg52.h>   //52單片機(jī)頭文件
unsigned char T50ms=0;
sbit leds=P1^4; //燈總開(kāi)關(guān)
sbit led1=P0^0; //第1個(gè)燈開(kāi)關(guān)
void main()
{  leds=0;  //開(kāi)燈
 TMOD=0x01;     //T0工作方式為  定時(shí)+16位定時(shí)
 TH0=(65536-50000)/256;  //定時(shí)器高8位初始時(shí)值
 TL0=(65536-50000)%256;  //定時(shí)器低8位初始時(shí)值
 //50ms 計(jì)時(shí)
 EA=1;  //中斷總開(kāi)關(guān)
 ET0=1;  //中斷小開(kāi)關(guān)-T0計(jì)時(shí)開(kāi)關(guān)
 TR0=1;  //開(kāi)始計(jì)時(shí)
 while(1)
 {
  if(T50ms==4)
   {led1=!led1; //燈閃爍
    T50ms=0;}  //重新計(jì)次
 }
}
void delay50ms() interrupt 1

 //中斷程序耗時(shí)_跳進(jìn)中斷堆棧操用5個(gè)機(jī)器周期= 5 μs
 T50ms++;
 //中斷程序耗時(shí)_++運(yùn)算用1個(gè)機(jī)器周= 1 μs
 TH0=(65536-50000)/256;  //定時(shí)器高8位初始時(shí)值
 //中斷程序耗時(shí)_一次賦值用2個(gè)機(jī)器周= 2 μs
 TL0=(65536-50000)%256+8; //定時(shí)器低8位初始時(shí)值
/*
在 TL0 中
+8 后燈每次變化慢 1μs
每即 200ms 慢 1μs
1小時(shí)慢 18ms 
 在 led1=!led1; 處設(shè)斷點(diǎn),用Keil軟件模擬,查看 sec 的值,
 #1=0.20045900
 #2=0.40045800
 #3=0.60045700
 #4=0.80045600
 #5=1.00045500
*/ 
}


 

[此貼子已經(jīng)被作者于2012-8-30 14:36:25編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2012-8-30 16:23 | 顯示全部樓層

我原來(lái)曾經(jīng)專門開(kāi)過(guò)一個(gè)帖子介紹過(guò)精確定時(shí)的問(wèn)題 http://www.torrancerestoration.com/bbs/dpj-4711-1.html  

 

你按上面網(wǎng)址的做 能精確到1微妙 .

回復(fù)

使用道具 舉報(bào)

ID:44260 發(fā)表于 2012-8-30 21:50 | 顯示全部樓層

看了那個(gè)貼子,匯編不懂~哈

 

參照貼子,按思路試了一下,應(yīng)該也是可以調(diào)整 延遲語(yǔ)句 精確定時(shí)到200ms,

但這種 延遲語(yǔ)句 沒(méi)辦法方便調(diào)整成其它時(shí)間,比如改成250ms,又得反復(fù)調(diào)  延遲語(yǔ)句 到精確。

 【這方法也可以把精確定時(shí)調(diào)小,比如 延遲語(yǔ)句 1次是50ms,要250ms定時(shí) 就調(diào)用5次】

 

 

又順著貼子看到 _nop_() 函數(shù)正好是 1 μs,看了之前的程序,

閃爍1次慢1 μs 不對(duì),而是快了1 μs

加個(gè) _nop_()  應(yīng)該正好

 

調(diào)了下我的程序,關(guān)了數(shù)碼管干擾,加了 _nop_() 空函數(shù),正好間隔200ms,非常精確。

改定時(shí)就修改 if 的判斷語(yǔ)句,可以隨便改 50ms 倍數(shù) 的間隔時(shí)間,都是精準(zhǔn)的。

 

當(dāng)然主程序循環(huán)體語(yǔ)句數(shù)量改變等,定時(shí)器中斷程序里的 堆棧 操作時(shí)間也會(huì)隨著變,調(diào)起來(lái)也麻煩了 =_=!

 

我的程序改成這樣了:

 

 

 

[此貼子已經(jīng)被作者于2012-8-30 22:01:37編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2012-8-31 08:08 | 顯示全部樓層

首先你的精益求精的精神我是贊賞的。

 

基于你這種精神和目的,但是我不得不告訴你:定時(shí)器工作在這種模式下,不可能那么精確�。�12m晶振,只要有誤差就肯定大于1us)

 

原因是由于51單片機(jī)在響應(yīng)中斷請(qǐng)求時(shí)的一些條件(具體的你自己再看看資料吧),不可能任何情況下都及時(shí)響應(yīng)。由于重新裝載定時(shí)初值是在中斷內(nèi),所以就會(huì)造成重新裝載初值的時(shí)間不確定(當(dāng)然是us級(jí)的),自然就造成了誤差。

 

怎么辦呢?如果是做單片機(jī)時(shí)鐘(不用時(shí)鐘芯片),確實(shí)需要這么高的精度時(shí),可以采用定時(shí)器/計(jì)數(shù)器2(51沒(méi)有,52有),自動(dòng)重裝載初值的工作模式。

回復(fù)

使用道具 舉報(bào)

ID:44260 發(fā)表于 2012-8-31 12:07 | 顯示全部樓層

呵呵,我的代碼里,12M晶振不準(zhǔn)引起的誤差,我就是再怎么個(gè)強(qiáng)迫癥,我也無(wú)能為力了

STC-ISP下載時(shí)顯示的貌似確實(shí)不是精確12M,是不滿12M】

 

我們開(kāi)發(fā)板 STC89C52單片機(jī) 芯片

是有 定時(shí)器/計(jì)數(shù)器2 的吧,

 

查了 reg52.h , 定時(shí)器/計(jì)數(shù)器2 不是很懂,

是不是這樣

IE 寄存器的 ET2 位是 定時(shí)器/計(jì)數(shù)器2 開(kāi)關(guān)

對(duì)應(yīng)的 T2CON 寄存器的 TR2和TF2位是 開(kāi)始計(jì)時(shí)和溢出的標(biāo)志位

 

T2CON 其它位都是什么作用?

始初值、工作方式啊 什么的是哪在個(gè)寄存器位?

 

看不懂啊,還缺點(diǎn)理論知識(shí),

定時(shí)器/計(jì)數(shù)器2 使用教程在哪有的沒(méi)?

 

 

[此貼子已經(jīng)被作者于2012-8-31 12:07:58編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2012-8-31 21:41 | 顯示全部樓層

TH2=(65536-46080)/256       ;//46080...11.0592MHZ晶振的初裝值
TL2=(65536-46080) MOD 256   ;//初值0DC00H送定時(shí)器T2 
RCAP2H=(65536-46080)/256; 
RCAP2L=(65536-46080) MOD 256   ;//初始化重裝初值
T2CON=0x04                     ;//初始化T2工作方式(自動(dòng)重裝初值、定時(shí))
                                                     ;//并啟動(dòng)了T2
ET2=1                             ;//允許定時(shí)器T2中斷

 

[此貼子已經(jīng)被作者于2012-9-1 9:36:46編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:44260 發(fā)表于 2012-8-31 22:01 | 顯示全部樓層

繼續(xù)學(xué)習(xí)~發(fā)現(xiàn)T0 T1 的工作方式2 也是具有自動(dòng)重裝的,

 

只不過(guò)只能有8位也就是最大256us [12M晶振]

 

256us 時(shí)間有點(diǎn)短,留給程序執(zhí)行的其它代碼時(shí)間不多。

 

我這樣理解不錯(cuò)吧?

回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2012-9-1 09:34 | 顯示全部樓層

你的理解是對(duì)的!

 

按我上面給你的回復(fù)試一試,就那么多。

回復(fù)

使用道具 舉報(bào)

ID:42637 發(fā)表于 2012-9-1 22:26 | 顯示全部樓層

結(jié)果是閃爍1次慢1微秒,折換到1小時(shí)就是慢 18ms
也就是只能做到 “第一個(gè)發(fā)光管以間隔199.999ms閃爍”
肉眼觀察到這種現(xiàn)象?

軟件仿真本就不準(zhǔn)!

在網(wǎng)上查了一下,能測(cè)1微秒的量具還真沒(méi)找到。

[此貼子已經(jīng)被作者于2012-9-1 22:31:50編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2012-9-2 00:32 | 顯示全部樓層

單獨(dú)計(jì)量一個(gè)us是不容易,但是10天差5秒是可以計(jì)量的。

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2012-9-3 22:04 | 顯示全部樓層
敢問(wèn)樓主用的什么代碼編輯器  貌似不是keil?
回復(fù)

使用道具 舉報(bào)

ID:44260 發(fā)表于 2012-9-4 08:48 | 顯示全部樓層

只是截圖時(shí)用的 Notepad++ 文本編輯器

 

應(yīng)用了 tomorrow_night_bright 皮膚

[此貼子已經(jīng)被作者于2012-9-4 8:48:55編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表