Basiswissen, schreiben und lesen der Ports
Moderator: Guido Körber
Basiswissen, schreiben und lesen der Ports
Hallo,
ich habe den IOW56 vorgelegt bekommen und soll damit Werte einlesen und schreiben.
Habe mir das Basis IO Beispielprogramm unter VB6 angeschauft und einige Beiträge hier Forum gelesen.
Vom grundsätzlichen Aufbau habe ich hoffentlich die Sache verstanden.
Ich lese immer einen ganzen Port (=8pins) aus, bzw. beschreibe ihn entsprechend.
Zum auslesen muss ich den Port vorher auf high setzen (richtig?).
Dies muss ich doch aber nur einmal tun, danach kann ich den Port so oft ich will abfragen?
Zum beschreiben: Muss ich nach dem schreiben eines Port diesen auch wieder "zurücksetzen" oder ähnliches bevor ich diesen auf neue Werte setzen kann?
Danke für Eure Hilfe.
Stepyi
ich habe den IOW56 vorgelegt bekommen und soll damit Werte einlesen und schreiben.
Habe mir das Basis IO Beispielprogramm unter VB6 angeschauft und einige Beiträge hier Forum gelesen.
Vom grundsätzlichen Aufbau habe ich hoffentlich die Sache verstanden.
Ich lese immer einen ganzen Port (=8pins) aus, bzw. beschreibe ihn entsprechend.
Zum auslesen muss ich den Port vorher auf high setzen (richtig?).
Dies muss ich doch aber nur einmal tun, danach kann ich den Port so oft ich will abfragen?
Zum beschreiben: Muss ich nach dem schreiben eines Port diesen auch wieder "zurücksetzen" oder ähnliches bevor ich diesen auf neue Werte setzen kann?
Danke für Eure Hilfe.
Stepyi
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Beim lesen habe ich folgendes Problem:
Ich lese die Werte per Timer aus (z.B. alle 500ms).
Das funktioniert soweit gut.
Jetzt verändere ich einzelne pins im Wert (lege 5 Volt an).
Dies funktioniert meistens auch.
Es kommt aber immer wieder vor das nachdem die 5Volt nicht mehr an einem Pin anliegen der Wert trotzdem als high ausgelesen wird (ca. 5-10mal).
Dann irgendwann geht der Wert auf 0.
Oder der Wert springt von 0 auf 1 mit jedem lesevorgang. D.h. 1. lesen Wert = 1, zweite lesen Wert = 0, 3. lesen Wert = 1,.... obwohl an dem Pin keine Spannung mehr anliegt.
Beim schreiben folgendes Problem:
Das schreiben funktioniert immer nur einmal. Versuche ich dann ein zweites mal die Ausgänge mit anderen Werten zu beschreiben bleibt der zuerst geschriebene Zustand aktiv bis ich das System komplett neu starte.
was mache ich falsch?
Ich lese die Werte per Timer aus (z.B. alle 500ms).
Das funktioniert soweit gut.
Jetzt verändere ich einzelne pins im Wert (lege 5 Volt an).
Dies funktioniert meistens auch.
Es kommt aber immer wieder vor das nachdem die 5Volt nicht mehr an einem Pin anliegen der Wert trotzdem als high ausgelesen wird (ca. 5-10mal).
Dann irgendwann geht der Wert auf 0.
Oder der Wert springt von 0 auf 1 mit jedem lesevorgang. D.h. 1. lesen Wert = 1, zweite lesen Wert = 0, 3. lesen Wert = 1,.... obwohl an dem Pin keine Spannung mehr anliegt.
Beim schreiben folgendes Problem:
Das schreiben funktioniert immer nur einmal. Versuche ich dann ein zweites mal die Ausgänge mit anderen Werten zu beschreiben bleibt der zuerst geschriebene Zustand aktiv bis ich das System komplett neu starte.
was mache ich falsch?
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Offene Eingänge liefern high
Es gab mal Zeiten, wo offene Eingänge grundsätzlich High lieferten. 5 Volt vorhanden oder nicht ist dann schwer zu unterscheiden ;-). Ein Taster nach Masse ist zum Testen besser geeignet (und auf dem IOW40 oder IOW56 Starterkit auch vorhanden). Laut Datenblatt ist ein interner Pull-Up Widerstand vorhanden (der dann außerdem auch für das High verantwortlich wäre).Es kommt aber immer wieder vor das nachdem die 5Volt nicht mehr an einem Pin anliegen der Wert trotzdem als high ausgelesen wird (ca. 5-10mal).
Thomas
Ich verwende zum lesen (leicht gekürzt):
Der Timer (Timer von VB6) ist auf 500ms eingestellt.
...
Timer1.Enabled = False
Dim Res As Long
Dim N As Long
Dim Pid As Long
ReadLabel.Caption = "Reading from IOW"
ReadLabel.Refresh
' Read from IO-Warrior
Res = IowKitReadNonBlocking(iowHandles(0), 0, data(0), N)
...
TextVal1.Text = ""
TextVal2.Text = ""
TextVal3.Text = ""
TextVal4.Text = ""
TextVal5.Text = ""
TextVal6.Text = ""
TextVal7.Text = ""
TextVal1.Text = data(1)
TextVal2.Text = data(2)
TextVal3.Text = data(3)
TextVal4.Text = data(4)
TextVal5.Text = data(5)
TextVal6.Text = data(6)
TextVal7.Text = data(7)
ReadLabel.Caption = "Read from IOW complete"
...
Timer1.Enabled = True
Der Timer (Timer von VB6) ist auf 500ms eingestellt.
...
Timer1.Enabled = False
Dim Res As Long
Dim N As Long
Dim Pid As Long
ReadLabel.Caption = "Reading from IOW"
ReadLabel.Refresh
' Read from IO-Warrior
Res = IowKitReadNonBlocking(iowHandles(0), 0, data(0), N)
...
TextVal1.Text = ""
TextVal2.Text = ""
TextVal3.Text = ""
TextVal4.Text = ""
TextVal5.Text = ""
TextVal6.Text = ""
TextVal7.Text = ""
TextVal1.Text = data(1)
TextVal2.Text = data(2)
TextVal3.Text = data(3)
TextVal4.Text = data(4)
TextVal5.Text = data(5)
TextVal6.Text = data(6)
TextVal7.Text = data(7)
ReadLabel.Caption = "Read from IOW complete"
...
Timer1.Enabled = True
Hallo,
Dein Programm ruft also nicht alle 500ms den Zustand der IO-Pins ab, sondern liest nur einen der Reports die in der IowKit-Lib intern gespeichert wurden.
Die richtige herangehensweise wäre alle 500ms in einer Schleife solange IowKitReadNonBlocking() aufzurufen bis keine Reports mehr im Speicher sind. Der letzte gültige Report enthält dann den aktuellen Zustand der IO-Pins.
Wenn du die Lese-methode wie oben beschrieben veränderst sollte das Problem behoben sein. (Die vom Prellen erzeugten Reports wirfst du einfach weg, da dich nur der allerletzte im Puffer interessiert.)
Eberhard
Ich glaube hier gibt es ein kleines Verständnissproblem bzgl. des IOWarrior. Der IOW56 liefert immer dann einen neuen Report an die IowKit-Library, wenn sich etwas an den Eingängen verändert. Das kann bis zu 1000 x pro Sekunde passieren. Die Library speichert aber bis zu 128 dieser Reports zwischen, bis sie vom Programm angefordert, oder besser gesagt, gelesen werden.stepyi wrote:Beim lesen habe ich folgendes Problem:
Ich lese die Werte per Timer aus (z.B. alle 500ms).
Dein Programm ruft also nicht alle 500ms den Zustand der IO-Pins ab, sondern liest nur einen der Reports die in der IowKit-Lib intern gespeichert wurden.
Die richtige herangehensweise wäre alle 500ms in einer Schleife solange IowKitReadNonBlocking() aufzurufen bis keine Reports mehr im Speicher sind. Der letzte gültige Report enthält dann den aktuellen Zustand der IO-Pins.
Das kann durch Schalterprellen verursacht werden. Wie oben beschrieben wird durch das Prellen oft ein neuer Report geliefert bis sich der Zustand stabilisiert hat.Jetzt verändere ich einzelne pins im Wert (lege 5 Volt an).
Dies funktioniert meistens auch.
Es kommt aber immer wieder vor das nachdem die 5Volt nicht mehr an einem Pin anliegen der Wert trotzdem als high ausgelesen wird (ca. 5-10mal).
Dann irgendwann geht der Wert auf 0.
Oder der Wert springt von 0 auf 1 mit jedem lesevorgang. D.h. 1. lesen Wert = 1, zweite lesen Wert = 0, 3. lesen Wert = 1,.... obwohl an dem Pin keine Spannung mehr anliegt.
Wenn du die Lese-methode wie oben beschrieben veränderst sollte das Problem behoben sein. (Die vom Prellen erzeugten Reports wirfst du einfach weg, da dich nur der allerletzte im Puffer interessiert.)
Da fällt mir noch nichts zu ein.Beim schreiben folgendes Problem:
Das schreiben funktioniert immer nur einmal. Versuche ich dann ein zweites mal die Ausgänge mit anderen Werten zu beschreiben bleibt der zuerst geschriebene Zustand aktiv bis ich das System komplett neu starte.
was mache ich falsch?
Eberhard
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Hallo, erstmal vielen Dank für die schnellen Antworten.
wayoda:
Ich habe den letzten Report+1 erreicht wenn RES = 0 ist ?
Christoph Jung:
Hier ist der Code. Im Prinzip ist es fast 1:1 der Code aus dem Beispielprojekt
Private Sub WriteButton_Click()
Dim Res As Long
Dim Value As Byte
Dim N As Long
Dim Pid As Long
ReadLabel.Caption = "Begin writing..."
DoEvents
Sleep (500)
' Report ID 0
data(0) = 0
' Get values from text
Value = Val("&H" & TextVal1.Text)
data(1) = Value
Value = Val("&H" & TextVal2.Text)
data(2) = Value
Value = Val("&H" & TextVal3.Text)
data(3) = Value
Value = Val("&H" & TextVal4.Text)
data(4) = Value
Value = Val("&H" & TextVal5.Text)
data(5) = Value
Value = Val("&H" & TextVal6.Text)
data(6) = Value
Value = Val("&H" & TextVal7.Text)
data(7) = Value
' Write to IOW
Res = IowKitWrite(iowHandles(0), 0, data(0), N)
' Handle error
ReadLabel.Caption = "Write is complete"
End Sub
Beim ersten mal geht es, bei jedem weiteren Schreibversuch passiert nichts mehr.
Korrektur: Habe jetzt mal versucht zwischen zwei Schreibzyklen die Ports wieder auszulesen und dann wieder zu schreiben, dann ging es manchmal.
Ich befürchte ich mache etwas grundsätzlich falsch.
Gruß
Stepyi
wayoda:
Ich habe den letzten Report+1 erreicht wenn RES = 0 ist ?
Christoph Jung:
Hier ist der Code. Im Prinzip ist es fast 1:1 der Code aus dem Beispielprojekt
Private Sub WriteButton_Click()
Dim Res As Long
Dim Value As Byte
Dim N As Long
Dim Pid As Long
ReadLabel.Caption = "Begin writing..."
DoEvents
Sleep (500)
' Report ID 0
data(0) = 0
' Get values from text
Value = Val("&H" & TextVal1.Text)
data(1) = Value
Value = Val("&H" & TextVal2.Text)
data(2) = Value
Value = Val("&H" & TextVal3.Text)
data(3) = Value
Value = Val("&H" & TextVal4.Text)
data(4) = Value
Value = Val("&H" & TextVal5.Text)
data(5) = Value
Value = Val("&H" & TextVal6.Text)
data(6) = Value
Value = Val("&H" & TextVal7.Text)
data(7) = Value
' Write to IOW
Res = IowKitWrite(iowHandles(0), 0, data(0), N)
' Handle error
ReadLabel.Caption = "Write is complete"
End Sub
Beim ersten mal geht es, bei jedem weiteren Schreibversuch passiert nichts mehr.
Korrektur: Habe jetzt mal versucht zwischen zwei Schreibzyklen die Ports wieder auszulesen und dann wieder zu schreiben, dann ging es manchmal.
Ich befürchte ich mache etwas grundsätzlich falsch.
Gruß
Stepyi
Hallo,
welchen Wert hat die Variable N (Anzahl der zu schreibenden bytes in IowKitWrite())?
Für einen IOW56 an den IO-Pins muß hier der Wert 8 verwandt werden. (Ausnahme : man kann auch mehrere Reports auf einmal schreiben was aber sicher für IO-Pins nicht sinnvoll ist.)
Eberhard
welchen Wert hat die Variable N (Anzahl der zu schreibenden bytes in IowKitWrite())?
Für einen IOW56 an den IO-Pins muß hier der Wert 8 verwandt werden. (Ausnahme : man kann auch mehrere Reports auf einmal schreiben was aber sicher für IO-Pins nicht sinnvoll ist.)
Genauwayoda:
Ich habe den letzten Report+1 erreicht wenn RES = 0 ist ?
Eberhard
N muss dann 8 haben? Auf dem Mac hab ich da 7, das steht auch so in den Beispielprogrammen.wayoda wrote:Hallo,
welchen Wert hat die Variable N (Anzahl der zu schreibenden bytes in IowKitWrite())?
Für einen IOW56 an den IO-Pins muß hier der Wert 8 verwandt werden. (Ausnahme : man kann auch mehrere Reports auf einmal schreiben was aber sicher für IO-Pins nicht sinnvoll ist.)
Genauwayoda:
Ich habe den letzten Report+1 erreicht wenn RES = 0 ist ?
Eberhard
- (int) reportSizeForInterfaceType:(int) inType
/*" Returns the size of an output report written to an interface of type inType exluding size for report id. "*/
{
int result = 0;
switch (inType)
{
case kIOWarrior40Interface0:
result = 4;
break;
case kIOWarrior40Interface1:
result = 7;
break;
case kIOWarrior24Interface0:
case kIOWarrior24PVInterface0:
result = 2;
break;
case kIOWarrior24Interface1:
case kIOWarrior24PVInterface1:
result = 7;
break;
case kIOWarrior56Interface0:
result = 7;
break;
case kIOWarrior56Interface1:
result = 63;
break;
}
return result;
}
Hallo,
vielen Dank an alle für die Hilfe, jetzt funktioniert alles!
Zum lesen: Der wichtige Tip war, das der IOW56 die Ergebnisse zwischenspeichert (Danke wayoda!).
Zum schreiben: Die nachgelagerte Elektronik erfordert ein zweistufiges schreiben, der IOW56 hat korrekt gearbeitet.
Wenn man weiß wie es geht ist es ganz einfach... wie immer.
Gruß
Stepyi
vielen Dank an alle für die Hilfe, jetzt funktioniert alles!
Zum lesen: Der wichtige Tip war, das der IOW56 die Ergebnisse zwischenspeichert (Danke wayoda!).
Zum schreiben: Die nachgelagerte Elektronik erfordert ein zweistufiges schreiben, der IOW56 hat korrekt gearbeitet.
Wenn man weiß wie es geht ist es ganz einfach... wie immer.
Gruß
Stepyi
Ja, das ist richtig für das Mac-SDK, welches sich deutlich vom SDK für Windows und Linux unterscheidet.McMike wrote:N muss dann 8 haben? Auf dem Mac hab ich da 7, das steht auch so in den Beispielprogrammen.wayoda wrote:Hallo,
welchen Wert hat die Variable N (Anzahl der zu schreibenden bytes in IowKitWrite())?
Für einen IOW56 an den IO-Pins muß hier der Wert 8 verwandt werden. (Ausnahme : man kann auch mehrere Reports auf einmal schreiben was aber sicher für IO-Pins nicht sinnvoll ist.)
Eberhard