《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 模擬設(shè)計 > 業(yè)界動態(tài) > 串行實(shí)時時鐘芯片DSl302程序設(shè)計中的問題與對策

串行實(shí)時時鐘芯片DSl302程序設(shè)計中的問題與對策

2009-02-05
作者:樊貴卿1 李慶武1 靳建華1 2

  摘 要: 指出了串行實(shí)時時鐘芯片DSl302程序設(shè)計中幾個易被疏忽而導(dǎo)致錯誤的問題,分析了問題的原因,,并給出了解決問題的方法,。
  關(guān)鍵詞: 串行時鐘 程序設(shè)計 問題 原因 解決方法


  美國Dallas公司推出的串行接口實(shí)時時鐘芯片DSl302可對時鐘芯片備份電池進(jìn)行涓流充電,。由于該芯片具有體積小、功耗低,、接口容易,、占用CPU I/0口線少等主要特點(diǎn),故該芯片可作為實(shí)時時鐘,廣泛應(yīng)用于智能化儀器儀表中,。
  筆者在調(diào)試中發(fā)現(xiàn),在對DSl302編程中有幾個問題易被疏忽而導(dǎo)致錯誤,,現(xiàn)提供給讀者參考。
1 讀操作出現(xiàn)的錯誤
  按照參考文獻(xiàn)[2]的讀操作程序框圖和參考文獻(xiàn)[1],、[2]所敘述的可知:單字節(jié)讀操作每次需16個時鐘,,地址字節(jié)在前8個時鐘周期的上升沿輸入,而數(shù)據(jù)字節(jié)在后8個時鐘周期的下降沿輸出,。據(jù)此結(jié)合圖1的硬件連接圖編制出了如下的單字節(jié)讀程序:


  DS_READ:SETB   P1.2  ?。涣?IMG style="FILTER: " height=19 alt="" hspace=0 src="http://files.chinaaet.com/old/uploadfiles/jishu/jslw/20090205085451671.gif" width=34 align=absMiddle border=0>=0,。
    CLR   P1.1  ?。涣頢CLK=0,。
    CLR   P1.2  ?。涣?IMG height=19 alt="" hspace=0 src="http://files.chinaaet.com/old/uploadfiles/jishu/jslw/20090205085451671.gif" width=34 align=absMiddle border=0>=1,,啟動芯片,。
    LCALL DS_WSUB   ,;寫8位地址,。
    LCALL DS_RSUB   ,;讀出8位數(shù)據(jù),。
    RET
  DS_WSUB:MOV   R7,#08H
  WL00P: RRC   A   ??;A為地址字節(jié)。
    MOV   P1.0,,C
    SETB   P1.1 ?。辉跁r鐘上升沿
    NOP     ??;輸入地址字節(jié)。
    CLR   P1.1
    DJNZ R7,WL00P
    RET
  DS_RSUB:SETB   P1.0  ??;為讀數(shù)據(jù)作準(zhǔn)備,。
    MOV R7,#08H
  RL00P:SETB   P1.1
    NOP
    CLR  P1.1  ,;在第9個正脈沖的下
    MOV  C,,P1.0  ,;降沿開始輸出數(shù)據(jù),。
    RRC  A    ,;A中為讀出的數(shù)據(jù),。
    DJNZ R7,RL00P
    RET
  若使用如下程序?qū)Sl302的RAM1(其內(nèi)容為5AH)進(jìn)行讀操作
  READ:MOV A,#11000101B ,;RAMl單元的讀地址,。
     LCAll DS_READ ;調(diào)用讀子程序,。
  則程序執(zhí)行后A中的數(shù)據(jù)為2DH,,顯然讀出的數(shù)據(jù)不正確。若再使用一條RL A指令調(diào)整后,,則A中為5AH,,結(jié)果才正確。由此說明:使用上述程序讀出的RAM1單元中的第0位數(shù)據(jù)實(shí)為第1位數(shù)據(jù),,讀出的第7位數(shù)據(jù)實(shí)為第0位數(shù)據(jù),。
  經(jīng)筆者仔細(xì)研究時序圖和多次試驗(yàn)得知,問題的原因在于:對于讀操作時序,,在SCLK出現(xiàn)第8個正脈沖時,,上升沿輸入地址字節(jié)的最后一位數(shù)據(jù),而在此正脈沖的下降沿就要輸出數(shù)據(jù)字節(jié)的第0位數(shù)據(jù),。然而筆者的程序中是在第9個正脈沖的下降沿才誤認(rèn)為輸出了數(shù)據(jù)字節(jié)的第0位數(shù)據(jù),,此位數(shù)據(jù)事實(shí)上是第二個下降沿輸出的,故實(shí)為數(shù)據(jù)字節(jié)的第1位數(shù)據(jù),。經(jīng)筆者實(shí)驗(yàn):只要保持為高電平,,如果超過8個下降沿,它們將重新從第0位輸出數(shù)據(jù)位,,因程序中輸出的最后一位數(shù)據(jù)位,是第9個下降沿輸出的數(shù)據(jù)位,,故實(shí)為數(shù)據(jù)字節(jié)的第0位數(shù)據(jù)位,。
  由此可見,單字節(jié)讀操作的時序圖如改為圖2所示時序圖,,則讀者較容易理解可避免發(fā)生上述編程錯誤,。


  只要將上述的DS_RSUB子程序改為如下的子程序即可解決上述問題:
  DS_RSUBl:SETB P1.0 ?。粸樽x數(shù)據(jù)作準(zhǔn)備
    MOV R7,,#08H
  RL00P:  CLR P1.1   ?。籗CLK第8個正脈沖的
    MOV C,,P1.0 ?。幌陆笛亻_始輸出數(shù)據(jù),。
    RAC
    SETB   P1.1
    DJNZ   R7,,RL00P
    RET
2 禁止涓流充電出現(xiàn)的錯誤
  涓流充電寄存器(TCR)控制著DSl302的涓流充電特性。據(jù)參考文獻(xiàn)[1],、[2]介紹,,寄存器的位(TCS)4~7決定著是否具備充電性能。僅在1010編碼的條件下才具備充電性能,,其它編碼組合不允許充電,。位2和3(DS)則在VCC2和VCC1之間選擇是一個還是兩個二極管串入其中。如果編碼是01,,選擇一個二極管,;如果編碼是10,選擇兩個,;其它編碼將禁止充電,。該寄存器的0和l位(RS)用于選擇與二極管相串聯(lián)的電阻值,其中編碼01為2kΩ,;10為4kΩ,;11為8kΩ;而00將不允許充電,。筆者編制了如下的允許涓流充電的控制程序(選擇一個二極管,充電限流電阻為4kΩ):
  SETB   P1.2   ?。涣?IMG height=19 alt="" hspace=0 src="http://files.chinaaet.com/old/uploadfiles/jishu/jslw/20090205085451671.gif" width=34 align=absMiddle border=0>=0
  CLR   P1.2    ??;令SCLK=0
  CLR   P1.2    ,;令=1
  MOV   A,#90H   ?。籘CR的寫地址
  LCALL DS_WSUB
  MOV   A,#10100110B  ??;TCR的命令
  LCALL DS_WSUB
  用萬用表串入Vcc1與可充電池之間,執(zhí)行程序后,,則有電流流過萬用表,,表示充電正常,。筆者通過將上述程序的第6句改為:MOV A,#10100010B,即置DS為00來禁止涓流充電器工作,。執(zhí)行程序后,,在Vcc1與電池之間串入萬用表,則仍有電流流過,,表示尚未禁止充電,。若將第6語句改為:MOV A,#10101110B,即置DS為11,,執(zhí)行上述程序后情況仍如此,。若將第6語句改為:
  MOV A,#01010110B 即TCS≠1010
  或:  MOV A,#10100100B 即RS=00則充電被禁止。
  筆者誤認(rèn)為芯片損壞,,換上另一新購置的芯片,,結(jié)果仍如此。隨即筆者取下圖1所示電路中的可充電池,,換上一標(biāo)稱為10kΩ的電阻對芯片進(jìn)行了測試,,測試結(jié)果如表1所示VCC2=5V。


  由此可見,,當(dāng)涓流充電控制寄存器中的DS位為00和11時并不能禁止充電,,而是選擇了一個二極管充電,這說明參考文獻(xiàn)中介紹的有誤,。若要想禁止充電器充電,,應(yīng)將第6句改為:MOV A,#0101XX00B 即TCS≠1010,,RS=00,,這樣,就能雙保險地禁止充電,。
3 受干擾時鐘/日歷信息出現(xiàn)的錯誤
  筆者將DS1302應(yīng)用于某產(chǎn)品中,,發(fā)現(xiàn)系統(tǒng)受到干擾時,有時其時鐘停振不能正常工作,,此時的時鐘/日歷信息也被修改,。
  經(jīng)分析得知:系統(tǒng)受到干擾程序飛跑,在看門狗復(fù)位前,,CPU正好執(zhí)行寫程序?qū)懕Wo(hù)寄存器的最高位置0為允許寫(實(shí)際上,,在系統(tǒng)校時程序之后已將其置為1禁止寫),修改了時鐘/日歷信息且使秒寄存器的最高位置1,,致使時鐘停振出現(xiàn)錯誤,。
  為避免此類錯誤的產(chǎn)生,筆者采用的方法是:在寫程序中增加了某一檢測條件,此條件為系統(tǒng)中某一口線上的電平,,低電平條件滿足。只有在實(shí)時校時過程中,,才通過手動使此口線為低電平,,實(shí)時校時過程完成后,又通過手動使此口線為高電平,。這樣只有實(shí)時校時過程中,,才允許修改時鐘/日歷信息,因此起到了時鐘/日歷信息的寫保護(hù)作用,。
參考文獻(xiàn)
1 王明順,,吳省.可涓流充電的串行實(shí)時時鐘芯片DS1302及應(yīng)用設(shè)計.電子技術(shù)應(yīng)用.1996(10)
2 李正軍,蔣閱峰.DS1302串行實(shí)時時鐘及其在智能電表中的應(yīng)用.電子儀器儀表用戶.1996(2)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。