📄 hardware.c
字号:
{
static unsigned int xdata uiCountValue = 0;
static unsigned char xdata uchLEDControlFlag = 0;
uiCountValue++;
TF2 = 0;
if (uiCountValue >= 3)
{
if (uchLEDControlFlag == 0)
{
HWOKLEDControl(0); //灯亮
uchLEDControlFlag = 1;
uiCountValue = 0;
}
else
{
HWOKLEDControl(1); //灯灭 他们的控制受系统OK状态控制
uchLEDControlFlag = 0;
uiCountValue = 0;
}
}
}
//*************************************************
// ADC0初始化 *
//*************************************************
void ADC0_Init (void)
{
ADC0CN = 0x44; //ADC0 控制
AMX0CF = 0x00; //单端输入
AMX0SL = 0x00; //采样通道初始化
ADC0CF = 0x58; //增益,时钟=22.1184/6M
REF0CN=0x02; //外部参考
AD0EN=1; //ADC0使能
EIE2|=0x02; //允许ADC中断
EIP2 |= 0x02; //采样ADC0中断为高优先级
}
//*************************************************
// 定时器3初始化 *
//*************************************************
void SetSampleRate(int counts)
{
TMR3CN = 0x00; // 停止定时器3,清除TF3,使用SYSCLK
TMR3RL = -counts; // 初始化重载值
TMR3 = 0xffff; // 立即重装载
EIE2 &= ~0x01; // 禁止定时器3中断
TMR3CN |= 0x04; // 启动定时器3
}
//-------------------------------------------------------------------------
//函数名称:void SetSampleTypeHW(unsigned char uchChannelType)
//功 能:将通道类型设置到硬件模块中
//输入参数:通道类型
//返 回:无
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SetSampleTypeHW(unsigned char uchChannelType)
{
SampleStopControl(); //HHH
if (((uchChannelType > 12) && (uchChannelType < 19)) || ((uchChannelType > 20) && (uchChannelType < 23)) || (uchChannelType == 28))
{
uchSampleType = uchChannelType;
}
else
{
uchSampleType = 13; //设定类型,不在范围之内默认轴位置
}
// SampleStartControl();
}
//-------------------------------------------------------------------------
//函数名称:void SetInitChannel(void)
//功 能:设置通道初始化
//输入参数:无
//返 回:无
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SetInitChannel(void)
{
switch(uchSampleType)
{
case 13: //加速度输入 输出加速度
AMX0SL = 0x00;
break;
case 14: //加速度输入 输出速度
AMX0SL = 0x04;
break;
case 15: // 加速度输入 输出位移
AMX0SL = 0x00;
break;
case 16: // 速度输入 输出速度
AMX0SL = 0x00;
break;
case 17: //速度输入 输出位移
AMX0SL = 0x04;
break;
case 18: // 位移输入 输出位移
AMX0SL = 0x00;
break;
case 21: // 涡流+速度 输出复合式振动
AMX0SL = 0x00;
break;
case 22: //LVDT输入 输出机壳膨胀
AMX0SL = 0x01;
break;
case 28: //LVDT输入 输出机壳膨胀
AMX0SL = 0x01;
break;
default:
AMX0SL = 0x00;
break;
}
}
//-------------------------------------------------------------------------
//函数名称:void SampleStartControl(void)
//功 能:开始采样
//输入参数:无
//返 回:无
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SampleStartControl(void)
{
TMR3CN |= 0x04;
}
//-------------------------------------------------------------------------
//函数名称:void SampleStopControl(void)
//功 能:停止采样
//输入参数:无
//返 回:无
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SampleStopControl(void)
{
TMR3CN &= ~0x04;
}
//--------------------------------------------------------------------------------------------------
//函数名称:void SoftReset(void)
//功 能:软件复位
//输入参数:无
//返 回:无
//-------------------------------------------------------------------------------------------------
void SoftReset(void)
{
RSTSRC |= 0x10;
}
//-------------------------------------------------------------------------
//函数名称:void InitSampleType(void)
//功 能:将采样类型初始化成位变量的形式
//输入参数:无
//返 回:无
//-------------------------------------------------------------------------
void InitSampleType(void)
{
if((uchSampleType == 13) || (uchSampleType == 16) || (uchSampleType == 18))
{
b_NotIntegralChannelType = 1;
b_IntegralChannelType = 0;
b_LVDTChannelType = 0;
}
else if ((uchSampleType == 14) || (uchSampleType == 17))
{
b_NotIntegralChannelType = 0;
b_IntegralChannelType = 1;
b_LVDTChannelType = 0;
}
else if ((uchSampleType == 22) || (uchSampleType == 28))
{
b_NotIntegralChannelType = 0;
b_IntegralChannelType = 0;
b_LVDTChannelType = 1;
}
else
{
b_NotIntegralChannelType = 1;
b_IntegralChannelType = 0;
b_LVDTChannelType = 0;
}
}
//--------------------------------------------------------
//函数名称:void ADC0_ISR (void) interrupt 15
//功 能:采样中断采样数据,
//输入参数:无
//返 回:无
//作 者:佟文杰
//----------------------------------------------------------
void ADC0_ISR (void) interrupt 15
{
AD0INT = 0;
if (b_NotIntegralChannelType == 1) //非积分通道数据采集 a-a v-v d-d
{
// if((AMX0SL == 0x00)||(AMX0SL == 0x01)||(AMX0SL == 0x02)||(AMX0SL == 0x03))
// {
if(AMX0SL == 0x00)
{
AMX0SL = 0x01;
SampBuffer0[SamplePTR0] = ADC0;
SamplePTR0 = (SamplePTR0 + 1) & MAXLENGTH;
}
else if(AMX0SL == 0x01)
{
AMX0SL = 0x02;
SampBuffer1[SamplePTR1] = ADC0;
SamplePTR1 = (SamplePTR1 + 1) & MAXLENGTH;
}
else if(AMX0SL == 0x02)
{
AMX0SL = 0x03;
SampBuffer2[SamplePTR2] = ADC0;
SamplePTR2 = (SamplePTR2 + 1) & MAXLENGTH;
}
else
{
AMX0SL = 0x00;
SampBuffer3[SamplePTR3] = ADC0;
SamplePTR3 = (SamplePTR3 + 1) & MAXLENGTH;
// if((SamplePTR3%uiGroupLength) == 0)
if((SamplePTR3 & 0x0ff) == 0)
{
SetSampleLocationStatus(uchSampleLocationCounter);
uchSampleLocationCounter = ( uchSampleLocationCounter + 1 ) & 0x0f;
SetSampleCompleteStatusAD(SAMPLECOMPLETETRUE);
SetSampleCompleteStatusMain(SAMPLECOMPLETETRUE);
SetCurProcessingIndex();
}
}
}
else if (b_IntegralChannelType == 1) //积分通道数据采集 a-v v-d
{
// if((AMX0SL == 0x04)||(AMX0SL == 0x01)||(AMX0SL == 0x05)||(AMX0SL == 0x03))
// {
if(AMX0SL == 0x04) //积分1通道
{
AMX0SL = 0x01;
SampBuffer0[SamplePTR0] = ADC0;
SamplePTR0 = (SamplePTR0 + 1) & MAXLENGTH;
}
else if(AMX0SL == 0x01) //直流1通道
{
AMX0SL = 0x05;
SampBuffer1[SamplePTR1] = ADC0;
SamplePTR1 = (SamplePTR1 + 1) & MAXLENGTH;
}
else if(AMX0SL == 0x05) //积分2通道
{
AMX0SL = 0x03;
SampBuffer2[SamplePTR2] = ADC0;
SamplePTR2 = (SamplePTR2 + 1) & MAXLENGTH;
}
else //直流2通道
{
AMX0SL = 0x04;
SampBuffer3[SamplePTR3] = ADC0;
SamplePTR3 = (SamplePTR3 + 1) & MAXLENGTH;
if((SamplePTR3 & 0x0ff) == 0)
{
SetSampleLocationStatus(uchSampleLocationCounter);
uchSampleLocationCounter = ( uchSampleLocationCounter + 1 ) & 0x0f;
SetSampleCompleteStatusAD(SAMPLECOMPLETETRUE);
SetSampleCompleteStatusMain(SAMPLECOMPLETETRUE);
SetCurProcessingIndex();
}
}
}
else if (b_LVDTChannelType == 1) //22 28 LVDT通道类型
{
// if((AMX0SL == 0x01) || (AMX0SL == 0x03))
// {
if(AMX0SL == 0x01)
{
AMX0SL = 0x03;
SampBuffer1[SamplePTR1] = ADC0;
SamplePTR1 = (SamplePTR1 + 1) & MAXLENGTH;
}
else
{
AMX0SL = 0x01;
SampBuffer3[SamplePTR3] = ADC0;
SamplePTR3 = (SamplePTR3 + 1) & MAXLENGTH;
if((SamplePTR3 & 0x0ff) == 0)
{
SetSampleLocationStatus(uchSampleLocationCounter);
uchSampleLocationCounter = ( uchSampleLocationCounter + 1 ) & 0x07;
SetSampleCompleteStatusAD(SAMPLECOMPLETETRUE);
SetSampleCompleteStatusMain(SAMPLECOMPLETETRUE);
}
}
}
else
{
SoftReset(); //如果通道类型不对,立即重新启动系统
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//unsigned char readCANreg(unsigned char xdata *regAddr)
//入口参数:读取的地址
//函数返回:读出的数据
//全局变量:无
//功能描述:在读某一地址的数据时,调用该函数
//函数说明:从SJA1000中读取数据
/////////////////////////////////////////////////////////////////////////////////////////
unsigned char readCANreg(unsigned char xdata *regAddr)
{
unsigned char uchValue;
uchValue = *regAddr;
return uchValue;
}
unsigned char readCANregRemote(unsigned char xdata *regAddr)
{
unsigned char uchValue;
uchValue = *regAddr;
return uchValue;
}
/////////////////////////////////////////////////////////////////////////////////////////
//void writeCANreg(unsigned char xdata *regAddr, unsigned char value)
//入口参数:写的地址,写的数据
//函数返回:无
//全局变量:无
//功能描述:在写某一地址的数据时,调用该函数
//函数说明:向SJA1000中写入数据
/////////////////////////////////////////////////////////////////////////////////////////
void writeCANreg(unsigned char xdata *regAddr, unsigned char value)
{
*regAddr = value;
}
void writeCANregRemote(unsigned char xdata *regAddr, unsigned char value)
{
*regAddr = value;
}
/////////////////////////////////////////////////////////////////////////////////////////
//函数名称:void CAN_Init(unsigned char soID,unsigned char check,unsigned char Delay)
//入口参数:soID 地址 check=1只接收本地址数据=0接收所有的数据 Delay每次重发延迟的时间
//函数返回:无
//全局变量:无
//功能描述:设置工作模式,波特率,总线时序等
//函数说明:初始化CAN控制器SJA1000
//编写人: 于学伟
/////////////////////////////////////////////////////////////////////////////////////////
void CAN_Init(unsigned char soID, unsigned char check) //, unsigned char Delay)
{
unsigned char sjaMOD;
unsigned char shield_flag;
unsigned char shield_ID;
unsigned int xdata uitemp;
unsigned int xdata uiCount;
FeedDog();
P4 = P4 & 0xEF;
P4 = P4 & 0xEF;
for(uitemp = 0; uitemp< 200; uitemp++)
{
uitemp++;
uitemp--;
}
P4 = P4 | 0x10;
shield_flag = check;
writeCANreg(SJA_IER, 0x00); // SJA_IER = 0x00; 禁止SJA1000所有的中断
writeCANreg(SJA_MOD, 0x01); // SJA_MOD = 0x01; 进入复位模式
sjaMOD = readCANreg(SJA_MOD); //判断是否进入复位模式
uiCount = 0;
while ((sjaMOD & 0x01) == 0 ) //判断是否复位 modify?????
{
uiCount++;
writeCANreg(SJA_MOD, 0x01);
sjaMOD = readCANreg(SJA_MOD);
if(uiCount >= 1000)
{
break;
}
}
writeCANreg(SJA_EWLR, 0x64); //错误报警寄存器设置值为100
writeCANreg(SJA_CDR, 0xe8); // SJA_CDR = 0xe8; 设置为PeliCAN模式,关闭时钟,只有RX0被激活,fosc/2
sjaMOD = readCANreg(SJA_MOD); //选择双个验收滤波器,32位长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -