Forum: PC-Programmierung LPT Port


von Joe (Gast)


Lesenswert?

Ich habe einen ganz normalen LPT Port am PC. Ich weiss jetzt gar nicht
ob der LPT Port bidirektional ist. Wie kann ich einen LPT Port auf
Eingang umschalten?

von Jens123 (Gast)


Lesenswert?

er ist bidirektional

such mal bei google hatte mir damals mal ein programm in c geschrieben
um den paralelport aus der console anzusprechen

eigendlich ganz einfach

von Weihnachtsmann (Gast)


Lesenswert?

Hallo

Der LPT(ECP/EPP) ist eigentlich bidirektional.
Du musst das Bit5 im Steuerregister umkehren.

Gruss

Der Weihnachtsmann

von Joe (Gast)


Lesenswert?

Was bedeutet Bit 5 umkehren? Wenn ich Daten lesen will, muss ich das Bit
auf eins setzen oder auf Null?

Im Internet habe ich erfahren, dass das BIT 5 vom ControlRegister nicht
bei jedem LPT Port funktioniert. Stimmt das?

von Marko B. (Gast)


Lesenswert?

Starte debug (du must in einem richtigen DOS sein, also von ner
Bootdiskette booten)

gib ein:

o 378 00

i 378

es muß 00 angezeigt werden (sonst ist der Port kaputt)

dann

o 37a 10

i 37a

wenn jetzt FF angezeigt wird, dann ist der Port bidirektional.
ansonsten kommt 00 zurück -> nicht bidirektional

von Weihnachtsmann (Gast)


Lesenswert?

Wenn Bit5 nicht unterstützt wird dann wird LPT auch nicht Bidirektional
sein. Das ist bei recht alten Computer der Fall.
Mein 14 jähriger PC unterstützt Bidirektionaler Datenverkehr.

Du kannst ja Bit5 lesen und dann Invertieren.

Gruss

Der Weihnachtsmann

von Marko B. (Gast)


Lesenswert?

Bit 5 ist write-only.

von Weihnachtsmann (Gast)


Lesenswert?

Write / Read

von Marko B. (Gast)


Lesenswert?

Also ich kann daraus nur schließen daß Du noch nie was in der Richtung
programmiert hast ...

von Weihnachtsmann (Gast)


Lesenswert?

Wenn meinst du Marko B?

Gruss

Weihnachtsmann

von Weihnachtsmann (Gast)


Lesenswert?

Hallo Joe


Wenn deine LPT ECP oder EPP unterstützt dann ist sie auch
Bidirektional. Und das kannst du im Bios nachschauen und/oder sogar
einstellen.

Gruss

Weihnachtsmann

von Joe (Gast)


Lesenswert?

Ok im BIOS habe ich die Einstellung für den LPT vorgenommen.
Leider kann das Reset Request Bit nicht auf "1" setzen.

Das Reset Request Bit muss doch geprüft werden um dann das Bittiming
und die Nachrichtenfilter zu setzen. Erst dann können CAN-Botschaften
gesendet oder empfangen werden. Das Programm bleibt immer in der
do..while Schleife hängen. Was muss ich ändern damit die
Initialisierung durchläuft?

/*----Initialisierungsroutine für den CAN-Controller
SJA1000------------*/
void can_init(void)
{
 do
  {
   canreg_write(0,0x01);
  }
 while (((canreg_read(0)) &0x01)==0);
 canreg_write(4,0xFF);
 canreg_write(5,0xFF);

 canreg_write(6,0x43);
 canreg_write(7,0x2F);
 canreg_write(8,0x1A);
 canreg_write(31,0x07);

 do
  {
   canreg_write(0,0x00);
  }
 while (((canreg_read(0))&0x01)==01);
 canreg_write(1,0x0C);
}

von Weihnachtsmann (Gast)


Lesenswert?

Hallo Joe

Ich moment bin ich überfragt. Das hat jetzt mit CAN zu tun?
Anhand es Codes sehe ich nicht ob dies direkt mit LPT oder mit CAN zu
tun hat. Ich sehe nur dass du Bit1 prüfst.

Wenn ja dann Prüf ob LPT ohne CAN richtig funktioniert.
Sonst kannst du den Fehler nicht erruierten.

Gruss

Weihnachtsmann

von Weihnachtsmann (Gast)


Lesenswert?

Hallo Joe

Sorry du prüfst natürlich Bit0 nicht Bit1

von Joe (Gast)


Lesenswert?

Ok so wie es aussieht funktioniert die CAN Initialisierung.
Jetzt bin ich gerade dabei eine Botschaft auf den CAN Bus zu senden.
Das habe ich bis jetzt nicht zum laufen gebracht.
Das Programm bleibt bei "warten bis Sendung ausgelöst" stehen.
Es kann auch sein das die Initialisierung doch nicht richtig ist. Wie
gesagt den SJA1000 habe ich zusammen mit einem ATMEL Controller
am laufen. Klappt wunderbar.

/*----CAN Botschaft
senden------------------------------------------------*/
void TForm1::canmessage_write(struct message *ptransmit)
{
   unsigned int id_1,id_2,id_3;
   unsigned int id_1_hilf,id_2_hilf,id_3_hilf;
   unsigned int trdscr_wert;
   unsigned int i;

   id_3=(ptransmit->id)&0x0f;
   id_2=((ptransmit->id)/16)&0x0f;
   id_1=((ptransmit->id)/256)&0x0f;

   id_1_hilf=id_1*32;
   id_2_hilf=id_2*2;
   id_3_hilf=id_3/8;

   trdscr_wert=(id_1_hilf)|(id_2_hilf)|(id_3_hilf);
   canreg_write(10,trdscr_wert);


   id_3=(ptransmit->dlc)&0x0f;
   id_2=(ptransmit->rtr)*16;
   id_1=((ptransmit->id)&0x0f)*32;

   trdscr_wert =(id_3)|(id_2)|(id_1);
   canreg_write(11,trdscr_wert);

   for (i=0;i<=7;i++)
    {
     canreg_write (12+i,ptransmit->byte[i]);
    }
   canreg_write (1,0x01);                //Sendung auslösen

   do
    {
    }
   while (((canreg_read(2))&0x08)==0);    //warten bis Sendung fertig

}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.