IO-Warrior Ports einzeln ansteuern....(32 Bit /ULONG)?

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
CCrüger
Posts: 8
Joined: Sat Nov 04, 2006 4:10 pm

IO-Warrior Ports einzeln ansteuern....(32 Bit /ULONG)?

Post by CCrüger »

Hallo

ich bin ein ein etwas älteres Starterkit gekommen. Läuft soweit ganz gut.
Ich kenne mich mit dem IOWarrior nicht so gut aus. Und ich möchte nun 30 LOW-Current LED's(2mA) einzeln damit (am liebtsen direkt) ansteuern. (Hällt der Chip das überhaupt aus ? )

Ich habe nun herrausgefunden das ich die PORTS nicht einzeln ansteuern kann. Wie kann ich das denn Realisieren ?
In dem Beispiel von dem Starterkit für VS6.0
Wird eine ULONG(32Bit) Variable gesetzt.

Code: Select all

	
for (i = 0; i < numIows; i++)
		WriteSimple(iows[i], 0xFFFFFFFE);   
Nach diesem Befehl Leuchte auf dem Test Board die LED "D1" !!!
Aber nicht die LED "D8" !!!
Ich bin davon Ausgegangen. Das da das niedrigwertige Bit gesetzt wird dann auch das die niedrigswertige LED leuchten sollte. Wo ist da den der Fehler ?

Wie Funktioniert der Befehl WriteSimple eingendlich. Was passiert wenn ich zb "255" (aus nem 8 Bit Integer) mit WriteSimple setzen lasse. Auf welchen Port wird das automatisch geschrieben und was passiert mit den anderen Ports ?

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

Post by Christoph Jung »

Der WriteSimple-Befehl ist eigentlich eine eigen Funktion in dem VB6 (?) Programm. Eigentlich ist das der IowKitWrite-Befehl, der da greift. Musst du mal im Quelltext ziemlich zu anfang schauen. In VB6 bin ich leider nicht so involviert. Bin eher der C++ler.

Und ich glaube dass das mit dem Ansteuern der LEDs so ist, dass wenn du 0xFFFFFFFF eingibst, dann alle LEDs aus sind. liegt glaub ich an der Platine wegen den LEDs.

Was du in den IowKitWrite / WriteSimple-Befehl reinschreibst, ob Dezimal oder Hexal ist glaub ich wurst, weil das eh Binär auf den IOW geschoben wird.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
CCrüger
Posts: 8
Joined: Sat Nov 04, 2006 4:10 pm

Post by CCrüger »

Christoph Jung wrote:Der WriteSimple-Befehl ist eigentlich eine eigen Funktion in dem VB6 (?) Programm. Eigentlich ist das der IowKitWrite-Befehl, der da greift. Musst du mal im Quelltext ziemlich zu anfang schauen.
Stimmt hast recht, ist ne Funkion drin.
Unso weniger verstehe ich was da genau passiert.

Code: Select all

BOOLEAN WriteSimple(IOWKIT_HANDLE devHandle, DWORD value)
{
	IOWKIT_REPORT rep;

	// Init report
	rep.ReportID = 0;
	rep.Value = 0xFFFFFFFF;
	switch (IowKitGetProductId(devHandle))
	{
	// Write simple value to IOW40
	case IOWKIT_PRODUCT_ID_IOW40:
		rep.Bytes[3] = (UCHAR) value;
		return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
			(PCHAR) &rep, IOWKIT40_IO_REPORT_SIZE) == IOWKIT40_IO_REPORT_SIZE;
	// Write simple value to IOW24
	case IOWKIT_PRODUCT_ID_IOW24:
		rep.Bytes[0] = (UCHAR) value;
		return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
			(PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE) == IOWKIT24_IO_REPORT_SIZE;
	default:
		return FALSE;
	}
}
Was bedeutet/machen denn diese Zeilen 3 hier genauer ?
Da steige ich nämlich aus .

Code: Select all

case IOWKIT_PRODUCT_ID_IOW40:
		rep.Bytes[3] = (UCHAR) value;
		return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
			(PCHAR) &rep, IOWKIT40_IO_REPORT_SIZE) == IOWKIT40_IO_REPORT_SIZE;
Christoph Jung wrote: Und ich glaube dass das mit dem Ansteuern der LEDs so ist, dass wenn du 0xFFFFFFFF eingibst, dann alle LEDs aus sind. ...
Ja ganz genau. So habe ich ich das auch Verstanden. Aber das stimmt nicht mit meinen Beoachtungen überein
Christoph Jung wrote: Was du in den IowKitWrite / WriteSimple-Befehl reinschreibst, ob Dezimal oder Hexal ist glaub ich wurst, weil das eh Binär auf den IOW geschoben wird.
das kann ich mir noch nicht so ganz verstellen. Bedeutet das dass ich die "8 Byte PORT Variablen" Einfach zusammen setzen kann ?

Ausgabe = PORT0 + PORT1 + PORT2 + PORT3; ???
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Code: Select all

case IOWKIT_PRODUCT_ID_IOW40: //Guckt ob IOW40 
      rep.Bytes[3] = (UCHAR) value; //letzter Port des IOW40
      return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
         (PCHAR) &rep, IOWKIT40_IO_REPORT_SIZE) == IOWKIT40_IO_REPORT_SIZE; //das was er senden soll wird dann an den port gesender
Soll bedeuten, dass der letzt Port, da wo LEDs hängen angesprochen wird. Da schreibt er das dann rein. Hat was mit Strom oder Spannung zu tun, weil der letzten Port für den IOW40 ist ... öh.... robuster? irgendsowas war das glaub ich. (hab mal // reingekrizelt)

zum dem mit 0xFFFFFFFF:
Da sendest du ja Bytes an ALLE Ports im IOW: Angesprochen wird mit den LEDs aber nur der Letzte, weil das so in der funktion WriteSimple festglegt ist. Scheib mal nur das EINE Byte, also anstatt 0xFFFFFFFE nur 0xFE. Vielleicht kommt er durcheinander. Bin mir da aber net sicher. Probieren geht über studieren.

Zum letzten ist ja nun klar, dass in der Funkton nur port 3 angesprochen wird. Also kannst du anstdt z.B. 0xAA auch 170 senden. Selbe ergebnis lampen sind an (0I 0I 0I 0I).

Wenn du alle Porte beschreiben willst, muss du die funktion ändern oder gleich mit IowKitWrite() arbeiten. da kannst du dann report.Byte[0] bis report.Byte[3] selber setzten. Vielleicht geht ja auch report.Value, weiß aber net genau.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

MAl eine Frage nebenbei

Wie kann ich die Second-Ports ansteuern ohne die Primär-Ports zu stören.

Wenn ich beim IOW24 0xAA schicke dann habe ich die Primär-Ports angesteuert. Jetzt sollen die Ports so weiter bleiben und ich will dann den Port 1.1 zB. blinken lassen.
Geht das oder nicht?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Post by Christoph Jung »

Ich nehm mal an, dass du einen der Ausgangsports meinst.
Klar kannst du die auch ansteuern. Anderes report.Byte[] nehmen und los gehts. Probleme könnte es nur geben, dass er halt wenn du das report.Byte[] für den letzten port nicht setzt, dass er ihn auf NULL setzt und den Zustand überschreibt. Musst du mal ausprobieren...
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Also kurz gesagt: Status merken den man zuletzt geschrieben hat. Die Portpins können immer nur alle auf einmal geschrieben werden, also muss man den zuletzt geschriebenen Wert merken.
Post Reply