NumPipe - Kann mir das jemand erklären?
Moderator: Guido Körber
NumPipe - Kann mir das jemand erklären?
Hallo!
Ich bin derzeit durch ein Schulprojekt am Iowkit 28 am arbeiten und bisher läuft alles soweit ganz gut.
Jedoch bin ich nun ein bisschen an meine Grenzen gestoßen und wie es aussieht, liegt das daran, dass ich den NumPipe Wert noch nicht so 100% verstanden habe.
Ich möchte über einen der Analog Eingänge einen Wert von einem Sensor einlesen - soweit so gut. Ich setze den entsprechenden Eingang auf 1, damit dieser zu einem Input wird, schließe alles an und dann.. nichts.
Wenn ich das richtig verstanden habe, muss ich, damit Analog Werte eingelesen werten können, die IowKitReadNonBlocking Methode bei dem NumPipe wert auf 3 setzen.
Jetzt stellen sich jedoch für mich folgende 3 Fragen:
1. Wie genau muss ich das ganze einstellen? Muss die write Methode auch auf numpipe = 3 gesetzt werden? Kann ich evtl irgendwie testen ob überhaupt was ankommt?
2. Der Sensor gibt als Messung eine Spannung ab. Jedoch wird der Eingang doch durch das 1 Signal, bereits mit 5 V versorgt - wie kann dieser dann durch ein einkommendes Signal überhaupt irgendetwas auswerten?
3. Wenn der IowKitReadNonBlocking auf numPipe = steht, wie kann ich dann gleichzeitig überhaupt noch ein & ausgänge nutzen, da diese doch einen numpipe von = 0 benötigen?
Es wäre super, wenn mir jemand hier ein paar anhaltspunkte geben könnte. Es muss mir nicht zwingend alles vorgekaut werden, jedoch bräuchte ich zumindest einen stups in die richtige Richtung.
Ich bedanke mich schonmal recht herzlich im Voraus!
Ich bin derzeit durch ein Schulprojekt am Iowkit 28 am arbeiten und bisher läuft alles soweit ganz gut.
Jedoch bin ich nun ein bisschen an meine Grenzen gestoßen und wie es aussieht, liegt das daran, dass ich den NumPipe Wert noch nicht so 100% verstanden habe.
Ich möchte über einen der Analog Eingänge einen Wert von einem Sensor einlesen - soweit so gut. Ich setze den entsprechenden Eingang auf 1, damit dieser zu einem Input wird, schließe alles an und dann.. nichts.
Wenn ich das richtig verstanden habe, muss ich, damit Analog Werte eingelesen werten können, die IowKitReadNonBlocking Methode bei dem NumPipe wert auf 3 setzen.
Jetzt stellen sich jedoch für mich folgende 3 Fragen:
1. Wie genau muss ich das ganze einstellen? Muss die write Methode auch auf numpipe = 3 gesetzt werden? Kann ich evtl irgendwie testen ob überhaupt was ankommt?
2. Der Sensor gibt als Messung eine Spannung ab. Jedoch wird der Eingang doch durch das 1 Signal, bereits mit 5 V versorgt - wie kann dieser dann durch ein einkommendes Signal überhaupt irgendetwas auswerten?
3. Wenn der IowKitReadNonBlocking auf numPipe = steht, wie kann ich dann gleichzeitig überhaupt noch ein & ausgänge nutzen, da diese doch einen numpipe von = 0 benötigen?
Es wäre super, wenn mir jemand hier ein paar anhaltspunkte geben könnte. Es muss mir nicht zwingend alles vorgekaut werden, jedoch bräuchte ich zumindest einen stups in die richtige Richtung.
Ich bedanke mich schonmal recht herzlich im Voraus!
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: NumPipe - Kann mir das jemand erklären?
Die numpipes sind dafür da, um auf die unterschiedlichen Interfaces des IOW zugreifen zu können.
Der IO-Warrior28 hat insgesamt 4 Pipes die für unterschiedliche Funktionen zuständig sind:
0 -> IO-Ports
1 -> Special Modes (LCD, LED-Matrix, etc.)
2 -> I2C
3 -> ADC
Beispiel ADC:
Ist der ADC aktiviert worden sind Pin 1.0 bis 1.3 belegt und können nicht mehr über numpipe 0 geschrieben werden. Auch ist die LCD funktion deaktiviert, da diese die gleichen Pins nutzt.
Alle anderen Pins und Funktionen sind aber weiter zugängliche und können gesetzt oder gelesen werden.
Um den ADC also zu nutzen muss nicht der IO-Pin gesetzt werden, sondern die ADC-Funktion aktiviert werden.
Wir haben in unserem Windows SDK ein Beispielprojekt in C/C++ zum ADC drin, schon mal angeschaut?
Der IO-Warrior28 hat insgesamt 4 Pipes die für unterschiedliche Funktionen zuständig sind:
0 -> IO-Ports
1 -> Special Modes (LCD, LED-Matrix, etc.)
2 -> I2C
3 -> ADC
Beispiel ADC:
Ist der ADC aktiviert worden sind Pin 1.0 bis 1.3 belegt und können nicht mehr über numpipe 0 geschrieben werden. Auch ist die LCD funktion deaktiviert, da diese die gleichen Pins nutzt.
Alle anderen Pins und Funktionen sind aber weiter zugängliche und können gesetzt oder gelesen werden.
Um den ADC also zu nutzen muss nicht der IO-Pin gesetzt werden, sondern die ADC-Funktion aktiviert werden.
Wir haben in unserem Windows SDK ein Beispielprojekt in C/C++ zum ADC drin, schon mal angeschaut?
Re: NumPipe - Kann mir das jemand erklären?
Ehrlich gesagt werde ich aus dem Beispiel Code nicht ansatzweise schlauer. Man muss dazu wissen, dass ich so gut wie keinerlei Erfahrung habe.
Bspw. werden im Code variablen genutzt, die vorher gar nicht deklariert werden, woraus ich mir keinen Schuh machen kann.
beispiel:
so fängt der code an - woher kommt das enable, chan und mod byte? Was genau wird hier eingetragen?
Bspw. werden im Code variablen genutzt, die vorher gar nicht deklariert werden, woraus ich mir keinen Schuh machen kann.
beispiel:
Code: Select all
void SetParameter(IOWKIT_HANDLE handle, BYTE enable, BYTE chan, BYTE mod)
{
IOWKIT28_SPECIAL_REPORT report;
memset(&report, 0, IOWKIT28_ADC_REPORT_SIZE);
report.ReportID = IOW28_ADC_MODE;
report.Bytes[0] = enable; //Enable / Disable ADC mode
report.Bytes[1] = chan; //Channel count
report.Bytes[2] = 0x00; //Must be 0
report.Bytes[3] = 0x00; //Must be 0
report.Bytes[4] = mod; //Single short or continues mode
IowKitWrite(handle, IOW_PIPE_ADC_MODE, (char*)&report, IOWKIT28_ADC_REPORT_SIZE);
}
wenn ich in meinem code das numpipe auf 3 ändere, werden auch die anderen Eingänge nicht mehr angesprochen, was mich nur umso mehr verwirrt 😫Ist der ADC aktiviert worden sind Pin 1.0 bis 1.3 belegt und können nicht mehr über numpipe 0 geschrieben werden. Auch ist die LCD funktion deaktiviert, da diese die gleichen Pins nutzt.
Alle anderen Pins und Funktionen sind aber weiter zugängliche und können gesetzt oder gelesen werden.
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: NumPipe - Kann mir das jemand erklären?
Die Variablen stehen im Funktionsaufruf als Parameter und werden beim Aufruf der Funktion mit übergeben. Die Funktion wird ja im Code aufgerufen und da wird das dann eingetragen/übergeben. Und was da eingetragen wird ist das, was im Datenblatt angegeben ist, bzw. welches Setup man haben möchte.
Ohne Code kann ich leider nicht weiter helfen.
Ohne Code kann ich leider nicht weiter helfen.
-
- Site Admin
- Posts: 2857
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: NumPipe - Kann mir das jemand erklären?
Also mal zum grundsätzlichen Verständnis: Die Pipes sind einzelne Funktionen bzw. Funktionsgruppen im IO-Warrior.
Will man direkt auf die Pins zugreifen, dann geht das über Pipe 0. Über die anderen Pipes kommt man nicht direkt an die Pins ran.
Mit dem ADC redet man über Pipe 3. Die ADC Funktion muss erst mal mit einem Befehl an die Pipe 3 eingeschaltet werden. Die betroffenen Pins werden damit der Kontrolle der Funktion auf Pipe 0 entzogen, die ADC Funktion übernimmt die dann direkt. Es ist dann egal, was man vorher mit den Pins gemacht hat, oder danach über Pipe 0 an diese Pins schreibt.
-
- Site Admin
- Posts: 2857
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: NumPipe - Kann mir das jemand erklären?
Hat es denn jetzt geklappt?
Re: NumPipe - Kann mir das jemand erklären?
So - sorry für die späte Antwort. Ich habe noch viel mit dem Teil rumgespielt und habe auch irgendwann meinen Fehler gefunden - ich hatte von Anfang an das nötige Byte falsch beschrieben.
Nun komme ich allerdings direkt an das nächste Problem, an dem ich seit tagen hänge und nicht weiß wie ich es lösen soll.
Mein Sensor wird ausgelesen und die Werte machen Sinn - so weit so, so gut. Nun muss man sich vorstellen, dass ich möchte, wenn ein bestimmter wert erreicht wurde, dass ein I/O Ausgang angesteuert wird.
Nur leider schaffe ich es nicht, den ADC Modus zu verlassen
In den IF Schleifen werden die Werte, die ich von da aus versuche rein zu schreiben, einfach erneut überschrieben, da der ADC Modus ununterbrochen einen Wert vom sensor ausliest. Man könnte sagen, dass ich sowas wie einen "IowKitReadStop()" Befehl bräuchte.
Vermutlich gibt es hier eine ganz einfache Lösung nur ich habe wirklich schon alles für mich probiert und nichts hilft 🙄
Nun komme ich allerdings direkt an das nächste Problem, an dem ich seit tagen hänge und nicht weiß wie ich es lösen soll.
Mein Sensor wird ausgelesen und die Werte machen Sinn - so weit so, so gut. Nun muss man sich vorstellen, dass ich möchte, wenn ein bestimmter wert erreicht wurde, dass ein I/O Ausgang angesteuert wird.
Nur leider schaffe ich es nicht, den ADC Modus zu verlassen
In den IF Schleifen werden die Werte, die ich von da aus versuche rein zu schreiben, einfach erneut überschrieben, da der ADC Modus ununterbrochen einen Wert vom sensor ausliest. Man könnte sagen, dass ich sowas wie einen "IowKitReadStop()" Befehl bräuchte.
Vermutlich gibt es hier eine ganz einfache Lösung nur ich habe wirklich schon alles für mich probiert und nichts hilft 🙄
Code: Select all
private void Form1_Load(object sender, EventArgs e)
{
// Timer Starten und Eingänge einstellen
IowKitOpenDevice();
Data[0] = 0x1C; //0x1C
Data[1] = 1; //ADC Mode Enable = 1 , Disable = 0
Data[2] = 1;
Data[3] = 0;
Data[5] = 1;
Data[6] = 0;
IowKitWrite(handle, 3, ref Data[0], 64);
timer1.Enabled = true;
// timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
//Updaten der Anzeige zum derzeitigen status des Byte Array
label1.Text = "Data 0: " + Data[0];
label2.Text = "Data 1: " + Data[1];
label3.Text = "Data 2: " + Convert.ToDouble(Data[2]) / 3;
label4.Text = "Data 3: " + Data[3];
label5.Text = "Data 4: " + Data[4];
label9.Text = "Data Dummy 1: " + DataDummy[1];
// Auslesen der Eingänge
IowKitRead(handle, 3, ref Data[0], 64);
//Test für Ansteuerung Pumpe
if (Data[2] / 3 >= 60)
{
Data[1] = 0xFF;
IowKitWrite(handle, 0, ref Data[0], 64);
IowKitReadNonBlocking(handle, 0, ref Empfangen[0], 64);
label7.Text = "Über 60";
label8.Text = "";
}
else if (Data[2] / 3 <= 60)
{
Data[1] = 0x00;
IowKitWrite(handle, 0, ref Data[0], 64);
IowKitReadNonBlocking(handle, 0, ref Empfangen[0], 64);
label8.Text = "Unter 60";
label7.Text = "";
}
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: NumPipe - Kann mir das jemand erklären?
Am besten einen eigenstänigen Array für die IO-Funktion nutzen, also nicht Data[0] sonder z.B. WriteData[0].
Weil in Data steht das drin, was über IowKitRead() gelesen wurde (reportID von ADC, die Bytes, etc) und es macht ja keinen
Sinn diese "Zufallswerte" in die IO-Ports zu schreiben.
Ansonsten sieht alles weiter OK aus, außer, dass halt der Ganze IO-Port 0 mit 0xFF beschrieben wird.
Weil in Data steht das drin, was über IowKitRead() gelesen wurde (reportID von ADC, die Bytes, etc) und es macht ja keinen
Sinn diese "Zufallswerte" in die IO-Ports zu schreiben.
Ansonsten sieht alles weiter OK aus, außer, dass halt der Ganze IO-Port 0 mit 0xFF beschrieben wird.
Re: NumPipe - Kann mir das jemand erklären?
Die Idee hier war, dass ich einen von den Ports ( wegen testzwecken war es mir egal welcher ) ein high bekommt, welches ich mir ausgeben lassen kann, was nun mal nicht passiert, weil es direkt wieder überschrieben wird.Ansonsten sieht alles weiter OK aus, außer, dass halt der Ganze IO-Port 0 mit 0xFF beschrieben wird.
Sprich ich mache nochmal einen Befehl mit IowKitReadNonBlocking(handle, 0, ref WriteData[0], 64) um seperat die I/O Funktion auszulesen?Am besten einen eigenstänigen Array für die IO-Funktion nutzen, also nicht Data[0] sonder z.B. WriteData[0].
- Christoph Jung
- Posts: 671
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: NumPipe - Kann mir das jemand erklären?
Hab ich ganz übersehen, die IO-Funktion möchte beim IOW28 keine 64 sondern nur 5 Byte haben.
Wenn da mehr drin stehen, dann wird der Befehl verworfen.
Das müsste so aussehen (hab den Arraynamen geändert):
Ein Read ist bei den IO-Ports nicht zwingend notwendig (außer man will diese als Eingänge nutzen), daher hab ich es mal weg gelassen.
Wenn da mehr drin stehen, dann wird der Befehl verworfen.
Das müsste so aussehen (hab den Arraynamen geändert):
Code: Select all
if (Data[2] / 3 >= 60)
{
IOPorts[0] = 0x00; //Report-ID
IOPorts[1] = 0xFF; //IO-Port 0.0 bis 0.7
IowKitWrite(handle, 0, ref IOPorts[0], 5);
label7.Text = "Über 60";
label8.Text = "";
}
Re: NumPipe - Kann mir das jemand erklären?
Es hat tatsächlich funktioniert! Vielen Dank 😁