- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Drucker mit AVR ansteuern?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162

    Drucker mit AVR ansteuern?

    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    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.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.02.2005
    Ort
    Freiburg
    Alter
    36
    Beiträge
    602
    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
    -

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.02.2005
    Ort
    Freiburg
    Alter
    36
    Beiträge
    602
    Das steht übrigens auch alles hier.....
    http://www.mehto.roboterbastler.de/?...cker_ansteuern


    Gruß,
    Mehto
    -

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    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!
    Angehängte Dateien Angehängte Dateien
    • Dateityp: pdf dst.pdf (82,7 KB, 161x aufgerufen)

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.07.2006
    Beiträge
    157
    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

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    @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.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen