新聞中心

        EEPW首頁(yè) > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 串行實(shí)時(shí)時(shí)鐘芯片DSl302程序設(shè)計(jì)中的問題與對(duì)策

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

        作者: 時(shí)間:2006-05-07 來源:網(wǎng)絡(luò) 收藏

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

        本文引用地址:http://www.104case.com/article/226466.htm

        關(guān)鍵詞: 串行時(shí)鐘 程序設(shè)計(jì) 問題 原因 解決方法

        美國(guó)Dallas公司推出的串行接口實(shí)時(shí)時(shí)鐘芯片DSl302可對(duì)時(shí)鐘芯片備份電池進(jìn)行涓流充電。由于該芯片具有體積小、功耗低、接口容易、占用CPU I/O口線少等主要特點(diǎn),故該芯片可作為實(shí)時(shí)時(shí)鐘廣泛應(yīng)用于智能化儀器儀表中。

        筆者在調(diào)試中發(fā)現(xiàn)在對(duì)DSl302編程中有幾個(gè)問題易被疏忽而導(dǎo)致錯(cuò)誤,現(xiàn)提供給讀者參考。

        串行實(shí)時(shí)時(shí)鐘芯片DSl302程序設(shè)計(jì)中的問題與對(duì)策1 讀操作出現(xiàn)的錯(cuò)誤

        按照參考文獻(xiàn)[2]的讀操作程序框圖和參考文獻(xiàn)[1]、[2]所敘述的可知:?jiǎn)巫止?jié)讀操作每次需16個(gè)時(shí)鐘,地址字節(jié)在前8個(gè)時(shí)鐘周期的上升沿輸入,而數(shù)據(jù)字節(jié)在后8個(gè)時(shí)鐘周期的下降沿輸出。據(jù)此結(jié)合圖1的硬件連接圖編制出了如下的單字節(jié)讀程序:

        DS_READSETB P1.2 ;令=0。

        CLR P1.1 ;令SCLK=0。

        CLR P1.2 ;令=1,啟動(dòng)芯片。

        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 ;在時(shí)鐘上升沿

        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個(gè)正脈沖的下

        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 ;RAM1單元的讀地址。

        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ì)研究時(shí)序圖和多次試驗(yàn)得知,問題的原因在于:對(duì)于讀操作時(shí)序,在SCLK出現(xiàn)第8個(gè)正脈沖時(shí),上升沿輸入地址字節(jié)的最后一位數(shù)據(jù),而在此正脈沖的下降沿就要輸出數(shù)據(jù)字節(jié)的第0位數(shù)據(jù)。然而筆者的程序中是在第9個(gè)正脈沖的下降沿才誤認(rèn)為輸出了數(shù)據(jù)字節(jié)的第0位數(shù)據(jù),此位數(shù)據(jù)事實(shí)上是第二個(gè)下降沿輸出的,故實(shí)為數(shù)據(jù)字節(jié)的第1位數(shù)據(jù)。經(jīng)筆者實(shí)驗(yàn):只要RST保持為高電平,如果超過8個(gè)下降沿,它們將重新從第0位輸出數(shù)據(jù)位,因程序中輸出的最后一位數(shù)據(jù)位,是9個(gè)下降沿輸出的數(shù)據(jù)位,故實(shí)為數(shù)據(jù)字節(jié)的第0位數(shù)據(jù)位。

        由此可見,單字節(jié)讀操作的時(shí)序圖如改為圖2所示時(shí)序圖,則讀者較容易理解可避免發(fā)生上述編程錯(cuò)誤。

        串行實(shí)時(shí)時(shí)鐘芯片DSl302程序設(shè)計(jì)中的問題與對(duì)策只要將上述的DS_RSUB子程序改為如下的子程序即可解決上述問題:

        DS_RSUBl:SETB P1.0 ;為讀數(shù)據(jù)作準(zhǔn)備

        MOV R7,#08H

        RL00P: CLR P1.1 ;SCLK第8?jìng)€(gè)正脈沖的

        MOV C,P1.0 ;下降沿開始輸出數(shù)據(jù)。

        RAC

        SETB P1.1

        DJNZ R7,RL00P

        RET

        2 禁止涓流充電出現(xiàn)的錯(cuò)誤

        涓流充電寄存器(TCR)控制著DSl302的涓流充電特性。據(jù)參考文獻(xiàn)[1]、[2]介紹,寄存器的位(TCS)4~7決定著是否具備充電性能。僅在1010編碼的條件下才具備充電性能,其它編碼組合不允許充電。位2和3(DS)則在之間選擇是一個(gè)還是兩個(gè)二極管串入其中。如果編碼是01,選擇一個(gè)二極管;如果編碼是10,選擇兩個(gè);其它編碼將禁止充電。該寄存器的0和1位(RS)用于選擇與二極管相串聯(lián)的電阻值,其中編碼01為2kΩ;10為4kΩ;11為8kΩ;而00將不允許充電。筆者編制了如下的允許涓流充電的控制程序(選擇一個(gè)二極管,充電限流電阻為4kΩ):

        SETB P1.2 ;令=0

        CLR P1.2 ;令SCLK=0

        CLR P1.2 ;令=1

        MOV A#90H ;TCR的寫地址

        LCALL DS_WSUB

        MOV A#10100110B ;TCR的命令

        LCALL DS_WSUB

        用萬用表串入與可充電池之間,執(zhí)行程序后,則有電流流過萬用表,表示充電正常。筆者通過將上述程序的第6句改為:MOV A,#10100010B,即置DS為00來禁止涓流充電器工作。執(zhí)行程序后,在與電池之間串入萬用表,則仍有電流流過,表示尚未禁止充電。若將第6語句改為:MOV A,#10101110B,即置DS為11,執(zhí)行上述程序后情況仍如此。若將第6語句改為:

        MOV A,#01010110B 即TCS≠1010

        或: MOV A,#10100100B 即RS=00則充電被禁止。

        串行實(shí)時(shí)時(shí)鐘芯片DSl302程序設(shè)計(jì)中的問題與對(duì)策筆者誤認(rèn)為芯片損壞,換上另一新購(gòu)置的芯片,結(jié)果仍如此。隨即筆者取下圖1所示電路中的可充電池,換上 一標(biāo)稱為10kΩ的電阻對(duì)芯片進(jìn)行了測(cè)試,測(cè)試結(jié)果如表1所示=5V。

        由此可見,當(dāng)涓流充電控制寄存器中的DS位為00和11時(shí)并不能禁止充電,而是選擇了一個(gè)二極管充電,這說明參考文獻(xiàn)中介紹的有誤。若要想禁止充電器充電,應(yīng)將第6句改為:MOV A,#0101XX00B 即TCS≠1010,RS=00,這樣,就能雙保險(xiǎn)地禁止充電。

        3 受干擾時(shí)鐘/日歷信息出現(xiàn)的錯(cuò)誤

        筆者將DSl302應(yīng)用于某產(chǎn)品中,發(fā)現(xiàn)系統(tǒng)受到干擾時(shí),有時(shí)其時(shí)鐘停振不能正常工作,此時(shí)的時(shí)鐘/日歷信息也被修改。

        經(jīng)分析得知:系統(tǒng)受到干擾程序飛跑,在看門狗復(fù)位前,CPU正好執(zhí)行寫程序?qū)懕Wo(hù)寄存器的最高位置0為允許寫(實(shí)際上,在系統(tǒng)校時(shí)程序之后已將其置為1禁止寫),修改了時(shí)鐘/日歷信息且使秒寄存器的最高位置1,致使時(shí)鐘停振出現(xiàn)錯(cuò)誤。

        為避免此類錯(cuò)誤的產(chǎn)生,筆者采用的方法是:在寫程序中增加了某一檢測(cè)條件,此條件為系統(tǒng)中某一口線上的電平,低電平條件滿足。只有在實(shí)時(shí)校時(shí)過程中,才通過手動(dòng)使此口線為低電平,實(shí)時(shí)校時(shí)過程完成后,又通過手動(dòng)使此口線為高電平。這樣只有實(shí)時(shí)校時(shí)過程中,才允許修改時(shí)鐘/日歷信息,因此起到了時(shí)鐘/日歷信息的寫保護(hù)作用。



        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 吉木乃县| 芦溪县| 安达市| 呼玛县| 石屏县| 天峻县| 延长县| 梓潼县| 常宁市| 溧阳市| 昌吉市| 玛曲县| 吉安县| 延吉市| 邮箱| 永顺县| 新竹市| 石门县| 阿瓦提县| 小金县| 阳原县| 垦利县| 华池县| 斗六市| 德惠市| 利辛县| 镇雄县| 岳池县| 富宁县| 双柏县| 横山县| 新和县| 大关县| 盈江县| 田林县| 蓬莱市| 石柱| 阿克苏市| 东乌| 光山县| 宜阳县|