AVRのI2CとSPI / 温度センサーLM75BDとEEPROMとによるデータロガー / データを取得してEEPROMに書き込む

pp.361ff.
LM75 (I2C)で取得した温度データをEEPROM (SPI)に記録してみる。1秒おきにデータを取得してEEPROMに書き込む、という処理を何回か繰り返したあと、書き込んだ値を一気に全部読み出す。結局ここではUSART、SPI、I2Cという3種類のシリアル通信を一度に使っている。
f:id:ti-nspire:20200128095359p:plain:h270 f:id:ti-nspire:20200128095557p:plain:h270 f:id:ti-nspire:20200128095724p:plain:h270

メインファイル:

#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include "USART.h"

#include "myI2Cv2.h"
#include "LM75v2.h"

#include "mySPIv2.h"
#include "EEPROM25_256v2.h"

int main(){
    initUSART();

    LM75v2 tempSensor(3); // ユーザー定義アドレス3 (0~7)のI2Cスレーブ(LM75)を実体化する。
    myI2Cv2.enable(80);   // システムクロックの80分周をI2CクロックとしてAVRのI2Cモジュールを有効化する。

    EEPROM25_256v2 rom('B', 2); // PB2を!SS端子とするSPIスレーブ(EEPROM)を実体化する。PB3~PB5は!SS端子に指定してはならない。
    mySPI.enable(128, 0, 'M');  // (システムクロックの分周比, モード0, MSBファースト)でSPIモジュールを有効化する。

    int16_t tempRaw;
    float   tempFloat;
    while(1){

        printString("----current temp----\n");
        for(int address=0; address<10; ++++address){   // (2バイトずつ書き込むのでアドレスは2ずつインクリメントする)
            tempRaw = tempSensor.getTempRaw();         // 2バイトの生データをLM75から取得して、
            rom.writeWord(address, tempRaw);           // EEPROMに書き込んで、
            printFloat(tempSensor.raw2float(tempRaw)); // 確認のため温度に変換して表示する。を何度か繰り返す。
            printString("\n");
            _delay_ms(1000);
        }
        printString("\n");
        
        printString("----dumped temp----\n");
        for(int address=0; address<10; ++++address){   // (2バイトずつ読み出すのでアドレスは2ずつインクリメントする)。
            tempRaw = rom.readWord(address);           // 2バイトの生データをEEPROMから読み出して、
            printFloat(tempSensor.raw2float(tempRaw)); // 確認のため温度に変換して表示する。を何度か繰り返す。
            printString("\n");
        }
        printString("\n");
    }

    //myI2Cv2.disable(); // I2Cを無効化する。
    return 0;
}