📄 driver.c
字号:
/*************************************************************************
Copyright (C)
FileName:
Author:
Version :
Date:
Description:
Version:
History:
<author> <time> <version > <desc>
David 2007/07/26 1.0 build this moudle
*************************************************************************/
//系统库头文件
#include "driver.h"
#include "Comm.h"
#include "dataSave.h"
/*Flash地址分配以及初值*/
#pragma abs_address:0x1FF0
const unsigned char ADD_H; //物理地址高字节
const unsigned char ADD_L; //物理地址低字节
#pragma end_abs_address
/*************************************************************************
Function: Delay
Description:时间延时,中断时间为20ms
输入板调试用
Input:
num, 表示延时的时间,1表示延时500us
Output:
Return:
*************************************************************************/
void Delay(INT16U num)
{
INT8U iLoop;
INT16U iNum;
for(iNum = 0; iNum < num; iNum++){
for(iLoop = 0; iLoop < 255; iLoop++){
;
}
}
}
/*************************************************************************
Function: InitSystem
Description: 初始化系统
Calls:
Called by:
Input:
Output:
Return:
*************************************************************************/
void InitSystem(void)
{
CLI(); //disable all interrupts
InitMega8();
InitSysValue();
if(TestBit(MCUCSR,0) || TestBit(MCUCSR, BORF)){
MCUCSR = 0;
g_sensor.status = FLG_SELF;
}
else{
g_sensor.status = FLG_NORMAL;
}
g_timeCount = 0;
g_timeSign = 0;
SENPROTECTON; //开传感器电源
SEI(); //re-enable interrupts
}
/*************************************************************************
unction: InitMega8
Description: 初始化系统
Calls:
Called by:
Input:
Output:
Return:
*************************************************************************/
void InitMega8(void)
{
PORTB = 0x00;
DDRB = 0x06;
PORTC = 0x00; //m103 output only
DDRC = 0x10;
PORTD = 0x00;
DDRD = 0x00;
//串口初始化
UARTInit();
/*定计0设置25ms(9.984mSec)*/
#if 0 //M16使用
TCCR0 = 0x00; //stop
TCNT0 = 0x3D; //set count
OCR0 = 0xC3; //set compare
TCCR0 = 0x05; //start timer
#endif
#if 1 //M8定时器0初始化
TCCR0 = 0x00; //stop
TCNT0 = 0x3D; //set count
TCCR0 = 0x05; //start timer
#endif
TCCR1B = 0x00; //stop
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
WDR (); //this prevents a timeout on enabling
WDTCR |= (1<<WDCE) | (1<<WDE);/* 30-Oct-2006 Umesh*/
WDTCR = 0x0F;
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //timer interrupt sources
/*ADC及模拟比较单元*/
ADCSR = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80; //关闭模拟比较器
}
/*************************************************************************
Function: InitSysValue
Description: 初始化系统全局变量
Called by:
Input:
Output: 采样得到的数据
Return: 返回采样得到的数据
*************************************************************************/
void InitSysValue(void)
{
BOOLEAN flag = FALSE;
Delay(400); //延时200ms后再读取eeprom数据
//属性1
flag = GetEepromData(SENSORATTR1ADD, SENSORATTR1BACK, 4, &g_sensor.logAddr);
if(!flag){//eeprom数据有误
g_sensor.logAddr = 1;
g_sensor.sensorType = SENSORDEVTYPE0; //催化
g_sensor.gasType = 0; //甲烷
}
//属性2
flag = GetEepromData(SENSORATTR2ADD, SENSORATTR2BACK, 6, (INT8U *)(&g_sensor.gasRange));
if(!flag){//读取EEPROM正确
g_sensor.gasRange = 100;
g_sensor.testRange = 100;
g_sensor.dispUnit = 0;
g_sensor.dotFlag = 0;
}
//属性3
flag = GetEepromData(SENSORATTR3ADD, SENSORATTR3BACK, 6, (INT8U *)(&g_sensor.oldZero));
if(!flag){//读取EEPROM正确
g_sensor.oldZero = 0;
g_sensor.curZero = 0;
g_sensor.highTmpture = 50; //没有温度调整的标称值
g_sensor.lowTmpture = 50;
}
//属性4
flag = GetEepromData(SENSORATTR4ADD, SENSORATTR4BACK, 6, (INT8U *)(&g_sensor.scale1Chroma));
if(!flag){//读取EEPROM正确
g_sensor.scale1Chroma = 0;
g_sensor.scale1OldVot = 0;
g_sensor.scale1CurVot = 0;
}
//属性5
flag = GetEepromData(SENSORATTR5ADD, SENSORATTR5BACK, 6, (INT8U *)(&g_sensor.scale2Chroma));
if(!flag){//读取EEPROM正确
g_sensor.scale2Chroma = 0;
g_sensor.scale2OldVot = 0;
g_sensor.scale2CurVot = 0;
}
//属性6
flag = GetEepromData(SENSORATTR6ADD, SENSORATTR6BACK, 6, (INT8U *)(&g_sensor.chromaA));
if(!flag){//读取EEPROM正确
g_sensor.chromaA = 0;
g_sensor.chromaB = 0;
g_sensor.chromaC = 0;
}
//属性7
flag = GetEepromData(SENSORATTR7ADD, SENSORATTR7BACK, 6, (INT8U *)(&g_sensor.scale1Cnt));
if(!flag){//读取EEPROM正确
g_sensor.scale1Cnt = 0;
g_sensor.scale2Cnt = 0;
g_sensor.delTime = 0;
g_sensor.delTimeVot = 0;
}
//属性8
flag = GetEepromData(SENSORATTR8ADD, SENSORATTR8BACK, 6, (INT8U *)(&g_sensor.preDate));
if(!flag){//读取EEPROM正确
g_sensor.preDate = 0;
g_sensor.sensorLife = 0;
g_sensor.selfTime = 1; //上电自检时间默认为1分钟
g_sensor.deltaValue = 100; //相对灵敏度为100的默认值
}
//获取物理地址
g_sensor.sysAddr = ADD_H;
g_sensor.sysAddr = (g_sensor.sysAddr << 8) + ADD_L;
}
/*************************************************************************
Function: Timer0Ovf
Description: 定时25mS
Calls:
Called by: TIMER0中断
Input: 无
Output: 无
Return:
Other:mega系列通用
*************************************************************************/
#pragma interrupt_handler Timer0Ovf:iv_TIM0_OVF
void Timer0Ovf(void)
{
TCNT0 = 0x3D; //定时25ms
g_timeCount++;
if((g_timeCount % 12) == 0){//建立300毫秒标志
SetBit(g_timeSign, FLG_300MS);
}
if((g_timeCount % 40) == 0){
SetBit(g_timeSign, FLG_1S);//建立1秒到标志
}
if((g_timeCount % 240) == 0){
SetBit(g_timeSign , FLG_60S);//建立1分钟到标志
g_timeCount = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -