|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
定時(shí)器定時(shí)總是比預(yù)定時(shí)間提前,這是啥毛? |
| 作者:sambie 欄目:單片機(jī) |
我用定時(shí)器控制LED的開(kāi)和關(guān),定時(shí)1小時(shí),可LED總是提前開(kāi)和關(guān),誤差超過(guò)1秒/小時(shí)。按理調(diào)整初值時(shí)應(yīng)該將計(jì)算值增加幾個(gè)機(jī)器周期,否則定時(shí)會(huì)向后推遲。可我不增加初值定時(shí)器仍然提前,這是什么道理?是晶振(12MHZ)不準(zhǔn)嗎? |
| 2樓: | >>參與討論 |
| 作者: tyw 于 2006/2/4 17:38:00 發(fā)布:
你用什么方法測(cè)的 |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2006/2/4 18:06:00 發(fā)布:
用自動(dòng)裝載方式好些 |
|
| 4樓: | >>參與討論 |
| 作者: sambie 于 2006/2/4 19:19:00 發(fā)布:
回tyw和hotpower,我用秒表測(cè)的。 自動(dòng)裝載我沒(méi)試過(guò),但調(diào)整初值應(yīng)該也能將誤差控制得較小。我感到不解的是,誤差應(yīng)該是推遲才對(duì)呀,怎么會(huì)是提前呢? |
|
| 5樓: | >>參與討論 |
| 作者: css93 于 2006/2/4 19:46:00 發(fā)布:
sambie 老大,說(shuō)一句啊,嚴(yán)謹(jǐn)?shù)木裰档镁磁灏?br>不過(guò)我覺(jué)得你這個(gè)秒表測(cè)這個(gè)時(shí)間居然能得出1s/小時(shí)的誤差讓人驚訝阿 因?yàn)槲矣X(jué)得這個(gè)秒表運(yùn)動(dòng)場(chǎng)上大概用一下還可以,來(lái)測(cè)量這樣的 時(shí)間真是覺(jué)得不可靠阿。 而且細(xì)想來(lái),一秒鐘對(duì)于秒表來(lái)說(shuō)是個(gè)小case,但是對(duì)于單片機(jī)來(lái)說(shuō)應(yīng)該是一個(gè) 不小的數(shù)字呢,應(yīng)該不是晶振的問(wèn)題,不然就太離譜了 |
|
| 6樓: | >>參與討論 |
| 作者: makesoft 于 2006/2/4 19:55:00 發(fā)布:
呵呵,定時(shí)器效率高啊 |
|
| 7樓: | >>參與討論 |
| 作者: tyw 于 2006/2/4 20:32:00 發(fā)布:
定時(shí)中斷計(jì)算對(duì)頭了嗎? 中斷一次多長(zhǎng)時(shí)間?有時(shí)尾數(shù)多算1,或少算1是常有的事,要是中斷一次是ms級(jí)的話,這個(gè)累計(jì)誤差就較大了. 是用的51系統(tǒng)嗎?不妨把定時(shí)設(shè)置貼上來(lái)給大家看一下.排除了這一條就好找其他原因了. 晶振若是用了大興貨也是有可能的. * - 本貼最后修改時(shí)間:2006-2-4 20:33:50 修改者:tyw |
|
| 8樓: | >>參與討論 |
| 作者: faiwong 于 2006/2/4 20:41:00 發(fā)布:
程序中有沒(méi)有其他中斷? |
|
| 9樓: | >>參與討論 |
| 作者: 雁舞白沙 于 2006/2/4 20:52:00 發(fā)布:
應(yīng)該是程序的問(wèn)題! 10PPM的晶振 一天的秒誤差最多是0.5秒! 還是看看程序吧! |
|
| 10樓: | >>參與討論 |
| 作者: sambie 于 2006/2/5 12:13:00 發(fā)布:
謝謝各位。請(qǐng)看下面的中斷程序: T0ISR: PUSH PSW PUSH ACC CLR TR0 ;T0 INT OFF MOV TH0,#3CH ;for 50ms initial VALUE MOV TL0,#0B3H ;ADJUST 3 US SETB TR0 ;START T0 CLR C MOV R7,#3 ;NUMBER OF BYTES MOV R0,#22H ;HEAD ADDRS OF 1ST NUMBER(LSB) ADD3: MOV A,@R0 ;LOW BYTE ADD A,#1 MOV @R0,A DEC R0 DJNZ R7,ADD3 ...... T0END: POP ACC POP PSW RETI 1.我是用電腦上的時(shí)鐘測(cè)的,10小時(shí)約提前了10秒。 2.我在中斷程序里計(jì)數(shù)中斷次數(shù)并存入20H21H22H,中斷初值為3CB0H,即50ms,加上3個(gè)周期,為3CB3H。主程序中判斷中斷次數(shù)達(dá)到720000(720000x50ms=10hour)后LED亮。中斷程序比較長(zhǎng),但不應(yīng)該使LED提前點(diǎn)亮。程序中有一個(gè)外部中斷,但測(cè)試時(shí)沒(méi)有觸發(fā)。 謝謝指點(diǎn)。 |
|
| 11樓: | >>參與討論 |
| 作者: xwj 于 2006/2/5 13:36:00 發(fā)布:
對(duì)于51 ,單個(gè)指運(yùn)行令時(shí)間不等長(zhǎng)的,有單周期、雙周期、4周期的 而中斷時(shí)必須執(zhí)行完當(dāng)前指令才能進(jìn)入中斷,因此觸發(fā)中斷,再進(jìn)入中斷這個(gè)時(shí)間是不確定的 要想長(zhǎng)時(shí)間計(jì)時(shí)準(zhǔn)確,避免累計(jì)誤差,必須在中斷時(shí)加上TL0的數(shù)值,才是正確的值 用定時(shí)器2的自動(dòng)重載方式也能避免這個(gè)誤差 還有,晶振實(shí)際上相當(dāng)于一個(gè)很穩(wěn)定的LC網(wǎng)絡(luò),實(shí)際振蕩頻率還受引腳外接的元器件影響,要想計(jì)時(shí)準(zhǔn)確必須調(diào)整外部匹配電容,用頻率計(jì)校準(zhǔn)頻率才行 樓主的問(wèn)題估計(jì)主要是這個(gè)原因 要想長(zhǎng)時(shí)間計(jì)時(shí)準(zhǔn)確很困難的,環(huán)境恒定時(shí)必要的,當(dāng)然,最好的方法還是由時(shí)間基準(zhǔn)進(jìn)行自動(dòng)校準(zhǔn),這才是根本知道 |
|
| 12樓: | >>參與討論 |
| 作者: sambie 于 2006/2/5 13:54:00 發(fā)布:
謝樓上。我的兩個(gè)外部電容為22p,如你所說(shuō),是偏大還是偏小 |
|
| 13樓: | >>參與討論 |
| 作者: dengm 于 2006/2/5 18:37:00 發(fā)布:
不用停定時(shí)器 ORG 000BH MOV TH0,#3CH ;for 50ms initial VALUE ORL TL0,#0B0H ;***** AJMP TOISR T0ISR: PUSH PSW PUSH ACC ;CLR TR0 ;T0 INT OFF ;MOV TH0,#3CH ;for 50ms initial VALUE ;MOV TL0,#0B3H ;ADJUST 3 US ;SETB TR0 ;START T0 |
|
| 14樓: | >>參與討論 |
| 作者: sambie 于 2006/2/6 10:30:00 發(fā)布:
dengm 高明。這可不用調(diào)整初值解決定時(shí)“向后推遲” 的問(wèn)題。我的問(wèn)題是“定時(shí)提前”太多(包括累計(jì)誤差)。如果程序沒(méi)問(wèn)題,我懷疑是電路的問(wèn)題: 1. 如xwj大俠所說(shuō),匹配電容取值不當(dāng)。我現(xiàn)在用兩個(gè)22p,那位大俠可以推薦一下更合理的值?(12MHZ晶振) 2. 如電腦圈圈等高手所說(shuō),晶振有誤差。比如實(shí)際值可能為12.05MHZ,足以使每次中斷提前n個(gè)us。可我換了幾個(gè)不同的晶振,都是一樣的問(wèn)題,請(qǐng)高手們?cè)u(píng)點(diǎn)一下這個(gè)可能性,并推薦一下哪種品牌的晶振較好。 3. 我瞎猜另一種可能:由于目前溫度較低,使晶振頻率變高,到了夏天則相反... 謝謝各位高手指點(diǎn)迷津。 |
|
| 15樓: | >>參與討論 |
| 作者: martial 于 2006/7/18 20:10:00 發(fā)布:
dengm:你這段程序解決什么問(wèn)題??沒(méi)明白! 不用停定時(shí)器 ORG 000BH MOV TH0,#3CH ;for 50ms initial VALUE ORL TL0,#0B0H ;***** AJMP TOISR T0ISR: PUSH PSW PUSH ACC ;CLR TR0 ;T0 INT OFF ;MOV TH0,#3CH ;for 50ms initial VALUE ;MOV TL0,#0B3H ;ADJUST 3 US ;SETB TR0 ;START T0 clr tr0 就是停止計(jì)數(shù)呀?? |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |