Basiswissen, schreiben und lesen der Ports

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
stepyi
Posts: 5
Joined: Tue May 27, 2008 10:41 pm

Basiswissen, schreiben und lesen der Ports

Post by stepyi »

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
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Nein, es werden immer alle Ports, also sämtliche Pins des Chips auf einmal gelesen oder geschrieben.

Die Ausgänge behalten ihren Zustand bis neue Daten reingeschrieben werden.
stepyi
Posts: 5
Joined: Tue May 27, 2008 10:41 pm

Post by stepyi »

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?
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Womit wird denn ausgelssen?

Read(),
ReadImmediate() oder
ReadNonBlocking() ?

Ohne ein wenig Quellcode kann man schwer sage, was falsch ist. Die Timerfunktion wäre dazu Hilfreich.
Software developer
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Offene Eingänge liefern high

Post by towaibw »

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).
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).

Thomas
stepyi
Posts: 5
Joined: Tue May 27, 2008 10:41 pm

Post by stepyi »

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
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo,
stepyi wrote:Beim lesen habe ich folgendes Problem:
Ich lese die Werte per Timer aus (z.B. alle 500ms).
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.

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.
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.
Das kann durch Schalterprellen verursacht werden. Wie oben beschrieben wird durch das Prellen oft ein neuer Report geliefert bis sich der Zustand stabilisiert hat.
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.)
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?
Da fällt mir noch nichts zu ein.

Eberhard
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Wie wird denn auf den IO-Warrior geschrieben? Am besten die Funktione mal Posten (komplett). Es ist nämlich sicher ein Softwareproblem.
Software developer
stepyi
Posts: 5
Joined: Tue May 27, 2008 10:41 pm

Post by stepyi »

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
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

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.)
wayoda:
Ich habe den letzten Report+1 erreicht wenn RES = 0 ist ?
Genau

Eberhard
McMike
Posts: 24
Joined: Fri Feb 02, 2007 3:36 pm

Post by McMike »

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.)
wayoda:
Ich habe den letzten Report+1 erreicht wenn RES = 0 ist ?
Genau

Eberhard
N muss dann 8 haben? Auf dem Mac hab ich da 7, das steht auch so in den Beispielprogrammen.

- (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;
}
stepyi
Posts: 5
Joined: Tue May 27, 2008 10:41 pm

Post by stepyi »

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
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

McMike wrote:
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.)
N muss dann 8 haben? Auf dem Mac hab ich da 7, das steht auch so in den Beispielprogrammen.
Ja, das ist richtig für das Mac-SDK, welches sich deutlich vom SDK für Windows und Linux unterscheidet.

Eberhard
Post Reply