📄 rem.c
字号:
/**************** (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 + -