久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1619|回復: 12
打印 上一主題 下一主題
收起左側

單片機中斷定時為什么會晚?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1095802 發表于 2023-11-6 14:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
11.0592的晶振定時10ms不是沒有誤差嗎,為什么寫的鐘表一天會慢幾分鐘,是因為中斷程序運行時間過久,中斷時間到了前一個中斷還未出去而延遲嗎
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
#define Fosc 11.0592 //晶振頻率
#define FTime 10000  //中斷定時以us計
void main(void)
{
while(1);
}
void T0_Init(void)
{
        TMOD|=0x01;
        EA=1;
        ET0=1;
        TR0=1;
        TH0=(65536-FTime*Fosc/12)/256;
        TL0=(char)(65536-FTime*Fosc/12)%256;
}
void T0_Timer(void) interrupt 1
{
        TH0=(65536-FTime*Fosc/12)/256;
        TL0=(char)(65536-FTime*Fosc/12)%256;
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:712097 發表于 2023-11-6 16:13 | 只看該作者
單片機精度沒那么高,精度要求高的時鐘應用,用專門的時鐘芯片如DS1302,PCF8563,DS3231等。
回復

使用道具 舉報

板凳
ID:883242 發表于 2023-11-6 16:24 | 只看該作者
chxelc 發表于 2023-11-6 16:13
單片機精度沒那么高,精度要求高的時鐘應用,用專門的時鐘芯片如DS1302,PCF8563,DS3231等。

單片機內部RC振蕩器穩定性不行,但是11MHz AT-cut quartz精度要比DS1302、PCF8563用的fork quartz好太多了,這些RTC芯片優點在于功耗低,掉電依然可以用電池來運行,他們的精度根本不行,在高頻晶體面前就是個笑話。樓主如果用的是高頻晶體,可以修改軟件。當然DS3231屬于TCXO,精度最高。
回復

使用道具 舉報

地板
ID:220661 發表于 2023-11-6 16:27 | 只看該作者
11.0592晶體做定時器生成1ms沒有誤差?記錯了吧,那是做串口波特率沒有誤差,你用12M晶體試試吧?
回復

使用道具 舉報

5#
ID:213173 發表于 2023-11-6 17:15 | 只看該作者
這種時鐘想要提高精度需要采取一點措施。改換12M或24M高品質晶振,定時器采用自動重裝模式,定時中斷周期盡可能短,建議不超過100uS。添加修正系數補償誤差。采取以上措施后可以將日誤差控制在1秒左右。
回復

使用道具 舉報

6#
ID:1095802 發表于 2023-11-6 23:13 | 只看該作者
gongnn 發表于 2023-11-6 16:27
11.0592晶體做定時器生成1ms沒有誤差?記錯了吧,那是做串口波特率沒有誤差,你用12M晶體試試吧?

10ms寫錯了,程序里是10000us
回復

使用道具 舉報

7#
ID:277550 發表于 2023-11-7 09:51 | 只看該作者

DS3231 還可以,只是比較貴
回復

使用道具 舉報

8#
ID:485350 發表于 2023-11-29 11:51 | 只看該作者
晶振誤差多少,中斷跳轉,定時時間重載這些考慮進去沒
回復

使用道具 舉報

9#
ID:57657 發表于 2023-11-29 13:20 | 只看該作者
仿真誤差大是程序有問題,實物誤差與晶振精度有關,定時器要設置成自動重載模式。
回復

使用道具 舉報

10#
ID:397054 發表于 2023-11-29 14:47 | 只看該作者
這是中斷模式1的工作機理引起的——從中斷申請的發出,到CPU響應,再到計算賦值完畢(主要是向TL賦值完畢),這是有時間的,這段時間遠不為0,每個中斷都插入了這樣一段時間所以就慢了,這絕不是精度問題,因為1天要慢好幾分鐘的。尤其是你在中斷程序里還進行了計算,這也很消耗時間,并且還把對TL的賦值放在了TH后,更增加了延時。解決這一問題的常規手法是在對TL賦值前讀出它的值,加在新值上賦給TL,并再加上2-5個修正值(可由實驗確定),因為賦值也要消耗時間的并且C是怎么編譯的我們也不知道。另一個更好的辦法是,調整中斷周期,使TL=0,這樣在中斷程序中可以不給TL賦值,只給TH賦值,使得計數不間斷,類似于中斷模式2,也就沒有了延時的產生。11.0592的晶振可以直接做到這點的,比如TH=180(即B4H),在中斷程序中刪掉TL的賦值語句,這樣的中斷計20次就是1秒。12兆的晶體做不到這點——算術問題,當然非要這么做也可以,增加了程序的復雜性。
回復

使用道具 舉報

11#
ID:397054 發表于 2023-11-29 15:02 | 只看該作者
實際上你的這個程序已經滿足了上貼的條件,即TL=0,所以在中斷程序中直接刪除賦值語句【TL0=(char)(65536-FTime*Fosc/12)%256;】即可,其他哪里都不用變,這個幾分鐘的誤差即可徹底消除,非常簡單的事。再有的誤差那就是元器件的精度引起的了,遠不會超過1秒/天。那些說什么時鐘芯片的,都是想當然。
回復

使用道具 舉報

12#
ID:57657 發表于 2023-11-29 15:02 | 只看該作者
鵜鶘 發表于 2023-11-29 14:47
這是中斷模式1的工作機理引起的——從中斷申請的發出,到CPU響應,再到計算賦值完畢(主要是向TL賦值完畢) ...

定時器設置為自動重載初值模式,這段時間就為0,你設置10ms的定時器,定時器中斷內停留不得超過10ms
回復

使用道具 舉報

13#
ID:1073939 發表于 2023-11-29 17:20 | 只看該作者
void T0_Timer(void) interrupt 1
{
        TH0=(65536-FTime*Fosc/12)/256;
        //TL0=(char)(65536-FTime*Fosc/12)%256;
}

代碼改成這樣能顯著提高走時精度。樓主這行畫蛇添足。
在早期沒有自動重裝模式的單片機,想要走時準確,只能使用類似11.0592的晶振,這樣TL0的重裝值為0,也算間接實現了自動重裝。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩日一区二区 | 高清18麻豆 | 超碰成人在线观看 | 羞羞视频在线观看免费观看 | 久久久夜夜夜 | 色久五月 | 正在播放国产精品 | 草草草久久久 | 亚洲a一区| 免费看日韩视频 | 91久久久久久久 | 亚洲精品成人av久久 | 国产精品自拍啪啪 | 正在播放国产精品 | com.国产| 亚洲精品久久久久中文字幕欢迎你 | 精品乱码一区二区三四区视频 | 欧美夜夜| 成人中文字幕在线 | 久久国产综合 | 国产精品精品视频一区二区三区 | 亚洲a视频 | 青青草亚洲 | 九九热精 | 一区二区三区四区在线免费观看 | 超碰成人免费观看 | 91动漫在线观看 | 麻豆av在线免费观看 | 欧美 日韩 国产 成人 在线 | 亚洲成人综合社区 | 精品国产伦一区二区三区观看体验 | 桃花av在线| 国产精品不卡一区 | 久草中文在线 | 一区二区三区在线观看免费视频 | 一二三四在线视频观看社区 | 日韩一区二区三区在线 | 欧美激情一区二区三级高清视频 | av在线一区二区 | 日本五月婷婷 | 又黄又爽的网站 |