Link here

Power I/O Forth Demo


This demonstration program is included to provide an example of instrumentation using the Power I/O Wildcard. This Forth language demo shows how simple it is to use the 8 opto-isolated current-sinking MOSFET outputs provided by the Power I/O Wildcard. The example program first initializes the DC solid state relays (SSR). Then a the outputs are individually turned on and off in sequence. The 4 inputs are then read and printed out to the serial terminal. This gives you a simple example of how to use this card.

Listing 1-2 Forth Code to control the Power I/O Module.

\ *********************************************************************
\ FILE NAME:   powerio.4TH
\ ---------------------------------------------------------------------
\ AUTHOR:      BEN MORSE
\ DATE:        5/7/2009
\ VERSION:     1.0
\ ---------------------------------------------------------------------
\ This is the driver code for the Power I/O Wildcard.
\ This code:
\     -Turns each output on.
\     -Returns the state of the ouputs.
\     -Turns each output off.
\     -Returns the state of the inputs.
\ ---------------------------------------------------------------------
\ Important user words:
\ SetOutput:             Turn the specified output ON
\ ClearOutput:           Turn the specified output OFF
\ ReadOutput:            Returns the state of all outputs.
\ ReadInput:             Returns the state of all 4 inputs.
\ WPWR_MODULE_NUM        this constant MUST match hardware jumper settings!
\ ---------------------------------------------------------------------
\
\ Disclaimer: THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
\             ANY WARRANTIES OR REPRESENTATIONS EXPRESS OR IMPLIED,
\             INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES
\             OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
\
\ *********************************************************************
 
BASE @ HEX
FIND WHICH.MAP          \ WHICH.MAP does not exist in the V6.xx kernel.
IFTRUE                  \ Do this only for page-swapping platforms, ie V4.xx
  EXECUTE  0=           ( -- standard.map? ) \ run which.map
  IFTRUE 4 PAGE.TO.RAM  \ if in standard.map, transfer to download map
         5 PAGE.TO.RAM
         6 PAGE.TO.RAM
         DOWNLOAD.MAP
  ENDIFTRUE             \ nesting is allowed if ends are sequential
ENDIFTRUE
 
FIND USE.PAGE   \ only in V4.xx kernels
IFTRUE
    XDROP         ( -- ) \ drop xcfa
    4 USE.PAGE    \ comment this out if memory map is already set up
ENDIFTRUE
 
\ the following line includes a do-nothing file if kernel V6.xx is used
\ (ie, if IO.C@, IO.C!, etc. are already defined):
#include "..\..\libraries\include\QED_QCard_IO.4th"
 
F WIDTH !                              \ Set width of names stored in dictionary
 
ANEW PWR.CODE                            \ Forget marker for easy re-loading.
 
 
00 CONSTANT OUTPUT_OFFSET
01 CONSTANT INPUT_OFFSET
 
\ bit = a bit mask with 1’s in the position of the bits to be set.
\ module_num = the hardware jumper setting described in Table 1-2.
\ Valid module numbers are 0 to 7.
: SETOUTPUT ( b1/b2 -- | b1 = bit, b2 = module_num )
locals{ &module &bit }
  &bit OUTPUT_OFFSET &module IO.SET.BITS
;
 
\ bit = a bit mask with 1’s in the position of bits to be cleared.
\ module_num = the hardware jumper setting described in Table 1-2.
\ Valid module numbers are 0 to 7.
: CLEAROUTPUT ( b1/b2 -- | b1 = bit, b2 = module_num )
locals{ &module &bit }
  &bit OUTPUT_OFFSET &module IO.CLEAR.BITS
;
 
\ module_num = the hardware jumper setting described in Table 1-2.
\ Valid module numbers are 0 to 7.
: READOUTPUT ( b1 -- b2 | b1 = module_num, b2 = output_status )
  OUTPUT_OFFSET SWAP IO.C@
;
 
\ module_num = the hardware jumper setting described in Table 1-2.
\ Valid module numbers are 0 to 7.
: READINPUT ( b1 -- b2 | b1 = module_num, b2 = input_status )
  INPUT_OFFSET SWAP IO.C@
