3.5.3_プログラムリスト(動作テスト用)(THERMOHYGROLOGGER_User.c)
修正箇所(自動生成ファイルに記述追加)は、以下の青色の箇所です。
又、動作テスト用の修正箇所はマゼンタ色の箇所です。
#include "C:\\WIZ_C\\Ver17\\Projects\\THERMOHYGROLOGGER\\THERMOHYGROLOGGER_Auto.h"
#include "C:\\WIZ_C\\Ver17\\Projects\\THERMOHYGROLOGGER\\i2c.h" #include "C:\\WIZ_C\\Ver17\\Projects\\THERMOHYGROLOGGER\\SHTFunc.h" #include <stdlib.h> #include <Strings.h> #include <Delays.h> #__config _CONFIG1H, 0x02 #__config _CONFIG1L, 0x00 #__config _CONFIG2H, 0x0E #__config _CONFIG2L, 0x0E #__config _CONFIG3H, 0x01 #__config _CONFIG3L, 0x00 #__config _CONFIG4H, 0x00 #__config _CONFIG4L, 0x81 #define CalcTMP10() (ADValTmp-4000+5)/10; // SHT11 温度変換マクロ(10倍値) WORD ADValHR, hr10, hr; //SHT11 測定A-D値(hr10:測定湿度値を10倍した値) WORD EE_LogNo, EE_CtrlLogNo, EE_adrsLogWrite, EE_adrsLogRead, EE_Work1, EE_Work2, EE_Work3; int ADValTmp, Temp10, temp; //SHT11 測定A-D値(Temp10:測定温度値を10倍した値) int EE_SampReadLogNo, EE_SampdiffLogNo; BYTE out_str1[17], out_str2[17], Transmit_Buf[8], Receive_Buf[8], clock_Buf[7], data_Work[8], data_Buf[8], ctrl_Buf[8], EE_Erase[128]; BYTE TimerCount1, TimerCount2, TimerCount3, TimerCount4, SetModeNo, StrCount, cursorNo_Set, EE_uadrsLogWrite ; BYTE sec, min, hour, day, week, month, year, premin, time_Work1; BYTE sec_Set, min_Set, hour_Set, day_Set, month_Set, year_Set; BYTE temp_ndp, temp_ndp_disp, temp_dp, hr_ndp, hr_dp, bdat_H, bdat_L, PBBuf, dt1, dt2; bool MeasHR, MeasTmp; //SHT11測定中フラグ bit temp_mainus, LeftKey, RightKey, UpKey, DownKey, DispModeKey, SetModeKey, SetKey; bit Flag20mSec, Flag100mSec, Flag500mSec, Flag1000mSec; bit write_Set, EE_InitError, EE_LogWrite, EE_CtrlWrite, EE_Samp, Cmd_SampRead1; WORD CalcHR10(void); //SHT11 湿度変換関数(10倍値) void I2C_RTC_Write(BYTE *data); void I2C_RTC_Read(BYTE *data); void I2C_ROM_AdrsSet(BYTE uadrs, WORD adrs); void I2C_ROM_Write(BYTE uadrs, WORD adrs, BYTE *data, WORD size); void I2C_ROM_Read(BYTE uadrs, WORD adrs, BYTE *data, WORD size); void DispCursor1(BYTE cursorNo_Set); void TxStr(BYTE *Transmit_Buf); void CmdProc(); // // This file includes all user definable routines. It may be changed at will as // it will not be regenerated once the application has been generated for the // first time. // //******************************************************************************* // // Insert your interrupt handling code if required here. // Note quick interrupts are used so code must be simple // See the manual for details of quick interrupts. // void UserInterrupt() { // Insert your code here if(PIR1 & (1<<CCP1IF)) { PIR1 &= ~(1<<CCP1IF); TimerCount1 = TimerCount1 + 1; TimerCount2 = TimerCount2 + 1; TimerCount3 = TimerCount3 + 1; TimerCount4 = TimerCount4 + 1; if(TimerCount1 == 2) { Flag20mSec = 1; TimerCount1 = 0; } if(TimerCount2 == 10) { Flag100mSec = 1; TimerCount2 = 0; } if(TimerCount3 == 50) { Flag500mSec = 1; TimerCount3 = 0; } if(TimerCount4 == 100) { Flag1000mSec = 1; TimerCount4 = 0; } } #asmline goto UserIntReturn ; PIC Assembler - go back to interrupt routine } //******************************************************************************* // // Insert your initialisation code if required here. // Note that when this routine is called Interrupts will not be enabled - the // Application Designer will enable them before the main loop // void UserInitialise() { I2C_ROM_Read(0, 0x0000, data_Work, 4); dt1 = data_Work[0]; dt2 = data_Work[1]; EE_Work1 = (WORD)dt2 << 8; EE_Work2 = EE_Work1 | dt1; if(EE_Work2 > 16383) { EE_InitError = 1; EE_LogNo = 0; } else EE_LogNo = EE_Work2; if(EE_InitError) { ctrl_Buf[0] = EE_LogNo & 0x00FF; ctrl_Buf[1] = EE_LogNo >> 8; ctrl_Buf[2] = 0; ctrl_Buf[3] = 0; ctrl_Buf[4] = 0; ctrl_Buf[5] = 0; ctrl_Buf[6] = 0; ctrl_Buf[7] = 0; I2C_ROM_Write(0, 0x0000, ctrl_Buf, 8); Wait(20); } EE_CtrlLogNo = EE_LogNo; LCDClear(); INTCON |= 1<<PEIE; PIE1 |= 1<<CCP1IE; } //******************************************************************************* // // Insert your main loop code if required here. This routine will be called // as part of the main loop code // void UserLoop() { if(Flag20mSec) { Flag20mSec = 0; //LogData Read if((EE_CtrlWrite == 0) && (EE_LogWrite == 0) && (EE_Samp == 0)) { if(Cmd_SampRead1) { if(EE_SampdiffLogNo != 0) { if(EE_SampReadLogNo < 1) EE_SampReadLogNo = 16383; if(EE_SampReadLogNo > 16383) EE_SampReadLogNo = 1; if(EE_SampReadLogNo<8192) //1〜8191 { EE_adrsLogRead = WORD(EE_SampReadLogNo) * 8; I2C_ROM_Read(0, EE_adrsLogRead, Transmit_Buf, 8); } else //8192〜16383 { WORD(EE_adrsLogRead) = (EE_SampReadLogNo - 8192) * 8; I2C_ROM_Read(1, EE_adrsLogRead, Transmit_Buf, 8); } TxStr(Transmit_Buf); EE_SampReadLogNo = EE_SampReadLogNo + 1; EE_SampdiffLogNo = EE_SampdiffLogNo - 1; } else Cmd_SampRead1 = 0; } } else { //Sampling Data Edit //sampling cycle(10min) if(EE_Samp) { EE_Samp = 0; EE_LogNo = EE_LogNo + 1; if(EE_LogNo > 16383) EE_LogNo = 1; if(EE_LogNo<8192) //1〜8191 { EE_uadrsLogWrite = 0; EE_adrsLogWrite = EE_LogNo * 8; } else //8192〜16383 { EE_uadrsLogWrite = 1; EE_adrsLogWrite = (EE_LogNo - 8192) * 8; } // data_Buf[0] = year; data_Buf[0] = sec; data_Buf[1] = month; data_Buf[2] = day; data_Buf[3] = hour; data_Buf[4] = min; data_Buf[5] = temp_ndp; data_Buf[6] = hr_ndp; data_Buf[7] = ((temp_dp << 4) & 0xF0) + (hr_dp & 0x0F); EE_LogWrite = 1; } //EEPROM LogWrite if(EE_CtrlWrite) { EE_CtrlLogNo = EE_LogNo; ctrl_Buf[0] = EE_LogNo & 0x00FF; ctrl_Buf[1] = EE_LogNo >> 8; ctrl_Buf[2] = 0; ctrl_Buf[3] = 0; ctrl_Buf[4] = 0; ctrl_Buf[5] = 0; ctrl_Buf[6] = 0; ctrl_Buf[7] = 0; I2C_ROM_Write(0, 0x0000, ctrl_Buf, 8); EE_CtrlWrite = 0; } if(EE_LogWrite) { I2C_ROM_Write(EE_uadrsLogWrite, EE_adrsLogWrite, data_Buf, 8); EE_LogWrite = 0; EE_CtrlWrite = 1; } } } if(Flag100mSec) { Flag100mSec = 0; if(write_Set) { if(SetModeNo == 1) { //clock write(RTC) time_Work1 = sec_Set / 10; clock_Buf[0] = (time_Work1 << 4) + (sec_Set % 10); time_Work1 = min_Set / 10; clock_Buf[1] = (time_Work1 << 4) + (min_Set % 10); time_Work1 = hour_Set / 10; clock_Buf[2] = (time_Work1 << 4) + (hour_Set % 10); time_Work1 = day_Set / 10; clock_Buf[3] = (time_Work1 << 4) + (day_Set % 10); time_Work1 = month_Set / 10; clock_Buf[5] = (time_Work1 << 4) + (month_Set % 10); time_Work1 = year_Set / 10; clock_Buf[6] = (time_Work1 << 4) + (year_Set % 10); I2C_RTC_Write(clock_Buf); sec = sec_Set; min = min_Set; hour = hour_Set; day = day_Set; month = month_Set; year = year_Set; SetModeNo = 0; write_Set = 0; } } else { //clock read(RTC) I2C_RTC_Read(clock_Buf); time_Work1 = clock_Buf[0]; sec = ((time_Work1 >> 4) & 0x07) * 10 + (time_Work1 & 0x0F); time_Work1 = clock_Buf[1]; min = ((time_Work1 >> 4) & 0x07) * 10 + (time_Work1 & 0x0F); time_Work1 = clock_Buf[2]; hour = ((time_Work1 >> 4) & 0x03) * 10 + (time_Work1 & 0x0F); time_Work1 = clock_Buf[3]; day = ((time_Work1 >> 4) & 0x03) * 10 + (time_Work1 & 0x0F); time_Work1 = clock_Buf[5]; month = ((time_Work1 >> 4) & 0x01) * 10 + (time_Work1 & 0x0F); time_Work1 = clock_Buf[6]; year = ((time_Work1 >> 4) & 0x0F) * 10 + (time_Work1 & 0x0F); } // SHT11温度、湿度の測定完了チェック if(MeasHR) { // 湿度測定中 if(!(SHT_PORT & (1<<bitDATA))) { // 測定完了チェック // SHT11湿度測定終了 MeasHR = 0; //湿度を読み出す bdat_H = SHTRead(0); // read high byte(ACK) bdat_L = SHTRead(1); // read low byte(NOACK) ADValHR = ((WORD)bdat_H << 8) | bdat_L; // SHT11温度測定開始(14bit) SHTTSSeq(); // TSシーケンス開始 SHTWrite(0x03); // measure temperature MeasTmp = 1; // 温度測定中 } } else if(MeasTmp) { // SHT11温度測定中 if(!(SHT_PORT & (1<<bitDATA))) { // 測定完了チェック // SHT11温度測定終了 MeasTmp = 0; // 温度を読み出す bdat_H = SHTRead(0); // read high byte(ACK) bdat_L = SHTRead(1); // read low byte(NOACK) ADValTmp = ((int)bdat_H << 8) | bdat_L; } } } if(Flag500mSec) { Flag500mSec = 0; if(SetModeNo == 0) { //LCD display if(temp_mainus) { if(temp_ndp_disp <= 9) sprintf(out_str1,"%02d/%02d/%02d -%01d.%01d%cC",year,month,day, temp_ndp_disp, temp_dp, 0xdf); else sprintf(out_str1,"%02d/%02d/%02d -%02d.%01d%cC",year,month,day, temp_ndp_disp, temp_dp, 0xdf); } else sprintf(out_str1,"%02d/%02d/%02d %3d.%01d%cC",year,month,day, temp_ndp_disp, temp_dp, 0xdf); sprintf(out_str2,"%02d:%02d:%02d %3d.%01d%% ",hour,min,sec, hr_ndp, hr_dp); } if(SetModeNo == 1) { //LCD display sprintf(out_str1,"DATE %02d/%02d/%02d ",year_Set, month_Set, day_Set); sprintf(out_str2,"TIME %02d:%02d:%02d ",hour_Set, min_Set, sec_Set); } LCDPrintAt(0,0); LCDString(out_str1); LCDPrintAt(0,1); LCDString(out_str2); if(SetModeNo == 1) DispCursor1(cursorNo_Set); } if(Flag1000mSec) { Flag1000mSec = 0; //10min SAMPLING // if(min != premin) // { // premin = min; // if( (min == 0) || (min == 10) || (min == 20) || (min == 30) || (min == 40) || (min == 50) ) EE_Samp = 1; // } // SHT11湿度測定開始(12bit) SHTTSSeq(); // TSシーケンス開始 SHTWrite(0x05); // measure humidity MeasHR = 1; // 湿度測定中 hr10 = CalcHR10(); // 湿度値変換 Temp10 = CalcTMP10(); if((hr10 < 1000) && (Temp10 < 1000)) { hr = hr10; temp = Temp10; hr_ndp = BYTE(hr10 / 10); hr_dp = BYTE(hr10 % 10); temp_ndp_disp = BYTE(cabs(Temp10 / 10)); temp_dp = BYTE(cabs(Temp10 % 10)); if(((Temp10 % 10) >= 0) && ((Temp10 / 10) >= 0)) { temp_mainus = 0; temp_ndp = temp_ndp_disp; } else { temp_mainus = 1; temp_ndp = temp_ndp_disp | 0x80; } } } if(DispModeKey) { DispModeKey = 0; SetModeNo = 0; } if(SetModeKey) { SetModeKey = 0; SetModeNo = SetModeNo + 1; if(SetModeNo > 1) SetModeNo = 1; if(SetModeNo == 1) { sec_Set = sec; min_Set = min; hour_Set = hour; day_Set = day; month_Set = month; year_Set = year; cursorNo_Set = 0; LCDClear(); } } if(SetModeNo == 0) { UpKey = 0; DownKey = 0; LeftKey = 0; RightKey = 0; SetKey = 0; } if(SetModeNo == 1) { if(UpKey) { UpKey = 0; switch(cursorNo_Set) { case 0: if(year_Set >= 99) year_Set = 0; else year_Set = year_Set + 1; break; case 1: if(month_Set >= 12) month_Set = 1; else month_Set = month_Set + 1; break; case 2: if(day_Set >= 31) day_Set = 1; else day_Set = day_Set + 1; break; case 3: if(hour_Set >= 23) hour_Set = 0; else hour_Set = hour_Set + 1; break; case 4: if(min_Set >= 59) min_Set = 0; else min_Set = min_Set + 1; break; case 5: if(sec_Set >= 59) sec_Set = 0; else sec_Set = sec_Set + 1; break; } } if(DownKey) { DownKey = 0; switch(cursorNo_Set) { case 0: if(year_Set == 0) year_Set = 99; else year_Set = year_Set - 1; break; case 1: if((month_Set == 1) || (month_Set == 0)) month_Set = 12; else month_Set = month_Set - 1; break; case 2: if(day_Set == 1 || (day_Set == 0)) day_Set = 31; else day_Set = day_Set - 1; break; case 3: if(hour_Set == 0) hour_Set = 23; else hour_Set = hour_Set - 1; break; case 4: if(min_Set == 0) min_Set = 59; else min_Set = min_Set - 1; break; case 5: if(sec_Set == 0) sec_Set = 59; else sec_Set = sec_Set - 1; break; } } if(LeftKey) { LeftKey = 0; if(cursorNo_Set == 0) cursorNo_Set = 5; else cursorNo_Set = cursorNo_Set - 1; } if(RightKey) { RightKey = 0; if(cursorNo_Set == 5) cursorNo_Set = 0; else cursorNo_Set = cursorNo_Set + 1; } if(SetKey) { SetKey = 0; write_Set = 1; } } } // // 湿度値変換(計算結果の単位は X10%) // WORD CalcHR10(void) { WORD ad, x1, x2, x3, x4, cd10, b10; // 桁ごとの数値を取り出す ad = ADValHR; x1 = ad / 1000; ad = ad - 1000 * x1; x2 = ad / 100; ad = ad - 100 * x2; x3 = ad / 10; x4 = ad - 10 * x3; // 桁ごとにA-D値を掛け算する x1 = ADValHR * x1; x2 = (ADValHR * x2 + 5) / 10; // 小数点以下四捨五入 x3 = (ADValHR * x3 + 50) / 100; // 小数点以下四捨五入 x4 = (ADValHR * x4 + 500) / 1000; // 小数点以下四捨五入 x1 = x1 + x2 + x3 + x4; // 計算結果を合成 x2 = (x1 + 5) / 10; // 1/10する. 小数点以下四捨五入 cd10 = (28 * x2 + 50) / 100; x1 = (ADValHR * 4 + 5) / 10; x2 = (ADValHR * 5 + 500) / 1000; b10 = x1 + x2; return -40 + b10 - cd10; // 湿度値を10倍した整数値 } void DispCursor1(BYTE cursorNo_Set) { BYTE x, y; switch(cursorNo_Set) { case 0: x = 7; y = 0; break; case 1: x = 10; y = 0; break; case 2: x = 13; y = 0; break; case 3: x = 7; y = 1; break; case 4: x = 10; y = 1; break; case 5: x = 13; y = 1; break; } LCDPrintAt(x, y); LCDOnOff(1, 0, 1); } // // User occurrence code // // // Occurrence - A key has been pressed (or is repeating) // void KeyPress() { switch(KP4Value) { case 0:UpKey = 1;break; case 1:DownKey = 1;break; case 2:LeftKey = 1;break; case 3:RightKey = 1;break; case 4:DispModeKey = 1;break; case 5:SetModeKey = 1;break; case 6:SetKey = 1;break; } } // // Occurrence - Byte received on serial interface // void GetRX() { BYTE ch; if(GetRxSize() > 0) { ch = WaitRx(); if((ch == '\r') || (ch == '\n')) { Receive_Buf[StrCount] = 0; //NULL StrCount = 0; CmdProc(); } else { Receive_Buf[StrCount] = ch; StrCount = StrCount + 1; if(StrCount > 7) StrCount = 7; } } } void CmdProc() { Cmd_SampRead1 = 0; EE_SampdiffLogNo = 0; if(strcmp(Receive_Buf,"SAR1") == 0) { Cmd_SampRead1 = 1; EE_SampdiffLogNo = 144; EE_SampReadLogNo = int(EE_LogNo) - EE_SampdiffLogNo + 1; if(EE_SampReadLogNo < 1) EE_SampReadLogNo = EE_SampReadLogNo + 16383; } if(strcmp(Receive_Buf,"SAR2") == 0) { Cmd_SampRead1 = 1; EE_SampdiffLogNo = 1008; EE_SampReadLogNo = int(EE_LogNo) - EE_SampdiffLogNo + 1; if(EE_SampReadLogNo < 1) EE_SampReadLogNo = EE_SampReadLogNo + 16383; } if(strcmp(Receive_Buf,"SAR3") == 0) { Cmd_SampRead1 = 1; EE_SampdiffLogNo = 16383; EE_SampReadLogNo = int(EE_LogNo) - EE_SampdiffLogNo + 1; if(EE_SampReadLogNo < 1) EE_SampReadLogNo = EE_SampReadLogNo + 16383; } if(strcmp(Receive_Buf,"ERASE") == 0) { //LCD display sprintf(out_str1," EEPROM ERASE!! "); sprintf(out_str2," "); LCDPrintAt(0,0); LCDString(out_str1); LCDPrintAt(0,1); LCDString(out_str2); //EE-PROM ERASE BYTE i; WORD j, k; for(i = 0; i < 128; i++) EE_Erase[i] = 0; for(j = 0; j < 512; j++) { k = 128 * j; I2C_ROM_Write(0, k, EE_Erase, 128); Wait(10); I2C_ROM_Write(1, k, EE_Erase, 128); Wait(10); } EE_LogNo = 0; EE_CtrlLogNo = 0; EE_LogWrite = 0; EE_CtrlWrite = 0; EE_Samp = 0; } strcpy(Receive_Buf,""); StrCount = 0; } void TxStr(BYTE *Transmit_Buf) { BYTE i; for(i = 0; i < 8; i++) //8byte送信 AddTx(Transmit_Buf[i]); } // // I2C-RTC DATA WRITE (7byte Write: sec, min, hour, day, week, month, year) // void I2C_RTC_Write(BYTE *data) { BYTE i; I2CStart(I2C_START_NORM); I2CWrite(0xA2); // control byte (write) I2CWrite(0x02); // Address set (sec) for(i = 0; i < 7; i++) { I2CWrite(*data); data++; } I2CStop(); } // // I2C-RTC DATA READ (7byte Read: sec, min, hour, day, week, month, year) // void I2C_RTC_Read(BYTE *data) { BYTE i; I2CStart(I2C_START_NORM); I2CWrite(0xA2); // control byte (write) I2CWrite(0x02); // Address set (sec) I2CStart(I2C_START_CONT); I2CWrite(0xA3); // control byte (read) for(i = 0; i < 7; i++) { if(i != 6) *data = I2CRead(I2C_READ_ACK); else *data = I2CRead(I2C_READ_NOACK); data++; } I2CStop(); } // // I2C-EEPROM DATA WRITE // void I2C_ROM_Write(BYTE uadrs, WORD adrs, BYTE *data, WORD size) { int i; I2C_ROM_AdrsSet(uadrs, adrs); for(i = 0; i < size; i++) { I2CWrite(*data); data++; } I2CStop(); } // // I2C-EEPROM DATA READ // void I2C_ROM_Read(BYTE uadrs, WORD adrs, BYTE *data, WORD size) { int i; I2C_ROM_AdrsSet(uadrs, adrs); I2CStart(I2C_START_CONT); if(uadrs == 0) I2CWrite(0xA5); // control byte (write) else I2CWrite(0xA7); // control byte (write) for(i = 0; i < size; i++) { if(i != (size - 1)) *data = I2CRead(I2C_READ_ACK); else *data = I2CRead(I2C_READ_NOACK); data++; } I2CStop(); } // // I2C-EEPROM DATA READ/WRITE ADDRES SET // void I2C_ROM_AdrsSet(BYTE uadrs, WORD adrs) { I2CStart(I2C_START_NORM); if(uadrs == 0) I2CWrite(0xA4); // control byte (write) else I2CWrite(0xA6); // control byte (write) I2CWrite(adrs>>8); // EEPROM Address(H) I2CWrite(adrs); // EEPROM Address(L) } トップページヘもどる |