LOL, Thanks for the help and support guys!
Here is the run down
Code from Steve on post 12 works but looses count if rotated too fast so I know the circuit is good.
I then went to the code in post 6 with both asm routines and compiled it with microcode studio. Compiled fine. The only things I changed in the code from post 6 was adding:
DEFINE OSC 20
PAUSE 1000
SEROUT2 on PORTB.0 FOR LCD clear
SEROUT2 ON PORTB.0 FOR DISPLAY
Here it is:
Old_Bits VAR BYTE
New_Bits VAR BYTE
RotEnc1_val VAR BYTE 'Connected to PORTB<4:5>
RotEnc2_val VAR BYTE 'Connected to PORTB<6:7>
TRISB = %11110000
RotEncDir VAR BIT
'************************
' SETUP YOUR LCD HERE!!!
'************************
DEFINE OSC 20
PAUSE 1000 'Pause for LCD Power up
SEROUT2 PORTB.0, 84,[254, 88] 'Clear LCD
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 INT_INT, _Rot_Encoder, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE RBC_INT ;RB Port Change Interrupt
Old_Bits = PORTB & (%11110000)
Main:
SEROUT2 PORTB.0, 84,[254, 71, 1, 1, "ROT1:", DEC2 RotEnc1_val,"ROT2:",_
DEC2 RotEnc2_val]
pause 10
GOTO Main
'---[RBC - interrupt handler]---------------------------------------------------
Rot_Encoder:
New_Bits = PORTB & (%11110000)
IF (New_Bits & %00110000) = (Old_Bits & %00110000) then No_Change_Rot1
RotEncDir = New_Bits.5 ^ Old_Bits.4
if RotEncDir = 1 then
RotEnc1_val = RotEnc1_val + 1
if RotEnc1_val = 36 then RotEnc1_val = 0
ELSE
RotEnc1_val = RotEnc1_val - 1
if RotEnc1_val = 255 then RotEnc1_val = 35
ENDIF
No_Change_Rot1:
IF (New_Bits & %11000000) = (Old_Bits & %11000000) then DoneRotEnc
RotEncDir = New_Bits.7 ^ Old_Bits.6
if RotEncDir = 1 then
RotEnc2_val = RotEnc2_val + 1
if RotEnc2_val = 36 then RotEnc2_val = 0
ELSE
RotEnc2_val = RotEnc2_val - 1
if RotEnc2_val = 255 then RotEnc2_val = 35
ENDIF
DoneRotEnc:
Old_Bits = New_Bits
@ INT_RETURN
The LCD comes up and displays ok. Then when I rotate an encoder, sometimes I get a little garbage on the screen and then it just seams to hang. I can go thru many restarts before the LCD will display properly again. It kinda seams like the chip is stuck. Is that possible even though I disconnect power and then reconnect? Is the pic holding something in memory where it hangs? I am using a 16F876A
Thanks guys!
Smitty
Bookmarks