[simpits-tech] Controling simulated instruments

Biggles simpits-tech@simpits.org
Wed, 13 Mar 2002 06:02:08 +0100


This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C1CA54.9BFF54B0
Content-Type: multipart/alternative;
	boundary="----=_NextPart_001_0006_01C1CA54.9C00DB50"


------=_NextPart_001_0006_01C1CA54.9C00DB50
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

I have a small problem (big one).
Just finished constructing my first instrument (an origional IAS =
converterd to a stepper motor).
I hooked it up to a Velleman 8000 and 8005 board.
With the switches on the PCB i can controll the instrument clockwise =
with a confortable speed (full step =3D 2050.6 steps per=20
rotation in Full step mode.)

This isnt the problem.
Just how to get this baby running with Falcon4.
Weeks i have been trying to get it running with VB, but without luck.
I need some advice here because im stuck and i want at least one =
instrument running before the next Lowland gorilla meet in Holland.

Any advice or help?

I have been trying to convert the source code i got that is controlling =
the K8000 board with FS2.
But with no luck (i have no qlue where to start or to end).
My first weeks of programming and they have all been one big disaster.

Some help is wanted.

Thanks in advance,

Biggles.

p.s. the code controlling the 8000 board aswel as the 8005 code is =
includded.



------=_NextPart_001_0006_01C1CA54.9C00DB50
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2713.1100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>I have a small problem (big =
one).</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Just finished constructing my first =
instrument (an=20
origional IAS converterd to a stepper motor).</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>I hooked it up to a Velleman 8000 and =
8005=20
board.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>With the switches on the PCB i can =
controll the=20
instrument clockwise with a confortable speed (full step =3D <FONT=20
face=3D"Courier New" size=3D3>2050.6 steps per <BR>rotation in Full step =

mode.)</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" =
size=3D3>This isnt the=20
problem.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" =
size=3D3>Just how to get=20
this baby running with Falcon4.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" =
size=3D3>Weeks i have been=20
trying to get it running with VB, but without luck.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" size=3D3>I =
need some advice=20
here because im stuck and i want at least one instrument running before =
the next=20
Lowland gorilla meet in Holland.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" size=3D3>Any =
advice or=20
help?</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" size=3D3>I =
have been trying=20
to convert the source code i got that is controlling the K8000 board =
with=20
FS2.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" size=3D3>But =
with no luck (i=20
have no qlue where to start or to end).</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" size=3D3>My =
first weeks of=20
programming and they have all been one big disaster.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" =
size=3D3>Some help is=20
wanted.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" =
size=3D3>Thanks in=20
advance,</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3>Biggles.</FONT></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New"=20
size=3D3></FONT></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2><FONT face=3D"Courier New" =
size=3D3>p.s. the code=20
controlling the 8000 board aswel as the 8005 code is =
includded.</FONT></DIV>
<DIV><BR></DIV></FONT></BODY></HTML>

------=_NextPart_001_0006_01C1CA54.9C00DB50--

------=_NextPart_000_0005_01C1CA54.9BFF54B0
Content-Type: application/octet-stream;
	name="I_2CW_16.BAS"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="I_2CW_16.BAS"

Option Explicit
'COMMON USED GLOBALS AND VARIABELS
Global Const MaxIOcard% =3D 3
Global Const MaxIOchip% =3D 7
Global Const MaxIOchannel% =3D 64
Global Const MaxDACchannel% =3D 32
Global Const MaxADchannel% =3D 16
Global Const MaxDAchannel% =3D 4
Global Const StartValue% =3D 0

Global IOconfig%(MaxIOchip%)
Global IOdata%(MaxIOchip%)
Global IO%(MaxIOchannel%)
Global DAC%(MaxDACchannel%)
Global AD%(MaxADchannel%)
Global DA%(MaxDAchannel%)

Global ADDAchipCode%(MaxIOcard%)
Global DACchipCode%(MaxIOcard%)
Global IOChipCode%(MaxIOchip%)

Global Statusport As Integer
Global Controlport As Integer
Global I2Cbusdelay As Integer

'function and sub for parallel port data access
'Use just like their QuickBasic Counterparts
'Out port%,Value ----- or X% =3D Inp(Port%)

Declare Function Inp Lib "InpOut16.DLL" (ByVal port%) As Integer
Declare Sub out Lib "InpOut16.DLL" (ByVal port%, ByVal Value%)

Function BINNOT% (Dec%)
    Dim Temp$, Complement$, i%
     Temp$ =3D DecToBin(Dec%)
     Complement$ =3D ""
     For i% =3D 1 To Len(Temp$)
	If Mid$(Temp$, i%, 1) =3D "1" Then
	    Complement$ =3D Complement$ + "0"
	Else
	    Complement$ =3D Complement$ + "1"
	End If
     Next
     BINNOT% =3D BinToDec(Complement$)
End Function

Function BinToDec% (BinNumber$)
    Dim Weight%
    Dim Dec%
    Dim i%
    Weight% =3D 1
    Dec% =3D 0                       'Reset decimal number

    If BinNumber$ <> "00000000" Then
	For i% =3D Len(BinNumber$) To 1 Step -1
	    If Mid$(BinNumber$, i%, 1) =3D "1" Then
		Dec% =3D Dec% + Weight%  'If bit=3D1 then add weigth factor
	    End If
	    Weight% =3D Weight% * 2  'Multiply weight factor by 2
	Next
	BinToDec% =3D Dec%        'Store result
    Else
	BinToDec% =3D 0
    End If
