DialEncoder
SwordfishUser.DialEncoder History
Show minor edits - Show changes to output
Changed line 11 from:
2 Tell it what the A and B pins are
to:
2 Tell it what the A and B pins are\\
Changed line 9 from:
1 Include the module
to:
1 Include the module\\
Changed line 12 from:
(Hash)option EncoderA = PORTB.0
to:
(Hash)option EncoderA = PORTB.0\\
Changed line 17 from:
RotationSpeed = DialEncoder.Speed
to:
RotationSpeed = DialEncoder.Speed\\
Changed line 26 from:
=code [= #option EncoderA = PORTB.0
to:
=code [= #option EncoderA = PORTB.0
Changed line 10 from:
Include "DialEncoder.Bas"
to:
Include "DialEncoder.Bas"\\
Changed lines 12-16 from:
3 Before you use it Initialise the module
IntialiseDialEncoder()
4 Read the current speed and the direction (byte & bit)
to:
(Hash)option EncoderA = PORTB.0
(Hash)option EncoderB = PORTB.1\\
3 Before you use it Initialise the module\\
IntialiseDialEncoder()\\
4 Read the current speed and the direction (byte & bit)\\
(Hash)option EncoderB = PORTB.1\\
3 Before you use it Initialise the module\\
IntialiseDialEncoder()\\
4 Read the current speed and the direction (byte & bit)\\
Changed lines 5-6 from:
This modules does that, by setting up a 100hz interrupt it will monitor the inputs and when there has been a change it will not the direction and increment or decrement a counter. Then every 2 hz will convert that to a figure that can be used as a speed indication.
to:
This modules does that, by setting up a 100hz interrupt it will monitor the inputs and when there has been a change it will note the direction and increment or decrement a counter. Then every 2 hz will convert that to a figure that can be used as a speed indication.
Changed lines 22-23 from:
BTW the encoder was written for is the Grayhill Optical Encoder (Series 62) and debugged/sim'ed all in ISIS by LabCenter Electronics
to:
BTW the Code was written for an Grayhill Optical Encoder (Series 62) and debugged/sim'ed all in ISIS by LabCenter Electronics
Changed lines 24-25 from:
First is a demo prog followed by the modual
to:
First is a demo prog followed by the module
Deleted line 0:
Changed lines 20-22 from:
to:
Thats it.
BTW the encoder was written for is the Grayhill Optical Encoder (Series 62) and debugged/sim'ed all in ISIS by LabCenter Electronics
First is a demo prog followed by the modual
=code [= #option EncoderA = PORTB.0
#option EncoderB = PORTB.1
Include "Usart.bas"
Include "convert.bas"
Include "DialEncoder.bas"
SetBaudrate(br19200)
IntialiseDialEncoder()
Repeat
USART.Write (DecToStr (DialEncoder.Speed),32,DecToStr (DialEncoder.Direction),13,10)
DelayMS(500)
Until 1 = 2
End
=]
=code [=
Module DialEncoder
#option EncoderA= PORTB.0
#option EncoderB = PORTB.1
// validate pin...
#if IsOption(EncoderA) And Not IsValidPortPin(EncoderA)
#error EncoderA, "Invalid option. EncoderA must be a valid port pin."
#endif
// validate pin...
#if IsOption(EncoderB) And Not IsValidPortPin(EncoderB)
#error EncoderB, "Invalid option. EncoderB must be a valid port pin."
#endif
Dim EncoderPinA As EncoderA.EncoderA@
Dim EncoderPinB As EncoderB.EncoderB@
Dim EncoderNew As Byte
Dim EncoderOld As Byte
Dim TimerCounter As Byte
Dim EncoderCounter As Byte
Public Dim Speed As Byte
Public Dim Direction As Bit
Dim Timer1Reg As TMR1L.asWord
Const FudgeFactor = 5
Const Tmr1Val =((65536)-(_clock*2500))+FudgeFactor
interrupt Encoder ()
T1CON.0 = 0
Timer1Reg = Timer1Reg + Word(Tmr1Val)
T1CON.0 = 1
EncoderNew.0 = EncoderPinA
EncoderNew.1 = EncoderPinB
If EncoderNew <> EncoderOld Then
EncoderOld = EncoderOld >> 1
EncoderNew = EncoderNew Xor EncoderOld
If EncoderNew.0 = 1 Then
Inc (EncoderCounter)
Else
Dec (EncoderCounter)
EndIf
EncoderOld.0 = EncoderPinA
EncoderOld.1 = EncoderPinB
EndIf
If TimerCounter > 0 Then
Dec (TimerCounter)
Else
TimerCounter = 49
If EncoderCounter.7 = 0 Then
Speed = EncoderCounter
Direction = 1
Else
EncoderCounter.7 = 0
Speed = 128 - EncoderCounter
Direction = 0
EndIf
EncoderCounter = 0
EndIf
PIR1.0 = 0
End interrupt
Public Sub IntialiseDialEncoder()
EncoderOld = 0
EncoderNew = 0
Timer1Reg = Tmr1Val
T1CON = 0
PIR1.0 = 0
INTCON.6 = 1
PIE1.0 = 1
T1CON.0 = 1
Enable (Encoder)
End Sub
End
=]
BTW the encoder was written for is the Grayhill Optical Encoder (Series 62) and debugged/sim'ed all in ISIS by LabCenter Electronics
First is a demo prog followed by the modual
=code [= #option EncoderA = PORTB.0
#option EncoderB = PORTB.1
Include "Usart.bas"
Include "convert.bas"
Include "DialEncoder.bas"
SetBaudrate(br19200)
IntialiseDialEncoder()
Repeat
USART.Write (DecToStr (DialEncoder.Speed),32,DecToStr (DialEncoder.Direction),13,10)
DelayMS(500)
Until 1 = 2
End
=]
=code [=
Module DialEncoder
#option EncoderA= PORTB.0
#option EncoderB = PORTB.1
// validate pin...
#if IsOption(EncoderA) And Not IsValidPortPin(EncoderA)
#error EncoderA, "Invalid option. EncoderA must be a valid port pin."
#endif
// validate pin...
#if IsOption(EncoderB) And Not IsValidPortPin(EncoderB)
#error EncoderB, "Invalid option. EncoderB must be a valid port pin."
#endif
Dim EncoderPinA As EncoderA.EncoderA@
Dim EncoderPinB As EncoderB.EncoderB@
Dim EncoderNew As Byte
Dim EncoderOld As Byte
Dim TimerCounter As Byte
Dim EncoderCounter As Byte
Public Dim Speed As Byte
Public Dim Direction As Bit
Dim Timer1Reg As TMR1L.asWord
Const FudgeFactor = 5
Const Tmr1Val =((65536)-(_clock*2500))+FudgeFactor
interrupt Encoder ()
T1CON.0 = 0
Timer1Reg = Timer1Reg + Word(Tmr1Val)
T1CON.0 = 1
EncoderNew.0 = EncoderPinA
EncoderNew.1 = EncoderPinB
If EncoderNew <> EncoderOld Then
EncoderOld = EncoderOld >> 1
EncoderNew = EncoderNew Xor EncoderOld
If EncoderNew.0 = 1 Then
Inc (EncoderCounter)
Else
Dec (EncoderCounter)
EndIf
EncoderOld.0 = EncoderPinA
EncoderOld.1 = EncoderPinB
EndIf
If TimerCounter > 0 Then
Dec (TimerCounter)
Else
TimerCounter = 49
If EncoderCounter.7 = 0 Then
Speed = EncoderCounter
Direction = 1
Else
EncoderCounter.7 = 0
Speed = 128 - EncoderCounter
Direction = 0
EndIf
EncoderCounter = 0
EndIf
PIR1.0 = 0
End interrupt
Public Sub IntialiseDialEncoder()
EncoderOld = 0
EncoderNew = 0
Timer1Reg = Tmr1Val
T1CON = 0
PIR1.0 = 0
INTCON.6 = 1
PIE1.0 = 1
T1CON.0 = 1
Enable (Encoder)
End Sub
End
=]
Added lines 1-23:
During a wait in an airport lounge I decided to knock up a new module. Its for those rotary encoders used in place of a pot.
These devices work by giving a 2 bit encoder output and requires the CPU to decode the signals to tell you of the direction of rotation. Being able to monitor the movement as a count is one thing but its better if you can do that over time to establish how fast your rotating the dial.
This modules does that, by setting up a 100hz interrupt it will monitor the inputs and when there has been a change it will not the direction and increment or decrement a counter. Then every 2 hz will convert that to a figure that can be used as a speed indication.
How to use
1 Include the module
Include "DialEncoder.Bas"
2 Tell it what the A and B pins are
#option EncoderA = PORTB.0
#option EncoderB = PORTB.1
3 Before you use it Initialise the module
IntialiseDialEncoder()
4 Read the current speed and the direction (byte & bit)
RotationSpeed = DialEncoder.Speed
RotationDirection = DialEncoder.Direction
Thats it. BTW the encoder was written for is the Grayhill Optical Encoder (Series 62)