pp.361ff.
LM75 (I2C)で取得した温度データをEEPROM (SPI)に記録してみる。1秒おきにデータを取得してEEPROMに書き込む、という処理を何回か繰り返したあと、書き込んだ値を一気に全部読み出す。結局ここではUSART、SPI、I2Cという3種類のシリアル通信を一度に使っている。
メインファイル:
#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; }