?? main.c
字號:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#define TIME_6us 38
#define Mid_PWM 2932
#define Right_Max 3465
#define Left_Max 2399
#define TIME_1MS 6656
#define LINE_MAX 40
#define LINE_B 35
#define LINE_M 15
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//extern word temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
//byte Pre_SetSpeed0;
//byte Pre_SetSpeed1;
//byte Pre_SetSpeed2;
byte Max_Speed;
byte PreLength;
byte Min_Speed;
byte SpeedTerminal=1;
byte Count=0;
byte Length=0;
int ErrorSum=0;
//void key(void);
//void IintEEPROM(void);
void SetSpeed(byte v);
void InitPWM(void);
void SetAngle(signed char a);
void SetDutycycle(word Duty);
//word ReadEEPROM(word addr);
word Duty;
byte Speed;
byte Speed_array[2]={0};
byte Cal_Speed;
byte NearFlag = 1;
byte MidFlag = 1;
char SpeedFlag=0;
char PreSpeedFlag;
static byte i =0;
static word x=0;
byte FieldFlag=0;
word LineNum =0;
word LineCount=25;
byte BlackCount[LINE_MAX]={0};
signed char Mid_def = 16,flag=1,blacklocationl,blacklocationr,leftflag,rightflag;
static char m,n;
static char Mid_left,Mid_right;
//byte LineValue_Near[35] = {0} ;
//byte LineValue_Mid[35] = {0} ;
//byte LineValue_Far[35] = {0} ;
byte LineValue[LINE_MAX][33]= {0};
signed char BlackLocation[LINE_MAX]={0};
void Delay_6us(void);
signed char Error_N[LINE_MAX]={0};
signed char Error_N_1[LINE_MAX]={0};
void CCD_BlackLocation(void);
/////////////Interrupt///////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void CAP_Line(void)
{
TFLG1_C1F=1;
LineNum++;
}
interrupt void CAP_IRQ(void)
{
FieldFlag=1;
INTCR_IRQEN= 0;
TIE_C1I=1;
//PORTB=0xff;
}
/******************************************************/
#pragma CODE_SEG DEFAULT
/////////////Delay//////////////
void Delay_6us(void)
{
int k;
for (k=0; k<TIME_6us;k++ ) { }
}
/////////////Delay_ms///////////
void Delay_ms(word xms)
{
int k , j;
for (j=0; j<xms; j++)
{
for (k=0; k<TIME_1MS; k++);
}
}
/////////////Bus////////////////
void init_Bus(void)
{
REFDV=3;
SYNR=9; //bus clock=16MHz*(SYNR+1)/(REFDV+1)
while(0==CRGFLG_LOCK); //untill VCO run stable
CLKSEL=0x80; // PLLSEL=1
}
/////////////SCI////////////////
//初始化串行口參數,波特率設置為9600
void InitSCI(void)
{
SCI0BD = 260;//設置波特率寄存器,波特率為9600 156
SCI0CR2_TE = 1;//發送使能
SCI0CR2_RE = 1;//接收使能
}
//向串口發送一個字節ASCII碼
void TxSCI(byte data)
{
while(SCI0SR1_TDRE==0); //檢查發送標志
SCI0DRL = data;
}
//向串口發送一個字節ASCII碼'|'
void TxSCI_over(void)
{
while(SCI0SR1_TDRE==0); //檢查發送標志
SCI0DRL = '*';
}
//向串口發送多個字節ASCII碼
void TxsSCI(byte *p)
{
while(*p!='\0')
{
TxSCI(*p++);
}
}
//向串口發送1個字節十進制數
void TxSCI_1B(byte data)
{
byte temp[4];
temp[0] = data/100%10+0x30;
temp[1] = data/10%10+0x30;
temp[2] = data%10+0x30;
temp[3] = '\0';
TxsSCI(temp);
TxSCI_over();
}
//向串口發送2個字節十進制數
void TxSCI_2B(word data)
{
byte temp[6];
temp[0] = data/10000%10+0x30;
temp[1] = data/1000%10+0x30;
temp[2] = data/100%10+0x30;
temp[3] = data/10%10+0x30;
temp[4] = data%10+0x30;
temp[5] = '\0';
TxsSCI(temp);
TxSCI_over();
}
/////////////ECT////////////////
void init_ECT(void)
{
TCTL4=0b00010111;
TSCR1_TEN=1;
ICPAR_PA0EN=1;
//PBCTL_PBEN=1;
TSCR2_PR=0;
}
////////////IRQ///////////////
void init_IRQ(void)
{
INTCR_IRQE=1;
}
/////////////ATD////////////////
void init_ATD(void)
{
ATD1CTL2 = 0xc0;//AD0模塊使能,讀取轉換結果后自動清零
ATD1CTL3 = 0x08;
ATD1CTL4 = 0x81;//8位精度,采樣時間為2個AD轉換時鐘,4分頻
ATD1CTL5=0xA0; //右對齊,單通道
ATD1DIEN=0x00; //禁止數字輸入
}
////////////CCD_Info///////////
void CCD_Info(void)
{
//PORTB=0;
INTCR_IRQEN= 1;
while(!FieldFlag);
//PACN0=0;
for(m=0;m<LINE_MAX;m++)
{
while(LineNum<LineCount);
Delay_6us();
for(n=0;n<33;n++)
{
while(!ATD1STAT0_SCF);
LineValue[m][n]=ATD1DR0L;
}
LineCount+=7;
/* for(n=0;n<33;n++)
{
BlackCount[m]=0;
if(LineValue[m][n]<64)
{
LineValue[m][n]=0;
BlackCount[m]++;
}
else LineValue[m][n]=1;
}
if(BlackCount[m]>6)
{
BlackLocation[m]=127;
continue;
} */
}
/* for(Mid_left=16,Mid_right=16;Mid_right<33;Mid_left--,Mid_right++)
{
if(LineValue[m][Mid_left]==0)
{
BlackLocation[m]= Mid_left ;
break;
}
if(LineValue[m][Mid_right]==0)
{
BlackLocation[m]= Mid_right;
break;
}
if(Mid_right==32) BlackLocation[m]=127;
}
} */
ATD1CTL2=0X00;
//Speed = PACN0;
TIE_C1I=0;
FieldFlag=0;
LineNum=0;
LineCount=25;
}
////////////BlackLocation/////////
void CCD_BlackLocation(void)
{
for(m=LINE_MAX-1;m>=0;m--)
{ PORTA_BIT7=1;
BlackCount[m] = 0;
for(n=0;n<33;n++)
{
if(LineValue[m][n]<64)
{
LineValue[m][n]=0;
BlackCount[m]++;
}
else LineValue[m][n]=1;
}
if(BlackCount[m]>10)
{
BlackLocation[m]=127; //處理十字線和異常黑色區域標志
continue;
}
if(BlackCount[m] == 0)
{
BlackLocation[m]=125; //全白行標志
continue;
}
if(BlackLocation[m] != 125)
{
if(LineValue[m][Mid_def] != 0)
{
if( (LineValue[m][Mid_def - 2] == 0) && (Mid_def > 2))
{
Mid_left = Mid_right = Mid_def - 2;
}
if ((LineValue[m][Mid_def + 2] == 0) && (Mid_def < 30))
{
Mid_left = Mid_right = Mid_def +2;
}
if((LineValue[m][Mid_def-2] != 0) && (LineValue[m][Mid_def+2] != 0))
{
flag = 0;
}//沒找到黑點,則從中間開始搜索
}
else
{
Mid_left = Mid_right = Mid_def;
}
if(flag == 0 || (m == LINE_MAX-1) )
{
flag=1;
for(Mid_left=16,Mid_right=16;Mid_right<33;Mid_left--,Mid_right++)
{
if(LineValue[m][Mid_left]==0)
{
BlackLocation[m]= Mid_left ;
break;
}
if(LineValue[m][Mid_right]==0)
{
BlackLocation[m]= Mid_right;
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -