jhtburke
06-03-05, 05:00 PM
this machine is designed to take the pulse width of two identical pulses and the time between them then ouput a number that will be the feedback to adjust the pulse times and seperation.
it runs when started for an unpredictable number of iterations before crashing. It either locks up the isopod or resets the isopod. It can happen after a dozen iterations or after several thousand.
The sum mentioned below does not get large very quiclkly becasue the components of the sum do are small of the order of one.
I suspect some sort of memory problem, but am unsure where or how.
Any help would greatly be appreciated.
FVARIABLE T_HIGH EEWORD
FVARIABLE T_LOW EEWORD
FVARIABLE A EEWORD
FVARIABLE B EEWORD
FVARIABLE C EEWORD
FVARIABLE P EEWORD
FVARIABLE R_SET EEWORD
FVARIABLE X EEWORD
FVARIABLE V_OUT EEWORD
FVARIABLE N EEWORD
FVARIABLE V_ERR EEWORD
: MEASURE-PWM #MEASURES THE LENGTH OF TWO IDENTICAL PULES
#AND THE TIME BEWEEN THEM
BEGIN #TRIGGER PULSE ON PA1 GOES LOW
PA1 OFF?
UNTIL
BEGIN #TRIGGER PULSE GOES HIGH (CYCLES ONCE)
PA1 ON?
UNTIL
TD1 ACTIVE-HIGH #SETS TD1 READY TO RECIEVE THE PULSE
TD1 SET-PWM-IN
BEGIN #RETURNS THE PULSE WIDTH
TD1 CHK-PWM-IN
?DUP
UNTIL
S>F T_HIGH F! #CONVERTS THE PULSE WIDTH INTO FLOAT AND STORES IT IN T_HIGH
BEGIN
PA1 OFF?
UNTIL
BEGIN
PA1 ON?
UNTIL #CYCLE TRIGGER ONE MORE TIME
TD1 ACTIVE-LOW #SETS TD1 TO RECIEVE PULSE SEPERATION TIME
TD1 SET-PWM-IN
BEGIN
TD1 CHK-PWM-IN
?DUP
UNTIL
S>F T_LOW F! #STORES FLOAT TIME IN T_LOW
; EEWORD
: GLITCH #CHECKS TO SEE IF 3 CONSECUTIVE MEASUREMENTS ARE
#WITHIN 10% OF EACH OTHER AND IF SO LEAVES A FLAG
#ON THE STACK
B F@ A F@ F- B F@ F/ 0.1E0 F< IF
B F@ C F@ F- B F@ F/ 0.1E0 F< THEN
; EEWORD
: RATIO #RETURNS THE AVERAGE VALUE OF 3 RAIOS OF THE
#PULSE WIDTHS OVER THE SEPERATION TIME
BEGIN
MEASURE-PWM
T_HIGH F@ T_LOW F@ F/ A F!
MEASURE-PWM
T_HIGH F@ T_LOW F@ F/ B F!
MEASURE-PWM
T_HIGH F@ T_LOW F@ F/ C F!
GLITCH
UNTIL
A F@ B F@ F+ C F@ F+ 3.0E0 F/
; EEWORD
: SET_POINT #STORES THE AVERAGE OF 9 RATIO'S IN R_SET
1.0E-10 X F!
3 0 DO
RATIO
X F@ F+ X F!
LOOP
X F@ 3.0E0 F/ R_SET F!
; EEWORD
: ERRCALC #STORES THE DIFFERNCE OF THE AVERAGE OF 3 RATIOS
# AND R_SET IN V_ERR
RATIO R_SET F@ F- V_ERR F!
; EEWORD
: SUM #A CONTINUOUS SUM OF THE DIFFRENCES ABOVE AND
# STORE IT IN N
N F@ V_ERR F@ F+ N F!
; EEWORD
: OUTPUT #USED TO OUPUT A 12 BIT 2'S COMPLEMENT OFFSET
# NUMER TO A DIGITAL TO ANALOG CONVERTER
1024.0E0 V_OUT F@ F<
IF PB3 ON V_OUT F@ 1024.0E0 F- V_OUT F!
ELSE PB3 OFF
THEN
512.0E0 V_OUT F@ F<
IF PB4 ON V_OUT F@ 512.0E0 F- V_OUT F!
ELSE PB4 OFF
THEN
256.0E0 V_OUT F@ F<
IF PB5 ON V_OUT F@ 256.0E0 F- V_OUT F!
ELSE PB5 OFF
THEN
128.0E0 V_OUT F@ F<
IF PB6 ON V_OUT F@ 128.0E0 F- V_OUT F!
ELSE PB6 OFF
THEN
64.0E0 V_OUT F@ F<
IF PB7 ON V_OUT F@ 64.0E0 F- V_OUT F!
ELSE PB7 OFF
THEN
32.0E0 V_OUT F@ F<
IF PA7 ON V_OUT F@ 32.0E0 F- V_OUT F!
ELSE PA7 OFF
THEN
16.0E0 V_OUT F@ F<
IF PA6 ON V_OUT F@ 16.0E0 F- V_OUT F!
ELSE PA6 OFF
THEN
8.0E0 V_OUT F@ F<
IF PA5 ON V_OUT F@ 8.0E0 F- V_OUT F!
ELSE PA5 OFF
THEN
4.0E0 V_OUT F@ F<
IF PA4 ON V_OUT F@ 4.0E0 F- V_OUT F!
ELSE PA4 OFF
THEN
2.0E0 V_OUT F@ F<
IF PA3 ON V_OUT F@ 2.0E0 F- V_OUT F!
ELSE PA3 OFF
THEN
1.0E0 V_OUT F@ F<
IF PA2 ON
ELSE PA2 OFF
THEN
; EEWORD
: OUTLOGIC #TAKES THE TOP VALUE ON THE STACK AND OUPUTS TO
#THE DAC MENTIONED ABOVE
V_OUT F!
1.0E-15 V_OUT F@ F< IF
PB2 ON
OUTPUT
THEN
V_OUT F@ 1.0E-15 F< IF
PB2 OFF
V_OUT F@ 2048 F+ V_OUT F!
OUTPUT
THEN
; EEWORD
: MAIN #TAKES A RATIO DIFFRENCE, ADDS IT TO AN ONGOING SUM, AND
#OUTPUTS THE NEW SUMS VALUE.
ERRCALC
SUM
N F@ OUTLOGIC
; EEWORD
MACHINE SPECTRUM
ON-MACHINE SPECTRUM
APPEND-STATE RUN
APPEND-STATE REST
#IF A SWITCH CONNECTED TO PA0 IS OFF
#OUTPUT 0 TO THE DAC, TURN ON YELLOW AND OFF GREEN LEDS
IN-STATE
RUN
CONDITION
PA0 OFF?
CAUSES
YELLED ON
GRNLED OFF
1.0E-10 OUTLOGIC
THEN-STATE
REST1
TO-HAPPEN
#IF THE SWITCH IS ON, TURN ON GREEN LED RUN MAIN AND BLINK THE RED #LED WHILE DOING SO.
IN-STATE
RUN
CONDITION
PA0 ON?
CAUSES
REDLED ON
GRNLED ON
MAIN
REDLED OFF
THEN-STATE
RUN
TO-HAPPEN
#WAIT IN REST UNTIL THE SWITCH GOES ON, RESET THE SUM TO 0, TAKE A
#SET POINT AND TURN OFF THE YELLOW
IN-STATE
REST
CONDITION
PA0 ON?
CAUSES
YELLED OFF
1.0E-10 N F!
SET_POINT
THEN-STATE
CHECK
TO-HAPPEN
: STARTUP #SET UP FOR INSTALL
GRNLED OFF
REDLED OFF
YELLED ON
1.0E-10 OUTLOGIC
REST SET-STATE
INSTALL SPECTRUM
; EEWORD
SAVE-RAM
it runs when started for an unpredictable number of iterations before crashing. It either locks up the isopod or resets the isopod. It can happen after a dozen iterations or after several thousand.
The sum mentioned below does not get large very quiclkly becasue the components of the sum do are small of the order of one.
I suspect some sort of memory problem, but am unsure where or how.
Any help would greatly be appreciated.
FVARIABLE T_HIGH EEWORD
FVARIABLE T_LOW EEWORD
FVARIABLE A EEWORD
FVARIABLE B EEWORD
FVARIABLE C EEWORD
FVARIABLE P EEWORD
FVARIABLE R_SET EEWORD
FVARIABLE X EEWORD
FVARIABLE V_OUT EEWORD
FVARIABLE N EEWORD
FVARIABLE V_ERR EEWORD
: MEASURE-PWM #MEASURES THE LENGTH OF TWO IDENTICAL PULES
#AND THE TIME BEWEEN THEM
BEGIN #TRIGGER PULSE ON PA1 GOES LOW
PA1 OFF?
UNTIL
BEGIN #TRIGGER PULSE GOES HIGH (CYCLES ONCE)
PA1 ON?
UNTIL
TD1 ACTIVE-HIGH #SETS TD1 READY TO RECIEVE THE PULSE
TD1 SET-PWM-IN
BEGIN #RETURNS THE PULSE WIDTH
TD1 CHK-PWM-IN
?DUP
UNTIL
S>F T_HIGH F! #CONVERTS THE PULSE WIDTH INTO FLOAT AND STORES IT IN T_HIGH
BEGIN
PA1 OFF?
UNTIL
BEGIN
PA1 ON?
UNTIL #CYCLE TRIGGER ONE MORE TIME
TD1 ACTIVE-LOW #SETS TD1 TO RECIEVE PULSE SEPERATION TIME
TD1 SET-PWM-IN
BEGIN
TD1 CHK-PWM-IN
?DUP
UNTIL
S>F T_LOW F! #STORES FLOAT TIME IN T_LOW
; EEWORD
: GLITCH #CHECKS TO SEE IF 3 CONSECUTIVE MEASUREMENTS ARE
#WITHIN 10% OF EACH OTHER AND IF SO LEAVES A FLAG
#ON THE STACK
B F@ A F@ F- B F@ F/ 0.1E0 F< IF
B F@ C F@ F- B F@ F/ 0.1E0 F< THEN
; EEWORD
: RATIO #RETURNS THE AVERAGE VALUE OF 3 RAIOS OF THE
#PULSE WIDTHS OVER THE SEPERATION TIME
BEGIN
MEASURE-PWM
T_HIGH F@ T_LOW F@ F/ A F!
MEASURE-PWM
T_HIGH F@ T_LOW F@ F/ B F!
MEASURE-PWM
T_HIGH F@ T_LOW F@ F/ C F!
GLITCH
UNTIL
A F@ B F@ F+ C F@ F+ 3.0E0 F/
; EEWORD
: SET_POINT #STORES THE AVERAGE OF 9 RATIO'S IN R_SET
1.0E-10 X F!
3 0 DO
RATIO
X F@ F+ X F!
LOOP
X F@ 3.0E0 F/ R_SET F!
; EEWORD
: ERRCALC #STORES THE DIFFERNCE OF THE AVERAGE OF 3 RATIOS
# AND R_SET IN V_ERR
RATIO R_SET F@ F- V_ERR F!
; EEWORD
: SUM #A CONTINUOUS SUM OF THE DIFFRENCES ABOVE AND
# STORE IT IN N
N F@ V_ERR F@ F+ N F!
; EEWORD
: OUTPUT #USED TO OUPUT A 12 BIT 2'S COMPLEMENT OFFSET
# NUMER TO A DIGITAL TO ANALOG CONVERTER
1024.0E0 V_OUT F@ F<
IF PB3 ON V_OUT F@ 1024.0E0 F- V_OUT F!
ELSE PB3 OFF
THEN
512.0E0 V_OUT F@ F<
IF PB4 ON V_OUT F@ 512.0E0 F- V_OUT F!
ELSE PB4 OFF
THEN
256.0E0 V_OUT F@ F<
IF PB5 ON V_OUT F@ 256.0E0 F- V_OUT F!
ELSE PB5 OFF
THEN
128.0E0 V_OUT F@ F<
IF PB6 ON V_OUT F@ 128.0E0 F- V_OUT F!
ELSE PB6 OFF
THEN
64.0E0 V_OUT F@ F<
IF PB7 ON V_OUT F@ 64.0E0 F- V_OUT F!
ELSE PB7 OFF
THEN
32.0E0 V_OUT F@ F<
IF PA7 ON V_OUT F@ 32.0E0 F- V_OUT F!
ELSE PA7 OFF
THEN
16.0E0 V_OUT F@ F<
IF PA6 ON V_OUT F@ 16.0E0 F- V_OUT F!
ELSE PA6 OFF
THEN
8.0E0 V_OUT F@ F<
IF PA5 ON V_OUT F@ 8.0E0 F- V_OUT F!
ELSE PA5 OFF
THEN
4.0E0 V_OUT F@ F<
IF PA4 ON V_OUT F@ 4.0E0 F- V_OUT F!
ELSE PA4 OFF
THEN
2.0E0 V_OUT F@ F<
IF PA3 ON V_OUT F@ 2.0E0 F- V_OUT F!
ELSE PA3 OFF
THEN
1.0E0 V_OUT F@ F<
IF PA2 ON
ELSE PA2 OFF
THEN
; EEWORD
: OUTLOGIC #TAKES THE TOP VALUE ON THE STACK AND OUPUTS TO
#THE DAC MENTIONED ABOVE
V_OUT F!
1.0E-15 V_OUT F@ F< IF
PB2 ON
OUTPUT
THEN
V_OUT F@ 1.0E-15 F< IF
PB2 OFF
V_OUT F@ 2048 F+ V_OUT F!
OUTPUT
THEN
; EEWORD
: MAIN #TAKES A RATIO DIFFRENCE, ADDS IT TO AN ONGOING SUM, AND
#OUTPUTS THE NEW SUMS VALUE.
ERRCALC
SUM
N F@ OUTLOGIC
; EEWORD
MACHINE SPECTRUM
ON-MACHINE SPECTRUM
APPEND-STATE RUN
APPEND-STATE REST
#IF A SWITCH CONNECTED TO PA0 IS OFF
#OUTPUT 0 TO THE DAC, TURN ON YELLOW AND OFF GREEN LEDS
IN-STATE
RUN
CONDITION
PA0 OFF?
CAUSES
YELLED ON
GRNLED OFF
1.0E-10 OUTLOGIC
THEN-STATE
REST1
TO-HAPPEN
#IF THE SWITCH IS ON, TURN ON GREEN LED RUN MAIN AND BLINK THE RED #LED WHILE DOING SO.
IN-STATE
RUN
CONDITION
PA0 ON?
CAUSES
REDLED ON
GRNLED ON
MAIN
REDLED OFF
THEN-STATE
RUN
TO-HAPPEN
#WAIT IN REST UNTIL THE SWITCH GOES ON, RESET THE SUM TO 0, TAKE A
#SET POINT AND TURN OFF THE YELLOW
IN-STATE
REST
CONDITION
PA0 ON?
CAUSES
YELLED OFF
1.0E-10 N F!
SET_POINT
THEN-STATE
CHECK
TO-HAPPEN
: STARTUP #SET UP FOR INSTALL
GRNLED OFF
REDLED OFF
YELLED ON
1.0E-10 OUTLOGIC
REST SET-STATE
INSTALL SPECTRUM
; EEWORD
SAVE-RAM