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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1828|回復: 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;
}


回復

使用道具 舉報

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晶體試試吧?
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

ID:277550 發表于 2023-11-7 09:51 | 顯示全部樓層

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

使用道具 舉報

ID:485350 發表于 2023-11-29 11:51 | 顯示全部樓層
晶振誤差多少,中斷跳轉,定時時間重載這些考慮進去沒
回復

使用道具 舉報

ID:57657 發表于 2023-11-29 13:20 | 顯示全部樓層
仿真誤差大是程序有問題,實物誤差與晶振精度有關,定時器要設置成自動重載模式。
回復

使用道具 舉報

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兆的晶體做不到這點——算術問題,當然非要這么做也可以,增加了程序的復雜性。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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天堂 | 天堂资源最新在线 | 人人干视频在线 | 国产精品亚洲精品久久 | 国产特级毛片aaaaaa喷潮 | www.99久久.com| 精品99久久久久久 | 性福视频在线观看 | 国产色99| 91在线看 | 9999精品视频 | 国产精品69毛片高清亚洲 | 国产精品区一区二区三 | a免费在线 | 亚洲国产精品久久久久婷婷老年 | 亚洲精品国产电影 | 午夜电影福利 | 狠狠色综合欧美激情 | 成人在线免费看 | 97日韩精品| 欧美一区二区三区在线观看视频 | 在线中文字幕日韩 | 99久久亚洲 | 久久久久久久久一区 | 毛片网络| 亚洲播放一区 | 欧美日韩在线看 | 一区二区三区网站 | 久久久久国产视频 | 精品一区二区三区av | 黄色大片免费观看 | 免费h视频 |