--------------LISTING--OF--ANIMATRONIC--SEQUENCER--PROGRAM------------
' COSTUME MASK ANIMATRONICS SEQUENCER
' -----------------------------------
' COPYRIGHT (C) 1996 BY KEVIN KELM
' ALL RIGHTS RESERVED
' PERMISSION TO USE GRANTED FOR HOBBY, NON-PROFIT USE ONLY.
' CONTACT kkelm@triggur.org FOR ALL OTHER USAGE PERMISSIONS.
'
' VERSION: 1.0
' 1.0: initial creation, testing. 12/28/96
nummotors CON 2 ' # motors in costume
maxmotor CON nummotors-1
numpositions CON 6 ' # positions in sequence
maxpos CON numpositions-1
positionsize CON nummotors
numsequences CON 4 ' # sequences in memory
maxseq CON numsequences-1
sequencesize CON nummotors * numpositions + 1
buflen CON numsequences * sequencesize
buf DATA WORD (buflen)
i VAR WORD ' general looping
j VAR WORD ' general looping
btmp0 VAR BYTE ' for debounce
btmp1 VAR BYTE ' for debounce
btmp2 VAR BYTE ' for debounce
btmp3 VAR BYTE ' for debounce
btmp4 VAR BYTE ' for debounce
rtmp VAR WORD ' for randomizing
progit VAR IN11 ' program or run mode?
thumb CON 7 ' thumb button
fore VAR IN6 ' forefinger button
middle VAR IN5 ' middle finger button
nseq CON 11 ' next sequence/program selector
npos CON 12 ' next position
nmot CON 13 ' next motor
mdec CON 14 ' motor decrement
minc CON 15 ' motor increment
baud CON 84+$4000 ' baud rate to motion controller
delta CON 1 ' ticks to move the motor (pgrm mode)
cseq VAR WORD ' current sequence #
seqptr VAR WORD ' pointer to cseq
cpos VAR WORD ' current position #
maxposseq VAR WORD ' max pos # in cseq
' WARNING: maxposseq currently not used
cmot VAR WORD ' current motor #
countdown VAR WORD ' ticks til next move
countdownreset CON 30 ' 30 * 100ms = 3s delay
maxrandval CON 15 ' because 'RANDOM' seems broken
randvals DATA 1,2,5,4,1,0,3,5,1,2,0,4,1,2,5,3
crand VAR BYTE ' current 'random' offset
dirs = 0 ' set I/O pin directions
dir0 = 1
btmp0 = 0
btmp1 = 0
btmp2 = 0
btmp3 = 0
btmp4 = 0
cseq = 0
crand = 0
GOSUB new_sequence
IF progit = 1 THEN do_program ' goto program mode if sequence on
do_run: ' move motors in sequence
BUTTON thumb,1,255,100,btmp0,1,do_rseq
PAUSE 100
countdown = countdown - 1
IF countdown > 0 THEN do_run1
READ randvals+crand,cpos
crand = crand + 1
IF crand <= maxrandval THEN do_run2
crand = 0
do_run2:
cpos = cpos // numpositions
GOSUB set_motors
countdown = countdownreset
do_run1:
GOTO do_run
do_rseq: ' new sequence selected
cseq = fore * 2 + middle ' value 0..3
GOSUB new_sequence
GOTO do_run
do_program:
IF progit = 1 THEN do_program ' wait for button up
prog_loop:
BUTTON nseq,1,255,100,btmp0,1,do_pseq
BUTTON npos,1,255,100,btmp1,1,do_ppos
BUTTON nmot,1,255,100,btmp2,1,do_pmot
BUTTON mdec,1,250,1,btmp3,1,do_pdec
BUTTON minc,1,250,1,btmp4,1,do_pinc
GOTO prog_loop
do_pseq: ' select a new sequence
cseq = cseq + 1
IF cseq <= maxseq THEN do_pseq1
cseq = 0
do_pseq1:
GOSUB new_sequence
GOTO prog_loop
do_ppos: ' select a new position
cpos = cpos + 1
IF cpos <= maxposseq THEN do_ppos1
cpos = 0
do_ppos1:
GOSUB set_motors
GOTO prog_loop
do_pmot: ' select a new motor
cmot = cmot + 1
IF cmot <= maxmotor THEN do_pmot1
cmot = 0
do_pmot1:
GOSUB set_motors
GOTO prog_loop
do_pdec: ' decrement motor pos
READ cpos * positionsize + seqptr + cmot,j
IF j > delta THEN do_pdec1
j = 0
GOTO do_pdec2
do_pdec1:
j = j - delta
do_pdec2:
WRITE cpos * positionsize + seqptr + cmot, j
GOSUB set_motors
GOTO prog_loop
do_pinc: ' increment motor pos
READ cpos * positionsize + seqptr + cmot,j
IF 254 - delta > j THEN do_pinc1
j = 254
GOTO do_pinc2
do_pinc1:
j = j + delta
do_pinc2:
WRITE cpos * positionsize + seqptr + cmot, j
GOSUB set_motors
GOTO prog_loop
set_motors: ' move all motors
FOR i = 0 TO maxmotor
READ cpos * positionsize + seqptr + i, j
SEROUT 0,baud,1,[255,i,j]
NEXT
RETURN
new_sequence:
seqptr = cseq * sequencesize
' READ seqptr,maxposseq
maxposseq = maxpos
seqptr = seqptr + 1
countdown = countdownreset
cpos = 0
GOSUB set_motors
RETURN
---------------------------END--OF--LISTING---------------------------
Click here to go back to the main construction page.
Copyright (C) 1996, 1997 by Kevin Kelm