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

📄 rscom.c

📁 一个很好的完整的空调控制器程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : AUX VRV
COMPILER : AVR GCC/ICC
MODULE   : rscom.c
VERSION  : 1.0.0
DATE     : 2006/01/02
AUTHOR   : 朱坤
DESCRIPTION : 与五型外机通信(T0, SCI)

MODIFICATIONS :
******************************************************************************/
#include "rscom.h"
#include "ports.h"
#include "timer.h"
#include "main.h"
#include "buz.h"
#include "fan.h"
#include "adc.h"
#include "pzf.h"
#include "rem.h"
#include "pump.h"
#include "swing.h"

#ifdef EnSTYLE5

#define CRC_CALCULATE 1
#define CRC_CHECK 0

u8 *ScByteCnt;             /* 字节计数 */
u8 ScAddrErrCnt;           /* 地址冲突检测计时 */
u8 ScCnt;                  /* 字节计数 */
u8 WaitBeforeTx;           /* 发送之前的等待时间 */
u8 ScBufAdr[16];           /* 缓冲区(16字节) */
u8 ScComTm;                /* 若内机一直处于发送状态,强制为接收状态 */
u8 ScFlag;                 /* 标志位  */
#define fScRxOk   7        /* 1: 接收数据就绪 */
#define fScTx     6        /* 1: Tx, 0: Rx */
#define fScSOC    5        /* 1: SOC */
#define fScMSA    4        /* 1: MSA CMD LEN */
#define fScDAT    3        /* 1: DAT */
#define fScREQ    2        /* 请求发送 */
u8 ScMonCnt;               /* 外机通信故障计时 */

static u8 TmpVar;          /* 处理16位数据时暂时存储 */

#if 0
const u8 sstl[] = {0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* 00H-0FH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* 10H-1FH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* 20H-2FH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* 30H-3FH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* 40H-4FH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* 50H-5FH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* 60H-6FH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* 70H-7FH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* 80H-8FH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* 90H-9FH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* A0H-AFH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* B0H-BFH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,   /* C0H-CFH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* D0H-DFH */
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,   /* E0H-EFH */
                   0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
                   0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40};  /* F0H-FFH */

const u8 ssth[] = {0x000,0x0C0,0x0C1,0x001,0x0C3,0x003,0x002,0x0C2,
                   0x0C6,0x006,0x007,0x0C7,0x005,0x0C5,0x0C4,0x004, /* 00H-0FH */
                   0x0CC,0x00C,0x00D,0x0CD,0x00F,0x0CF,0x0CE,0x00E,
                   0x00A,0x0CA,0x0CB,0x00B,0x0C9,0x009,0x008,0x0C8, /* 10H-1FH */
                   0x0D8,0x018,0x019,0x0D9,0x01B,0x0DB,0x0DA,0x01A,
                   0x01E,0x0DE,0x0DF,0x01F,0x0DD,0x01D,0x01C,0x0DC, /* 20H-2FH */
                   0x014,0x0D4,0x0D5,0x015,0x0D7,0x017,0x016,0x0D6,
                   0x0D2,0x012,0x013,0x0D3,0x011,0x0D1,0x0D0,0x010, /* 30H-3FH */
                   0x0F0,0x030,0x031,0x0F1,0x033,0x0F3,0x0F2,0x032,
                   0x036,0x0F6,0x0F7,0x037,0x0F5,0x035,0x034,0x0F4, /* 40H-4FH */
                   0x03C,0x0FC,0x0FD,0x03D,0x0FF,0x03F,0x03E,0x0FE,
                   0x0FA,0x03A,0x03B,0x0FB,0x039,0x0F9,0x0F8,0x038, /* 50H-5FH */
                   0x028,0x0E8,0x0E9,0x029,0x0EB,0x02B,0x02A,0x0EA,
                   0x0EE,0x02E,0x02F,0x0EF,0x02D,0x0ED,0x0EC,0x02C, /* 60H-6FH */
                   0x0E4,0x024,0x025,0x0E5,0x027,0x0E7,0x0E6,0x026,
                   0x022,0x0E2,0x0E3,0x023,0x0E1,0x021,0x020,0x0E0, /* 70H-7FH */
                   0x0A0,0x060,0x061,0x0A1,0x063,0x0A3,0x0A2,0x062,
                   0x066,0x0A6,0x0A7,0x067,0x0A5,0x065,0x064,0x0A4, /* 80H-8FH */
                   0x06C,0x0AC,0x0AD,0x06D,0x0AF,0x06F,0x06E,0x0AE,
                   0x0AA,0x06A,0x06B,0x0AB,0x069,0x0A9,0x0A8,0x068, /* 90H-9FH */
                   0x078,0x0B8,0x0B9,0x079,0x0BB,0x07B,0x07A,0x0BA,
                   0x0BE,0x07E,0x07F,0x0BF,0x07D,0x0BD,0x0BC,0x07C, /* A0H-AFH */
                   0x0B4,0x074,0x075,0x0B5,0x077,0x0B7,0x0B6,0x076,
                   0x072,0x0B2,0x0B3,0x073,0x0B1,0x071,0x070,0x0B0, /* B0H-BFH */
                   0x050,0x090,0x091,0x051,0x093,0x053,0x052,0x092,
                   0x096,0x056,0x057,0x097,0x055,0x095,0x094,0x054, /* C0H-CFH */
                   0x09C,0x05C,0x05D,0x09D,0x05F,0x09F,0x09E,0x05E,
                   0x05A,0x09A,0x09B,0x05B,0x099,0x059,0x058,0x098, /* D0H-DFH */
                   0x088,0x048,0x049,0x089,0x04B,0x08B,0x08A,0x04A,
                   0x04E,0x08E,0x08F,0x04F,0x08D,0x04D,0x04C,0x08C, /* E0H-EFH */
                   0x044,0x084,0x085,0x045,0x087,0x047,0x046,0x086,
                   0x082,0x042,0x043,0x083,0x041,0x081,0x080,0x040};/* F0H-FFH */
#endif

#if 0
#ifdef AVRGCC
SIGNAL(SIG_USART_TRANS)
#else
#pragma interrupt_handler SCI_Int_Txc:iv_USART_TXC
void SCI_Int_Txc(void)  /* 五型外机通信发送处理 */
#endif
{
   ScFlag = 0;         /* 切换到接收 */
   /* UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 */
   UCSRB = (1<<RXCIE)|(1<<RXEN);
}
#endif

#ifdef AVRGCC
SIGNAL(SIG_USART_DATA)
#else
#pragma interrupt_handler SCI_Int_Tx:iv_USART_DRE
void SCI_Int_Tx(void)   /* 五型外机通信发送处理 */
#endif
{
   /* Tx 发送 */
   if (ValBit(ScFlag,fScTx)){
     if (ValBit(ScFlag,fScSOC)){
       if (ValBit(ScFlag,fScDAT)){
         UDR = 0x0D;
         //if (--ScCnt == 0){
           ScFlag = 0;         /* 切换到接收 */
         //}
       } else {
         if (--ScCnt == 0){
           if (ValBit(ScFlag,fScMSA)){
             //ScCnt = 2;
             SetBit(ScFlag,fScDAT);
           } else {
             ScCnt = (u8)((*ScByteCnt & 0x0F) + 2);
             if (ScCnt > 13){
               ScFlag = 0;
             }
             SetBit(ScFlag,fScMSA);
           }
         }
         UDR = *ScByteCnt;
         ScByteCnt++;         /* 下一字节 */
       }
     } else {
       UDR = 0x7E;
       SetBit(ScFlag,fScSOC);
       ScCnt = 3;
       ScByteCnt = ScBufAdr;  /* 设置缓冲区指针 */
       ScComTm = 0;           /* 清除监控计时 */
     }
   } else {
     ScFlag = 0;         /* 切换到接收 */
     UCSRB = (1 << RXCIE)|(1 << RXEN);
   }
}
#ifdef AVRGCC
SIGNAL(SIG_USART_RECV)
#else
#pragma interrupt_handler SCI_Int_Rx:iv_USART_RX
void SCI_Int_Rx(void)   /* 五型外机通信接收处理 */
#endif
{
   /* Rx 接收 */
   if (ValBit(ScFlag,fScRxOk)){
     UDR;               /* 清除 */
   } else if (ValBit(ScFlag,fScSOC)){
     *ScByteCnt = UDR;
     if (--ScCnt == 0){
       if (ValBit(ScFlag,fScMSA)){
         ScFlag = (u8)(1 << fScRxOk); /* 已接收完整帧 */
       } else {
         SetBit(ScFlag,fScMSA);
         ScCnt = (u8)((*ScByteCnt & 0x0F) + 2);
         if (ScCnt > 13) ScFlag = 0;
       }
     }
     ScByteCnt++;              /* 下一字节 */
   } else if (UDR == 0x7E){    /* 检测到总线不空就不允许发送 */
     TIMSK &= ~(1 << OCIE0);
     UCSRB = (1 << RXCIE)|(1 << RXEN);
     ScFlag = (u8)(1 << fScSOC);
     ScCnt = 3;
     ScByteCnt = ScBufAdr;     /* 设置缓冲区指针 */
     ScComTm = 0;         /* 清除监控计时 */
   }
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : TIMB_Int
INPUT/OUTPUT : None

DESCRIPTION  : timer B Interrupt Service Routine

COMMENTS     : 五型外机通信启动
-----------------------------------------------------------------------------*/
#ifdef AVRGCC
SIGNAL(SIG_OUTPUT_COMPARE0)
#else
#pragma interrupt_handler TIMB_Int:iv_TIMER0_COMP
void TIMB_Int(void)   /* 五型外机通信启动处理 */
#endif
{
   if (WaitBeforeTx-- == 0){
     if (ValBit(ScFlag,fScREQ)){  /* 如果有发送请求,启动发送 */
       TIMSK &= (u8)~(1 << OCIE0);
       ScFlag = (1 << fScTx);     /* 启动发送 */
       ScComTm = 0;               /* 如果处于发送状态超时,强制退出 */
       /* UCSRA: RXC TXC UDRE FE DOR PE U2X MPCM */
       UCSRA = 0x00;     /*  */
       UBRRH = 0x00;     /* 9600 N,8,1 允许发送 */
       UBRRL = 51;       /* 9600 @8MHz */
       /* UCSRC: URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL */
       UCSRC = (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);
       /* UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 */
       UCSRB = (1 << UDRIE)|(1 << TXEN);
     }
   } else{
     OCR0 += (u8)(1024/32);  /* 下次中断时间 1.024mS*/
   }
}

void Init_TIMB(void)
{
   ScFlag = 0x00;    /* 清除所有标志 */
   /* UCSRA: RXC TXC UDRE FE DOR PE U2X MPCM */
   UCSRA = 0x00;     /*  */
   UBRRH = 0x00;     /* 9600 N,8,1 允许发送 */
   UBRRL = 51;       /* 9600 @8MHz */
   /* UCSRC: URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL */
   UCSRC = (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);
   /* UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 */
   UCSRB = (1 << RXCIE)|(1 << RXEN);
   //ScAddrErrCnt = 0;
}

void ScCom_Sub(void)
{
   u8 i,j;
   BOOLEAN f;

   if (ScMonCnt > 60){              /* 外机通信故障监控计时(秒)*/
     SetBit(Errorflg,fSComErr);     /* 外机通信故障  */
     OutSideValve = 0;              /* 关阀 */
     ScMonCnt = 0;
   }

   /* 如果超过10秒没没检测到地址冲突,清除标志 */
   if (ScAddrErrCnt > 9) ClrBit(Errorflg,fRsAddrErr);

   if (ScComTm == 255){     /* 监控计时 */
     ScComTm = 0x00;
     Init_TIMB();
   }

   if (ValBit(ScFlag,fScRxOk)){             /* 1: 接收Ok */
     if (CRCchk(CRC_CHECK,ScBufAdr) &&      /* CRC 检查 */
         (!ValBit(ScBufAdr[0],4))   &&      /* 1: W--W T--T */
         ((ScBufAdr[1] & NJNOMASK) != 0) && /* 内机地址 != 0 */
         ((ScBufAdr[1] == WJ_NJNo)||        /* 比较地址(W--N、T--N) */
          /* 广播地址 */
          ((ScBufAdr[1] & NJNOMASK) == WJ_NJNoBROADCAST))){
       ScMonCnt = 0;                /* 与外机通信故障计时 */
       ClrBit(Errorflg,fSComErr);   /* 1:与外机通信故障  */

       /* 收到与本机地址相同的应答帧,则认为有内机地址冲突 */
       if (((ScBufAdr[1] & NJNOMASK) != WJ_NJNoBROADCAST) &&
           (ValBit(ScBufAdr[0],3))){
         ScAddrErrCnt = 0;
         SetBit(Errorflg,fRsAddrErr);
       }

       if (!ValBit(Errorflg,fRsAddrErr)){ /* 内机地址冲突时不处理任何命令 */
         if (((ScBufAdr[0] & 0x0E0) == 0) &&                  /* 特控器命令不影响 */
             ((ScBufAdr[1] & NJNOMASK) != WJ_NJNoBROADCAST)){ /* 广播地址不影响  */
           WJType = (u8)((ScBufAdr[2] & 0x0F0) >> 4); /* 1: 定频,0:变频 */
         }

         if (((ScBufAdr[2] & 0x0F) != 0)  &&
             ((ScBufAdr[2] & 0x0F) <= 11) &&
             (!ValBit(ScBufAdr[0],3))   /*&&*/  /* 应答帧 */
             /*(ScAddrErrCnt > 5)*/){         /* 5秒内不处理 */

           j = (u8)(ScBufAdr[0] & 0x07);  /* 命令编号 */
           switch(j){
             case 1:
               if ((u8)(ScBufAdr[0] & 0x0E8) != 0){ /* 0: 无效的特控器地址 */
                 ScBufAdr[1] = 31;                  /* 不发送 */
                 break;
               } else {
                 /* 只处理G1-G2, I20-I39 */
                 if ((ScBufAdr[3] == 1) || (ScBufAdr[3] == 2)){
                   ScBufAdr[3] = (u8)((ScBufAdr[3] + 1) * 10);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -