thy110 发表于 2014-5-1 11:42:06

我在用k60做东西时,中断出现了一些错误,求组啊(已解决)

本帖最后由 FSL_TICS_ZJJ 于 2014-5-7 11:12 编辑

我用的是也厚的库。我在程序里加入了一个按键中断,在按键中断里使能里定时中断,但是,按下按键后要经过一段时间,定时中断才开启,这个延时让我恒苦恼。
还有就是我的按建中断只能执行一次,需要关机后才
void main()
{

   FTM_QUAD_Init(FTM1);                        //FTM1 正交解码初始化
   
    pit_init_ms(PIT0, 1);                                 //初始化PIT0,定时时间为: 1000ms

    port_init(PTC0, ALT1 | IRQ_FALLING | PULLDOWN );          //干簧管初始化 PTC0 管脚,复用功能为GPIO ,下降沿触发中断,上拉电阻
    port_init(PTC5, ALT1 | IRQ_FALLING | PULLDOWN );          //光电管初始化PTC5 管脚,复用功能为GPIO ,下降沿触发中断,上拉电阻
    port_init(PTC6, ALT1 | IRQ_FALLING | PULLDOWN );          //光电管初始化PTC6 管脚,复用功能为GPIO ,下降沿触发中断,上拉电阻
   port_init(PTC7, ALT1 | IRQ_FALLING | PULLDOWN );          //光电管初始化PTC7 管脚,复用功能为GPIO ,下降沿触发中断,上拉电
    port_init(PTC14, ALT1 | IRQ_FALLING | PULLUP );          //启动初始化 PTC14管脚,复用功能为GPIO ,下降沿触发中断,上拉电阻
    port_init(PTC15, ALT1 | IRQ_FALLING | PULLUP );          //停车初始化 PTC115 管脚,复用功能为GPIO ,下降沿触发中断,上拉电
    set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);      //设置PIT0的中断复位函数为 PIT0_IRQHandler   
    set_vector_handler(PORTC_VECTORn ,PORTC_IRQHandler);    //设置PORTE的中断复位函数为 PORTE_IRQHandler
    set_irq_priority(PORTC_IRQn,0);
    set_irq_priority(PIT0_IRQn,1);
    enable_irq (PORTC_IRQn);                              //使能PORTE中断

    while(1)
    {
      
    }
}
/******************************************************/
/******************************************************/
/******************************************************/
/******************************************************/
/******************************************************/
/******************************************************/
/******************************************************/
/****************************************************/
void PIT0_IRQHandler(void)
{
int16 val1;
PIT_Flag_Clear(PIT0);       //清中断标志位

val1 = FTM_QUAD_get(FTM1);          //获取FTM 正交解码 的脉冲数(负数表示反方向)
FTM_QUAD_clean(FTM1);
System_Feed_Speed=abs(val1);//(int16)(0.15*val1);
AD_GetValue();
Cal_PostitionA();
if(Cal_PostitionA()==0)
{
duoji_PID();          //舵机PID
//Moto_PID();
}
if(Cal_PostitionA()==1)
{
   if(AD_ZY>AD_ZY)
   {
    FTM_PWM_Duty(S3010_FTM, S3010_CH,165+20);
   }
   if(AD_ZY<AD_ZY)
   {
    FTM_PWM_Duty(S3010_FTM, S3010_CH,165-30);
   }
}
}
/*****************************************************/
/*******************启动和停车中断***********************************/
/*!
*@brief      PORTD端口中断服务函数
*@since      v5.0
*/
void PORTC_IRQHandler(void)
{

    PORT_FUNC(C,14,qidong_handler);            //启动
   
/
void qidong_handler(void)
{
      
      DELAY_MS(2000);
      enable_irq (PIT0_IRQn);      //使能PIT0中断
      FTM_PWM_Duty(MOTOR_FTM, MOTOR1_PWM,70);
      FTM_PWM_Duty(MOTOR_FTM, MOTOR2_PWM,70);
}能执行下一次。求组啊

山外メ雲ジ 发表于 2014-5-1 12:43:32

因为你在按键中断里加了个大延时:DELAY_MS(2000);

thy110 发表于 2014-5-1 12:58:59

山外メ雲ジ 发表于 2014-5-1 12:43
因为你在按键中断里加了个大延时:DELAY_MS(2000);

那个延时是我们要求加上的,我的意思是在2s的延时后,他还无法执行定时中断

山外メ雲ジ 发表于 2014-5-1 16:41:10

先简化一下代码吧,太多无关的代码,排除法来确定原因。
看你初始化pit0为1ms,然后再在中断里使能,这个时候按理应该是马上执行pit0中断的。

thy110 发表于 2014-5-1 17:51:17

山外メ雲ジ 发表于 2014-5-1 16:41
先简化一下代码吧,太多无关的代码,排除法来确定原因。
看你初始化pit0为1ms,然后再在中断里使能,这个时 ...

好的,我试一下

FSL_TICS_ZJJ 发表于 2014-5-4 11:32:05

楼主问题解决了没有?
如果没解决,欢迎继续提问。
如果已经解决了,还请帮忙在你的标题上加上(已解决),方便我们查看未结帖。

taishandadi 发表于 2014-5-4 11:51:06

在中断里面不要加大延时,利用时间片。尽量避免delay这种。

rootxie 发表于 2014-5-4 12:05:05

在中断里硬等2秒中,结果就是MCU什么都不做(不需要监测其他的吗),干等2秒钟?是故意这么设计的?还是无意为之?
建议采用状态机来做

ringan865 发表于 2014-5-4 12:50:45

定义个变量作计数用,单独用一个定时器来做为1ms或10ms定时节拍,变量递减为0后启用定时中断。
页: [1]
查看完整版本: 我在用k60做东西时,中断出现了一些错误,求组啊(已解决)