Hallo.
Ich facnge gerade an mich mit den IOW40 zu beschäftigen. Bislang experimentiere ich mit dem Programm ioblinc aus dem SDK. Ich möchte gerne meine Programme mit C++ schreiben, da ich da am meißten Erfahrung habe.
In ioblinc habe ich herausgefunden, dass eine zufällige Zahl in eine Variable bits (int) geschrieben wird und diese über eine Write Funktion an den IOW übertragen wird. Wie läuft das eigentlich ab, wenn ich die einzelne Ausgänge direckt anteuern möchte. Meine Idde wäre, eine Zahl in die Variable Bits zu schreiben, die dem gewünschten wert entspricht. Ich habe dies bereits versucht, aber ohne Erfolg. Gibt es irgendwo beispiele?
Schöne Grüße
Frank
Digitale Ausgaben über den IO W 40
Moderator: Guido Körber
Ich hab das in der iowclass.h gemacht:
Viel Spaß
Code: Select all
// Write one port
BOOLEAN WritePort(int port, ULONG value)
{
printf("Byte %i: %x\n",port,value);
IOWKIT_REPORT rep;
BOOLEAN rc = FALSE;
ULONG read;
ULONG port0=0;
ULONG port1=0;
ULONG port2=0;
ULONG port3=0;
ULONG value_new=0;
rc = ReadImmediate((ULONG *) &read);
printf("%.8x \n",read);
port0= read & 0xFF;
read >>= 8;
printf("%.8x \n",read);
port1= read & 0xFF;
read >>= 8;
printf("%.8x \n",read);
port2= read & 0xFF;
read >>= 8;
printf("%.8x \n",read);
port3= read & 0xFF;
printf("P3: %.2x ",port3);
printf("P2: %.2x ",port2);
printf("P1: %.2x ",port1);
printf("P0: %.2x \n",port0);
switch (port)
{
case 0:
port0 =value;
break;
case 1:
port1 =value;
break;
case 2:
port2 =value;
break;
case 3:
port3 =value;
break;
}
value_new = value_new | port3;
value_new <<=8;
value_new = value_new | port2;
value_new <<=8;
value_new = value_new | port1;
value_new <<=8;
value_new = value_new | port0;
// Init report
rep.ReportID = 0;
rep.Value = value_new;
switch (GetProductId()) {
// Write simple value to IOW40
case 0x1500:
rc = Write(0, (PCHAR) &rep, 5);
break;
// Write simple value to IOW24
case 0x1501:
rc = Write(0, (PCHAR) &rep, 3);
break;
}
return rc;
}
BOOLEAN SetPin(int port, int pin)
{
int var;
DWORD value;
IOWKIT_REPORT rep;
BOOLEAN rc = FALSE;
rc = ReadImmediate((ULONG *) &value);
switch (port)
{
case 0:
{
var = 0x01;
var <<=pin;
value = value | var;
break;
}
case 1:
{
var = 0x0100;
var <<=pin;
value = value | var;
break;
}
case 2:
{
var = 0x010000;
var <<=pin;
value = value | var;
break;
}
case 3:
{
var = 0x01000000;
var <<=pin;
value = value | var;
break;
}
}
// Init report
rep.ReportID = 0;
rep.Value = value;
switch (GetProductId()) {
// Write simple value to IOW40
case 0x1500:
rc = Write(0, (PCHAR) &rep, 5);
break;
// Write simple value to IOW24
case 0x1501:
rc = Write(0, (PCHAR) &rep, 3);
break;
}
return rc;
}
BOOLEAN ResetPin(int port, int pin)
{
int var;
DWORD value;
IOWKIT_REPORT rep;
BOOLEAN rc = FALSE;
rc = ReadImmediate((ULONG *) &value);
switch (port)
{
case 0:
{
var = 0xFFFFFFFE;
var <<=pin;
value = value & var;
break;
}
case 1:
{
var = 0xFFFFFEFF;
var <<=pin;
value = value & var;
break;
}
case 2:
{
var = 0xFFFEFFFF;
var <<=pin;
value = value & var;
break;
}
case 3:
{
var = 0xFEFFFFFF;
var <<=pin;
value = value & var;
break;
}
}
// Init report
rep.ReportID = 0;
rep.Value = value;
switch (GetProductId()) {
// Write simple value to IOW40
case 0x1500:
rc = Write(0, (PCHAR) &rep, 5);
break;
// Write simple value to IOW24
case 0x1501:
rc = Write(0, (PCHAR) &rep, 3);
break;
}
return rc;
}
ULONG LCD_Enable()
{
ULONG bytes;
char data[7];
data[0] = 0x04;
data[1] = 0x01;
bytes = IowKitWrite(m_devHandle, 1, data, 8);
return bytes;
}
ULONG LCD_Disable()
{
ULONG bytes;
char data[7];
data[0] = 0x04;
data[1] = 0x00;
bytes = IowKitWrite(m_devHandle, 1, data, 8);
return bytes;
}
ULONG LCD_Init()
{
ULONG bytes;
char data[7];
data[0] = 0x05;
data[1] = 0x03;
data[2] = 0x28 | 0x10;
data[3] = 0x01;
data[4] = 0x0F;
bytes = IowKitWrite(m_devHandle, 1, data, 8);
return bytes;
}
ULONG LCD_Cmd(int cmd)
{
ULONG bytes;
char data[7];
data[0] = 0x05;
data[1] = 0x01;
data[2] = cmd;
bytes = IowKitWrite(m_devHandle, 1, data, 8);
return bytes;
}
ULONG LCD_Set_Addr(int addr)
{
ULONG bytes;
char data[7];
data[0] = 0x05;
data[1] = 0x01;
data[2] = (0x80 | addr);
bytes = IowKitWrite(m_devHandle, 1, data, 8);
return bytes;
}
ULONG LCD_String(char *string)
{
ULONG bytes;
char data[7];
int nchars=0;
int nnow=0;
int ncurr=0;
data[0]=0x05;
nchars = strlen(string);
while (ncurr < nchars)
{
if ((ncurr+6)>nchars)
{
nnow = nchars - ncurr;
}
else
{
nnow = 6;
}
data[1] = (0x80 | nnow);
for (int x=0; x<nnow; x++)
{
data[x+2] = string[x+ncurr];
}
bytes = IowKitWrite(m_devHandle, 1, data, 8);
ncurr = ncurr +6;
}
return bytes;
}
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Digitale Ausgaben über den IO W 40
Im Prinzip richtig, es werden immer alle Portspins gleichzeitig gesetzt, also muss man sich vorher die 32 Bit (16 beim IOW24) mit Logikfunktionen zusammenbauen und dann an den IO-Warrior schicken.Frank S. wrote:Wie läuft das eigentlich ab, wenn ich die einzelne Ausgänge direckt anteuern möchte. Meine Idde wäre, eine Zahl in die Variable Bits zu schreiben, die dem gewünschten wert entspricht. Ich habe dies bereits versucht, aber ohne Erfolg.