ENGLISH 简体中文 日本語 한국어  



   
 
キーワードまたは型番を入力    




アプリケーションノート 3769

MAXQ3210を使用した1-Wire温度ロガーの構築

要約:このアプリケーションノートでは、MAXQ3210マイクロコントローラとDS1822 1-Wireディジタルサーモメータを使用した温度ロギングアプリケーションについて説明します。温度の値はMAXQ3210の内部EEPROMに記録されるため、後でダウンロードして分析することができます。

概要

環境モニタリングは、多くの場合、柔軟性のある小型のマイクロコントローラによって実行されます。パーソナルコンピュータのパワーとメモリ容量が大量に消費できるアプリケーションでは、専用マイクロコントローラを使用して、温度や湿度などの環境特性を測定するセンサと通信し、その後、測定した値を読み出して格納することができます。さらに柔軟性を高めるために、これらのマイクロコントローラをともにネットワーク化して1つの大きなシステムを構築し、より強力なシステムに測定値を送ります。次にこのシステムが設備や装置全体の測定値を分析し、記録することができます。

このアプリケーションノートでは、低電力のMAXQ3210電圧レギュレータマイクロコントローラを使用した環境モニタリングアプリケーションについて説明します。DS1822 (一方向の1-Wire®バスを介して電力と通信の両方を受信するディジタルサーモメータ)を追加することによって、最小限の部品を必要とするバッテリ駆動の不揮発性温度ロギングシステムを構成することが可能です。

デモコードは、ダウンロードして利用することが可能で、MAXQアセンブリ言語で記述され、MAX-IDE開発環境に付属する標準のマクロプリプロセッサとアセンブラを使用してコンパイルされました。コードはMAXQ3210の評価キット基板を対象としており、この基板を以下の追加部品とともに使用する必要があります(図1)。

  • 温度センサ:DS1822 Econo 1-Wireディジタルサーモメータ(TO-92パッケージ)
  • RS-232レベルシフタ:MAX233ACWP

図1. MAXQ3210 1-Wire温度ロガーのデモ回路で使用される部品
図1. MAXQ3210 1-Wire温度ロガーのデモ回路で使用される部品

設計目標

デモコードは以下のタスクを実行します(図2)。
  • (ビットバングされた) 1-Wireネットワークを介してDS1822温度センサと通信する
  • 1分に1回起動し、温度測定値を取得する
  • MAXQ3210の内部EEPROMデータメモリの不揮発性ログに温度測定値を記録する
  • 電源投入時、ビットバングされたシリアルポートを介して、温度ログの内容を9600ボーで送信する
  • 送信する前に、読み取りやすいASCIIフォーマット(10進の華氏温度)に温度を変換する
  • 要求があれば、マスタのクリアを実行する(データEEPROMに格納された温度ログを消去する)

図2. 温度ロギングアプリケーションの実行フロー
図2. 温度ロギングアプリケーションの実行フロー

MAXQ3210を使用する理由

