LPC1114 CT32B0_CAP0 malfunction

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

LPC1114 CT32B0_CAP0 malfunction

1,292 次查看
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by assembled on Fri Mar 22 10:58:27 MST 2013
Hi everyone,
I am having trouble with Timer0 Capture0. I am using LPC1114/301, IDE version LPCXpresso v4.2.3.

Setup:
optical interrupter output is connected to PIO1_5, signal is good, frequeny varies from few Hz to 750Hz.

I took the PWM example and modified it to:

int main (void) {
    init_timer32(0, 0xFFFFFFFF);
    enable_timer32(0);
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);    
    GPIOSetDir( 2, 5, 1 );
        while (1)                                /* Loop forever */
    {
        /* I/O configuration and LED setting pending. */
        setMatch_timer16PWM (1, 1, 900-timer32_0_capture);
        if (GetGPIOBit(1,5))
            SetGPIOBit(2,5);
        else
            ClrGPIOBit(2,5);
    }
}
IRQ:

void TIMER32_0_IRQHandler(void)

{
  uint32_t temp;
  if ( LPC_TMR32B0->IR & 0x01 )
  {  
    LPC_TMR32B0->IR = 1;                /* clear interrupt flag */
    timer32_0_counter++;
  }
  if ( LPC_TMR32B0->IR & (0x1<<4) )    //jei CAP
  {  
    LPC_TMR32B0->TC = 0;                 //Reset timer

    if ( LPC_TMR32B0->CR0  > 0x75300)
    {
        if (timer32_0_capture < 1999)
        {
            timer32_0_capture++;
        }
    }
    else
    {
        temp = LPC_TMR32B0->CR0;
        if (timer32_0_capture > 1)
            timer32_0_capture--;
    }
    LPC_TMR32B0->IR = 0x1<<4;            /* clear interrupt flag */
  }
  return;
}


Im main I am only using timer32_0_capture for PWM PW and putting P1.5 state to P2.5 just to make sure my signal is OK.

In IRQ I compare CR0 to a fixed value and increasing or decreasing timer32_0_capture accordingly. Now for problems:
1. CR0 value is "random". You can see that I assign it to variable [B]temp[/B] and I occasionally get temp values of 1, 11, etc. It does not depend on input frequency. My timer32_0_capture is just moving around 1..2 whatever the input signal interval.

I suppose I am just missing some childish mistake but I am unable to find it.

Thank you in advance for your input.
0 项奖励
回复
3 回复数

1,230 次查看
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by assembled on Mon Mar 25 07:14:45 MST 2013
Problem solved by enabling Hysteresis on pin. It seems that quite slow pulse transition times of encoder caused miscaptures.
0 项奖励
回复

1,230 次查看
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by assembled on Sat Mar 23 04:04:52 MST 2013
Thank you for your reply. As I said, my program is based on pwm demo code and standard timer32.c:
/******************************************************************************
** Function name:        init_timer
**
** Descriptions:        Initialize timer, set timer interval, reset timer,
**                        install timer interrupt handler
**
** parameters:            timer number and timer interval
** Returned value:        None
** 
******************************************************************************/
void init_timer32(uint8_t timer_num, uint32_t TimerInterval) 
{
  if ( timer_num == 0 )
  {
    /* Some of the I/O pins need to be carefully planned if
    you use below module because JTAG and TIMER CAP/MAT pins are muxed. */
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);
    LPC_IOCON->PIO1_5 &= ~0x07;    /*  Timer0_32 I/O config */
    LPC_IOCON->PIO1_5 |= 0x02;    /* Timer0_32 CAP0 */
    LPC_IOCON->PIO1_6 &= ~0x07;
    LPC_IOCON->PIO1_6 |= 0x02;    /* Timer0_32 MAT0 */
    LPC_IOCON->PIO1_7 &= ~0x07;
    LPC_IOCON->PIO1_7 |= 0x02;    /* Timer0_32 MAT1 */
    LPC_IOCON->PIO0_1 &= ~0x07;    
    LPC_IOCON->PIO0_1 |= 0x02;    /* Timer0_32 MAT2 */
#ifdef __JTAG_DISABLED
    LPC_IOCON->JTAG_TDI_PIO0_11 &= ~0x07;    
    LPC_IOCON->JTAG_TDI_PIO0_11 |= 0x03;    /* Timer0_32 MAT3 */
#endif
#if CONFIG_TIMER32_DEFAULT_TIMER32_0_IRQHANDLER==1
    timer32_0_counter = 0;
    timer32_0_capture = 0;
#endif //TIMER32_0_DEFAULT_HANDLER
    LPC_TMR32B0->MR0 = TimerInterval;
#if TIMER_MATCH
    LPC_TMR32B0->EMR &= ~(0xFF<<4);
    LPC_TMR32B0->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)|(0x3<<10));    /* MR0/1/2/3 Toggle */
