Hello everyone,

††††††††††††††††††††††††

†††††††† Feels good to get back to my favorite pastime: designing hardware/software

†††††††† projects for the ZX81. This time we mix a little hardware and software and

††††† †††squeeze more performance out of two simple chips than you might think

††††††† possible, all of which echoes the simplicity of the original ZX81 design.

 

†††††††† †††††† ††††††† A PROPORTIONAL JOYSTICK INTERFACE

††††††††††††††††††††† †††††† †††††††1996 - wilf rigter - Revised 2005

††††††††

†††††††† WHAT IT IS

††††††††

†††††††† This 2 chip (74HC138 and 74HC245) joystick interface provides 8 analog

†††††††† inputs with 5 bit accuracy and is suitable for connecting 2 proportional

†††††††† (IBM/APPLE) joysticks complete with left/right fire button inputs.

†††††††† It can also be used for making 8 analog measurements which use resistive

†††††††† transducers such as thermistors, CdS photocells, pressure sensitive __

†††††††† resistors, servo position encoders, potentiometers, etc.

†††††††† In this project, the 245 bi-directional buffer is used as a threshold

†††††††† detector to measure the time constant of a simple resistor and capacitor

†††††††† network. This CMOS digital logic chip is not an analog device but its

†††††††† accuracy is sufficient for a joystick interface and similar applications.

†††††††† I used a SN74HC245 chip made by TI. Other chips may require different

†††††††† RC values.

†††††††

 

 

†††††††† HOW THE HARDWARE WORKS

††††††††

†††††††† The 74HC138 is used as a conventional I/O decoder and I used Q6 for

††††††† address F5 in this application but any other decoder output except Q0

†††††††† can be used.

††††††††

††††††† A 3300 pf capacitor is connected between a HC245 input and ground and a

†††††††joystick potentiometer (100K) or switch is connected from the input and

†††††††† the joystick common line to +5V. A 4.7K series resistor is sets the

†††††††† minimum value for R. Most joysticks also include a ZERO adjustment pot.

 

†††††††† The joystick resistance is measured by first discharging the capacitor

†††††††† by writing a zero to the output port and then sampling the inputs 32

†††††††† times with a fast software loop and recording the samples in memory.

†††††††† The RC values are approximate and should be adjusted to match the

†††††††† joystick pot values and 245 chip. For example a 40K pot required a

†††††††† 0.01 uF cap and a minimum 2K series resistor.

††††††††

††††††† If a switch is used instead of a pot you will of course only be able to

†††††††† read a two state output. Light Dependent Resistors and thermistors will

†††††††† need calibration and linearization. Some experimentation may be required

††††††† to give the desired results.

†††††††† ††††††††

†††††††† HOW THE SOFTWARE WORKS

††††††††

†††††††† The hardware and sampling software are tightly coupled in this simple

†††††††† hardware circuit. The interface is designed to be used in the SLOW mode

†††††††† and a special software routine is required to sample during a time when

†††††††† it cannot be interrupted by the Non Maskable Interrupt (NMI). This is

†††††††† accomplished by hooking the I/O sampling routine into the ZX video service

†††††††† routines.

†††††††

†††††††† The annotated listing 1 shows how SAMPLE is embedded between the video

†††††††† service routines right after DPILE processing and before NMI is enabled.

†††††††† The VIDEO1 routine can only be started indirectly by calling START to

†††††††† change the video routine vector in the IX register to the start of the

†††††††† VIDEO1 routine.

††††††††

Note the use of the INIR instruction to transfer 32 samples from the I/O

†††††††† port to the system variable Printer Buffer (PRBUFF). The VIDEO1 routine

†††††††† has a constant execution time.

††††††††

†††††††† The DECODE software executes in a variable time and must be called from

†††††††† the application program. DECODE converts the stored samples to analog values

†††††††† 0 to 31 which are then stored into a variable array of Character values

†††††††† representing the time constant of each input. The 32 samples in the PRBUPF

†††††††† are scanned S times and bits are tested with a bit mask in C until the bit

†††††††† is 1 or the loop counter in B is zero. In either case the value in B is

†††††††† stored in the corresponding variable byte. The decoded analog values can

†††††††† be used by BASIC or ML programs for example:

††††††††††

 

†††††††† 10 DIM A$(8)

†††††††† 20 RAND USR 16518

††††††† 30 RAND USR 16516

†††††††† 40 PRINT AT 0,0; A$

†††††††† 50 GOTO 30

††††††††

†††††††† If you would like to experiment, you can store the analog values directly

†††††††† to the screen by replacing the instruction LD HL, (4010) at the start of

†††††††† DECODE with LD DE, (400C) and using the following BASIC code.

††††††††

