📄 调试程序1._c
字号:
ControlData.wCount += ControlData.wLength;
EIMSK=0x00;
control_state = 0;
EIMSK=0x01;
}
}
//获取固件版本号
void get_firmware_version()
{
unsigned char i;
i = 0x30; // firmware version number
single_transmit((unsigned char *)&i, 1);
}
//获取端点2缓存区大小
void get_buffer_size()
{
unsigned char i[4];
if(bNoRAM != 0) {
i[0] = 64;
i[1] = 0;
i[2] = 0;
i[3] = 0;
} else {
i[0] = 0;
i[1] = 1;
i[2] = 0;
i[3] = 0;
}
single_transmit((unsigned char *)&i, 4);
}
//厂商请求处理
void read_write_register(void)
{
unsigned char len,epstatus;
if(ControlData.DeviceRequest.bmRequestType & 0x80) {
if(ControlData.DeviceRequest.wIndex == 0x0472 &&
ControlData.DeviceRequest.wValue == 0 &&
ControlData.DeviceRequest.wLength == 1)
get_firmware_version();//获取固件版本号
else
if(ControlData.DeviceRequest.wIndex == 0x0474 &&
ControlData.DeviceRequest.wValue == 0 &&
ControlData.DeviceRequest.wLength == 4)
get_buffer_size();//获取缓冲区大小
else{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
} // if read register
else{
if(ControlData.DeviceRequest.wIndex == 0x0471 &&
ControlData.DeviceRequest.wValue == 0 &&
ControlData.DeviceRequest.wLength == 6)
{
if(ControlData.dataBuffer[5]==0x81)
{
D12_WriteEndpoint(5, ControlData.dataBuffer[3], MainBuf);//发送数据
}
if(ControlData.dataBuffer[5]==0x80)
{
EIMSK=0x00;
outportb(D12_COMMAND, 0x80 + 4);//读取端点状态
epstatus = inportb(D12_DATA);
EIMSK=0x01;
epstatus &= 0x60;
if (epstatus == 0x60)
len = Isr_D12_ReadEndpoint(4, 64, MainBuf);//读取双缓冲区数据
}
single_transmit(0, 0);
}
else
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
}
//请求处理子程序
void control_handler()
{
uchar type, req;
type = ControlData.DeviceRequest.bmRequestType & (uchar)0x60; //设备请求类型
req = ControlData.DeviceRequest.bRequest & (uchar)0x0F; //USB请求类型
if (type == (uchar)0x00)
{
switch(req) //调用标准请求
{
case 0x00:get_status();
break;
case 0x01:clear_feature();
break;
case 0x03:set_feature();
break;
case 0x05:set_address();
break;
case 0x06:get_descriptor();
break;
case 0x08:get_configuration();
break;
case 0x09:set_configuration();
break;
case 0x0a:get_interface();
break;
case 0x0b:set_interface();
break;
case 0x04:
case 0x02:
case 0x07:
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
break;
default :break;
}
}
else if (type == (uchar)0x40)
{
switch(req) //调用标准请求
{
case 0x0c:read_write_register();
break;
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0d:
case 0x0e:
case 0x0f:
case 0x10:D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
break;
default :break;
}
}
else
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
}
//中断设置
void INT_Init(void)
{
EIMSK = 0x00;
MCUCR = 0X80;
EICRA = 0x00; ///
EIMSK = 0x00;
XMCRA = 0X00;
}
//***************************************************//
//延时函数
//***************************************************//
void DelayMs(uint TimeNum) //delay 17Ms
{
uint i;
for(;TimeNum>0;TimeNum--)
{
for(i=0;i<30000;i++);
}
}
//*****************************************************//
//清洗针头(时间)
//*****************************************************//
void Pump_Delay(uint delayTime) //Delay Ms 1//17Ms
{
PORTF&=0XFC; //开水阀
DelayMs(10); //150MS
PORTF&=0XFE; //开气阀
DelayMs(delayTime); //清洗时间
PORTF|=0X02; //关气阀
DelayMs(10); //150MS
PORTF|=0X01; //关水阀
}
//*****************************************************//
// 进样泵排气泡
//*****************************************************//
void push_air (void)
{
PORTF&=0XFC;
DelayMs(10);
PORTF&=0XFE;
mustermotor_contorl (17000,1); //进样泵吸推满量程
mustermotor_contorl (17000,0); //进样泵吸拉满量程
DelayMs(30);
mustermotor_contorl (17000,1);
mustermotor_contorl (17000,0);
DelayMs(30);
PORTF|=0X02;
DelayMs(10);
PORTF|=0X01;
}
//*****************************************************//
// 吸样针头保护
//*****************************************************//
void needle_egis (void)
{
PIND=PORTD;
g[5]=PIND&0x10;
while(g[5]==0) //旋转定位小盘如不透光 则等待
{
PIND=PORTD;
g[5]=PIND&0x10;
}
}
//*****************************************************//
//上升臂初始化
//*****************************************************//
void armup_init (void)
{
PIND=PORTD;
g[0]=PIND&0x04;
while(g[0]) //上升到铜片挡住光耦
{
PIND=PORTD;
g[0]=PIND&0x04;
motor_right (1,1,50);
}
OutputMotor(0x01,0x00,0x00);
}
//*****************************************************//
// 进样器初始化
//*****************************************************//
void muster_init (void)
{
armup_init (); //上升臂初始化
plate_oneround ();
plate_init(); //进样盘初始化
OutputMotor(0x03,0x00,0x00);
armround_init(); //旋转臂初始化
DelayMs(15);
needle_egis (); //旋转臂是否到位 不到位则进入等待状态
arm_down(3150*8); //升降臂下降40MM 电机25200步(微分系数1)
OutputMotor(0x02,0x00,0x00);
mustermotor_init(); //进样泵初始化
Pump_Delay(130); //清洗针头2S
// push_air ();
// arm_up ();
}
//*******************************************************//
//连电脑主机的进样过程
//*******************************************************//
void one_course (void)
{
uint i;
ArmState=0;//清洗位
arm_up (); //升降臂上升
mustermotor_contorl (7500,1); //吸入空气 (12UL)
plate_round(Work.strat_number,Work.mission_number); //进样盘定位
if(Work.mission_number) //旋转臂定位 (1样品 0标液)
armround_control1(0,1,3703);//0-1
else
armround_control1(0,2,6385);//0-2
//OutputMotor(0x02,0x00,0x00);
DelayMs(20); //延时340MS
arm_down(3220*8); //升降臂下降42MM
ArmState=2;//样品位
OutputMotor(0x03,0x00,0x00);
mustermotor_contorl (volume,1); //吸入样品(标样)
DelayMs(20); //延时340MS
if(Work.clear_select==0)
DelayMs(50); //如酸洗 延时1S
arm_up (); //升降臂上升
mustermotor_contorl (500,1); //吸入空气1UL
if(Work.clear_select==1) //如果在工作状态,臂转到钨舟处
{
if(Work.mission_number)
armround_control1(1,3,9421);//1-3
else
armround_control1(2,3,12103);//2-3
// OutputMotor(0x02,0x00,0x00);
DelayMs(20); //延时340MS
arm_down(6650*8); //臂下降到钨舟中
ArmState=1;//钨舟位 下降85MM
mustermotor_contorl (volume+1300,0); //吐样,多吐1UL
DelayMs(10);
arm_up (); //臂升起
ArmState=0;//清洗位
over_flag=1; //放样完成标志,工步起动
armround_control1(3,0,5718);//3-0 //臂转到清洗杯处
}
else //如果酸洗,则直接从标样处走到清洗杯
{
if(Work.mission_number)
armround_control1(1,0,3703);//1-0
else
armround_control1(2,0,6385);//2-0
}
//OutputMotor(0x02,0x00,0x00);
DelayMs(20); //延时340MS
arm_down(3120*8); //下降40MM 针入水杯
OutputMotor(0x02,0x00,0x00);
mustermotor_init(); //进样泵初始化
Pump_Delay(clear_S); //清洗针头
DelayMs(100); //延时1。5S
if(Work.clear_select==0)
over_flag=2;
}
//******************************************************//
//电机逆时针旋转 motor_right(电机号,微分系数,延时时间)
//******************************************************//
void motor_right (uchar motor_number,uchar modulus ,uint delaytime)
{ uint t;
uchar change;
OutputMotor(motor_number,H1DACData[step1[motor_number]],H2DACData[step1[motor_number]]);
step1[motor_number]+=modulus;
for(t=0;t<delaytime;t++);
}
//******************************************************//
//电机顺时针旋转 motor_left (电机号,微分系数,延时时间)
//******************************************************//
void motor_left (uchar motor_number,uchar modulus,uint delaytime)
{ uint t;
uchar change;
OutputMotor(motor_number,H1DACData[step1[motor_number]],H2DACData[step1[motor_number]]);
step1[motor_number]-=modulus;
for(t=0;t<delaytime;t++);
}
//******************************************************//
//上升臂上升变速运动 两边延时(50-1500) ,中间匀速50
//******************************************************//
void arm_up (void)
{
uint i,Count;
PIND=PORTD;
g[0]=PIND&0x04;
//加速
for(Count=0;Count<1500;Count++)
{
motor_right (1,1,1550-Count);
PIND=PORTD;
g[0]=PIND&0x04;
if(!g[0])
{
break;
}
}
//匀速
if(ArmState==1)//钨舟位,臂下到底
{
for(i=52800-2*1500;i>0;i--)
{
motor_right (1,1,50);
PIND=PORTD;
g[0]=PIND&0x04;
if(!g[0])
{
break;
}
}
}
else
{
for(i=26400-2*1500;i>0;i--)
{
motor_right (1,1,50);
PIND=PORTD;
g[0]=PIND&0x04;
if(!g[0])
{
break;
}
}
}
//减速
for(Count=0;Count<1500;Count++)
{
motor_right (1,1,50+Count);
PIND=PORTD;
g[0]=PIND&0x04;
if(!g[0])
{
break;
}
}
//慢匀速
while(g[0])
{
PIND=PORTD;
g[0]=PIND&0x04;
motor_right (1,1,1550);
}
for(i=0;i<10;i++)
{
motor_left (1,1,1550);
}
for(i=0;i<50;i++)
{
motor_right (1,1,1550);
}
while(g[0]);
OutputMotor(0x01,0x00,0x00);
}
//***************************************************//
//旋转臂初始化
//***************************************************//
void armround_init (void)
{ uint i;
PIND=PORTD;
g[1]=PIND&0x08;
if(g[1]) //初始化光耦透光,顺时针转1500步(14度)
{
for(i=0;i<1500;i++)
{
motor_left (2,1,600);
}
}
else //初始化光耦不透光,逆时针转1500步(14度)
{
for(i=0;i<1500;i++)
{
motor_right (2,1,600);
}
}
//PIND=PORTD;
g[1]=PIND&0x08;
if(g[1]==0) //初始化光耦不透光,逆时针转到刚透光时停
{
//PIND=PORTD;
g[1]=PIND&0x08;
while(g[1]==0)
{
//PIND=PORTD;
g[1]=PIND&0x08;
motor_right (2,1,600);
}
}
else //初始化光耦透光,逆时针转到刚不透光时停
{
//PIND=PORTD;
g[1]=PIND&0x08;
while(g[1])
{
//PIND=PORTD;
g[1]=PIND&0x08;
motor_left (2,1,600);
}
}
//PIND=PORTD;
g[5]=PIND&0x10;
if(g[5]) //如果旋转臂光耦已透光,逆时针转400步(3。5度)
{ //转到不透光处
for(i=400;i>0;i--)
{
motor_right (2,1,600);
}
while(1) //顺时针转(清洗杯) 定位孔沿处停止
{
g[5]=PIND&0x10;
if(g[5])
break;
motor_left(2,1,600);
}
for(i=0;i<82;i++) //顺时针转(清洗杯) 定位孔中心处停止
{
motor_left (2,1,600);
}
}
}
//******************************************************//
//进样盘旋转初使化
//******************************************************//
void plate_init (void)
{
PIND=PORTD;
g[2]=PIND&0x40;
while(g[2]==0) //进样盘初始化光耦不透光,逆时针转到透光后停止
{
PIND=PORTD;
g[2]=PIND&0x40;
motor_right (3,1,400);
}
PIND=PORTD;
g[4]=PIND&0x20;
while(g[4]==0) //进样盘定位光耦不透光,逆时针转到透光后停止
{
PIND=PORTD;
g[4]=PIND&0x20;
motor_right (3,1,400);
}
}
//**************************************************//
//进样泵复位向上初使化
//**************************************************//
void mustermotor_init (void)
{
PIND=PORTD;
g[3]=PIND&0x80;
while(g[3])
{
PIND=PORTD;
g[3]=PIND&0x80;
motor_left (4,2,350);
}
while(g[3]);
OutputMotor(0x04,0x00,0x00);
}
//**************************************************//
//升降臂下降清洗杯 两边延时(50-1500) ,中间匀速50
//**************************************************//
void arm_down (uint down)
{
unsigned int s,Count;
//加速
for(Count=0;Count<1500;Count++)
{
motor_left (1,1,1550-Count);
}
//匀速
for (s=down-2*1500;s>0;s--)
{
motor_left (1,1,50);
needle_egis ();
}
for(Count=0;Count<1500;Count++)
{
motor_left (1,1,50+Count);
needle_egis ();
}
OutputMotor(0x01,0x00,0x00);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -