⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scom.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************** (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 + -