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

int_rb problem

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



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

int_rb problem
PostPosted: Sun Nov 04, 2012 5:21 am     Reply with quote

Here is the code:
Code:

#include <16F87.h>
#fuses nowdt, put, hs
#use delay(clock = 4M)
#use rs232(baud=9600, xmit=PIN_a1,rcv=PIN_a2)

#INT_RB
void isr(void)
   {
   printf("\fThe change has been occurred");
   clear_interrupt(int_rda);  //clear interrupt flag to prevent reentrance
   }

void main(){

enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);

while (true)
   {   
   output_toggle(pin_a0);
   delay_ms(1000);
   }
}

When change is been occurred on B4-b7 program goes into a interrupt routine. The problem is that the program never goes out of this interrupt state. In other words it never goes back into a while cycle. Why this reentrance is happening?
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 5:31 am     Reply with quote

Rikoteck8,

God lord, did you even try to solve this problem yourself? As a test I did a forum search for "int_rb", and found several threads in the first page that gave the answer to your problem....

Your problem is very common, and has been asked/solved many times...

John
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 8:52 am     Reply with quote

The answer is in the CCS manual, the Microchip data sheet as well as this forum.

Mike
rikotech8



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 12:59 pm     Reply with quote

Can you point exactly where to search into the CCS Manual. I have really searched about this problem but without result.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 1:09 pm     Reply with quote

Seriously, forum search, 'INT_RB'.

I'll post one of the links from this:

<http://www.ccsinfo.com/forum/viewtopic.php?t=48907&highlight=intrb>

In the manual, Page 320 on the current manual, shows you what has to be done, but doesn't explain 'why'. You'll find it if you just search for INT_RB.

However the data sheet is the bible look for 'port B changed interrupt', and read what it says has to be done.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 2:27 pm     Reply with quote

Mike is trying to confuse there, by carefully missing the data sheet bit that matters. I'll quote from a data sheet:
"Reading or writing PORTB will end the mismatch
condition and allow flag bit RABIF to be cleared. The latch
holding the last read value is not affected by a MCLR nor
Brown-out Reset. After these Resets, the RABIF flag will
continue to be set if a mismatch is present."

The point is that you can't clear this interrupt, until you read the port.
This has been covered _hundreds_ of times here.

Best Wishes
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 2:36 pm     Reply with quote

This is the section from the CCS manual, unfortunately it's not very explicit about the problem you've got.
Code:

How can the RB interrupt be used to detect a button press?
The RB interrupt will happen when there is any change (input or output) on pins B4-B7. There is
only one interrupt and the PIC® does not tell you which pin changed. The programmer must
determine the change based on the previously known value of the port. Furthermore, a single
button press may cause several interrupts due to bounce in the switch. A debounce algorithm will
need to be used. The following is a simple example:
#int_rb
rb_isr() {
byte changes;
changes = last_b ^ port_b;
last_b = port_b;
if (bit_test(changes,4 )&& !bit_test(last_b,4)){
//b4 went low
}
if (bit_test(changes,5)&& !bit_test (last_b,5)){
//b5 went low
}
.
.
.
delay_ms (100); //debounce
}
The delay=ms (100) is a quick and dirty debounce. In general, you will not want to sit in an ISR for
100 MS to allow the switch to debounce. A more elegant solution is to set a timer on the first
interrupt and wait until the timer overflows. Do not process further changes on the pin.


The microchip manuals are much more direct!

Code:
Four of the PORTB pins (RB7:RB4) have an
interrupt-on-change feature. Only pins configured as
inputs can cause this interrupt to occur (i.e., any
RB7:RB4 pin configured as an output is excluded from
the interrupt-on-change comparison). The input pins (of
RB7:RB4) are compared with the old value latched on
the last read of PORTB. The “mismatch” outputs of
RB7:RB4 are ORed together to generate the RB Port
Change Interrupt with flag bit, RBIF (INTCON<0>).
This interrupt can wake the device from SLEEP. The
user, in the Interrupt Service Routine, can clear the
interrupt in the following manner:
a) Any read or write of PORTB (except with the
MOVFF instruction). This will end the mismatch
condition.
b) Clear flag bit RBIF.
A mismatch condition will continue to set flag bit RBIF.
Reading PORTB will end the mismatch condition and
allow flag bit RBIF to be cleared.
The interrupt-on-change feature is recommended for
wake-up on key depression operation and operations
where PORTB is only used for the interrupt-on-change
feature. Polling of PORTB is not recommended while
using the interrupt-on-change feature.

This one is lifted from the 18F1320 manual, it is representative of all the PICs.

Mike

Sorry Ttelmah, I was distracted whilst creating the reply, simply picked the wrong section of the manual. It's evening meal time here.
rikotech8



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 2:44 pm     Reply with quote

It was all about to sample port B inside the interrupt handler.
Thank you guys! I will remember that!
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sun Nov 04, 2012 3:57 pm     Reply with quote

Fair dinkum.
If you can't get the wrong manual piece, while having a meal, I don't know what the world is coming to...
It's when you type 'sausages' as a reply to "what's the best PIC to use", that we'll know this is happening. Smile

Best Wishes
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