Hallo,
Ich habe es selber noch nicht gemacht, aber ich kenne da jemanden, der das gemacht hat,
schaue mal hier
nach, vielleicht hilft es Dir
Gruß Sebastian
Hallo Leute!
Hab grad ein kleines Projekt im Kopf, folgendes:
Da ich in einer Firma arbeite, wo Laserdrucker der Firma Kyocera repariert werden und ich vor jeder Wartung einen kleines Test von Laptop aus auf den Drucker über die Parallele Schnittstelle schicken muss.
Ich starte erstmal den Laptop und (hab mir eine Dos-Batch-Datei geschrieben) schicke folgendes an den Drucker:
c:\>echo !R! STAT1; EXIT; > lpt1:
c:\>echo !R! FRPO I1, 1; EXIT; > lpt1:
c:\>echo !R! ELOG; EXIT; > lpt1:
So, da mir es irgendwie zu blöd ist, jedesmal den alten LAptop anzuwerfen, dachte ich mir, da es ja nur die Parallele Schnittstelle ist, sollte es doch relativ einfach sein mit einem uC (z.B. ATMega 8 ) die oben genannten "Daten" an den Drucker zu übertragen.
Hat da jemand schon irgendwie Erfahrung oder weiß jemand, wie ich die Parallele Schnittstelle eines Druckers ansteuere?
Pls Hlp!
cap.
Hallo,
Ich habe es selber noch nicht gemacht, aber ich kenne da jemanden, der das gemacht hat,
schaue mal hier
nach, vielleicht hilft es Dir
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Klar kannste das mit dem Mega8, Die Centronics
Schnittstelle des Druckers ist auch nur 8 Bit breit und
n paar kleine Zusätze
* Datenleitungen:
o Data0 (2) – Datenbit 0
o ...
o Data7 (9) – Datenbit 7
* Steuer- oder Handshake-Pins:
o Strobe (1) – zeigt dem Empfänger an, dass ein gültiges Datum anliegt
o Busy (11) – zeigt die Bereitschaft des Druckers zur Datenübernahme an
o Ack (10) – Acknowledge, Bestätigung der Datenübernahme durch den Drucker
* Melde-, Status- oder Kontrolleitungen:
o PE (12) – „Papierende“, zeigt an, dass kein Papier mehr vorhanden ist
o Select (13) – zeigt an, ob der Drucker On- oder Offline ist
o Autofeed (14) – veranlasst den Drucker, nach jedem Carriage-Return (CR) ein Line-Feed (LF) auszuführen
o Error (32) – zeigt das Auftreten eines Fehlers an
o Init (31) – veranlasst einen Drucker-Reset
o SelectIn (36) – teilt dem Drucker mit, dass er angesprochen wird
Die Datenübertragung erfolgt nach folgendem Protokoll:
1. Der Sender überprüft anhand der Busy-Leitung, ob der Empfänger bereit ist. Falls ja, wird das Datenbyte auf die Datenleitungen gelegt.
2. Durch Aktivierung des Strobe-Signals (mind. 1 bis max. 50 Mikrosekunden) wird dem Empfänger die Gültigkeit des Datums mitgeteilt.
3. Durch Aktivierung von Busy signalisiert der Empfänger, dass er mit der Verarbeitung der Daten beschäftigt ist.
4. Der erfolgreiche Empfang und Verarbeitung des Datenbytes wird vom Endgerät durch das Acknowledge-Signal bestätigt.
Wenn der Drucker unter DOS geht geht er auch unter AVR.
Knifflig wirds bei Druckern die selbst keinen Zeichensatz mehr haben
und nicht ohne Treiber laufen, also auch nicht unter DOS, die
bekommste nicht so einfach unter AVR in Gang
Vor den Erfolg haben die Götter den Schweiß gesetzt
Ok, danke erstmal an euch!
also brauch ich ja bloß 11 leitungen.
- 8 datenleitungen
- 1 busy zum abfragen
- 1 init zum initialisieren
- 1 strobe zum bestätigen
wie leg ich denn z.B. ein "!" an den PortD in bascom? muss ich es dann binär ausgeben, oder kann ich den kompletten "Text" anlegen?, so als eine art routine dass er nach jedem zeichen ein strobe setzt?
irgendwie einer eine ahnung, wie bissl quelltext aussehen kann?
mfg,
cap.
Benutz doch einfach meine Assembler Routine, oder schau von der ab. Das ganze ist wirklich sehr einfach.
Code:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Druck-Routinen ;; ;; ============ ;; ;; (c)Sven Lissel (svenlissel@web.de) ;; ;; www.Mehto.de.vu ;; ;; 23.07.2005 ;; ;; ;; ;; Parallel-Interface ;; ;; DB0-DB7: PD0-PD7 ;; ;; Strobe: PB0 ;; ;; Busy: PC1 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Druck-Routine zum Drucken über ein Paralleles Kabel ; ; Achtung! Folgendes muss eingerichtet sein: ;-Stackpointer ;-PortD als Ausgang Pin0- Pin7 ;-PortB als Ausgang Pin0- Pin1 ;-PortC als Eingang Pin1 ;Wenn der Drucker zum empfangen nicht bereit ist wird gewarten und Pin1 ;an PortB wird auf high geschaltet.(Kann auch weggelassen werden) ;Register r16 und r17 werden verwendet. r17 wird aber gesichert und wieder hergestellt. ;Das zu druckende Zeichen (oder Befehl) in r16 laden und mit "rcall drucken" routine aufrufen. ;;;;;;;;;;;;;;;;;;;;;;Befehle;;;;;;;;;;;;;;;;;; ;;;;Initalisieren: ; Muss vor dem Drucken aufgerufen werden ; aufrufen mit: "rcall drucken_init" ;;;;;Erweiterter Grafiksatz aktivieren;;;;; ; kann aufgerufen werden um erweiterte Zeichen drucken zu können ; aufrufen mit: "rcall drucken_grafiksatz" ;;;;;Puffer Drucken;;;;; ; muss aufgerufen werden wenn die gesendeten zeichen gedruckt werden sollen ; aufrufen mit: "rcall drucken_puffer" ;;;;;Blatt ausgeben;;;;; ; Muss aufgerufen werden wenn das bedruckte Blatt ausgegeben werden soll. ; aufrufen mit: "rcall drucken_ausgeben" ;;;;;;Farbe aussuchen;;; ; Kann aufgerufen werden um die Textfarbe zu ändern ; ;;;;Farben: ;Farben werden mit Hex nummern angegeben ; ;0x00 Schwarz ;0x01 Magenta ;0x02 Cyan ;0x03 Violett ;0x04 Gelb ;0x05 Rot ;0x06 Grün ; Zuerst muss die ausgesuchte Farbe nach r17 geladen werden. ; z.B.: ldi r17, 0x02 ;Und dann nur noch "rcall drucken_farben" aufrufen ;;;;;Neue zeile;;;; ;; geht in die nächste Zeile. ;; Aufrufen mit: "rcall drucken_zeile" ;;;;;;;Routine;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Drucken ;;;;;;;;;;;;; drucken: push r17 ;;;;;;;;;;;;;;;; drucken_wait: ;warten is der Drucker bereit ist sbi PortB, 1 ;LED anschalten um mitzuteilen das auf den Drucker gewartet wird sbic PinC, 1 rjmp drucken_wait cbi PortB, 1 ;LED wieder abschalten ;;;;;;;;;;;;;;; out PORTD, r16 ;Daten an PortD anlegen cbi PortB, 0 ;Daten an PortD übernehmen (fallende Flanke) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Impulsdauer zum Daten übernehmen ;Mindestens 0,5 µs höchstens 50µs ;Bei 1Mhz r17=1 , bei 16 Mhz = 16 usw. ldi r17, 2 ;bei 1Mhz r17=2 ca. 6µs loop12: dec r17 brne loop12 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sbi PortB, 0 ;Daten an PortD übernehmen ende (high setzen) pop r17 reti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;; Initalisieren ;;;;;;;; drucken_init: ldi r16, 0x1B rcall drucken ldi r16, 0x40 rcall drucken reti ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;Erweiterter Grafiksatz aktivieren;;;;;;;;;; drucken_grafiksatz: ldi r16, 0x1b rcall drucken ldi r16, 0x36 rcall drucken reti ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;Puffer Drucken;;; drucken_puffer: ldi r16, 0x0A rcall drucken reti ;;;;;;;;;;;;;; ;;;;;;;;;;;;;;Blatt ausgeben;;; drucken_ausgeben: ldi r16, 0x0c rcall drucken reti ;;;;;;;;;;;;;; ;;;;;;;;;;;;;;Farbe wechseln;;; drucken_farbe: ldi r16, 0x1B rcall drucken ldi r16, 0x72 rcall drucken mov r16, r17 rcall drucken reti ;;;;;;;;;;;;;; ;;;;;;;;;;;;; Neue zeile ;;;;;;;;; drucken_zeile: ldi r16, 0x0A ;Neue Zeile rcall drucken reti ;;;;;;;;;;;;;
Gruß,
Mehto
-
Die kommunikation ist im Prinzip recht einfach.
Man nehme einen Port des AVR oder PIC, der 8 Bit hat.
Die Zeichen die Du sendest sind nix anderes als Binäre werte,
die 8 Bit lang sind, also Beispiel A = Dezimal 65, Binär
1000001. Woher ich das Weiß ?
Schau mal unter ASCII im Netz nach, da sind dann genau die
Codes aufgelistet.
Nun mußt Du nur och die Binärwerte der zu übertragenden Zeichen
an Deinen Port geben (der sollte als Ausgang definiert sein) und
dann den Strobe hochziehen, damit der Drucker weiß, aha hier
kommt ein neues Zeichen.
Beispiel:
STAT1; EXIT;
S = 83 = 1010011
T = 84 = 1010100
A = 65 = 1000001
T = 84 = 1010100
; = 59 = 0111011
etc. etc.
http://de.wikipedia.org/wiki/ASCII-Tabelle
1 entspricht dann Pin auf 5V, 0 entspricht Pin auf GND.
In Bascom würds in etwa so aussehen,
PortA=65 (für A)
Vor den Erfolg haben die Götter den Schweiß gesetzt
Das steht übrigens auch alles hier.....
http://www.mehto.roboterbastler.de/?...cker_ansteuern
Gruß,
Mehto
-
Thx @ Vitis: Hört sich logisch an. Aber jedes zeichen einzeln übergeben ist halt schon ein bisschen stark aufwändig! muss mal mehtos-routine angucken.
Thx @ Mehto: Von deiner Seite hab ich die Infos zwecks Ansteuerung - schöne Seite! Die Assembler-File muss ich mir mal genauer anschauen - hab nicht wirklich Ahnung von ASM.
Hab mal meine kleine Projekt-Doku hinzugefügt. Mich würde es freuen, wenn íhr sie euch mal reinzieht, ob ich soweit alles richtig gemacht habe... thx.
mfg,
cap.
P.S.: Hardware steht schonmal. Jetzt gehts an coden!
hi
Sorry das ich hier jetzt von was ganz anderem rede ,aber bin neu hier un will en theme rein stellen ins Forum weis aber net wie ?
bitte um hilfe un danke im vorrau un noch ma sorry
@Robby 8
Du gehst in die Forum-Übersicht, sucht ein Forum aus, und drückst auf "neues Thema"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen