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
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.
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.
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...
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)
> 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?
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.
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 :-)
> 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.
> 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?
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.
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.
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"
"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.
>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.
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...
>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]
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?
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?
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?
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.
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?