Hello Folks,
I'm either missing something amazingly minor or something is going terribly wrong, likely the former. I'm using a PIC16F884 and attempting to use the interrupt-on-change feature. I've hooked up a momentary switch, pulled high and tied to ground when the switch is pressed and connected it to PORTB.0. I have two LEDs, one that blinks constantly and one to let me know when the interrupt routine has been activated. I've attached a simple drawing of the circuit under test. Eventually I want to use four switches on ports B0-B3.
The problem is, I can never seem to get the interrupt to work, i.e. the second LED never comes on. I've gone over the manual and the forum, tried a few things, and have come up nil. Any advice or suggestions is greatly appreciated. Code is below. Thank you in advance.
INCLUDE "modedefs.bas"
PORTA = $00 ' Set all port a pins to low
PORTB = $00 ' Set all port b pins to low
PORTC = $00 ' Set all port c pins to low
PORTD = $00 ' Set all port d pins to low
PORTE = $00 ' Set all port e pins to low
asm ; The following code is assembly, not Basic
__CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
; Use internal oscillator & make both, OSC pins I/Os, turn off watchdog timer, enable Power-up timer,
; code protection off, brown-out off, disable switch over mode, turn off failsafe monitor,
; low voltage programming off
bcf WDTCON, SWDTEN ; Disable the watchdog timer
bsf OSCCON, IRCF2 ; Set the internal oscillator to 8MHz
bsf OSCCON, IRCF1 ; Set the internal oscillator to 8MHz
bsf OSCCON, IRCF0 ; Set the internal oscillator to 8MHz
bcf ADCON0, ADON ; Make all analog pins digital I/Os
bcf CM1CON0, C1ON ; Disable comparator C1
bcf CM2CON0, C2ON ; Disable comparator C1
MOVLW 0x00 ; Set w = 00000000
MOVWF ANSEL ; Set all analog pins on port a to digital I/O
MOVLW 0x00 ; Set w = 00000000
MOVWF ANSELH ; Set all analog pins on port b to digital I/O
endasm ' End assembly code
define OSC 8 ' Tell the program the oscillator is running at 8 MHz
TRISA = %00000000 ' Make all port a pins outputs
TRISB = %00001111 ' Make port b pins 0-3 inputs and the rest as outputs
TRISC = %00000000 ' Make all port c pins outputs
TRISD = %00000000 ' Make all port d pins outputs
TRISE = %00000000 ' Make all port e pins outputs
PORTA = $00 ' Set all port a pins to low
PORTB = $00 ' Set all port b pins to low
PORTC = $00 ' Set all port c pins to low
PORTD = $00 ' Set all port d pins to low
PORTE = $00 ' Set all port e pins to low
'Variables**************************************** ************************************************** *
b0 VAR byte ' Required byte variable for toggle button
'************************************************* ************************************************** *
INITIALIZE: ' Initialize Routine
INTCON.0 = 0 ' Clear the interrupt-on-change flag
On Interrupt goto Halt ' Once an active interrupt port is enabled, go to the Halt routine
INTCON.7 = 1 ' Enable global interrupts
IOCB = %00000001 ' Enable interrupt-on-change on RB0-RB3
INTCON.3 = 1 ' Enable interrupt-on-change on Port b
GOTO MAIN ' Go to Main routine
'************************************************* ************************************************** *
MAIN:
' PORTB = $00 ' Set all port b pins to low
b0 = PORTB ' temp is some variable
HIGH PORTE.0
PAUSE 500
LOW PORTE.0
PAUSE 500
GOTO MAIN
'************************************************* ************************************************** ***
DISABLE ' Disable all interrupts
Halt: ' Halt Routine
HIGH PORTE.1
b0 = PORTB ' temp is some variable
INTCON.0 = 0 ' Clear the interrupt-on-change flag
RESUME Main ' Go to Main routine
ENABLE ' Enable all active interrupts
'************************************************* ************************************************** ***
END
Bookmarks