Forum: Mikrocontroller und Digitale Elektronik Drucker an AVR


von Michael Kiausch (Gast)


Lesenswert?

hi, ich möchte gerne einen Drucker an einen avr anschliessen und dadrauf 
zunächst simple asciis ausgeben.
das problem ist auch nicht das parallele protokoll, und auch nicht die 
pinnbelegung der parallelen schnittstelle sondern ehr die hardware 
spezifikationen, dazu habe ich noch nichts wirklich konkretes gefunden.
zunächst einmal:
kann ich die daten leitungen einfach an die avr portpins hängen,  oder 
sollte man irgendwelche absicherungen dazwischen setzen?
soweit ich weiss arbeitet aber beides mt ttl pegeln, von daher sollte es 
also gehen
dann: wie werden busy und strobe angeklemmt? direkt, und mit oder ohne 
pullups?

ich habe jetzt hier einfach alle leitungen direkt an die pins gehängt 
und komme nicht wirklich zu guten ergebnissen.
ich habe mein programm jetzt zig mal durchgearbeitet und finde keinen 
möglichen fehler mehr, ich halte mich genau ans centronics protokoll, 
und bekomme trotzdem nur mist, daher die idee mit dem pullup für die 
strobe line

wenn jemand eine idee oder ein par codeschnipsel hätte wär ich sehr 
dankbar
mfg
Michael

von Markus Kaufmann (Gast)


Lesenswert?

Was für einen Drucker hast Du eigentlich angeschlossen? Bist Du sicher 
daß er ASCII kann?

Prinzipiell würde ich vorschlagen: Druck mal den Text vom PC aus und 
protokollier das mit dem AVR mit. Dann kannst Du ja sehen, was der PC 
anders macht und warum es da klappt.

von Michael Kiausch (Gast)


Lesenswert?

der drucker ist ein epson nadeldrucker, und ich bin sicher dass er ascii 
kann, die ansteuerung, und die druckersteuerung sind mir auch klar, das 
einzige was mir unklar ist sind die elektronischen spezifikationen der 
parallelen schnittstelle
trotzdem danke, mfg
Michael

von DerInder (Gast)


Lesenswert?

Hallo,
die genauen Spezifikationen sind mir zwar auch nicht bekannt, aber bei 
meinem (Ur-)Alten NDR-Klein-Computer ist der Par-Port mit TTL Bausteinen 
(74LS244 und '374) aufgebaut und das Teil läuft immer noch ;)

Gruß
-=jens=-

von mikki merten (Gast)


Lesenswert?

Wenn die Leitungen nicht allzu lang sind kannst du den Drucker direkt an 
die AVR Ports hängen, dazu sind 10 i/o-Leitungen ausreichend D0-D7 Daten 
und Strobe zum Drucker und BUSY als Status vom Drucker. etwas kritisch 
ist die Generierung des Strobe Signal. Ursprünglich war es so, daß die 
Daten mit fallender Flanke H/L vom Drucker übernommen wurden. Je nach 
Firmwareversion reagieren einige Modelle auch erst auf die nachfolgen 
postive Flanke L/H. Daher ist sicherzustellen das die Daten min. 500 ns 
vor und nach dem Strobe-Impuls stabil anstehen. Der Strobeimpuls selbst 
sollte eine Breite von min. 1 µs aufweisen.

von Michael Kiausch (Gast)


Lesenswert?

ahh...
dann liegts wahrscheinlich am timing...
der drucker druckt zwar, aber nicht das was ich ihm "füttere"
stimmten immer ein oder zwei bits nicht.
werd das wenn ich was zeit finde mal mit längerem timing austeste,
vielen dank erstmal
Gruß
Michael

von Michael Kiausch (Gast)


Lesenswert?

Ok, ich habs jetzt nochmal mit dem richtigen Timing versucht, aber 
immernoch keine Erfolgserlebnisse.
Ich poste mal meinen Code, wäre nett wenn vielleicht mal einer 
drüberschauen könnte, ich kann nämlich beim besten willen keinen Fehler 
finden.
Dazu ist noch folgendes zu sagen: da ich keinen 8 bit Datenbus mehr frei 
habe habe ich das Byte auf zwei 6 bit i/o's aufgeteilt, was meiner Logik 
nach nichts ausmachen sollte da der Drucker ja erst beim Strobe liest.
Also: portb0-4=druckerdaten0-3, portc0-3=druckerdaten4-7, portc4=busy, 
portc5=strobe

print_send:
        push temp               ; temp sichern
        andi temp, 0b00001111   ; unteres nibble isolieren (druckerdaten 
auf 2 ports verteilt)
        out portb, temp         ; unteres nibble abschicken
        pop temp                ; gesichertes temp zurueckholen
        swap temp               ; oberes nibble nach unten bringen
        andi temp, 0b00001111   ; und oberes entfernen
        sbr temp, 0b00100000    ; strobe auf 1 lassen
        out portc, temp         ; temp senden

        nop                     ; > 1 usec warten
        nop
        nop

print_busy:
        sbis pinc, 4            ; warten, wenn drucker busy
        rjmp print_busy

        cbi portc, 5            ; strobe senden (strobe ist inverted!)
        nop                     ; > 0,5 usec warten
        nop
        sbi portc, 5            ; strobe fertig
        nop                     ; > 1 usec warten
        nop
        nop
                                                                                                                                    ret

Vielen Dank im Voraus,
Gruß Michael

von Michael Kiausch (Gast)


Lesenswert?

Nachtrag:
der Code war in Ordnung, der Fehler lag an der angelöteten Sub-d Buchse, 
bei der ein Anschlusspin keinen Kontakt bekam, deshalb kam als Ergebnis 
nur Müll.
trotzdem danke an alle
gruß
Michael

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Ich hatte mal einen Adapter seriell -> parallel Drucker gemacht. Die 
Schaltung paßt in ein Steckergehäuse 9-pol. -> 25-pol. und wird vom 
Drucker versorgt. /Reset muß an VCC gelegt werden, wenn das Programm 
nicht mehr verändert wird. Der Quarz ist unkritisch - wie auch alles 
andere; ich hatte Restbestände 3,58MHz (o.ä.)verbaut.

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.