概述
環(huán)境監(jiān)測通常需要小巧靈活的微控制器。如果在這類應(yīng)用中使用個人電腦,對其計算能力和存儲容量而言都是一種浪費,可采用一個微控制器與溫、濕度傳感器或其它環(huán)境監(jiān)測傳感器通信,讀取并存儲監(jiān)測數(shù)據(jù)。為實現(xiàn)更高的靈活性,這些微控制器可連成網(wǎng)絡(luò),各自將監(jiān)測數(shù)據(jù)上傳到功能更強大的系統(tǒng)中,對整體環(huán)境參數(shù)進行分析記錄。
本篇應(yīng)用筆記介紹如何使用低功耗微控制器MAXQ3210實現(xiàn)環(huán)境監(jiān)測應(yīng)用。增加一個通過一根1-Wire總線實現(xiàn)供電和通信的數(shù)字
溫度傳感器DS1822,我們可用zui少的元器件構(gòu)建一個電池供電的非易失溫度記錄系統(tǒng)。
可以下載相關(guān)演示代碼。代碼采用MAXQ匯編語言編寫,在MAX-IDE開發(fā)環(huán)境自帶的標準宏匯編預(yù)處理器和匯編器中編譯。該代碼是為MAXQ3210評估板編寫,因此還需要以下器件(圖1)。
溫度傳感器:DS1822經(jīng)濟型1-Wire數(shù)字溫度傳感器(TO-92封裝)
RS-232電平轉(zhuǎn)換器:MAX233ACWP
圖1.MAXQ32101-Wire溫度記錄儀演示電路所需的元器件
設(shè)計目標
演示代碼要完成以下任務(wù)(圖2):
通過1-Wire網(wǎng)絡(luò)(位模擬方式)與溫度傳感器DS1822通信。
每分鐘喚醒一次測量溫度。
將溫度數(shù)據(jù)存儲在MAXQ3210內(nèi)部的非易失EEPROM中。
上電后以9600bps的速率通過位模擬串口發(fā)送溫度記錄數(shù)據(jù)。
在發(fā)送前將溫度數(shù)據(jù)轉(zhuǎn)換成容易識別的ASCII格式(十進制華氏度)。
根據(jù)主機要求清空存儲器(擦除在EEPROM中存儲的溫度數(shù)據(jù))。
圖2.溫度記錄應(yīng)用的程序流程圖
為何使用MAXQ3210
幾乎所有的低功耗MAXQ微控制器都可以實現(xiàn)這一應(yīng)用,但MAXQ3210更適合用于溫度記錄。
集成穩(wěn)壓器。MAXQ3210內(nèi)部集成5V穩(wěn)壓器,可以直接由標準9V電池供電。MAXQ3210的5V穩(wěn)壓輸出還可為其它設(shè)備供電(zui大電流50mA)。這一特性非常重要,這意味著如果其它器件也可采用5V供電,則不再需要另加單獨的電源芯片。
低功耗。MAXQ3210僅需消耗很小的電流,即使以3.58MHz全速運行,典型值也僅為6mA。當降低頻率或處理器停止工作進入休眠狀態(tài)時,電池電流還可更低。MAXQ3210內(nèi)部集成的8kHz環(huán)形振蕩器驅(qū)動一個長周期的喚醒時鐘,可在長達2分鐘的可編程間隔后將處理器從休眠狀態(tài)喚醒。
內(nèi)部數(shù)據(jù)EEPROM。在掉電時需要保存溫度記錄數(shù)據(jù),這些數(shù)據(jù)可能要采集幾小時,幾天,甚至是幾周時間。MAXQ3210數(shù)據(jù)存儲空間有64個字的EEPROM,可非常容易的實現(xiàn)這一要求。EEPROM中的每個16位字都可調(diào)用UtilityROM中的一個函數(shù)單獨修改;EEPROM技術(shù)意味著在寫數(shù)據(jù)之前從來都不需要擦除操作。如果需要更多EEPROM空間,可將數(shù)據(jù)寫入任何未用的程序EEPROM空間,該寫入過程調(diào)用UtilityROM中的另一個函數(shù)以類似方式逐字修改,無需重載整個應(yīng)用程序。
5V端口引腳。與所有MAXQ微控制器一樣,MAXQ3210的端口引腳可靈活的設(shè)為輸入、輸出、弱上拉和三態(tài)。MAXQ3210還可提供多種接口選擇。由于微控制器的端口為5V電平,可以直連5V器件或通過上拉電阻連接低功耗器件(工作在三態(tài)/開漏模式)。由于這一應(yīng)用所需端口很少,使用大的微控制器會浪費許多功能。
壓電揚聲器驅(qū)動器。盡管壓電揚聲器功能在這一應(yīng)用中沒有使用,但在許多類型的環(huán)境監(jiān)測應(yīng)用中都需要產(chǎn)生可聽見的告警聲。例如煙霧監(jiān)測和一氧化碳監(jiān)測。MAXQ3210可直接驅(qū)動壓電揚聲器,可用非常簡單的軟件實現(xiàn)這一功能。僅需1位控制位來打開或關(guān)閉壓電揚聲器。根據(jù)所選的揚聲器不同,MAXQ3210輸出的幅度可以達到100dB。
小封裝:MAXQ3210提供小型的24引腳TSSOP封裝。
驅(qū)動1-Wire網(wǎng)絡(luò)
DallasSemiconductor/Maxim提供一系列使用1-Wire網(wǎng)絡(luò)接口的傳感器和其它器件。該接口的數(shù)據(jù)通信和供電僅需通過一根數(shù)據(jù)線再加一根地線,這意味著微控制器僅需一個端口即可與1-Wire傳感器通信。
1-Wire網(wǎng)絡(luò)工作于一主多從模式(多點網(wǎng)絡(luò))。時序非常靈活,允許從機以高達16kbps的速率與主機通信。每個1-Wire器件都有一個*的64位ROMID,允許1-Wire主機選擇位于網(wǎng)絡(luò)任何位置的一個從機進行通信。
1-Wire總線采用漏極開路模式工作,主機(或需要輸出數(shù)據(jù)的從機)將數(shù)據(jù)線拉低到地表示數(shù)據(jù)0,將數(shù)據(jù)線釋放為高表示數(shù)據(jù)1。這通常通過在數(shù)據(jù)線和VCC之間連一個分立電阻實現(xiàn),但MAXQ3210的端口引腳支持弱上拉模式,只需將引腳切換到弱上拉模式,數(shù)據(jù)線即可浮高。因此MAXQ3210不需外接電阻。由于主機和從機僅需將數(shù)據(jù)線拉低,而從不將數(shù)據(jù)線主動拉高,因此數(shù)據(jù)線可以實現(xiàn)“線-或”功能,這可防止多個從機試圖同時通過1-Wire總線發(fā)送數(shù)據(jù)時出現(xiàn)沖突。
為驅(qū)動1-Wire網(wǎng)絡(luò),MAXQ3210利用軟件在一個引腳上實現(xiàn)以下類型的時隙。由于1-Wire所有時隙由主機啟動,因此當MAXQ3210不與從機通信時不需要監(jiān)測1-Wire線路。有關(guān)1-Wire時序的更多詳細信息請參考DS1822的數(shù)據(jù)資料。
Reset時隙寬度大約為1ms。在時隙的前半部分,主機(MAXQ3210)將1-Wire總線拉低,然后主機將總線釋放,使其浮高??偩€上的所有1-Wire從機復(fù)位,并在該時隙的后半段將總線拉低。這一步產(chǎn)生一個presencepulse(在線脈沖),向主機表明有一個或多個1-Wire從機在線,并且準備好開始通信。
Write時隙大約長120μs,主機利用這一時隙向1-Wire從機發(fā)送0或1。兩種寫時隙都是以主機將總線拉低至少1微秒開始。如果發(fā)送1,主機隨即釋放1-Wire總線(使其浮高)。如果發(fā)送0,主機在該時隙剩余的時間內(nèi)一直將總線拉低。
Read時隙大約長60μs,主機利用這一時隙讀取從機發(fā)送的0或1。該時隙是以主機將總線拉低至少1微秒開始的。隨后主機將總線釋放,允許從機將總線拉低(表示0),或?qū)⒖偩€釋放使其浮空為高(表示1)。主機在時隙中部采樣總線讀取從機發(fā)送來的數(shù)據(jù)。
由于MAXQ3210每微秒約等于三個半指令周期(3.58MHz時鐘頻率下),軟件可利用一個端口引腳(P1.6)方便的實現(xiàn)1-Wire協(xié)議。
#defineOWINM0[09h].6;PI1.6
#defineOWOUTM0[01h].6;PO1.6
#defineOWDIRM0[11h].6;PD1.6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:Reset1Wire
;;Description:Sendsastandardspeed1-WireresetpulseonP1.6
;;andchecksforapresencepulsereply.
;;Inputs:None
;;Outputs:C-Clearedonsuccess;setonerror(nopresence
;;pulsedetected)
;;Destroys:PSF,LC[0]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Reset1Wire:
moveOWDIR,#1;Outputmode
moveOWOUT,#0;Drivelow
moveLC[0],#RESET_LOW
djnzLC[0],$
moveOWOUT,#1;Snaphigh
moveLC[0],#SNAP
djnzLC[0],$
moveOWDIR,#0;Changetoweakpullupinput
moveLC[0],#RESET_PRESAMPLE
djnzLC[0],$
moveC,OWIN;Checkforpresencedetect
moveLC[0],#RESET_POSTSAMPLE
djnzLC[0],$
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:Write1Wire
;;Description:Writesastandardspeed1-WireoutputbyteonP1.6.
;;Inputs:GRL-Bytetowriteto1-Wire.
;;Outputs:None.
;;Destroys:PSF,AP,APC,A[0],LC[0],LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Write1Wire:
moveAPC,#080h;Standardmode,selectA[0]asAcc
moveAcc,GRL
moveOWDIR,#1;Outputdrivemode
moveLC[1],#8;8bitstowrite
Write1Wire_slot:
moveOWOUT,#0;Drivelowforstartofwriteslot
moveLC[0],#WRITE_PREBIT
djnzLC[0],$
rrc;Getthenextbit
jumpC,Write1Wire_one
Write1Wire_zero:
moveOWOUT,#0;Keepthelinelow(zerobit)
jumpWrite1Wire_next
Write1Wire_one:
moveOWOUT,#1
Write1Wire_next:
moveLC[0],#WRITE_POSTBIT
djnzLC[0],$;Finishthetimeslot
moveOWOUT,#1;Drivebackhigh(endofslot)
moveLC[0],#WRITE_RECOVERY
djnzLC[0],$;Recoverytimeperiod
djnzLC[1],Write1Wire_slot
ret
實現(xiàn)讀時隙的功能與之類似。注意,在1-Wire總線上所有數(shù)據(jù)均為低有效位(LSB)先發(fā)。
利用MAXQ3210實現(xiàn)1-Wire時序時,另一點需要注意的是:盡管1-Wire總線上拉電阻的阻值與總線上的設(shè)備數(shù)有關(guān),但通常在4k到5k之間??墒荕AXQ3210端口引腳上的弱上拉電阻為50k到100k。為了防止1-Wire總線從低電平到高電平轉(zhuǎn)換的時間過長,演示代碼先將P1.6輸出設(shè)為短暫的高電平,將總線強制拉高,然后變?yōu)檎5娜跎侠J?。只要該過程不是在從機試圖將總線拉低的時候進行,就不會出現(xiàn)問題。另外,還可以在總線上再加一個分立的上拉電阻,這樣就可以正常的方式使端口輸出低代表0,輸出三態(tài)代表1。
注意:當構(gòu)建的1-Wire網(wǎng)絡(luò)傳輸距離較遠或連接的從機數(shù)量較多時,還需要注意其他事項。更多信息請參考以下應(yīng)用筆記。
AN148:1-Wire網(wǎng)絡(luò)可靠設(shè)計指南
AN570:TechBrief1:1-WireNetDesignGuide
AN937:BookofiButtonStandards
用DS1822測量溫度
盡管MAXQ3210可以使用上面的代碼與大多數(shù)1-Wire從機器件通信,在本應(yīng)用中我們將主要考慮與DS1822通信。DS1822是一個1-Wire從機器件,可實現(xiàn)9到12位的攝氏溫度測量,測量結(jié)果可被1-Wire主機讀取。與多數(shù)1-Wire從機一樣,DS1822可以*由1-Wire總線供電,我們稱之為寄生供電。
DS1822的測量范圍可達-55°C至+125°C,適用于多數(shù)的室內(nèi)外溫度測量應(yīng)用。溫度分辨率在9位下為0.5°C,12位下0.0625°C。進行一次溫度轉(zhuǎn)換所需時間在低分辨率下約為94ms,在zui高分辨率下約為750ms。由于這是一個簡單應(yīng)用,我們選擇9位分辨率,并忽略zui低位(0.5°C)。這樣就可使整個8位帶符號溫度數(shù)據(jù)與MAXQ3210的8位累加器匹配。
所有的1-Wire從機器件都支持一個通用指令集,從而使得主機可以判斷總線上的從機數(shù)目,讀取ROMID,并且可以與某一個從機或一組從機進行通信。一旦某個1-Wire從機被激活,主機可以針對該從機類型向其發(fā)送特殊指令。其它所有未被激活的從機均處于等待狀態(tài),直到下一個復(fù)位脈沖出現(xiàn),才開始再次監(jiān)測1-Wire總線。
由于在我們的應(yīng)用中總線上僅有一個1-Wire器件,我們可以使用zui簡單的指令集訪問從機器件,不需要讀取從機的ROMID。當總線上有多個從機器件時,ROMID被用來區(qū)分不同的從機器件。我們的程序中也讀取了一次DS1822的ROMID,但僅是為了演示。
我們將使用下面的1-Wire指令集,DS1822支持的其它指令請參考其數(shù)據(jù)資料。
ReadROM[33h]。這一指令假設(shè)1-Wire總線上只有一個從機器件。1-Wire從機收到該指令后將其8字節(jié)的ROMID發(fā)回1-Wire主機。這個ID包括48位序列號,8位CRC,8位家族碼。家族碼代表器件類型。DS1822的家族碼為22h。收到ReadROM指令后,1-Wire從機被激活,并響應(yīng)后續(xù)與該從機器件相關(guān)的指令。
SkipROM[CCh]。1-Wire總線上有一個或多個從機器件時都可以使用這一指令。這條指令激活總線上的所有從機,與從機的ROMID無關(guān)。當總線上只有一個從機時,可利用這條指令不讀取從機ID而激活從機,使其接收后續(xù)相關(guān)指令。當總線上有多個從機時,如果使用這條指令,則必須保證后面的指令不會造成從機向主機發(fā)送數(shù)據(jù)。因為從機可能發(fā)送不同的數(shù)據(jù)而造成數(shù)據(jù)沖突。
WriteScratchpad[4Eh]。這是DS1822的指令,之前先用ReadROM或SkipROM指令激活器件。在該指令后1-Wire主機發(fā)送3字節(jié)的配置數(shù)據(jù)用來配置DS1822,包括溫度轉(zhuǎn)換的位分辨率。更多詳情請參考DS1822的數(shù)據(jù)資料。
ReadScratchpad[BEh]。這也是DS1822的指令,該指令允許主機從DS1822讀取zui多9字節(jié)數(shù)據(jù)。這些數(shù)據(jù)包括通過WriteScratchpad指令設(shè)置的配置寄存器值,以及zui近的溫度轉(zhuǎn)換結(jié)果。更多詳情請參考DS1822的數(shù)據(jù)資料。我們的應(yīng)用僅需要zui開始的兩個字節(jié),這兩個字節(jié)就是zui近的溫度轉(zhuǎn)換結(jié)果。
ConvertTemperature[44h]。這是DS1822的指令。DS1822收到該指令后開始測量溫度,并將其按位分辨率轉(zhuǎn)換成數(shù)字量。結(jié)果存儲到兩個內(nèi)部寄存器中,1-Wire主機可以通過ReadScratchpad讀取。
當執(zhí)行ConvertTemperature指令時,DS1822需要消耗更多的電流(zui多1.5mA),可能超過1-Wire總線弱上拉所能提供的電流。因此,一旦主機發(fā)出這一指令,必須對1-Wire總線進行強上拉,直至溫度轉(zhuǎn)換結(jié)束。在此期間,1-Wire總線上不能有任何通信發(fā)生。MAXQ3210簡單地通過將P1.6端口從弱上拉切換成輸出高電平來滿足此要求。MAXQ3210端口驅(qū)動器能夠輸出足夠DS1822工作所需的電流。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:ConvertAndReadTemp
;;Description:Sendscommandstomeasuretemperatureandread
;;scratchpadfromtheDS1822.
;;Inputs:None.
;;Outputs:GRL-8-bitsignedtemperaturevalue,indegreesC.
;;Destroys:PSF,AP,APC,A[0],A[1],A[2],LC[0],LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ConvertAndReadTemp:
callReset1Wire;ResettheDS1822
moveGRL,#OW_SKIP_ROM;SelecttheDS1822
callWrite1Wire
moveGRL,#OW_CONVERT;Sendtempconvertcommand
callWrite1Wire
moveOWDIR,#1;Turnonstrongpullupfordrawcurrent
moveOWOUT,#1
moveLC[0],#55;Aboutasecond
delay:
moveLC[1],#0
djnzLC[1],$
djnzLC[0],delay
callReset1Wire;Conversioncompleted;resetagain
moveGRL,#OW_SKIP_ROM;Selectagain
callWrite1Wire
moveGRL,#OW_RD_SCRATCH;Readthescratchpadvalues
callWrite1Wire
callRead1Wire
moveA[1],GRL;TempLSB3210xxxx
callRead1Wire
moveA[2],GRL;TempMSBsssss654
moveAcc,A[1];3210xxxx
and#0F0h;3210----
xchn;----3210
moveA[1],Acc
moveAcc,A[2];sssss654
and#00Fh;----s654
xchn;s654----
orA[1];s6543210
moveGRL,Acc
ret
將測量結(jié)果存儲在數(shù)據(jù)EEPROM中
為防止1-Wire總線偶然出現(xiàn)數(shù)據(jù)錯誤,演示代碼每次測量都執(zhí)行三次溫度轉(zhuǎn)換(A,B和C),并從中選擇一個結(jié)果存儲,選擇的依據(jù)為:
如果所有數(shù)據(jù)相同,則存儲該數(shù)據(jù)。
如果三個中有兩個數(shù)據(jù)相同(A=B,B=C或A=C),則選擇相同的數(shù)據(jù)存儲。
如果沒有數(shù)據(jù)相同,則取中間值存儲。例如,如果(A>B>C),則存儲B。
被選中的值被寫入數(shù)據(jù)EEPROM的一個字中。由于采樣結(jié)果為一個字節(jié),每個字的高字節(jié)被用來指示該記錄(也就是字)是否為空。如果高字節(jié)為0,該記錄/字為空,如果高字節(jié)非0,則低字節(jié)為有效溫度數(shù)據(jù)。這樣就能區(qū)分空記錄和存儲數(shù)據(jù)為0°C的有效數(shù)據(jù)。
;;Twooutofthreemajorityvote,orfailingthat,themeasurement
;;inthemiddleofthethree.
moveAcc,A[4]
cmpA[5]
jumpE,recordTempA;If(A==B),usethatvalue
cmpA[6]
jumpE,recordTempA;If(A==C),usethatvalue
moveAcc,A[5]
cmpA[6]
jumpE,recordTempB;If(B==C),usethatvalue
moveAcc,A[4]
subA[5]
jumpS,B_greaterThan_A;Signissetif(A-B)isnegative
;;If(A>B){
;;If(C>A)recordA(C>A>B)
;;If(B>C)recordB,(A>B>C)
;;elserecordC(A>C>B)
A_greaterThan_B:
moveAcc,A[4]
subA[6];A-C
jumpS,recordTempA;Signissetif(A-C)isnegative
moveAcc,A[5]
subA[6];B-C
jumpS,recordTempC;Signissetif(B-C)isnegative
jumprecordTempB
;;If(B>A){
;;If(C>B)recordB(C>B>A)
;;If(A>C)recordB,(A>B>C)
;;elserecordC(B>C>A)
B_greaterThan_A:
moveAcc,A[5]
subA[6];B-C
jumpS,recordTempB;Signissetif(B-C)isnegative
moveAcc,A[4]
subA[6];A-C
jumpS,recordTempC;Signissetif(A-C)isnegative
jumprecordTempB
recordTempA:
moveGRL,A[4]
jumprecordTemp
recordTempB:
moveGRL,A[5]
jumprecordTemp
recordTempC:
moveGRL,A[6]
jumprecordTemp
recordTemp:
moveA[15],GRL
moveGRL,#'@'
callTxCharBB
moveGR,DP[0]
moveGRL,GRH
callTxHexByteBB
moveGRL,DP[0]
callTxHexByteBB
moveGRL,#''
callTxCharBB
moveGRL,#'W'
callTxCharBB
moveGRL,A[15]
callTxHexByteBB
moveGRL,A[15];Lowbytecontainstempdata
moveGRH,#055h;Highbytemarksnonzeroentry
lcallUROM_loadData;WriteentrytodataEEPROM
callIncDP0_EE;Movetothenextentryposition
moveGR,#0000h;Eraseanydatathatexists
lcallUROM_loadData;Erasetheoldestentry
記錄采用循環(huán)方式,從數(shù)據(jù)EEPROM地址020h開始到05Fh結(jié)束,然后再回到開始處。之后每寫入一個新記錄,將擦除一個zui舊的記錄。當通過串行接口向外發(fā)送數(shù)據(jù)時,應(yīng)用程序通過查找前面是否又有空記錄的方式定位zui舊的記錄數(shù)據(jù)。
節(jié)省功耗
由于本應(yīng)用每分鐘僅記錄一次溫度數(shù)據(jù),而讀取DS1822數(shù)據(jù)并將其存儲到EEPROM中僅需幾秒鐘。多數(shù)時間應(yīng)用都在等待一分鐘的延時結(jié)束。根據(jù)應(yīng)用的要求,不需更改太多代碼即可將溫度記錄間隔拉長,比如到五分鐘、十分鐘或三十分鐘。為了減少等待期間對電池的消耗,應(yīng)盡可能降低功耗。
MAXQ3210所能提供的zui低功耗模式為待機模式。該模式下,程序停止運行,高頻晶振停止工作,電流降到微安量級。由于沒有其它器件還在工作,我們需要將MAXQ3210從待機模式周期性的喚醒來測量溫度。
這一要求可通過MAXQ3210的喚醒時鐘實現(xiàn)。這一時鐘依靠在待機模式仍然工作的內(nèi)部8kHz低電流環(huán)形振蕩器運行,能以zui長兩分鐘的可編程間隔喚醒微控制器。這種定時喚醒對于我們的應(yīng)用非常理想,在應(yīng)用中可將“鬧鐘”設(shè)為一分鐘,微控制器工作結(jié)束后接著進入待機模式以節(jié)省功耗,然后等待被喚醒再次采集數(shù)據(jù)。
;;Startthewakeuptimerfor60seconds.
moveCKCN.6,#1;Selectringoscillatormode
waitRing:
moveC,CKCN.5
jumpNC,waitRing;WaitforRGMD=1(runningfromring)
moveWUT,#30000;1/8kHz*30000*16=60seconds
moveWUTC,#0101b;Startthewakeuptimer(runningfromring)
moveIV,#wakeUpInt;Setinterrupthandlerforwakeupinterrupt
moveIMR.0,#1;Enableinterruptsfrommodule0
moveIC.0,#1;Globallyenableinterrupts
movePD0.7,#0;TurnoffoutputmodeforLEDpin
movePO0.7,#1;Returntodefaultstate(weakpullup)
moveCKCN.4,#1;GointoStopmode,waitforwakeupint
nop
jumpmainLoop;Backforanotherround
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wakeUpInt:
movePD0.7,#1;TurnonoutputmodeforLEDportpin
movePO0.7,#0;LighttheLED
moveCKCN.6,#1;Selectringoscillatormode
wakeUp_ring:
moveC,CKCN.5
jumpNC,wakeUp_ring;WaitforRGMD=1(runningfromring)
moveLC[0],#4000
djnzLC[0],$
movePO0.7,#1;LEDoff
moveLC[0],#4000
djnzLC[0],$
moveWUTC,#0;Clearwakeuptimerflag
moveCKCN.6,#0;Selectcrystalmode
wakeUp_xtal:
moveC,CKCN.5
jumpC,wakeUp_xtal;WaitforRGMD=0(runningfromcrystal)
moveGRL,#'W'
callTxCharBB
moveGRL,#'U'
callTxCharBB
moveGRL,#0Dh
callTxCharBB
moveGRL,#0Ah
callTxCharBB
reti
上傳溫度記錄數(shù)據(jù)
每次上電復(fù)位后,應(yīng)用程序向主機系統(tǒng)發(fā)送溫度記錄數(shù)據(jù)。數(shù)據(jù)通過10位異步串行接口以9600bps的速率發(fā)送(1位開始位,8位數(shù)據(jù)位,1位停止位)。MAXQ3210不帶硬件UART串口,需要使用一個端口引腳模擬實現(xiàn)。由于本應(yīng)用只需發(fā)送,不需接收,所以實現(xiàn)起來比較簡單。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Function:TxCharBB
;;Description:Transmitsa10-bitserialcharacter(bit-banged)
;;overP0.0.
;;Inputs:GRL-Charactertosend
;;Outputs:None
;;Destroys:PSF,AP,APC,A[0],LC[0],LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TxCharBB:
moveAPC,#080h;Standardmode,selectA[0]asAcc
moveAcc,GRL
movePO0.0,#0;STARTbitlow
moveLC[0],#BITLOOP
djnzLC[0],$
moveLC[1],#8;8bits
TxCharBB_bitLoop:
rrc;Getthenextbit
jumpC,TxCharBB_one
TxCharBB_zero:
movePO0.0,#0
sjumpTxCharBB_next
TxCharBB_one:
movePO0.0,#1
TxCharBB_next:
moveLC[0],#BITLOOP
djnzLC[0],$
djnzLC[1],TxCharBB_bitLoop
movePO0.0,#1;STOPbithigh
moveLC[0],#BITLOOP
djnzLC[0],$
moveLC[0],#BITLOOP
djnzLC[0],$
ret
要把溫度數(shù)據(jù)從帶符號的2進制、8位攝氏度數(shù)值轉(zhuǎn)換成容易識別的ASCII碼、華氏度數(shù)值,還需要增加較多代碼,但這些代碼簡單易懂。使用BCD(二進制編碼的十進制)運算規(guī)則執(zhí)行二進制到十進制的轉(zhuǎn)換,同時完成攝氏度到華氏度的轉(zhuǎn)換。
moveGR,@DP[0];Getthecurrententry
moveAcc,GRH;Checkthehighbyte
jumpZ,endOutput;Ifit'szerowe'redone
moveA[15],GRL;Savethelowbyte(tempvalue)
moveA[7],#0;Hundreds=0
moveA[6],#0;Tens=0
moveA[5],#0;Ones=0
moveA[4],#0;Tenths=0
moveA[3],#0;Add01.8perdegreeC
moveA[2],#1
moveA[1],#8
moveAcc,A[15];s6543210
jumpS,tempNegC
tempPosC:
moveGRL,#'+'
jumpZ,tempPrint
moveLC[0],Acc
tempPosC_loop:
callAddBCD
djnzLC[0],tempPosC_loop
moveA[3],#3
moveA[2],#2
moveA[1],#0;Add32.0
callAddBCD
jumptempPrint
tempNegC:
moveGRL,#'-'
neg
jumpZ,tempPrint;Negativezero
jumpS,tempPrint;-128isoutsidethesensorrangeanyhow
moveLC[0],Acc
tempNegC_loop:
callAddBCD
djnzLC[0],tempNegC_loop
moveA[3],#3
moveA[2],#2
moveA[1],#0;Subtract32.0
callSubBCD
jumpNC,tempPrint
moveGRL,#'+';Backtopositiveagain
jumptempPrint
tempPrint:
callTxCharBB;Printplus/minussign
callTxTempBB;Printtemperaturevalue+newline
callIncDP0_EE;Movetothenextentry
由于MAXQ3210的端口輸出采用5V電平,在與PC的COM串口連接之前必須使用外部器件(如MAX233ACWP)對輸出進行電平轉(zhuǎn)換。完成這一轉(zhuǎn)換后,可以使用任何標準終端仿真程序接收應(yīng)用輸出的數(shù)據(jù)。
RST
DS1822Detected:22A9CC15000000E5
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
+59.0
+62.6
+69.8
+59.0
+55.4
+55.4
+55.4
+55.4
+55.4
+55.4
+55.4
+57.2
+55.4
+55.4
+57.2
+57.2
+57.2
+57.2
+57.2
+57.2
應(yīng)用功能擴展
MAXQ3210具有1kx16(1024字)的EEPROM程序存儲空間,演示代碼只占用了其中的60%至70%。可對應(yīng)用代碼進一步優(yōu)化,使其僅占用50%的程序存儲空間。開發(fā)了應(yīng)用的核心功能后,可增加許多額外功能,使其成為功能完備的環(huán)境檢測系統(tǒng)。
多傳感器??梢暂p松地擴充1-Wire子程序,使其能夠訪問多個DS1822溫度傳感器,這些傳感器可以分別與單獨的端口連接(每端口接1個器件),或者在單根線上掛一組器件(多點配置)。多點配置結(jié)構(gòu)比較復(fù)雜,但能夠使MAXQ3210連接更多的器件。
多種傳感器類型。應(yīng)用可以連接多種不同類型的1-Wire傳感器,以測量不同環(huán)境參數(shù),包括:濕度(DS1923溫度/濕度記錄儀)、物理開關(guān)(DS2401硅序列號),或使用模數(shù)轉(zhuǎn)換器(DS2450,1-Wire接口、四通道、A/D轉(zhuǎn)換器)的通用傳感器。更多信息見MaximIC的1-Wire/iButton產(chǎn)品頁面。
聲音告警。MAXQ3210內(nèi)置壓電揚聲器驅(qū)動電路,因此可以非常簡單地加入高分貝揚聲器。當溫度轉(zhuǎn)換結(jié)果高于或低于門限后,將發(fā)出告警聲。
增加記錄容量。應(yīng)用可以按照寫數(shù)據(jù)EEPROM的方式將數(shù)據(jù)寫到未使用的程序EEPROM中。如果應(yīng)用代碼足夠小,可以用一部分程序EEPROM來存儲更多的溫度轉(zhuǎn)換結(jié)果,進而記錄更長時間的溫度數(shù)據(jù)。
雙向串行通信。通過位模擬方式實現(xiàn)雙向串行端口,要比僅僅實現(xiàn)發(fā)送端口更復(fù)雜,但MAXQ3210仍可輕松實現(xiàn)。有了雙向端口,主機可以請求MAXQ3210上傳記錄數(shù)據(jù),設(shè)置配置數(shù)據(jù)(如DS1822的溫度分辨率),按需訪問特定的傳感器,甚至可以通過串行接口更新MAXQ3210的固件。
結(jié)論
小封裝,低功耗,I/O靈活的MAXQ3210是電池供電的環(huán)境監(jiān)測應(yīng)用的理想選擇。許多1-Wire傳感器可被用來測量溫度、濕度等環(huán)境參數(shù),而這些傳感器又可僅通過一個端口實現(xiàn)與MAX3210的接口。zui后,數(shù)據(jù)還可以被存貯在MAXQ3210自帶的非易失EEPROM存儲器中,供以后查詢和分析。