embedded code - Writing GPIO interrupts for LPC1769 -


i developed application generate pulses(pwm) using timer of lpc1769. period of pulse 10milli seconds , pulse width can varied required. pulse width generated depending on reference signal square wave of 10milli seconds(with on period of 7.2ms , off period of 2.8ms). whenever there rising edge of signal pwm pulse should start. working fine. detect rising edge used gpio interrupt external interrupt3 isr :

1) if rising edge on gpio pin(p2.11)

2) clear rising edge status on pin.

3) set timer few milli seconds

and in timer isr 1) clear pending timer irqs 2)make gpio pin high on generating pwm pulse(p2.6) 3) set timer few milli seconds , clear pin(p2.6)(same timer used in both isrs) 4) disabling timer , re enabling rising edge interrupt on gpio pin(p2.11), again serves isr of external interrupt3 on rising edge of reference signal , continues above.

now getting problem in code in developing application as,

1) if rising edge disable interrupt , set timer 8 milli seconds delay.

2) in timer isr generate 10 pwm cycles after re enable external interrupt. (the same timer used in both isrs).

3) output should respect rising edge of reference signal 8 milli second delay 10 pwm cycles(all have time period of 10ms) again 8ms delay respect rising edge of reference signal , 10 pwm cycles.

but once after 10 cycles when re enable external interrupt irrespective of rising edge of reference signal delay of 8ms added. whenever last 10th cycle complete enabling interrupt again, point adding 8ms delay. question if interrupt enabled rising edge of reference signal should serve isr rising edge only. not happening in case. not understanding behaviour. ///////////////////////////////////////////////////////////////////////////////////////////////////// code, isr external interrupt3

void gpio_irq_handler(void) {     uit32_t i;     if(((chip_gpioint_getstatusrising(lpc_gpioint, gpio_interrupt1_port) >> gpio_interrupt1_pin) & 0x01) != 0) /*group 1*/      {          count1 = 0;          start_timer1((half_wave_period - delay) * timertick);          nvic_clearpendingirq(gpio_interrupt_nvic_name);          nvic_disableirq(gpio_interrupt_nvic_name);       } } 

timer1 isr is

    void timer1_irqhandler(void)     {         if (chip_timer_matchpending(lpc_timer1, 1) == 0)         {             return;         }         chip_timer_clearmatch(lpc_timer1, 1);         if(count1 > 10)         {             lpc_gpio1->pin = (lpc_gpio1->pin & ~(1 << 19));             stop_timer1();         }          else         {             switch(state1)             {                 case 1:                         state1 = 2;                         lpc_gpio1->pin = (lpc_gpio1->pin | (1 << 19));                         set_timer1(2000 * timertick);                 break;                  case 2:                         state1 = 1;                         lpc_gpio1->pin = (lpc_gpio1->pin & ~(1 << 19));                         count1++;                         set_timer1((half_wave_period - delay) * timertick);                 break;                  default:                 break;             }         } }  where, half_wave_period = 10000 microseconds delay = 2800 microseconds gpio_interrupt1_port= port2 gpio_interrupt1_pin = p2.12 gpio_interrupt_nvic_name = eint3_irqn gpio_irq_handler =  eint3_irqhandler 

and functions start_timer1 used initialize timer1 , set timer1 given number of ticks , interrupt on match. set_timer1 : set timer1 given ticks , interrupt. stop_timer1 : disable timer1 , enables external interrupt3.

please reply regards anita


Comments

Popular posts from this blog

sql - VB.NET Operand type clash: date is incompatible with int error -

SVG stroke-linecap doesn't work for circles in Firefox? -

python - TypeError: Scalar value for argument 'color' is not numeric in openCV -