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となりました。
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サイクルに入ります。