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
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.
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
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=-
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
