nur einen Ausgang der Relais Karte Ansteuern?!



  • hallo, ich habe ein kleines Problem mit der Programierung. Hoffe das mir hier jemand helfen kann.

    Ich will an einer Relais Karte die am LPT Port 1 hängt nur ein Relais schalten die anderen sollen ihren Aktuellen Schaltzustand halten. Der Befehl

    i=0x378;x=0x01;(oup32)(i,x);
    

    in meinem Programm schaltet ja alle Relais bis auf das erst aus.
    gibt es da eine andere Möglichkeit?

    LG LoZe

    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    
         typedef short (_stdcall *inpfuncPtr)(short portaddr);
         typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);
    
    int main(void)
    {
    
         HINSTANCE hLib;
         inpfuncPtr inp32;
         oupfuncPtr oup32;
         short x;
         int i;
         /* Load the library */
         hLib = LoadLibrary("inpout32.dll");
         if (hLib == NULL) {
              printf("LoadLibrary Failed.\n");
              return -1;
               }
         /* get the address of the function */
         inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
         if (inp32 == NULL) {
              printf("GetProcAddress for Inp32 Failed.\n");
              return -1;
               }
         oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
         if (oup32 == NULL) {
              printf("GetProcAddress for Oup32 Failed.\n");
              return -1;
              }
         i=0x378;
         x=0x01;
         (oup32)(i,x);
         Sleep(200);
         i=0x378;
         x=0x0;
         (oup32)(i,x);
    }
    


  • Hallo,

    dazu musst du den aktuellen Zustand auslesen (8 Bit Wert),
    und darin über Bitmasken nur einzelne Bits setzen oder löschen.

    Beispiel: Wenn 0x05 (0000 0101) ausgelesen wird und nur die erste ausgeschaltet werden soll,
    dann den Wert mit der Maske 0xFE (1111 1110) verunden. Das Eregebnis ist dann 0x04 (0000 0100)

    uint8 u8CurrentValue = read()
    uint8 u8OutputValue = u8CurrentValue & 0xFE;
    write(u8OutputValue);
    

    Einschalten läßt sich das Bit über verordern mit 1:

    uint8 u8CurrentValue = read()
    uint8 u8OutputValue = u8CurrentValue | 0x01;
    write(u8OutputValue);
    


  • Erstmal Danke für die Antwort. Da ich erst grad dabei bin C zu Lernen, habe ich noch etwas Probleme mit dem Code Layout. Wo muss denn den Code denn Einfügen?



  • Meisst wird der Code in einen Editor oder mit etwas mehr Komfort in eine IDE eingegeben.
    Bei einigen IDE darfst du vorher wählen unter welchen Bedingungen der Zielcode laufen soll. Bei anderen IDE kann du auch, wenn der Quellcode schon eingegeben ist, noch die und weitere Änderungen vornehmen.

    Schreib mal kurz wie du das angehen möchtest, oder welche Programme dir bei coden zur Verfügung stehen sollen.

    MfG f.-th.



  • ich habe Boardland c++ Editor und die ersten Programme (Hello World, etc..) habe ich auch schon gemacht. Ich möche es so haben das immer wenn ich die Exe starte eben nur ein ausgang geschalten wird und die anderen ihren zustand behalten. Mfg LoZe



  • Hatte das ein wenig missverstanden, wie weit deine Kenntnisse mit der IDE reichen.

    Unter Linux, unter DOS oder unter Windows bis 98 ( ME ? ) sollte das so ähnlich anzugehen sein wie du das angehst.

    Unter Windows NT und seinen Nachfolgern ist der Parallelport nicht mehr so einfach direkt anzusteuern.

    Ich nehme an du meinst Borland 😃
    Bin bei Borland nicht so auf dem Laufenden ob die in der Version, die dir zur Verfügung steht, so was eventuell an Bord ist? Eventuell die Doku zu deinem Compiler lesen und, wenn da so was dabei ist, die richtigen Schalter im Compiler bezüglich deines Betriebssystems setzen.

    Was unternehmen, wenn der Compiler den Parallelport direkt für Windows NT und Nachfolger nicht unterstützt? Da gibt es im Netz Dll's oder Treiber, die unterschiedlich zu installieren sind. Dazu sollte man sich mit der entsprechenden Doku vertraut machen.

    Da der Parallelport in aktuellen PCs seltener wird, ist vielleicht auch die Überlegung so etwas über der USB-Port mit entsprechender Zusatzhardware umzusetzen nicht ganz abwegig.

    Viel Spass
    f.-th.



  • oh ja Borland Natürlich, ich habe Windows XP und einen etwas älteren Rechner mit Parallel-Port auf dem (und auch nur auf dem) das Programm Laufen Soll. aber ich glaube ich bin da schon etwas weiter als du denkst.
    Es funktioniert ja schon das ein Signal ankommt. nur werden die vorherigen alle mit dem neuen Signal Überschrieben Sprich an meiner Relais Karte werden Alle Signale Beeinflusst und nicht nur eins.

    Also nochmal zusammen der Code vom ersten Post Funktioniert soweit das die Relais Karte Angesprochen wird wenn ich 0xFF setze Werden Alle Ausgänge auf 1 Gesetzt und wenn ich 0x00 schreib werden alle auf 0 gesetzt. ich möchte aber mit dem ersten Programm die Relais 1-4 Steuern (mit Diversen If abfragen usw..) und mit dem zweiten Programm die 5-8, die den Status bzw Inhalt einer Datei Abfragen und je-nachdem einen Wert Ausgeben. Diese Dateien Sollen Unabhängig voneinander Laufen.

    Aber mir Fehlt eben nur die Funktion das ich gezielt nur ein Relais Schalten kann. Die Möglichkeit von "anonymus" (Post 2) Schien mir schon Logisch ich wusste nur nicht wie ich den Code von Ihm in Meinem Programm mit Einbau.

    mfg LoZe



  • Anonymus schrieb:
    Daten vom Port lesen, wahrscheinlich: inp32( LPT_port, Daten(x) )
    Maske über diese Daten legen, so das nur das von dir zu ändernde Bit gesetzt wird
    etwa : Daten_neu(x) = Daten(x) & 0xMEINBIT
    und dann Daten wieder zum Port schreiben.

    Nur zum Prinzip -> Feinheiten musst du halt anpassen

    MfG f.-th.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • f.-th. schrieb:

    Anonymus schrieb:
    Daten vom Port lesen, wahrscheinlich: inp32( LPT_port, Daten(x) )
    Maske über diese Daten legen, so das nur das von dir zu ändernde Bit gesetzt wird
    etwa : Daten_neu(x) = Daten(x) & 0xMEINBIT
    und dann Daten wieder zum Port schreiben.

    Nur zum Prinzip -> Feinheiten musst du halt anpassen

    MfG f.-th.

    äm ja und genau des alles ist mein Problem. Wie muss der code lauten und wo muss er in meinen Vorhandenen Quelltext rein.



  • Je nachdem wie du das umsetzt:
    ab Zeile 34 oder 35.



  • Vielen Dank an "anonymus" und "f.-th." habe es hin Bekommen mit folgendem code geht es so wie ich mir es vorgestellt habe.
    mfg LoZe

    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    
    #define LPT1   0x378
    #define Set1    0x01
    
         typedef short (_stdcall *inpfuncPtr)(short portaddr);
         typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);
    
    int main(void)
    {
    
         HINSTANCE hLib;
         inpfuncPtr inp32;
         oupfuncPtr oup32;
    
         short x;
         int i, bitmask;
         /* Load the library */
         hLib = LoadLibrary("inpout32.dll");
         if (hLib == NULL) {
              printf("LoadLibrary Failed.\n");
              return -1;
               }
         /* get the address of the function */
         inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
         if (inp32 == NULL) {
              printf("GetProcAddress for Inp32 Failed.\n");
              return -1;
               }
         oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
         if (oup32 == NULL) {
              printf("GetProcAddress for Oup32 Failed.\n");
              return -1;
              }
      int status = (inp32)(LPT1);
      bitmask = status | Set1;
      (oup32)(LPT1,bitmask);
      Sleep(1000);
      (oup32)(LPT1,status);
    }
    

Anmelden zum Antworten