keypad ohms out good, brand new actually, but as I mentioned before PortB.1-3 are my rows and 4-7 are my columns with the above code, pressing a button on the keypad does not pull any pin low.
keypad ohms out good, brand new actually, but as I mentioned before PortB.1-3 are my rows and 4-7 are my columns with the above code, pressing a button on the keypad does not pull any pin low.
I changed TRISB = %11111110 to TRISB = %11110000 now pressing keypad the selected PORTB 4-7 pulls low to 2.2VDC, by the way PORTB.0 is connect first in series with a 330 ohm resistor, then to the four 1N4148's. I thought limiting the current to 15mA would be easier on the internal pull-ups.
Thanks for the drawing, that is how this is connected, yes I am aware of "scanning the keypads" Bruce has been a great help, but I am just narrowing it down to pressing on button, pins 1-3 low, and pin 0 high just to see how interrupt's work. I am looking to use the interrupt to sleep all the time, detect when key is pressed, wake up, set PORTB.0, and 4-7 as inputs, bits 1-3 as out, pause about 50, then began scanning keypad something like this:
recycle:
@ Sleep
@ NOP
@ NOP
goto recycle
' my Interrupt handler
search:
PORTB = 0
TRISB = $f1
PAUSEUS 10
keypadscan:
FOR row = 1 TO 3
PORTB = 0
TRISB = (DCD row) ^ $fe
col = PORTB >> 4
IF col != $f THEN keypressed
NEXT row
GOTO recycle
Haven't got all this worked out yet, but thats another day
I'm just stumped with the original code above why am I already in the interrupt when I power up, just to confirm that I changed the INT handler to:
'---[INT - interrupt handler]---------------------------------------------------
ToggleLED1:
TOGGLE LED
pause 50
@ INT_RETURN
and sure enough the led is flashing...
By the way, what program are you using to upload your schematic?
Hmmm, came back here today to focus on the post here from Bruce but it seems to have vanished, or am I losing my mind? Maybe its both
Anyhow, it was mentioned that so to speak that I should take a snapshot of PortB, I am so lost. If on power up PortB.0 is high and pullups are enabled, on the rest of the pins: TRISB = %11111110 PortB = %00000001 then with my meter focusing on pins 4-7 shows 5VDC or logic HIGH, should I do this:
WHILE (portb >> 4) != 15
pause 20
wend
INTCON.0 = 0
return
or substitute 15 for a 0?
Seems it would be 15 but with that I apparently staying in my interrupt routine.
I've been experimenting with ON INTERRUPT and Darryl Taylor's Instant Interrupts:
DEFINE OSC 4
CMCON=%00000111
VRCON = 0
PAUSEus 10
TRISA = %00000110
TRISB = %11111110
PORTA = %00000000
PORTB = %00000001
OPTION_REG.7 = 0
OPTION_REG.6 = 0
INTCON = %00001000
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
PAUSE 50
cycle:
gosub readportb
HIGH led
pause 100
LOW led
pause 100
@ Sleep
@ Nop
@ Nop
goto cycle
readportb:
WHILE (portb >> 4) != 15
PAUSE 20
WEND
INTCON.0 = 0
return
check:
PAUSE 250
WHILE (portb >> 4) != 15
PAUSE 20
WEND
@ INT_RETURN
Any Suggestion, preferably in Crayola so its clear?
Thanks
Try this;
The purpose of WHILE (portb >> 4) != 15 is to wait until a button that generated the interrupt is released. It also reads the port, which is required before DT_INTs can clear the interrupt flag.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 goto cycle check: WHILE (portb >> 4) != 15 PAUSE 10 WEND @ INT_RETURN
To clear the interrupt-on-change flag bit you first have to read the port, then clear the flag. If you read the port while a button is still pressed, then clear the flag, another interrupt will be generated once the button is released.
Last edited by Bruce; - 28th July 2010 at 20:58. Reason: Forgot Crayola...;o)
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![]()
Bookmarks