Change On Interrupt, PIC16F884


Results 1 to 18 of 18

Threaded View

  1. #1
    Join Date
    Apr 2005
    Location
    Virginia
    Posts
    65

    Red face Change On Interrupt, PIC16F884

    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
    Attached Images Attached Images

Similar Threads

  1. A Simple IOC Routine (Interrupt On Change)
    By lugo.p in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th March 2010, 19:53
  2. Won't go back to SLEEP after 1st Interrupt
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 32
    Last Post: - 29th June 2009, 09:00
  3. Can't ID interrupt source with this IntHandler??
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 3rd June 2009, 02:35
  4. NEWBIE: Some basic questions using interrupts
    By JackPollack in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 8th March 2006, 02:59
  5. USART interrupt not interrupting right
    By Morpheus in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 6th March 2005, 01:07

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts