⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 完整的空调控制器程序
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : AUX VRV 柜机/挂机
COMPILER : AVR GCC/ICC
MODULE   : i2c.c
VERSION  : 1.0.0
DATE     : 2005/12/30
AUTHOR   : 朱坤
DESCRIPTION :  EEPROM routine

MODIFICATIONS :
******************************************************************************/
#include "i2c.h"
#include "ports.h"
#include "main.h"
#include "timer.h"
#include "swing.h"
#include "rem.h"
#include "fan.h"

#ifdef EnEEPROM

u8 EEPTm;       /* EEPROM 刷新时间间隔 20mS on 4mS */
u8 EEPCnt;      /* 参数序号,参数地址 * 2 */
u8 EEPBuf0;     /* 缓冲区,双字节 */
u8 EEPBuf1;

#ifdef EnDEBUG
u8 EEPTBuf[EEPIDMAX];
#endif

/*-----------------------------------------------------------------------------
ROUTINE NAME : SaveToEEPROM
INPUT/OUTPUT :
   EEPCnt: 参数代号,每个参数在 EEPROM 中占 2 个字节,因此,参数在 EEPROM
           中的地址为:EEPcnt*2
   EEPBuf: 缓冲区指针,存放待写的参数值
   EEPTm:  刷新时间间隔 20mS on 4mS
   EEPIDMAX: 参数个数

DESCRIPTION  : 向 EEPROM 写参数,EEPMAX 定义每个参数字节数
   在给定的时间间隔内,不停的刷新 EEPROM 中的参数

COMMENTS :
; 掉电记忆保存的内容(共15项)
; - 标示字节  5D
; - 内机配置字节 SysConfig
; - 设定温度     SetupTp
; - 内机工作模式 RunMode
; - 内机风机风速 FanStatus
; - 摆风状态     FDoorUnit
; - 内机功率     PowerConst
; - 摆风位置记忆 BjSaveL
;                BjSaveH
; - 制热时内机补偿温度  SetOffset
; - 内机ID              WJ_NJNo
; - 制冷调阀零点        SetOnCool
; - 制热调阀零点        SetOnHeat
; - 非调节温度          SetUnacc
; - 制热膨胀阀常开开度  SetOn
-----------------------------------------------------------------------------*/
void SaveToEEPROM(void)
{
   u8 i;

   if (EEPTm++ >= 100){
     EEPTm = 0;                     /* 清除间隔 */

     if (++EEPCnt >= EEPIDMAX) EEPCnt = 0;
     /* 修改参数时不更新内机参数 */
     //if ((AckTm >= 180) && (EEPCnt >= 6)) EEPCnt = 0;
     switch (EEPCnt){             /* 对参数进行处理 */
       case 0:
         i = 0x5D;               /* 标示字节 5D */
         break;
       case 1:
         i = SysConfig;          /* 内机配置字节*/
         break;
       case 2:
         i = SetupTp;            /* 设定温度(0x00-0F) */
         break;
       case 3:
         i = RunMode;            /* 开关机标志,内机工作模式 */
         break;
       case 4:
         i = FanStatus;          /* 内风机风速 */
         break;
#ifdef EnSWING
       case 5:
         i = FDoorUnit;          /* 扫风模式 */
         break;
#endif
       case 6:
         i = PowerConst;         /* 内机功率 */
         break;
       case 9:
#ifdef  ChigoXG1
#ifndef ChigoXG1Set
         i = SetOffset;          /* 制热时内机补偿温度 */
#else
         i = ChigoXG1Set;
#endif
#else
         i = 0x80;
#endif
         break;
#ifdef EnSTYLE5
       case 10:
         i = WJ_NJNo;            /* 内机ID  */
         break;
       case 11:
         i = SetOnCool;          /* 制冷调阀零点 */
         break;
       case 12:
         i = SetOnHeat;          /* 制热调阀零点 */
         break;
       case 13:
         i = SetUnacc;           /* 非调节温度 */
         break;
       case 14:
         i = SetOn;              /* 制热膨胀阀常开开度 */
         break;
#endif  /* EnSTYLE5 */
       default:
         i = 0;
         break;
     }

     EEPBuf0 = EEPROMReadByte((u16)(EEPCnt << 1));
     EEPBuf1 = EEPROMReadByte((u16)((EEPCnt << 1) + 1));
     if ((i != EEPBuf0) || (i != EEPBuf1)){
       EEPROMWriteByte((u16)(EEPCnt << 1), i);     /* 刷新 */
       EEPROMWriteByte((u16)((EEPCnt << 1) + 1), i);
     }
   }
}

void EEPROMWriteByte(u16 uiAddress, u8 ucData)
{
   WWD_Refresh();       /* 刷新看门狗 */

   /* Wait for completion of previous write */
   /* EECR: - - - - EERIE EEMWE EEWE EERE */
   while(EECR & (1<<EEWE));
   /* 等待 SPM 完成 */
   while (SPMCR & (1<<RWWSB));

   /* Set up address and Data Registers */
   EEAR = uiAddress;
   EEDR = ucData;
   DisableInterrupts(); /* 禁止中断 */
   EECR |= (1<<EEMWE);  /* Write logical one to EEMPE */
   EECR |= (1<<EEWE);   /* Start eeprom write by setting EEPE */
   EnableInterrupts();
}

