注册 登录
查看: 766|回复: 15

核心板上的四个灯微亮,程序无法运行?怎么处理?

[复制链接]
发表于 2013-7-7 01:26:30 | 显示全部楼层 |阅读模式
下午程序烧进去,小车跑的好好的,晚上再烧程序就不行了,运行不起来,控制不了外围器件,但能下载进去。
下进去之后,核心板上的四个led灯微亮,芯片不热,换另外一个芯片后,还是这样的现象。
初步怀疑是程序的问题,我用了两个定时器,是不是会影响了程序运行呢?
找了一天了,真心找不出什么问题,程序的逻辑关系也不复杂啊,有时候程序里换了一个参数值,程序就死在了图像采集中了。为什么会出现这种情况呢?超频150M 应该不算大吧。
不太了解程序的调试,马上快比赛了,出现了这样的问题,不知道怎么解决了? 看到的话,帮忙解决一下,到底是什么问题,时间紧迫,劳烦给些解决建议,先谢谢了!


回复

使用道具 举报

 楼主| 发表于 2013-7-7 08:07:26 | 显示全部楼层
在线等,谢谢。
这是isr.c中的代码,是不是这里用问题呢?

/******************** (C) COPYRIGHT 2011 山外嵌入式开发工作室 ********************
* 文件名       :isr.c
* 描述         :中断处理例程
*
* 实验平台     :山外kinetis开发板
* 库版本       :
* 嵌入系统     :
*
* 作者         :山外嵌入式开发工作室
* 淘宝店       :http://firestm32.taobao.com
* 技术支持论坛 :http://www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=1008
**********************************************************************************/



#include "common.h"
#include "include.h"
# include "isr.h"
extern void MotorPIDWork();
//extern void qpxian();
u16 GDG = 0;
u8 GDGflag = 0;                        //光电管工作标志位
u16 DAIJI = 0;
u8 DAIJIflag = 0;               //待机标志位
u16 Baohu = 0;
u8 Baohuflag = 0;               // 启动保护标志位
u8 GDGleft = 0;
u8 GDGright = 0;
u8 GDGting = 0;

/************************************************************************
*                             山外嵌入式开发工作室
*
*  函数名称:PORTE_IRQHandler
*  功能说明:PORTE端口中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-9-17    已测试
*  备    注:引脚号需要自己初始化来清除
*************************************************************************/
void PORTE_IRQHandler()
{
    u8  n;    //引脚号
   
    n = 27;
    if(PORTE_ISFR & (1 << n))           //PTA26触发中断
    {
        PORTE_ISFR  |= (1 << n);        //写1清中断标志位
        disable_irq(PIT1+ 68);          //关闭PIT1中断,避免影响无线模块收发
        
        enable_irq(PIT1+ 68);          //关闭PIT1中断,避免影响无线模块收发
    }
}

volatile u16 Vnum=0;

/*************************************************************************
*                             山外嵌入式开发工作室
*
*  函数名称:PORTA_IRQHandler
*  功能说明:PORTA端口中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-1-25    已测试
*  备    注:引脚号需要自己初始化来清除
*************************************************************************/
void PORTA_IRQHandler()
{
    u8  n = 0;    //引脚号
        //Site_t site={10,90};
//   volatile u16 i;
    /*==============================================================================
        注意:
                场中断放在行中断前面,即优先级高于行中断。
                场中断用户任务里,全部都return,确保不进入行中断的用户任务。
       
        ==============================================================================*/
    n = 29;                                                                                        //场中断
    if(PORTA_ISFR & (1 << n))                                   //PTA29触发中断
    {
        
        /*  以下为用户任务  */
               
                //场中断需要判断是场结束还是场开始
                if(img_flag == IMG_START)                                        //需要开始采集图像
                {
            img_flag = IMG_GATHER;                                        //标记图像采集中
            disable_irq(87);

                        DMA_EN(CAMERA_DMA_CH);                            //使能通道CHn 硬件请求
            
            DMA_DADDR(CAMERA_DMA_CH) = (u32)IMG_BUFF;    //恢复地址
                       
                }
#ifdef DEBUG
                else if(img_flag == IMG_GATHER)                                //图像采集中进入场中断,即图像采集完毕
                {
                        while(1);                               //DMA采集异常
                }
#endif
                else                                                                                //图像采集错误
                {
            disable_irq(87);                                                 //关闭PTA的中断
            //DMA_IRQ_DIS(CAMERA_DMA_CH);                        //关闭通道CHn 中断请求
            //LCD_Str(site,"ERROR",BLUE,RED);
                        img_flag = IMG_FAIL;                                        //标记图像采集失败
                }
        PORTA_ISFR  = ~0;                                        //场中断里,全部都要清中断标志位
                return;                                                                                //场中断触发了,就不需要处理行中断
               
        /*  以上为用户任务  */
    }

   
    PORTA_ISFR  = ~0;                                //写1清中断标志位
}


