I'm using a 16F628 and RB0
here's something to play with.
Code:' RB0 interrupt ' ============= ' ' File name : RB0.bas ' Company : Mister E ' Programmer : Steve Monfette ' Date : 03/05/2005 ' Device : PIC16F628 ' ' PIC setting ' =========== ' ' Using MPASM to compile the code to target device ' ' @ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _BODEN_ON ' Internal Oscillator ' Enable watch dog timer ' Enable power up timer ' Disable MCLR pin ' Disable low voltage programming ' Enable brown out detect ' ' Hardware definition ' =================== ' ' TRISB = %00000001 ' RB0 as input, other as output ' Push button between RB0 & ground ' ' I/O Alias definition ' ==================== ' ' RB0LED var PORTB.6 MainLoopLED var PORTB.7 ' ' Interrupt Definition ' ==================== ' ' OPTION_REG = 0 ' Enable pull-up on PORTB ' RB0 interrupt on falling edge INTCON = %10010000 ' Enable Global interrupt ' Enable RB0 interrupt on interrupt goto RB0Interrupt ' ' Variable definition ' =================== ' ' Delay var word ' ' MainLoop ' ======== ' ' Start: ' Let's do some led blink on RB.7 ' ' Toggle mainloopled for Delay = 1 to 500 ' delay loop 500ms pause 1 ' using 1 ms delay to avoid latency next ' goto start ' do it forever Disable Interrupt RB0Interrupt: ' RB0 interrupt subroutine ' ' will toggle RB6 state everytime we get an interrupt ' ' Toggle rb0led while PORTB.0 = 0 ' wait untill RB0 go high wend pause 50 ' debounce delay INTCON.1 = 0 ' Reset RB0 int flag resume ' return to main loop Enable interrupt
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
and another way by polling interrupt flag.
Code:' RB0 interrupt ' ============= ' ' File name : RB0.bas ' Company : Mister E ' Programmer : Steve Monfette ' Date : 03/05/2005 ' Device : PIC16F628 ' ' PIC setting ' =========== ' ' Using MPASM to compile the code to target device ' ' @ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _BODEN_ON ' Internal Oscillator ' Enable watch dog timer ' Enable power up timer ' Disable MCLR pin ' Disable low voltage programming ' Enable brown out detect ' ' Hardware definition ' =================== ' ' TRISB = %00000001 ' RB0 as input, other as output ' Push button between RB0 & ground ' ' I/O Alias definition ' ==================== ' ' RB0LED var PORTB.6 MainLoopLED var PORTB.7 ' ' Interrupt Definition ' ==================== ' ' OPTION_REG = 0 ' Enable pull-up on PORTB ' RB0 interrupt on falling edge ' ' Variable definition ' =================== ' ' Delay var word ' ' MainLoop ' ======== ' ' Start: ' ' Toggle mainloopled for Delay = 1 to 500 ' delay loop 500ms pause 1 ' using 1 ms delay to avoid latency if INTCON.1 then ' test RB0 interrupt flag rb0led=RB0LED ^1 ' toggle RB0LED status INTCON.1=0 ' reset interrupt flag endif next goto start ' do it forever
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Thanks Steve
This is great - these examples give me 2 ways to use the interrupt.
I will try these out - but before I do I have a question about the first example using the On Interrupt.
I assume we need to disable the interrupt in the handler so we don't get caught in a endless loop - is that correct ?
Should we have the "disable interrupt" inside the RBOinterrupt routine at the start ?
I have tested both examples and they both produce the same function.
They compile into 108 vs. 103 words.
I modified the code and found the answers to my questions - There is no substitue for testing.
I don't have an exact application in mind yet so it is good to know both.
Do you have a preference for one technique or a simple way to describe the trade offs between the two?
Thanks for your help.
Since every project are different, need are also different. I don't prefer one to another, just need to know what i need and how much time i want to spend on. But more than often i'll use ON INTERUPT.Originally Posted by Mark
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
Bookmarks