pic16f84 interrupt problem

A

Ankur

Guest
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<7:4> pin state change. So, whenever i change the
state of any of RB<7:4>, i should see a count UP on the leds(say it
was 00001 earlier, i should see 00010 on changing the state of
RB<7:4>pins)

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
 
Ankur wrote:
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<7:4> pin state change. So, whenever i change the
state of any of RB<7:4>, i should see a count UP on the leds(say it
was 00001 earlier, i should see 00010 on changing the state of
RB<7:4>pins)

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
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.

bcf INTCON,RBIF ; IMPORTANT - clear back the interrupt flag
BSF INTCON,GIE ; IMPORTANT! - re-enable the interrupts
return
will become:
movf PORTB, W (or some other sort of read on PORTB)
bcf INTCON, RBIF
retfie (clear GIE & return)


HTH,
Mark Van Borm
 
Let's see...

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
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.

goto loop
end
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.
 
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:
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<7:4> pin state change. So, whenever i change the
state of any of RB<7:4>, i should see a count UP on the leds(say it
was 00001 earlier, i should see 00010 on changing the state of
RB<7:4>pins)

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

--
---
NOTE: My addy is munged to foil SPAM.
Please reply via this NewsGroup.
 

Welcome to EDABoard.com

Sponsor

Back
Top