End Function

Sub ClearAllDA ()
    Dim ChannelNo%
    For ChannelNo% =3D 1 To MaxDAchannel%
	OutputDAchannel ChannelNo%, 0
    Next
End Sub

Sub ClearAllDAC ()
    Dim ChannelNo%
    For ChannelNo% =3D 1 To MaxDACchannel
	DAC%(ChannelNo%) =3D 0
    Next
    UpdateAllDAC
End Sub

Sub ClearAllIO ()
    Dim ChipNo%
    For ChipNo% =3D 0 To MaxIOchip%
	IOoutput ChipNo%, 0
    Next
End Sub

Sub ClearDACchannel (ChannelNo%)
    OutputDACchannel ChannelNo%, 0
End Sub

Sub ClearDACchip (ChipNo%)
    Dim Channel%, i%
    Channel% =3D ChipNo% * 8
    For i% =3D 1 To 8
	DAC%(Channel% + i%) =3D 0
    Next
    UpdateDACchip ChipNo%
End Sub

Sub ClearDAchannel (ChannelNo%)
    OutputDAchannel ChannelNo%, 0
End Sub

Sub ClearIOchannel (ChannelNo%)
    Dim Channel%
    Dim Datavar%, ChipNo%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    Channel% =3D (ChannelNo% - 1) Mod 8
    Datavar% =3D IOdata%(ChipNo%) And BINNOT(SHL(1, Channel%))
    IOoutput ChipNo%, Datavar%
End Sub

Sub ClearIOchArray (ChannelNo%)
    Dim Channel%
    Dim Datavar%, ChipNo%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    Channel% =3D (ChannelNo% - 1) Mod 8
    Datavar% =3D IOdata%(ChipNo%) And BINNOT(SHL(1, Channel%))
    UpdateIOdataArray ChipNo%, Datavar%
End Sub

Sub ClearIOChip (ChipNo%)
    IOoutput ChipNo%, 0
End Sub

Sub ClearIOdataArray (ChipNo%)
     Dim StartChannel%
     Dim Temp%
     Dim Datavar$
     Dim Channel%
    'Update IOdata array
    IOdata%(ChipNo) =3D IOdata%(ChipNo) And IOconfig%(ChipNo)

    'Update IO array
    StartChannel% =3D ChipNo% * 8 + 1
    Temp% =3D IOdata%(ChipNo%)
    Datavar$ =3D DecToBin(Temp%)
    For Channel% =3D 0 To 7
	If Mid$(Datavar$, 8 - Channel%, 1) =3D "1" Then
	    IO%(StartChannel% + Channel%) =3D 1
	Else
	    IO%(StartChannel% + Channel%) =3D 0
	End If
    Next
End Sub

' IO CONFIGURATION SUBROUTINES
Sub ConfigAllIOasInput ()
    Dim ChipNo%
    For ChipNo% =3D 0 To MaxIOchip%
	IOconfig%(ChipNo%) =3D 0
	ClearIOChip ChipNo%
	IOconfig%(ChipNo%) =3D 255
	ReadIOchip ChipNo%
    Next
End Sub

Sub ConfigAllIOasOutput ()
    Dim ChipNo%
    For ChipNo% =3D 0 To MaxIOchip%
	IOconfig%(ChipNo%) =3D 0
    Next
    ClearAllIO
End Sub

Sub ConfigIOChannelAsInput (ChannelNo%)
    Dim Channel%, ChipNo%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    Channel% =3D (ChannelNo% - 1) Mod 8
    IOconfig%(ChipNo%) =3D IOconfig%(ChipNo%) And BINNOT(SHL(1, =
Channel%))
    ClearIOchannel ChannelNo%
    IOconfig%(ChipNo%) =3D IOconfig%(ChipNo%) Or SHL(1, Channel%)
    ReadIOchannel ChannelNo%
End Sub

Sub ConfigIOchannelAsOutput (ChannelNo%)
    Dim Channel%, ChipNo%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    Channel% =3D (ChannelNo% - 1) Mod 8
    IOconfig%(ChipNo%) =3D IOconfig%(ChipNo%) And BINNOT(SHL(1, =
Channel%))
    ClearIOchannel ChannelNo%
End Sub

Sub ConfigIOchipAsInput (ChipNo%)
    IOconfig%(ChipNo%) =3D 0
    ClearIOChip ChipNo%
    IOconfig%(ChipNo%) =3D 255
    ReadIOchip ChipNo%
End Sub

Sub ConfigIOchipAsOutput (ChipNo%)
    IOconfig%(ChipNo%) =3D 0
    ClearIOChip ChipNo%
End Sub

Function DecTo7seg (Decnumber As Integer) As Integer
' Zet een Decimaal getal van 0..9 om in een 7-segment
' tegenwaarde voor sturing van een 7 segment display
' via I2C-bus
   =20
    Dim Temp As Integer
    Select Case Decnumber
	Case 0
	    Temp =3D 63
	Case 1
	    Temp =3D 6
	Case 2
	    Temp =3D 91
	Case 3
	    Temp =3D 79
	Case 4
	    Temp =3D 102
	Case 5
	    Temp =3D 109
	Case 6
	    Temp =3D 125
	Case 7
	    Temp =3D 7
	Case 8
	    Temp =3D 127
	Case 9
	    Temp =3D 111
   End Select
DecTo7seg =3D Temp
End Function

