?? 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 + -