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.
Eine eigene Frage?
Dieser Thread ist über 23 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.