Forum: Mikrocontroller und Digitale Elektronik LPT auch von einem mikrocontroller aus machbar?


von druckerfrage (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von druckerfrage (Gast)


Lesenswert?

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

von druckerfrage (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Georg G. (df2au)


Lesenswert?

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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
Noch kein Account? Hier anmelden.