打印
[ZLG-ARM]

外部中断来接收数据出现异常

[复制链接]
1454|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaowang|  楼主 | 2007-4-2 14:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我作了系统,需要在两片单片机种利用并口(16位IO口传送数据),其中在2214中发送数据
               i=1;
               PINSEL0 = 0x00000000;                      
               PINSEL1 = 0x00000000;
               IO0DIR  = 0xFFFFFFFF;                         //P0口为输出口 
               while((IO3PIN &0x01000000) ==0)               //等待回应IO口变低(IO3PIN &0x01000000) ==0  &&(i<30)
                { 
                  IO0PIN  = (IO0SET&0xFFF00003)|(cp&0xF0)<<4|(cp&0x0F)<<2|cp[i+1]<<12 ;      //写数据
                  IO3SET  |=0xE << 16;                                                             //中断信号
             //     for(j=0;j<13;j++);
                  IO3CLR  |= 0xF << 16;                                                             //中断信号
             //     for(j=0;j<5;j++);
                  i+=2;
                } 
另外用2214作为接受数据:(利用外部中断0)
    int   main(void)
{  
    PINSEL0  = 0x00000000;                           // 初始化P0.6~13,P0.18~25为IO口,P0.16为EINT0
    PINSEL1  = 0x00000001;
    IO0DIR   = 0x00008038;                           // 设置IO口方向
    
    IO0CLR   |= 1 <<15;                               //拉低p0.15  
    i=0;   
    EXTMODE  = 0x01;                                 // 设置EINT0中断为边沿触发模式
    EXTPOLAR = 0x01;                                   // 设置EINT0中断为下降沿触发   
         /* 打开EINT1中断(设置向量控制器,即使用向量IRQ) */
    VICIntSelect = 0x00000000;                         // 设置所有中断分配为IRQ中断
    VICVectCntl0 = (0x20 |14);                         // 分配EINT0中断到向量中断1
    VICVectAddr0 = (int)IRQ_Eint0;                      // 设置中断服务程序地址
    EXTINT = 0x01;                                     // 清除EINT0中断标志                                                         
    VICIntEnable = 0x00004000;    
}

中断服务程序为
volatile uint16 Control_data[13] ={0,0,0,0,0,0,0,0,0,0,0,0,0} ;  //dingyi quanju bianliang
volatile uint16 fre,fudu;   //,a_1,a_2,a_3,a_4,a_5,a_6,a_7,a_8,a_9,a_10,a_11
volatile uint8 mutex,i;
/****************************************************************************
THe service programme of interrupt
****************************************************************************/
 void   __irq IRQ_Eint0(void)
{  
    uint16 rec_data;
    
  struct packed_data     //dingyi weiduan jiegouti
    {unsigned a:8;
     unsigned b:8;
    }data;
    
   IO0SET |= 1<<15 ;
    
   data.a = IO0PIN >> 6 ;
   data.b = IO0PIN >> 18 ;
   
   rec_data = (rec_data & 0x0000) |data.a;
   rec_data |=(data.b <<8);
   Control_data[i++] = rec_data;
// rec_data =0;
   
   while(i==13)
    { 
      fre = Control_data[0];         //频率
      fudu = Control_data[1];
//      a_1 = Control_data[2];
//      a_2 = Control_data[3];   
//      a_3 = Control_data[4];
//      a_4 = Control_data[5]; 
//      a_5 = Control_data[6];
//      a_6 = Control_data[7];   
//      a_7 = Control_data[8];
//      a_8 = Control_data[9]; 
//      a_9 = Control_data[10];   
//      a_10 = Control_data[11];
//      a_11 = Control_data[12];       
  
      i=0;
      mutex = 1;      
    }
   
   EXTINT = 0x01;                        // 清除EINT0中断标志
   VICVectAddr = 0;                    // 向量中断结束
   VICIntEnable |= 0x00004000;           //使能中断    
   IO0CLR   |= 1 <<15;                  //拉低p0.15
}    

现在问题时:单步跟踪时发现好像只有一次中断,且中断接受的数据都是相同的,是第一个数据。
请高手们看下到底是啥问题!希望得到大家的回答,急...   

相关帖子

沙发
gaowang|  楼主 | 2007-4-3 07:58 | 只看该作者

没人知道吗?我急啊

难道没人知道吗?

使用特权

评论回复
板凳
gaowang|  楼主 | 2007-4-3 13:54 | 只看该作者

????

使用特权

评论回复
地板
zlgARM| | 2007-4-3 17:43 | 只看该作者

gaowang

    尽量不要列代码,简单地描述清楚您的问题。别人一般都没太多精力去仔细猜测和破译您的代码,您的问题是什么意思。
    

使用特权

评论回复
5
gaowang|  楼主 | 2007-4-5 19:40 | 只看该作者

谢谢周立功,服务令人满意

我的问题经过我最近的努力,可能自己能解决,可能是因为接受数据的2101每次中断处理需要时间,而我发送的单片机没有延时!再谢谢你,
    再有一个问题:ADS里的for循环是不是不能太大?大概在1000的时候有可能会停止,有人遇到这个问题吗?

使用特权

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

本版积分规则

13

主题

32

帖子

0

粉丝