?? main.c.rpk
字號:
/********************************************************************
/ /
/ MicroC/Os-II The Real-Time Kernel /
/ main.c /
*********************************************************************/
#include "mc9s12dg128.h "
#include "includes.h"
#include "global.h"
#include "lib.h"
#include "int.h"
/********************************************************************/
void TaskStart(void *pdata);
void TaskPCCom();
void TaskEepromBufSav(void *pdata);
void TaskCCDInfoPro(void);
void TaskLineStyleReco(void);
void TaskSteerPDCtr(void *pdata);
void TaskInfoDis(void *pdata);
void TaskPelsValveInit(void *pdata);
void TaskMakeLine(void *pdata);
/********************************************************************/
void main(void)
{
OSInit();
SemSteerPDCtr=OSSemCreate(1);
SemCCDInfoPro=OSSemCreate(1);
SemBeeLineStyle=OSSemCreate(1);
SemAcrossStyle=OSSemCreate(1);
SemPCCom=OSSemCreate(1);
SemEepromBufSav=OSSemCreate(1);
SemMakeLine=OSSemCreate(1);
OSTaskCreate(TaskStart,(void *)0,&TaskStartStk[TASK_STK_SIZE-1],5);
OSTaskCreate(TaskPelsValveInit,(void *)0,&TaskPelsValveInitStk[TASK_STK_SIZE-1],8);
if(ExtOSSystemStart==1)
{
OSTaskCreate(TaskLineStyleReco,(void *)0,&TaskLineStyleRecoStk[TASK_STK_SIZE-1],9);
}
OSTaskCreate(TaskCCDInfoPro,(void *)0,&TaskCCDInfoProStk[TASK_STK_SIZE-1],10);
OSTaskCreate(TaskMakeLine,(void *)0,&TaskMakeLineStk[TASK_STK_SIZE-1],11);
OSTaskCreate(TaskSteerPDCtr,(void *)0,&TaskSteerPDCtrStk[TASK_STK_SIZE-1],12);
OSTaskCreate(TaskEepromBufSav,(void *)0,&TaskEepromBufSavStk[TASK_STK_SIZE-1],13);
OSTaskCreate(TaskInfoDis,(void *)0,&TaskInfoDisStk[TASK_STK_SIZE-1],14);
OSTaskCreate(TaskPCCom,(void *)0,&TaskPCComStk[TASK_STK_SIZE-1],15);
OSStart();
}
/********************************************************************/
void TaskStart(void *pdata)
{
pdata=pdata;
OSTaskSuspend(9);
OSTaskSuspend(14);
OSTaskSuspend(15);
OSTimerInit();//Enableinterrupt;
Lib_PA_INIT();
//LibRTIInit();
OSStatInit();
for(;;)
{
PORTB=~PORTB;
OSTaskSuspend(5);
}
}
/********************************************************************/
void TaskPelsValveInit(void)
{
uchar pels;
uchar pelsmax;
uchar pelsmin;
uchar cnt=0;
//uchar lines=0;
for(;;)
{
OSSemPend(SemCCDInfoPro,0,&err);
pelsmax=ExtPelsVal[0][0];
pelsmin=ExtPelsVal[0][0];
for(pels=1;pels<35;pels++)
{
if(pelsmax<ExtPelsVal[0][pels])
{
pelsmax=ExtPelsVal[0][pels];
}
else
{
if(pelsmin>ExtPelsVal[0][pels])
{
pelsmin=ExtPelsVal[0][pels];
}
}
}
ExtPelsValve=(pelsmax*4+pelsmin*6)/10+ExtPelsValve;
cnt++;
if(cnt==100)
{
ExtPelsValve=ExtPelsValve/100;
PWME=0b00101010;
PORTB=~PORTB;
OSTaskResume(9);
OSTaskResume(14);
OSTaskSuspend(8);
}
}
}
/********************************************************************/
void TaskLineStyleReco(void)
{
uchar pels;
uchar cnt=0;
for(;;)
{
OSSemPend(SemCCDInfoPro,0,&err);
for(pels=0;pels<35;pels++)
{
ExtPosValAcc=ExtPosValAcc+ExtPelsVal[ExtLines][pels];
}
ExtPosValAvg=ExtPosValAcc/35;
ExtPosValAcc=0;
if(ExtPosValAvg<ExtPelsValve&&ExtPosValAvg!=0)
{
for(pels=0;pels<35;pels++)
{
if(ExtPelsVal[ExtLines][pels]<ExtPelsValve&&pels<34)
{
cnt++;
}
else
{
if(cnt>3)
{
if(ExtPelsVal[ExtLines][35]<=254)
{ExtPelsVal[ExtLines][35]=253;}
else
{ExtPelsVal[ExtLines][35]=254;}
}
cnt=0;
}
}
if(ExtPelsVal[ExtLines][35]==254)
{
PTM_PTM0=1;
Lib_AlARM_START();
ExtPelsVal[ExtLines][35]=255;
}
else
{
PTM_PTM2=1;
Lib_AlARM_START();
ExtPelsVal[ExtLines][35]=255;
}
}
else
{
Lib_AlARM_END();
PORTB_BIT2=~PORTB_BIT2;
OSSemPost(SemBeeLineStyle);
}
}
}
/********************************************************************/
void TaskCCDInfoPro(void *pdata)
{
uint ExtPosChk[3][3]={0,0,0,0,0,0,0,0,0};
uchar poschkcntval=0; //黒點數閥值
uchar poschkcnt=0; //信息存放區下標
uchar pels=0; //像素
uchar cnt=0; //黒點記數
uchar lostchk=0; //信息有效確認,1為有效,0為無效
///
uchar lostpels=252; //丟失點標明
///
uchar poschkminavgcnt=0; //均值最小下標
uint poschkminavg=0; //最小均值
///
uchar poschkaccmaxvalcnt=0;//黒點記數最大下標
uchar poschkaccmaxval=0; //最大黒點記數
///
pdata=pdata;
for(;;)
{
OSSemPend(SemBeeLineStyle,0,&err);
////////////// //設定不同行的黒線確定點數
if(ExtLines<5)
{
poschkcntval=2;
}
else
{
poschkcntval=1;
}
/////////////////////////////////////////
for(pels=0;pels<35;pels++)
{
///////////////
if(ExtPelsVal[ExtLines][pels]<ExtPelsValve)
{
cnt++;//黒點記數
ExtPosChk[poschkcnt][0]=ExtPosChk[poschkcnt][0]+ExtPelsVal[ExtLines][pels]; //值累加
/////////////////////////////////當黒點在34時,不會進入檢測程序,因而在些開設檢測
if(pels==34&&cnt>poschkcntval)
{
lostchk=1;//指明此行有黒點,信息有效
ExtPosChk[poschkcnt][2]=cnt;//黒點
ExtPosChk[poschkcnt][1]=pels+1-cnt/2;//位置
ExtPosChk[poschkcnt][0]=ExtPosChk[poschkcnt][0]/cnt;//均值
/////////////////////////////////防止程序異常
if(ExtPosChk[poschkcnt][1]<1)
{ExtPosChk[poschkcnt][1]=1;}
if(ExtPosChk[poschkcnt][1]>35)
{ExtPosChk[poschkcnt][1]=35;}
poschkcnt++;
cnt=0;
}
}
else
{
///////////////////////從黒點變白點時進入此程序,大于
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -