Forum: Mikrocontroller und Digitale Elektronik Thermal Printer ansteuern


von Gäst_5 (Gast)


Lesenswert?

Hallo,

ich möchte folgenden Thermo Drucker mit einem ATmega128 ansteuern:

https://www.sparkfun.com/products/10438

Ich habe dazu eine Arduino Bibliothek gefunden (link gibts auf der Seite 
unten).
Auf dem Arudino Board sitzt doch auch nur ein ATmega.

Was ich jetzt brauch, ist eine Herangehensweise, wie ich diese 
Bibliothek auf dem ATmega128 zum laufen bekomme.

Kann mir dabei jemand helfen?

mfg

von Karl H. (kbuchegg)


Lesenswert?

Gäst_5 schrieb:

> Was ich jetzt brauch, ist eine Herangehensweise, wie ich diese
> Bibliothek auf dem ATmega128 zum laufen bekomme.

Der Drucker wird über eine ganz normale serielle Schnittstelle 
angesteuert. Im Handbuch sind die Escape Sequenzen für alle möglichen 
Sonderdinge angegeben, aber wenn du dem Drucker ganz einfach über die 
Serielle Schnittstelle ein "abcd" schickst, dann druckt der "abcd" (ein 
Crriage Return / Line Feed noch hinten nach. Die meisten Drucker drucken 
erst dann, wenn sie eine komplette Zeile haben.

Und der Rest ist: Handbuch-PDF lesen. Das kann dir keiner abnehmen.

von Christian B. (casandro)


Lesenswert?

Also eine Bibliothek brauchst Du dafür nicht, wie schon gesagt einfach 
erst mal die serielle Schnittstelle zum Laufen bringen, dann mal das 
Alphabet hin schicken mit #13 #10 danach (carriage return, line feed).

Dann sollte er das Alphabet drucken. Pack das dann in schöne Routinen, 
und spiele mal damit. Glaub mir die Befehle durchzuspielen macht Spaß.

Die fangen in aller Regel mit dem Zeichen #27 ESCape an. Das ist anfangs 
vielleicht etwas schwierig zu verstehen.

von Gäst_5 (Gast)


Lesenswert?

okay - danke!

Die Drucker werden an meinem µC an ganz normale I/O Pins angeschlossen, 
somit muss ich eine Art Software UART verwenden.

Reicht es zu, wenn ich lediglich Daten an den Drucker sende, oder muss 
ich auch welche empfangen?

Weil das Senden ja einfacher gehen soll...

von Karl H. (kbuchegg)


Lesenswert?

Gäst_5 schrieb:
> okay - danke!
>
> Die Drucker werden an meinem µC an ganz normale I/O Pins angeschlossen,
> somit muss ich eine Art Software UART verwenden.

Dir ist klar, dass du am Mega128 2 Stück USART hast?
Und die sind beide schon belegt?

Wenn ja, dann kannst du
* eine Software UART benutzen
* oder den Drucker über das parallele Centronics INterface ansteuern 
(sofern du genügend Pins frei hast)

> Reicht es zu, wenn ich lediglich Daten an den Drucker sende, oder muss
> ich auch welche empfangen?

Im einfachsten Fall reicht senden.
Ich hab jetzt die Doku nicht genauer studiert, ob man den Drucker 
befragen kann, ob zb das Papier alle ist. Dann musst du auch empfangen 
können. Aber im einfachsten Fall reicht senden (wobei sich auch noch die 
Frage nach dem Handshake stellen wird. Aber eins nach dem anderen)

von Karl H. (kbuchegg)


Lesenswert?

Gäst_5 schrieb:

> Die Drucker

Moment.

 ** Die Drucker **

schliesst du mehrere an?

von Gäst_5 (Gast)


Lesenswert?

> Dir ist klar, dass du am Mega128 2 Stück USART hast?
> Und die sind beide schon belegt?

Leider ja.

> schliesst du mehrere an?

2 Stück sollen ran und 4 PINS sind dafür vorgesehen PB4,5,6 und 7
Am Layout lässt sich nichts mehr ändern.


> wobei sich auch noch die Frage nach dem Handshake stellen wird

Wird ein Handshake benötigt?
Könnte ich das nicht durch ein Timing realisieren?

von Karl H. (kbuchegg)


Lesenswert?

Gäst_5 schrieb:
>> Dir ist klar, dass du am Mega128 2 Stück USART hast?
>> Und die sind beide schon belegt?
>
> Leider ja.
>
>> schliesst du mehrere an?
>
> 2 Stück sollen ran und 4 PINS sind dafür vorgesehen PB4,5,6 und 7
> Am Layout lässt sich nichts mehr ändern.

Dann brauchst du eine Software USART.


>
>> wobei sich auch noch die Frage nach dem Handshake stellen wird
>
> Wird ein Handshake benötigt?
> Könnte ich das nicht durch ein Timing realisieren?

Kommt drauf an.
Der Drucker wird unterschiedlich lange brauchen, zb je nachdem wieviele 
Zeilen er vorschieben muss. Wenn der Drucker ein Handshake unterstützt, 
dann ist es die bessere Wahl. Wenn nicht, dann bleibt dir eh nichts 
anderes übrig, als Wartezeiten einzuplanen oder drauf zu hoffen, dass 
der Drucker über genügend Pufferspeicher verfügt um deinen Druckjob 
aufnehmen zu können.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Zeilen er vorschieben muss. Wenn der Drucker ein Handshake unterstützt,
> dann ist es die bessere Wahl.

Lustig.
Man kann zwar per Commando
   Disable/Enable RTS/CTS
aber es gibt keine RTS/CTS Pins.

Mit dem Teil wirst du noch viel Freude haben :-)