extern u16 pwmtest;
/*****************FTM1中断*******************/
void FTM1_IRQHandler()
{
  u8 s = FTM1_STATUS;
  u8 CHn;
  FTM1_STATUS = 0x00;
  CHn = 0;
  if(s & (1<<CHn))
  {
    FTM_IRQ_DIS(FTM1, CHn);
    pwmtest++;
    FTM_IRQ_EN(FTM1, CHn);
  }
  
}

/*************************************************************************
*                             山外嵌入式开发工作室
*
*  函数名称:PIT0_IRQHandler
*  功能说明:PIT0 定时中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-2-18    已测试
*  备    注:
*************************************************************************/

extern s16 pulse;
extern u8 pulseflag;

void PIT0_IRQHandler(void)
{  
//    PIT_TFLG0 = PIT_TFLG_TIF_MASK;
    pulse = FTM1_CNT;
    if((0==pulseflag) && (DAIJIflag==1))
     MotorPIDWork();
//    qpxian();
    FTM1_CNT = 0;
    PIT_Flag_Clear(PIT0);
}

/*************************************************************************
*                             山外嵌入式开发工作室
*
*  函数名称:PIT1_IRQHandler
*  功能说明:PIT1 定时中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-11-18    已测试
*  备    注:按键处理服务函数
*************************************************************************/

void PIT1_IRQHandler(void)
{
    if(DAIJI>=300)  //待机3秒
    {
      DAIJIflag = 1;
    }
    if(GDG>=2000)
    {
      GDGflag = 1;
    }
    if(Baohu>=500)
    {
      Baohuflag = 1;
    }
    DAIJI++;
    GDG++;
    Baohu++;
   
    GDGleft = gpio_get(PORTA, 12) || gpio_get(PORTA, 19);        //左边有一个检测到就行
    GDGright = gpio_get(PORTA, 11) || gpio_get(PORTA, 13);        //右边有一个检测到就行
    if((1==GDGleft)&&(1==GDGright)&&(1==GDGflag))
    {
        GDGting = 1;
//        led(LED0, LED_ON);
    }
     


   
//   
//    if(gpio_get(PORTA, 12) && gpio_get(PORTA, 19) && gpio_get(PORTA, 11) && gpio_get(PORTA, 13))
//          led(LED1, LED_ON);
//      //GDGting = 0;    //过障碍时,如果蹦的话,不处理。
//    if((gpio_get(PORTA, 12) || gpio_get(PORTA, 19)) && (gpio_get(PORTA, 11) && gpio_get(PORTA, 13)))
//          led(LED2, LED_ON);
////      GDGting = 0;    //过障碍时,如果蹦的话,不处理。
//    if((gpio_get(PORTA, 12) && gpio_get(PORTA, 19)) && (gpio_get(PORTA, 11) || gpio_get(PORTA, 13)))
//          led(LED3, LED_ON);
//      //GDGting = 0;    //过障碍时,如果蹦的话,不处理。
   
    PIT_Flag_Clear(PIT1);                                       //清中断标志位
}



void DMA0_IRQHandler()
{
    disable_irq(87);                      //场中断开始采集图片时,就关闭了中断,这里就不需要再关闭
    DMA_DIS(CAMERA_DMA_CH);                    //关闭通道CHn 硬件请求
    DMA_IRQ_CLEAN(CAMERA_DMA_CH);           //清除通道传输中断标志位
   
    img_flag = IMG_FINISH ;
    Vnum++;
}
回复 支持 反对

使用道具 举报

发表于 2013-7-7 10:14:54 | 显示全部楼层
下午程序烧进去,小车跑的好好的,晚上再烧程序就不行了,单步调试一下程序卡在哪里啊

给代码我们,不调试,我们也没法猜测原因

遇到这情况,应该单步调试,看看程序卡在哪里,为什么灯弱亮。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-7 11:20:13 | 显示全部楼层
山外メ雲ジ 发表于 2013-7-7 10:14
下午程序烧进去,小车跑的好好的,晚上再烧程序就不行了,单步调试一下程序卡在哪里啊

给代码我们,不调 ...

有时候死在图像采集里,有时候能单步运行没问题,但是就是控制不了外围器件。是不是中断的影响呢?
现在又烧不进去程序了?弹出了尝试四次的窗口。
回复 支持 反对

使用道具 举报

发表于 2013-7-7 11:46:17 | 显示全部楼层
gaolongtou 发表于 2013-7-7 11:20
有时候死在图像采集里,有时候能单步运行没问题,但是就是控制不了外围器件。是不是中断的影响呢?
现在 ...

先用我们的摄像头例程,验证硬件是否有问题。
如果没问题,再考虑排除法,屏蔽掉一些代码,看看屏蔽到哪些代码后就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-7 15:25:47 | 显示全部楼层
山外メ雲ジ 发表于 2013-7-7 11:46
先用我们的摄像头例程,验证硬件是否有问题。
如果没问题,再考虑排除法,屏蔽掉一些代码,看看屏蔽到哪 ...

哦,刚把输入捕捉中断给屏蔽了,可以了,但是为什么呢?如果再出现这种情况,怎么逐一排查呢?
回复 支持 反对

使用道具 举报

发表于 2013-7-7 16:14:01 | 显示全部楼层
gaolongtou 发表于 2013-7-7 15:25
哦,刚把输入捕捉中断给屏蔽了,可以了,但是为什么呢?如果再出现这种情况,怎么逐一排查呢?

试下 摄像头采集的时候,关闭中断,等摄像头采集完后,才开中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-7 21:45:16 | 显示全部楼层
山外メ雲ジ 发表于 2013-7-7 16:14
试下 摄像头采集的时候,关闭中断,等摄像头采集完后,才开中断

晚上又不行了,同样的程序,同样的硬件。快被搞疯了,定时器必须要用的,不能屏蔽,不然的话没办法闭环。山外大神,会不会是电源或驱动的问题呢?如果是的话,硬件电路应该怎么优化呢? 什么原因会导致芯片程序出错呢?现在电机疯转,舵机根本没办法打角,摄像头采集不到图像,等等各种问题。山外大哥,您经验丰富,给些思路可以不?谢谢了!
回复 支持 反对

使用道具 举报

发表于 2013-7-7 22:23:46 | 显示全部楼层
gaolongtou 发表于 2013-7-7 21:45
晚上又不行了,同样的程序,同样的硬件。快被搞疯了,定时器必须要用的,不能屏蔽,不然的话没办法闭环。 ...

摄像头采集不了,与中断函数被打断有关。
定时器,用于采集速度而已,不需要在摄像头采集的时候来采集速度,可以利用处理数据的时候,进行脉冲计数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-7 22:35:59 | 显示全部楼层
虚竹 发表于 2013-7-7 22:23
摄像头采集不了,与中断函数被打断有关。
定时器,用于采集速度而已,不需要在摄像头采集的时候来采集速 ...

请问定时器对程序的影响大吗?我用了两个定时器,一个脉冲计数和电机PID的计算,另一个是延时用的。现在程序相当不稳定。
回复 支持 反对

使用道具 举报

发表于 2013-7-7 23:20:14 | 显示全部楼层
gaolongtou 发表于 2013-7-7 22:35
请问定时器对程序的影响大吗?我用了两个定时器,一个脉冲计数和电机PID的计算,另一个是延时用的。现在程 ...

估计是对 摄像头 DMA 采集 有影响,DMA 和 CPU 抢总线时钟
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-7 23:30:37 | 显示全部楼层
虚竹 发表于 2013-7-7 23:20
估计是对 摄像头 DMA 采集 有影响,DMA 和 CPU 抢总线时钟

哦,请问怎么处理呢?不会不用DMA采集吧?请教一下解决办法,先谢谢了。
回复 支持 反对

使用道具 举报

发表于 2013-7-7 23:44:57 | 显示全部楼层
gaolongtou 发表于 2013-7-7 23:30
哦,请问怎么处理呢?不会不用DMA采集吧?请教一下解决办法,先谢谢了。

我直接关了,摄像头一场的时间很短。脉冲计数,我利用图像处理的那段时间来控制的
pid ,直接 while 循环里处理的。

你对时间控制那么严格的话,得自己想办法解决
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-8 03:01:43 | 显示全部楼层
虚竹 发表于 2013-7-7 23:44
我直接关了,摄像头一场的时间很短。脉冲计数,我利用图像处理的那段时间来控制的
pid ,直接 while 循环 ...

哦,好吧,还是要谢谢您了!
回复 支持 反对

使用道具 举报

发表于 2013-7-8 04:23:21 | 显示全部楼层
gaolongtou 发表于 2013-7-8 03:01
哦,好吧,还是要谢谢您了!

苦逼的孩子,像我那样通宵调摄像头
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-8 08:36:41 | 显示全部楼层
说不得 发表于 2013-7-8 04:23
苦逼的孩子,像我那样通宵调摄像头

该比赛了,熬夜不算什么,只要能解决问题就行,这才是最终目的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部