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)
}




トップページヘもどる