Thanks a million Bruce, I will try that now.
P.S. I about fell on the floor laughing when I refreshed the page and say the crayon![]()
Thanks a million Bruce, I will try that now.
P.S. I about fell on the floor laughing when I refreshed the page and say the crayon![]()
It took me a while to find one the color of my truck..;o)
Experiment with this one too. You can have it wake from sleep without an interrupt handler.
Global interrupts are disabled. Just enabled the int-on-change by setting RBIE, clearing RBIF, and it sleeps until a button is pressed.Code:DEFINE OSC 4 CMCON=%00000111 VRCON = 0 PAUSEus 10 TRISA = %00000110 TRISB = %11110000 ' using upper 4-bits for interrupt PORTA = %00000000 PORTB = %00000001 OPTION_REG.7 = 0 OPTION_REG.6 = 0 led var portA.3 INTCON = %00001000 ' int-on-change enabled. RBIE=1, RBIF=0 cycle: HIGH led pause 100 LOW led pause 100 @ Sleep ' sleep until button press WHILE (portB >> 4) !=15 ' wait for button release PAUSE 10 ' and read port so RBIF can WEND ' be cleared below. INTCON.0=0 ' now clear RBIF int flag goto cycle END
DT_INTs is more fun, but you can wake one up without an interrupt handler.
I compiled the code as shown, when powered up the led continues to blink but when I press a button on the keypad which would cause (PORTB >> 4) != 15 it still blinks.....
I have even tried it with the following changes with same response:
cycle:
gosub checkstate
HIGH led
pause 100
LOW led
pause 100
@ Sleep
goto cycle
checkstate:
while (PORTB >> 4) != 15
pause 20
wend
return
its almost like it never see an interrupt to get out of cycle. I also confirmed on PortB by checking with my meter on switch closure. With a switch closed and the bit I checked was PortB.4 I measured it at 2.192Vrms, switch open 4.99Vrms.
Thanks for hanging around
Bruce, just wanted to mention we must have posted about the same time the code that I just tried was the crayon version, I am about to try your latest.
Again, Thank you.
Make sure you have the watchdog timer disabled when using the assembler @ SLEEP command.
Sorry. My fault for not mentioning this. The @ SLEEP instruction puts it to sleep forever until a watchdog timeout, or an interrupt wakes it up.
When it wakes up due to watchdog timer timeout, it executes the instruction immediately after the @ SLEEP, and lands on your goto cycle.
Any time you use the assembler version @ SLEEP you'll need to make sure you have WDT disabled unless you want it to wake up with the watchdog timer timeout.
Taz,
Try this version with the nop just after @ SLEEP and see if this helps.
Code:DEFINE OSC 4 CMCON=%00000111 VRCON = 0 PAUSEus 10 TRISA = %00000110 TRISB = %11110000 ' using upper 4-bits for interrupt PORTA = %00000000 PORTB = %00000001 OPTION_REG.7 = 0 OPTION_REG.6 = 0 led var portA.3 INCLUDE "DT_INTS-14.bas" ; Base Interrupt System INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _check, PBP, yes endm INT_CREATE ENDASM @ INT_ENABLE RBC_INT cycle: HIGH led pause 100 LOW led pause 100 @ Sleep @ NOP goto cycle check: WHILE (portb >> 4) != 15 PAUSE 10 WEND @ INT_RETURN
Bookmarks