This code communicates between a BX-24 and a PAK-VII coprocessor. Since the PAK-VII uses the same protocol as the PAK-I, II, III, IV, VIII, and IX, the same code should work with these coprocessors also. Only the commands (and possibly the bit length of the response) would be different.

This nicely commented code is courtesy of Mark L. Newell. Thanks Mark!

' This is PAK-VII code for the BX-24
' Courtesy of Mark L. Newell
' This code issues PAK-VII resets and then reads the TICK register
' With changes to the commands (and the number of bits read), this should work
' for PAK-I, II, III, IV, VII, VIII, or IX
' (PAK-V and VI use RS-232)

dim result as integer ' 16 bit result of shiftin
const pak7outputpulse as integer = 4 ' (in 1.085 usec units) about 4.34usec 
'********************* Main Program ************************************************* 
public Sub Main()
const PAK7OneSecTimer as byte = bx00110001 '
const PAK7Reset as byte = bx11111111 '
const PAK7CLK as byte = 10 ' BX-24 pin for Clocking
const PAK7Sin as byte = 11 ' BX-24 pin for sending bits to PAK7
const PAK7Sout as byte = 11 ' BX-24 pin for receiving bits from PAK7
'********************* Issue a PAK7 comm sys reset *************************************
call PutPin (PAK7Sin, bxoutputlow) ' make sure sin is low
call PutPin (PAK7CLK, bxoutputhigh) ' set clock high
call PulseOut (PAK7Sin, pak7outputpulse, bxoutputhigh) ' pulse PAK7Sin
call PutPin (PAK7CLK, bxoutputlow) ' set clock low 
call delay(0.001) ' let it settle down
'********************* Issue a PAK7 FRESET *********************************************
call PAKShiftOut(PAK7Sin,PAK7CLK,PAK7Reset)
call delay(0.001) ' let it settle down 
'********************* Loop to track seconds *******************************************
call PAKShiftOut(PAK7Sin ,PAK7CLK, PAK7OneSecTimer) 'use project watch widow
result=PAKShiftin (PAK7Sout ,PAK7CLK) 'to track result
End Sub

'******************** Procedure to shift a 8 bit cmd to the PAK7 **********************
sub PAKShiftOut(ByVal Dpin as byte, _
ByVal Cpin as byte, _
ByVal CMD as byte)
dim lpctr as integer
dim pinstate as byte
for lpctr = 7 to 0 step -1
if (getbit(cmd,cbyte(lpctr)) = 1) _ 
  pinstate = bxoutputhigh ' it is a one
  pinstate = bxoutputlow ' it as a zero
end if
call PutPin(Dpin,pinstate) ' set data line appropriate
call PulseOut(Cpin,pak7outputpulse,bxoutputhigh) ' pulse the line for next bit
end sub 
'********************* Integer function to get 16 bits from PAK7 ***********************
function PAKShiftIn(ByVal Spin as byte, _
ByVal Cpin as byte) as integer
dim idx1 as integer
dim idx2 as integer
dim pakreturn as integer
dim pak7outbit as byte
for idx1 = 0 to 1 ' the low byte comes in first
  for idx2 = 7 to 0 step -1 ' get eight bits
    pak7outbit = GetPin(spin) ' get the value on Data pin
    call PulseOut(Cpin,pak7outputpulse,bxoutputhigh) ' pulse the Clock
    call putbit(pakreturn,cbyte((idx1*8)+idx2) ,pak7outbit)' insert bit in return
PAKShiftIn = pakreturn
end function 

To adapt this to different PAKs you'd probably want to change the PAKShiftIn call so it only reads a byte at a time. Just remove the "for idx1" line and replace it with idx1=0 (be sure to remove the corresponding "next" command). Or, rewrite the putbit call to not refer to idx1 at all. Then you could read single bytes easily and assemble them as necessary for the particular PAK you are working with.

Site contents © 1997-2018 by AWC, Houston TX    (281) 334-4341