Laden...

Frage zu 32bit I/O Karte

Erstellt von B'n'H AciD vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.249 Views
B
B'n'H AciD Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren
Frage zu 32bit I/O Karte

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 gedrckte Taste analysiert mit entsprechende Ausfhrung }

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

F
124 Beiträge seit 2004
vor 19 Jahren

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.

B
B'n'H AciD Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren

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

F
124 Beiträge seit 2004
vor 19 Jahren

funktioniert denn dein beispielproggi unter 2k/xp ?

B
B'n'H AciD Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren

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

H
704 Beiträge seit 2003
vor 19 Jahren

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/

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
B
B'n'H AciD Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren

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