#else
    /* Capture 0 on rising edge, interrupt enable. */
    LPC_TMR32B0->CCR = (0x1<<1)|(0x1<<2);
#endif
    LPC_TMR32B0->MCR = 3;            /* Interrupt and Reset on MR0 */

#if CONFIG_TIMER32_DEFAULT_TIMER32_0_IRQHANDLER==1
    /* Enable the TIMER0 Interrupt */
    NVIC_EnableIRQ(TIMER_32_0_IRQn);
#endif
  }
  else if ( timer_num == 1 )
  {
    /* Some of the I/O pins need to be clearfully planned if
    you use below module because JTAG and TIMER CAP/MAT pins are muxed. */
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10);
#ifdef __JTAG_DISABLED
    LPC_IOCON->JTAG_TMS_PIO1_0  &= ~0x07;    /*  Timer1_32 I/O config */
    LPC_IOCON->JTAG_TMS_PIO1_0  |= 0x03;    /* Timer1_32 CAP0 */
    LPC_IOCON->JTAG_TDO_PIO1_1  &= ~0x07;    
    LPC_IOCON->JTAG_TDO_PIO1_1  |= 0x03;    /* Timer1_32 MAT0 */
    LPC_IOCON->JTAG_nTRST_PIO1_2 &= ~0x07;
    LPC_IOCON->JTAG_nTRST_PIO1_2 |= 0x03;    /* Timer1_32 MAT1 */
    LPC_IOCON->ARM_SWDIO_PIO1_3  &= ~0x07;
    LPC_IOCON->ARM_SWDIO_PIO1_3  |= 0x03;    /* Timer1_32 MAT2 */
#endif
    LPC_IOCON->PIO1_4 &= ~0x07;
    LPC_IOCON->PIO1_4 |= 0x02;        /* Timer0_32 MAT3 */

#if CONFIG_TIMER32_DEFAULT_TIMER32_1_IRQHANDLER==1
    timer32_1_counter = 0;
    timer32_1_capture = 0;
#endif //TIMER32_1_DEFAULT_HANDLER

    LPC_TMR32B1->MR0 = TimerInterval;
#if TIMER_MATCH
    LPC_TMR32B1->EMR &= ~(0xFF<<4);
    LPC_TMR32B1->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)|(0x3<<10));    /* MR0/1/2 Toggle */
#else
    /* Capture 0 on rising edge, interrupt enable. */
    LPC_TMR32B1->CCR = (0x1<<0)|(0x1<<2);
#endif
    LPC_TMR32B1->MCR = 3;            /* Interrupt and Reset on MR0 */

#if CONFIG_TIMER32_DEFAULT_TIMER32_1_IRQHANDLER==1
    /* Enable the TIMER1 Interrupt */
    NVIC_EnableIRQ(TIMER_32_1_IRQn);
#endif
  }
  return;
}
/******************************************************************************
** Function name:        enable_timer
**
** Descriptions:        Enable timer
**
** parameters:            timer number: 0 or 1
** Returned value:        None
** 
******************************************************************************/
void enable_timer32(uint8_t timer_num)
{
  if ( timer_num == 0 )
  {
    LPC_TMR32B0->TCR = 1;
  }
  else
  {
    LPC_TMR32B1->TCR = 1;
  }
  return;
}


At first I tried free running timer, subtracting previous CR0 value from current with same results.
0 项奖励
回复

1,230 次查看
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by gbm on Sat Mar 23 00:08:57 MST 2013
It's not possible to guess what's wrong with your code without seeing it. Post your timer setup routines.
0 项奖励
回复