PDA

View Full Version : INTERRUPT on RB5



fabritio
- 23rd March 2005, 18:22
Hi everyone,
it's just a simple question....
Is it right the program that I've written to handle an interrupt on RB5?
The output on PORTC must be always 255 except when it receive a high signal on RB5, when it has to do the procedure written in "loop".
I've not written here the loop cause it's not useful.
At the end of the loop it must return to 255 and wait at this value for the next high value on RB5.
The program is this:



TRISB.5 = 1
TRISC = 0
TRISA = 0
PORTC = 0
PORTA = 0

on interrupt goto loop
INTCON = %00001000

main:

PORTC = 255
goto main

disable

loop:
..........
............

INTCON.0 = 0
resume
enable


Thank you very much!!!!

fabritio
- 24th March 2005, 13:09
no one knows....

:)

NavMicroSystems
- 24th March 2005, 13:54
fabritio, be patient . . .

What type of PIC are you using?

what do you mean by saying:

... except when it receive a high signal on RB5 ...

Is this "high signal" a HIGH level for a certain period of time, or is it a short pulse?
Do you want to trigger on the rising or falling edge?

If the program has nothing else to do than sit and wait for HIGH on RB5 you wouldn't even need an interrupt.

fabritio
- 24th March 2005, 16:16
fabritio, be patient . . .

What type of PIC are you using?

what do you mean by saying:


Is this "high signal" a HIGH level for a certain period of time, or is it a short pulse?
Do you want to trigger on the rising or falling edge?

If the program has nothing else to do than sit and wait for HIGH on RB5 you wouldn't even need an interrupt.

It's a 16f876.
this "high signal" is a short pulse, (in particular there are 4 bursts, but i need to wait for the first), and has a repetion every 164 microseconds. So i can be able to trigger it on the change of status (every transition).
I know, I've already written a program that works without interrupts, but the speed of the pulse doesn't let the loop start every time, it's randomic, so I am thinking about doing with the interrupts...
Thank you!

NavMicroSystems
- 24th March 2005, 19:05
fabritio,

your program should work.

There are a couple of things I would like to mention:

you should move the "PORTC=255"
to the end of your Interrupt Routine,
there is no need to write to PORTC every single time the mainloop is executed.

Due to the fact it this is "INTERRUPT ON CHANGE"you will see an interrupt on EVERY rising AND falling edge.
So if the execution time of the Interrupt routine is shorter than the incomming "burst" the routine will be executed more than once on a single burst.

Samuel
- 28th March 2005, 22:12
I want an interrupt to trigger everytime i change the switch on portb.5 (using a simple on/off switch connected to ground). My led is on porte.1

this is what happens: no matter what the initial condition of the switch is, the interrupt triggers only one way. i.e once i change the switch it sits in the interrupt handler and DOES NOT go back to the main loop untill i take it back to the original position. So if the switch is ON at power up, the interrupt triggers every time i go from ON to OFF. But if the switch is OFF at power up, the interrupt triggers when i go from OFF to ON. I want the interrupt to trigger BOTH ways. (i.e everytime the state of the switch changes.)

Isnt this what is "supposed" to happen according to the "Input change interrupt protocol" on PORTB<4:7> as per the data sheet?!?

The funny part is i have a second test circuit with the LED connected to portb.1 and this setup works perfectly (i.e interrupt both @ ON and OFF) with the exact same code (ofcourse i just change my led var to portb.1) PLS HELP! This is driving my insane. My complete code is below.

>>>>>>>>>>>>>>>>>>>>>>
DEFINE OSC 20


led var PORTe.1


OPTION_REG = $7f ' Enable PORTB pullup
On Interrupt Goto myint ' Define interrupt handler
INTCON = %10001000 ' Enable interrupt portb 4:7 change

loop: High led ' Turn LED on
Goto loop ' Do it forever


' Interrupt handler
Disable ' No interrupts past this point
myint: Low led ' If we get here, turn LED off
Pause 1000 ' Wait .5 seconds
INTCON.0 = 0 ' Clear interrupt flag
Resume ' Return to main program
Enable
>>>>>>>>>>>>>>>>>>>>>>>>>>>

Bruce
- 29th March 2005, 05:18
RBIF: RB Port Change Interrupt Flag bit
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.

With your LED on PORTB.1, that's exactly what you're doing with LOW LED. With your LED on PORTE, you're not performing a read-modify-write on RB, and the missmatch condition still exists.

Just read PORTB in your interrupt routine, then clear RBIF, then return. Assuming you have your PORTE A/D turned off, it should work fine.

The value read from PORTB in the interrupt handler will now be the new value that causes the interrupt once changed.

Samuel
- 29th March 2005, 06:03
What would ppl like me do without ppl like you!

Samuel
- 30th March 2005, 04:44
Assuming you have your PORTE A/D turned off, it should work fine.

How do i do that and how does it make a difference? Is it the ADCON register you are talking about?

mister_e
- 30th March 2005, 05:14
depending the PIC you're using it can be ADCON, ADCON0, ADCON1 refer to the datasheet.

How can it make difference... roughly, you're checking a digital signal, if your analog converter are not turned off, you can have some odd/erratic results. a close to be low level signal can be considered as a high level and so on for the close to be high or high level. digital is digital, analog is analog. It's a common problem like some others, let's say RA4 to drive a source on many PIC :)