ebayで購入したPro Micro にリアルタイムクロック「RTC-8564NB」を接続し、一定時間間隔で割り込みを発生するプログラムを作成しました。RTC-8564NBは、 「Raspberry PIでRTC-8564NBの時計プログラムの作成」で使用したものを使います。

Pro Microとリアルタイムクロック「RTC-8564NB」の接続

次のように各ピンを接続します。左側のピン番号がRTC-8564NBで右側のピン番号がPro Microです。リアルタイムクロック「RTC-8564NB」は、I2Cインタフェースを使用します。Pro Microもいろいろなバージョンがあるようなので、割り込みのビン(下記に示します)を確認して、それぞれ「D0」を変更してください。

  • 3 /INT -> D0
  • 4 Vss -> GND
  • 5 SDA -> D2
  • 6 SCL -> D3
  • 8 Vdd -> 3.3V

Pro Microは、次に示す5つの外部割込みを持っています。今回は、D2,D3がリアルタイムクロック「RTC-8564NB」のI2Cインタフェースに使用するため、D0(割り込み2)を使用しました。

  • D3 – 割り込み0
  • D2 – 割り込み1
  • D0 – 割り込み2
  • D1 – 割り込み3
  • D7 – 割り込み4

/INT (割り込みピン 割り込み信号は LOW レベルを出力)

RTC-8564NB用割り込み処理プログラム

Pro Microでリアルタイムクロック「RTC-8564NB」をI2Cインタフェースで接続し、78.125msごとに割り込みを発生するプログラムを次に示します。 Timer Control(アドレス:x0e)とTimer(アドレス:0x0f)を用いて、 定周期タイマ割り込み機能を制御を制御します。Timer ControlのTD1、TD0 は、定周期割り込みのソースクロックを指定します。今回は、周期は15.625msにしたので、TD1=0、TD0=1としました。Timerは 設定するタイマ値で、78.125msごとに割り込みを発生させたいので、「5」としました。割り込み処理関数messageは、attachInterrupt関数を用いて登録し、 割り込み番号と割り込みを発生させるトリガとに対応付けます。

#include <Wire.h>
#define I2C_ADDR (0xA2 >> 1)

void message() {
  Serial.println("INT");
}

void setup() {
  Serial.begin(9600);
  Serial.println("RTC Test Start");
  attachInterrupt(2, message, FALLING);  // 外部割り込みを開始する。
  Wire.begin();
  delay(1000);
 
// 実験用に初期化
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(0x00);
  Wire.write(0x20); // 00
  Wire.write(0x00); // 01
  Wire.write(0x00); // 02
  Wire.write(0x00); // 03
  Wire.write(0x00); // 04
  Wire.write(0x01); // 05
  Wire.write(0x01); // 06
  Wire.write(0x84); // 07
  Wire.write(0x13); // 08
  Wire.write(0x00); // 09
  Wire.write(0x00); // 0A
  Wire.write(0x00); // 0B
  Wire.write(0x00); // 0C
  Wire.write(0x00); // 0D
  Wire.write(0x00); // 0E
  Wire.write(0x00); // 0F
  Wire.write(0x00);
  Wire.endTransmission();

// タイマーを停止
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(0x0E);
  Wire.write(0b00000000); // 0E
  Wire.endTransmission();

// Control 2 の設定
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(0x01);
  Wire.write(0b00010001); // 02 bit4 TI/TP 動作モードを繰り返しに設定
                          //    bit0 TIE   /INT端子へ出力

  Wire.endTransmission();

// タイマーのカウント数を設定
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(0x0F);
  Wire.write(0b00000101); // 0F カウンタの回数を指定
  Wire.endTransmission();

// タイマーを開始
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(0x0E);
  Wire.write(0b10000001); // 0E bit7 TE   タイマー割り込み開始
                          //    bit1 TD1  1周期の間隔を設定 TD1,0 = 0,1 = 78.125ms
                          //    bit0 TD0
  Wire.endTransmission();
}
void loop() {
}

Pro MicroによるRTC-8564NBを使ったタイマー割り込み

Pro Microで割り込みを受け付けると、USB経由(私の環境では、COMポート14/9600BPSでした)でパソコンに接続したTeratermの画面上に、「INT」が繰り返し表示されます。

ロジアナで実際の波形を見ると、次のように時間間隔が78.14msとなりました。

RTC-8564NBによる78.125msのタイマー割り込み

I2CインタフェースのSCL/SDA各信号をロジアナで調べました。SCL(シリアルクロック)は基本的に、Pro Microから出力されます。RTC-8564NBは、このPro MicroからのSCLに合わせて、SDAの入出力を行います。つまり、SCLに合わせてSDAからデータを読み取り、あるいは逆に、SCLに合わせてSDAにデータを出力します。Pro MicroからRTC-8564NBへの転送(書き込み)では、RTC-8564NBに対してACKを返した後、そのままPro MicroからRTC-8564NBへデータを送信していきます。1バイトごとにRTC-8564NBがACKを返し、Waitサイクルに入ります。

I2CインタフェースのSCL/SDA各信号