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

📄 rem.c

📁 空调控制程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : AUX VRV
COMPILER : AVR GCC/ICC
MODULE   : rem.c
VERSION  : 1.0.0
DATE     : 2006/01/02
AUTHOR   : 朱坤
DESCRIPTION : 遥控接收或线控器收发[T0]

MODIFICATIONS :
******************************************************************************/
#include "rem.h"
#include "ports.h"
#include "timer.h"
#include "main.h"
#include "buz.h"
#include "fan.h"
#include "adc.h"
#include "led.h"
#include "pzf.h"
#include "i2c.h"
#include "rscom.h"
#include "swing.h"

u8 LcSt0Cnt;                 /* 低电平计时 */
u8 *LcByteCnt;               /* 字节计数 */
u8 LcBitCnt;                 /* 位计数   */

#ifdef EnSTYLE5
#ifdef EnSCOM
u8 LcBufAdr[15];             /* 遥控接收、线控器接收、发送缓冲区 */
#else
u8 LcBufAdr[13];             /* 遥控接收缓冲区 */
#endif
#else
u8 LcBufAdr[13];             /* 遥控接收缓冲区 */
#endif
u8 LcInHiCnt;                /* 高电平计时 */
u8 LcFlag;                   /* 标志位   */
#define fLcRxOk   7
#define fLcTxRxSc 6
#define fLcTx     5          /* 1: Tx, 0: Rx    */
#define fLcTxLo   4          /* 1: 高低电平标志 */
#define fLc388    3          /* 1: 388   0: AUX */

u8 AckTm;                    /* 参数修改锁定计时 3分钟 */

#ifdef EnSCOM
u8 ErrFlashCnt;              /* 循环发送故障码计数 */
u8 LcComTm;                  /* 若线控器一直处于发送状态,强制为接收状态 */
u8 LcMonCnt;                 /* 线控器通信故障计时 */
u8 ErrCnt;                   /* 循环发送故障码计时 */
u8 LcInitCnt;                /* 系统初始化计数 */
u8 LcInitTmr;                /* 系统初始化计时 */
#endif

const u8 LcRxMod_Tab[] = {MODEAUTO,MODECOOL,MODEDRY,MODEFAN,MODEHEAT,MODEAUTO,MODEAUTO};
const u8 ModeAux[] =     {MODEAUTO,MODECOOL,MODEDRY,MODEDRY,MODEHEAT,MODEHEAT,MODEFAN};
const u8 LcRxFan_Tab[] = {FANAUTO_S,FANHI_S,FANMI_S,FANLO_S,FANPO_S,FANEC_S,FANAUTO_S,FANAUTO_S};
const u8 FanAux[] =      {FANPO_S,FANHI_S,FANMI_S,FANLO_S,FANEC_S,FANAUTO_S,FANAUTO_S,FANAUTO_S};

#ifdef EnSCOM
const u8 LcComTx_IFan[] = {0x00,0x30,0x20,0x10,0x00,0x50,0x00,0x40};
const u8 LcComTx_IMod[] = {0x00,0x04,0x01,0x02,0x03,0x04,0x01,0x03};
  #ifdef EnSTYLE5
const u8 Tab_DErr_No[] = {    /*定频外机系统*/
       46,47,48,49,50,51,52,53,
       54,55,56,57,58,59,60,61,
       62,63,64,65,66,67,68,69,
       70,71,72,73,74,75,76,77};
const u8 Tab_BErr_No[] = {    /* 变频外机系统 */
       30,31,32,33,34,35,36,37,
       38,39,40,41,42,43,44,45,
        1, 2, 3, 4, 5, 6, 7, 8,
       9, 10,11,12,13, 0, 0, 0,
       20,21,22, 0, 0, 0, 0, 0,23};
const u8 Tab_NErr_No[] = {    /* 内机故障代码*/
       80,82,81,83,84,88,87,89,
       90,93,91,0,0,0,0,0};   /* 90:PG风机故障; 93: 房卡断开 */
  #else
const u8 Tab_Err_No[] = {
        3,        /* 室外压缩机排气温度过高*/
        6,        /* 缺氟或换向阀故障*/
        2,        /* 室外机交流输入电流过大*/
        7,        /* 室外机交流输入电流采样故障*/
        5,        /* 室外机直流母线电压异常*/
        8,        /* 室内机总功率过大*/
        4,        /* 室外机传感器故障*/
        1,        /* 变频器模块保护*/
        12,       /* 室温传感器故障*/
        15,       /* 细管传感器故障*/
        13,       /* 室内盘管传感器故障*/
        16,       /* 粗管传感器故障*/
        11,       /* 室内机地址冲突*/
        14,       /* 线控器与室内机通讯故障*/
        11,       /* 室内机与室外机通讯故障*/
        8,        /* 室内机总功率过大*/
        17,       /* PG风机故障*/
        18,       /* 房卡断开*/
        10,       /* 水泵故障*/
        0,0,0,0,0};
  #endif
