Interrupt 101


Closed Thread
Results 1 to 17 of 17

Thread: Interrupt 101

Hybrid View

  1. #1
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    Hi,
    External interrupts are available on one or more pins. The 18F6520 seems to have four located on RB0-RB3. Smaller chips may only have one which is "always" on RB0. (Then you have the interrupt on change but lets leave that for now).

    INTCON is the interrupt control register (one of them in the 18F6520). Look at the INTCON register in the datasheet, it'll show you what each bit does. In this case the MSB enables all unmasked interrupts and bit 4 enables the INT0 interrupt.

    INTCON2.7=0 disables the internal pullup resistors for PortB.

    The PBP is only part of the documentation, you must use the datasheet for your particular PIC as well.

    Good luck!
    /Henrik.

  2. #2
    Join Date
    Sep 2007
    Posts
    59


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    Henrik,

    I appreciate it. I've been looking at the datasheet and it's starting to make more sense. I'm not a programmer or circuit designer but am having to learn as this falls under the "other duties as deemed necessary" in the job description and the original guy who did it is no longer available.

    So I think I now understand the physical input. Let's say I want to see an incoming serial message on pin RC7 (RX1 pin) and interrupt the home routine. I would need to first trigger RB0 to interrupt and goto the interrupt routine to read the serial data? Am I thinking correctly?

    Second question. How do I set up software interrupts? Like if a certain value occurs like 3 I/O's are turned on then I want a variable like "AllON = 1" to interrupt the routine and do something.
    Thank you,
    Hylan

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


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    There's USART interrupt as well. Check out the USART/EUSART section of the datasheet.

    A really easy and efficient way to start right now with interrupts is to use Darrel Taylor Instant Interrupts. Check out this link.
    http://www.pbpgroup.com/modules/wfse...p?articleid=19

    For your, and any, specific requirement, there's a load of different approach.. say one different per programmer

    The basic skelleton:
    Main program (Loop)
    Interrupts.

    Whatever happen in your Interrupts, you may set flags there and process them in your main loop.

    OR you may process some dull duties in your main loop and force interrupts to happen in your main loop too.

    To read I/Os and evaluate them, you may use something like that (Which assume some push button connected to gnd on PORTB<3:0> (b3, b2, b1, b0)
    Code:
    SomePushButton VAR BYTE
    '
    '
    '
    '
    SomePushButton = PORTB & $0F ' read PORTB and keep only <3:0> bits (Bitwise AND)
    SELECT CASE SomePushButton
         CASE %1110 ' PORTB.0
              ' code for PORTB.0 here
         CASE %1101 ' PORTB.1
              ' code for PORTB.1 here
         CASE %1011 ' PORTB.2
              ' code for PORTB.2 here
         CASE %0111 ' PORTB.3
              ' code for PORTB.3 here
         END SELECT
    Steve

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

  4. #4
    Join Date
    Sep 2007
    Posts
    59


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    Beautifull! I feel like I now have enough to be dangerous or at least dangerous in a productive, 'hmmm that didn't work but I learned something' sort of way.

    Thank goodness for reprogrammable pics!

    Thank you,
    Hylan

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


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    Quote Originally Posted by Hylan View Post
    Thank goodness for reprogrammable pics!
    Amen! Couldn't even think to re-use my UV Eraser anyway

    I still have some UV one though... good on a pinboard or as staple... (again)

    if someone talk about software simulator I'll kick his butt
    Steve

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

  6. #6
    Join Date
    Sep 2005
    Location
    Campbell, CA
    Posts
    1,107


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    And most people don't realize it, but you can have an interrupt on *ANY* pin - sort of. This is handy when you have a switch that simply must be read and it is on port C, for example.
    Just run a high-speed interrupt on TMR0 and read whatever pins you want inside the ISR. I typically run a 1mSec interrupt.

    A small example of an "interrupt header"


    Code:
     
      PreloadH      VAR BYTE BANKA SYSTEM
      PreloadL       VAR BYTE BANKA SYSTEM
      MasterClock   VAR WORD BANKA SYSTEM
      ButtonFlag    var BYTE BANKA SYSTEM
     
     
      PreloadH= $D8
      PreloadL = $F7    ; 1 mSec@40Mhz
     
      T0CON = %10001000  ; Timer ON, no prescaler
     
     
    '---------------------------------- --------------------------------  
     
            INCLUDE "DT_INTS-18.bas"         
     
    '        INCLUDE "ReEnterPBP-18.bas"     ; Include if using PBP interrupts
     
    ASM
    INT_LIST  macro    ;IntSource,        Label,  Type, ResetFlag?
     
         INT_Handler    TMR0_INT,   MainTimer, ASM,  yes 
    ; INT_Handler    RX1_INT, GetChar,    PBP,  yes
     
    endm
     
    INT_CREATE               
     
    ENDASM
     
    Goto OverInt
     
     
    '---[INT - interrupt handler]---------------------------------------------------
     
    Asm                            
     
    MainTimer
     
        movff    PreloadH,TMR0H  ; Preload depends on clk speed
        movff    PreloadL,TMR0L
         clrf     INTCON,2
     
         infsnz  MasterClock
         incf    MasterClock + 1
     
         btfss  PORTC,4
         bsf  ButtonFlag,0
     
    @ INT_RETURN
     
    ENDASM      
     
    OverInt:
     
       ButtonFlag = 0
       MasterClock = 0
       INTCON =%11100000  ; just to be certain!
     
    @ INT_ENABLE TMR0_INT  
     
     
    Your program here
    This particular code will increment MasterClock at a 1000Hz rate (1 ms / count). You can read it at any time, although you should either disable INTs when you test it, or only test that it is ABOVE (not equal to) a value, since it is a 16 bit var and can increment in the middle of a PBP read.

    ButtonFlag.0 will be set any time after someone has pressed a button bringing PORTC.4 to GND. You can read it anytime, then clear it in your main code.

    If you have more complicated things to do on an interrupt, you can write it in PBP.


    So THERE! mister_e and pxidr84!
    Charles Linquist

  7. #7


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    That's a good setup !
    How about switch de-bounce (make sure its a good press)

    I use;

    if sw not_pressed then out
    pause 10 ' or 20 or 50 ms
    if sw not_pressed then out
    good sw pressed stuff here

    don

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


    Did you find this post helpful? Yes | No

    Default Re: Interrupt 101

    Quote Originally Posted by Charles Linquis View Post
    And most people don't realize it, but you can have an interrupt on *ANY* pin - sort of. ........
    So THERE! mister_e and pxidr84!
    Sure, I classify that as slow background process

    amgen, you just need to read the switch all the time, keep a reading of the previous(s) and compare them. Depending of your timer rate, you may want to make sure it is hold down for X interrupt. set a flag to say a switch is ready, Once done, and the button being read, you wait Y interrupt before reading another and "publish" it.

    Tons of way to do so. But for sure, you don't want any PAUSE in an ISR.
    Steve

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

Members who have read this thread : 0

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

Tags for this Thread

Posting Permissions

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