2011年3月21日月曜日

Arduinoとリアルタイムクロック -2: 定周期タイマー割り込み & スリープ



前回の続きでRTC8564と定周期割り込みライブラリの詳細。

< 資料 >
Sketch: Rtc8564AttachInterruptSleep ▼
Library Code:
    Rtc8564AttachInterrupt.h ▼
    Rtc8564AttachInterrupt.cpp ▼
Download: Rtc8564AttachInterrupt.zip


< Arduino と RTC8564 >

1. スレーブアドレスの指定

ArduinoでRTC8564モジュールを使用するには WireライブラリでI2C通信を行う必要がある。
RTC8564のスレーブアドレスは『0xA2』固定だが、Wireライブラリでは7ビットでデバイス特定をするため、
右に1ビットシフトさせて指定している。

Rtc8564AttachInterrupt.cpp line10

    0xA2 >> 1

2. 回路接続

ArduinoとRTC8564回路図
Arduinoではアナログ4ピン(SDA:データライン)、アナログ5ピン(SCL:クロックライン)を使う。
前回のHoneypotシールドではタイムスタンプ保存のための外部EEPROMにI2C通信を用いていたが、
その回路をRTC用に入れ替えればよい。

RTCからの外部定周期割り込み信号を受信するためには、Arduinoの割り込みピンであるデジタル2ピンをプルアップで接続する。
タイマーを設定されたRTCは、カウントダウンが終了するごとにRTC3ピンからArduino2ピンにLOWレベル(0V)の信号を発信する。
その0V信号を受信するために、スケッチでは以下の部分で設定をしている。



  // 割り込み設定
  pinMode(RTC_INTERRUPT_PIN, INPUT);
  digitalWrite(RTC_INTERRUPT_PIN, HIGH);


3. スリープ


SleepClass::powerDownAndWakeupExternalEvent()メソッド内で attachInterrupt()関数を使用してArduinoの割り込みピンを指定している。
なんでも作っちゃう、かも。さんのブログによると、このメソッドは「パワーダウン+外部割り込みによる復帰モード」であり、
スリープした後に指定したピンにLOWレベルの割り込み信号があった場合にスリープから復帰する、とある。



  // スリープ開始
  SleepClass::powerDownAndWakeupExternalEvent(0);


つまり、

スリープ
RTCからの定周期割り込み信号によってスリープから復帰
なんらかの処理をさせる
スリープ
...

というサイクルが可能になる。




< RTC8564 各種設定レジスタへの設定方法 >

1. レジスタ一覧

RTC8564は様々な機能を設定するためのレジスタを持っている。
詳細は、『RTC-8564NB アプリケーションマニュアル』を参照。

PAGE11より

2. Wireライブラリによるレジスタの設定方法

一覧の上から順に機能を挙げると
レジスタのAddress 機能
 00 (0x00)  時計、カレンダーを始めとした機能の停止/動作を制御
 01 (0x01)  各種割り込みイベント動作設定や各種割り込みイベント発生状況の把握
 02 (0x02)  時計カウンタ(秒)設定
 03 (0x03)  時計カウンタ(分)設定
 04 (0x04)  時計カウンタ(時)設定
 05 (0x05)  時計カウンタ(日)設定
 06 (0x06)  曜日カウンタ(曜日)
 07 (0x07)  時計カウンタ(月)設定
 08 (0x08)  時計カウンタ(年)設定
 09 (0x09)  アラーム割り込み(分)設定
 0A (0x0A)  アラーム割り込み(時)設定
 0B (0x0B)  アラーム割り込み(日)設定
 0C (0x0C)  アラーム割り込み(曜日)設定
 0D (0x0D)  出力端子のクロック出力設定
 0E (0x0E)  定周期割り込み機能を制御
 0F (0x0F)  定周期割り込み機能を使用する際のカウントダウン初期値を設定

となる。
レジスタごとに、0〜7のbitへ 1 か 0 を指定することにより、RTC8564モジュールを制御する。
Wireライブラリを使用した指定の仕方は以下のようになる。



  // Control2レジスタ(定周期タイマの繰り返し・割り込み時の信号発信設定)
  Wire.beginTransmission(RTC8564_SLAVE_ADRS);
  Wire.send(0x01);  // Control2 address
  Wire.send(0x11);  // TI/TP:1(繰り返し割り込みモード),TIE:1(定周期割り込み時、Lレベルの割り込み信号を発生させる)
  Wire.endTransmission();


上記は、割り込み動作設定レジスタの『0x01』(Control2) に16進数でいう『0x11』(2進数では "10001")をセットしている。
※ "RTC8564_SLAVE_ADRS" は、定数としてデバイスのスレーブアドレスを指定している。

レジスタへの設定値
2進数、8進数、10進数、16進数相互変換

次回は、Rtc8564AttachInterruptライブラリの詳細を書いてみる。




0 コメント:

コメントを投稿