Hi,
hab mal ne Frage zur Ansteuerung einer 32 Bit I/O Karte und ob ich das unter C# auch hinbekomme.
Die Karte ist auf nem ISA-Steckplatz und wird in Pascal über den Port Befehl angesprochen.
Leider find ich grad nix in C# mit dem ich das machen könnt. 😠
Hier mal ein Demo-Prog was bei der Karte bei war.
Uses CRT;
Type Str2 = String [ 2];
Str8 = String [ 8];
Str16 = String [16];
Str79 = String [79];
Const ESC = 27; { Code der ESC-Taste }
Enter = 13; { Code der Enter-Taste }
CursorRight = 77; { Code der Cursor rechts-Taste }
CursorLeft = 75; { Code der Cursor links-Taste }
CursorUp = 72; { Code der Cursor hoch-Taste }
CursorDown = 80; { Code der Cursor runter-Taste }
Var Verlassen : Boolean;
I, Key, Count, NR : Byte;
Basisadresse : Word;
Port_Inhalt: Array [0..3] of Byte;
Const Screen :Array [0..24] of Str79 = ( { Bildschirminhalt beim Start }
'ELV-PIO-32 32 Bit-I/O-Karte Test- und Inbetriebnahme-Programm '#13#10,
'-----------------------------------------------------------------------------'#13#10,
' '#13#10,
'Zustand der Eingangsleitungen: '#13#10,
' Bin„r Bit '#13#10,
'Darstellung : 76543210 Hex Dezimal '#13#10,
'------------------------------------------------- '#13#10,
'Basisadresse + 0 : B H D '#13#10,
' '#13#10,
'Basisadresse + 1 : B H D '#13#10,
' '#13#10,
'Basisadresse + 2 : B H D '#13#10,
' '#13#10,
'Basisadresse + 3 : B H D '#13#10,
'-----------------------------------------------------------------------------'#13#10,
' '#13#10,
'Ausgangstreiber: '#13#10,
'Basisadresse : < +0 >< +1 >< +2 >< +3 > '#13#10,
' Bit 76543210765432107654321076543210 '#13#10,
'Zust„nde der Ausg„nge '#13#10,
' '#13#10,
'-----------------------------------------------------------------------------'#13#10,
'Tasten: '#27','#26' : Bit w„hlen '#24',1 : Bit setzen'#13#10,
' I,T : Bit invertieren '#25',0 : Bit l”schen'#13#10,
' Enter : alle Bits invertieren Esc : Programm beenden'
);
Function Binary8 (Inhalt : Byte):Str8;
{ Umwandlung von einer Byte-Variablen in eine Bin„rzahl }
Var ST: Str8;
K : Byte;
Begin
ST := '';
For K := 7 Downto 0 do
If (Inhalt AND (1 SHL (K))) <> 0
Then ST := ST +'1'
Else ST := ST +'0';
Binary8 := ST;
End;
Function Hex8 (Inhalt : Byte):Str2;
{ Umwandlung von einer Byte-Variablen in eine Hexadezimale Zahl }
Const ST : Str16 ='0123456789ABCDEF';
Begin
Hex8 := ST [((Inhalt SHR 4) AND $0F) +1]
+ ST [(Inhalt AND $0F) +1];
End;
Procedure Show_Bits (Basis : Word);
{ zeigt den Zustand der einzelnen Bits der I/O-Ports }
Var IS,P : Byte;
Begin
For IS := 0 to 3 do
Begin
P := Port [Basis +IS]; { Zustand des jeweiligen Ports einlesen }
Gotoxy (25, 8+ IS *2); Write (Binary8 (P)); { Bin„r-Darstellung }
Gotoxy (36, 8+ IS *2); Write (Hex8 (P)); { Hex-Darstellung }
Gotoxy (41, 8+ IS *2); Write (P:3); { Dezimal-Darstellung }
End; { of For }
End;
Procedure NewPort (NR:Byte);
{ aktualisiert den Portinhalt und dokumentiert den Inhalt auf dem Bildschirm }
Begin
Port [Basisadresse +NR] := Port_Inhalt [NR]; { Portinhalt aktualisieren }
Gotoxy (25 +NR *8,20); Write (Binary8 (Port_Inhalt [NR]));
End;
Procedure Tastenauswertung (Var ESC_Taste : Boolean);
{ hier wird die gedrckte Taste analysiert mit entsprechende Ausfhrung }
Begin
ESC_Taste := False;
Key := Ord (ReadKey);
If Key = 0 Then Key := Ord (ReadKey); { Wenn Funktionstaste, dann nochmal }
Case Key of
ESC : ESC_Taste := True; { Programm verlassen }
Ord(' '), CursorRight: Begin
Gotoxy (31-Count +25,21); Write (' ');
DEC (Count);
If Count = 255 Then Count := 31;
Gotoxy (31-Count +25,21); Write ('!');
End;
CursorLeft : Begin
Gotoxy (31-Count +25,21); Write (' ');
INC (Count);
If Count = 32 Then Count := 0;
Gotoxy (31-Count +25,21); Write ('!');
End;
Enter : Begin
For NR := 0 to 3 do
Begin
Port_Inhalt [NR] := Port_Inhalt [NR] Xor $FF;
NewPort (NR);
End;
End;
Ord('0'), CursorDown : Begin
NR := (31-Count)SHR(3);
Port_Inhalt [NR] := Port_Inhalt [NR] AND
((1 SHL(Count AND $07)) Xor $FF);
NewPort (NR);
End;
Ord('1'), CursorUp : Begin
NR := (31-Count)SHR(3);
Port_Inhalt [NR] := Port_Inhalt [NR] OR
(1 SHL(Count AND $07));
NewPort (NR);
End;
Ord('i'), Ord('I'),
Ord('t'), Ord('T') : Begin
NR := (31-Count)SHR(3);
Port_Inhalt [NR] := Port_Inhalt [NR] XOR
(1 SHL(Count AND $07));
NewPort (NR);
End;
End; { of Case }
End; { Procedure Tastenauswertung }
Begin
Basisadresse := $300; { muá je nach Einstellung angepaát werden }
ClrScr; { l”schen des Bildschirms }
LowVideo; { halbe Helligkeit }
For I := 0 to 24 do Write (Screen [I]); { Grundinitialisierung des }
HighVideo; { volle Helligkeit } { Bildschirms }
Verlassen := False;
Count := 31; { Schreibcursor initialisieren }
Gotoxy (31-Count +25,21); Write ('!');
HighVideo;
For I := 0 to 3 do
Begin
Port_Inhalt [I] := 0; { alle Ausgabeports nach den Start des Programms }
NewPort (I); { auf 00000000B }
End;
Repeat { Beginn der Hauptschleife }
Show_Bits (Basisadresse); { Ausgabe der aktuellen Portinhalte }
If Keypressed Then Tastenauswertung (Verlassen); { Portausgabe }
Until Verlassen; { Ende der Hauptschleife }
ClrScr;
Writeln ('Ende des 32-Bit-Testprogramms');
End.
Bitte helft mir 😁
[x] hier bohren für neuen Monitor
war vielleicht auch ne win32-dll dabei, die die karte ansteuern kann? ansonsten such dir ein paar c/c++-ler und quäl die, die sollen dir eine schreiben oder helfen eine zu schreiben, wenn du dann alles in vielleicht 2 funktionen (setzen/auslesen oder was du da halt machen willst/kannst) hast, dann kannste die funktionen aus der dll datei importieren und über interop in c# nutzen.
direkt mit c# da irgendwas zu machen sieht für mich ehr dunkel aus.
das habsch mir fast gedacht.
Hab schicke port.dll's gefunden mitlerweile die aber nur bis wen wunderts NT laufen. 🙂
Bei der Karte is nur das schicke Beispielproggi bei. 😠
Kennt einer vielleicht ne dll mit der ich ports öffnen kann die auch unter windows 2000 lüppt??
[x] hier bohren für neuen Monitor
funktioniert denn dein beispielproggi unter 2k/xp ?
es scheint zu funzen. Werd dem ganzen aber heut Abend noch genauer auf den grund gehen und dann mal posten ob es auch mit dem ansrepechen der port adressen richtig läuft.
[x] hier bohren für neuen Monitor
Sieh dir mal das an:
http://www.codeproject.com/csharp/csppleds.asp?df=100&forumid=21021&exp=0&select=943030
Dabei wird die DLL inpout32.dll verwendet. Auf dieser Website bekommst du sie:
http://www.logix4u.cjb.net/
danke hauptmann. das sieht doch schonmal gut aus. werd mich mal dransetzen und das ganze versuchen. meld mich wenn es erfolg gebracht hat. 😉 wenn nicht sowieso 😁
[x] hier bohren für neuen Monitor