' RADIX CONVERSION SUBROUTINES
Function DecToBin$ (Decnumber%)
    'Conversion of decimal number (0...255) to 8 bit binary string.
    '--------------------------------------------------------------
    Dim Bin$
    Dim Faktor%, i%

    Bin$ =3D ""
    Faktor% =3D 128

    If Decnumber% <> 0 Then
	For i% =3D 1 To 8
	    If Faktor% > Decnumber% Then
		Bin$ =3D Bin$ + "0"
	    Else
		Bin$ =3D Bin$ + "1"
		Decnumber% =3D Decnumber% - Faktor%
	    End If
	    Faktor% =3D Faktor% \ 2
	Next
	DecToBin$ =3D Bin$
    Else
	DecToBin$ =3D "00000000"
    End If
End Function

Function DecToHex$ (Decnumber%)
    DecToHex =3D Hex$(Decnumber%)
End Function

Function HexToDec% (Hexnumber$)
    Dim StrLength%
    Dim decl%
    Dim dech%
   =20
    Dim StrLenght%
    StrLength% =3D 0
    decl% =3D 0
    dech% =3D 0
    Hexnumber$ =3D UCase$(Hexnumber$)
    StrLength% =3D Len(Hexnumber$)
    decl% =3D Asc(Mid$(Hexnumber$, StrLength%, 1))
    If decl% >=3D Asc("A") Then
	decl% =3D decl% - Asc("A") + 10
    Else
	decl% =3D decl% - Asc("0")
    End If
    If StrLength% =3D 2 Then
	dech% =3D Asc(Mid$(Hexnumber$, 1, 1))      'Convert most significant =
digit
	If dech% > Asc("A") Then               'Digit > 9 subtract offset A...F
	    dech% =3D dech% - Asc("A") + 10
	Else
	    dech% =3D dech% - Asc("0")
	End If
    End If
    HexToDec% =3D 16 * dech% + decl%
End Function

Sub I2CBusNotBusy ()
    Dim i%
    out Controlport%, 4
    For i% =3D 0 To I2Cbusdelay%
    Next
   =20
End Sub

Sub I2Cclockpulse ()
' Veroorzaak een look-alike Ack-puls op I2C-bus
    Dim i%
    out Controlport%, 12
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 4
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 12
    For i% =3D 0 To I2Cbusdelay%
    Next
End Sub

Sub I2CInit ()
    SelectI2CprinterPort 1
    I2Cbusdelay% =3D 1
    I2CBusNotBusy
    ConfigAllIOasInput
	ClearAllDAC
	ClearAllDA
	ReadAll
End Sub

Function I2CInput% ()
    Dim Serdata%
    Dim j%, i%
    Dim Inputdata%
    Serdata% =3D 0
    For j% =3D 1 To 8
	Serdata% =3D SHL(Serdata%, 1)
	out Controlport, 4
	For i% =3D 0 To I2Cbusdelay%
	Next

	Inputdata% =3D Inp(Statusport%) And 16
	If Inputdata% <> 0 Then
	    Serdata% =3D Serdata% Or 1
	End If

	out Controlport%, 12
	For i% =3D 0 To I2Cbusdelay%
	Next
    Next
    I2CInput% =3D Serdata%
End Function

Sub I2Cmasterclockpulse ()
    Dim i%
    out Controlport%, 14
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 6
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 14
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 12
    For i% =3D 0 To I2Cbusdelay%
    Next
End Sub

Sub I2COutput (Serdata%)
    Dim Temp%
    Dim Serdat$
    Dim j%
    Dim DataOut%
    Dim i%
    Temp% =3D Serdata%
    Serdat$ =3D DecToBin(Temp%)

    For j% =3D 1 To 8

	If Mid$(Serdat$, j%, 1) =3D "1" Then
	    DataOut% =3D 12
	Else
	    DataOut% =3D 14
	End If
	out Controlport%, DataOut%
	For i% =3D 0 To I2Cbusdelay%
	Next

	DataOut% =3D Inp(Controlport%) And 7
	out Controlport%, DataOut%
	For i% =3D 0 To I2Cbusdelay%
	Next

	DataOut% =3D Inp(Controlport%) Or 8
	out Controlport%, DataOut%
	For i% =3D 0 To I2Cbusdelay%
	Next
    Next
End Sub

Sub I2Cstart ()
    Dim i%
    out Controlport%, 6
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 14
    For i% =3D 0 To I2Cbusdelay%
    Next
End Sub

Sub I2CStop ()
    Dim i%
    out Controlport%, 14
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 6
    For i% =3D 0 To I2Cbusdelay%
    Next

    out Controlport%, 4
    For i% =3D 0 To I2Cbusdelay%
    Next
End Sub

Sub init ()
' Initialiseerd de I2C Bus
    Dim i%
    out Controlport%, 4
    For i% =3D 0 To I2Cbusdelay%
    Next

End Sub

' OUTPUT SUBROUTINES
Sub IOoutput (ChipNo%, Datavar%)
    Dim Temp%
    Dim StartChannel%, Channel%
    Dim Datvar$
    Temp% =3D Datavar%
    Datavar% =3D BINNOT(Temp%) Or IOconfig%(ChipNo%)

    I2Cstart

    Temp% =3D IOChipCode%(ChipNo%)
    I2COutput Temp%

    I2Cclockpulse

    Temp% =3D Datavar%
    I2COutput Temp%

    I2Cclockpulse

    I2CStop

    IOdata%(ChipNo%) =3D (IOdata%(ChipNo%) And IOconfig%(ChipNo%)) Or =
BINNOT(Datavar%)


    StartChannel% =3D ChipNo% * 8 + 1
    Temp% =3D IOdata%(ChipNo%)
    Datvar$ =3D DecToBin(Temp%)
    For Channel% =3D 0 To 7
	If Mid$(Datvar$, 8 - Channel%, 1) =3D "1" Then
	    IO%(StartChannel% + Channel%) =3D 1
	Else
	    IO%(StartChannel% + Channel%) =3D 0
	End If
    Next
End Sub

Sub main ()
    Dim CardNo%
    Dim ChipNo%
    For CardNo% =3D 0 To MaxIOcard%
	DACchipCode%(CardNo%) =3D 64 + 2 * CardNo%
	ADDAchipCode%(CardNo%) =3D 144 + 2 * CardNo%
    Next

    For ChipNo% =3D 0 To MaxIOchip%
	IOChipCode%(ChipNo%) =3D 112 + 2 * ChipNo%
    Next

 I2CInit

End Sub

' 6 BIT DAC CONVERTER SUBROUTINES
Sub OutputDACchannel (ChannelNo%, Datavar%)
    Dim Serdata%
    If Datavar% > 63 Then
	 Datavar% =3D 63
      End If
    DAC%(ChannelNo%) =3D Datavar%

    I2Cstart

    Serdata% =3D DACchipCode%((ChannelNo% - 1) \ 8)
    I2COutput Serdata%

    I2Cclockpulse

    Serdata% =3D 240 Or ((ChannelNo% - 1) Mod 8)
    I2COutput Serdata%

    I2Cclockpulse

    I2COutput Datavar%

    I2Cclockpulse

    I2CStop
End Sub

' 8 BIT DA CONVERTER SUBROUTINES
Sub OutputDAchannel (ChannelNo%, Datavar%)
    Dim Temp%
    DA%(ChannelNo%) =3D Datavar
    I2Cstart

    Temp% =3D ADDAchipCode%(ChannelNo% - 1)
    I2COutput Temp%

    I2Cclockpulse

    I2COutput 64

    I2Cclockpulse

    I2COutput Datavar%

    I2Cclockpulse

    I2CStop
End Sub

'8 BIT AD CONVERTER SUBROUTINES
Sub ReadADchannel (ChannelNo%)
    Dim ChipCode%, Serdata%
    ChipCode% =3D ADDAchipCode%((ChannelNo% - 1) \ 4)

    I2Cstart

    I2COutput ChipCode%

    I2Cclockpulse

    Serdata% =3D 64 Or ((ChannelNo% - 1) Mod 4)
    I2COutput Serdata%

    I2Cclockpulse

    I2CStop

    I2Cstart

    Serdata% =3D ChipCode% Or 1
    I2COutput Serdata%

    I2Cclockpulse

    AD%(ChannelNo%) =3D I2CInput()

    I2Cmasterclockpulse

    AD%(ChannelNo%) =3D I2CInput()

    I2Cclockpulse

    I2CStop
End Sub

Sub ReadADchip (ChipNo%)
    Dim Channel%, Temp%, Serdata%, k%
    Channel% =3D ChipNo% * 4 + 1

    I2Cstart

    Temp% =3D ADDAchipCode%(ChipNo%)
    I2COutput Temp%

    I2Cclockpulse

    I2COutput 68

    I2Cclockpulse

    I2CStop

    I2Cstart

    Temp% =3D ADDAchipCode%(ChipNo%) Or 1
    I2COutput Temp%

    I2Cclockpulse

    Serdata% =3D I2CInput()

    For k% =3D 0 To 3
	I2Cmasterclockpulse
	Serdata% =3D I2CInput()
	AD%(Channel% + k%) =3D Serdata%
    Next

    I2Cclockpulse

    I2CStop
End Sub

'GENERAL SUBROUTINES
Sub ReadAll ()
    ReadAllIO
    ReadAllAD
End Sub

Sub ReadAllAD ()
    Dim CardNo%
    Dim ard
    For CardNo% =3D 0 To MaxIOcard%
	ReadADchip CardNo%
    Next
End Sub

Sub ReadAllIO ()
    Dim ChipNo%
    For ChipNo% =3D 0 To MaxIOchip%
	ReadIOchip ChipNo%
    Next
End Sub

Sub ReadCard (CardNo%)
    Dim ChipNo%
    ChipNo% =3D CardNo% * 2
    ReadIOchip ChipNo%
    ReadIOchip ChipNo% + 1
    ReadADchip CardNo%
End Sub

Sub ReadIOchannel (ChannelNo%)
    Dim ChipNo%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    ReadIOchip ChipNo%
End Sub

' INPUT SUBROUTINES
Sub ReadIOchip (ChipNo%)
    Dim Datavar%, StartChannel%, Temp%, Datvar$, Channel%
    I2Cstart

    Datavar% =3D IOChipCode%(ChipNo%) Or 1
    I2COutput Datavar%

    I2Cclockpulse

    IOdata%(ChipNo%) =3D I2CInput()
    IOdata%(ChipNo%) =3D BINNOT(IOdata%(ChipNo%))
    I2Cclockpulse

    I2CStop

    StartChannel% =3D ChipNo% * 8 + 1
    Temp% =3D IOdata%(ChipNo%)
    Datvar$ =3D DecToBin(Temp%)
    For Channel% =3D 0 To 7
	If Mid$(Datvar$, 8 - Channel%, 1) =3D "1" Then
	    IO%(StartChannel% + Channel%) =3D 1
	Else
	    IO%(StartChannel% + Channel%) =3D 0
	End If
    Next
End Sub

Sub SelectI2CprinterPort (PrinterNo%)
    Select Case PrinterNo
	Case 0
	    Statusport% =3D 957
	    Controlport% =3D 958
	Case 1
	    Statusport% =3D 889
	    Controlport% =3D 890
	Case 2
	    Statusport% =3D 633
	    Controlport% =3D 634
	End Select
End Sub

Sub SetAllDA ()
    Dim ChannelNo%
    For ChannelNo% =3D 1 To MaxDAchannel%
	OutputDAchannel ChannelNo%, 255
    Next
End Sub

Sub SetAllDAC ()
    Dim ChannelNo%
    For ChannelNo% =3D 1 To MaxDACchannel
	DAC%(ChannelNo%) =3D 63
    Next
    UpdateAllDAC
End Sub

Sub SetAllIO ()
    Dim ChipNo%
    For ChipNo% =3D 0 To MaxIOchip%
       IOoutput ChipNo%, 255
    Next
End Sub

Sub SetDACchannel (ChannelNo%)
    OutputDACchannel ChannelNo%, 63
End Sub

Sub SetDACchip (ChipNo%)
    Dim Channel%, i%
    Channel% =3D ChipNo% * 8
    For i% =3D 1 To 8
	DAC%(Channel% + i%) =3D 63
    Next
    UpdateDACchip ChipNo%
End Sub

Sub SetDAchannel (ChannelNo%)
    OutputDAchannel ChannelNo%, 255
End Sub

Sub SetIOchannel (ChannelNo%)
    Dim ChipNo%, Channel%, Datavar%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    Channel% =3D (ChannelNo% - 1) Mod 8
    Datavar% =3D SHL(1, Channel%) Or IOdata%(ChipNo%)
    IOoutput ChipNo%, Datavar%
End Sub

Sub SetIOchArray (ChannelNo%)
    Dim ChipNo%, Channel%, Datavar%
    ChipNo% =3D (ChannelNo% - 1) \ 8
    Channel% =3D (ChannelNo% - 1) Mod 8
    Datavar% =3D IOdata%(ChipNo%) Or SHL(1, Channel%)
    UpdateIOdataArray ChipNo%, Datavar%
End Sub

Sub SetIOchip (ChipNo%)
    IOoutput ChipNo%, 255
End Sub

Sub SetIOdataArray (ChipNo%)
     Dim Temp%, StartChannel%, Datvar$, Channel%
    ' Update IOdata array
    Temp% =3D IOconfig%(ChipNo%)
    IOdata%(ChipNo%) =3D IOdata%(ChipNo%) Or (BINNOT(Temp%))

    ' Updata IO array
    StartChannel% =3D ChipNo% * 8 + 1
    Temp% =3D IOdata%(ChipNo%)
    Datvar$ =3D DecToBin(Temp%)
    For Channel% =3D 0 To 7
	If Mid$(Datvar$, 8 - Channel%, 1) =3D "1" Then
	    IO%(StartChannel% + Channel%) =3D 1
	Else
	    IO%(StartChannel% + Channel%) =3D 0
	End If
    Next
End Sub

Function SHL% (Dec%, Positions%)
    Dim Temp$
    Temp$ =3D Right$(DecToBin(Dec%) + String$(Positions%, "0"), 8)
    SHL =3D BinToDec(Temp$)
End Function

Sub UpdateAll ()
    UpdateAllIO
    UpdateAllDAC
    UpdateAllDA
End Sub

Sub UpdateAllDA ()
    Dim ChannelNo%, Temp%
    For ChannelNo% =3D 1 To MaxDAchannel%
	Temp% =3D DA%(ChannelNo%)
	OutputDAchannel ChannelNo%, Temp%
    Next
End Sub

Sub UpdateAllDAC ()
    Dim CardNo%
    For CardNo% =3D 0 To MaxIOcard%
	UpdateDACchip CardNo%
    Next
End Sub

Sub UpdateAllIO ()
    Dim ChipNo%, Temp%
    For ChipNo% =3D 0 To MaxIOchip%
	Temp% =3D IOdata%(ChipNo%)
	IOoutput ChipNo%, Temp%
    Next
End Sub

Sub UpdateCard (CardNo%)
    Dim ChipNo%
    ChipNo% =3D CardNo% * 2
    UpdateIOchip ChipNo%
    UpdateIOchip ChipNo% + 1
    UpdateDACchip CardNo%
    UpdateDAchannel CardNo% + 1
End Sub

Sub UpdateDACchannel (ChannelNo%)
    Dim Temp%
    Temp% =3D DAC%(ChannelNo%)
    OutputDACchannel ChannelNo%, Temp%
End Sub

Sub UpdateDACchip (ChipNo%)
    Dim Serdata%, Channel%, k%, Temp%
    I2Cstart

    Serdata% =3D DACchipCode%(ChipNo%)
    I2COutput Serdata%

    I2Cclockpulse

    I2COutput 0

    I2Cclockpulse

    Channel% =3D ChipNo% * 8
    For k% =3D 1 To 8
	If DAC%(Channel% + k%) > 63 Then
	    DAC%(Channel% + k%) =3D 63
	End If
	Temp% =3D DAC%(Channel% + k%)
	I2COutput Temp%
	I2Cclockpulse
    Next

    I2CStop
