Dave
Always wear safety glasses while programming.
Try GOSUB Encoder and put a RETURN at the end of the subroutine. Currently you GOTO Encoder and then you run off into never never land. I'm not saying that will make it work but that's one possible problem.
Also, make sure that have the "wiper" of the roller connected to 5V, verify that you get signals on the actuall pins of the PIC when you rotate the encoder/roller.
I think the hardware must be build in this way (since the rest of buttons are allready connected as matrix). I wonder if "KeyPad.bas" of Mr.Mister-e can be addapted to read the increment/decrement of roller, by "including" somehow the code for encoder ....
Brrrrrr...it's beyond of my intellectual capacities.
Hi,
I don't have any experience with that routine but provided everything else works the way you want why don't you just set the pin which is common to the encoder (RB5 ?) high, read the port, and return the pin low.
GOSUB ScanMatrix 'Or whatever
PortB.5 = 1
GOSUB Encoder
PortB.5 = 0
Finally, in the first code you posted you had the encoder to RB7-5 so I based my code on that. Now, in your latest schematic, you have it on RB2-0 which means that my code (if that's what you're trying) definitely won't work without modifying it since it expects the three "switches" in the encoder to be on RB7-5.
What I do wrong ?!
I adapted "keypad.bas" to my hw :
and I wrote this pice of code :Code:KB_ROW = 3 ; 3 ROW keypad KB_ROW_PORT = PORTB ; Keypad ROW on PORTB KB_ROW_BIT = 3 ; ROW0 = PORTB.3 KB_COL = 3 ; 3 COL keypad KB_COL_PORT = PORTB ; Keypad Col on PORTB KB_COL_BIT = 0 ; COL0 = PORTB.0 DebounceDelay = 0x80 ; debounce delay 41mSec SINGLE_SCAN = 0 ; Scan ;till a key is pressed KEYPAD_AUTOREPEAT = 1
..but no change in porta.0 or porta.1 state ...Code:@ DEVICE pic16F628A, XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF, MCLR_ON, LVP_OFF Define OSC 4 ' 4MHz CMCON = 7 ' Disable on-chip comparator, PORTA in digital mode include "alldigital.pbp" include "C:\PBP\enc_KEY.BAS" TrisA = %00000000 PortA = %00000000 PortB = %00111000 TrisB = %00011000 oldState VAR BYTE newState VAR BYTE Q_Count VAR WORD DIR VAR BIT UP CON 1 DN CON 0 Main_Loop: newState = (PortB & %00111000) portb.5 = 1 gosub encoder portb.5 = 0 if dir = up then porta.0 = 0 porta.1 = 1 endif if dir = dn then porta.0 = 1 porta.1 = 0 endif goto Main_Loop encoder: If newState <> 0 THEN If newState <> oldState THEN ' Changed from last time? Select Case oldState Case 32 If NewState = 128 THEN ' Was 1 now 4 = Up Q_Count = Q_Count + 1 DIR = UP ELSE ' Was 1 now 2 = Down Q_Count = Q_Count - 1 DIR = DN ENDIF Case 64 If NewState = 32 THEN ' Was 2 now 1 = Up Q_Count = Q_Count + 1 DIR = UP ELSE ' Was 2 now 4 = Down Q_Count = Q_Count - 1 DIR = DN ENDIF Case 128 If NewState = 64 THEN ' Was 4 now 2 = Up Q_Count = Q_Count + 1 DIR = UP ELSE ' Was 4 now 1 = Down Q_Count = Q_Count - 1 DIR = DN ENDIF END SELECT oldState = NewState ENDIF ENDIF Return
Update code :
but no matter what M (1,2 or 3) I push, porta.0 goes high and stay so.Code:Main_Loop: gosub keypadscan newState = (PortB & %00000111) gosub encoder gosub check goto main_loop Check : if dir = up then porta.0 = 0 porta.1 = 1 endif if dir = dn then porta.0 = 1 porta.1 = 0 endif return encoder: If newState <> 0 THEN If newState <> oldState THEN ' Changed from last time? Select Case oldState Case 32 If NewState = 128 THEN ' Was 1 now 4 = Up Q_Count = Q_Count + 1 DIR = UP ELSE ' Was 1 now 2 = Down Q_Count = Q_Count - 1 DIR = DN ENDIF Case 64 If NewState = 32 THEN ' Was 2 now 1 = Up Q_Count = Q_Count + 1 DIR = UP ELSE ' Was 2 now 4 = Down Q_Count = Q_Count - 1 DIR = DN ENDIF Case 128 If NewState = 64 THEN ' Was 4 now 2 = Up Q_Count = Q_Count + 1 DIR = UP ELSE ' Was 4 now 1 = Down Q_Count = Q_Count - 1 DIR = DN ENDIF END SELECT oldState = NewState ENDIF ENDIF Return
Hi,
In the first code you posted you read the status of PortB before driving the the common pin for the encoder so there probably won't be any signals comming in.
In the second, updated example, you never drive the common pin for the encoder at all.
You need to set the "common pin" high (or low depending on hardware) and THEN read the port otherwise you won't get anything back.
You really need to sit back and think the problem thru, not just cut and paste pieces of code together without understanding what they do and how the hardware they're intended to interface to is supposed to work.
Think it thru.... The "encoder" has a "wiper" which "cylces" thru the different contacts. Depending on which contact the wipers is positioned at you'll get a signal out on a certain pin. In order to get that signal out the "wiper" must be "powered" in one way or another. If the inputs from the "contacts" are pulled up then wiper must be grounded so that it pulls the contact (and signal LOW). Likewise if the inputs from the contacts are pulled down then the "wiper" must be high in order to pull the inputs high.
If the inputs are pulled up with resistors then you'll get a "walking zero" across the three pins, if the inputs are pulled down you'll get a "walking one" across the inputs. You must adapt the code to match.
My suggestion, for now, is that you ditch the matrix routine untill you get the encoder working - and understand how it works.
/Henrik.
Bookmarks