#endif

/*-----------------------------------------------------------------------------
ROUTINE NAME : TIMA_Int
INPUT/OUTPUT : None

DESCRIPTION  : T2 Interrupt Service Routine

COMMENTS     : 线控器收发 0.256mS
-----------------------------------------------------------------------------*/
#ifdef AVRGCC
SIGNAL(SIG_OUTPUT_COMPARE2)
#else
#pragma interrupt_handler TIMA_Int:iv_TIMER2_COMP
void TIMA_Int(void)
#endif
{
#ifdef EnSCOM
   if (ValBit(LcFlag,fLcTx)){         /* 线控器发送 */
     if (ValBit(LcFlag,fLcTxLo)){     /* 1: 高电平标志 */
       ClrBit(LcFlag,fLcTxLo);
       SetBit(pLCTx,pbLCTx);          /* 低电位 */
       if (ValBit(LcFlag,fLcTxRxSc)){
         OCR2 += 768/16;              /* 0.768mS */
       } else {
         OCR2 += 3840/16;             /* 3.84mS */
       }
     } else {
       SetBit(LcFlag,fLcTxLo);
       ClrBit(pLCTx,pbLCTx);          /* 高电位 */
       if (ValBit(LcFlag,fLcTxRxSc)){
         if (LcSt0Cnt == 0) LcFlag = 0;
         if ((u8)(*LcByteCnt & LcBitCnt) == 0){
           OCR2 += 768/16;            /* 0.768mS */
         } else {
           OCR2 += 2304/16;           /* 2.304mS/3.072mS/3.4mS */
         }
         if ((LcBitCnt <<= 1) == 0){
           LcBitCnt = 1;
           LcByteCnt++;
           --LcSt0Cnt;
         }
       } else {
         OCR2 += 3840/16;             /* 3.84mS */
         SetBit(LcFlag,fLcTxRxSc);
         LcBitCnt = 1;
         LcByteCnt = LcBufAdr;
         if (LcBufAdr[0] == 0x7E){
           LcSt0Cnt = (u8)((LcBufAdr[1] & 0x0F) + 4);
         } else {
           LcSt0Cnt = 8;              /* 8字节 */
         }
         LcComTm = 0;
       }
     }
   } else {                           /* 0.256mS 线控器接收 */
#endif
     OCR2 += 256/16;                  /* 0.256mS */

    /* 388 遥控器(含参数设定遥控器、按388码格式发送的线控器)
                  (6.1mS, 7.4mS, 3.4mS,  1.4mS,  0.6mS)
     * 五型线控器 (3.84mS,3.84mS,2.304mS,0.768mS,0.768mS)
     * AUX 遥控器 (9mS,   4.5mS, 1.69mS, 0.56mS, 0.56mS)  */
     if (!ValBit(LcFlag,fLcRxOk)){    /* 尚未处理,不接收 */
#ifdef EnSCOM
        if (ValBit(Sysflag1,f1XK_YK)){ /* 1: 线控器,0:遥控器 */
          ClrBit(pLCTx,pbLCTx);        /* 准备接收 */
          Nop3();
        }
#endif
        if (ValBit(pLCRx,pbLCRx)||ValBit(pLCRx,pbLCRx)){
          LcSt0Cnt = 0;
          if ((++LcInHiCnt > 20) && ValBit(LcFlag,fLcTxRxSc)){
            LcFlag = (u8)(1<<fLcRxOk);
            LcInHiCnt = 0;
          }
        } else {
          /* 388:      9.0mS 引导脉冲
           * AUX:      6.1mS 引导脉冲
           * 五型线控: 3.84mS         */
          if (++LcSt0Cnt > 10) LcFlag = 0; /* 2.56mS, 清除所有标志 */
          if (ValBit(LcFlag,fLcTxRxSc)){
            /* 0.256mS - 4.096mS  */
            if ((LcInHiCnt < 16) && (LcInHiCnt != 0)){
              /* 388:      1: 3.2mS   0: 1.4mS   2.304mS
               * 五型线控: 1: 2.304mS 0: 0.768mS 1.28mS
               * AUX:      1: 1.69mS  0: 0.56mS  1.28mS */
              if ((ValBit(LcFlag,fLc388) && (LcInHiCnt > 8)) ||
                  (!ValBit(LcFlag,fLc388) && (LcInHiCnt > 4))){
                *LcByteCnt |= LcBitCnt;
              }
              if ((LcBitCnt <<= 1) == 0){
                LcBitCnt = 1;
                *++LcByteCnt = 0;     /* 准备接收下一个字节 */
              }
            }
          } else if ((LcInHiCnt >= 12) && (LcInHiCnt <= 32)){
            if (LcInHiCnt > 22){
              /* 388:  7.4mS  */
              LcFlag = (u8)((1<<fLcTxRxSc)|(1<<fLc388));
            } else {
              /* AUX:      4.5mS
               * 五型线控: 3.84mS */
              LcFlag = (u8)(1<<fLcTxRxSc);
            }
            LcBitCnt = 1;
            LcByteCnt = LcBufAdr;
            LcBufAdr[0] = 0;
#ifdef EnSCOM
            LcComTm = 0;
#endif
          }
          LcInHiCnt = 0;
        }
     }
#ifdef EnSCOM
   }
#endif
}

/* 初始化 */
void Init_TIMA(void)
{
   /* FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 */
   TCCR2 = 0x05;              /* Normal, OC2 Disconnected, 1:128 */
   ASSR  = 0x00;              /*  */
   //TCNT2 = 0x00;              /* 清除 T0 */
   OCR2 = (u8)(256/16);       /* 设置中断时间 0.256mS */

   //TIFR = 0x0FF;
   TIMSK |= (u8)(1 << OCIE2);
   //LcInHiCnt = 0;
   //LcSt0Cnt = 0;
   //LcFlag = 0;                /* 清除所有标志 */
//#ifdef EnSCOM
   //ErrCnt = 0;
   //ErrFlashCnt = 0;
   //LcInitCnt = 0;             /* 系统初始化计时 */
   //LcInitTmr = 0;
   //ClrBit(pLCTx,pbLCTx);      /* 准备接收 */
//#endif
#ifndef EnSCOM
   AckTm = 255;                 /* 锁定参数,不允许修改 */
#endif
}

/* 计算累加和 */
BOOLEAN AddSum(BOOLEAN t)
{
  u8 i,j,k;

  j = (u8)((LcBufAdr[1] & 0x0F) + 2);
  k = 0x7E;
  for (i=1; i<j; i++) k += LcBufAdr[i];
  if (t) {
    LcBufAdr[0] = 0x7E;
    LcBufAdr[j++] = k;
    LcBufAdr[j] = 0x0D;
  } else if (k == LcBufAdr[j]){
    return TRUE;
  }
  return FALSE;
}

#ifdef EnSCOM
void SysInit(void)
{
   if (ValBit(Sysflag1,f1XK_YK)){   /* 1: XK */
     SetBit(Sysflag,fSysInit);      /* 1:系统初始化标志 */
     LcInitCnt = 0;
     LcInitTmr = 0;
   }
}
#endif