End Sub

Sub UpdateDAchannel (ChannelNo%)
    Dim Temp%
    Temp% =3D DA%(ChannelNo%)
    OutputDAchannel ChannelNo%, Temp%
End Sub

Sub UpdateIOchip (ChipNo%)
    Dim Temp%
    Temp% =3D IOdata%(ChipNo%)
    IOoutput ChipNo%, Temp%
End Sub

' UPDATE IODATA & IO ARRAY SUBROUTINES
Sub UpdateIOdataArray (ChipNo%, Datavar%)
    Dim Temp%, StartChannel%, Datvar$, Channel%
    ' Update IOdata array
    IOdata%(ChipNo%) =3D IOdata%(ChipNo%) And IOconfig%(ChipNo%)
    Temp% =3D IOconfig%(ChipNo%)
    IOdata%(ChipNo%) =3D IOdata%(ChipNo%) Or (Datavar% And =
BINNOT(Temp%))

    'Update IO array
    StartChannel% =3D ChipNo% * 8 + 1
    Temp% =3D IOdata%(ChipNo%)
    Datvar$ =3D DecToBin(Temp%)
    For Channel% =3D 0 To 7
	If Mid$(Datvar$, 8 - Channel%, 1) =3D "1" Then
	    IO%(StartChannel% + Channel%) =3D 1
	Else
	    IO%(StartChannel% + Channel%) =3D 0
	End If
    Next
End Sub


------=_NextPart_000_0005_01C1CA54.9BFF54B0
Content-Type: application/octet-stream;
	name="I2CMOT16.BAS"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="I2CMOT16.BAS"

'This program contains procedures and functions for use with the =
'VELLEMAN Stepping Motor Card K8005'

Option Explicit




Global Const MaxMotorCards% =3D 15
Global Statusport%
Global ControlPort%
Global I2cBusDelay%
Global OVERWRITE%
Global WaitSpeed%

Global MotorCardCode%(MaxMotorCards%)
Global MotorCardData%(MaxMotorCards%)

Declare Function inp Lib "InpOut16.DLL" (ByVal port%) As Integer
Declare Sub out Lib "InpOut16.DLL" (ByVal port%, ByVal Value%)

Function BINNOT% (dec%)
Dim i As Integer
Dim tempstr As String
Dim complement As String

=09
	tempstr =3D DecToBin(dec%)
	complement$ =3D ""
	For i% =3D 1 To Len(tempstr)
		If Mid$(tempstr, i%, 1) =3D "1" Then
			complement$ =3D complement$ + "0"
		Else
			complement$ =3D complement$ + "1"
		End If
	Next
	BINNOT% =3D BinToDec(complement$)
End Function

Function BinToDec% (BinNumber$)
Dim weight As Integer
Dim dec As Integer
Dim i As Integer
	weight% =3D 1
	dec% =3D 0                       'Reset decimal number

	If BinNumber$ <> "00000000" Then
		For i% =3D Len(BinNumber$) To 1 Step -1
			If Mid$(BinNumber$, i%, 1) =3D "1" Then
				dec% =3D dec% + weight%  'If bit=3D1 then add weigth factor
			End If
			weight% =3D weight% * 2  'Multiply weight factor by 2
		Next
		BinToDec% =3D dec%        'Store result
	Else
		BinToDec% =3D 0
	End If
End Function

'RADIX CONVERSION
Function DecToBin$ (DecNumber%)
Dim faktor As Integer
Dim i As Integer
Dim bin As String
=09
	'Conversion of decimal number (0...255) to 8 bit binary string.
	'--------------------------------------------------------------

	bin$ =3D ""
	faktor% =3D 128

	If DecNumber% <> 0 Then
		For i% =3D 1 To 8
			If faktor% > DecNumber% Then
				bin$ =3D bin$ + "0"
			Else
				bin$ =3D bin$ + "1"
				DecNumber% =3D DecNumber% - faktor%
			End If
			faktor% =3D faktor% \ 2
		Next
		DecToBin$ =3D bin$
	Else
		DecToBin$ =3D "00000000"
	End If
End Function

Sub I2CBusNotBusy ()
	out ControlPort%, 4
End Sub

Sub I2Cclockpulse ()
Dim i As Integer
=09
	out ControlPort%, 12
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 4
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 12
	For i% =3D 0 To I2cBusDelay%
	Next
End Sub

Sub I2CINIT ()
	SelectI2CprinterPort 1
	I2cBusDelay% =3D 1

	I2CBusNotBusy
	OVERWRITE% =3D 1
	WaitSpeed% =3D 20000


End Sub

Function I2Cinput% ()
Dim serdata As Integer
Dim i As Integer
Dim j As Integer
Dim inputdata As Integer
	serdata% =3D 0

	For j% =3D 1 To 8
		serdata% =3D SHL(serdata%, 1)
		out ControlPort%, 4
		For i% =3D 0 To I2cBusDelay%
		Next

		inputdata% =3D inp(Statusport%) And 16
		If inputdata% <> 0 Then
			serdata% =3D serdata% Or 1
		End If

		out ControlPort%, 12
		For i% =3D 0 To I2cBusDelay%
		Next
	Next
	I2Cinput% =3D serdata%
End Function

