AVRのI2Cモジュール / リアルタイムクロックDS3231 / 32.768kHz出力を見てみる

DS3231の32kHz端子からは32.768kHz (= 215)のパルスが出せる。假にこのパルスを16ビットカウンターでカウントしたとすると、その最上位ビットが1になったときが1秒である。
f:id:ti-nspire:20200204102802p:plain:h250 f:id:ti-nspire:20200204101632p:plain:h250
f:id:ti-nspire:20200204103428p:plain:w600

#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);
}