首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

难道是case语句不对?

难道是case语句不对?

6RtbRbVM.rar (696.97 KB)


程序里发现一个很奇怪的现象

通过串口第一次发送一个命令后,程序不能执行,只有第二次发送才行

看了一下,在程序的case里程序没有赋值,但是也执行了,所以循环后,又把sFlag='F';。但是为什么第二次以及后续的发送时,都不会出现这个错误,这是为什么呢

大家遇到过类似的问题么

谢谢了

/** ###################################################################
** 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.
**
** ###################################################################
*/

上边是程序的部分源代码,

代码太长了,看得眼晕

void AS1_OnRxChar(void)
{
/* Write your code here ... */
//datai=2;
//for(;data!='D';) { // 没有接收到字符‘D',程序就一直等待 通讯协议为"R02C05D"
Cpu_Delay100US(10);

if(AS1_GetCharsInRxBuf()!=0){
AS1_RecvChar(&data);
if (data=='P'){//字符P为复位标志,即,上位机点击了'停止'按钮
motoReset();
}
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='T';
}

在串口中断处增加一个延迟就可以了,但是这个延迟不能太大或太小,我试了试20和7、8等都不行

Cpu_Delay100US(10);

是不是根据芯片的参数,对延迟有固定的参数要求呢?

请各位指点

谢谢

QUOTE:
以下是引用fjczd在2009-2-12 12:09:00的发言:

void AS1_OnRxChar(void)
{
/* Write your code here ... */
//datai=2;
//for(;data!='D';) { // 没有接收到字符‘D',程序就一直等待 通讯协议为"R02C05D"
Cpu_Delay100US(10);

if(AS1_GetCharsInRxBuf()!=0){
AS1_RecvChar(&data);
if (data=='P'){//字符P为复位标志,即,上位机点击了'停止'按钮
motoReset();
}
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='T';
}

在串口中断处增加一个延迟就可以了,但是这个延迟不能太大或太小,我试了试20和7、8等都不行

Cpu_Delay100US(10);

是不是根据芯片的参数,对延迟有固定的参数要求呢?


返回列表