†††††††† 10 DIM A$(8)

†††††††† 20 RAND USR 16518

†††††††† 30 RAND USR 16516

†††††††† 40 GOTO 30

††††††††

†††††††† And finally an example of positioning software which assumes that the

†††††††† joystick X and Y pots are connected to input 0 and 1:

††††††††

†††††††† 10 DIM AS (8)

†††††††† 20 RARD USR 16518

†††††††† 30 RAND USR 16516

†††††††† 40 PLOT (CODE A$(l)),(CODE A$(2))

†††††††† 50 GOTO 40

††††††††††††††††

††††††††††† †††††††††††††††† ††LISTING 1

†††††††† †††††††††††††I/O SAMPLER ROUTINE 1996 WILF RIGTER

††††††††

††††††††

†††† CONVERT†††††† JR DECODE †††† ;CALL WITH RAND USR 16516 TO DECODE SAMPLES

†††† START†††††††† LD IX,VIDEO1 ;CALL WITH RAND USR 16518 TO START SAMPLE

††††††††††††† †††† RET†††††††††† ;BY INTERCEPTING THE ZX VIDEO ROUTINE

††††††

†††† VIDEO1††††††† LD A,R†††††† ;THE VIDEO / SAMPLING ROUTINE

††††††††††††† †††† LD BC,l901†† ;24 LINES OF VIDEO

††††††††††††† †††† LD A,F5††††† ;DELAY

††††††††††††† †††† CALL 2B5†††† ;JP TO DFILE

†††††††††††††††† ††††††††††††††††

††† SAMPLE††††††† XOR A†††††††† ;NOW WE DO THE ACTUAL SAMPLING

††††††††††††† †††† OUT 5F,A†††† ;DISCHARGE THE CAPS

††††††††††††† †††† LD HL,40C3††† ;USE THE PRINTER BUFFER @ 403C

†††††††† †††† †††† LD BC,205F††† ;TO STORE 32 BYTES

††††††††††††† †††† INIR††††† †††† ;AT 150,000 SAMPLES/S

†††††† ††††††††††††††††

†††† VIDEO2††††††† CALL 292†††† ;NOW THE APPLICATION CODE

††††††††††††† †††† CALL 220†††† ;AND VSYNC

††††††††††††† †††† LD IX,SAMPLE;RESTORE SAMPLE VECTOR IN IX

††††††††††††† †††† JP 2A4††††††† ;RETURN TO APPLICATION

††††††††

†††††††† †††††††††††††† †††† †††† ;SCAN AND CONVERT THE SAMPLE BYTES

†††† DECODE††† ††††††††††††† †††† ;INTO 8 ANALOG VALUES BETWEEN 0-31

†††††††† †††† †††† LD HL,(4010);START OP BASIC VARIABLES

†††††††† †††† †††† LD DE,0006 †† ;SKIP THE HEADER

†††††††† †††† †††† ADD HL,DE †††† ;FIRST ELEMENT OF AS ARRAY

†††††††† †††† †††† LD C,01†††††† ;SET UP BIT MASK BIT 0

†††† LOOP1†††††††† LD DE,403C††† ;START OF PRINTER BUFFER

†††††††† †††† †††† LD B,1F†††††† ;VALUE COUNTER

††† LOOP2 ††††††† LD A, (DE)††† ;GET SAMPLE

†††††††† †††† †††† AND C†††††††† ;COMPARE BIT

†††††††† †††† †††† JR Z LOOP3††† ;RECORD VALUE IF BIT IS 1

†††††††† †††† †††† INC DE††††††† ;NEXT SAMPLE BYTE

†††††††† †††† †††† DJNZ LOOP2††† ;LAST SAMPLE BYTE?

†††† LOOP3†††††††† LD A,B †††††† ;RECORD VALUE

†††††††† †††† †††† LD (HL),A;††† STORE TO VARIABLE

†††††††† †††† †††† INC HL††††††† ;NEXT VARIABLE

†††††††† †††† †††† RLC C†††††††† ;NEXT BIT

†††††††† †††† †††† JR NC LOOP1 ;ANY MORE BITS

†††††††† †††† †††† RET†††††† ;RETURN IF LAST BIT DONE

†††††††

††††††††

†††††††† THE CREDITS

††††††††

†††††††† This project is simplified version of Fred Nachbaurís Proportional

†††††††† Joystick Interface (PSI) in one of his excellent ZX BREADBOARDER

††††††† articles written up in 1989 in ZXAPPEAL, the Vancouver Sinclair

††††††† User Group newsletter

†††††

††††††† Fredís design uses 3 chips including a 556 type timer to measure

††††††† 2 analog voltages and two switch inputs.

††††††

†††††††

www.000webhost.com