u8 EEPROMReadByte(u16 uiAddress)
{
   WWD_Refresh();       /* 刷新看门狗 */

   /* Wait for completion of previous write */
   while(EECR & (1<<EEWE));
   /* 等待 SPM 完成 */
   while (SPMCR & (1<<RWWSB));

   EEAR = uiAddress;  /* Set up address register */
   EECR |= (1<<EERE); /* Start eeprom read by writing EERE */
   return EEDR;       /* Return data from Data Register */
}
#endif

void GetFromEEPROM(void)
{
   SysConfig = (u8)(1<<fEnMemo);
   RunMode = (u8)((1<<fLtdSwOn)|MODEAUTO);
//   FanStatus = FANAUTO_S;
//   SetFDoorUnit(SWINGAUTO);
   SetupTp = 0x80 + 24;   /* 设置缺省值 24 */

#ifdef  ChigoXG1
#ifndef ChigoXG1Set
   SetOffset = ChigoXG1Val;
#endif
#endif

#ifdef EnSTYLE5
   PowerConst = 5;        /* 2500W */
   SetOnCool = 0x81;      /* 1  -10 - 10 */
   SetOnHeat = 0x7F;      /* -1 -10 - 10 */
   WJ_NJNo = 1;           /* 缺省 1# */
   SetUnacc  = 1;         /* 1   0  - 10 */
   SetOn = 100;           /* 100 */
#else
#if (NJTYPE == 0)||(NJTYPE == 1)||(NJTYPE == 3)||(NJTYPE == 4)
   PowerConst = 3;        /* 1.5P */
#elif (NJTYPE == 2)||(NJTYPE == 5)
   PowerConst = 6;        /* 3P */
#endif
#endif /* EnSTYLE5 */

#ifdef EnEEPROM
   EEPCnt = 0;
   while (EEPCnt < EEPIDMAX){
     EEPBuf0 = EEPROMReadByte((u16)(EEPCnt << 1));
     EEPBuf1 = EEPROMReadByte((u16)((EEPCnt << 1) + 1));

     if (EEPBuf0 == EEPBuf1){
       if ((EEPCnt != 7) && (EEPBuf0 == 0x0FF)){
         EEPCnt = EEPIDMAX;
       }
       switch(EEPCnt){                /* 对参数进行处理 */
         case 0:
           if (EEPBuf0 != 0x5D) EEPCnt = EEPIDMAX;
           break;
         case 1:
           if ((u8)(EEPBuf0 & ~SYSCONMASK) == 0){
             SysConfig = EEPBuf0;   /* 内机配置字节 */
           }
           break;
         case 2:                      /* 设定温度 */
           if ((EEPBuf0 >= SetupTpMIN) &&
               (EEPBuf0 <= SetupTpMAX)) SetupTp = EEPBuf0;
           break;
         case 3:                             /* 开关机标志,内机工作模式 */
           if (ValBit(SysConfig,fEnMemo)){   /* 1: 允许掉电记忆 */
             RunMode = (u8)(EEPBuf0 & ((1<<fSysOnOff)|(1<<fLtdSwOn)|MODEMASK));
             SetBit(Sysflag,fSysInit);    /* 1:系统初始化标志 */
           } else {
             RunMode = (u8)(EEPBuf0 & ((1<<fLtdSwOn)|MODEMASK));
           }
           break;
         case 4:
           FanStatus = (u8)(EEPBuf0 & FANMASK_S); /* 内风机风速 */
           break;
#ifdef EnSWING
         case 5:
           FDoorUnit = (u8)(EEPBuf0 & SWINGMASK); /* 扫风模式 */
           break;
#endif
         case 6:
           if (EEPBuf0 != 0) PowerConst = EEPBuf0; /* 内机功率 */
           break;
#ifdef  ChigoXG1
#ifndef ChigoXG1Set
         case 9:                                /* 制热时内机补偿温度 */
           if ((EEPBuf0 >= 118) &&
               (EEPBuf0 <= 138)) SetOffset = EEPBuf0;
           break;
#endif
#endif
#ifdef EnSTYLE5
         case 10:
           if (((EEPBuf0 & NJNOMASK) >= WJ_NJNoMIN) &&
               ((EEPBuf0 & NJNOMASK) <= WJ_NJNoMAX)){
             WJ_NJNo = EEPBuf0;
           }
           break;
         case 11:    /* 制冷调阀零点 -10 - 10 */
           if ((EEPBuf0 >= 118) &&
               (EEPBuf0 <= 138)) SetOnCool = EEPBuf0;
           break;
         case 12:    /* 制热调阀零点 -10 - 10 */
           if ((EEPBuf0 >= 118) &&
               (EEPBuf0 <= 138)) SetOnHeat = EEPBuf0;
           break;
         case 13:    /* 非调节温度 0 - 10 */
           if (EEPBuf0 <= 10) SetUnacc = EEPBuf0;
           break;
         case 14:    /* 制热膨胀阀常开开度 */
           if (EEPBuf0 >= 40) SetOn = EEPBuf0;
           break;
#endif  /* EnSTYLE5 */
         default:
           break;
       }
     }
     EEPCnt++;       /* 下一个参数 */
   }
#endif  /* EnEEPROM */
}

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -