DS3231の32kHz端子からは32.768kHz (= 215)のパルスが出せる。假にこのパルスを16ビットカウンターでカウントしたとすると、その最上位ビットが1になったときが1秒である。
#include <avr/io.h> #include <util/delay.h> #include "USART.h" #include "myI2Cv2.h" #include "DS3231.h" int main(){ initUSART(); DS3231 rtc; // リアルタイムクロックDS3231 (I2Cスレーブ)を実体化する。 myI2Cv2.enable(80); // AVRのI2Cモジュールを有効化する。 while(1){ printString("To enable the 32kHz output, enter 1. To disable, 0. "); uint8_t tf = getNumber(); if ( tf){rtc.enable32kHz();} // 32kHz端子から32.768kHzのパルスを出力する。 else if(!tf){rtc.disable32kHz();} // 32kHz端子からの出力を停止する。ハイインピーダンス状態になる。 } myI2Cv2.disable(); return 0; }
void enable32kHz(uint8_t tf=1); // 32kHz出力を有効化する。 void disable32kHz(); // 32kHz出力を無効化する。
void DS3231::enable32kHz(uint8_t tf){ myI2Cv2.start(); myI2Cv2.writeByte(ADDRESS_W); myI2Cv2.writeByte(CONTROL_STATUS); myI2Cv2.start(); myI2Cv2.writeByte(ADDRESS_R); uint8_t cs = myI2Cv2.readByteNACK(); // 一度0Fh番地(CONTROL_STATUS)の値を読み出して、 myI2Cv2.start(); myI2Cv2.writeByte(ADDRESS_W); myI2Cv2.writeByte(CONTROL_STATUS); if ( tf){myI2Cv2.writeByte(cs | (1 << 3));} // 目的のビット[3]をセットしてほかはさわらない。 else if(!tf){myI2Cv2.writeByte(cs & ~(1 << 3));} // 目的のビット[3]をクリアしてほかはさわらない。 myI2Cv2.stop(); } void DS3231::disable32kHz(){ enable32kHz(0); }