;
 
 
: TEST.MOD ( byte -- \ byte = module.no )
LOCALS{ &module.no }
 
BASE @ HEX
 
CR ." press enter to turn on the first output."
KEY  DROP
1 &module.no SETOUTPUT \ turn on 1st output
CR ." press enter to turn on the second output."
KEY  DROP
2 &module.no SETOUTPUT \ turn on 2nd output
CR ." press enter to turn on the third output."
KEY  DROP
4 &module.no SETOUTPUT \ turn on 3rd output
CR ." press enter to turn on the forth output."
KEY  DROP
8 &module.no SETOUTPUT \ turn on 4th output
 
CR ." the outputs report a state of: 0x"
&module.no READOUTPUT . ." (should be 0xF)"
 
CR ." press enter to turn on the fifth output."
KEY  DROP
10 &module.no SETOUTPUT \ turn on 5th output
CR ." press enter to turn on the sixth output."
KEY  DROP
20 &module.no SETOUTPUT \ turn on 6th output
CR ." press enter to turn on the seventh output."
KEY  DROP
40 &module.no SETOUTPUT \ turn on 7th output
CR ." press enter to turn on the eighth output."
KEY  DROP
80 &module.no SETOUTPUT \ turn on 8th output
 
CR ." the outputs report a state of: 0x"
&module.no READOUTPUT . ." (should be 0xFF)"
 
 
CR ." press enter to turn off the first output."
KEY  DROP
1 &module.no CLEAROUTPUT \ turn off 1st output
CR ." press enter to turn off the second output."
KEY  DROP
2 &module.no CLEAROUTPUT \ turn off 2nd output
CR ." press enter to turn off the third output."
KEY  DROP
4 &module.no CLEAROUTPUT \ turn off 3rd output
CR ." press enter to turn off the forth output."
KEY  DROP
8 &module.no CLEAROUTPUT \ turn off 4th output
CR ." press enter to turn off the fifth output."
KEY  DROP
10 &module.no CLEAROUTPUT \ turn off 5th output
CR ." press enter to turn off the sixth output."
KEY  DROP
20 &module.no CLEAROUTPUT \ turn off 6th output
CR ." press enter to turn off the seventh output."
KEY  DROP
40 &module.no CLEAROUTPUT \ turn off 7th output
CR ." press enter to turn off the eighth output."
KEY  DROP
80 &module.no CLEAROUTPUT \ turn off 8th output
 
CR ." ------------------------------------------"
CR ." press enter to read all four inputs."
KEY  DROP
&module.no READINPUT DUP DUP DUP
CR ." Input:   State:"
 
CR ."  1        "
1 AND       \ Compare digital input with hex 0x1
IF                    \ input is high
  ." HIGH"
ELSE                \ turn relay on
  ." LOW"
ENDIF
 
CR ."  2        "
2 AND             \ Compare input with hex 0x2
IF                    \ input is high
  ." HIGH"
ELSE                \ turn relay on
  ." LOW"
ENDIF
 
CR ."  3        "
4 AND       \ Compare input with hex 0x4
IF                    \ input is high
  ." HIGH"
ELSE                \ turn relay on
  ." LOW"
ENDIF
 
CR ."  4        "
8 AND       \ Compare input with hex 0x8
IF                    \ input is high
  ." HIGH"
ELSE                \ turn relay on
  ." LOW"
ENDIF
CR
BASE !
;
 
 
 
FIND WHICH.MAP
IFTRUE EXECUTE
        IFTRUE 4 PAGE.TO.FLASH
               5 PAGE.TO.FLASH
               6 PAGE.TO.FLASH STANDARD.MAP
        ENDIFTRUE
ENDIFTRUE
BASE !
 
SAVE



More Examples → Power I/O C Demo
Power I/O Wildcard User Guide

 
This page is about: DC Solid State Relays, SSR, Optically Isolated, High Current Outputs – This Forth language demonstration program shows how simple it is to use the 8 opto-isolated current-sinking MOSFET outputs provided by the Power I/O Wildcard.
 
 
Navigation