Hello,
Also wie schon erwähnt, möchte ich über meinen Palm, der ja nur eine
RS232 Schnittstelle besitzt, drucken können. Folglich brauche in einen
seriell2parallel Konverter.
Gestern am Abend sind mir da einige sehr gute Ideen durch den Kopf
gegangen mit denen es eigentlich funktionieren sollte, doch weiss ich
nicht, ob das nicht alles zu primitiv ist....
Vorgestellt hab ich mir das so: Ich nehme einen x-beliebigen AVR mit
UART, z.b. AT90S2333. Dort schliesse ich die serielle Schnittstelle
mittels MAX232 an den Palm und einen 8Bit Port, z.B. PORTD direkt
parallel. Jetzt könnte ich ja theoretisch ein ganz einfaches Programm
verwenden:
int main(void)
{
// UART aktivieren
sbi(UCSRB, RXEN); // Empfangen aktivieren
sbi(UCSRB, RXCIE);// Erweitertes Empfangen aktivieren
// Baudrate
asm volatile("ldi r16,4000000/(9600*16)-1" "\n\t" "out 0x09,r16");
outp(0xff, DDRC); // PORTC als Ausgang
while(1); // Auf Interrupts warten
}
// wenn ein Zeichen übers UART kommt, nach PORTC ausgeben.
SIGNAL(SIG_UART_RECV)
{
outp(inp(UDR), PORTC);
}
Diese Lösung kommt mir doch etwas sehr einfach vor. Der Konverter sollte
einfach nur normale PBM Drucker unterstützen, benötigt dieses Protokoll
auch Kontrollleitungen des parallelen Ports?
Jetzt ist mir grad was aufgefallen: Es ist eh verdammt klar, dass RxD
und TxT IM PORTC liegen, der der einzige 8Bit I/O Port ist. Kann ich
das ganze EINFACH aufteilen? Nachdem man das sicher nicht so einfach
hinbringen wird, kann ich ja für die ersten 6 Bit PORTB und für die
restlichen 2 PORTD verwenden. Dann müsste ich doch einfach nur das
empfangende Zeichen nach PORTB schreiben und dann fehlen noch 2Bit. Dann
einen Shift und die restlichen nach PORTD.
(Müssen dann halt beim Drucker dementsprechend verbunden werden).
Stimmt das so?
Achja, noch was: Für die direkte Anbindung der Druckerschnittstelle an
den AVR: Da wären Standardwiderstände à la 10kOhm nicht schlecht bei
jeder der acht Leitungen zwischen zu schalten, oder liege ich da falsch?
Was hält ihr von meiner Idee? Ließe sich das durchführen? Oder hab ich
was vergessen? Mir kommt das ganze nur irgendwie sehr einfach vor.
Also Danke noch einmal für eure Hilfe
Niki
Hi,
wenn ich mich recht entsinne, reichen dem Drucker die 8 Datenbits nicht.
STROBE (Pin1) muß nach dem Anlegen neuer Daten gepulst werden.
Außerdem solltest Du sicherstellen, dass Du den Drucker nicht
'überfährst'. Da gibt es ein ACK vom Drucker.
Von den Fehlermeldungen des Drucker mal abgesehen (z.B. PaperOut,
Offline,...). Man will ja wissen, ob der Drucker wirklich druckt...
Im Internet findet man bestimmt ein Protokoll.
Holger B. hat einen Drucker an einen 80535 angeschlossen, vielleicht
kann der ja näheres sagen?! --> HOLGER, sag was ;-)
Bis dann,
Ingo.
Hallo!
Ersteinmal danke für deine Hilfe! Genau in dem Moment wollte ich hier
schreiben dass meine Idee nicht genügt!
Also offenbar wirds komplizierter!
1.) Ich habe das ganze Internet nach Material durchforstet. Ich musste
mich wieder einmal so ärgern als ich einen serial2parallel Converter für
die den AT89xxxx fand. Ich hasse diesen uC!
Gibt es zufällig die Möglichkeit AT89 Assembler Code nach AT90 zu
konvertieren?? Ich frage deshalb weil es ein Programm namens SourceGuru
gibt, das es schafft, Z80 nach M68k zu portieren. Der Sourcecode für den
serial2parallel converter wäre im Anhang.
2.) Also wenn ich das ganze auf eigene Faust löse. Habe ich das so
richtig verstanden, dass ich:
Einfach das erste Byte sende. Dann STROBE auf LOW (=0) lege, BIS ich auf
ACK ein HIGH erhalte? Doch wie lange bleibt das HIGH auf ACK? Solange
bis ich wieder ein neues Byte sende und STROBE nach LOW lege?
(Ich glaube Strobe ist active high, also standardmässig high, oder?)
Kennt wer irgendeine detaillierte Beschreibung für den Parallelport in
Verbnindung mit Drucker? Wo auch wirklich das dabeisteht was ich oben
frage, d.h. wie lange ich z.B. STROBE auf LOW setzen muss oder wie lange
der Drucker ACK auf HIGH legt.
Also jetzt schaut es fast danach aus als ob ich einen Puffer brauchen
würde. Ich schreib einfach alles was seriell kommt in einen Puffer
(reichen 100Byte?) und arbeite währenddessen den Puffer ab indem ich ein
neues Byte nach D0-D7 schreibe, STROBE auf LOW lege, warte bis ACK
empfangen wird unsw...
Oder ist es so, dass ich STROBE einfach immer umpolen muss wenn ein
neues Zeichen zu schicken ist?
Also standardmässig ist es auf HIGH. Beim ersten Byte geht es auf LOW
dann wieder auf HIGH unsw?
Und vielen Dank für deinen Tipp, ich werde Holger fragen!
Also danke noch einmal
Niki
Hallo und vielen Dank für die Links!
Ich hab beide mit Begeisterung durchgelesen!
Ich find es sooo schade dass jetzt 2 Feiertage sind, so kann ich 2 ganze
Tage lang die Elektronik Sachen nicht einkaufen :((
Wenn ich einen EPROMMER hätte würde ich sofort das Projekt von c't
bauen, aber solche Dinger die so einen EPROM beschreiben können kosten
ja 150€ aufwärts oder? Oder gibts da ne einfache billige Lösung?
(Theoretisch könnte es ja auch mit dem Parallelport, passendem Programm
ohne zusätzliche Peripherie gehen oder?)
Jedenfalls hab ich jetzt schon eine Idee wie ich das mit meinem
AT90S2333 (den ich zhaus herumliegen habe) anstellen könnte.
Zum Glück ist das Programm dort auch in Pascal und nicht in Asm
geschrieben, ok, C rulez.
1.) Wenn ich schon eine AVR Schaltung habe (ich arbeite mit isp_avr)
könnte ich doch theoretisch einfach diese nehmen um den AVR zu
programmieren und beim Adapter (u.a. aus Platzgründen) ISP weglassen.
Kann ich in diesem Fall RESET direkt auf VCC legen? Für was ist
überhaupt dieser 47pF gut?
2.) Kann ich Die Datenlinien und die STROBE Linie einfach so
dranschliessen oder wäre ein Widerstand von Nutzen? 10kOhm?
3.) In der Schaltung von c't (im Anhang) sind solche komischen Dreiecke
an den Datenleitungen. Was bedeuten die?
4.) Wieso wird bei c't die CTS Leitung durch den MAX232 gelegt? Heisst
das Dreieck mit Punkt nicht "Interieren"?
5.) Wieso hat die BUSY Leitung bei c't einen 47pF Kondensator gegen GND?
6.) Der AVR hat ja schon interne Pullups. Soll ich trotzdem bei der BUSY
Leitung einen Pullup setzen? Wenn ja, wie gross? 10kOhm?
7.) Ich verstehe das mit dem Jumpern nicht. Angenommen der Parallelport
ist noch nicht angeschlossen, dann hat (bei c't) der Port1 als Eingang
einen nicht definierten logischen Pegel, da die Eingänge sozusagen in
der Luft hängen und weder an VCC noch an GND sind, ist das richtig?
Ist die obere Leitung (die zu P3.4) GND? Wieso hängt das dann ZUSÄTZLICH
an P3.4? Würde es nicht reichen, es einfach an GND zu hängen?
Zu deiner Frage: Ja, es ist mein Nickname. Wie du siehst, eine 32Bit
Zahl, also 4Bytes, hexadezimal. Wenn du dir das in der ASCII Tabelle
ansiehst und umdrehst kommt mein "wirklicher" (alter) Nick heraus, den
den du auch auf meiner Homepage findest (und auch in der URL enthalten
ist :))
Vielen Dank!!
Niki