Sebastian: C-Problem: Parralelport nach einem bestimmten Pin abfragen !

Mein Problem: Ich will ein Programm schreiben (DOS, BorlandC), welches u.a. den Parralelport-Pin 11 (Busy oder Paperout) abfragen soll.

Mit inport kann ich das machen (oder inp), aber der Befehl befragt den ganzen Port, glaube ich.

Ich hab mal gesehen, das man das so schreiben muss:

inport(0x378) AND bla;

wobei bla für einen bestimmten wert steht.

Wen es interessiert - der Hintergrund:
Ich will den TLC549 abfragen. Das ist ein A/D Wandler.
Ich gebe ihm eine Positive Taktflanke auf CS (Pin 4 auf chip, 2 auf lpt)), er wandelt, und bei jedem Takt auf "I/O CLock" (pin3 auf lpt) legt er auf "data out" (lpt=pin11 oder 12) eine zahl.
Ich frage also mit einer for-schleife eine binäre zahl nach der andren ab. Aber wie lautet die syntax von outport ?????

-DerSEBBE

  1. Hallo,

    sorry ich glaube, du bist etwas off-topic.

    Trotzdem, meinst du das:

    void outport (int portid, int value)

    portid ist die Port ID
    value ist der Wert.

    :-)
    oder habe ich die Frage nicht richtig verstanden?

    Gruß

    1. Doch doch, schon richtig !
      Aber int value ist mir ein Rätsel.
      und vor allem: manche shiften das ergebnis von inport mit AND und noch was dahinter.
      Das dient glaube ich dem Focussieren von INPORT (!).

      Hallo,

      sorry ich glaube, du bist etwas off-topic.

      Trotzdem, meinst du das:

      void outport (int portid, int value)

      portid ist die Port ID
      value ist der Wert.

      :-)
      oder habe ich die Frage nicht richtig verstanden?

      Gruß

  2. Hallo Sebastian!

    Hardwarebastelen ist zwar eher offtopic hier, aber immerhin SELF ;-)

    So würde ich es machen, vielleicht iss ja die eine oder andere Idee für dich dabei.

    http://www.ucl.ac.uk/~ucapwas/pportbas.html
    http://www.doc.ic.ac.uk/~ih/doc/adc_dac/tlc549/tlc549.html

    ___
    CS=PIN2 =D0  _|    =Start Conversion
                            ___
    I/O Clock=PIN3 = D1  __|   |__  Shift Data out

    Data Out=PIN11=BUSY = D7 vom statusport, invertiert
    oder     PIN12=PaperEmpty= D5 vom statusport

    /***************************************************

    ungetestet!

    */

    int i;
    int data;
    int in;
    int port=0x378; /* LPT1 */

    outportb(port,1);
    outportb(port,0); /* Start Conversion */
    data=0;
    for(i=0;i<8;i++)
    {
      in=inportb(port+1);

    data<<=1;
      if(!(in&0x80)) /* 1 bit bekommen */
        data|=1;

    /* oder per Paper empty
      if(in&0x20)
        data|=1;
    */

    outportb(port,2);  /* Shift Clock */
      outportb(port,0);
    }
    outportb(port,1);

    /***********************************************/

    Gruss,
     Carsten

    1. data<<=1;
        if(!(in&0x80)) /* 1 bit bekommen */
          data|=1;

      Das versteh ich nicht.
      data<<=1 //schiebt die variable um eins nach links ?!?
      und das mit dem if versteh ich auch nicht.
      was soll "in&0x80" bedeuten ?!?

      Ansonsten: Sehr herzlichen Dank !!!

      Der sich nah am Ziel befindende

      Sebbe (Sebastian)

      1. Hallo Sebastian!

        Das versteh ich nicht.
        data<<=1 //schiebt die variable um eins nach links ?!?

        Ja, tut es.

        Die Werte kommen bitweise an, das höchste Bit zuerst. Und hier werden sie in der Variablen data gesammelt und nach jedem Schritt um eins nach links geschoben. Nach acht[1] Schritten sind sie dann alle an ihrem Platz.

        und das mit dem if versteh ich auch nicht.

        data ist mit 0 vorbelegt, es brauchen also nur "1" bits gesammelt zu werden. (Das passiert dann mit data|=1 das fügt ein "1" bit an unterster Stelle ein.)

        was soll "in&0x80" bedeuten ?!?

        Das prüft, ob nur das höchste Bit (dessen Wertigkeit 0x80=128 ist) gesetzt ist, also ob aus dem Wandler grade eine 1 oder eine 0 rauspuzelt. Das ! davor invertiert die Abfrage, da der Eingang (Hardwarebedingt) das auch tut (und sich das somit wieder aufhebt).

        Gruss,
         Carsten

        [1] eigentlich sieben, im ersten Schritt werden nur Nullen verschoben. Das letzte bit landet ja auf der nullten Position und wird gar nicht mehr geschoben.