設為首頁 | 會員中心
英雄联盟冠军皮肤

公告:

本站最新推出MARKING

貼片絲印代碼查詢功能

   
 
 
 

英雄联盟解说:用MAXQ3210構建溫度記錄儀

英雄联盟冠军皮肤 www.uzqdl.icu 發布時間:2010-05-09 10:37:23  來源:英雄联盟冠军皮肤  作者:  更新20191024 075905

 概述:環境監測通常需要小巧靈活的微控制器。如果在這類應用中使用個人電腦,對其計算能力和存儲容量而言都是一種浪費,可采用一個專用微控制器與溫、濕度傳感器或其它環境監測傳感器通信,讀取并存儲監測數據。為實現更高的靈活性,這些微控制器可連成網絡,各自將監測數據上傳到功能更強大的系統中,對整體環境參數進行分析記錄。838電子

本篇應用筆記介紹如何使用低功耗微控制器MAXQ3210實現環境監測應用。增加一個通過一根1-Wire®總線實現供電和通信的數字溫度傳感器DS1822,我們可用最少的元器件構建一個電池供電的非易失溫度記錄系統。

可以下載相關演示代碼。代碼采用MAXQ匯編語言編寫,在MAX-IDE開發環境自帶的標準宏匯編預處理器和匯編器中編譯。該代碼是為MAXQ3210評估板編寫,因此還需要以下器件(圖1)。838電子

  • 溫度傳感器:DS1822經濟型1-Wire數字溫度傳感器(TO-92封裝)
  • RS-232電平轉換器:MAX233ACWP

設計目標

演示代碼要完成以下任務(圖2):

  • 通過1-Wire網絡(位模擬方式)與溫度傳感器DS1822通信。
  • 每分鐘喚醒一次測量溫度。
  • 將溫度數據存儲在MAXQ3210內部的非易失EEPROM中。
  • 上電后以9600波特的速率通過位模擬串口發送溫度記錄數據。
  • 在發送前將溫度數據轉換成容易識別的ASCII格式(十進制華氏度)。
  • 根據主機要求清空存儲器(擦除在EEPROM中存儲的溫度數據)。

  • 圖1. MAXQ3210 1-Wire溫度記錄儀演示電路所需的元器件


圖2. 溫度記錄應用的程序流程圖

為何使用MAXQ3210?

幾乎所有的低功耗MAXQ微控制器都可以實現這一應用,但MAXQ3210更適合用于溫度記錄。

  • 集成穩壓器。MAXQ3210內部集成5V穩壓器,可以直接由標準9V電池供電。MAXQ3210的5V穩壓輸出還可為其它設備供電(最大電流50mA)。這一特性非常重要,這意味著如果其它器件也可采用5V供電,則不再需要另加單獨的電源芯片。
  • 低功耗。MAXQ3210僅需消耗很小的電流,即使以3.58MHz全速運行,典型值也僅為6mA。當降低頻率或處理器停止工作進入休眠狀態時,電池電流還可更低。MAXQ3210內部集成的8kHz環形振蕩器驅動一個長周期的喚醒時鐘,可在長達2分鐘的可編程間隔后將處理器從休眠狀態喚醒。
  • 內部數據EEPROM。在掉電時需要保存溫度記錄數據,這些數據可能要采集幾小時,幾天,甚至是幾周時間。MAXQ3210數據存儲空間有64個字的EEPROM,可非常容易的實現這一要求。EEPROM中的每個16位字都可調用Utility ROM中的一個函數單獨修改;EEPROM技術意味著在寫數據之前從來都不需要擦除操作。如果需要更多EEPROM空間,可將數據寫入任何未用的程序EEPROM空間,該寫入過程調用Utility ROM中的另一個函數以類似方式逐字修改,無需重載整個應用程序。
  • 5V端口引腳。與所有MAXQ微控制器一樣,MAXQ3210的端口引腳可靈活的設為輸入、輸出、弱上拉和三態。MAXQ3210還可提供多種接口選擇。由于微控制器的端口為5V電平,可以直連5V器件或通過上拉電阻連接低功耗器件(工作在三態/開漏模式)。由于這一應用所需端口很少,使用大的微控制器會浪費許多功能。
  • 壓電揚聲器驅動器。盡管壓電揚聲器功能在這一應用中沒有使用,但在許多類型的環境監測應用中都需要產生可聽見的告警聲。例如煙霧監測和一氧化碳監測。MAXQ3210可直接驅動壓電揚聲器,可用非常簡單的軟件實現這一功能。僅需1位控制位來打開或關閉壓電揚聲器。根據所選的揚聲器不同,MAXQ3210輸出的幅度可以達到100dB。
  • 小封裝:MAXQ3210提供小型的24引腳TSSOP封裝。

驅動1-Wire網絡

Dallas Semiconductor/Maxim提供一系列使用1-Wire網絡接口的傳感器和其它器件。該接口的數據通信和供電僅需通過一根數據線再加一根地線,這意味著微控制器僅需一個端口即可與1-Wire傳感器通信。

1-Wire網絡工作于一主多從模式(多點網絡)。時序非常靈活,允許從機以高達16kbps的速率與主機通信。每個1-Wire器件都有一個全球唯一的64位ROM ID,允許1-Wire主機精確選擇位于網絡任何位置的一個從機進行通信。

1-Wire總線采用漏極開路模式工作,主機(或需要輸出數據的從機)將數據線拉低到地表示數據0,將數據線釋放為高表示數據1。這通常通過在數據線和VCC之間連一個分立電阻實現,但MAXQ3210的端口引腳支持弱上拉模式,只需將引腳切換到弱上拉模式,數據線即可浮高。因此MAXQ3210不需外接電阻。由于主機和從機僅需將數據線拉低,而從不將數據線主動拉高,因此數據線可以實現“線-或”功能,這可防止多個從機試圖同時通過1-Wire總線發送數據時出現沖突。

為驅動1-Wire網絡,MAXQ3210利用軟件在一個引腳上實現以下類型的時隙。由于1-Wire所有時隙由主機啟動,因此當MAXQ3210不與從機通信時不需要監測1-Wire線路。有關1-Wire時序的更多詳細信息請參考DS1822的數據資料。

  • Reset時隙寬度大約為1ms。在時隙的前半部分,主機(MAXQ3210)將1-Wire總線拉低,然后主機將總線釋放,使其浮高。總線上的所有1-Wire從機復位,并在該時隙的后半段將總線拉低。這一步產生一個presence pulse (在線脈沖),向主機表明有一個或多個1-Wire從機在線,并且準備好開始通信。
  • Write時隙大約長120µs,主機利用這一時隙向1-Wire從機發送0或1。兩種寫時隙都是以主機將總線拉低至少1微秒開始。如果發送1,主機隨即釋放1-Wire總線(使其浮高)。如果發送0,主機在該時隙剩余的時間內一直將總線拉低。
  • Read時隙大約長60µs,主機利用這一時隙讀取從機發送的0或1。該時隙是以主機將總線拉低至少1微秒開始的。隨后主機將總線釋放,允許從機將總線拉低(表示0),或將總線釋放使其浮空為高(表示1)。主機在時隙中部采樣總線讀取從機發送來的數據。

由于MAXQ3210每微秒約等于三個半指令周期(3.58MHz時鐘頻率下),軟件可利用一個端口引腳(P1.6)方便的實現1-Wire協議。

#define OWIN       M0[09h].6   ; PI1.6
#define OWOUT      M0[01h].6   ; PO1.6
#define OWDIR      M0[11h].6   ; PD1.6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Function    : Reset1Wire
;;  Description : Sends a standard speed 1-Wire reset pulse on P1.6
;;                and checks for a presence pulse reply.
;;  Inputs      : None
;;  Outputs     : C - Cleared on success; set on error (no presence
;;                    pulse detected)
;;  Destroys    : PSF, LC[0]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Reset1Wire:
   move  OWDIR, #1           ; Output mode
   move  OWOUT, #0           ; Drive low
   move  LC[0], #RESET_LOW
   djnz  LC[0], $

   move  OWOUT, #1           ; Snap high
   move  LC[0], #SNAP
   djnz  LC[0], $

   move  OWDIR, #0           ; Change to weak pullup input
   move  LC[0], #RESET_PRESAMPLE
   djnz  LC[0], $

   move  C, OWIN             ; Check for presence detect

   move  LC[0], #RESET_POSTSAMPLE
   djnz  LC[0], $

   ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Function    : Write1Wire
;;  Description : Writes a standard speed 1-Wire output byte on P1.6.
;;  Inputs      : GRL - Byte to write to 1-Wire.
;;  Outputs     : None.
;;  Destroys    : PSF, AP, APC, A[0], LC[0], LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Write1Wire:
   move  APC, #080h          ; Standard mode, select A[0] as Acc
   move  Acc, GRL
   move  OWDIR, #1           ; Output drive mode
   move  LC[1], #8           ; 8 bits to write

Write1Wire_slot:
   move  OWOUT, #0           ; Drive low for start of write slot

   move  LC[0], #WRITE_PREBIT
   djnz  LC[0], $

   rrc                       ; Get the next bit
   jump  C, Write1Wire_one
Write1Wire_zero:
   move  OWOUT, #0           ; Keep the line low (zero bit)
   jump  Write1Wire_next
Write1Wire_one:
   move  OWOUT, #1
Write1Wire_next:
   move  LC[0], #WRITE_POSTBIT
   djnz  LC[0], $            ; Finish the time slot

   move  OWOUT, #1           ; Drive back high (end of slot)
   move  LC[0], #WRITE_RECOVERY
   djnz  LC[0], $            ; Recovery time period
   
   djnz  LC[1], Write1Wire_slot

   ret

實現讀時隙的功能與之類似。注意,在1-Wire總線上所有數據均為低有效位(LSB)先發。

利用MAXQ3210實現1-Wire時序時,另一點需要注意的是:盡管1-Wire總線上拉電阻的阻值與總線上的設備數有關,但通常在4kΩ到5kΩ之間??墑荕AXQ3210端口引腳上的弱上拉電阻為50kΩ到100kΩ。為了防止1-Wire總線從低電平到高電平轉換的時間過長,演示代碼先將P1.6輸出設為短暫的高電平,將總線強制拉高,然后變為正常的弱上拉模式。只要該過程不是在從機試圖將總線拉低的時候進行,就不會出現問題。另外,還可以在總線上再加一個分立的上拉電阻,這樣就可以正常的方式使端口輸出低代表0,輸出三態代表1。

注意:當構建的1-Wire網絡傳輸距離較遠或連接的從機數量較多時,還需要注意其他事項。

用DS1822測量溫度

盡管MAXQ3210可以使用上面的代碼與大多數1-Wire從機器件通信,在本應用中我們將主要考慮與DS1822通信。DS1822是一個1-Wire從機器件,可實現9到12位的攝氏溫度測量,測量結果可被1-Wire主機讀取。與多數1-Wire從機一樣,DS1822可以完全由1-Wire總線供電,我們稱之為寄生供電。

DS1822的測量范圍可達-55°C至+125°C,適用于多數的室內外溫度測量應用。溫度分辨率在9位下為0.5°C,12位下0.0625°C。進行一次溫度轉換所需時間在低分辨率下約為94ms,在最高分辨率下約為750ms。由于這是一個簡單應用,我們選擇9位分辨率,并忽略最低位(0.5°C)。這樣就可使整個8位帶符號溫度數據與MAXQ3210的8位累加器匹配。

所有的1-Wire從機器件都支持一個通用指令集,從而使得主機可以判斷總線上的從機數目,讀取ROM ID,并且可以與某一個從機或一組從機進行通信。一旦某個1-Wire從機被激活,主機可以針對該從機類型向其發送特殊指令。其它所有未被激活的從機均處于等待狀態,直到下一個復位脈沖出現,才開始再次監測1-Wire總線。

由于在我們的應用中總線上僅有一個1-Wire器件,我們可以使用最簡單的指令集訪問從機器件,不需要讀取從機的ROM ID。當總線上有多個從機器件時,ROM ID被用來區分不同的從機器件。我們的程序中也讀取了一次DS1822的ROM ID,但僅是為了演示。

我們將使用下面的1-Wire指令集,DS1822支持的其它指令請參考其數據資料。

  • Read ROM [33h]。這一指令假設1-Wire總線上只有一個從機器件。1-Wire 從機收到該指令后將其8字節的ROM ID發回1-Wire主機。這個ID包括48位序列號,8位CRC,8位家族碼。家族碼代表器件類型。DS1822的家族碼為22h。收到Read ROM指令后,1-Wire從機被激活,并響應后續與該從機器件相關的指令。
  • Skip ROM [CCh]。1-Wire總線上有一個或多個從機器件時都可以使用這一指令。這條指令激活總線上的所有從機,與從機的ROM ID無關。當總線上只有一個從機時,可利用這條指令不讀取從機ID而激活從機,使其接收后續相關指令。當總線上有多個從機時,如果使用這條指令,則必須保證后面的指令不會造成從機向主機發送數據。因為從機可能發送不同的數據而造成數據沖突。
  • Write Scratchpad [4Eh]。這是DS1822專用的指令,之前先用Read ROM 或Skip ROM指令激活器件。在該指令后1-Wire主機發送3字節的配置數據用來配置DS1822,包括溫度轉換的位分辨率。更多詳情請參考DS1822的數據資料。
  • Read Scratchpad [BEh]。這也是DS1822專用的指令,該指令允許主機從DS1822讀取最多9字節數據。這些數據包括通過Write Scratchpad指令設置的配置寄存器值,以及最近的溫度轉換結果。更多詳情請參考DS1822的數據資料。我們的應用僅需要最開始的兩個字節,這兩個字節就是最近的溫度轉換結果。
  • Convert Temperature [44h]。這是DS1822專用的指令。DS1822收到該指令后開始測量溫度,并將其按指定位分辨率轉換成數字量。結果存儲到兩個內部寄存器中,1-Wire主機可以通過Read Scratchpad讀取。

當執行Convert Temperature指令時,DS1822需要消耗更多的電流(最多1.5mA),可能超過1-Wire總線弱上拉所能提供的電流。因此,一旦主機發出這一指令,必須對1-Wire總線進行強上拉,直至溫度轉換結束。在此期間,1-Wire總線上不能有任何通信發生。MAXQ3210簡單地通過將P1.6端口從弱上拉切換成輸出高電平來滿足此要求。MAXQ3210端口驅動器能夠輸出足夠DS1822工作所需的電流。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Function    : ConvertAndReadTemp
;;  Description : Sends commands to measure temperature and read
;;                scratchpad from the DS1822.
;;  Inputs      : None.
;;  Outputs     : GRL - 8-bit signed temperature value, in degrees C.
;;  Destroys    : PSF, AP, APC, A[0], A[1], A[2], LC[0], LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ConvertAndReadTemp:
   call  Reset1Wire          ; Reset the DS1822

   move  GRL, #OW_SKIP_ROM   ; Select the DS1822
   call  Write1Wire
   move  GRL, #OW_CONVERT    ; Send temp convert command
   call  Write1Wire

   move  OWDIR, #1           ; Turn on strong pullup for draw current
   move  OWOUT, #1

   move  LC[0], #55          ; About a second
delay:
   move  LC[1], #0
   djnz  LC[1], $
   djnz  LC[0], delay

   call  Reset1Wire          ; Conversion completed; reset again

   move  GRL, #OW_SKIP_ROM   ; Select again
   call  Write1Wire
   move  GRL, #OW_RD_SCRATCH ; Read the scratchpad values
   call  Write1Wire

   call  Read1Wire
   move  A[1], GRL           ; Temp LSB  3210xxxx
   call  Read1Wire
   move  A[2], GRL           ; Temp MSB  sssss654

   move  Acc, A[1]           ; 3210xxxx
   and   #0F0h               ; 3210----
   xchn                      ; ----3210
   move  A[1], Acc
   move  Acc, A[2]           ; sssss654
   and   #00Fh               ; ----s654
   xchn                      ; s654----
   or    A[1]                ; s6543210

   move  GRL, Acc
   ret

將測量結果存儲在數據EEPROM中

為防止1-Wire總線偶然出現數據錯誤,演示代碼每次測量都執行三次溫度轉換(A,B和C),并從中選擇一個結果存儲,選擇的依據為:

  • 如果所有數據相同,則存儲該數據。
  • 如果三個中有兩個數據相同(A = B,B = C或A = C),則選擇相同的數據存儲。
  • 如果沒有數據相同,則取中間值存儲。例如,如果(A > B > C),則存儲B。

被選中的值被寫入數據EEPROM的一個字中。由于采樣結果為一個字節,每個字的高字節被用來指示該記錄(也就是字)是否為空。如果高字節為0,該記錄/字為空,如果高字節非0,則低字節為有效溫度數據。這樣就能區分空記錄和存儲數據為0°C的有效數據。

;;  Two out of three majority vote, or failing that, the measurement
;;  in the middle of the three.

   move  Acc, A[4]     
   cmp   A[5]
   jump  E, recordTempA      ; If (A==B), use that value
   cmp   A[6]
   jump  E, recordTempA      ; If (A==C), use that value
   
   move  Acc, A[5]
   cmp   A[6]             
   jump  E, recordTempB      ; If (B==C), use that value

   move  Acc, A[4]
   sub   A[5]
   jump  S, B_greaterThan_A  ; Sign is set if (A-B) is negative

;;  If (A > B) {
;;     If (C > A) record A     (C > A > B)
;;     If (B > C) record B,    (A > B > C)
;;           else record C     (A > C > B)

A_greaterThan_B:
   move  Acc, A[4]
   sub   A[6]                ; A-C
   jump  S, recordTempA      ; Sign is set if (A-C) is negative
   move  Acc, A[5]
   sub   A[6]                ; B-C
   jump  S, recordTempC      ; Sign is set if (B-C) is negative
   jump  recordTempB

;;  If (B > A) {
;;     If (C > B) record B     (C > B > A)
;;     If (A > C) record B,    (A > B > C)
;;           else record C     (B > C > A)

B_greaterThan_A:
   move  Acc, A[5]
   sub   A[6]                ; B-C
   jump  S, recordTempB      ; Sign is set if (B-C) is negative
   move  Acc, A[4]
   sub   A[6]                ; A-C
   jump  S, recordTempC      ; Sign is set if (A-C) is negative
   jump  recordTempB

recordTempA:
   move  GRL, A[4]
   jump  recordTemp

recordTempB:
   move  GRL, A[5]
   jump  recordTemp

recordTempC:
   move  GRL, A[6]
   jump  recordTemp

recordTemp:
   move  A[15], GRL

   move  GRL, #'@'
   call  TxCharBB
   move  GR, DP[0]
   move  GRL, GRH
   call  TxHexByteBB
   move  GRL, DP[0]
   call  TxHexByteBB

   move  GRL, #' '
   call  TxCharBB
   move  GRL, #'W'
   call  TxCharBB
      
   move  GRL, A[15]
   call  TxHexByteBB

   move  GRL, A[15]          ; Low byte contains temp data
   move  GRH, #055h          ; High byte marks nonzero entry
   lcall  UROM_loadData      ; Write entry to data EEPROM

   call  IncDP0_EE           ; Move to the next entry position
   move  GR, #0000h          ; Erase any data that exists
   lcall  UROM_loadData      ; Erase the oldest entry

記錄采用循環方式,從數據EEPROM地址020h開始到05Fh結束,然后再回到開始處。之后每寫入一個新記錄,將擦除一個最舊的記錄。當通過串行接口向外發送數據時,應用程序通過查找前面是否又有空記錄的方式定位最舊的記錄數據。

節省功耗

由于本應用每分鐘僅記錄一次溫度數據,而讀取DS1822數據并將其存儲到EEPROM中僅需幾秒鐘。多數時間應用都在等待一分鐘的延時結束。根據應用的要求,不需更改太多代碼即可將溫度記錄間隔拉長,比如到五分鐘、十分鐘或三十分鐘。為了減少等待期間對電池的消耗,應盡可能降低功耗。

MAXQ3210所能提供的最低功耗模式為待機模式。該模式下,程序停止運行,高頻晶振停止工作,電流降到微安量級。由于沒有其它器件還在工作,我們需要將MAXQ3210從待機模式周期性的喚醒來測量溫度。

這一要求可通過MAXQ3210的喚醒時鐘實現。這一時鐘依靠在待機模式仍然工作的內部8kHz低電流環形振蕩器運行,能以最長兩分鐘的可編程間隔喚醒微控制器。這種定時喚醒對于我們的應用非常理想,在應用中可將“鬧鐘”設為一分鐘,微控制器工作結束后接著進入待機模式以節省功耗,然后等待被喚醒再次采集數據。

;;  Start the wakeup timer for 60 seconds.

   move   CKCN.6, #1         ; Select ring oscillator mode
waitRing:
   move   C, CKCN.5
   jump   NC, waitRing       ; Wait for RGMD=1 (running from ring)

   move  WUT, #30000         ; 1/8kHz * 30000 * 16 = 60 seconds
   move  WUTC, #0101b        ; Start the wakeup timer (running from ring)

   move  IV, #wakeUpInt      ; Set interrupt handler for wakeup interrupt
   move  IMR.0, #1           ; Enable interrupts from module 0
   move  IC.0, #1            ; Globally enable interrupts

   move  PD0.7, #0           ; Turn off output mode for LED pin
   move  PO0.7, #1           ; Return to default state (weak pullup)
  
   move  CKCN.4, #1          ; Go into Stop mode, wait for wakeup int
   nop

   jump  mainLoop            ; Back for another round

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wakeUpInt:
   move  PD0.7, #1           ; Turn on output mode for LED port pin
   move  PO0.7, #0           ; Light the LED

   move   CKCN.6, #1         ; Select ring oscillator mode
wakeUp_ring:
   move   C, CKCN.5
   jump   NC, wakeUp_ring    ; Wait for RGMD=1 (running from ring)

   move  LC[0], #4000
   djnz  LC[0], $
   move  PO0.7, #1           ; LED off
   move  LC[0], #4000
   djnz  LC[0], $
   move  WUTC, #0            ; Clear wakeup timer flag

   move  CKCN.6, #0          ; Select crystal mode
wakeUp_xtal:
   move  C, CKCN.5
   jump  C, wakeUp_xtal      ; Wait for RGMD=0 (running from crystal)

   move  GRL, #'W'
   call  TxCharBB
   move  GRL, #'U'
   call  TxCharBB
   move  GRL, #0Dh
   call  TxCharBB
   move  GRL, #0Ah
   call  TxCharBB

   reti                       

上傳溫度記錄數據

每次上電復位后,應用程序向主機系統發送溫度記錄數據。數據通過10位異步串行接口以9600波特的速率發送(1位開始位,8位數據位,1位停止位)。MAXQ3210不帶硬件UART串口,需要使用一個端口引腳模擬實現。由于本應用只需發送,不需接收,所以實現起來比較簡單。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;  Function    : TxCharBB
;;  Description : Transmits a 10-bit serial character (bit-banged)
;;                over P0.0.
;;  Inputs      : GRL   - Character to send
;;  Outputs     : None
;;  Destroys    : PSF, AP, APC, A[0], LC[0], LC[1]
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

TxCharBB:
   move  APC, #080h          ; Standard mode, select A[0] as Acc
   move  Acc, GRL
   
   move  PO0.0, #0           ; START bit low
   move  LC[0], #BITLOOP
   djnz  LC[0], $

   move  LC[1], #8           ; 8 bits
TxCharBB_bitLoop:
   rrc                       ; Get the next bit
   jump  C, TxCharBB_one
TxCharBB_zero:
   move  PO0.0, #0
   sjump TxCharBB_next
TxCharBB_one:
   move  PO0.0, #1
TxCharBB_next:
   move  LC[0], #BITLOOP
   djnz  LC[0], $
   djnz  LC[1], TxCharBB_bitLoop

   move  PO0.0, #1           ; STOP bit high
   move  LC[0], #BITLOOP
   djnz  LC[0], $
   move  LC[0], #BITLOOP
   djnz  LC[0], $

   ret

要把溫度數據從帶符號的2進制、8位攝氏度數值轉換成容易識別的ASCII碼、華氏度數值,還需要增加較多代碼,但這些代碼簡單易懂。使用BCD (二進制編碼的十進制)運算規則執行二進制到十進制的轉換,同時完成攝氏度到華氏度的轉換。
   move  GR, @DP[0]          ; Get the current entry
   move  Acc, GRH            ; Check the high byte
   jump  Z, endOutput        ; If it's zero we're done
   move  A[15], GRL          ; Save the low byte (temp value)

   move  A[7], #0            ; Hundreds = 0
   move  A[6], #0            ; Tens     = 0
   move  A[5], #0            ; Ones     = 0
   move  A[4], #0            ; Tenths   = 0

   move  A[3], #0            ; Add 01.8 per degree C
   move  A[2], #1
   move  A[1], #8

   move  Acc, A[15]          ; s6543210
   jump  S, tempNegC

tempPosC:
   move  GRL, #'+'
   jump  Z, tempPrint

   move  LC[0], Acc
tempPosC_loop:
   call  AddBCD
   djnz  LC[0], tempPosC_loop
   
   move  A[3], #3
   move  A[2], #2
   move  A[1], #0            ; Add 32.0
   call  AddBCD

   jump  tempPrint

tempNegC:
   move  GRL, #'-'
   neg
   jump  Z, tempPrint        ; Negative zero
   jump  S, tempPrint        ; -128 is outside the sensor range anyhow
   
   move  LC[0], Acc
tempNegC_loop:
   call  AddBCD
   djnz  LC[0], tempNegC_loop

   move  A[3], #3
   move  A[2], #2
   move  A[1], #0            ; Subtract 32.0
   call  SubBCD

   jump  NC, tempPrint
   move  GRL, #'+'           ; Back to positive again
   jump  tempPrint
tempPrint:
   call  TxCharBB            ; Print plus/minus sign
   call  TxTempBB            ; Print temperature value + newline

   call  IncDP0_EE           ; Move to the next entry



由于MAXQ3210的端口輸出采用5V電平,在與PC的COM串口連接之前必須使用外部器件(如MAX233ACWP)對輸出進行電平轉換。完成這一轉換后,可以使用任何標準終端仿真程序接收應用輸出的數據。

RST
DS1822 Detected : 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

應用功能擴展

MAXQ3210具有1k x 16 (1024字)的EEPROM程序存儲空間,演示代碼只占用了其中的60%至70%??啥雜τ么虢徊接嘔?,使其僅占用50%的程序存儲空間??⒘擻τ玫暮誦墓δ芎?,可增加許多額外功能,使其成為功能完備的環境檢測系統。

  • 多傳感器。可以輕松地擴充1-Wire子程序,使其能夠訪問多個DS1822溫度傳感器,這些傳感器可以分別與單獨的端口連接(每端口接1個器件),或者在單根線上掛一組器件(多點配置)。多點配置結構比較復雜,但能夠使MAXQ3210連接更多的器件。
  • 多種傳感器類型。應用可以連接多種不同類型的1-Wire傳感器,以測量不同環境參數,包括:濕度(DS1923溫度/濕度記錄儀)、物理開關(DS2401硅序列號),或使用模數轉換器(DS2450,1-Wire接口、四通道、A/D轉換器)的通用傳感器。更多信息見Maxim IC網站的1-Wire/iButton®產品頁面。
  • 聲音告警。MAXQ3210內置壓電揚聲器驅動電路,因此可以非常簡單地加入高分貝揚聲器。當溫度轉換結果高于或低于指定門限后,將發出告警聲。
  • 增加記錄容量。應用可以按照寫數據EEPROM的方式將數據寫到未使用的程序EEPROM中。如果應用代碼足夠小,可以用一部分程序EEPROM來存儲更多的溫度轉換結果,進而記錄更長時間的溫度數據。
  • 雙向串行通信。通過位模擬方式實現雙向串行端口,要比僅僅實現發送端口更復雜,但MAXQ3210仍可輕松實現。有了雙向端口,主機可以請求MAXQ3210上傳記錄數據,設置配置數據(如DS1822的溫度分辨率),按需訪問特定的傳感器,甚至可以通過串行接口更新MAXQ3210的固件。

結論

小封裝,低功耗,I/O靈活的MAXQ3210是電池供電的環境監測應用的理想選擇。許多1-Wire傳感器可被用來測量溫度、濕度等環境參數,而這些傳感器又可僅通過一個端口實現與MAX3210的接口。最后,數據還可以被存貯在MAXQ3210自帶的非易失EEPROM存儲器中,供以后查詢和分析

 


來頂一下
英雄联盟冠军皮肤
英雄联盟冠军皮肤
分享到:
發表評論

 共有人參與,請您也說幾句看法

 
   驗證碼: 看不清楚,點擊刷新 看不清楚,點擊刷新