📄 timer.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 + -