Ola Würde es funktionieren, wenn man über 8 bit breiten Port, ein printf("hello world" an einen parallel Drucker schickt? ( Bondrucker ) Wie müsste die Pinbelegung auf dem Druckerkabel gemacht werden. Welche zusätzlichen PINS müsste man vom Druckerkabel verwenden? Stelle mir einen parallel Port vor, der anstatt ein LCD einen Drucker beliefert, funktioniert sowas? salute
Das geht problemlos. Die Belegung des Kabels findest du beispielsweise bei http://pinouts.ru/ParallelPorts/ieee1284b_pinout.shtml Du brauchst in jedem Fall die 8 Datenleitungen, Strobe und Busy. Was sonst noch notwendig ist, verrät dir dein Drucker Handbuch.
Hallo, das "Protokoll" der Druckerschnittstelle ist eines der einfachsten überhaupt, einfach nur Daten auf die Datenleitungen und einen Impuls auf Strobe. Unterlagen dazu gibt's tonnenweise, z.B. http://www.uni-protokolle.de/Lexikon/Centronics-Schnittstelle.html Georg
d0..d7 an druckerkabel pin Strobe an Strobe druckerkabel
1 | so:
|
2 | |
3 | STROBE = 1; // SIGNAL anlegen und Datenbus belegen |
4 | printf("hello world"); Datenwort schicken |
5 | STROBE = 0; // SIGNAL ablegen und Datenbus freigeben |
6 | |
7 | |
8 | oder so: |
9 | |
10 | |
11 | STROBE = 0; // SIGNAL anlegen und Datenbus belegen |
12 | printf("hello world"); Datenwort schicken |
13 | STROBE = 1; // SIGNAL ablegen und Datenbus freigeben |
14 | |
15 | |
16 | oder ganz anders? |
salute
Georg G. schrieb: > Das geht problemlos. Die Belegung des Kabels findest du beispielsweise > bei > http://pinouts.ru/ParallelPorts/ieee1284b_pinout.shtml > Du brauchst in jedem Fall die 8 Datenleitungen, Strobe und Busy. Was > sonst noch notwendig ist, verrät dir dein Drucker Handbuch. Ah,.. " STROBE Active low pulse used to transfer data into the printer. Pulse with must be between 0.5 and 500 microseconds for most printers. " dann:
1 | STROBE = 1; // SIGNAL Neutralisieren |
2 | STROBE = 0; // Pulsen für 0.5 bis 500 mikrosekunden |
3 | delay_us(100); |
4 | STROBE = 1; |
5 | printf("hello world"); Datenwort schicken |
6 | |
7 | oder so: |
8 | |
9 | printf("hello world"); Datenwort schicken |
10 | STROBE = 1; // SIGNAL Neutralisieren |
11 | STROBE = 0; // Pulsen für 0.5 bis 500 mikrosekunden |
12 | delay_us(100); |
13 | STROBE = 1; |
14 | // Drucker holt sich das Datenwort
|
15 | |
16 | oder doch ganz anders? |
druckerfrage schrieb: > oder ganz anders? Strobe ist die Übernahmeleitung. Erst legst du das Datenbyte an, dann erzeugst du einen Puls auf Strobe um der Gegenstelle anzuzeigen: Datenbits liegen an, bitte übernehmen. Ob die Strobe Leitung als Ruhepegel 0 oder 1 ansieht, verrrät dir das Handuch deiners Druckers (oder die Doku zur sog. Centronics Schnittstelle)
Karl Heinz schrieb: > Ob die Strobe Leitung als Ruhepegel 0 oder 1 ansieht, verrrät dir das > Handuch deiners Druckers (oder die Doku zur sog. Centronics > Schnittstelle) In der Centronics Spec http://de.wikipedia.org/wiki/IEEE_1284#Pinbelegungen ist über der Strobe Leitung ein QUerstrich, was so viel heisst wie 'active Low'. D.h der Ruhepegel ist eine 1 (Spannung) und gepulst wird nach 0.
druckerfrage schrieb: > ganz anders char string[] = "hello world"; char *cp; cp = string; while(*cp) { warten, dass der Drucker nicht busy ist; *cp auf Datenleitung legen; strobe auf 0; etwas warten; strobe auf 1; cp++; } Als Zugabe dann noch abfragen auf Papier zu Ende, Fehler usw
druckerfrage schrieb: > oder ganz anders? Ja, ganz anders. Jedes Zeichen für sich muss durch das low-aktive STROBE-Signal getaktet werden. Man sollte auf jeden Fall auch BUSY (high-aktiv) auswerten. Hinsichtlich ACK (low-aktiv) muss man etwas aufpassen. Üblicherweise wird ACK gesetzt, sobald der Drucker das aktive STROBE erkannt hat. Dann deaktiviert man STROBE, wartet ggf. auf die Deaktivierung von ACK und Busy und sendet das nächste Zeichen. Dadurch ergibt sich ein "wasserdichtes" Handshake. Einige Drucker aktivieren ACK aber erst nach Deaktivierung von STROBE, d.h. bei dem zuvor beschriebenen Verfahren wartet der Sender ewig auf ACK. Dann muss man STROBE schon nach einer angemessenen Wartezeit zurücknehmen und auf einen Impuls auf ACK warten. Das ist sehr unschön, weil auf diese Art und Weise auf einmal Zeitabhängigkeiten ins Spiel kommen. Ich hatte früher dieses Problem einmal durch eine externe Schaltung lösen müssen, die mittels Monoflop einen STROBE-Impuls für den Drucker erzeugt. Wenn ich es recht erinnere, handelte es sich bei dem Drucker um einen Oki Microline irgendwas; es gab aber auch andere Drucker mit diesem ungünstigen STROBE/ACK-Verhalten.
druckerfrage schrieb: > printf("hello world"); Datenwort schicken Das ist doch kein Datenwort. Das ist ein String! Ein String wird gedruckt, indem Zeichen für Zeichen gedruckt wird. EIn Zeichen wird gedruckt, indem man den ASCII Code des Zeichens an die Datenbits anlegt und Strobe-0 Strobe-1, wobei es sicherlich noch Zeiten zu beachten gibt. Und es wäre gut, vor der Übertragung eines Zeichens noch einen Blick auf die Busy Leitung zu werfen, mit der dir der Drucker anzeigt, dass er beschäftigt ist und jetzt keine Zeit hat, sich mit dir zu beschäftigen.
Im allgemeinen ist /STROBE aktiv low, d.h. es wird kurz mal auf Masse gezogen, während das Byte an den Datenleitungen liegt. Wimre latcht der Drucker das Byte auf der steigenden Flanke. Wenn er keinen Speicher hat, hebt er dann BUSY auf High und der Rechner muss warten, bis BUSY wieder low ist. /ACK sollte auf low gehen, wenn der Drucker das Byte intus hat. Manche Drucker brauchen ein /SELECT_IN Signal, das aber auf Masse bleiben kann. Aber das steht hier auch alles: http://pinouts.ru/ParallelPorts/Centronics_pinout.shtml Eineinhalb 8-bit Ports sollten ausreichen. Das einzig böse sind die nicht unbeträchtlichen Ströme, die manche Drucker verlangen, aber ein Bondrucker sollte nicht dazu gehören. Im originalen PC warens ja richtige Bustreiber.
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.