C-Problem: Parralelport nach einem bestimmten Pin abfragen !
Sebastian
- programmiertechnik
0 Peter Schaich0 Carsten
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
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ß
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ß
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
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)
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.