本人最近做一個電子時鐘,可是我用自動載入還是每十分鐘就慢24S,希望大家請教一下.
網友評論:集成了
晶體的rtc。。。
要想真正精確,就要定時校對,用電波/GPS/NTP吧。。。
網友評論:晶振是11.0259
大家都說容易,可都沒有說出容易的方法!
網友評論:集成了晶體的rtc芯片,出廠時已經進行了補償,應當比使用單片機計時精確的多,
此時單片機僅僅從rtc中讀取時間并顯示出來,
溫度/晶體的差異是永遠存在的,
要想更精確,只有自動定時校時,電波/GPS/NTP都是自動校時的方法,
換一種思路,不要總局限在掰指頭數指令上。。。
網友評論:不管你用的是多大的晶振,什么樣的單片機都不會有那么大誤差的,好好看看程序,把定時器好好看看.自己應該能搞個比較準的.
網友評論:用定時器,普通的晶振也可以啊,一個月1S都可以做到的
網友評論:成本占電路總成本99.9999999%的晶振呢。
網友評論:大家都說了容易,可是都沒有指了一條道路哦~~~~~~~~~~~~~~~~~
網友評論:是波器掛到晶振看下晶振準不準,我做過一天還慢不到1秒的
網友評論:20樓太會吹了,不錯,做時鐘肯定要用定時器,30天不差1秒,就是你晶振的誤差也不止這個數,不是我說,你絕對沒有做過30天不差1S的時鐘!!!
網友評論:要是你的程序能達到寫出來,就能根據每天的誤差確定晶振的誤差,基本上就可以去完成你的項目了。
基本上,這對扎實的做單片機的電子設計師都沒什么難度。
網友評論:1.8Mhz到24Mhz頻率的晶振,我發現頻率精度是相當的高的.
后來我查的手冊稱50ppm以內.也就是一天(86400秒)應該最大偏差4秒!
樓上有人的偏差過大,什么原因?中斷,軟件計數里有誤差,丟失了脈沖數了吧?好好查一下你的軟件
網友評論:悲哀!悲哀!完成悲哀!
看來新手在這里發貼是一大錯誤!
網友評論:我用51做的時鐘今天看了下5年了慢了1S而已。
有誰比我強
不過天數差了好幾天。湊巧湊巧~哈哈
網友評論:網友沒有任何義務要給你回答,大家只是因為工作愛好才聚居在這里討論的,上面不是很多網友給你說了好多方法了嗎,第一頁就有好幾個網友給你提出了問題的所在,你以為是在學校老師要握住你的手寫123啊
網友評論:只要逐條去做,包你能做準
網友評論:群:62831538討論
網友評論:lz的自動載入考慮中斷響應時間了么?
網友評論:程序有問題要自己找原因,而且已經給了很多提示。
網友評論:30天不差一秒?
如果光是普通電路,怎么可能?
網友評論:大家說有道理把。
網友評論:首先看你的時鐘是多少,然后再看每一分鐘慢多少秒,然后調整一下T0或T1給時間一個補償就可以了!!
最好用11.0592HZ的時鐘比較好。
網友評論:試著用時鐘芯片,改進一下成序
網友評論:昨天沒事再弄這個時鐘,覺得標志位溢出有問題,再算了一下時間,
現在一個小時慢三秒了,有機會再試一伙!
網友評論:再次的元件做出來的效果也不會差那么多。
網友評論:定時器采用自然益出產生中斷的辦法,如定時器每1US計一次,那么計1024次產生一次自然益出定時中斷,即每1024US產生一次中斷,那么1秒內產生1000000/1024=976.5625次中斷,我們先假設是977次這樣的定時中斷進1秒,那么每一秒就會多出0.4375個這樣的定時中斷,這個稱之為誤差,采用軟件校準這個誤差就是把這個誤差累加到以后的時間
計算里去,......,就這樣采用軟件校準的辦法,就OK了.
我嘗試用過51單片機、義隆單片機還有ATMEGA單片機做過電子表,都可以做到誤差每天小于1秒的,如果再調節下晶振的補償電容,慢了就調小,快了就調大一點,誤差還可以做到更小.
下面有我一段用ATMEGA做的電子表時間誤差軟件校準的代碼DEMO:
if(++time_var.mil_sec_var>=977)
{
PORTB=PORTB^0b00000001;
time_var.mil_sec_var=0;
time_cal_counter=time_cal_counter+4375;
if(time_cal_counter>=10000)
{time_var.mil_sec_var=1;time_cal_counter=time_cal_counter-10000;
}//callibratetheerrortime
if(++time_var.sec_var>=60)
{time_var.sec_var=0;
if(++time_var.min_var>=60)
{time_var.min_var=0;if(++time_var.hour_var>=24)time_var.hour_var=0;
}
}
}
網友評論:應該不是程序問題,
首先看你的時鐘是多少,然后再看每一分鐘慢多少秒,然后調整一下T0或T1給時間一個補償就可以了!!
最好用11.0592HZ的時鐘比較好。
網友評論:定時器不用重裝載的,16位計數方式
你先根據晶振計算出一個初值,12M的話,定時器計數一次需1uS,我們50mS中斷一次,那這個初值就是65536-50000;
就用這個值讓鐘運行個一個小時,看看有多少誤差,然后把這個誤差平均分配到每一次的定時當中,這樣能讓現有的設備得到最準的時間
網友評論:呵呵
網友評論:只要把程序的演示時間做一下適當地調整就可以了
網友評論:非常感謝各位的好見解,
我再好好的調一下!
網友評論:都死高手,但對于我們剛開始玩單片機的人來說,講點經驗才最實用,謝謝
網友評論:連接到因特網上,每隔一小時與時間服務器同步一次,呵呵
網友評論:INTER如果網速不好也一樣不準啊!
網友評論:20514xLED????a??‰é’?
?????‘????????¢???move.21ic.org
網友評論:可以采用定時器1s置一次初值
最近試了一下,一年軟件誤差也就6s左右
仔細優化定時器中斷程序,能做的更好
這樣之后就是選晶振和穩定晶振的問題了
網友評論:定時器1s置一次初值
有這么一個定時器,51好像12M的晶振最長也是65.536MS吧
說說怎么定時1S才置一次
網友評論:網友評論:中斷中計算次數,卻不修改定時器,到了1S的最后一次中斷才補差值
只是這樣以來定時器就只能用于時鐘,不能用作其他節拍發生了
以前討論得很多得方法了,不懂得自己去想想吧
網友評論:呵呵,應該不是亂吹吧,不過不知道用的是什么樣的芯片........
網友評論:肯定是程序錯誤,正常的話,一天一秒吧。我做的一款,三年了,一秒鐘不差。不信?我每天晚上十二點與中央人民廣播電臺同步一次。信了吧。
網友評論:LS的仁兄!
樓的上仁兄是不是手工同步的啊?
網友評論:以12M晶體為例:1S=1000000US==16*65536-1000000=48576=BDC0H
在中進入設置
DJNZR7,TORET
PUSHACC
PUSHPSW
MOVR7,#16
MOVA,TL0
ADDA,#0C2H;這個數字可以用來校表
MOVTL0,A
MOVTH0,#0BDH
POPPSW
POPACC
TORET:RET
網友評論:謝謝樓上的仁兄了!
網友評論:可以做到1個NOP不差,無累計誤差,有點水平的都行。
第二,同時可以全速跑設備程序,對計時要無影響,至少要有一定功力才
做得到,用我那個程序結構普通人就做得到。
必須加入晶振誤差修正程序,這無疑是個多字節的高精度修正程序,需要一點運算技巧,可以每過1天運算一次修正,以前做的普通12M晶振大概是5天差不到2秒(無修正的),有些晶振可能更大。
加入修正程序后,可以做到基本無誤差,1年或者N年
QQ:184324486
網友評論:LED是6段,定時器是512HZ,這樣刷新率有85多,日誤差在2S內,掉電電流30uA.
網友評論:我們大學書本就是錯的,還停了定時器修正,想想真是畫蛇添足了,書店里的書大部分也是這樣寫的,所以害了那么多學子。78樓又出來一個狂人,特級大師,你要笑死莫多人,這里面很多高手不屑于來討論這個罷了
網友評論:10/1000000*30*24*60*60=25.92s
網友評論:0.01/1000000*365*24*60*60=0.3165s
看來要做好一個手表還真不容易.
網友評論:按樓上的說法,10ppm的晶振,10/1000000*30*24*60*60=25.92s是每個月的最小誤差,
只能用0.01ppm的天價的晶振。真的是這樣嗎?
沒有金剛鉆,哪敢接瓷器活
網友評論:可以用
DS1302時鐘芯片做啊。
如果要只用單片機的話,一定要注意定時的長度,另外還有中斷程序中重新賦值之前錯過的時間,如果在中斷程序的開始就對定時器賦值的話,應該在賦給的數值里減去5-8us。
網友評論:哪個夠精確.
網友評論:考慮下每條語句的延時
12m提供一個1ms的延時程序:
DELAY:MOVR6,#02#
DELAY1:MOVR7,#0FFH
DJNZR7,$
DJNZR6,DELAY1
RET
網友評論:但一般你的運氣不會那么差,所以可能買的是30ppm類型的晶振,但你用到的那個快快慢慢的一年下來算平均或許也在0.01ppm之類.但你要保證在要求的誤差之內就不能那么做了.
不光這樣.還有你用的電容的溫飄也會影響精度.所以要做好可不是一件容易的事.