EFX-TEK

TEK Talk => Prop-SX => Topic started by: cmallsop on October 12, 2012, 01:18:21 PM

Title: Zombie Thrasher Code for the SX
Post by: cmallsop on October 12, 2012, 01:18:21 PM
Does anyone have simple zombie thrasher code for the SX board? I'm looking for code that will drive two pneumatic cylinders, no music, lights or anything else. I'm looking for a 1 minute cycle with a 10 second rest. Unfortunately the Prop-1 code won't work on the SX board and I'm just not much of a programmer anymore.

Thanks in advance for your help!

Mark Allsop
Vampyre Manor
Title: Re: Zombie Thrasher Code for the SX
Post by: JonnyMac on October 15, 2012, 01:06:56 PM
Wow... I haven't written and SX code in a long time, so this really took some cleaning of the cobwebs.  I've got a Prop-1 Trainer connected to my Prop-SX (on the P8..P15 group).  P14 is used as the trigger input -- for normal use put the P14 SETUP jumper in the DN position.

Note that you may not have the SX/B compiler installed as I do so I have attached the compiled program (.SXH file). Use the Run -> Device dialog to load the .SXH file and program it into your Prop-SX.

' =========================================================================
'
'   File...... Casa_Fear_Zombie.SXB
'   Purpose...
'   Author.... JonnyMac
'   E-mail....
'   Started... 15 OCT 2012
'   Updated...
'
' =========================================================================


' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------


' -------------------------------------------------------------------------
' Conditional Compilation Symbols
' -------------------------------------------------------------------------


' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------

ID              "CasaFear"

DEVICE          SX28, OSC4MHZ, TURBO, STACKX, OPTIONX, BOR42
FREQ            4_000_000


' -------------------------------------------------------------------------
' I/O Pins
' -------------------------------------------------------------------------

UnusedRC7       PIN     RC.7 INPUT              ' SETUP = DN

Trigger         PIN     RC.6 INPUT              ' SETUP = DN

UnusedRC5       PIN     RC.5 INPUT
UnusedRC4       PIN     RC.4 INPUT
UnusedRC3       PIN     RC.3 INPUT
UnusedRC2       PIN     RC.2 INPUT

LShoulder       PIN     RC.1 OUTPUT             ' V+/OUT9
RShoulder       PIN     RC.0 OUTPUT             ' V+/OUT8

UnusedRB        PIN     RB   INPUT


' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------

IsOn            CON     1
IsOff           CON     0


' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------

lottery         VAR     Byte                    ' random #
valves          VAR     Byte
last            VAR     Byte

xTimer          VAR     Word                    ' for timing
delay           VAR     Word

tmpW1           VAR     Word                    ' for subs & funcs


' -------------------------------------------------------------------------
' Subroutine / Function Declarations
' -------------------------------------------------------------------------

DELAY_MS        SUB     1, 2                    ' delay in milliseconds

RANDOMIZE       FUNC    1, 1


' =========================================================================
  PROGRAM Start
' =========================================================================

Start:
  LShoulder = IsOff                             ' clear cylinders
  RShoulder = IsOff

  DELAY_MS 10_000                               ' (re)trigger delay

  xTimer = 0                                    ' restart debounce timer

Check_Trigger:
  lottery = RANDOMIZE lottery                   ' re-stir random #
  DELAY_MS 1
  IF Trigger = IsOff THEN
    xTimer = 0
  ELSE
    INC xTimer
  ENDIF
  IF xTimer < 100 THEN Check_Trigger

Jump:
  LShoulder = IsOn                              ' jump
  RShoulder = IsOn
  DELAY_MS 1000

  xTimer = 0                                    ' reset

Thrasher:
  lottery = RANDOMIZE lottery                   ' re-stir
  valves = lottery & %00010010                  ' isolate valve bits

  IF valves = last THEN Thrasher                ' no repeats
    last = valves                               ' save for next cycle

  LShoulder = valves.1                          ' update outputs
  RShoulder = valves.4

  lottery = RANDOMIZE lottery
  delay = lottery + 100                         ' randomze delay
  DELAY_MS delay
  xTimer = xTimer + delay
  IF xTimer < 60000 THEN
    GOTO Thrasher
  ELSE
    GOTO Start
  ENDIF


' -------------------------------------------------------------------------
' Subroutine / Function Code
' -------------------------------------------------------------------------

' Use: DELAY_MS mSecs
' -- 'mSecs' is delay in milliseconds, 1 - 65535

SUB DELAY_MS
  mSecs         VAR     __WPARAM12

  \ SB    __PARAMCNT.1                          ' skip if word passed
  \ CLR   mSecs_MSB                             ' clear MSB if byte

  PAUSE mSecs
  ENDSUB

' -------------------------------------------------------------------------

' Use: result = RANDOMIZE seed
'
FUNC RANDOMIZE
  ASM
    MOV   __PARAM2, #3                          ' run 3x

RND_Loop:
    MOV   W, __PARAM1                           ' RANDOM __PARAM1
    ADD   __PARAM1, W
    ADD   __PARAM1, W
    ADD   __PARAM1, W
    ADD   __PARAM1, W
    ADD   __PARAM1, #123
    DJNZ  __PARAM2, @RND_Loop
  ENDASM
  ENDFUNC

' -------------------------------------------------------------------------