📄 main.c
字号:
/**************************************************************************************
*
* 北京航空航大学 706教研室
* All rights reserved. 2005
*
*======================================================================================
*
* 文件名: main.c
* 大纲: 主程序
* 文件标识:
* 摘 要:
*
*======================================================================================
*
* 描述: 汽车仪表主程序
*
* 控制器: Freescale MC9s12H256
*
* 编译器: Metrowerks CodeWarrior IDE v5.2.1149
*
*======================================================================================
*
* 当前版本: 3.1.0
* 编程人员: 孙进,曹磊
* 完成日期: 2006年3月
*
*======================================================================================
*
* 更新历史记录:
*
***************************************************************************************/
#include <hidef.h> /* common defines and macros */
#include <MC9S12H256.h> /* derivative information */
#include "..\Ucos\includes.h"
#include "..\protocol stack\J1939_includes.h"
#include "..\driver\printp.h"
#include "..\driver\Motor.h"
#include "..\driver\Motor_includes.h"
#include "..\driver\lcd.h"
#include "..\driver\eeprom.h"
#include "user.h"
//任务栈大小定义
#define START_STK_SIZE 200
#define TASK_J1939_STK_SIZE 200
#define TASK_EngSpeed_STK_SIZE 200
#define TASK_VehSpeed_STK_SIZE 200
#define TASK_WatTemp_STK_SIZE 200
#define TASK_OilPres_STK_SIZE 200
#define TASK_VehDistance_STK_SIZE 200
#if MUTIPLE_PACKAGE_TRANSPORT
#define TASK_FaultCode_STK_SIZE 200
#endif
#define TASK_Instruc_STK_SIZE 200
//演示系统用
#define TASK_GeneralSignal_STK_SIZE 200
#define TASK_EmergSignal_STK_SIZE 200
#define START_PRIO 4
#define J1939_PRIO 5
#define EMERG_SIGNAL_PRIO 6
#define ENGSPEED_PRIO 7
#define VEHSPEED_PRIO 8
#define WATTEMP_PRIO 10
#define OILPRES_PRIO 11
#if MUTIPLE_PACKAGE_TRANSPORT
#define FAULTCODE_PRIO 12
#endif
#define INSTRUC_PRIO 13
#define VEHDISTANCE_PRIO 14
#define GENERAL_SIGNAL_PRIO 16
//水温表和油压表分为9档显示
#define STEP0 0
#define STEP1 20
#define STEP2 40
#define STEP3 60
#define STEP4 80
#define STEP5 100
#define STEP6 120
#define STEP7 140
#define STEP8 160
#define STEP9 180
/*******************************************/
//全局变量定义
/******************************************/
OS_STK StartTaskStk[START_STK_SIZE]; //起始任务
OS_STK TaskJ1939Stk[TASK_J1939_STK_SIZE]; //协议栈任务
OS_STK TaskEngSpeedStk[TASK_EngSpeed_STK_SIZE]; //转速显示任务
OS_STK TaskVehSpeedStk[TASK_VehSpeed_STK_SIZE]; //车速显示任务
OS_STK TaskWatTempStk[TASK_WatTemp_STK_SIZE]; //水温显示任务
OS_STK TaskOilPresStk[TASK_OilPres_STK_SIZE]; //油压显示任务
OS_STK TaskVehDistanceStk[TASK_VehDistance_STK_SIZE]; //里程显示任务
OS_STK TaskInstrucStk[TASK_Instruc_STK_SIZE]; //串口指令任务
#if MUTIPLE_PACKAGE_TRANSPORT
OS_STK TaskFaultCodeStk[TASK_FaultCode_STK_SIZE]; //故障码显示任务
#endif
void *EngSpeed_ptr; //转速指针
void *VehSpeed_ptr; //车速指针
void *WatTemp_ptr; //水温指针
void *OilPres_ptr; //油压指针
void *VehDistance_ptr; //里程指针
#if MUTIPLE_PACKAGE_TRANSPORT
void *FaultCode_ptr; //故障码指针
#endif
void *Instruc_ptr; //串口指令指针
OS_EVENT *EngSpeed_MBox; //转速消息邮箱
OS_EVENT *VehSpeed_MBox; //车速消息邮箱
OS_EVENT *WatTemp_MBox; //水温消息邮箱
OS_EVENT *OilPres_MBox; //油压消息邮箱
OS_EVENT *VehDistance_MBox; //里程消息邮箱
OS_EVENT *Instruc_MBox; //串口指令邮箱
OS_EVENT *Printp_Sem; //串口调用信号量
#if MUTIPLE_PACKAGE_TRANSPORT
OS_EVENT *FaultCode_MBox; //故障码消息邮箱
#endif
unsigned char Instruction; //数据请求
J1939_TX_MESSAGE_T J1939msg; //协议栈发送数据
extern FAULT_CODE_T FaultCode; //故障码
extern VEH_DISTANCE_T VehDistance; //里程
INT8U err; //错误
//演示系统用
OS_STK TaskGeneralSignalStk[TASK_GeneralSignal_STK_SIZE]; //指示灯显示任务
OS_STK TaskEmergSignalStk[TASK_EmergSignal_STK_SIZE];
void *GeneralSignal_ptr; //指示灯消息指针
void *EmergSignal_ptr;
OS_EVENT *GeneralSignal_MBox; //指示灯消息邮箱
OS_EVENT *EmergSignal_MBox;
OS_EVENT *EmergFlg_Sem;
/*******************************************/
//函数声明
/******************************************/
void IO_Init(void);
void RTIInit(void);
void Init_mcu(void);
void StartTask(void* pdata);
void TaskJ1939(void* pdata);
void TaskEngSpeed(void* pdata);
void TaskVehSpeed(void* pdata);
void TaskWatTemp(void* pdata);
void TaskOilPres(void* pdata);
#if MUTIPLE_PACKAGE_TRANSPORT
void TaskFaultCode(void* pdata);
#endif
void TaskInstruc(void* pdata);
void TaskVehDistance(void* pdata);
void SCIReceive_ISR(void);
//演示系统用
void TaskGeneralSignal(void* pdata);
void TaskEmergSignal(void* pdata);
/****************************************************************************************
@函数名称 : void main(void)
@参数 : None
@返回值 : None
@描述 : 主程序
@作者 : 孙进,曹磊
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void main(void)
{
OSInit();
OSTaskCreate(StartTask, (void*)0, (void*)&StartTaskStk[START_STK_SIZE-1], START_PRIO);
//信号量创建
Printp_Sem = OSSemCreate(1);
EmergFlg_Sem = OSSemCreate(0);
//邮箱创建
EngSpeed_MBox = OSMboxCreate(EngSpeed_ptr);
VehSpeed_MBox = OSMboxCreate(VehSpeed_ptr);
WatTemp_MBox = OSMboxCreate(WatTemp_ptr);
OilPres_MBox = OSMboxCreate(OilPres_ptr);
VehDistance_MBox = OSMboxCreate(VehDistance_ptr);
#if MUTIPLE_PACKAGE_TRANSPORT
FaultCode_MBox = OSMboxCreate(FaultCode_ptr);
#endif
Instruc_MBox = OSMboxCreate(Instruc_ptr);
//演示系统用
GeneralSignal_MBox = OSMboxCreate(GeneralSignal_ptr);
EmergSignal_MBox = OSMboxCreate(EmergSignal_ptr);
OSStart();
}
/****************************************************************************************
@函数名称 : void IO_init(void)
@参数 : None
@返回值 : None
@描述 : 初始化函数,设置 PORTH,PORTJ,PORTL为输出方式;
并设置IO口驱动能力为Full drive strength
@作者 : 孙进
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void IO_Init(void)
{
DDRH = 0xff;
RDRH = 0;
DDRJ = 0x0f;
RDRJ = 0;
DDRL = 0xe0;
RDRL = 0;
DDRT = 0xc0;
RDRT = 0;
PTH = 0x0;
PTJ = 0x0;
PTL = 0x0;
}
/****************************************************************************************
@函数名称 : void RTIIinit(void)
@参数 : None
@返回值 : None
@描述 : RTI初始化函数,设置在16M晶振情况下产生20.48ms定时中断
并允许RTI中断
@作者 : 孙进
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void RTIInit(void)
{
RTICTL = 0x69; //产生,16M晶振的情况下
CRGINT_RTIE = 1; //允许RTI中断
}
/****************************************************************************************
@函数名称 : void Init_mcu(void)
@参数 : None
@返回值 : None
@描述 : 硬件及J1939协议栈初始化函数
@作者 : 孙进
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void Init_mcu(void)
{
uart_init(); //初始化UART
IO_Init(); //初始化IO
InitLcd(); //初始化LCD
init_motor1(); //初始化motor1
init_motor2(); //初始化motor2
init_motor3(); //初始化motor3
init_motor4(); //初始化motor4
J1939_stk_init(); //初始化协议栈
init_timer(); //初始化用于motor的定时器
RTIInit(); //初始化RTI
DisplayNone();
DisplayTripDistance(0, 0);
DisplayTotalDistance(0);
}
/****************************************************************************************
@函数名称 : void StartTask(void* pdata)
@参数 : void* pdata
@返回值 : None
@描述 : 起始任务
@作者 : 曹磊
@最后编辑时间 : 2006-08-13
@版本 : V3.1.0
*****************************************************************************************/
void StartTask(void* pdata)
{
unsigned char err;
pdata = pdata;
Init_mcu();
EnableInterrupts;
back0_motor(); //回零
OSTaskCreate(TaskJ1939, (void*)0, (void*)&TaskJ1939Stk[TASK_J1939_STK_SIZE-1], J1939_PRIO);
OSTaskCreate(TaskEngSpeed, (void*)0, (void*)&TaskEngSpeedStk[TASK_EngSpeed_STK_SIZE-1], ENGSPEED_PRIO);
OSTaskCreate(TaskVehSpeed, (void*)0, (void*)&TaskVehSpeedStk[TASK_VehSpeed_STK_SIZE-1], VEHSPEED_PRIO);
OSTaskCreate(TaskWatTemp, (void*)0, (void*)&TaskWatTempStk[TASK_WatTemp_STK_SIZE-1], WATTEMP_PRIO);
OSTaskCreate(TaskOilPres, (void*)0, (void*)&TaskOilPresStk[TASK_OilPres_STK_SIZE-1], OILPRES_PRIO);
OSTaskCreate(TaskVehDistance,(void*)0,(void*)&TaskVehDistanceStk[TASK_VehDistance_STK_SIZE-1],VEHDISTANCE_PRIO);
#if MUTIPLE_PACKAGE_TRANSPORT
OSTaskCreate(TaskFaultCode,(void*)0,(void*)&TaskFaultCodeStk[TASK_FaultCode_STK_SIZE-1], FAULTCODE_PRIO);
#endif
OSTaskCreate(TaskInstruc,(void*)0,(void*)&TaskInstrucStk[TASK_Instruc_STK_SIZE-1],INSTRUC_PRIO);
OSTaskCreate(TaskGeneralSignal,(void*)0,(void*)&TaskGeneralSignalStk[TASK_GeneralSignal_STK_SIZE-1],GENERAL_SIGNAL_PRIO);
OSTaskCreate(TaskEmergSignal,(void*)0,(void*)&TaskEmergSignalStk[TASK_EmergSignal_STK_SIZE-1],EMERG_SIGNAL_PRIO);
for(;;)
{
err = OSTaskSuspend(START_PRIO);
}
}
/****************************************************************************************
@函数名称 : void TaskJ1939(void* pdata)
@参数 : void* pdata
@返回值 : None
@描述 : J1939协议栈任务
@作者 : 孙进
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void TaskJ1939(void* pdata)
{
pdata = pdata;
for(;;)
{
J1939_stk_periodic();
OSTimeDly(1); //任务挂起20ms
}
}
/****************************************************************************************
@函数名称 : void TaskEngSpeed(void* pdata)
@参数 : void* pdata
@返回值 : None
@描述 : 发动机速度任务
@作者 : 孙进,曹磊
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void TaskEngSpeed(void* pdata)
{
unsigned char err;
unsigned int *msg;
unsigned int tacho;
unsigned int tachostep;
unsigned int step;
char result;
pdata = pdata;
for(;;)
{
msg = (unsigned int*)OSMboxPend(EngSpeed_MBox, 0, &err);
if(err == OS_NO_ERR)
{
tacho = *msg;
tacho = tacho >> 8; //换算为转角
step = tacho * 69; //换算为电机步数
tachostep = (unsigned int)(step);
result = motor_move(TACHOMETER,tachostep);
}
OSTimeDly(10); //任务挂起200ms
}
}
/****************************************************************************************
@函数名称 : void TaskVehSpeed(void* pdata)
@参数 : void* pdata
@返回值 : None
@描述 : 车辆速度任务
@作者 : 孙进,曹磊
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void TaskVehSpeed(void* pdata)
{
unsigned char err;
unsigned int *msg;
unsigned int speed;
unsigned int speedstep;
unsigned int step;
char result;
pdata = pdata;
for(;;)
{
msg = (unsigned int*)OSMboxPend(VehSpeed_MBox, 0, &err);
if(err == OS_NO_ERR)
{
speed = *msg;
speed = speed >> 8; //换算为转角
step = speed * 84; //换算为电机步数
speedstep = (unsigned int)(step);
result = motor_move(SPEEDOMETER,speedstep);
}
OSTimeDly(10); //任务挂起200ms
}
}
/****************************************************************************************
@函数名称 : void TaskWatTemp(void* pdata)
@参数 : void* pdata
@返回值 : None
@描述 : 冷却液温度任务
@作者 : 孙进,曹磊
@最后编辑时间 : 2006-03-31
@版本 : V3.1.0
*****************************************************************************************/
void TaskWatTemp(void* pdata)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -