3.5.2_プログラムリスト(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> #__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倍した値) int ADValTmp, Temp10, temp; //SHT11 測定A-D値(Temp10:測定温度値を10倍した値) int StrCount; BYTE out_str1[17], out_str2[17], clock_Buf[7], Transmit_Buf[8], Receive_Buf[8], data_Buf[8]; BYTE TimerCount1, TimerCount2, TimerCount3, TimerCount4, SetModeNo, cursorNo_Set; BYTE sec, min, hour, day, week, month, year, samp, 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; bit MeasHR, MeasTmp; //SHT11測定中フラグ bit temp_mainus, LeftKey, RightKey, UpKey, DownKey, DispModeKey, SetModeKey, SetKey ,write_Set; bit Flag20mSec, Flag100mSec, Flag500mSec, Flag1000mSec; bit CR_exist, LF_exist; 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() { samp = 10; //sampling cycle(10min) 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(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); LCDPrintAt(0,0); LCDString(out_str1); LCDPrintAt(0,1); LCDString(out_str2); } if(SetModeNo == 1) { //LCD display sprintf(out_str1,"DATE %02d/%02d/%02d ",year_Set, month_Set, day_Set); LCDPrintAt(0,0); LCDString(out_str1); sprintf(out_str2,"TIME %02d:%02d:%02d ",hour_Set, min_Set, sec_Set); LCDPrintAt(0,1); LCDString(out_str2); DispCursor1(cursorNo_Set); } } if(Flag1000mSec) { Flag1000mSec = 0; // 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() { if(strcmp(Receive_Buf,"W01") == 0) { data_Buf[0] = 0x30; // 0 data_Buf[1] = 0x31; // 1 data_Buf[2] = 0x32; // 2 data_Buf[3] = 0x5F; // _ data_Buf[4] = 0x4C; // L data_Buf[5] = 0x0D; // 'CR' data_Buf[6] = 0x0A; // 'LF' data_Buf[7] = 0x00; // 'NULL' I2C_ROM_Write(0, 0x0000, data_Buf, 8); TxStr("W01 OK\r\n"); } if(strcmp(Receive_Buf,"W02") == 0) { data_Buf[0] = 0x41; // A data_Buf[1] = 0x42; // B data_Buf[2] = 0x43; // C data_Buf[3] = 0x5F; // _ data_Buf[4] = 0x4C; // L data_Buf[5] = 0x0D; // 'CR' data_Buf[6] = 0x0A; // 'LF' data_Buf[7] = 0x00; // 'NULL' I2C_ROM_Write(0, 0x0000, data_Buf, 8); TxStr("W02 OK\r\n"); } if(strcmp(Receive_Buf,"W03") == 0) { data_Buf[0] = 0x32; // 2 data_Buf[1] = 0x31; // 1 data_Buf[2] = 0x30; // 0 data_Buf[3] = 0x5F; // _ data_Buf[4] = 0x48; // H data_Buf[5] = 0x0D; // 'CR' data_Buf[6] = 0x0A; // 'LF' data_Buf[7] = 0x00; // 'NULL' I2C_ROM_Write(1, 0x0000, data_Buf, 8); TxStr("W03 OK\r\n"); } if(strcmp(Receive_Buf,"W04") == 0) { data_Buf[0] = 0x43; // C data_Buf[1] = 0x42; // B data_Buf[2] = 0x41; // A data_Buf[3] = 0x5F; // _ data_Buf[4] = 0x48; // H data_Buf[5] = 0x0D; // 'CR' data_Buf[6] = 0x0A; // 'LF' data_Buf[7] = 0x00; // 'NULL' I2C_ROM_Write(1, 0x0000, data_Buf, 8); TxStr("W04 OK\r\n"); } if(strcmp(Receive_Buf,"R01") == 0) { I2C_ROM_Read(0, 0x0000, data_Buf, 8); TxStr(data_Buf); } if(strcmp(Receive_Buf,"R02") == 0) { I2C_ROM_Read(1, 0x0000, data_Buf, 8); TxStr(data_Buf); } } void TxStr(BYTE *Transmit_Buf) { BYTE i; for(i = 0; i < 8; i++) { if(Transmit_Buf[i] !=0) AddTx(Transmit_Buf[i]); else break; } } // // 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) } トップページヘもどる |