von Gäst_5 (Gast)


Lesenswert?

> Dann brauchst du eine Software USART.

Dazu hab ich folgenden gefunden:

Beitrag "Software UART"

Allerdings wird da geschrieben das ein "Input-Capture" Eingang und 
"Compare-Output" Ausgang verwendet werden soll, ich habe ja nun 
lediglich die I/O PINs zur verfügung - gibt es für meinen Fall auch was 
fertiges?

> Wird ein Handshake benötigt?
> Könnte ich das nicht durch ein Timing realisieren?

https://www.sparkfun.com/datasheets/Components/General/Driver%20board.pdf

Ich kann nirgendwo herauslesen das ein Handshake unterstützt wird.

von Gäst_5 (Gast)


Lesenswert?

> Man kann zwar per Commando
>    Disable/Enable RTS/CTS
> aber es gibt keine RTS/CTS Pins.
>
> Mit dem Teil wirst du noch viel Freude haben :-)

Was heißt das genau?

von Karl H. (kbuchegg)


Lesenswert?

Gäst_5 schrieb:
>> Dann brauchst du eine Software USART.
>
> Dazu hab ich folgenden gefunden:
>
> Beitrag "Software UART"
>
> Allerdings wird da geschrieben das ein "Input-Capture" Eingang und
> "Compare-Output" Ausgang verwendet werden soll, ich habe ja nun
> lediglich die I/O PINs zur verfügung - gibt es für meinen Fall auch was
> fertiges?

In der Codesammlung gibt es sicherlich auch was fertiges vom PeDa.
Aber suchen musst du schon selber.


> https://www.sparkfun.com/datasheets/Components/General/Driver%20board.pdf
>
> Ich kann nirgendwo herauslesen das ein Handshake unterstützt wird.

Ich auch nicht. Zumindest nicht auf der Seriellen. Der einzige Hinweis 
ist das mögliche Einschalten von CTS. Die Centronics scheint hingegen 
vollständig zu sein.

>> Mit dem Teil wirst du noch viel Freude haben :-)
> Was heißt das genau?

Oooch nur so. Du wirst es wissen, wenn du das erste mal Fluchen musst.

von Gäst_5 (Gast)


Lesenswert?

> In der Codesammlung gibt es sicherlich auch was fertiges vom PeDa.

- Welche Codesammlung?
- PeDa ?

von Karl H. (kbuchegg)


Lesenswert?

Gäst_5 schrieb:
>> In der Codesammlung gibt es sicherlich auch was fertiges vom PeDa.
>
> - Welche Codesammlung?

diese Seite
nach oben scrollen
guckst du links in die 'Menüleiste'
1
Home
2
AVR
3
ARM
4
...
5
Forum
6
   ....
7
   Codesammlung
8
   ....

> - PeDa ?

Peter Danegger.
Er hat viele Basisroutinen für alles mögliche veröffentlicht.

von Gäst_5 (Gast)


Lesenswert?

Hallo, ich habe es nun geschafft ein Software UART zu programmieren, 
welcher zunächst nur sendet (was ja reichen sollte für meinen Drucker).

Ich hab aber die Vorgehensweise noch nicht ganz verstanden.
In folgendem pdf sind die Commands beschrieben:
https://www.sparkfun.com/datasheets/Components/General/A2-user%20manual-1.pdf

Die Commands machen zwar alle Sinn, aber wie kann ich dem Drucker 
letztendlich einen Text z.B. "Hallo Welt" schicken?

Ich schicke ihm ein "FF" und sage ihm damit, dass er Daten in den Buffer 
schreibt, doch wie schicke ich ihm dann die Daten? Oder muss das FF 
einfach vor dem Text stehen? "FF Hallo Welt"

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"FF" ist das Steuerzeichen Formfeed (0x0C, Ctrl+L), weder die 
Zeichenkombination "FF" noch die Hexadezimalzahl 0xFF.

