Interrupt usage


Closed Thread
Results 1 to 10 of 10

Thread: Interrupt usage

Hybrid View

  1. #1
    Join Date
    Jan 2006
    Location
    New Hampshire, USA
    Posts
    107

    Default Interrupt usage

    I am a neophyte and don't understand why my code is not working. The statement: on interrupt goto wait is said to be bad syntax but I don't believe it, something else is wrong. My program:
    REM device = 12F675
    CMCON = 7 ' SETS DIGITAL MODE
    ANSEL = 0 ' GPIO.0 TO GPIO.3 SET AS DIGITAL
    OPTION_REG = 0 ' WEAK PULLUPS ENABLED
    TRISIO = %00000100 ' GPIO.2 SET AS INPUT
    IOC = %00000100 ' INTERRUPT ENABLED ON GPIO.2
    INTCON = %10010000 ' INTERRUPT ENABLED
    N VAR BYTE ' VARIABLE N DEFINED
    ' ************************************************** ***********
    START:
    ON INTERRUPT GOTO WAIT
    HIGH GPIO.0
    FOR N=1 TO 13
    NAP 6
    NEXT N
    LOW GPIO.0

    WAIT:
    DISABLE INTERRUPT
    SLEEP
    ON INTERRUPT GOTO START
    ENABLE INTERRUPT 'do i need to clear the interrupt bit first?
    END

  2. #2
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    i see quite a few mistake here
    1. there's no Goto Start after your LED blink
    2. Disable INTERRUPT is not placed at the right place
    3. you can't have more than 1 ON INTERRUPT GOTO
    4. the first ON INTERRUPT is not a the right place
    5. not sure about the NAP loop... to me PAUSEUS would be a better option
    6. not sure about SLEEP in the ISR
    7. yes you MUST clear INT flag
    8. There's no RESUME at the end of your ISR
    9. WAIT is a reserved word and can't be used for labels

    but the rest is OK

    Something like bellow should work
    Code:
        @ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BODEN_ON
    
        CMCON = 7               ' SETS DIGITAL MODE
        ANSEL = 0               ' GPIO.0 TO GPIO.3 SET AS DIGITAL
    
        OPTION_REG = 0          ' WEAK PULLUPS ENABLED
                                ' GP2/INT on falling edge
                                
        TRISIO = %00000100      ' GPIO.2 SET AS INPUT
    
        GPIO = 0
    
        N VAR BYTE              ' VARIABLE N DEFINED
        
        ON INTERRUPT GOTO WAIT_int    
        INTCON = %10010000      ' INTERRUPT ENABLED
    
      '  *************************************************************
    START:
                TOGGLE GPIO.0
                FOR N=0 TO 250
                    pauseus 1000
                    NEXT
                GOTO START
                         
    DISABLE        
    WAIT_INT:
                TOGGLE GPIO.1
                INTCON.1=0      ' Clear GP2/INT flag
                RESUME
                ENABLE
                
                END
    Last edited by mister_e; - 9th April 2008 at 04:10.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  3. #3
    Join Date
    Jan 2006
    Location
    New Hampshire, USA
    Posts
    107


    Did you find this post helpful? Yes | No

    Default

    Thanks for the info. Since I can't have more than one interrupt goto, I will have to re-think my program. I would like to have the program wake from sleep on interrupt. Could I use "on interruupt goto start"? I want it to end up in sleep mode, do I need a resume statement?
    My program is:
    Turn LED on
    Wait 15 minutes
    Turn LED off
    Go to sleep
    Optionally, I would like to turn the LED off in less than 15 minutes, using the interrupt; but that does not seem possible. I guess I will have to have two buttons: a start (interrupt) button and stop (goto sleep) button.
    This program compiles OK, what do you think?


    REM device = 12F675
    CMCON = 7 ' SETS DIGITAL MODE
    ANSEL = 0 ' GPIO.0 TO GPIO.3 SET AS DIGITAL
    OPTION_REG = 0 ' WEAK PULLUPS ENABLED
    TRISIO = %00001100 ' GPIO.2 AND GPIO.3 SET AS INPUT
    IOC = %00000100 ' INTERRUPT ENABLED ON GPIO.2
    N VAR WORD ' VARIABLE N DEFINED
    ON INTERRUPT GOTO START
    INTCON = %10010000 ' INTERRUPT ENABLED
    ' ************************************************** ***********
    START:

    HIGH GPIO.0
    FOR N=1 TO 900
    IF GPIO.3=0 THEN SLEEPNOW
    PAUSE 1000
    NEXT N
    SLEEPNOW:
    LOW GPIO.0
    SLEEP 65535 ' DOES IT EVENTUALLY WAKE UP? (I DON'T WANT IT TO)

    END

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    What else the pic will need to do? There's some case you don't even need any ON INTERRUPT.

    @ SLEEP will send the PIC in sleep mode untill there's a interrupt type who can wake up the PIC. It should be listed in your datasheet, somewhere at the end.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5


    Did you find this post helpful? Yes | No

    Default I'm an 'On Interrupt Goto' newbee too

    My understanding is, that although there are many sources of interrupts possible within the PIC's hardware, there is only one resulting interrupt condition. Either the processor has been interrupted or it has not. This leads me to believe that this interrupt condition has to be dealt with by a single interrupt handling routine which tells the interrupted processor what to do.

    The interrupt routine, or interrupt handler, in its execution could, of course, determine the source of the interrupt by investigating the various interrupt flags and take specific action appropriate to the source, but there is only one routine and the point in the program (the label) where it is located is stated in the 'ON INTERRUPT GOTO' statement. Having more than one 'ON INTERRUPT GOTO', each with a different label, doesn't make sense to me, as that would mean that the interrupted processor could go to more than one routine to resolve the interrupt. How would it know which to go to ?

    The flexibility allowed by MELabs by not predetermining the label in the command just means that you can call your interrupt handler what you like. It doesn't mean that there can be more than one and that they are differentiated by having different labels.

    OK.. now to the question! The 'ON INTERRUPT' statement reference on MELabs PIC BASIC Pro support website, clearly states before giving the syntax example, that "More than one ON INTERRUPT may be used in a program"... Is this a typo or have I got it completely wrong?

    Brian Walsh

  6. #6
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Hi Brian,

    It's NOT a typo. You can use all available interrupts simultaneously.

    On any interrupt, the program flow will be directed to the single interrupt handler. Then it's up to you to determine which one fired.

    Each interrupt source has 2 bit's associated with it. An Enable bit (*IE), and an Interrupt Flag (*IF). You need to look in the datasheet to find where those bit's are.

    Then in the interrupt handler, check BOTH the enable bit and the interrupt flag to determine if a particular interrupt has triggered.

    For example, to have the RB Port change and Timer1 interrupts, it might look something like this...
    Code:
    RBIE    VAR INTCON.3
    RBIF    VAR INTCON.0
    TMR1IE  VAR PIE1.0
    TMR1IF  VAR PIR1.0
    TMR1ON  VAR T1CON.0
    
    OldBits VAR BYTE
    NewBits VAR BYTE
    
    
    OldBits = PORTB   ; End the mismatch
    RBIF = 0          ; clear the flag
    RBIE = 1          ; enable PORTB change interrupts
    
    TMR1IF = 0        ; clear TMR1 interrupt flag
    TMR1IE = 1        ; enable Timer1 interrupts
    TMR1ON = 1        ; Start the Timer
    
    ON INTERRUPT GOTO INTHandler
    
    Main:
        PAUSEUS 20
    GOTO Main
    
    DISABLE
    INTHandler:
        IF RBIE and RBIF THEN
            NewBits = PORTB  ; end the mismatch
            RBIF = 0         ; clear the flag
            ; handle RB port change interrupt here
            OldBits = NewBits
        ENDIF
    
        IF TMR1IE and TMR1IF THEN
            TMR1IF = 0       ; clear the flag
            ; handle Timer1 interrupt here
        ENDIF
    RESUME
    ENABLE
    hth,
    DT

Similar Threads

  1. 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
  2. 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
  3. Help with Analog Interrupt
    By brid0030 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 13th February 2008, 18:14
  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