Here the code for a rotary optical encoder, using quadrature.
Just connect the Channel A to portB.6 and channel B to portB.7, ground portB.5 and portB.4
Connection for LCD can be found to page 96 of PBP user manual.
Code:
include "ALLDIGITAL.pbp"
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
'INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts
DEFINE OSC 20
' PIC 16F628
' PicBasic program to demonstrate operation of an LCD in 4-bit mode
' and reading an optical encoder in quadrature
'
' LCD should be connected as follows:
' LCD PIC
' DB4 PortA.0
' DB5 PortA.1
' DB6 PortA.2
' DB7 PortA.3
' RS PortA.4 (add 4.7K pullup resistor to 5 volts)
' E PortB.0
' RW Ground
' Vdd 5 volts
' Vss Ground
' Vo 20K potentiometer (or ground)
' DB0-3 No connect
TrisA = 000000
TrisB = 110000
PortB=0
Define LCD_DREG PORTA
Define LCD_DBIT 0
Define LCD_RSREG PORTA
define LCD_RSBIT 4
define LCD_EREG PORTB
define LCD_EBIT 0
define LCD_BITS 4
define LCD_LINES 2
define LCD_COMMANDUS 2000
define LCD_DATAUS 50
Flag var bit
wsave VAR BYTE $70 SYSTEM ' alternate save location for W
Q_New var Byte
Q_Old var byte
Q_Count var word
' Set variable value @ startup
Flag = 0
Q_New = 0
Q_Old = 0
Q_Count = 0
ASM
INT_LIST macro ; IntSource, Label, Type, Resetflag?
INT_Handler RBC_INT, _Encoder, ASM, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE RBC_INT ; enable external (INT) interrupts
Lcdout $fe, 1 ' Clear LCD screen
Lcdout "System Ready" ' Display message
Pause 500 ' Wait .5 second
Goto Main_Loop
Encoder:
Q_New = PortB.7 + PortB.7 + PortB.6
if Q_Old = 0 then
if Q_New = 2 then Minus_Count
if Q_New = 1 then Plus_Count
endif
if Q_Old = 1 then
if Q_New = 0 then Minus_Count
if Q_New = 3 then Plus_Count
endif
if Q_Old = 3 then
if Q_New = 1 then Minus_Count
if Q_New = 2 then Plus_Count
endif
if Q_Old = 2 then
if Q_New = 3 then Minus_Count
if Q_New = 0 then Plus_Count
endif
goto Q_Skip
Minus_Count:
Q_Count = Q_Count - 1
Flag = 1
goto Q_Skip
Plus_Count:
Q_Count = Q_Count + 1
Flag = 1
Q_Skip:
Q_Old = Q_New
@ INT_RETURN
Main_Loop:
if Flag = 1 then
Lcdout $fe, 1
Lcdout Dec Q_Count
Flag = 0
endif
goto Main_Loop
end
Enjoy
Cheers
Al.
Bookmarks