Forum: Mikrocontroller und Digitale Elektronik seriell2parallel converter II


von Niki Hammler (Gast)


Lesenswert?

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

von Ingo B. (Gast)


Lesenswert?

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.

von Niki Hammler (Gast)


Angehängte Dateien:

Lesenswert?

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

von Ingo B. (Gast)


Lesenswert?

So hier zwei Adressen:

http://www.orf.at/teletext/cbarchiv/pcprg070.txt

http://www.heise.de/ct/95/05/284/

Es gibt sicher noch mehr....

PS: 0x7161626f6e ist das wirklich dein Nickname?

Bis dann,
Ingo.

von Niki Hammler (Gast)


Lesenswert?

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

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.