Newbiefragen zur Programmierung der IO-Warrior 40 mit C

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Newbiefragen zur Programmierung der IO-Warrior 40 mit C

Post by PeeDee »

Ja, wie schon der Titel vermuten läßt, befinde ich mich gerade im Anfangsstadium mit der Programmierung des IO-Warrior und......da die Beschreibung der IO-Warrior Dynamic Library (meinerseits) noch so einige Fragen offen läßt, werde ich wohl noch eine Menge zu fragen haben.
Aber ich fange erstmal klein an:

BEISPIEL:

Code: Select all

report.ReportID=0;
report.Value = 0xFFFFFFFF;

report.Bytes[3] = 4;
res=IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR)&report, IOWKIT40_IO_REPORT_SIZE);
if(res!=IOWKIT40_IO_REPORT_SIZE)
printf("Ein Fehler ist aufgetreten! Bitte erneut versuchen!");
Wofür ist diese Report-Variable?
Warum report.ReportID=0 und report.Value = 0xFFFFFFFF?
Was sagen sie aus?
Sehe ich es richtig, daß wenn ich report.Bytes[3] = 4 setze, auf dem Port 3 wegen der [3] eine 4 rausgegeben wird?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Es ist hilfreich nicht nur die DLL anzugucken, sondern auch das Datenblatt des IO-Warrior zu lesen, dann hat man auch eine Chance zu verstehen wie das funktioniert.
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Da bin ich 100% deiner Meinung, aber das Datenblatt und auch das in dem SDK-Archiv enthaltene PDF zur Library haben mir nicht so wirklich weiterhelfen können
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

In einem Report ist jeweils ein Datenpaket verpackt das man vom IO-Warrior lesen bzw schreiben kann.

Will man auf die IO-Pins schreiben, so muss ReportID 0 sein. Andere ReportIDs werden auf dieser Pipe nicht akzeptiert.

Bytes und Value des Reports sind einander ueberlagert. Mit "report.Value = 0xFFFFFFFF;" werden erst mal alle Bits die man an die IO-Pins schreiben will auf high initialisiert. "report.Bytes[3] = 4;" setzt dann das oberste Byte von Value auf 4 = nur Bit 2 des Bytes gesetzt.

Die IO-Pis werden im Chip mit einem Widerstand nach high gezogen.
Von innen (per 0 schreiben) und von aussen kann man den Pin auf low ziehen. Zieht man schon von innen auf low kann man natuerlich nicht mehr erkennen wenn auch von aussen auf low gezogen wird.
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Super Dankeschön :o)
Und [3] damit ist dann der dritte Port gemeint oder?

Zumindest konnte ich auf diese Art und Weise die LEDs auf dem Applicationboard ansprechen *freu*
Wenigstens ein Erfolgerlebnis!
Denn dann wollt ich mal den Status des Tasters abfragen, was mir jedoch irgendwie nicht glückt *grübel*
Mit dem Beispielprogramm Ioblink funktioniert es jedoch, womit dann die richtige Funktion des Tasters bestätigt wurde.

Kann da vielleicht mal wer schauen, wo da der Hacken ist??Hier das vollständige C-Programm:

Code: Select all

#include "stdafx.h"
#include "iowkit.h"
#include <dos.h>
#include <stdio.h>

int main()
{
	IOWKIT_HANDLE ioHandle;
	IOWKIT40_IO_REPORT report;
	ULONG res;
    DWORD bits=0;



	ioHandle = IowKitOpenDevice();     //Öffnen der Verbindung
	if(ioHandle!=NULL)	
		if(IowKitGetProductId(ioHandle)==IOWKIT_PRODUCT_ID_IOW40)
			printf("IO-Warrior 40 gefunden");
		else
			printf("Irgendein IO-Warrior gefunden");
	else
	{
		printf("IO-Warrior nicht gefunden!");
		goto out;
    }
   	printf("%s\n",IowKitVersion());

	report.ReportID=0;
	//report.Value = 0xFFFFFFFF;

	//Setzen der Portbits
	report.Bytes[3] = 4;
    printf("Setzen des Port 3 mit %d\n", report.Bytes[3]);
	res=IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR)&report, IOWKIT40_IO_REPORT_SIZE);
	if(res!=IOWKIT40_IO_REPORT_SIZE)
	{
		printf("Ein Fehler ist aufgetreten! Bitte erneut versuchen!");
        goto out;
    }
    Sleep(2000);

	//Zurück-Setzen der Portbits
	report.Bytes[3] = 0xFFFFFFFF;
    printf("Setzen des Port 3 mit %d", report.Bytes[3]);
	res=IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR)&report, IOWKIT40_IO_REPORT_SIZE);
	if(res!=IOWKIT40_IO_REPORT_SIZE)
	{
		printf("Ein Fehler ist aufgetreten! Bitte erneut versuchen!");
        goto out;
    }

    printf("Bitte Taster betätigen!\n");


	if(IowKitReadImmediate(ioHandle, &bits))
    printf("%s",bits);



	IowKitCloseDevice(ioHandle);
    out:
    Sleep(2000);
    return 0;
}

wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Wie in der Doku steht, IowkitReadImmediate blockiert nicht bis was an den Ports passiert, sondern liefert bei einem Rückgabewert von TRUE Daten aus einem internen Puffer. Bei deinem Programm passiert also etwa folgendes:
Auf dem Bildschirm erscheint : Bitte Taster drücken
Dann kehrt ReadImmediate quasi sofort zurück, weil auch das Setzen der LED's schon als Portänderung gemeldet wird.
Und in dem Moment wo Du dann endlich den Taster drückst, ist das Programm schon längst in IowkitCloseDevice und damit eigentlich schon beendet.

Versuch mal folgendes:

Code: Select all

printf("Bitte Taster betätigen!\n"); 
sleep(2000); //2 sekunden zeit zum drücken 
//Nun alle reports aus dem internen puffer lesen, Taster
//drücken und loslassen sollte auch irgendwann dabei sein
While(IowKitReadImmediate(ioHandle, &bits)) 
    printf("%s",bits); 
IowKitCloseDevice(ioHandle); 
Eberhard
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Also irgendwie funktioniert das immer noch nicht *seufz*
Habe jetzt einfach deinen Code gegen meinen getauscht
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

PeeDee wrote:Also irgendwie funktioniert das immer noch nicht *seufz*
Habe jetzt einfach deinen Code gegen meinen getauscht
Etwas genauer bitte...

Eberhard
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Also es sieht jetzt so aus:

Code: Select all

#include "stdafx.h"
#include "iowkit.h"
#include "iowclass.h"
#include <dos.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
	IOWKIT_HANDLE ioHandle;
	IOWKIT40_IO_REPORT report;
	ULONG res;
    DWORD bits;



	ioHandle = IowKitOpenDevice();     //Öffnen der Verbindung
	if(ioHandle!=NULL)	
		if(IowKitGetProductId(ioHandle)==IOWKIT_PRODUCT_ID_IOW40)
			printf("IO-Warrior 40 gefunden");
		else
			printf("Irgendein IO-Warrior gefunden");
	else
	{
		printf("IO-Warrior nicht gefunden!");
		goto out;
    }
   	printf("%s\n",IowKitVersion());

	report.ReportID=0;
    report.Value = 0xFFFFFFFF;

	//Setzen der Portbits
	report.Bytes[3] = 4;
    printf("Setzen des Port 3 mit %d\n", report.Bytes[3]);
	res=IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR)&report, IOWKIT40_IO_REPORT_SIZE);
	if(res!=IOWKIT40_IO_REPORT_SIZE)
	{
		printf("Ein Fehler ist aufgetreten! Bitte erneut versuchen!");
        goto out;
    }
    Sleep(2000);

	//Zurück-Setzen der Portbits
	report.Value = 0xFFFFFFFF;
    printf("Setzen des Port 3 mit %d", report.Bytes[3]);
	res=IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR)&report, IOWKIT40_IO_REPORT_SIZE);
	if(res!=IOWKIT40_IO_REPORT_SIZE)
	{
		printf("Ein Fehler ist aufgetreten! Bitte erneut versuchen!");
        goto out;
    }

    printf("Bitte Taster betätigen!\n"); 
    Sleep(2000); //2 sekunden zeit zum drücken 
    //Nun alle reports aus dem internen puffer lesen, Taster 
    //drücken und loslassen sollte auch irgendwann dabei sein 
    while (IowKitReadImmediate(ioHandle, &bits)) 
        printf("Bla %s",bits); 
    IowKitCloseDevice(ioHandle); 

    out:
    Sleep(2000);
    return 0;
}
Er setzt dann die LEDs, setzt sie zurück, dann kommt "Bitte Taster betätigen!" und dann, dann beendet er, ohne irgendwas auszugeben, als ob er garnicht in die While-Schleife reinspringt
Last edited by PeeDee on Wed Jan 11, 2006 1:26 pm, edited 1 time in total.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Code: Select all

   //Zurück-Setzen der Portbits
   report.Bytes[3] = 0xFFFFFFFF;
Hier ist der erste Fehler. report.Value aka die anderen Bytes des Reports wurden nie initialisiert. Es steht ein Zufallsmuster drin.
Wahrscheinlich steht das Bit fuer den Taster auf 0 und daher kann es nicht vom Taster geaendert werden, der es ja auch nur auf 0 ziehen kann.
Keine Aenderung an den Pins bedeutet das der IO-Warrior keinen Report schickt und entsprechend das IowKitReadImmediate nichts zu lesen hat.

Code: Select all

   //Zurück-Setzen der Portbits
   report.Value = 0xFFFFFFFF;
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Sorry, ich meinte was ist der Fehler. Keine Ausgabe, oder siehst du nur keine TasterMeldungen?

Eberhard
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Hm...okay, hab "report.Bytes[3] = 0xFFFFFFFF;" in "report.Value = 0xFFFFFFFF;" geändert.
Jetzt bekomme ich bei Drücken des Tasters eine Fehlermeldung, daß die Exe beendet werden muss....
Echt komisch

@wayoda:
Wie gesagt, es macht den Anschein, als ob er nicht in die While-Schleife springt, da GARKEINE Ausgabe bezüglich Tasterbetätigung kommt
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Aendere mal die Message mit der Soure auf die aktuelle Source.
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Haben den unteren Code geupdated
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Der Teufel steckt im Detail und zwar hier:
while(..)
printf("Bla %s",bits);

Du printest %s also einen String!
Ändere mal in
printf("Bal %x\n",bits);

Und merke: ALLE Compiler-Warnungen einschalten ist immer wichtig!

Eberhard
Post Reply