打印

pic16系列代码问题

[复制链接]
1394|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
akwqfakwqfak|  楼主 | 2013-1-30 07:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<16F648A.h>
#fuses NOLVP,NOMCLR,INTRC,NOPROTECT,NOCPD
#use delay(clock=4000000)
static int counter_left=0,counter_right=0;
static int Tableindex1=0,Tableindex2=0;
static int const Lookuptable1[8]={0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01};
static int const Lookuptable2[8]={0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01};

int left_speed=-1;
int right_speed=-1;

struct pin{
int sensor:2;
int unused:4;
boolean unused1;
boolean unused2;
int portA:4;//A for left motor
int portB:4;//B for right motor
};
struct pin pin_map;
struct pin pin_dir;
#byte pin_map=0x05
#byte pin_dir=0x85

#int_RTCC
void Timer0_isr()
{
   if(counter_left<left_speed&&counter_right<right_speed)
   {
     counter_left++;
     counter_right++;
   }
   else if (counter_left==left_speed&&counter_right<right_speed)
  {
      
      Tableindex1=(Tableindex1+1)%8;
      pin_map.portA=Lookuptable1[Tableindex1];
      counter_left=0;
     counter_right++;
   }
   else if(counter_left<left_speed&&counter_right==right_speed)
   {
      Tableindex2=(Tableindex2+1)%8;
      pin_map.portB=Lookuptable2[Tableindex2];
     counter_right=0;
     counter_left++;
   }
   else if(counter_left==left_speed&&counter_right==right_speed)
   {
     Tableindex1=(Tableindex1+1)%8;
      pin_map.portA=Lookuptable1[Tableindex1];
      counter_left=0;
      Tableindex2=(Tableindex2+1)%8;
      pin_map.portB=Lookuptable2[Tableindex2];
     counter_right=0;
   }
   else
   {
      counter_left++;
      counter_right++;
   }
}

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
pin_dir.sensor=0b11;
pin_dir.portA=0x0;
pin_dir.portB=0x0;

while(1)
{   
   switch(pin_map.sensor)
   {
   case 0b00:
   
               left_speed=30;
               right_speed=30;
               break;
   case 0b10:
               left_speed=3;
               right_speed=1;
               break;
   case 0b01:
              left_speed=1;
              right_speed=3;
              break;
   case 0b11:
   
               left_speed=3;
               right_speed=3;
               break;
   default:
                           left_speed=30;
               right_speed=30;
               break;       
   }
//   delay_ms(1);
}
}
这个是我边写的 代码,测试过基本上好使, 但是每次改开关的时候(例如从11 改为10,状态有时候会停住,用proteus仿真也是如此,不知道为什么会停住啊,只是有时候,有时候又好使)是不是跳变的问题啊~~还是什么问题, 求大神解答啊~~~~

相关帖子

沙发
akwqfakwqfak|  楼主 | 2013-1-30 07:39 | 只看该作者
但是11和00的开关貌似 都好使  就是10 和01 不太好使,不知道为什么耶~~~~~

使用特权

评论回复
板凳
ayb_ice| | 2013-1-30 08:01 | 只看该作者
中断程序影响吧

使用特权

评论回复
地板
shiyan1532| | 2013-1-30 08:20 | 只看该作者
帮顶

使用特权

评论回复
5
akwqfakwqfak|  楼主 | 2013-1-30 08:48 | 只看该作者
额 ~~我刚才自己找到 问题了, 是中断判断的问题,  最后一个不应该是counter_left++; counter_right++   应该改成 counter_left=0;counter_right=0;要不然永远跳不出来~~~同样谢谢前面两位~~~

使用特权

评论回复
6
jlass| | 2013-1-30 09:59 | 只看该作者
恭喜楼主解决问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