Announcement

Collapse
No announcement yet.

Schnittstellen Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schnittstellen Problem

    Hallo,<br>
    <br>
    Ich will über die <u>parallele Schnittstelle</u> eine einfache Ampel-Anlage steuern.
    Mein Problem ist: das ich noch nie mit sowas gearbeitet habe. Ich will sie einfach per Tastendruck aus- und anschalten.<br>
    Wer hat so etwas schon mal gebaut?<br>
    Gruß <b>Michael Springwald</b>

  • #2
    Hallo Michael,

    so lange Du mit Win9x arbeitest, kannst Du mit folgendem Code auf die parallele Schnittstelle zugreifen:<p>
    <b>procedure</b> WritePort(Adr: Word; Value: Byte);<br>
    <b>asm</b> <br>
    mov dx,Adr <br>
    mov al,Value <br>
    out dx,al <br>
    <b>end;</b> <br> <br>

    Adr ist üblicherweise $378 (für Lpt1). Da Du die Ampel <b>steuern</b> willst, d.h. nur auf den Port schreiben willst, kannst Du das Datenregister (das ist das Register, daß ohne Offset der Portadresse zugeordnet ist) verwenden. Ich denke mal, daß Du pro Datenbit eine LED ansprechen möchtest, d.h. Du mußt das Bit gezielt auf 1 setzen. Das kannst mit einer ODER-Funktion machen.Bit n setzen: Value := Value or 2^n <p>
    Gelöscht wird Bit n über eine UND-Verknüpfung. Bit n löschen: Value := Value and (255-2^n).<p>
    Der Vorteil der Verknüpfungen besteht darin, daß nur das gewünschte Bit manipuliert wird, während die anderen Bits nicht verändert werden.<p>
    2 Anmerkungen möchte ich Dir noch auf den Weg geben:<br>
    1) Die parallele Schnitstelle ist elektrisch recht empfindlich, d.h. Du solltest eine normale LED (18..25 mA), oder gar mehrere, nicht einfach über einen Vorwiderstand anschließen, sondern unbedingt z.B. über eine Transistortreiberstufe.<br>
    2) Unter NT funktioniert das ganze nicht.<br> <br>
    Viele Grüße Hans-Pete

    Comment


    • #3
      Hallo <b>Hans-Peter Tschan</b>
      Danke für den Code<br>
      Ich hätte da noch eine Frage wie werden Bitmuster gemacht.
      Unter Delphi 5S
      <br>
      Gruß <b>Michael</b&gt

      Comment


      • #4
        Hallo Michael,

        was meinst Du mit Bitmuster? Was willst Du genau machen?

        Gruß Hans-Pete

        Comment


        • #5
          Hallo <B>Hans-Peter Tschan </b><br>
          Ich wollte diese in Qbasic geschrieben Programm in Delphi 5s umwandeln
          <br>
          <i>
          10 REM *AMPELSTEUERUNG*<br>
          12 PHASEN = 4<br>
          30 DATA 100001<br>
          40 DATA 45000<br>
          50 DATA 110010<br>
          60 DATA 9000<br>
          70 DATA 001100<br>
          80 DATA 45000<br>
          90 DATA 010110<br>
          100 DATA 9000<br>
          120 REM ** H a u p t p r o g r a m m **<br>
          130 FOR M = 1 TO PHASEN<br>
          140 READ BITM$: GOSUB 1000<br>
          150 READ ZEIT: GOSUB 2000<br>
          160 NEXT M<br>
          170 RESTORE<br>
          180 GOTO 130<br>
          1000 REM** proc bitmuster **<br>
          1010 FOR N = 1 TO 6<br>
          1020 Z$(N) = MID$(BITM$, N, 1)<br>
          1030 IF NOT (Z$(N) = "1") THEN GOTO 1060<br>
          1040 S%(N) = 2 ^ (N - 1)<br>
          1050 S% = S% + S%(N)<br>
          1060 NEXT N<br>
          1070 OUT &H378, S%<br>
          1080 S% = 0<br>
          1090 RETURN<br>
          2000 REM ** proc warten **<br>
          2010 FOR Z = 1 TO ZEIT: NEXT Z<br>
          2020 RETURN</i><br>

          Gruß <b>Michael</b&gt

          Comment


          • #6
            Hallo Michael,<br><br>
            also die Bitmuster als strings gefallen mir gar nicht.Noch weniger gefällt mir die "Zeitschleife". Ich würde die Bitmuster halt schnell umrechnen und in ein array packen.Vorausgesetzt, das Bit rechts ist das LSB und ich hab' richtig gerechnet, dann sollten die Werte sogar stimmen:

            <b>const</b><br>
            aCtrlCode : <b>array</b>[0..3] <b>of</b> byte = (33,50,12,22);<br>
            aDelay : <b>array</b>[0..3] <b>of</b> integer = (4500,4500,9000,4500);<br>
            PortAdr = $378;<br>

            <b>procedure</b> WritePort(Adr: word; Value: byte);<br>
            <b>asm</b><br>
            mov dx, adr<br>
            mov al, value<br>
            out dx, ax<br>
            <b>end</b>;<br>

            <b>procedure</b> Ampel;<br>
            <b>var</b><br>
            i: integer;<br>
            <b>begin</b><br>
            <b>for</b> i := 0 <b>to</b> 3 <b>do</b><br>
            <b>begin</b><br>
            WritePort(PortAdr,aCtrlCode[i]);<br>
            sleep(aDelay[i]);<br>
            <b>end;</b><br>
            WritePort(PortAdr,0); // Alle LEDs aus<br>
            <b>end</b>;<br>

            Ich würde den Code in einen Thread packen (s. hier im Forum), da der Aufruf von sleep, im Prinzip den gleichen Effekt hat wie die Zeitschleife, nämlich das Programm ist blockiert.<br><br>
            Viele Grüße Hans-Pete

            Comment


            • #7
              Hallo,<b>
              Dakne für den Code<br>
              Gruß <b>Michael</b&gt

              Comment


              • #8
                Ich habe ihren Cod getestet er funktioniert aber ich möchte z.B von Ampel 1 die Rote-Lampe an haben und von Ampel 2 die Grüne un

                Comment


                • #9
                  Hi Michael,

                  entweder Du änderst die Werte der Steuercodes entsprechend ab oder setzt die die einzelnen Datenleitungen durch AND/OR - Verknüpfungen gezielt auf 1 bzw. 0 und lässt alle anderen Bits unverändert.

                  Ein einzelnes Bit läßt sich setzen/rücksetzen z.B. so:

                  <b>procedure</b> SetBit(<b>var</b> Value: byte; bit: byte);
                  <b>begin</b>
                  Value := Value <b>or</b> (1 <b>shl</b> bit );
                  <b>end</b>;

                  <b>procedure</b> ResetBit(<b>var</b> Value: byte; bit: byte);
                  <b>begin</b>
                  Value := Value <b>and</b> (255 - 1 <b>shl</b> bit);
                  <b>end</b>;

                  Um mehre Bits gleichzeitig zu ändern musst Du Dir einen entsprechenden Operanden als Konstante definieren, z.B.

                  Setzen der Bits 3 (Wertigkeit 2^3 = 8) und 2 (2^2 = 4)

                  Value := Value or 12

                  Rücksetzen von Bit 0 (2^0 = 1)

                  Value := Value and 25

                  Comment


                  • #10
                    Danke werde es mal testten<br> Gruß <b>Michael</b&gt

                    Comment


                    • #11
                      Ich habe mir das Beispiel von ihnen angesehen und komme damit ganicht zurecht.<br>
                      Könnten Sie mir ein Gesammtbeispiel schreiben und hier in das Forum kopieren oder mir per Emil senden([email protected])<br>Gruß <b>Michael</b&gt

                      Comment


                      • #12
                        Danke für Ihre Emi

                        Comment

                        Working...
                        X