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

12F675 + write_eeprom + INT_EXT

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
ChicoDaRave



Joined: 21 Nov 2014
Posts: 10

View user's profile Send private message

12F675 + write_eeprom + INT_EXT
PostPosted: Thu May 21, 2015 3:12 am     Reply with quote

Hello people.
I'm doing a small project here, all were going ok until here.
The device has a button connected to GP2, this should be a mode button, each time button is pressed INT_EXT is called, inside it Mode++; and write_eeprom(254,Mode);
In the setup routine there is Mode=read_eeprom(254);
So, each time the device is turned on should always in same mode, but it is not!
Each time I full turn off the device then turn it on again Mode is zero, I dont know what is happening but I believe the INT_EXT routine is being called on the startup, without a button press. *update, I made INT_EXT toggle a LED in another pin and it was activated in the startup.
GP2 is pulled up with a resistor, button ties it to ground, config is ext_int_edge(H_TO_L);

I dont know how to fix this, so I'm asking help here.

Thank you very much.
Ttelmah



Joined: 11 Mar 2010
Posts: 19548

View user's profile Send private message

PostPosted: Thu May 21, 2015 3:50 am     Reply with quote

With any of the interrupts, when you 'reprogram' the interrupt (so change a counter, enable a serial, or change the edge being used for the EXT interrupt for example), the sequence needs to be:

1) Do the setup.
2) Make sure the hardware condition if applicable is cleared (so for INT_RB, read the port, for the serial make sure no characters are waiting etc.).
3) Clear the interrupt.
4) Enable the interrupt.

Microchip have a warning in some data sheets, and in some of their application notes for external interrupts, that setting the INTEDG bit (which selects which edge the interrupt is on), can cause the interrupt to trigger, and also that the interrupt may be set on power-on.

So basically:
Code:

    ext_int_edge(howyouwant); //set the edge how you want
    //for things like INT_RB, read the port here
    clear_interrupts(INT_EXT); //clear the interrupt
    enable_interrupts(INT_EXT);
    enable_interrupts(GLOBAL);


As a comment though, even if it is triggering the result should not be '0'. It sounds as if you are enabling the interrupt before reading the 'mode', so then the default value in the variable (typically 0xFF), gets incremented by one, and written, to give the zero result. Your reading should be before you enable the interrupt.
ChicoDaRave



Joined: 21 Nov 2014
Posts: 10

View user's profile Send private message

PostPosted: Thu May 21, 2015 4:44 am     Reply with quote

Precise answer Ttelmah!
Just "clear_interrupt(INT_EXT);" right before enabling it has solved!
Thank you very much!

I was doing everything right as you said, except for this.
Everything was BEFORE the "enable_interrupts(GLOBAL);" except for the "Mode=read_eeprom(254);" which was later.

Yes, probably 255 then incremented in the external interrupt and then writed to eeprom as zero.

Thank you again!
Very Happy

PS: Each time I readed the code from the microcontroller (in Pickit2 software) the value in address 254 was incremented, now it is all time the same, as expected Very Happy
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