Das Kommando musst Du nur senden, wenn Du Deine Druckzeilen nicht mit LF 
(Linefeed, Zeilenvorschub) abschließt.

Außerdem führt das Kommando einen Seitenvorschub durch; dazu hat 
anscheinend das Druckpapier/die Etiketten schwarze Markierungen, um die 
Seitenlänge zu bestimmen.

Um Deinen Text zu drucken, musst Du nur den Text, gefolgt vom 
Zeilenvorschub an den Drucker senden.

von Hmm (Gast)


Lesenswert?

>Ich schicke ihm ein "FF" und sage ihm damit, dass er Daten in den Buffer
>schreibt, doch wie schicke ich ihm dann die Daten? Oder muss das FF
>einfach vor dem Text stehen? "FF Hallo Welt"

Vorsicht: Englisch!

Da steht "print data in the buffer" nicht "into the buffer" wobei 
letzteres im Zusammenhang mit print eigentlich wenig Sinn machen würde.

Karl Heinz hat Dir ja schon dazu geschrieben: Da steht "LF" wie 
LineFeed.

von Gäst_5 (Gast)


Lesenswert?

hm... das hilft mir grad gar nicht weiter...

LF Gibt ein Zeichen aus und dann Zeilenvorschub, aber woher wird das 
Zeichen genommen und wie sieht z.B. der Befehl aus, wenn ich den Drucker 
einfach "Hallo Welt" drucken lassen möchte?

Ich bräuchte einfach mal ein Beispiel um die Herangehensweise zu 
verstehen...

von Hmm (Gast)


Lesenswert?

>LF Gibt ein Zeichen aus und dann Zeilenvorschub, aber woher wird das
>Zeichen genommen

Wieso "ein Zeichen"? Wo in der Doku liest Du das? Es gibt alle Zeichen 
im Buffer aus.

"LF prints the data in the print buffer and feeds one line. When the 
print buffer is empty, LF feeds one line."

>wie sieht z.B. der Befehl aus, wenn ich den Drucker
>einfach "Hallo Welt" drucken lassen möchte?

Hier ein C String dafür:

[c]
char * s = "Hallo Welt\x0a";
[\c]

von Gäst_5 (Gast)


Lesenswert?

Wie groß ist der Buffer? - Eine Zeile?

> Hier ein C String dafür:
>
> [c]
> char * s = "Hallo Welt\x0a";
> [\c]

Warum \x0a am Ende?

Wenn ich das dem Drucker schicke, wird es dann in den Buffer geschrieben 
und durch den Befehl LF druckt er?

von Karl H. (kbuchegg)


Lesenswert?

Du schickst einfach den Text, so wie du ihn haben willst zum Drucker.
Jaaaaa, es hat mal eine Zeit gegeben, da musste man nicht erst mit dem 
Betriebssystem die Details des Druckens aushandeln und es gab 85 
Druckerspooler etc. Da schickt man dem Drucker einfach die ASCII Codes 
der Zeichen, die er drucken sollte und der tat das dann auch. Ohne das 
man Font oder Schriftgröße oder sonst was einstellen musste.

Vielleicht einfach mal eine ASCII Tabelle studieren?
Zb die hier
http://www.torsten-horn.de/techdocs/ascii.htm

Da findet sich bei den Steuerzeichen (die ersten 32) auch ein LF. Und 
der ASCII Code dafür ist, oh Wunder, 0x0A
Da findet sich auch der FF wieder - 0x0C
Und das eine Zeichen, dass du für Spezialsachen brauchen wirst - ESC - 
genannt Escape - mit dem Code 0x1B


Wie hast du deine Software-Serielle getestet?

von nxitimi (Gast)


Lesenswert?

Weisst jemand ob der Printer OPEN SOURCE ist?  Wenn ja link?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Warum sollte er?

Und falls er das wider erwarten doch sollte, warum sollte dieser Umstand 
auf der zugehörigen Webseite/in der Dokumentation verschwiegen werden?

von nxitimi (Gast)


Lesenswert?

Bei Sparkfun und Adafruit gibts nur opensource projekte? Oder irre ich 
mich?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die verkaufen Bauteile. Und Bauteile, wie z.B. µCs, sind nur ganz, 
ganz extrem selten Open Source.

Ansonsten könntest Du ja mal versuchen, den zweiten Teil meiner Frage zu 
verstehen.

von nxitimi (Gast)


Lesenswert?

Okay. Kennt jemand open source firmware für thermal printers?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was genau stellst Du Dir vor?

Firmware zu Ansteuerung eines nackten Druckwerks? Oder geht es 
wenigstens irgendwie um das Threadthema (ganz nach oben scrollen ... 
lesen ... da geht es um einen Drucker mit serieller Schnittstelle, dem 
ein "A" zu schicken ist, wenn er ein "A" drucken soll)?

Was für einen Thermodrucker hast Du denn?

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.