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?
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
Hallo Der LPT(ECP/EPP) ist eigentlich bidirektional. Du musst das Bit5 im Steuerregister umkehren. Gruss Der Weihnachtsmann
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?
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
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
Also ich kann daraus nur schließen daß Du noch nie was in der Richtung programmiert hast ...
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
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); }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.