📄 scom.c
字号:
/**************** (c) 2005 佛山菱电 *****************************************
PROJECT : 简易风盘控制器
COMPILER : AVR ICC for m48
MODULE : scom.c
VERSION : 1.0.0
DATE : 2005/12/10
AUTHOR : 朱坤
DESCRIPTION : 与外机通信(Timer 2)
MODIFICATIONS :
******************************************************************************/
#include <avr/io.h>
#include <avr/signal.h>
#include "lib.h"
#include "version.h"
#include "ports.h"
#include "main.h"
#include "fan.h"
#include "adc.h"
#include "scom.h"
/* A H C D */
const u8 SCom_SM_Tab[] = {0x00,0x22,0x11,0x51};
u8 ScSt0Cnt; /* 低电平计时 */
u8 ScInHiCnt; /* 高电平计时 */
u8 ScByteCnt; /* 字节计数 */
u8 ScBitCnt; /* 位计数 */
u8 ScWordCnt; /* 发送的字节数 */
u8 ScBufAdr[42]; /* 缓冲区(42字节) */
/* 发送监控计时, 若内机处于发送状态超时,强制为接收状态 */
u8 ScComTm;
u8 ScFlag; /* 标志位 */
#define fScRxOk 7
#define fScTxRxSc 6
#define fScTx 5 /* 1: Tx, 0: Rx */
#define fScTxLo 4 /* 1: 高电平标志 */
u8 ScMonCnt; /* 外机通信故障计时 */
u8 ScAddrErrCnt; /* 地址冲突检测计时 */
u8 ScState; /* 外机通信状态 */
u8 ScRepCount; /* 重发计数 */
#define ScRepCountMax 3 /* 允许的重发次数 */
u8 XianShiCanShu[12]; /* 显示参数 */
u8 WaiJiCanShu[18]; /* 外机参数 */
u8 WaiJiShuJu[18]; /* 外机被修改的数据 */
/*-----------------------------------------------------------------------------
ROUTINE NAME :
INPUT/OUTPUT : None
DESCRIPTION : Timer2 OCB Interrupt Service Routine
COMMENTS : PG 风机处理
-----------------------------------------------------------------------------*/
#ifdef EnPGFENGJI
SIGNAL(SIG_OUTPUT_COMPARE2B) /* PG 风机处理 */
{
//SetBit(PGFanStatus,fPGEnAdjust);
if (PG_FBCount < 255) PG_FBCount++;
if (ValtBit(PGFanStatus,fPGCtlBit)){
/* 风机运行风速 */
if (GetPGZero() || GetPGZero()){
if (ValBit(PGFanStatus,fPGTrig)){
//if (TrigDlyTime != 0){
// TrigDlyTime--;
// PGFanOn();
//} else {
PGFanOff();
//}
} else {
if ((u16)(TCNT1 - TrigStart) >= TrigTime){
SetBit(PGFanStatus,fPGTrig);
//TrigDlyTime = 0x02;
PGFanOn();
}
}
} else {
ClrBit(PGFanStatus,fPGTrig); /* PG风机 */
#ifdef TESTPRG
SetBit(PGFanStatus,fPGZero); /* 1: 有过零标志 */
#endif
TrigStart = (u16)TCNT1;
PGFanOff(); /* 准备触发 */
}
if (GetPGFeed() || GetPGFeed()){
SetBit(PGFanStatus,fPGFeed);
} else if (ValBit(PGFanStatus,fPGFeed)){
ClrBit(PGFanStatus,fPGFeed);
SetBit(PGFanStatus,fPGFeedEn); /* 允许 PG 反馈 */
SetBit(PGFanStatus,fPGEnAdjust);
PG_Bak = PG_Bak2;
PG_Bak2 = (u16)TINT1;
if (PG_FBCount >= PGERRCNTMAX){
PG_Bak = (u16)0x0FFFF;
EHeatDlyCnt = 3; /* 风机速度没起来之前,关电热 */
} else {
PG_Bak = (u16)(PG_Bak2 - PG_Bak);
PGErrCnt = 0; /* 清除故障检测计时 */
}
PG_FBCount = 0;
}
}
/* PG 导通脉冲宽度 1mS */
//if (TrigDlyTime != 0) TrigDlyTime--;
OCR2B += PGADJMAX / 64;
}
#endif
/*-----------------------------------------------------------------------------
ROUTINE NAME :
INPUT/OUTPUT : None
DESCRIPTION : Timer2 OCA Interrupt Service Routine
COMMENTS : 外机收发 0.256mS
-----------------------------------------------------------------------------*/
SIGNAL(SIG_OUTPUT_COMPARE2A) /* 外机通信处理 */
{
if (ValBit(ScFlag,fScTx)){ /* 1: 发送 */
if (ValBit(ScFlag,fScTxLo)){ /* 1: 高电平标志 */
ClrBit(ScFlag,fScTxLo);
ClrTxD(); /* 低电位 */
if (ValBit(ScFlag,fScTxRxSc)){
OCR2A += (u8)(768/32); /* 0.768 mS */
} else {
OCR2A += (u8)(3840/32); /* 3.84 mS */
}
} else {
SetBit(ScFlag,fScTxLo);
SetTxD(); /* 高电位 */
if (ValBit(ScFlag,fScTxRxSc)){
if (ScByteCnt == ScWordCnt){
ScByteCnt = 0;
ScFlag = 0;
}
if ((u8)(ScBufAdr[ScByteCnt] & ScBitCnt) == 0){
OCR2A += (u8)(768/32); /* 0.768 mS */
} else {
OCR2A += (u8)(2304/32); /* 2.304 mS */
}
if ((ScBitCnt <<= 1) == 0){
ScBitCnt = 1;
ScByteCnt++;
}
} else {
OCR2A += (u8)(3840/32); /* 3.84 mS */
ScBitCnt = 1;
SetBit(ScFlag,fScTxRxSc);
ScByteCnt = 0;
ScComTm = 0; /* 监控计时 */
}
}
} else { /* 0.256mS 外机接收 */
OCR2A += (u8)(256/32);
if (!ValBit(ScFlag,fScRxOk)){ /* 尚未处理,不接收 */
//SetTxD(); /* 准备接收 */
if (GetRxD() || GetRxD()){
ScSt0Cnt = 0;
if (++ScInHiCnt > 0x20) ScFlag = (u8)(1 << fScRxOk);
} else {
if (++ScSt0Cnt > 0x0a) ScFlag = 0; /* 2.56mS */
if (ValBit(ScFlag,fScTxRxSc)){
/* 0.256mS - 3.84mS */
if ((ScInHiCnt != 0) /*&& (ScInHiCnt <= 0x0f)*/){
if (ScInHiCnt > 0x04){ /* 1.28mS */
ScBufAdr[ScByteCnt] |= ScBitCnt;
}
if ((ScBitCnt <<= 1) == 0){
ScBitCnt = 1;
ScBufAdr[++ScByteCnt] = 0; /* 准备接收下一个字节 */
}
}
} else if ((ScInHiCnt >= 0x0a) && (ScInHiCnt <= 0x11)){
/* 3.84mS 引导脉冲 2.56mS - 4.608mS */
ScBitCnt = 1;
ScFlag = (u8)(1 << fScTxRxSc);
ScBufAdr[0] = 0;
ScByteCnt = 0;
ScComTm = 0;
}
ScInHiCnt = 0;
}
}
}
}
void Init_Timer2(void)
{
ASSR = (u8)0x00; /* Timer 2 选择内部时钟源 */
TCCR2A = (u8)0x00; /* Normal port operation */
#ifdef MAINCLK
TCCR2B = (u8)0x06; /* 1/256 */
#else
TCCR2B = (u8)0x03; /* 1/32 */
#endif
OCR2A = (u8)(256/32); /* 设置下一次中断时间 0.256uS */
//TCNT2 = (u8)0x00; /* 清除定时 */
//TIFR2 = 0x07; /* 清除所有中断 */
#ifdef EnPGFENGJI
OCR2B = (u8)(256/32);
TIMSK2 = (u8)((1 << OCIE2B)|(1 << OCIE2A));
TCCR1A = (u8)0; /* 初始化 T1 */
TIMSK1 = (u8)0; /* 所有中断禁止 */
//TCCR1C = 0;
//TCNT1 = (u16)0;
//TIFR1 = 0x27; /* 清除所有中断 */
#ifdef MAINCLK
TCCR1B = 0x02; /* 1:8 */
#else
TCCR1B = 0x01; /* 1:1 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -