//********************************************************************** /*  『温度データロガー(ThermoLoggerV2)』  ■概要   1分周期:スイッチ(SW)を押さずに起動する。     約11日間の温度データを記録します。      131072バイト÷8バイト÷60分÷24時間   1秒周期:スイッチ(SW)を押しながら起動する。     約4.5時間の温度データを記録します。      131072バイト÷8バイト÷3600秒   格納フォーマットは、1データ8バイト構成で、次のようになります。     ”△△29.8”+CR+LF     ”△-12.4”+CR+LF */ //********************************************************************** #define SW GPIO.F3 #define LED GPIO.F2 #define ON 1 #define OFF 0 #define CR 0x0D #define LF 0x0A #define ACK 1 #define NO_ACK 0 #define STAT_START 1 #define STAT_STOP 0 #define CYCLE_SEC 1 #define CYCLE_MIN 60 //********************************************************************** unsigned short RTC_8564_Read(unsigned short addr) { unsigned short dat; // Soft_I2C_Start(); Soft_I2C_Write(0xA2); Soft_I2C_Write(addr); Soft_I2C_Start(); Soft_I2C_Write(0xA3); dat = Soft_I2C_Read(NO_ACK); Soft_I2C_Stop(); // return (dat); } //********************************************************************** void RTC_8564_Write(unsigned short addr, unsigned short dat) { Soft_I2C_Start(); Soft_I2C_Write(0xA2); Soft_I2C_Write(addr); Soft_I2C_Write(dat); Soft_I2C_Stop(); } //********************************************************************** void EEPROM_24LC1025_Page_Write(unsigned long addr, unsigned short *buf, unsigned short len) { unsigned short cnt; // Soft_I2C_Start(); if ((addr & 0x10000) == 0) Soft_I2C_Write(0xA0); else Soft_I2C_Write(0xA8); Soft_I2C_Write((addr >> 8) & 0xFF); Soft_I2C_Write(addr & 0xFF); for (cnt = 0; cnt < len; cnt++) { Soft_I2C_Write(buf[cnt]); } Soft_I2C_Stop(); } //********************************************************************** void main() { static unsigned char buf[10], cnt; static unsigned double ad; static unsigned long addr; static unsigned short oldDat, newDat, runStatus, cycleMode; // CMCON0 = 0b00000111; ANSEL.ANS0 = 1; ANSEL.ANS1 = 0; ANSEL.ANS2 = 0; ANSEL.ANS3 = 0; ADCON0.VCFG = 1; TRISIO = 0b00001011; OSCCON = 0b01110000; // Soft_I2C_Config(&GPIO, 4, 5); // RTC_8564_Write(0x00, 0x00); // runStatus = STAT_STOP; if (SW == 1) cycleMode = CYCLE_MIN; else cycleMode = CYCLE_SEC; // for (cnt = 0; cnt < 10; cnt++) { LED = ON; Delay_ms(50); LED = OFF; Delay_ms(50); } // while (1) { //スイッチが押されるのを待つ。 while (SW == 1) Delay_ms(10); runStatus = STAT_START; //RTCの秒または時間を取得する。 if (cycleMode == CYCLE_MIN) oldDat = RTC_8564_Read(0x03); else oldDat = RTC_8564_Read(0x02); addr = 0; while (runStatus == STAT_START) { LED = ON; Delay_ms(100); LED = OFF; //温度を100回測定し、その平均を求める。 ad = 0; for (cnt = 0; cnt < 100; cnt++) { ad += Adc_Read(0); Delay_ms(1); } ad = ad / 100.0; ad = ((((ad * 2.4365234375) - 268.0) / 6.25) - 25.0) * 10.0; //結果をEEPROMに書き込む。 IntToStr(ad, buf); buf[6] = buf[5]; buf[5] = '.'; buf[7] = CR; buf[8] = LF; EEPROM_24LC1025_Page_Write(addr, &buf[1], 8); addr += 8; if (addr >=0x20000) break; //RTCの秒または分が変化したかをチェックする。 while (1) { if (cycleMode == CYCLE_MIN) newDat = RTC_8564_Read(0x03); else newDat = RTC_8564_Read(0x02); if (oldDat != newDat) { oldDat = newDat; break; } // if (SW == 0) { runStatus = STAT_STOP; break; } // Delay_ms(10); } } // for (cnt = 0; cnt < 10; cnt++) { LED = ON; Delay_ms(50); LED = OFF; Delay_ms(50); } } } //**********************************************************************