CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Unexpected second ext2 interrupt

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
[email protected]



Joined: 24 Mar 2010
Posts: 24

View user's profile Send private message Send e-mail

Unexpected second ext2 interrupt
PostPosted: Wed Nov 24, 2010 2:13 am     Reply with quote

Hi,

I am using 18F85J90 with CCS version 4.073.
One of the functions is receiving interrupt from gpio device.
Code:

void main() 
{
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
   setup_timer_1(T1_DIV_BY_1 | T1_INTERNAL);           
 
   enable_interrupts (INT_SSP);
    enable_interrupts (INT_RB);
   enable_interrupts (INT_EXT);
   enable_interrupts (INT_EXT3);
   enable_interrupts (INT_EXT2); 

   
   enable_interrupts (INT_EXT1); 
   
   
   ext_int_edge(0, H_TO_L);     


   ext1_interrupt();   
   ext_int_edge(2, H_TO_L);



   ext_int_edge(3, H_TO_L);   


   // timer interrupts ...
    enable_interrupts (INT_TIMER0);
    enable_interrupts (INT_TIMER1);

   // global int ...
    enable_interrupts (GLOBAL);
   
   delay_ms(50);
   
   DisplayFirmwareVersions();   
   
   LcdDisplayNormal();
   UpdateLowBatDisplay(); 

   while(1)
   {
    ...
         if (event_flag)
         {            
            integrator_event_flag = 0;

            parse_gpio_request();

            SetupMenuTimer(MENU_TIMER_2_SEC);     //enable more timeout
         }
    ...
   }
}

void parse_gpio_request()
{
    byte dummy_read=0;
    byte io_register;
    byte io_changed = 0;


    clear_interrupt(INT_EXT2);
   
}


#INT_EXT2
void ext2_interrupt()
{

    setup_oscillator(OSC_8MHZ);
   
    output_high(PIN_F2);   // debug
   
    delay_ms(DEBOUNCE_TIME_MS); 

    event_flag = 1;   

    output_low(PIN_F2);   // debug
   
   
}

The gpio interrupt output is connected to ext2 interrupt input in the 18F85J90.

When gpio device outputs a negedge, the controller receives an interrupt, sets the event_flag=1 and execute parse_gpio_request() in main loop.

The phenomena i see is that for a single negedge #INT_EXT2 pops twice: once when negedge and again before parse_gpio_request() is executed.

I cannot understand where does the second interrupt comes from, any ideas?

Regards,
_________________
Gil F.
Ttelmah



Joined: 11 Mar 2010
Posts: 19541

View user's profile Send private message

PostPosted: Wed Nov 24, 2010 3:22 am     Reply with quote

First comment. Sort out your setup. You should _not_ change the interrupt edge after enabling the interrupt. This can give a spurious trigger.

Sequence should be:
Set interrupt edge
clear interrupt
enable interrupt

Are you using the internal voltage regulator?. If not, have you got the VddCore pin tied to Vdd, with a well decoupled short track?. If you are, are you sure your decoupling capacitor meets the ESR requirements. These chips are quite fussy about this area.....

You need to look very carefully at the ground between the GPIO device, and the PIC, and triple check that the input is not actually receiving noise to trigger a second interrupt.

The interrupt is already cleared by the interrupt handler. Are you sure that your delays are just not adding up to more than the time between packets?. You have a delay in the interrupt (research why this may not be a good idea.....), and delays in your external code (makes this an even worse idea....).

Best Wishes
[email protected]



Joined: 24 Mar 2010
Posts: 24

View user's profile Send private message Send e-mail

Unexpected second ext2 interrupt
PostPosted: Wed Nov 24, 2010 3:42 am     Reply with quote

Thanks for reply.

You sent me some real good tips.

Moreover, I have found the problem.

Half of the gpio device ports are output to outer world and half are inputs from outer world.

Somewhere in main loop the outputs to outer world are configured by the pic (using i2c). This caused a loop-back interrupt on ext2.



Regards
_________________
Gil F.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group