/** ################################################################### ** Filename : eeprom.C ** Project : eeprom ** Processor : MC9S12HZ64CFU ** Version : Driver 01.12 ** Compiler : CodeWarrior HC12 C Compiler ** Date/Time : 2008-12-15, 上午 10:41 ** Abstract : ** Main module. ** Here is to be placed user's code. ** Settings : ** Contents : ** No public methods ** ** (c) Copyright UNIS, spol. s r.o. 1997-2007 ** UNIS, spol. s r.o. ** Jundrovska 33 ** 624 00 Brno ** Czech Republic ** http : www.processorexpert.com ** mail : info@processorexpert.com ** ###################################################################*/ /* MODULE eeprom */ /* Including used modules for compiling procedure */ #include "Cpu.h" #include "Events.h" #include "AS1.h" /* Include shared modules, which are used for whole project */ #include "PE_Types.h" #include "PE_Error.h" #include "PE_Const.h" #include "IO_Map.h" //word keptDataA,keptDataB,keptDataC,eResultA,eResultB,eResultC,eResultP;//保存在EEPROM中的数据 keptDataA,keptDataB,keptDataC代表三个步进电机 //word keptPole;//正反转 int i; int j; int iNum;//试管个数 int xd;//x/y/z方向脉冲个数 int yd; int zd; int datai; //数组中数据序号 unsigned int bbb, ccc,hhbbb,time2; //进样器共5行10列,这里定义平面上每一个的坐标,用以计算每个点到零点的距离 int iX1=5001;//X方向 int iX2=5002; int iX3=5003; int iX4=5004; int iX5=5005; int iX6=5006; int iX7=5007; int iX8=5008; int iX9=5009; int iX10=5010; int iY1=4001;//Y方向 int iY2=4002; int iY3=4003; int iY4=4004; int iY5=4005; int iZ=3333;//Z方向为一固定值 int iTx=1;//控制X方向电机M1转动的方波周期 2ms int iTy=1;//控制X方向电机M2转动的方波周期 int iTz=1;//控制X方向电机M3转动的方波周期 //第5"30最远的进样器开始动作,为保证针头在零点充分清洗,非最远端试管取样时,不用从第5"30开始,可以再有一个延迟 //这里定义的就是这个延迟,这里定义(iX1,iY1)为最近端,(X10 Y5)为最远端 int imT1=5; //延迟30s ,每五个试管作为一组 int imT2=5; int imT3=5; int imT4=5; int imT5=5; int imT6=5; int imT7=5; int imT8=9; int imT9=6; int imT10=3; int imT; char sFlag;//进样器动作前的标志位 //int iDelay;//延迟次数/时间 int jMP1;//电机1已经正转的次数 int jMP2;//电机2已经正转的次数 int jMP3;//电机3已经正转的次数
int jMN1;//电机1已经反转的次数 int jMN2;//电机2已经反转的次数 int jMN3;//电机3已经反转的次数
void PerPulse(int mP); //通过延迟产生控制电机转动的周期 void mDelay(int mT);//电机每次延迟的时间 void motorMove(int mX,int mY,int mZ,int mT); //步进电机运动函数
void main(void) { /* Write your local variable definition here */
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/ PE_low_level_init();
//i=7;
//FC161_Reset(); // reset the counter //Cpu_Delay100US(400); //if(FC161_GetTimeUS(&ccc) == ERR_OK) { // bbb = ccc / 100.0; // }
//FC161_Disable();//计时无效 /*//从EEPROM中读数据 IEE1_GetWord(0x808,&eResultA); keptDataA=eResultA;//读出步进电机A的数据 IEE1_GetWord(0x810,&eResultB); keptDataB=eResultB;//读出步进电机B的数据 IEE1_GetWord(0x812,&eResultC); keptDataC=eResultC;//读出步进电机C的数据 IEE1_GetWord(0x814,&eResultP); keptPole=eResultP;//读出步进电机正反转标志 */
//利用循环,判断当前是对第几个样品进行操作 //for(iNum=0;iNum<=50;) { for(;;) { /* datai=0; for(;data!='D';) { // 没有接收到字符‘D',程序就一直等待 通讯协议为"R02C05D" if(AS1_GetCharsInRxBuf()!=0){ AS1_RecvChar(&data); string[datai]=data; datai++; AS1_SendChar(data); } } data=0; R1=string[1]-48; R2=string[2]-48; myR=R1*10+R2; //行 C1=string[4]-48; C2=string[5]-48; myC=C1*10+C2;//列 iNum=myR*100+myC; */
sFlag='F'; datai=0; //数组中数据序号
while (sFlag=='F') { //标志位sFlag不为T,程序等待,直到中断产生后,把sFlag置为T
} //从EEPROM中读数据 /*IEE1_GetWord(0x808,&eResultA); keptDataA=eResultA;//读出步进电机A的数据 */ switch (iNum){//运行到X1 Y1 Z的点 case 101: //第一行第一列 xd=iX1; yd=iY1; zd=iZ; imT=imT1;//延迟时间 break; case 201: //运行到X1 Y2 Z的点 第二行第一列 xd=iX1; yd=iY2; zd=iZ; imT=imT1; break; case 301: //运行到X1 Y3 Z的点 第三行第一列 xd=iX1; yd=iY3; zd=iZ; imT=imT1; break; case 401: //运行到X1 Y4 Z的点 第四行第一列 xd=iX1; yd=iY4; zd=iZ; imT=imT1; break; case 501: //运行到X1 Y5 Z的点 第五行第一列 xd=iX1; yd=iY5; zd=iZ; imT=imT1; break; case 102: //运行到X2 Y1 Z的点 第一行第二列 xd=iX2; yd=iY1; zd=iZ; imT=imT2; break; case 202: //运行到X2 Y2 Z的点 第二行第二列 xd=iX2; yd=iY2; zd=iZ; imT=imT2; break; case 302: //运行到X2 Y3 Z的点 xd=iX2; yd=iY3; zd=iZ; imT=imT2; break; case 402: //运行到X2 Y4 Z的点 xd=iX2; yd=iY4; zd=iZ; imT=imT2; break; case 502: //运行到X2 Y5 Z的点 xd=iX2; yd=iY5; zd=iZ; imT=imT2; break; case 103: //运行到X3 Y1 Z的点 xd=iX3; yd=iY1; zd=iZ; imT=imT3; break; case 203: //运行到X3 Y2 Z的点 xd=iX3; yd=iY2; zd=iZ; imT=imT3; break; case 303: //运行到X3 Y3 Z的点 xd=iX3; yd=iY3; zd=iZ; imT=imT3; break; case 403: //运行到X3 Y4 Z的点 xd=iX3; yd=iY4; zd=iZ; imT=imT3; break; case 503: //运行到X3 Y5 Z的点 xd=iX3; yd=iY5; zd=iZ; imT=imT3; break; case 104: //运行到X4 Y1 Z的点 xd=iX4; yd=iY1; zd=iZ; imT=imT4; break; case 204: //运行到X4 Y2 Z的点 xd=iX4; yd=iY2; zd=iZ; imT=imT4; break; case 304: //运行到X4 Y3 Z的点 xd=iX4; yd=iY3; zd=iZ; imT=imT4; break; case 404: //运行到X4 Y4 Z的点 xd=iX4; yd=iY4; zd=iZ; imT=imT4; break; case 504: //运行到X4 Y5 Z的点 xd=iX4; yd=iY5; zd=iZ; imT=imT4; break; case 105: //运行到X5 Y1 Z的点 xd=iX5; yd=iY1; zd=iZ; imT=imT5; break; case 205: //运行到X5 Y2 Z的点 xd=iX5; yd=iY2; zd=iZ; imT=imT5; break; case 305: //运行到X5 Y3 Z的点 xd=iX5; yd=iY3; zd=iZ; imT=imT5; break; case 405: //运行到X5 Y4 Z的点 xd=iX5; yd=iY4; zd=iZ; imT=imT5; break; case 505: //运行到X5 Y5 Z的点 xd=iX5; yd=iY5; zd=iZ; imT=imT5; break; case 106: //运行到X6 Y1 Z的点 xd=iX6; yd=iY1; zd=iZ; imT=imT6; break; case 206: //运行到X6 Y2 Z的点 xd=iX6; yd=iY2; zd=iZ; imT=imT6; break; case 306: //运行到X6 Y3 Z的点 xd=iX6; yd=iY3; zd=iZ; imT=imT6; break; case 406: //运行到X6 Y4 Z的点 xd=iX6; yd=iY4; zd=iZ; imT=imT6; break; case 506: //运行到X6 Y5 Z的点 xd=iX6; yd=iY5; zd=iZ; imT=imT6; break; case 107: //运行到X7 Y1 Z的点 xd=iX7; yd=iY1; zd=iZ; imT=imT7; break; case 207: //运行到X7 Y2 Z的点 xd=iX7; yd=iY2; zd=iZ; imT=imT7; break; case 307: //运行到X7 Y3 Z的点 xd=iX7; yd=iY3; zd=iZ; imT=imT7; break; case 407: //运行到X7 Y4 Z的点 xd=iX7; yd=iY4; zd=iZ; imT=imT7; break; case 507: //运行到X7 Y5 Z的点 xd=iX7; yd=iY5; zd=iZ; imT=imT7; break; case 108: //运行到X8 Y1 Z的点 xd=iX8; yd=iY1; zd=iZ; imT=imT8; break; case 208: //运行到X8 Y2 Z的点 xd=iX8; yd=iY2; zd=iZ; imT=imT8; break; case 308: //运行到X8 Y3 Z的点 xd=iX8; yd=iY3; zd=iZ; imT=imT8; break; case 408: //运行到X8 Y4 Z的点 xd=iX8; yd=iY4; zd=iZ; imT=imT8; break; case 508: //运行到X8 Y5 Z的点 xd=iX8; yd=iY5; zd=iZ; imT=imT8; break; case 109: //运行到X9 Y1 Z的点 xd=iX9; yd=iY1; zd=iZ; imT=imT9; break; case 209: //运行到X9 Y2 Z的点 xd=iX9; yd=iY2; zd=iZ; imT=imT9; break; case 309: //运行到X9 Y3 Z的点 xd=iX9; yd=iY3; zd=iZ; imT=imT9; break; case 409: //运行到X9 Y4 Z的点 xd=iX9; yd=iY4; zd=iZ; imT=imT9; break; case 509: //运行到X9 Y5 Z的点 xd=iX9; yd=iY5; zd=iZ; imT=imT9; break; case 110: //运行到X10 Y1 Z的点 xd=iX10; yd=iY1; zd=iZ; imT=imT10; break; case 210: //运行到X10 Y2 Z的点 xd=iX10; yd=iY2; zd=iZ; imT=imT10; break; case 310: //运行到X10 Y3 Z的点 xd=iX10; yd=iY3; zd=iZ; imT=imT10; break; case 410: //运行到X10 Y4 Z的点 xd=iX10; yd=iY4; zd=iZ; imT=imT10; break; case 510: //运行到X10 Y5 Z的点 xd=iX10; yd=iY5; zd=iZ; imT=imT10; break; // default: //iNum++; } motorMove(xd,yd,zd,imT); //步进电机转动 }
/*** End of Processor Expert internal initialization. ***/ /* Write your code here */ for(;;){ } /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/ for(;;){} /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/ } /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/ ////////////////////////////////*函数定义*////////////////////////////////////////// //产生脉冲的周期 void PerPulse(int mP){ for (i=0;i<mP;i++){ Cpu_Delay100US(10);//产生1ms的延迟 } } // 控制电机每次延迟的时间 void mDelay(int mT) { for (i=0;i<mT;i++){ Cpu_Delay100US(10000);//产生1s的延迟 } } // 电机控制 //步进电机M1的四个管教分别对应Vcc/PP5/PA0/PA1 //步进电机M2的四个管教分别对应Vcc/PP4/PA2/PA3 //步进电机M3的四个管教分别对应Vcc/PP3/PA4/PA5 //步进电机M4的四个管教分别对应Vcc/PP1/PA6/PA7 void motorMove(int mX,int mY,int mZ,int mT) { DDRP=0xff;//把port P端口设置为输出,用以输出方波 DDRA=0xff;//把port A端口设置为输出,用以输出高低点评,控制电机的转动方向
jMP1=0;//电机转动之前,令所有正转计数为0 jMP2=0; jMP3=0; jMN1=0;//令所有负转计数为0 jMN2=0; jMN3=0;
mDelay(mT); //在电机开始运动之前进行延迟.让针头充分清洗 imT用mT代 //M1电机运动到xd PORTA_BIT0=0xFF;//PA0输出高电平(正转),即用PA0控制电机方向 for (j=0;j<mX;j++){ //xd用mX代 PTP_PTP5=0xff;// PP5输出高电平 PerPulse(iTx); PTP_PTP5=0x00;//PP5输出低电平 PerPulse(iTx); jMP1=j; } PTP_PTP5=0x00;//M1停止后,PP5输出低电平 //M2电机运动到iY1 PORTA_BIT2=0xff;//PA2输出高电平(正转),即用PA2控制电机方向 for (j=0;j<mY;j++){ //yd用mY代 PTP_PTP4=0xff;// PP4输出高电平 PerPulse(iTy); PTP_PTP4=0x00;//PP4输出低电平 PerPulse(iTy); jMP2=j; } PTP_PTP4=0x00;//M2停止后,PP4输出低电平 //M3电机运动到iZ PORTA_BIT4=0xff;//PA4输出高电平(正转),即用PA4控制电机方向 for (j=0;j<mZ;j++){ //zd用mZ代 PTP_PTP3=0xff;// PP3输出高电平 PerPulse(iTz); PTP_PTP3=0x00;//PP3输出低电平 PerPulse(iTz); jMP3=j; } PTP_PTP3=0x00;//M3停止后,PP3输出低电平
//两分钟用于吸样,从第6"持续到第8",返回零点 mDelay(12);
//M3电机返回到Z0 PORTA_BIT4=0x00;//PA4输出低电平(反转) for (j=0;j<mZ;j++){ PTP_PTP3=0xff;// PP3输出高电平 PerPulse(iTz); PTP_PTP3=0x00;//PP3输出低电平 PerPulse(iTz); jMN3=jMP3-j;//剩余的反转次数 } jMP3=0;//电机M1反转结束后,令正转次数为0,这时就不用对M1进行复位操作了 PTP_PTP3=0x00;//M3停止后,PP3输出低电平 //M2电机返回到Y0 PORTA_BIT2=0x00;//PA2输出低电平(反转) for (j=0;j<mY;j++){ PTP_PTP4=0xff;// PP4输出高电平 PerPulse(iTy); PTP_PTP4=0x00;//PP4输出低电平 PerPulse(iTy); jMN2=jMP2-j;//剩余的反转次数 } jMP2=0; PTP_PTP4=0x00;//M2停止后,PP4输出低电平 //M1电机返回到X0 PORTA_BIT0=0x00;//PA0输出低电平(反转) for (j=0;j<mX;j++){ PTP_PTP5=0xff;// PP5输出高电平 PerPulse(iTx); PTP_PTP5=0x00;//PP5输出低电平 PerPulse(iTx); jMN1=jMP1-j; } jMP1=0; PTP_PTP5=0x00;//M1停止后,PP5输出低电平
} /* END eeprom */ /* ** ################################################################### ** ** This file was created by UNIS Processor Expert 2.98 [03.98] ** for the Freescale HCS12 series of microcontrollers. ** ** ################################################################### */
|