ほとんどの低電力MAXQマイクロコントローラをこのデモの心臓部として使用することができますが、温度ロギングアプリケーションにはMAXQ3210が理想的です。
  • 内蔵電圧レギュレータ。MAXQ3210には5Vのレギュレータが内蔵されており、標準的な9Vのバッテリから直接駆動することが可能です。MAXQ3210には、他のデバイスが使用可能な5Vの安定化出力も備わっています(最大50mA)。システム内の他のすべてのデバイスが5Vで動作可能な場合、別の電源部品が不要になるため、この機能は重要です。
  • 低電力。MAXQ3210は、3.58MHzのフルスピードで動作するときであっても、最小限の電流(通常、約6mA)しか消費しません。低いクロックレートにシフトするか、またはストップモードでプロセッサを完全に停止することによって、非アクティビティ期間中のバッテリ電流をさらに減少することができます。MAXQ3210が内蔵する8kHzの内部リング発振器は、長期のウェイクアップタイマを駆動します。これによってあらかじめプログラム設定された間隔(最大2分間)の後にプロセッサをストップモードから起動することができます。
  • 内部データEEPROM。電力損失の場合、温度ロギングアプリケーションは記録したデータを保持します。このデータは、数時間、数日、場合によっては数週間にわたって収集されたものである可能性があります。MAXQ3210は、データ空間に64ワードのEEPROMメモリを個別に設けることによって、データの保持を単純化しています。ユーティリティROMのルーチンの単純な呼出しを使用することで、このメモリの16ビットワードを個別に書き込むことができます。EEPROM技術であるということは、データを書き込む前の消去作業が不要であるということです。より多くの空間が必要な場合、別のユーティリティROMルーチンを使用して類似の方法で、未使用のEEPROMプログラム空間に1ワードずつ書き込むことができます。この手順を実施するのにアプリケーション全体を再ロードする必要はありません。
  • 5Vのポートピン。すべてのMAXQマイクロコントローラと同様、MAXQ3210は、入力モード、出力モード、弱プルアップモード、およびトライステートモードで動作することが可能な、柔軟なポートピンを備えています。MAXQ3210は広範囲のインタフェースオプションも備えています。マイクロコントローラのピンは5Vレイルで動作するため、5V駆動のデバイスに直接接続することが可能で、また5V未満の低電力駆動のデバイスには(オープンドレイン/トライステートモードで動作する)プルアップ抵抗器を用いて接続することができます。このアプリケーションに必要なポートピンはごく少数であるため、大型のマイクロコントローラを使用すると、ほとんどの機能は使用されないままになります。
  • 圧電ホーンドライバ。圧電ホーン機能は、このアプリケーションでは使用していません。とはいえ、大きな警報音を駆動する機能は、多くのタイプの環境モニタリングアプリケーションで必要になります。煙検出器および一酸化炭素センサは代表例です。MAXQ3210は圧電ホーンへの直接インタフェース接続を提供し、ソフトウェアで非常に簡単に圧電ホーンを操作することができます。単一のビットによって、必要に応じてホーンをオンまたはオフにします。使用するホーンによっては、MAXQ3210は最大100dBに達するボリュームレベルを出力することができます。
  • 小型パッケージ。MAXQ3210は小型の24ピンTSSOPパッケージで提供されます。

1-Wireネットワークの駆動

ダラスセミコンダクタ/マキシムは、1-Wireネットワークインタフェース経由で動作する、さまざまなセンサやその他の部品を開発しました。このインタフェースは、単一のワイヤとグランドを介して電力と通信の両方を提供します。つまり、マイクロコントローラは単一のポートピンを介して1-Wireセンサと通信可能であるということです。

1-Wireネットワークは、単一のマスタと複数のスレーブで動作します(マルチドロップ)。タイミング要件は柔軟性があり、すべてのスレーブが、最大16kbpsの通信速度でマスタと同期することができます。各1-Wireセンサは全世界で固有の64ビットROM IDを持ち、1-Wireマスタは、ネットワーク上でのスレーブの物理的な位置に関係なく、各スレーブを個別に正確に選択することができます。

1-Wireラインはオープンドレインモードで動作します。このモードでは、マスタ(スレーブから出力が要求されたときはスレーブも)は、ラインをグランドにプルダウンしてゼロを示し、ラインをフロート状態のハイに維持して1を示します。通常、このプロセスは、ラインとVCCの間にディスクリートのプルアップ抵抗器を取り付けることによって実現されます。ただし、MAXQ3210はポートピンに弱プルアップモードがあり、ポートピンをプルアップモードに簡単に切り替えて、ラインをフロート状態のハイに維持することができます。したがって、MAXQ3210は外付け抵抗器を必要としません。マスタおよびスレーブはラインをローにプルダウンするだけであり、積極的にラインをハイにプルアップしないため、1-WireネットワークはワイヤードOR構成で動作します。これによって、複数のスレーブが1-Wireバス上で同時に送信しようとする状況におけるラインの衝突を防ぎます。

1-Wireネットワークを駆動するため、MAXQ3210はソフトウェアにより以下のタイプのタイムスロットを単一ピン上に生成します。1-Wireマスタがすべてのタイムスロットを開始するため、MAXQ3210はスレーブデバイスと通信していないときには1-Wireラインをモニタする必要はありません。1-Wire通信のタイミング要件の詳細については、DS1822のデータシートを参照してください。

  • リセットタイムスロットの幅は、約1msです。タイムスロットの前半では、マスタ(MAXQ3210)は1-Wireラインをローに保持します。タイムスロットの半ばで、マスタは1-Wireラインを解放し、フロート状態のハイに維持します。タイムスロットの後半で、ライン上のいずれの1-Wireスレーブも自分をリセットし、ラインをプルダウンすることによって応答します。このステップによって、1つ以上の1-Wireスレーブがライン上にあり、通信の準備ができていることをマスタに示す「プレゼンスパルス」を生成します。
  • 書込みタイムスロットの長さは約120µsで、1つ以上の1-Wireスレーブに0または1のビットを送信するためにマスタが使用します。どちらのタイプの書込みタイムスロットも、マスタが少なくとも1µsの間、ラインをローにプルダウンすることによって開始されます。1を送信するには、その後、タイムスロットの残りの時間、マスタは1-Wireラインを解放します(ラインをフロート状態のハイに維持します)。0を送信するには、タイムスロットが終了するまでマスタは引き続きラインをローに保持します。
  • 読取りタイムスロットの長さは約60µsで、スレーブデバイスから0または1のビットを読み取るためにマスタが使用します。タイムスロットは、マスタが少なくとも1µsの間、ラインをローにプルダウンすることによって開始されます。その後、マスタはラインを解放するため、スレーブはラインをローに保持するか(0を示す)、フロート状態のハイに維持することができるようになります(1を示す)。タイムスロットの途中で、マスタはラインをサンプリングして、スレーブからビット値を読み取ります。

MAXQ3210は、1µs当り約3.5命令サイクル(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つあります。1-Wireバス上のプルアップ抵抗器は1-Wireネットワーク上のデバイス数に応じて変化する可能性がありますが、一般的には約4k~5kと規定されています。ただし、MAXQ3210のポートピンの弱プルアップ抵抗器は50k~100kに近い値です。1-Wireバスがロー状態からフロート状態のハイに移行するまで必要以上に時間がかかるのを防ぐため、デモコードでは、P1.6で通常のハイ状態を短時間だけ駆動してバスをハイ状態に「移行」させてから、通常の弱プルアップモードにポートピンを設定しています。スレーブがバスをローにプルダウンしようとしている間にこのプロセスが実施されない限り、こうすることによって、1-Wireバス上で問題が生じることはなくなります。別の実装では、物理的な外付けのプルアップ抵抗器を1-Wireバス上に設置し、ゼロ状態の場合は標準的なローモードで、ハイ状態の場合はトライステートモードでポートピンを駆動します。

注:長距離にわたって敷設されている1-Wireネットワーク、または多数のデバイスが接続された1-Wireネットワークを構築するときには、さらなる検討事項が加わります。詳細については、以下のアプリケーションノートを参照してください。

DS1822による温度の測定

上記のコードを実装することによって、MAXQ3210は、ほとんどの1-Wireスレーブデバイスと通信することができますが、このアプリケーションではDS1822を対象としています。DS1822は、1-Wireマスタが読み取ることの可能な9ビット~12ビットの摂氏温度の測定値を提供する1-Wireスレーブデバイスです。ほとんどの1-Wireデバイスと同様、DS1822は、1-Wireバスから完全に駆動することができます(寄生電源と呼ばれる機能です)。

DS1822は-55°C~+125°Cを測定しますが、これは屋内/屋外の温度測定アプリケーションには十分すぎるほどです。温度の読取り値の分解能は、0.5°C (9ビットの場合)~0.0625°C (12ビットの場合)です。DS1822が温度測定を実施するのに必要な最大時間は、94ms (最も低い分解能の場合)~750ms (最も高い分解能の場合)です。このアプリケーションは単純な例であるため、9ビットの分解能を選択し、最下位ビット(0.5°C)を無視しています。これらのパラメータを使用すると、符号付き8ビットの温度値をそのままMAXQ3210の8ビットアキュムレータレジスタに当てはめることができます。

すべての1-Wireスレーブデバイスは、1-Wireマスタが1-Wireバス上に存在するスレーブ数を判断し、スレーブのROM ID値を読み取り、さらに個別にまたはグループとしてスレーブを起動することができるようにするための共通コマンドセットを実装しています。1-Wireスレーブが起動されると、マスタは、そのタイプの1-Wireデバイスに固有の追加コマンドをスレーブに送信することができます。他の起動されていないスレーブはすべて、次のリセットパルスが発生するまで待ってから1-Wireバスのモニタを再び開始します。

今回のアプリケーションでは、バス上に単一の1-Wireデバイスしか必要としないため、最も単純なコマンドセットを使用してこのデバイスにアクセスし、アプリケーションがデバイスのROM IDを追跡しなくてもすむようにしています。複数のデバイスがバス上にあるときには、このROM IDを使用してスレーブを識別します。DS1822のROM IDはアプリケーションによってある時点で読み取られていますが、これはデモ目的のためにのみ実施されています。

以下の1-Wireコマンドを実装しています。サポートされているその他のコマンドの詳細については、DS1822のデータシートを参照してください。

  • Read ROM [33h]。このコマンドは、単一の1-Wireスレーブしかバス上にないものと想定しています。1-Wireスレーブは、このコマンドを受信すると、1-Wireマスタに8バイトのROM IDを返送します。このID値は、48ビットのシリアル番号、8ビットのCRC、および8ビットのファミリコードで構成されています。ファミリコードは、デバイスのタイプを示します。DS1822の場合、この値は22hです。このRead ROMコマンドを受信した後、1-Wireスレーブが起動し、その後、デバイス固有のコマンドに応答します。
  • Skip ROM [CCh]。このコマンドは、バス上の1つ以上の1-Wireスレーブで使用することが可能で、ROM ID値とは無関係にすべてのスレーブを起動します。単一のスレーブがバス上に存在するとき、このコマンドは、スレーブのID値を読まなくても、デバイス固有のコマンドに対してスレーブを起動することができる簡単な方法です。このコマンドを複数のスレーブに使用するときには、以下のデバイス固有のコマンドによって、スレーブがマスタにデータを返送することがないようにしなければなりません。そうでないと、複数のスレーブがいろいろな値を送信することになり、データの衝突が生じる可能性があるからです。
  • Write Scratchpad [4Eh]。このコマンドはDS1822固有のコマンドです。したがって、Read ROMコマンドまたはSkip ROMコマンドを最初に使用してデバイスを起動する必要があります。1-Wireマスタは、このコマンドに続いて、DS1822の動作を設定するために使用される3つの追加コマンド(温度変換のためのビット分解能など)を送信します。詳細については、DS1822のデータシートを参照してください。
  • Read Scratchpad [BEh]。このコマンドもDS1822固有のものです。このコマンドを使用すると、1-WireマスタはDS1822から最大9バイトのデータを読み取ることができます。これらのバイトには、Write Scratchpadコマンドによって設定された設定レジスタ、さらに最新の温度変換値も含まれます。詳細については、DS1822のデータシートを参照してください。今回のアプリケーションの場合、変換された最新の温度値が含まれる最初の2バイトのみが重要です。
  • Convert Temperature [44h]。このコマンドはDS1822固有のものです。DS1822は、このコマンドを受信すると、温度を測定し、選択したビット分解能の値に変換します。この値は2つの内部レジスタに格納され、1-WireマスタはRead Scratchpadコマンドを使用してこのレジスタを読み取ることができます。

Convert Temperatureコマンドを実行すると、DS1822は、1-Wireラインの弱プルアップから提供することができる量よりも大きな電力(最大1.5mA)を必要とします。したがって、このコマンドが発行されると、温度変換が完了するまで、マスタは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ライン上での瞬間的な破損に対処するため、デモコードは、各測定期間に3つの温度変換(A、B、およびC)をDS1822上で実行しています。次に、デモコードは、以下の基準に基づいて測定値を選択して格納します。
  • 3つの値がすべて同じ場合、その値を格納します。
  • 3つの値のうち2つが一致する(A = B、B = C、またはA = C)場合、2つ一致するサンプル値を格納します。
  • 3つの値のいずれもが一致しない場合、中央のサンプル値を格納します。たとえば、(A > B > C)の場合、値Bを格納します。

選択した値をデータEEPROMの1ワードに書き込みます。サンプルは1バイト長しかないため、各ワードの上位バイトを使用して、ログ内のエントリ(すなわちワード)が空かどうかを示します。つまり、上位バイトが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を使用した後、循環します。新しいエントリを書き込むたびに、最も古いログエントリが消去されます。アプリケーションは、シリアルインタフェースを介して温度ログを送信するとき、直前に空白のエントリがある温度エントリを検索することによって、最も古いエントリを見つけます。

電力の節約

アプリケーションは毎分1つの温度エントリしか記録しないため、またDS1822の温度の読取りとEEPROMへの書込みには数秒しかかからないため、アプリケーションはほとんどの時間が非アクティブのままで、1分経過するのを待ちます。アプリケーションの要件によっては、この温度記録の間隔はより長くなり、コードをあまり追加しなくても、温度読取りの間隔が5分、10分、または30分になる可能性があります。これらの非アクティブな期間にバッテリの電力を不必要に消費することを避けるには、できる限り電力を節約する必要があります。

MAXQ3210で利用可能な最小電力状態は、ストップモードです。このモードでは、プログラムの実行が停止され、高周波水晶発振器がシャットダウンされるため、消費電力がµAレベルまで低下します。ただし、アプリケーション回路の他の部品がアクティブでないため、MAXQ3210自体がストップモードを定期的に解除して温度測定を行う手段が必要となります。 この後者の要件は、MAXQ3210のウェイクアップタイマによって実現されます。このタイマは、ストップモードでの8kHzの低電流内部リング発振器をオフにすることが可能で、あらかじめプログラム設定された期間(最大2分に設定可能)の後でマイクロコントローラを起動します。アプリケーションは「アラームクロック」を1分に設定し、電力を節約するためにストップモードに移行し、ウェイクアップタイマによりアプリケーションをアクティブモードに戻すのを待つことができるため、このタイミング動作は今回の要件に理想的です。

;; 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ビットの非同期シリアルデータ形式(1スタートビット、8データビット、1ストップビット)で9600ボーにて送信されます。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

温度値を符号付き8ビットバイナリの摂氏の値から、容易に読み取れるASCIIフォーマットの華氏の値に変換するには、もう少しコードが必要ですが、これは極めて容易です。バイナリから10進への変換は、BCD (2進化10進数)演算を使用し、摂氏から華氏への変換と同時に実施されます。

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コンバータ)などの特性を評価することができます。詳細については、マキシムのICウェブサイト[@]の1-Wire/iButton(R)製品のページを参照してください。
  • 警報。MAXQ3210は圧電ホーン駆動回路を内蔵しているため、温度の読取り値が指定したレベルを上回る、または下回るたびに音が鳴る高デシベルホーンを容易に追加することが可能です。
  • ログサイズの増加。アプリケーションは、データEEPROMと同じ方法で、プログラムEEPROMの未使用の部分に書き込むことができます。アプリケーションが十分に小さければ、プログラムEEPROMの一部を使用して、追加の温度ログサンプルを格納することによって、長期間のログに対応することができます。
  • 双方向シリアル通信。ビットバングされた双方向シリアルポートの実装は、送信専用のシリアルポートよりも複雑ですが、MAXQ3210の能力で十分に対応可能な範囲です。このプロセスによって、ホストは、ログをMAXQ3210からアップロードしたり、DS1822の温度分解能などの設定値を設定したり、要求に応じて特定のセンサを検索したり、さらにはシリアルネットワークを介してMAXQ3210に新しいファームウェアをアップロードしたりすることもできます。

結論

MAXQ3210は、小型で低消費電力、かつそのI/Oに柔軟性があることによって、バッテリ駆動の環境測定アプリケーションにとって理想的な選択肢になります。複数の1-Wireセンサを利用すれば、温度や湿度などのさまざまな環境条件を測定することができるようになります。また、これらのセンサは、わずか1つのポートピンでMAXQ3210に簡単にインタフェース接続することができます。最後に、MAXQ3210自体の不揮発性EEPROMメモリを使用してデータを格納することで、後で検索や分析にデータを利用することが可能です。


関連製品  APP 3769: Sep 15, 2006
DS1822 エコノ1-Wireディジタルサーモメータ フルデータシート
(PDF, 228kB)
無料
サンプル
MAXQ3210 電圧レギュレータ、圧電ホーンドライバ、およびコンパレータ内蔵、マイクロコントローラ フルデータシート
(PDF, 400kB)

自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。


We Want Your Feedback!



フィードバックをお寄せください。
内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。—マキシムはお客様からいただく訂正、提案を元に改善していきます。 このページを評価し、フィードバックを送信する。

 

ダウンロード、PDFフォーマットダウンロード、PDFフォーマット(80kB)
 AN3769, AN 3769, APP3769, Appnote3769, Appnote 3769

        •         •         •     プライバシーポリシー     •     法的お知らせ

    Copyright © 2009 by Maxim Integrated Products