新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 串行實時時鐘芯片DS1302程序設計中的問題與對策

        串行實時時鐘芯片DS1302程序設計中的問題與對策

        作者: 時間:2012-07-09 來源:網絡 收藏

        經筆者仔細研究時序圖和多次試驗得知,問題的原因在于:對于讀操作時序,在SCLK出現第8個正脈沖時,上升沿輸入地址字節的最后一位數據,而在此正脈沖的下降沿就要輸出數據字節的第0位數據。然而筆者的程序中是在第9個正脈沖的下降沿才誤認為輸出了數據字節的第0位數據,此位數據事實上是第二個下降沿輸出的,故實為數據字節的第1位數據。經筆者實驗:只要RST保持為高電平,如果超過8個下降沿,它們將重新從第0位輸出數據位,因程序中輸出的最后一位數據位,是9個下降沿輸出的數據位,故實為數據字節的第0位數據位。

        由此可見,單字節讀操作的時序圖如改為圖2所示時序圖,則讀者較容易理解可避免發生上述編程錯誤。

        只要將上述的DS_RSUB子程序改為如下的子程序即可解決上述問題:

        DS_RSUBl:SETBP1.0;為讀數據作準備

        MOVR7,#08H

        RL00P:CLRP1.1;SCLK第8個正脈沖的

        MOVC,P1.0;下降沿開始輸出數據。

        RAC

        SETBP1.1

        DJNZR7,RL00P

        RET

        2禁止涓流充電出現的錯誤

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

        SETBP1.2;令=0

        CLRP1.2;令SCLK=0

        CLRP1.2;令=1

        MOVA#90H;TCR的寫地址

        LCALLDS_WSUB

        MOVA#10100110B;TCR的命令

        LCALLDS_WSUB

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

        MOV A,#01010110B即TCS≠1010

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

        筆者誤認為芯片損壞,換上另一新購置的芯片,結果仍如此。隨即筆者取下圖1所示電路中的可充電池,換上一標稱為10kΩ的電阻對芯片進行了測試,測試結果如表1所示=5V。

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

        3受干擾時鐘/日歷信息出現的錯誤

        筆者將DSl302應用于某產品中,發現系統受到干擾時,有時其時鐘停振不能正常工作,此時的時鐘/日歷信息也被修改。

        經分析得知:系統受到干擾程序飛跑,在看門狗復位前,CPU正好執行寫程序將寫保護寄存器的最高位置0為允許寫(實際上,在系統校時程序之后已將其置為1禁止寫),修改了時鐘/日歷信息且使秒寄存器的最高位置1,致使時鐘停振出現錯誤。

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


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 涡阳县| 新乡市| 北安市| 阜阳市| 博客| 监利县| 临沧市| 辽阳市| 翁源县| 皋兰县| 呼和浩特市| 响水县| 广饶县| 巨野县| 拉萨市| 镇原县| 涿州市| 万荣县| 朝阳县| 通河县| 石景山区| 延庆县| 曲松县| 濮阳市| 连江县| 巴里| 墨玉县| 台中市| 南雄市| 凌海市| 霍林郭勒市| 凤山市| 开封市| 克山县| 高要市| 行唐县| 常熟市| 宁陵县| 射洪县| 墨脱县| 岳普湖县|