Sub I2Cmasterclockpulse ()
Dim i As Integer
	out ControlPort%, 14
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 6
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 14
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 12
	For i% =3D 0 To I2cBusDelay%
	Next
End Sub

Sub I2Coutput (serdata%)
Dim dataout As Integer
Dim temp As Integer
Dim SerDat As String
Dim j As Integer
Dim i As Integer
	temp% =3D serdata%
	SerDat$ =3D DecToBin(temp%)

	For j% =3D 1 To 8

		If Mid$(SerDat$, j%, 1) =3D "1" Then
			dataout% =3D 12
		 Else
			dataout% =3D 14
		End If
		out ControlPort%, dataout%
		For i% =3D 0 To I2cBusDelay%
		Next

		dataout% =3D inp(ControlPort%) And 7
		out ControlPort%, dataout%
		For i% =3D 0 To I2cBusDelay%
		Next

		dataout% =3D inp(ControlPort%) Or 8
		out ControlPort%, dataout%
		For i% =3D 0 To I2cBusDelay%
		Next
	Next
End Sub

Sub I2Cstart ()
Dim i As Integer
	For i% =3D 0 To I2cBusDelay%
	Next
       out ControlPort%, 6
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 14
	For i% =3D 0 To I2cBusDelay%
	Next
End Sub

Sub I2Cstop ()
Dim i As Integer
	out ControlPort%, 14
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 6
	For i% =3D 0 To I2cBusDelay%
	Next

	out ControlPort%, 4
	For i% =3D 0 To I2cBusDelay%
	Next
End Sub

Sub main ()
Dim cardno As Integer
For cardno% =3D 0 To MaxMotorCards%
		MotorCardCode%(cardno%) =3D 192 + (2 * cardno%)
	Next

I2CINIT


End Sub

Sub ReadAllMotors ()
Dim counter As Integer
	For counter% =3D 0 To MaxMotorCards%
		ReadMotor counter%
	Next
End Sub

' INPUT SUBROUTINES
Sub ReadMotor (cardno%)
Dim speed As Integer
Dim datavar As Integer
	For speed% =3D 1 To WaitSpeed%: Next speed%
	I2Cstart

	datavar% =3D MotorCardCode%(cardno%) Or 1
	I2Coutput datavar%
	I2Cclockpulse

	MotorCardData%(cardno%) =3D I2Cinput()
	I2Cclockpulse

	I2Cstop
End Sub

' I2C COMMUNICATION SUBROUTINES
Sub SelectI2CprinterPort (PrinterNo%)
	Select Case PrinterNo%
		Case 0
			Statusport% =3D 957
			ControlPort% =3D 958
		Case 1
			Statusport% =3D 889
			ControlPort% =3D 890
		Case 2
			Statusport% =3D 633
			ControlPort% =3D 634
	End Select
End Sub

'OUTPUT SUBROUTINES FOR ALL CARDS
Sub SendAllMotors (Commando%, speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
Dim temp3 As Integer
temp1% =3D Commando%
temp2% =3D speed%
temp3% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
=09
	SendMotor counter%, temp1%, temp2%, temp3%
Next
End Sub

Sub SendAllSetCCW ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetCCW counter%
Next
End Sub

Sub SendAllSetCCWFull ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetCCWFull counter%
Next
End Sub

Sub SendAllSetCCWHalf ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetCCWHalf counter%
Next
End Sub

Sub SendAllSetCW ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetCW counter%
Next
End Sub

Sub SendAllSetCWFull ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
=09
	SendSetCWFull counter%
Next
End Sub

Sub SendAllSetCWHalf ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetCWHalf counter%
Next
End Sub

'SETTING SUBROUTINES FOR ALL CARDS
Sub SendAllSetFree ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetFree counter%
Next
End Sub

Sub SendAllSetFull ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetFull counter%
Next
End Sub

Sub SendAllSetHalf ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetHalf counter%
Next
End Sub

Sub SendAllSetTake ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendSetTake counter%
Next
End Sub

Sub SendAllStepCCW (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepCCW counter%, temp1%, temp2%
Next
End Sub

'STEPPING SUBROUTINES FOR ALL CARDS
Sub SendAllStepCCWFull (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepCCWfull counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepCCWHalf (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepCCWHalf counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepCW (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepCW counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepCWFULL (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
=09
	SendStepCWfull counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepCWHalf (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepCWHalf counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepFull (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepFull counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepHalf (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
=09
	SendStepHalf counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStepping (speed%, Steps%)
Dim counter As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp1% =3D speed%
temp2% =3D Steps%
For counter% =3D 0 To MaxMotorCards%
	SendStepping counter%, temp1%, temp2%
Next
End Sub

Sub SendAllStop ()
Dim counter As Integer
For counter% =3D 0 To MaxMotorCards%
	SendStop counter%
Next
End Sub

' OUTPUT SUBROUTINES FOR ONE CARD
Sub SendMotor (MotorNo%, Commando%, speed%, Steps%)
Dim counter As Integer
Dim temp As Integer

	If OVERWRITE% =3D 0 Then
		MotorCardData%(MotorNo%) =3D 127
		While (MotorCardData%(MotorNo%) <> 1) And (MotorCardData%(MotorNo%) <> =
255)
		ReadMotor (MotorNo%)
		Wend
	End If
      =20
	For counter =3D 1 To WaitSpeed%: Next
	I2Cstart

	temp% =3D MotorCardCode%(MotorNo%)
	I2Coutput temp%

	I2Cclockpulse
=09
	temp% =3D Commando%
	I2Coutput temp%

	I2Cclockpulse
=09
	temp% =3D speed%
	I2Coutput temp%

	I2Cclockpulse
=09
	temp% =3D (Steps% - (Steps% Mod 255)) / 255
	I2Coutput temp%
      =20
	I2Cclockpulse

	temp% =3D Steps% Mod 255
	I2Coutput temp%
	I2Cclockpulse
      =20
	I2Cstop

End Sub

Sub SendSetCCW (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 96, 0, 0
End Sub

Sub SendSetCCWFull (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 112, 0, 0
End Sub

Sub SendSetCCWHalf (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 120, 0, 0
End Sub

Sub SendSetCW (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 64, 0, 0
End Sub

Sub SendSetCWFull (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 80, 0, 0
End Sub

Sub SendSetCWHalf (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 88, 0, 0
End Sub

' SETTING SUBROUTINES FOR ONE CARD
Sub SendSetFree (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 4, 0, 0
End Sub

Sub SendSetFull (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 16, 0, 0
End Sub

Sub SendSetHalf (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 24, 0, 0
End Sub

Sub SendSetTake (MotorNo%)
Dim temp As Integer
temp% =3D MotorNo%
SendMotor temp%, 6, 0, 0
End Sub

' STEPPING PROCEDURES ONE CARD
Sub SendStepCCW (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 231, temp1%, temp2% Else SendMotor =
temp%, 230, temp1%, temp2%
End Sub

Sub SendStepCCWfull (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 247, temp1%, temp2% Else SendMotor =
temp%, 246, temp1%, temp2%
End Sub

Sub SendStepCCWHalf (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 255, temp1%, temp2% Else SendMotor =
temp%, 254, temp1%, temp2%
End Sub

Sub SendStepCW (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 199, temp1%, temp2% Else SendMotor =
temp%, 198, temp1%, temp2%
End Sub

Sub SendStepCWfull (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 215, temp1%, temp2% Else SendMotor =
temp%, 214, temp1%, temp2%
End Sub

Sub SendStepCWHalf (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 223, temp1%, temp2% Else SendMotor =
temp%, 222, temp1%, temp2%
End Sub

Sub SendStepFull (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 151, temp1%, temp2% Else SendMotor =
temp%, 150, temp1%, temp2%
End Sub

Sub SendStepHalf (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 159, temp1%, temp2% Else SendMotor =
temp%, 158, temp1%, temp2%
End Sub

Sub SendStepping (MotorNo%, speed%, Steps%)
Dim temp As Integer
Dim temp1 As Integer
Dim temp2 As Integer
temp% =3D MotorNo%
temp1% =3D speed%
temp2% =3D Steps%
If Steps% =3D 0 Then SendMotor temp%, 135, temp1%, temp2% Else SendMotor =
temp%, 134, temp1%, temp2%
End Sub

Sub SendStop (MotorNo%)
Dim temp As Integer
Dim temp1 As Integer
temp% =3D MotorNo%
temp1% =3D OVERWRITE%
OVERWRITE% =3D 1
SendMotor temp%, 0, 0, 0
OVERWRITE% =3D temp1%
End Sub

Function SHL% (dec%, Positions%)
Dim tempstr As String
	tempstr =3D Right$(DecToBin(dec%) + String$(Positions%, "0"), 8)
	SHL =3D BinToDec(tempstr)
End Function

Sub SpeedTestNText ()
Dim counter As Integer
Dim reliable As Integer
Dim counter2 As Integer

WaitSpeed =3D 2000
MotorCardData(0) =3D 2
I2cBusDelay =3D 0
counter =3D 0
Do
      counter =3D counter + 1
      I2cBusDelay =3D counter
      ReadMotor (0)
Loop Until ((MotorCardData(0) =3D 1) Or (counter =3D 32000))

Do
    reliable =3D 1
    I2cBusDelay =3D counter
    For counter2 =3D 1 To 30
	   ReadMotor (0)
	   If MotorCardData(0) <> 1 Then reliable =3D 0
	Next counter2
    If reliable <> 1 Then counter =3D counter + 1
Loop Until reliable =3D 1

End Sub

Sub SpeedTestText ()
Dim counter As Integer
Dim reliable As Integer
Dim counter2 As Integer

WaitSpeed =3D 2000
MsgBox "TEST PROGRAM K8005 FOR QuickBasic"
I2CBusNotBusy
MsgBox "I2C bus is free, set the K8005 to work as steppermotorcard zero =
and switch the unit on"
MotorCardData(0) =3D 2
I2cBusDelay =3D 0
counter =3D 0
Do
      counter =3D counter + 1
      I2cBusDelay =3D counter
      ReadMotor (0)
Loop Until ((MotorCardData(0) =3D 1) Or (counter =3D 32000))

MsgBox "Value found for the I2CBusDelay" + Str$(counter)

Do
    reliable =3D 1
    MsgBox "Testing reliability of value", counter
    I2cBusDelay =3D counter
    For counter2 =3D 1 To 30
	   ReadMotor (0)
	   If MotorCardData(0) <> 1 Then reliable =3D 0
	Next counter2
    If reliable =3D 1 Then MsgBox "Value " + Str$(counter) + " is OK as =
value for I2CBusDelay" Else counter =3D counter + 1
Loop Until reliable =3D 1


End Sub


------=_NextPart_000_0005_01C1CA54.9BFF54B0--