BS2 Quadrature Reseting
I've been playing with making a program that uses the quadrature encoder to measure distance and convert it to real units to the .01 decimal place (Sending the data out the RS232 port). I have been running into an issue where the BS2 resets itself after every increment, resending the header. I still have some work on the code, but am having a hard time getting past this.
I am very sure that it isn't a power supply issue and am running off of the BOE's Voltage regulator.
Any help is much appreciated.
I am very sure that it isn't a power supply issue and am running off of the BOE's Voltage regulator.
Any help is much appreciated.
' {$STAMP BS2}
' {$PBASIC 2.5}
'Constants (Program)
MaxDiff CON 1000 'Value represents a larger value than the encoder can change between readings
DirUp CON -1 'Value represents direction up
DirDown CON 1 'Value represents direction down
'TimeInterval CON 5000 'Value represents milli-seconds
COUNTS_PER_FOOT CON 240 'Value represents the encode counts per foot
MAXVAL CON 65535 'Value represents the encoders maximum possible reading
MINVAL CON 0 'Value represents the encoders minimum possible reading
'Constants (Quadrature)
QPOS CON $08 'Query Position
QSPD CON $10 'Query Speed
CLRP CON $28 'Clear Position
SREV CON $30 'Set Orientation as Reversed
STXD CON $38 'Set TX Delay
QuadAdd CON 2 'Address for the quadrature reader
CommPin CON 12 'Communication bus pin
BaudValue CON 32 'For 19.2kbps
'Variables
NewReading VAR Word 'Value represents the new reading from the quadrature encoder
OldReading VAR Word 'Value represents the old reading from the quadrature encoder
Direction VAR Word 'Value represents the direction
Delta VAR Word 'Value represents the delta between NewReading and OldReading
Depth VAR Word 'The current depth
DepthR VAR Word 'The current depth remainder
DepthDec VAR Word 'The current depth decimal
'Initialization
PAUSE 1000 'Let things settle
SEROUT CommPin, BaudValue, [noparse][[/noparse]CLRP] 'Clears any prior position info
GOSUB ReadEncoder 'Get initial encoder reading
OldReading = NewReading 'Clear OldReading
Depth = 0 'Clear Location
Direction = 1 'Assume positive
GOSUB SendHeaders 'Send Initial Header for Debug
GOSUB Main 'Go to Main routine
Main:
GOSUB ReadEncoder
IF NewReading <> OldReading THEN NewLocation
GOSUB CalcDepth
GOSUB SendDepth
GOSUB SendAll
OldReading = NewReading
'PAUSE 500
GOTO Main
'Subroutines
ReadEncoder:
SEROUT CommPin, BaudValue, [noparse][[/noparse]QPOS + QuadAdd] 'Assume encoder can have values from 0 to 65535 when read
SERIN CommPin, BaudValue, [noparse][[/noparse]NewReading.HIGHBYTE, NewReading.LOWBYTE] 'Assume encoder values increase if depth increases 'Assume encoder values decrease if depth decreases
'SEROUT 16,16468,[noparse][[/noparse]LF]
'SEROUT 16,16468,[noparse][[/noparse]" "]
'SEROUT 16,16468,[noparse][[/noparse]CR]
'SEROUT 16,16468,[noparse][[/noparse]DEC NewReading]
RETURN
RolloverDelta:
'SEROUT 16,16468, [noparse][[/noparse]LF]
'SEROUT 16,16468, [noparse][[/noparse]CR]
'SEROUT 16,16468, [noparse][[/noparse]DEC Delta]
IF Direction = DirDown THEN
Delta = (MAXVAL - OldReading) + 1 + (NewReading - MINVAL)
ELSE
Delta = (OldReading - MINVAL) + 1 + (MAXVAL - NewReading)
ENDIF
RETURN
NewLocation:
IF NewReading > OldReading THEN
GOSUB DirectionUp
ELSE
GOSUB DirectionDn
ENDIF
RETURN
DirectionUp:
Delta = NewReading - OldReading
IF Delta < MaxDiff THEN
Direction = DirUp
ELSE
Direction = DirDown
ENDIF
GOSUB RolloverDelta
RETURN
DirectionDn:
Delta = OldReading - NewReading
IF Delta < MaxDiff THEN
Direction = DirUp
ELSE
Direction = DirDown
ENDIF
GOSUB RolloverDelta
RETURN
CalcDepth:
IF Delta => COUNTS_PER_FOOT THEN
DO WHILE Delta >= COUNTS_PER_FOOT
Depth = Depth + Direction
Delta = Delta - COUNTS_PER_FOOT
LOOP
ENDIF
GOSUB DSDecimal
RETURN
DSDecimal:
DepthDec = (Delta * 100) / COUNTS_PER_FOOT 'This calculates the depth to the .01 decimal place
RETURN
'RS232 Output Routines
SendDepth:
SEROUT 16,16468,[noparse][[/noparse]CR]
SEROUT 16,16468,[noparse][[/noparse]SDEC Depth]
SEROUT 16,16468,[noparse][[/noparse]"."]
SEROUT 16,16468,[noparse][[/noparse]DEC DepthDec]
RETURN
SendHeaders:
'SEROUT 16,16468,[noparse][[/noparse]CR]
'SEROUT 16,16468,[noparse][[/noparse]LF]
SEROUT 16,16468,[noparse][[/noparse]"Depth"]
SEROUT 16,16468,[noparse][[/noparse]" Dir "]
SEROUT 16,16468,[noparse][[/noparse]" CPF"]
SEROUT 16,16468,[noparse][[/noparse]" Delta"]
SEROUT 16,16468,[noparse][[/noparse]" NR"]
SEROUT 16,16468,[noparse][[/noparse]" OR"]
SEROUT 16,16468,[noparse][[/noparse]" DepthR"]
SEROUT 16,16468,[noparse][[/noparse]LF]
RETURN
SendAll:
SEROUT 16,16468,[noparse][[/noparse]" "]
SEROUT 16,16468,[noparse][[/noparse]DEC Direction]
SEROUT 16,16468,[noparse][[/noparse]" "]
SEROUT 16,16468,[noparse][[/noparse]DEC COUNTS_PER_FOOT]
SEROUT 16,16468,[noparse][[/noparse]" "]
SEROUT 16,16468,[noparse][[/noparse]DEC Delta]
SEROUT 16,16468,[noparse][[/noparse]" "]
SEROUT 16,16468,[noparse][[/noparse]DEC NewReading]
SEROUT 16,16468,[noparse][[/noparse]" "]
SEROUT 16,16468,[noparse][[/noparse]DEC OldReading]
SEROUT 16,16468,[noparse][[/noparse]" "]
SEROUT 16,16468,[noparse][[/noparse]DEC DepthR]
RETURN
END

Comments
To keep resending the header info, you are definitely resetting which would only be caused by low supply voltage, cycling the reset pin of the Stamp chip or cycling the dtr pin of the programming port.
What is the Stamp talking to? Is the receiving device opening and closing it's serial port?
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Tom Sisk
http://www.siskconsult.com
·
Parallax Position Controller Kit (#27906)
Listening to the stamp using Hyperterminal on the BOE programming port
I didn't know that the Stamp would reset if the dtr pin if the programming port was cycled. I will have to out a scope on that.
The Stamp does seem to reset when the "call" button is pressed on Hyperterminal.
The easiest way to avoid that issue during communication is to build a serial cable with only pins 2, 3, 5 connnected.
Won't work for programming, but doesn't reset the chip when the PC serial port is opened.
Cheers,
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Tom Sisk
http://www.siskconsult.com
·
What ARE you using for a power-supply?
Another problem -- Your "IF ... THEN NewLocation" is a GOTO NewLocation.· But you 'return' from NewLocation with a RETURN.· Doing this will reset the BS2.
So, you need "IF ... THEN GOSUB NewLocation" at the very least.
I also wouldn't use a "GOSUB MAIN" -- I believe the BS2 only has a 4-deep GOSUB/RETURN stack, you don't want to use one up with GOSUB MAIN that you never RETURN from.
Post Edited (allanlane5) : 5/5/2010 1:54:26 PM GMT
Changed the GOSUB Main to a GOTO Main
Changed the GOTO NewLocation to a GOSUB NewLocation
The BS2 no longer resets itself!!
Looks like I have some calculation problems to fix now...
THANKS!!!!
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Tom Sisk
http://www.siskconsult.com
·
Everything is working correctly except for one thing. I am having a problem when the "DepthR" variable goes from 0 to 65535. What is happening is once it goes to 65535 the DepthR gets divided by the COUNTS_PER_FOOT and adds that to the "Depth". I need to make some sort of rollover in the "DepthR" variable.
Any help is much appreciated...