凌阳科技大学计划论坛

首页 » 16位u'nSP平台技术讨论区 » 应用技术讨论 » 求救,我的程序为什么没有反应呢?/循迹
lyf841026 - 2005-12-11 21:40:00

各位高手我的程序为什么下载到小车上没有反应呢?/传感器是好的??



#include "SPCE061V004.h"
void Delay();
void GoAhead();
void TurnLeft();
void TurnRight();
void StopCar();
extern unsigned int Get_IOB_Data(void);


main()
{
  unsigned int uiIOB;
  int iMoveFlag = 0x0000;
  *P_Watchdog_Clear = 0x0001;
 
  *P_IOA_Dir = 0xffff;
  *P_IOA_Attrib = 0xffff;
  *P_IOA_Data = 0x0000;
 
  *P_IOB_Dir = 0xfc00;
  *P_IOB_Attrib = 0xfc00;
  *P_IOB_Data = 0x0000;
 
  while (1)
  {
    *P_IOB_Data = iMoveFlag;
    *P_Watchdog_Clear = 0x0001;
    uiIOB = Get_IOB_Data();
    uiIOB = uiIOB & 0x0003;
    while(1)
    {
      switch (uiIOB)
      {
        case 0x0001:
            {
            TurnLeft();
            iMoveFlag = 0x2400;
            *P_Watchdog_Clear = 0x0001;
            break;
            }
        case 0x0002:
            {
            TurnRight();
            iMoveFlag = 0x1800;
            *P_Watchdog_Clear = 0x0001;     
            break;
            } 
        case 0x0003:
            {
            GoAhead();
            iMoveFlag = 0x2800;
            *P_Watchdog_Clear = 0x0001;
            break;
            }
        case 0x0000:
            {
            StopCar();
            iMoveFlag = 0x0000;
            *P_Watchdog_Clear = 0x0001;
            break;
            }
        default :
            break;   
      }
      }
  }
  *P_Watchdog_Clear = 0x0001;
}


void Delay()

  unsigned int i;
for(i=0; i<0x3Fff; i++)
  {
    *P_Watchdog_Clear = 0x0001;
  }                     
}


void GoAhead()
{
unsigned int j;
*P_IOB_Data = 0x2800;
  for(j=0; j<40; j++)
    Delay();
*P_IOB_Data = 0x0000;
}


void TurnLeft()
{
unsigned int j;
for(j=0; j<30; j++)
{
  *P_IOB_Data = 0x2400;
  Delay();
  Delay();
  *P_IOB_Data = 0x2800;
  Delay();
}
*P_IOB_Data = 0x0000;
}


void TurnRight()
{
  unsigned int j;
  for(j=0; j<30; j++)
  {
    *P_IOB_Data = 0x1800;
    Delay();
    Delay();
    *P_IOB_Data = 0x2800;
    Delay();
  }
  *P_IOB_Data = 0x0000;
}


void StopCar()
{
  unsigned int j;
*P_IOB_Data = 0x0000;
  for(j=0; j<40; j++)
    Delay();
*P_IOB_Data = 0x0000;

       
 

sujing2857 - 2005-12-11 22:55:00
电池装了?喇叭连了?跳线拔了?传感器是哪部分用的啊?
脚踏实地 - 2005-12-12 9:09:00

阻力太大,启动不了

zhuimengren - 2005-12-12 10:32:00
关键问题:下进去了没有??
lyf841026 - 2005-12-12 14:43:00

先谢谢大家了,我确保电池装了,喇叭连了,跳线拔了,因为我用其他程序下进去小车是可以走的,传感器是用来探测黑线和白线的,从而进行循迹的!

我想是不和端口的设置有关吗???程序肯定是下进去了。

还有要是换成pwm控制电机,怎样实现的呢?我设置好了TimerA_Ctrl ,TimerA_Data 再怎么办呢???

谢谢!

leajian - 2005-12-12 15:01:00

肯定是不能运行的。

楼主的主程序中的那个uiIOB是不会变的。按照楼主的意思,估计IOB口是接键盘or something,第一次运行时,uiIOB的值应该是0,然后,uiIOB就再也不变了,CPU一直在执行switch(uiIOB)中的某一条分支(估计最大的可能就是执行case 0x0000或者default),当然不会有响应了

lyf841026 - 2005-12-12 15:11:00

对啊,我的IOB0 IOB1接的是传感器的输入信号么,哦,那程序应该怎么改呢??

还有要是换成pwm控制电机,怎样实现的呢?我设置好了TimerA_Ctrl ,TimerA_Data 再怎么办呢???

leajian - 2005-12-12 15:17:00

把主程序内层while循环去掉就可以了。那是多余的

关于PWM,呵呵,抱歉,到目前为止还没怎么做过电机驱动 ^_^

leajian - 2005-12-12 15:18:00
主程序最后面的那条清狗也没必要要的 ^_^
zhuimengren - 2005-12-12 17:33:00
PWM很简单的,没做过也无所谓,大家不要怕!
zhuimengren - 2005-12-12 17:35:00

int main(void)
{
  *P_IOB_Dir = 0xffff;
  *P_IOB_Attrib = 0xffff; 
*P_IOB_Data = 0x0000;  //设置IOB为同相低电平输出

*P_TimerA_Data=0xfffa; 
  *P_TimerA_Ctrl=0x0234;  //初始化PWMA

*P_TimerB_Data=0xfffa;
  *P_TimerB_Ctrl=0x0234;  //初始化PWMB

while(1)

  *P_Watchdog_Clear = 0x0001; //清看门狗
}
}

lyf841026 - 2005-12-12 17:36:00

可是我刚开始,具体是怎用pwm控制电机呢?  我想控制两个电机,通过对他们转速的调节实现小车的转弯,这样可以吗???

是怎么做的呢???

谢谢各位大侠了!!!1

zhuimengren - 2005-12-12 17:41:00

真快,都已经回复了

解释一下程序:

硬件连接:IOB8(APWM)、IOB9(BPWM)分别作为两个电机的开关信号

软件部分:初始化IO、Timer后,IOB8、9就会自动产生PWM波形了,改变PWM占空比调节平均电压。

lyf841026 - 2005-12-12 17:41:00

哦,那要是加上控制电机的话是不

int main(void)
{
  *P_IOB_Dir = 0xffff;
  *P_IOB_Attrib = 0xffff; 
*P_IOB_Data = 0x0000;  //设置IOB为同相低电平输出

*P_TimerA_Data=0xfffa; 
  *P_TimerA_Ctrl=0x0234; 

*P_IOB_Data = 0x2800;  Delay();//  延迟就可以了呢

while(1)

  *P_Watchdog_Clear = 0x0001; //清看门狗
}
}

这样算pwm控制电机吗???

zhuimengren - 2005-12-12 17:46:00

*P_IOB_Data = 0x2800;  Delay();//  延迟就可以了呢

你这句加上也不会起作用的,PWM输出马上就会把你的赋值给改变。

也就是说当下一个PWM输出到了之后,你对IOB的赋值就会被PWM更改。

zhuimengren - 2005-12-12 17:53:00

你不妨这样,把PWM初始化发到下面。

如:

int main(void)
{
  *P_IOB_Dir = 0xffff;
  *P_IOB_Attrib = 0xffff; 
*P_IOB_Data = 0x0000;  //设置IOB为同相低电平输出

*P_IOB_Data = 0x2800;  Delay();//  延迟就可以了呢

*P_TimerA_Data=0xfffa; 
  *P_TimerA_Ctrl=0x0234; 

while(1)

  *P_Watchdog_Clear = 0x0001; //清看门狗
}
}

lyf841026 - 2005-12-12 17:54:00

哦,请问哪怎样才能使pwm的输出不会影响控制电机呢??

我用四个口 IOB10 ,IOB11 ,IOB12,IOB13 来控制两个电机。

谢谢:》

zhuimengren - 2005-12-12 18:00:00

1.你不需要的时候把PWM给关掉就行了,需要的时候再打开就OK了

2.你自己想办法吧,反正硬件的PWM只能由IOB8、9输出,你可以改变硬件连接,也可以扩展电路,都能够实现的,如果觉得麻烦烦的话,就用软件虚拟好了,任何一个IO都可以实现的!

lyf841026 - 2005-12-12 18:04:00

恩,我明白了,可是放在我循迹小车的主程序里边,那他怎样才能实时跟据传感器的信号,来对两个电机实现不同的pwm调速,实现小车的转弯呢???

真得很感谢大哥们啊!!!!!

leajian - 2005-12-12 20:04:00

IOB8、IOB9初始化为输出PWM后,还可以实时更改其输出参数吗?

zhuimengren - 2005-12-12 22:44:00


引用:
以下是引用leajian在2005-12-12 20:04:00的发言:

IOB8、IOB9初始化为输出PWM后,还可以实时更改其输出参数吗?


不太明白你的意思?是更改PWM的占空比还是想改变端口的状态?


两种都是可以的:


1.修改占空比:只要你修改了PWM的相关控制寄存器(定时器的Ctrl和Data),输出就会在立即更改!


2.改变端口状态:关闭PWM功能,然后对端口进行操作就可以了,注意一定要关闭PWM,否则操作会被PWM输出信号覆盖.


不知回答的对不对你的问题?


leajian - 2005-12-13 10:30:00


引用:
以下是引用zhuimengren在2005-12-12 22:44:00的发言:
>

不太明白你的意思?是更改PWM的占空比还是想改变端口的状态?


两种都是可以的:


1.修改占空比:只要你修改了PWM的相关控制寄存器(定时器的Ctrl和Data),输出就会在立即更改!


2.改变端口状态:关闭PWM功能,然后对端口进行操作就可以了,注意一定要关闭PWM,否则操作会被PWM输出信号覆盖.


不知回答的对不对你的问题?




正是我想知道的 ^_^


[em17][em17][em17]

[em17][em17][em17][em17][em17][em17][em17][em17]
vvxq - 2008-11-29 17:41:00
两年后来看这篇文章,有点晚了,但希望还是又人回答这里面的问题,很简单的问题,怎么管PWM中断
 1 
查看完整版本: 求救,我的程序为什么没有反应呢?/循迹