?? 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; /* 字節(jié)計數(shù) */
u8 ScBitCnt; /* 位計數(shù) */
u8 ScFlag; /* 標志位 */
#define fScRxOk 7
#define fScTxRxSc 6
#define fScTx 5 /* 1: Tx, 0: Rx */
#define fScTxLo 4 /* 1: 高電平標志 */
u8 ScBufAdr[14]; /* 緩沖區(qū)(14字節(jié)) */
/* 發(fā)送監(jiān)控計時, 若內機處于發(fā)送狀態(tài)超時,強制為接收狀態(tài) */
u8 ScComTm;
/* 外機通信故障計時 */
u8 ScMonCnt;
/*-----------------------------------------------------------------------------
ROUTINE NAME : TIMB_Int
INPUT/OUTPUT : None
DESCRIPTION : timer B Interrupt Service Routine
COMMENTS : 外機收發(fā) 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: 發(fā)送 */
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; /* 監(jiān)控計時 */
}
}
} 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字節(jié) */
ScFlag = (u8)(1<<fScRxOk);
} else {
*++ScByteCnt = 0; /* 準備接收下一個字節(jié) */
}
}
}
} 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); /* 準備接收 */
}
/*-----------------------------------------------------------------------------
;① 室外機→室內機
;室外機給室內機發(fā)送3個字節(jié)的數(shù)據(jù),加反碼共6個字節(jié)。
;第一字節(jié):室外機故障標志反碼;第二字節(jié):室外機故障標志正碼
; D0 室外機壓縮機排氣溫度過高 (=0 正常;=1 故障)
; D1 缺氟或換向閥故障 (=0 正常;=1 故障)
; D2 室外機交流輸入電流過大 (=0 正常;=1 故障)
; D3 室外機交流輸入電流采樣異常 (=0 正常;=1 異常)
; D4 室外機直流母線電壓異常 (=0 正常;=1 異常)
; D5 室內機總功率過大 (=0 無效;=1 有效)
; D6 室外機傳感器故障 (=0 正常;=1 故障)
; D7 室外機變頻器模塊保護故障 (=0 正常;=1 故障)
;第三字節(jié):室外機狀態(tài)及故障標志反碼,第四字節(jié):室外機狀態(tài)及故障標志正碼
; D0 制熱除霜工作狀態(tài)位 1= 除霜狀態(tài) 0= 非除霜狀態(tài)
; D1 制熱工作狀態(tài) 1= 有效 0= 無效
; D2 壓縮機啟停狀態(tài)位 1= 啟動 0= 停止
; D3 室外風機啟停狀態(tài)位 1= 啟動 0= 停止
; D4 允許室內機啟動位 1= 允許啟動 0= 不允許啟動
; D5 保留
; D6 該通道不存在或通訊故障 1= 不存在或故障; 0= 正常
; D7 室外機三次故障停機 1= 故障 0= 正常
;第五字節(jié):膨脹閥開度反碼,第六字節(jié):膨脹閥開度正碼。
;② 室內機→室外機
;室內機給室外機發(fā)送7個字節(jié)的數(shù)據(jù),加反碼共為14個字節(jié)。
;第一字節(jié):設定室內溫度正碼; 第二字節(jié):設定室內溫度反碼;
;第三字節(jié):實測室內環(huán)境溫度正碼; 第四字節(jié):實測室內環(huán)境溫度反碼;
;第五字節(jié):實測室內機盤管溫度正碼;第六字節(jié):實測室內機盤管溫度反碼
;第七字節(jié):命令狀態(tài)字節(jié)正碼; 第八字節(jié):命令狀態(tài)字節(jié)反碼
;命令狀態(tài)字內容:
; D1、D0 = 00 通風或待機狀態(tài)
; 01 制冷
; 10 保留
; 11 制熱
; D2 保留
; D3:除濕狀態(tài)位 "1"要求除濕,"0" 不要求除濕
; D7、D6、D5、D4 = 1111 系統(tǒng)進入商檢狀態(tài)
; = 1100 系統(tǒng)進入柜機抽檢狀態(tài)
; = 1101 系統(tǒng)進入掛機抽檢狀態(tài)
; = 0001 微風
; = 0010 低風
; = 0100 中風
; = 1000 高風
;第九字節(jié): 實測室內盤管細管溫度正碼; 第十字節(jié): 實測室內盤管細管溫度反碼;
;第十一字節(jié):實測室內盤管粗管溫度正碼; 第十二字節(jié):實測室內盤管粗管溫度反碼;
;第十三字節(jié):室內機功率(匹)正碼; 第十四字節(jié):室內機功率反碼。
-----------------------------------------------------------------------------*/
void ScCom_Sub(void)
{
if (ScMonCnt > 60){ /* 外機通信故障監(jiān)控計時(秒) */
SetBit(Errorflg,fSComErr); /* 外機通信故障 */
OutSideValve = 0; /* 關閥 */
}
if (ScComTm == 255){ /* 外機通信監(jiān)控計時 */
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]; /* 外機狀態(tài) */
/* 膨脹閥開度 */
OutSideValve =(u16)(((ScBufAdr[5] > (PZFMAX >> 1))? (PZFMAX >> 1): ScBufAdr[5]) << 1);
/* 在模式?jīng)]有發(fā)送到外機之前,先清除允許標志 */
if (!ValBit(Sysflag,fModeflag)){
ClrBit(OutDevStu[0],fRunEnable);
ClrBit(OutDevStu[0],fOutDeforst);
}
if (ValBit(OutDevStu[0],fRunEnable)) ClrBit(Sysflag2,fRequest);
ScComTx_Sub(); /* 準備發(fā)送數(shù)據(jù) */
OCR0 += (u8)(0x0FF); /* 間隔時間(15.3mS) */
ClrBit(pTx,pbTx); /* 發(fā)送準備 */
ScFlag = (1<<fScTx)|(1<<fScTxLo); /* 清除所有標志 */
}
ClrBit(ScFlag,fScRxOk); /* 清除標志 */
}
}
void ScComTx_Sub(void) /* 準備發(fā)送數(shù)據(jù) */
{
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);
/* 內機模式 - 不開機,不發(fā)送模式 */
SetBit(Sysflag,fModeflag); /* 模式發(fā)送標志 */
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 + -