|
|
View previous topic :: View next topic |
Author |
Message |
Guest
|
IOC strange behavior |
Posted: Thu Jul 30, 2009 3:15 am |
|
|
Hello,
Although my interrupt routine works, I don't understand it's behavior.
I need the interrupt-on-change at a certain Pin (RA4). I thought that only edges would cause the IOC to start and it only would happen once per one edge.
So, I have the following simple code:
Code: |
#int_RA
void ext_isr() {
INT_CNT++;
}
main(){
EXT_INT_EDGE(H_TO_L);
enable_interrupts(INT_RA4);
enable_interrupts(GLOBAL);
INT_CNT = 0;
while (TRUE){
//here is my code}
}
|
What happens is, the counter INT_CNT increments as long as RA4 is LOW. Using a button, the longer it is pressed and pulls to GND, the higher is the number of my counter. I thought it would just count ONE for ONE edge (even the switch bounces, it just could be three or four, but it is thousands for a short pressing.
So, the only explanation could be, that it is not edge triggered but pulse triggered.
Regards
Dieter |
|
|
Bulova
Joined: 30 Jul 2009 Posts: 2
|
Further info |
Posted: Thu Jul 30, 2009 4:46 am |
|
|
Hello,
sorry I forgot to mention:
Compiler:
CCS PCM C Compiler, Version 3.239
Microcontroller:
PIC12F683
Best regards
Dieter |
|
|
Bulova
Joined: 30 Jul 2009 Posts: 2
|
Solved |
Posted: Thu Jul 30, 2009 5:15 am |
|
|
Hello,
I found the answer by myself. Like so often, the answer is written in the datasheet:
Quote: | ... clears the interrupt by
a) Any read or write of GPIO. This will end the mismatch condition.
b) Clear the flag bit GPIF.
A mismatch condition will continue to set flag bit GPIF.
|
This also answers other questions of my code revisions, where the RA4 is read within the ISR and causes the interrupt to be stopped after its execution. And thus causes "normal" behavior.
Regards
Dieter |
|
|
Ttelmah Guest
|
|
Posted: Thu Jul 30, 2009 6:17 am |
|
|
A forum search would have found this.
The 'B' changed interrupt, is one of about three common interrupts, where there are hardware things that 'must' be done in the interrupt handler.
Serial receive - you must read the character.
Serial transmit - you must either write another character, or turn off the interrupt.
Port B receive - read the port.
Glad you found it from the data sheet.
Best Wishes |
|
|
|
|
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
|