Benutzung des Special Mode 0xFF

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
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Benutzung des Special Mode 0xFF

Post by thomasxy »

Ich nutze den IOW 56 DG unter Linux. Dabei möchte ich jetzt die IO Ports auslesen (Schalter am Port P1.0) - und zwar immer wieder den aktuellen Zustand, auch wenn sich nichts geändert hat.

Ich rufe daher zuerst special mode 0xFF aus und danach versuche ich, zu lesen. Leider funktioniert das bei mir nicht - ich bekomme NUR bei einer Zustandsänderung einen Input. Auch beim ersten Auslesen nach Anstecken an USB kommt nix.

Was mir auch aufgefallen ist, dass entgegen zur Spezifikation beim Special Mode 0xFF die Bytes==0xFF sein müssen, anstatt 0x00?! (bei memset 0x00 .... kommt res != IOWKIT56_IO_REPORT_SIZE, sehr seltsam!)

Mein Codeauszug:

Code: Select all

	/* lese test-iow-schalter aus. dafür muss zuerst special mode 0xFF gemacht werden. */
	while(TRUE)
	{
		usleep(100000);
		IOWKIT56_IO_REPORT report;
		ULONG res;
		
		// pins jetzt mal sofort auslesen - modus
		memset(&report, 0xFF, IOWKIT56_IO_REPORT_SIZE); // entgegen der spezifikation!
		report.ReportID = 0xFF; 
		res = IowKitWrite(iowHandle, IOW_PIPE_IO_PINS, (PCHAR) &report, IOWKIT56_IO_REPORT_SIZE);
		if (res != IOWKIT56_IO_REPORT_SIZE){
			printf("XXXXXX");
		} else {
			printf(".");
		}
		
		report.ReportID = 0xFF; 
		res = IowKitReadNonBlocking(iowHandle, IOW_PIPE_IO_PINS, (PCHAR) &report, IOWKIT56_IO_REPORT_SIZE);
		if (res != IOWKIT56_IO_REPORT_SIZE)
		{
			printf("?");
		} else {
			int schalter = report.Bytes[1] & (1<<0); // Byte 1, Bit 0
			printf("%s", (schalter==0x01) ? "1" : "0");
		}
		
		fflush(stdout);
	}
Woran liegt's? :)
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Benutzung des Special Mode 0xFF

Post by Christoph Jung »

Code: Select all

 IOWKIT56_IO_REPORT report; 
ist falsch. Hier wird ja auf den Special-Mode 0xff zugegriffen, also muss man auch die Special-Mode Variable nutzen.
Also Alles von IO auf SPECIAL_MODE umstellen, dann sollte es auch gehen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Re: Benutzung des Special Mode 0xFF

Post by thomasxy »

Danke. Das funktioniert.

Übrigens bin ich auf ein "Problem" gestoßen, wenn ich das usleep weglasse (und per ReadNonBlocking auslese!). Dadurch wird sehr oft nacheinander ein Write angestoßen und der IOW schießt sich ab. Danach kann ich ihn nur vom USB trennen. Da wäre es vielleicht schöner, wenn das Write failen würde. Es wird natürlich im Normalbetrieb niemand auf die Idee kommen, den IOW SO zu mißbrauchen ;-)

Gut, alles was ich noch für mein Projekt wissen muss, ist, ob ich diesen Special Mode 0xFF und Special Mode I2C problemlos miteinander mischen / verzahnen kann? Dabei sind alle Reads non-blocking!

Angenommen der Ablauf ginge (durch den Zufall bestimmt) so:

1. Special Mode I2C: Enable I2C
2. Endlosschleife:
2.1. Special Mode I2C: Write auf den Bus (Schreibe i2c-Adresse auf den Bus für ein logisches Lesen)
2.2. Special Mode 0xFF: Fordere immediate Read an
2.3. Special Mode I2C: Read vom Bus (kriege ich hier tatsächlich immer nur I2C-relevante Daten?)
2.4. Special Mode 0xFF: Lese alle IO Bytes aus (SDA, SCL ignorieren)

Werden sich diese beide Special Mode Aufrufe vertragen?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Benutzung des Special Mode 0xFF

Post by Christoph Jung »

Naja man sollte sich schon an die Frequenz halten, die der IO-Warrior aushält. Wenn man da zu schnell schreibt gehts halt in die Hose.
Man muss halt wissen was man tut.

Die Funktionen sollten sich ohne Probleme vertragen. Bei einigen Funktionen werden die selben Pins genutzt, da muss man aufpassen aber bei 0xFF und I²C gibts keine Probleme.

Ich empfehle allerdings anstelle von IowKitReadNoneBlocking die normale IowKitRead Funktion. Denn wenn der IO-Warrior mal länger braucht oder etwas dazwischen kommt kann es sein, dass IowKitReadNoneBlocking nicht die richtigen Daten enthält.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Re: Benutzung des Special Mode 0xFF

Post by thomasxy »

Christoph Jung wrote:[...]
Ich empfehle allerdings anstelle von IowKitReadNoneBlocking die normale IowKitRead Funktion. Denn wenn der IO-Warrior mal länger braucht oder etwas dazwischen kommt kann es sein, dass IowKitReadNoneBlocking nicht die richtigen Daten enthält.
Das heißt, wenn vom I2C-Gerät 2 Bytes kommen, kann es sein, dass ich mit read-non-blocking zwischendrin selten mal nur das erste Byte gültig bekomme??
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: Benutzung des Special Mode 0xFF

Post by Christoph Jung »

IowKitReadNonBlocking() kommt ohne Warten zurück.
Wenn am I²C einmal die Daten etwas später abgeschickt werden (z.B. dass der Sensor am I²C halt 1 Sekunde braucht zum Datensammeln) ist IowKitReadNonBlocking() schon zu ende und die Daten hängen dann in der Luft und im gelesenen Datenpacket steht nicht das richtige oder schrott.
Darum sollte man dort mit IowKitRead() arbeiten, da diese Funktion auf eine Antwort wartet und man dort auch einen Timeout einstellen um den lesevorgang abzubrechen, falls mal was schief geht.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
thomasxy
Posts: 8
Joined: Thu Feb 09, 2012 4:27 pm

Re: Benutzung des Special Mode 0xFF

Post by thomasxy »

Japp, beim 1. Mal ReadNonBlocking kriege ich in der Regel noch nix ;-)

Auf jeden Fall kriege ich wohl aber die richtigen Daten. Es ist nur etwas schwieriger zu programmieren :o) Nur muss auch im Falle eines Timeouts von vielleicht 1 Sekunde zwischendurch noch eine Menge anderer Dinge durch mein Programm erledigt werden. Und da verzichte ich eben auf den extra Thread.
Post Reply