歡迎您光臨本站 登入註冊首頁

概述

 摘要:指出了串列實時時鐘晶元DSl302程序設計中幾個易被疏忽而導致錯誤的問題,分析了問題的原因,並給出了解決問題的方法。關鍵詞:串列時鐘程序設計問題原因解決方法1讀操作出現的錯誤按照參考文獻[2]……


  摘要:指出了串列實時時鐘晶元DSl302程序設計中幾個易被疏忽而導致錯誤的問題,分析了問題的原因,並給出了解決問題的方法。
關鍵詞:串列時鐘程序設計問題原因解決方法




1讀操作出現的錯誤
按照參考文獻[2]的讀操作程序框圖和參考文獻[1]、[2]所敘述的可知:單位元組讀操作每次需16個時鐘,地址位元組在前8個時鐘周期的上升沿輸入,而數據位元組在後8個時鐘周期的下降沿輸出。據此結合圖1的硬體連接圖編製出了如下的單位元組讀程序:


=0。
CLRP1.1;令SCLK=0。
CLRP1.2;令

=1,啟動晶元。
LCALLDS_WSUB;寫8位地址。
LCALLDS_RSUB;讀出8位數據。
RET


MOVP1.0,C
SETBP1.1;在時鐘上升沿
NOP;輸入地址位元組。
CLRP1.1

RET


RL00P:SETBP1.1
NOP
CLRP1.1;在第9個正脈衝的下
MOVC,P1.0;降沿開始輸出數據。
RRCA;A中為讀出的數據。
DJNZR7,RL00P
RET


LCAllDS_READ;調用讀子程序。
則程序執行后A中的數據為2DH,顯然讀出的數據不正確。若再使用一條RLA指令調整后,則A中為5AH,結果才正確。由此說明:使用上述程序讀出的RAM1單元中的第0位數據實為第1位數據,讀出的第7位數據實為第0位數據。
經筆者仔細研究時序圖和多次試驗得知,問題的原因在於:對於讀操作時序,在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

LCALLDS_WSUB

LCALLDS_WSUB
用萬用表串入

與可充電池之間,執行程序后,則有電流流過萬用表,表示充電正常。筆者通過將上述程序的第6句改為:MOVA,#10100010B,即置DS為00來禁止涓流充電器工作。執行程序后,在

與電池之間串入萬用表,則仍有電流流過,表示尚未禁止充電。若將第6語句改為:MOV A,#10101110B,即置DS為11,執行上述程序后情況仍如此。若將第6語句改為:
MOV A,#01010110B即TCS≠1010


[admin via 研發互助社區 ] 串列實時時鐘晶元DSl302程序設計中的問題與對策已經有2280次圍觀

http://cocdig.com/docs/show-post-696.html