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

📄 timer.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : 简易风盘控制器
COMPILER : AVR ICC for m48
MODULE   : timer.c
VERSION  : 1.0.0
DATE     : 2005/05/09
AUTHOR   : 朱坤
DESCRIPTION :   定时/睡眠控制,定时任务

MODIFICATIONS :
******************************************************************************/

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "lib.h"
#include "version.h"

#include "ports.h"
#include "adc.h"
#include "fan.h"
#include "main.h"
#include "i2c.h"
#include "buz.h"
#include "lcd.h"
#include "scom.h"
#include "timer.h"

#ifndef UGPIO
u8 SlpTmFlag;        /* 睡眠/定时   */
#endif
u8 SysTm20ms;        /* 20mS On 4ms */
u8 SysTm1s;          /* 1s On 4ms   */
u8 TimerMon;         /* 时钟监控 */

void ClrAutoMode(void)
{
   if (ValBit(Sysflag,fMAuto)){       /* 自动模式清除检测到的模式 */
     RunMode = (u8)((RunMode & ~MODEMASK)|MODEAUTO);
     ClrBit(Sysflag,fMAuto);          /* 1: 自动模式检测延时 */
   }
   ClrBit(Sysflag,fDelay);            /* 1: 停压缩机延时*/
}

void TurnSysOff(void)
{
   if (ValBit(RunMode,fSysOnOff)){    /* 定时开机时间未到,先关机 */
     SWTime = 0;                      /* 立即关显示 */
     SetBuzCntr(BuzCntrLong);         /* 蜂鸣器鸣叫1长声 */
     ClrBit(RunMode,fSysOn);          /* 关机 */
     ClrBit(RunMode,fSysOnOff);
     ClrAutoMode();
   }
}

void TurnSysOn(void)
{
   if (!ValBit(RunMode,fSysOnOff)){
     SetBuzCntr(BuzCntrTwo|(1<<fTwoSBuz)); /* 蜂鸣器鸣叫2短声 */
     SetBit(RunMode,fSysOnOff);            /* 定时关机时间未到,先开机 */
     ClrAutoMode();
   }
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : Timer0_Int
INPUT/OUTPUT : None
DESCRIPTION  : Main Clock Interrupt Service Routine
COMMENTS     :
  每 2.048mS 中断一次
-----------------------------------------------------------------------------*/
SIGNAL(SIG_OVERFLOW0)
{
   //u8 i;
   SlpTmFlag++;
   //TimerMon = 0x00;
#if 0
   TCCR0A = 0x00;              /* OC0A OC0B 不控制 I/O 口, CTC */
#ifdef MAINCLK
   TCCR0B = (u8)0x03;          /* clkIO/64 */
#else
   TCCR0B = (u8)0x02;          /* clkIO/8 */
#endif
#ifdef DEBUG
   DDRC  |= 0x08;
   PORTC ^= 0x08;
#endif
#endif
}

/* 系统计时处理 */
void Timer_Sub(void)
{
   if (ValBit(SlpTmFlag,bb4ms)){
     ClrBit(SlpTmFlag,bb4ms);
     Get_JP();              /* 键扫描 & 显示输出 */
     Key_Scan();            /* 应急运行键 */
     LcdDisp_Sub();         /* LCD 显示处理*/
     ADC_Get();             /* A/D */

     if (--SysTm20ms == 0){ /* 20ms on 4ms */
       SysTm20ms = cT20msbase;
       /* 与外机通信监控计时 */
       if (++ScComTm == 0) ScFlag = 0; /* 清除所有标志 */

       /*  */
       if (SWKeyHoldTm < 255) SWKeyHoldTm++;
       if (CanShuNoTm != 0) CanShuNoTm--;

#ifdef LEDDISP
      if (FlashErrCnt != 0) FlashErrCnt--;
      if (ChkLcdCnt != 0) ChkLcdCnt--;
#endif

#ifdef EnBUZ
       if ((u8)(BuzCntr & ~(1<<fTwoSBuz)) != 0) BuzCntr--;
#endif
       if (AutoAckTm != 0 )  AutoAckTm--;
     }

     if (--SysTm1s == 0){                      /* 1s On 4ms */
       SysTm1s = cT1sbase;
       SlpTmFlag ^= (u8)(1 << bb2s);

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

       if (ScMonCnt++ > 60){            /* 外机通信故障监控计时(秒) */
       //  SetBit(Errorflg,fSComErr);     /* 外机通信故障 */
       //  ScState = 0;                   /* 恢复后将重新刷新 */
         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
#ifdef EnPGFENGJI
         TIMSK2 = (u8)((1 << OCIE2B)|(1 << OCIE2A));
#else
         TIMSK2 = (u8)(1 << OCIE2A);
#endif
       }

       if (BkgLamp != 0) BkgLamp--;            /* LCD背光时间 */
       if (SWTime != 0) SWTime--;              /* 按键时间 */
       //if (DispDlyCnt < 255) DispDlyCnt++;

       if (LCDTimeCount-- == 0){               /* 显示持续时间 */
          LCDState = 0;                        /* 恢复显示房间温度 */
       }

#ifdef EnPGFENGJI
       if (!ValBit(PGFanStatus,fPGFeedEn)) PGErrCnt = 0;
       if (++PGErrCnt > 30){
       	 SetBit(Errorflg2,fPGErr);
         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 */
#endif
       }
#endif
       //if (DefstCnt != 0) DefstCnt--;      /* 化霜期间及化霜后3分钟内不检测传感器故障*/
       if (ClrHotCnt != 0) ClrHotCnt--;    /* 吹余热计时(2分钟)*/
       if (AutoCnt != 0) AutoCnt--;        /* 自动模式检测延时*/
#ifdef ChigoXG2
       if (ZhiReFJTm != 0) ZhiReFJTm--;    /* 制热温度到达设定温度,30秒后停内风机*/
#endif
     }
   }
}

/* 允许 T0 中断,每4.096mS 中断一次  */
void Init_Timer0()
{
   SysTm20ms = cT20msbase;
   SysTm1s = cT1sbase;
   //SysTm1min = 0x3C;           /* 60S */
   SlpTmFlag = 0;
   TCCR0A = 0x00;                /* OC0A OC0B 不控制 I/O 口,CTC */
#ifdef MAINCLK
   TCCR0B = (u8)0x03;          /* clkIO/64 */
#else
   TCCR0B = (u8)0x02;          /* clkIO/8 */
#endif
   TIFR0 = 0x07;               /* 清除所有中断 */
   TIMSK0 = (u8)(1 << TOIE0);  /* 允许 T0 溢出中断 */
}

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

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