📄 调试程序1._c
字号:
//***************************************************//
//进样泵0吸样1和进样
//any_muter进样多少 //updown 0排样//1吸样
//***************************************************//
void mustermotor_contorl (uint any_muter,uchar updown)
{ uint i;
if(updown)
{
for (i=0;i<any_muter;i++)
{
motor_right (4,2,350);
}
}
else
{
for (i=0;i<any_muter;i++)
{
motor_left (4,2,350);
}
}
OutputMotor(0x04,0x00,0x00);
}
//**********************************************//
//旋转盘逆时针进样走一个齿
//**********************************************//
void plate_oneround (void)
{ uint i;
for(i=0;i<640;i++)
{
motor_right (3,1,500);
}
PIND=PORTD;
g[4]=PIND&0x20;
while(g[4]==0)
{
PIND=PORTD;
g[4]=PIND&0x20;
motor_right (3,1,500);
}
while(g[4]==0);
}
//***************************************************//
//旋转盘逆时针进样
//sample=0试剂 sample=1样品
//sample_number 进样盘标号
//***************************************************//
void plate_round ( uchar newplate_number,uchar sample)
{ uint i,y;
if (sample) //样品盘号计算
{
if(newplate_number>30)
newplate_number=30;
if(newplate_number>=oldplate_number)
plate_sport=newplate_number-oldplate_number;
else
plate_sport=(newplate_number+30)-oldplate_number;
for(i=0;i<plate_sport;i++)
{
plate_oneround();
}
oldplate_number=newplate_number;
}
else //标样盘号计算
{
if(newplate_number>5)
newplate_number=5;
if(((newplate_number-1)*6)>=(oldplate_number-1))
plate_sport=((newplate_number-1)*6)-(oldplate_number-1);
else
plate_sport=(((newplate_number-1)*6)+30)-(oldplate_number-1);
for(i=0;i<plate_sport;i++)
{
plate_oneround();
}
oldplate_number=(newplate_number-1)*6+1;
}
if(oldplate_number>30)
oldplate_number-=30;
// OutputMotor(0x03,0x00,0x00);
}
//*******************************************************//
//leftOrRight 表示方向,0表示left ,1表示rigth
//GuOu 表示要跨过几个光耦
//movenum 表示总行程
//*******************************************************//
void armround_move(uchar leftOrRight,uchar GuOu,ulong movenum)
{
ulong count;
ulong GuOucount=0;
if(GuOu==1)
GuOucount=4500;
else if(GuOu==2)
GuOucount=8000;
//加速,不判断光耦
if(leftOrRight==0)//left
{
for(count=0;count<400;count++)
{
motor_left(2,1,1100-count*2);
}
}
else
{
for(count=0;count<400;count++)
{
motor_right(2,1,1100-count*2);
}
}
//如果要跨光耦 不判断光耦
if(leftOrRight==0)//left
{
for(count=GuOucount;count>0;count--)
{
motor_left(2,1,300);
}
}
else
{
for(count=GuOucount;count>0;count--)
{
motor_right(2,1,300);
}
}
//匀速 判断光耦
if(leftOrRight==0)//left
{
for(count=movenum-GuOucount-400*2-82;count>0;count--)
{
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]!=0)
break;
motor_left(2,1,300);
}
}
else
{
for(count=movenum-GuOucount-400*2-82;count>0;count--)
{
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]!=0)
break;
motor_right(2,1,300);
}
}
//减速 判断光耦
if(leftOrRight==0)//left
{
for(count=0;count<400;count++)
{
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]!=0)
break;
motor_left(2,1,300+count*2);
}
}
else
{
for(count=0;count<400;count++)
{
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]!=0)
break;
motor_right(2,1,300+count*2);
}
}
//慢匀速 判断光耦
if(leftOrRight==0)//left
{
while(1)
{
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]!=0)
break;
motor_left(2,1,1100);
}
}
else
{
while(1)
{
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]!=0)
break;
motor_right(2,1,1100);
}
}
}
//****************************************************************//
//旋转臂进样出样控制
//initstate为初始状态,endstate为终止状态,0 表示清洗位,1 表示样品位,2 表示标液位,3 表示钨舟位
//状态转换为 0-1 0-2 2-3 2-0 1-0 1-3 3-0
//movenum为总行程
//****************************************************************//
void armround_control1(uchar initstate,uchar endstate,ulong movenum)
{
ulong count;
if( (initstate==0) && (endstate==1) )//0-1
{
armround_move(0,0,movenum);//left
for(count=0;count<15+yp_value;count++)
motor_left(2,1,1100);
}
else if( (initstate==0) && (endstate==2) )//0-2,跳过1个光耦
{
armround_move(0,1,movenum);//left
for(count=0;count<15+by_value;count++)
motor_left(2,1,1100);
}
else if( (initstate==2) && (endstate==3) )//2-3,跳过2个光耦
{
armround_move(1,2,movenum);//right
for(count=0;count<(15+wz_value);count++)
motor_right(2,1,1100);
}
else if( (initstate==2) && (endstate==0) )//2-0,跳过1个光耦
{
armround_move(1,1,movenum);//right
for(count=0;count<400;count++)
motor_right(2,1,1100);
while(1)
{
g[5]=PIND & 0x10;
if(g[5])
break;
motor_left(2,1,1100);
}
for(count=0;count<82;count++)
motor_left(2,1,1100);
}
else if( (initstate==1) && (endstate==0) )//1-0
{
armround_move(1,0,movenum);//right
for(count=0;count<400;count++)
motor_right(2,1,1100);
while(1)
{
g[5]=PIND & 0x10;
if(g[5])
break;
motor_left(2,1,1100);
}
for(count=0;count<82;count++)
motor_left(2,1,1100);
}
else if( (initstate==1) && (endstate==3) )//1-3,跳过1个光耦
{
armround_move(1,1,movenum);//right
for(count=0;count<(15+wz_value);count++)
motor_right(2,1,1100);
}
else if( (initstate==0) && (endstate==3) )//0-3
{
armround_move(1,0,movenum);//right
for(count=0;count<15+wz_value;count++)
motor_right(2,1,1100);
}
else if( (initstate==3) && (endstate==0) )//3-0
{
armround_move(0,0,movenum);//right
for(count=0;count<82;count++)
motor_left(2,1,1100);
}
}
//*******************************************************//
//定时器1益出中断函数(3S定时)
//******************************************************//
#pragma interrupt_handler TIMER1: 15
void TIMER1 (void)
{ uint i;
CLI();
TCNT1 = 0X78F5;
TCNT1 = 0X78F5;
switch(over_flag) //传送两个字节 (3S一次)
{
case 0: //TxdBuf[0]状态标志(0未完成,A进样完成,B酸洗完成)
TxdBuf[0]=0x00;
break; //TxdBuf[1] 任意时刻6个光耦状态
case 1:
{
over_flag=0;
TxdBuf[0]=0x0A;
TCCR1B = 0x00;
break;
}
case 2:
{
over_flag=0;
TxdBuf[0]=0x0B;
TCCR1B = 0x00;
break;
}
default:
break;
}
PIND=PORTD;
TxdBuf[1]=PIND&0X3F;
D12_WriteEndpoint(3,2,TxdBuf);
SEI();
}
//*******************************************************//
//写EEPROM
//******************************************************//
void write_eeprom (void)
{
EIMSK = 0x00;
while(EECR&0X02);
switch( Debugger.place_number) //选择EEP地址
{
case 0:
EEAR=0X0001;
break;
case 1:
EEAR=0X0002;
break;
case 2:
EEAR=0X0003;
break;
case 3:
EEAR=0X0004;
break;
default:
break;
}
EEDR=Debugger.recoup_value; //数据送入EEP
EECR|=0X04;
EECR|=0X02;
EIMSK = 0x01;
}
//**********************************************************//
//读EEPROM
//**********************************************************//
uchar read_eeprom (uint address)
{
EIMSK = 0x00;
while(EECR&0X02);
EEAR=address;
EECR|=0X01;
return EEDR;
EIMSK = 0x01;
}
//***********************************************************//
//EEPROM数椐送入缓存
//***********************************************************//
void eeprom_value (void)
{
free=read_eeprom (0x0000);
by_value=read_eeprom (0x0001); //标液杯处误差
yp_value=read_eeprom (0x0002); //样品杯处误差
wz_value=read_eeprom (0x0003); //钨舟处误差
zx_value=read_eeprom (0x0004); //钨舟深度误差
zx_value=zx_value*16;
}
//**********************************************************//
//主函数
//**********************************************************//
void main(void)
{
unsigned int k,u,ii;
unsigned char Data;
unsigned char StrLen;
unsigned int TestCount;
unsigned int TestCount1;
unsigned char LeftOrRight=0;
for(u=0;u<10000;u++);
init_devices(); //MCU初始化
INT_Init(); //设置中断
PORTF = 0xFF;
InitMotor(0x01); //四个步进电机初始化
InitMotor(0x02);
InitMotor(0x03);
InitMotor(0x04);
OutputMotor(0x01,0x00,0x00);
OutputMotor(0x02,0x00,0x00);
OutputMotor(0x03,0x00,0x00);
OutputMotor(0x04,0x00,0x00);
//muster_init(); //进样过程初始化
eeprom_value(); //读缓存中EEPROM的值
ArmState=0;
EIMSK = 0x00;
reconnect_USB(); //重新连接USB
EIMSK = 0x01;
TCCR1A=0x00;
TCCR1B =0x00;
// TCNT1 = 0X78F5;
TCNT1 = 0XFFFF;
TCNT1 = 0XFFFF;
while(1)
{
// if(configuration) //设备未配置返回
//;
if (setup_packet)
{ //Setup包处理
EIMSK = 0x00;
setup_packet = 0;
EIMSK = 0x01;
control_handler(); //调用请求处理子程序
}
/*if(USB_RESET)
{
EIMSK = 0x00;
reconnect_USB();
EIMSK = 0x01;
} */
if(reset_flag==1) //复位进样器初始化
{
reset_flag=0;
muster_init();
oldplate_number=1;
}
if(Work_flag) //进入工作状态
{
Work_flag=0;
if(Work.clear_select<2)
{
one_course ();
Work_flag=0;
} //完成一次进样过程或用酸清洗
else if(Work.clear_select==2)
push_air(); //进样泵推拉清洗
}
if(debug_flag==1) //进入调试状态
{
debug_flag=0;
if(Debugger.place_number<4) //写四个位置误差
write_eeprom();
if(Debugger.place_number==6)
{
switch( Debugger.init_place) //旋转臂四个位置定位
{ //0清洗杯,1标液位置,2样品位置,3钨舟位置
case 0:
{
armup_init ();
armround_init();
break;
}
case 1:
{
armup_init ();
plate_init();
armround_init();
armround_control1(0,2,6385);//6385+15
break;
}
case 2:
{
armup_init ();
plate_init();
armround_init();
armround_control1(0,1,3703);//3703+15
break;
}
case 3:
{
armup_init ();
armround_init();
armround_control1(0,3,5718);//5718+15
break;
}
default:
break;
}
}
else if(Debugger.place_number==7) //升降臂升降
{
switch(Debugger.armup_down)
{
OutputMotor(0x02,0x00,0x00);
case 0:
{
for(k=0;k< Debugger.setp_num;k++) //上升
{
motor_left (1,8,800);
}
break;
}
case 1:
{
for(k=0;k< Debugger.setp_num;k++) //下降
{
motor_right (1,8,800);
}
break;
}
default:
break;
}
}
else if(Debugger.place_number==4)
{
if(Debugger.water_pump==1) //水阀开关
PORTF&=0XFE;
else
PORTF|=0X01;
}
else if(Debugger.place_number==5)
{
if(Debugger.air_pump==1) //气阀开关
PORTF&=0XFC;
else
PORTF|=0X02;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -