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