pic16f84 interrupt problem

Hi all, Someone please help me out.. Please see the program below which is working the way i don't want it to. I've interfaced 5leds to PORTA( i'v used a pull-up in PA4 pin) and am trying to work out a binary counting on the 5leds.The trigger to count is being given by RB pin state change. So, whenever i change the state of any of RB, i should see a count UP on the leds(say it was 00001 earlier, i should see 00010 on changing the state of RBpins) But the problem i am facing is that the program comes back into the Main Loop inspite of a "Wait Loop" provided. I don't know but after the first interrupt, the program runs back into Main. b'bye and thnx

******************************************PROGRAM*******************************

#include "p16f84a.inc"

count equ 0Ch ;First counter for our delay loops bank0 macro bcf STATUS,RP0 endm bank1 macro bsf STATUS,RP0 endm

org 0x00 goto Main org 0x04 goto ISR org 0x10 Main bank1 clrf TRISA ; portA configured as OUTPUT movwf 0xff movwf TRISB; portB configured as INPUT bank0 movlw 0xff movwf PORTA movlw 0x04 movwf count ; count=4

bank1 movlw b'00000111' movwf OPTION_REG ; for timer prescalar 1:256 ; ; ;configure INTCON ; bsf INTCON,RBIE ;RB port change Interrupt Enable bit bsf INTCON,GIE ; Enable interrupts!!

loop nop goto loop ; wait state

ISR bank0

;we inc. 'count' every time ISR is executed & send it on PORTA to verify. incf count,f ;when i used "incf PORTA"

******************************************** movf count,w ;instead of these 3 commands***************************************** movwf PORTA ;it did not work.**************************************************** ; bcf INTCON,RBIF ; IMPORTANT - clear back the interrupt flag BSF INTCON,GIE ; IMPORTANT! - re-enable the interrupts return

goto loop end

Reply to
Ankur
Loading thread data ...

******************************************PROGRAM*******************************

For RB7:4, the pins value in input mode is XOR'ed with the old value latched on the last read of PORTB. The result of these are OR'ed together to generate the RBIF interrupt. This means you can't clear the RBIF without reading PORTB first.

will become: movf PORTB, W (or some other sort of read on PORTB) bcf INTCON, RBIF retfie (clear GIE & return)

HTH, Mark Van Borm

Reply to
Mark VB

Let's see...

This is not the correct way of returning from an ISR on the PIC. Don't use 'return'! Use 'retfie' instead. 'retfie' re-enables the interrupts, so you don't need to do this explicitly. So:

Instead of:

BSF INTCON,GIE ; IMPORTANT! - re-enable the interrupts return

You just put:

retfie

You'd think it does the same thing (only saving an instruction)? Well, it doesn't! By re-enabling the interrupts before calling 'return', you shoot yourself in the foot because your ISR might get called again before it gets a chance to return. There you go, a bad interrupt-reentrancy problem. Basically, your PIC has every chance to get stuck after that.

That's what 'retfie' is for. It ensure no such thing can happen.

This last goto is totally useless. Your code won't ever reach that part.

I suggest you read up a little more on using interrupts on PICs.

Reply to
Guillaume

Two lines after Main ... I think you want the instr. to be MOVLW 0xFF not movwf 0xff

I looked no further than that.

Ankur wrote:

******************************************PROGRAM*******************************
--
---
NOTE:  My addy is munged to foil SPAM.
 Click to see the full signature
Reply to
Michael

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.