/*-----------------------------------------------------------------------------
;线控器发给室内机的内容:
; T0 T0  T1 T1  T2 T2  T3 T3  T4 T4  T5 T5 共12个数据,其中T5=0D5H为识别码
;
;数据定义:
;无睡眠、定时状态: T0/T1/T2
;
;T0:
;D7 D6 D5  设定风速  D4 D3   风摆状态 D2 D1 D0  睡眠、定时状态
; 0  0  0  自动风    0  0    自然风   0  0  0   非睡眠、定时状态
; 0  0  1  高风      0  1    扫风     0  0  1   睡眠
; 0  1  0  中风      1  0    固定风   0  1  0   定时
; 0  1  1  低风                       0  1  1   睡眠+定时
; 1  0  0  大功率
; 1  0  1  经济运转
;
;T1:
; D7 D6 D5 D4  设定温度     D3  开关状态  D2 D1 D0  模式
;              自动 非自动
; 0  0  0  0        CONT    0  关机       0  0  0  自动
; 0  0  0  1   -6   18℃    1  开机       0  0  1  制冷
; 0  0  1  0   -5   19℃                  0  1  0  除湿
; ...                                     0  1  1  通风
; 0  1  1  1    0   24℃                  1  0  0  制热
; ...
; 1  1  0  1   +6   30℃
;
; 睡眠、定时状态: T0/T1/T2/T3/T4/T5
;
; T3   对应上面(非睡眠、定时状态)中的T0
; T4   对应上面(非睡眠、定时状态)中的T1
; T5   对应上面(非睡眠、定时状态)中的T2
;
; T0、T1、T2为睡眠、定时时间分钟数,具体如下
;
; T0  定时M  定时L
; T1  睡眠L  定时H
; T2  睡眠H  睡眠M
;
; 若仅有定时或睡眠时,则相对应的睡眠、定时时间为0。例如
; T0 00 T1 C0 T2 12
; 则为睡眠12C=300分钟(5小时)
-----------------------------------------------------------------------------*/
void LcCom_Sub(void)
{
#ifdef EnSCOM
   if (ValBit(Sysflag1,f1XK_YK) &&  /* 1: XK */
       (LcMonCnt > 60)){            /* 线控器故障监控计时(秒)*/
     SetBit(Errorflg,fLComErr);     /* 与线控器通信故障  */
     SetBit(Sysflag,fSysInit);      /* 1:系统初始化标志 */
     LcInitCnt = 0;
   }
   if (LcComTm == 255){             /* 线控器监控计时 */
     LcFlag = 0;                    /* 清除所有标志   */
     LcComTm = 0;
   }
#endif

   if (ValBit(LcFlag,fLcRxOk)){    /* 1: 线控接收Ok */
#if (NJTYPE == 5)                  /* 志高2GJ柜机 */
#ifndef EnSCOM
     //BkgLamp = BkgLampSET;         /* 30秒 背光开时间 */
#endif
#endif

#ifdef EnSCOM
     /* 清除监控计时 */
     LcInitTmr = 0;
#endif

     /* 1: AUX 遥控器 */
     if ((LcByteCnt == &LcBufAdr[13]) &&
         (LcBufAdr[0] == 0x0C3)){
       for (LcSt0Cnt=1; LcSt0Cnt<12; LcSt0Cnt++)
         LcBufAdr[0] += LcBufAdr[LcSt0Cnt];
       if (LcBufAdr[0] == LcBufAdr[12]) GetAuxCon();
     } else {
#ifdef EnSCOM
       /* 2: 五型线控器 */
       LcSt0Cnt = (u8)((LcBufAdr[1] & 0x0F) + 3);
       if ((LcBufAdr[0] == 0x7E) &&
           (LcBufAdr[LcSt0Cnt] == 0x0D)){
         LcSt0Cnt = (u8)(LcByteCnt - &LcBufAdr[LcSt0Cnt]);
         if (((LcSt0Cnt == 1)||(LcSt0Cnt == 2)) && AddSum(FALSE)){
           GetScomCon();
           LcByteCnt = &LcBufAdr[0];  /* 置标志 */
         }
       }
#endif
       /* 3: 388 遥控器
        * 4: 参数设定遥控器
        * 5: 线控器(388格式)
        */
       if (((LcBufAdr[0]|LcBufAdr[1]) != 0x0FF) ||
           ((LcBufAdr[2]|LcBufAdr[3]) != 0x0FF) ||
           ((LcBufAdr[4]|LcBufAdr[5]) != 0x0FF)){
         LcByteCnt = &LcBufAdr[0];  /* 置出错标志 */
       }

       if (LcByteCnt == &LcBufAdr[12]){
         if (((LcBufAdr[6]|LcBufAdr[7]) != 0x0FF) ||
             ((LcBufAdr[8]|LcBufAdr[9]) != 0x0FF) ||
             ((LcBufAdr[10]|LcBufAdr[11]) != 0x0FF)){
           LcBufAdr[11] = 0x00;
         }
#ifdef EnSCOM
         /* 1:系统初始化标志 */
         if (LcBufAdr[11] == 0x5E) ClrBit(Sysflag,fSysInit);
         if ((LcBufAdr[11] == 0x0D5) || (LcBufAdr[11] == 0x5E)){
#else
         if (LcBufAdr[11] == 0x0D5){
#endif
           LcBufAdr[4] = LcBufAdr[1];
           LcBufAdr[3] = LcBufAdr[3];
           LcBufAdr[2] = LcBufAdr[5];
           LcBufAdr[1] = LcBufAdr[7];
           LcBufAdr[0] = LcBufAdr[9];
           LcGetData();
         }
       } else if (LcByteCnt == &LcBufAdr[6]){
         if (LcBufAdr[5] == 0x69){
           ClrBit(Sysflag1,f1XK_YK);
           LcSetData();
         } else{
#ifdef EnSCOM
           /* 1:系统初始化标志 */
           if (LcBufAdr[5] == 0x5E) ClrBit(Sysflag,fSysInit);
           if ((LcBufAdr[5] == 0x0D5) || (LcBufAdr[5] == 0x5E)){
#else
           if (LcBufAdr[5] == 0x0D5){
#endif
             LcBufAdr[1] = LcBufAdr[1];
             LcBufAdr[0] = LcBufAdr[3];
             LcGetData();
           }
         }
       }
     }
     ClrBit(LcFlag,fLcRxOk);  /* 清除标志 */
   }
}

/*-----------------------------------------------------------------------------
;序号   调整参数说明    缺省值  最小值  最大值  备注
;01 室内机通讯地址          1    1       30
;02 室外机通讯地址          1    1       8
;03 室内机功率(制冷量)    5    1      255 单位:500w
;04 室内机功能设置          0    0       31
;05 制冷调阀零点           1    -10      10 +128
;06 制热调阀零点          -1    -10      10 +128
;07 膨胀阀非调节温差       1    0        10

⌨️ 快捷键说明

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