schnelle Datenerfassung, IO-Warrior56

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

schnelle Datenerfassung, IO-Warrior56

Post by Franz Peter Zantis »

Über den SPI-Bus sollen Daten erfaßt werden. Das Problem ist die Synchronisierung. Ein Mikrocontroller gibt an einem Pin durch ein High-Signal bekannt, wenn Daten zur Verfügung stehen. Wenn ich diesen Pin mit dem IO-Warrior56 abfrage und dann über SPI die Daten abhole, dann kann dies maximal alle 40 ms erfolgen. So lange dauert es nämlich, bis das der Warrior die IO-Pins eingelesen hat und dann die Daten über SPI angefordert hat. Das ist natürlich viel zu langsam.
Nehme ich die Abfrage der Pins raus und nehme die Daten ohne Synchronisation entgegen, indem in einer Schleife nur per SPI eingelesen wird, dann kann dies alle 2 ms erfolgen. Das sind alles sehr ernüchternde Werte. Ohne Synchronisation kann es aber sein, dass die Daten gerade dann vom Warrior über SPI gelesen werden, wenn der Mikrocontroller in seinem SPI-Register die Daten einlädt. Diese Daten wären dann unbrauchbar.
Mache ich etwas zu umständlich oder falsch?


Hier der Code

Do
'test if the value can be taken; before data via SPI can be taken, Pin 4.7 has to be checked
'data(5) = 128
data(0) = 0 'in simple mode always 0
ret = IowKitRead(IOhandle, 0, data(0), 8)
If IsBitSet(data(5), 7) Then

'Initialisation IO-Warrior in special mode
ldata(0) = &H9 'indicator for sending via SPI
ldata(1) = &H2 'number of data to send (2 Bytes)
ldata(2) = &H0 'Flags
I = IowKitWrite(IOhandle, 1, setWarrior(0), 64)
'write 2 bytes of dummy data to SPI to trigger read
I = IowKitWrite(IOhandle, 1, ldata(0), 64) 'write is necessary to get values via SPI
I = IowKitRead(IOhandle, 1, ldata(0), 64)
If ldata(1) = 2 Then
'build 16 bit value
I = (ldata(2) * 256 + ldata(3))
'Debug.Print(CStr(I))
If I > max Then
max = I
'Me.TxtBxMaxVal.Text = CStr(max)
End If
If min = 0 Or I < min Then
min = I
'Me.TxtBxMinVal.Text = CStr(min)
End If

'Me.Button1.Text = CStr(I)
'objTextWriter.WriteLine(CStr(I))
End If
End If

Application.DoEvents()

If flag = True Then
Exit Do
End If
Loop
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: schnelle Datenerfassung, IO-Warrior56

Post by Christoph Jung »

Woher haben Sie denn das mit den 40ms an den IO-Pins?
Die IO-Pins können genau so schnell ausgelesen werden wie alles andere.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply