📄 scom.c
字号:
/**************** (c) 2005 佛山菱电 *****************************************
PROJECT : AUX VRV
COMPILER : AVR GCC/ICC
MODULE : scom.c
VERSION : 1.0.0
DATE : 2006/01/02
AUTHOR : 朱坤
DESCRIPTION : 与外机通信(T0)
MODIFICATIONS :
******************************************************************************/
#include "scom.h"
#include "ports.h"
#include "main.h"
#include "fan.h"
#include "adc.h"
#include "pzf.h"
#ifndef EnSTYLE5
const u8 SCom_SM_Tab[] ={0x00,0x03,0x01,0x09};
u8 ScSt0Cnt; /* 低电平计时 */
u8 ScInHiCnt; /* 高电平计时 */
u8 * ScByteCnt; /* 字节计数 */
u8 ScBitCnt; /* 位计数 */
u8 ScFlag; /* 标志位 */
#define fScRxOk 7
#define fScTxRxSc 6
#define fScTx 5 /* 1: Tx, 0: Rx */
#define fScTxLo 4 /* 1: 高电平标志 */
u8 ScBufAdr[14]; /* 缓冲区(14字节) */
/* 发送监控计时, 若内机处于发送状态超时,强制为接收状态 */
u8 ScComTm;
/* 外机通信故障计时 */
u8 ScMonCnt;
/*-----------------------------------------------------------------------------
ROUTINE NAME : TIMB_Int
INPUT/OUTPUT : None
DESCRIPTION : timer B Interrupt Service Routine
COMMENTS : 外机收发 0.256mS
-----------------------------------------------------------------------------*/
#ifdef AVRGCC
SIGNAL(SIG_OUTPUT_COMPARE0)
#else
#pragma interrupt_handler TIMB_Int:iv_TIMER0_COMP
void TIMB_Int(void)
#endif
{ /* 三型外机通信处理 */
if (ValBit(ScFlag,fScTx)){ /* 1: 发送 */
if (ValBit(ScFlag,fScTxLo)){ /* 1: 高电平标志 */
ClrBit(ScFlag,fScTxLo);
SetBit(pTx,pbTx); /* 低电位 */
if (ValBit(ScFlag,fScTxRxSc)){
TBOC1HR += 768/32; /* 0.768 mS */
} else {
TBOC1HR += 6400/32; /* 6.4 mS */
}
} else {
SetBit(ScFlag,fScTxLo);
ClrBit(pTx,pbTx); /* 高电位 */
if (ValBit(ScFlag,fScTxRxSc)){
if (ScByteCnt == &ScBufAdr[14]) ScFlag = 0;
if ((u8)(*ScByteCnt & ScBitCnt) == 0){
OCR0 += 768/32; /* 0.768 mS */
} else {
OCR0 += 3072/32; /* 3.072 mS */
}
if ((ScBitCnt <<= 1) == 0){
ScBitCnt = 1;
ScByteCnt++;
}
} else {
OCR0 += 6400/32; /* 6.4 mS */
SetBit(ScFlag,fScTxRxSc);
ScBitCnt = 1;
ScByteCnt = ScBufAdr;
ScComTm = 0; /* 监控计时 */
}
}
} else { /* 0.256mS 三型外机接收 */
OCR0 += 256/32; /* 0.256 mS */
if (!ValBit(ScFlag,fScRxOk)){ /* 尚未处理,不接收 */
ClrBit(pTx,pbTx); /* 准备接收 */
if (ValBit(pRx,pbRx)||ValBit(pRx,pbRx)){
ScSt0Cnt = 0;
if (++ScInHiCnt == 0) ScFlag = 0;
//++ScInHiCnt;
} else {
if (++ScSt0Cnt > 0x12) ScFlag = 0; /* 4.864mS */
if (ValBit(ScFlag,fScTxRxSc)){
/* 0.256mS - 4.608mS */
if ((ScInHiCnt != 0) && (ScInHiCnt <= 0x12)){
/* 1.792mS */
if (ScInHiCnt > 0x07) *ScByteCnt |= ScBitCnt;
if ((ScBitCnt<<=1) == 0){
ScBitCnt = 1;
if (ScByteCnt == &ScBufAdr[5]) { /* 接收6字节 */
ScFlag = (u8)(1<<fScRxOk);
} else {
*++ScByteCnt = 0; /* 准备接收下一个字节 */
}
}
}
} else if ((ScInHiCnt >= 0x10) && (ScInHiCnt < 0x23)){
/* 6.4mS 引导脉冲 4.096mS - 8.96mS */
SetBit(ScFlag,fScTxRxSc);
ScBitCnt = 1;
ScByteCnt = ScBufAdr;
ScBufAdr[0] = 0;
ScComTm = 0;
}
ScInHiCnt = 0;
}
}
}
}
void Init_TIMB(void)
{
/* FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 */
TCCR0 = 0x05; /* Normal, OC0 Disconnected, 1:256 */
OCR0 = (u8)(256/32);/* 设置下一次中断时间 0.256 */
TCNT0 = 0x00;
//ScFlag = 0; /* 清除所有标志 */
UCSRB = 0x00; /* 禁止 SCI */
//TIFR = 0x0FF; /* 清除所有中断 */
//TIMSK &= (u8)(1 << TOIE0);
TIMSK |= (u8)(1 << OCIE0);
//ClrBit(pTx,pbTx); /* 准备接收 */
}
/*-----------------------------------------------------------------------------
;① 室外机→室内机
;室外机给室内机发送3个字节的数据,加反码共6个字节。
;第一字节:室外机故障标志反码;第二字节:室外机故障标志正码
; D0 室外机压缩机排气温度过高 (=0 正常;=1 故障)
; D1 缺氟或换向阀故障 (=0 正常;=1 故障)
; D2 室外机交流输入电流过大 (=0 正常;=1 故障)
; D3 室外机交流输入电流采样异常 (=0 正常;=1 异常)
; D4 室外机直流母线电压异常 (=0 正常;=1 异常)
; D5 室内机总功率过大 (=0 无效;=1 有效)
; D6 室外机传感器故障 (=0 正常;=1 故障)
; D7 室外机变频器模块保护故障 (=0 正常;=1 故障)
;第三字节:室外机状态及故障标志反码,第四字节:室外机状态及故障标志正码
; D0 制热除霜工作状态位 1= 除霜状态 0= 非除霜状态
; D1 制热工作状态 1= 有效 0= 无效
; D2 压缩机启停状态位 1= 启动 0= 停止
; D3 室外风机启停状态位 1= 启动 0= 停止
; D4 允许室内机启动位 1= 允许启动 0= 不允许启动
; D5 保留
; D6 该通道不存在或通讯故障 1= 不存在或故障; 0= 正常
; D7 室外机三次故障停机 1= 故障 0= 正常
;第五字节:膨胀阀开度反码,第六字节:膨胀阀开度正码。
;② 室内机→室外机
;室内机给室外机发送7个字节的数据,加反码共为14个字节。
;第一字节:设定室内温度正码; 第二字节:设定室内温度反码;
;第三字节:实测室内环境温度正码; 第四字节:实测室内环境温度反码;
;第五字节:实测室内机盘管温度正码;第六字节:实测室内机盘管温度反码
;第七字节:命令状态字节正码; 第八字节:命令状态字节反码
;命令状态字内容:
; D1、D0 = 00 通风或待机状态
; 01 制冷
; 10 保留
; 11 制热
; D2 保留
; D3:除湿状态位 "1"要求除湿,"0" 不要求除湿
; D7、D6、D5、D4 = 1111 系统进入商检状态
; = 1100 系统进入柜机抽检状态
; = 1101 系统进入挂机抽检状态
; = 0001 微风
; = 0010 低风
; = 0100 中风
; = 1000 高风
;第九字节: 实测室内盘管细管温度正码; 第十字节: 实测室内盘管细管温度反码;
;第十一字节:实测室内盘管粗管温度正码; 第十二字节:实测室内盘管粗管温度反码;
;第十三字节:室内机功率(匹)正码; 第十四字节:室内机功率反码。
-----------------------------------------------------------------------------*/
void ScCom_Sub(void)
{
if (ScMonCnt > 60){ /* 外机通信故障监控计时(秒) */
SetBit(Errorflg,fSComErr); /* 外机通信故障 */
OutSideValve = 0; /* 关阀 */
}
if (ScComTm == 255){ /* 外机通信监控计时 */
ScFlag = 0; /* 清除所有标志 */
ScComTm = 0;
ClrBit(pTx,pbTx); /* 准备接收 */
}
if (ValBit(ScFlag,fScRxOk)){ /* 1: 接收Ok */
if (((ScBufAdr[0]|ScBufAdr[1]) == 0x0FF) &&
((ScBufAdr[2]|ScBufAdr[3]) == 0x0FF) &&
((ScBufAdr[4]|ScBufAdr[5]) == 0x0FF)){
ScMonCnt = 0; /* 与外机通信故障计时 */
ClrBit(Errorflg,fSComErr); /* 1:与外机通信故障 */
OutSideErr[0] = ScBufAdr[1]; /* 外机故障 */
OutDevStu[0] = ScBufAdr[3]; /* 外机状态 */
/* 膨胀阀开度 */
OutSideValve =(u16)(((ScBufAdr[5] > (PZFMAX >> 1))? (PZFMAX >> 1): ScBufAdr[5]) << 1);
/* 在模式没有发送到外机之前,先清除允许标志 */
if (!ValBit(Sysflag,fModeflag)){
ClrBit(OutDevStu[0],fRunEnable);
ClrBit(OutDevStu[0],fOutDeforst);
}
if (ValBit(OutDevStu[0],fRunEnable)) ClrBit(Sysflag2,fRequest);
ScComTx_Sub(); /* 准备发送数据 */
OCR0 += (u8)(0x0FF); /* 间隔时间(15.3mS) */
ClrBit(pTx,pbTx); /* 发送准备 */
ScFlag = (1<<fScTx)|(1<<fScTxLo); /* 清除所有标志 */
}
ClrBit(ScFlag,fScRxOk); /* 清除标志 */
}
}
void ScComTx_Sub(void) /* 准备发送数据 */
{
ScBufAdr[0] =(u8)(SetupTp - 0x80); /* Ts */
if (ValBit(Errorflg,fAmbientErr)){
ScBufAdr[2] = 0x80; /* Tr */
} else {
#ifdef ChigoXG1
if ((RunMode & MODEMASK) == MODEHEAT){
#ifdef ChigoXG1Set
ScBufAdr[2] = (u8)(AmbientTp - ChigoXG1Set);
#else
ScBufAdr[2] = (u8)(AmbientTp - SetOffset);
#endif
} else {
ScBufAdr[2] = (u8)(AmbientTp - 0x80);
}
#else
ScBufAdr[2] = (u8)(AmbientTp - 0x80);
#endif
/* 强制运行时,修改设定温度,不处理补偿温度 */
if (ValBit(Sysflag,fContinue)){
if ((RunMode & MODEMASK) == MODEHEAT){
if (AmbientTp > 0x7B){
ScBufAdr[0] = (u8)(AmbientTp + 0x85);
} else {
ScBufAdr[0] = 0x00; /* Ts = Tr+5 */
}
} else if (((RunMode & MODEMASK) == MODECOOL)||
((RunMode & MODEMASK) == MODEDRY)){
if (AmbientTp > 0x85){
ScBufAdr[0] = (u8)(AmbientTp + 0x7B);
} else {
ScBufAdr[0] = 0x00; /* Ts = Tr-5 */
ScBufAdr[2] = 0x05;
}
} }
}
/* 盘管中点温度 */
ScBufAdr[4] = (u8)(ValBit(Errorflg,fTubeMidErr)? 0x80 : TubeMidTp - 0x80);
/* 内机模式 - 不开机,不发送模式 */
SetBit(Sysflag,fModeflag); /* 模式发送标志 */
ScBufAdr[6] = (u8)(ValBit(RunMode,fSysOn)? SCom_SM_Tab[RunMode & 0x03] : 0);
/* 盘管入口/出口温度 */
ScBufAdr[8] = (u8)(ValBit(Errorflg,fTubeInErr)? 0x80 : TubeInTp - 0x80);
ScBufAdr[10] = (u8)(ValBit(Errorflg,fTubeOutErr)? 0x80 : TubeOutTp - 0x80);
/* 内机功率 */
ScBufAdr[12] = (u8)(ValBit(Sysflag,fPower) ? PowerConst : 0);
if (ValBit(RunMode,fSysOn) && ValBit(Sysflag2,fRequest)){
ScBufAdr[12] = PowerConst;
if ((RunMode & MODEMASK) == MODEHEAT){
ScBufAdr[2] = (u8)(ScBufAdr[0] - 1); /* Tr = Ts-1 */
} else if (((RunMode & MODEMASK) == MODECOOL)||
((RunMode & MODEMASK) == MODEDRY)){
ScBufAdr[2] = (u8)(ScBufAdr[0] + 1); /* Tr = Ts+1 */
}
}
/* 设置反码 */
ScBufAdr[1] = (u8)(255 - ScBufAdr[0]);
ScBufAdr[3] = (u8)(255 - ScBufAdr[2]);
ScBufAdr[5] = (u8)(255 - ScBufAdr[4]);
ScBufAdr[7] = (u8)(255 - ScBufAdr[6]);
ScBufAdr[9] = (u8)(255 - ScBufAdr[8]);
ScBufAdr[11] = (u8)(255 - ScBufAdr[10]);
ScBufAdr[13] = (u8)(255 - ScBufAdr[12]);
}
#endif
/*** (c) 2005 佛山菱电 **************************** END OF FILE *************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -