Hallo Ihr Freaks da draußen-vielleicht kann mir jemand bei meinem Problem helfen. Ein Gerät gibt seriell mit 9600,N,8,1 Daten aus, welche direkt in einen TVT-VGA von www.tvterminals.de geleitet werden. Dieser Baustein treibt einen VGA-Bildschirm. Das System dient zur Großanzeige der Meldungen des Gerätes. Klappt alles einwandfrei, lediglich wenn das Gerät die Sonderzeichen ä..ö..ü..ß sendet, erscheint auf dem Display {..|..} (Punkte nur zur besseren Darstellung). Großbuchstaben Ä..Ö..Ü analog als [..\..] An der Ausgabe vom Gerät lässt sich nichts ändern, am TVT-VGA Controller auch nicht. Ich bräuchte "zwischendrin" etwas, was die Daten umwandeln kann. Elektronik kein Problem, von Microcontrollern habe ich lediglich Grundkenntnisse. Wer hat eine Idee ? Danke für Eure Antworten. Noch etwas am Rande: Statt des TVT-VGA Controllers habe ich auch schon PC mit Hyperterminal verwendet. Mit der Standardschrift habe ich genau gleiche Anzeige der Umlaute, wie bei Ausgabe über den Controller. Wechsle ich zu WST_Germ stimmt die Anzeige.
Wahrscheinlich kann nur ASCII-Zeichensatz (also 7 Bit). Das "Gerät" gibt ä ö ü als 0x5B 0x5C und 0x5D aus. Das folgt natürlich nicht dem ASCII-Zeichensatz. Laut handbuch kann der TVT-VGA wohl auch den ANSI Zeichensatz (also weitere 127 Zeichen). Da sind die Umlaute drin ä = 0xE4 ö = 0xF6 ü = 0xFC Die Umwandlung lässt sich ohne Probleme mit einem uC machen. Vorzugsweise einen mit 2x UART, damit man das nicht alles per Software machen muss. Der kleinste Atmel ist glaub ich der ATmega164 oder ATmega162, kostet 2,95€ bei Reichelt als PDIP. Der hat 2x UART. Die Beschaltung würde minimal ausfallen: TVT-VGA <=== MAX232 <==> ATmega164 <==> MAX232 <== GERÄT Kosten weniger als 10€. Das Programm wäre auch nur ein paar Zeilen lang.
im prinzip würde auch ein controller mit einem fullduplex uart reichen, die rx+steuerleitungen zum gerät und tx+steuerleitungen zum tvt. das geht schon mit recht kleinen controllern.
>im prinzip würde auch ein controller mit einem fullduplex uart reichen
Stimmt, soweit habe ich gar nicht gedacht. Hatte irgendwie im Kopf, dass
es hätte Bidirektional sein müssen, aber geht ja nur ein eine Richtung.
dann kann man schon nen ATtiny2313 oder nen ATmega48 nehmen, kostet nur
1,20€.
wenn man es geschickt anstellt, könnte man alles in einem gehäuse (doppelstecker wie zb für leitungsbooster, dongles etc, 2serielle stecker links und rechts in einem kleinen steckergehäuse) unterbringen und die schaltung evtl aus den statusleitungen mit spannung versorgen.
Vielen Dank mal für Eure Anregungen. Habe mir mittlerweile etwas Hardware beschafft (ATMEGA48 und ATTINY2313) ISP läuft auch, ein paar Grundfunktionen sind auch schon erfolgreich programmiert und getestet. Jetzt arbeite ich mich grade in die Programmierung rein, das geht aber mangels Zeit doch nicht ganz so schnell. Vielleicht kann mir jemand mit einem Proggi noch und einem Schaltungsvorschlag nachhelfen :-) seriell TTL mit 9600,8,N,1 7-Bit ASCII kommen vom Empfänger Sollen rein in den ATTiny, die Zeichen Hex 7B,7C,7D,7E nach Ansi Hex E4,F6,FC;DF und die Zeichen 5B,5C,5D nach Ansi Hex C4,D6,DC. Rest vom Eingangszeichensatz kann so wieder ausgegeben werden. Das ganze wieder raus aus dem Attiny und rein in meinen TV-VGA Controller, der kann Ansi. Bei der Grundschaltung mit den "falschen" Sonderzeichen kam ich ohne MAX aus. Lediglich für Versuchszwecke mit dem PC hatte ich natürlich einen benutzt. Wenn durch den Attiny RS-232 +/-12 durchgejagt werden müssen ist das natürlich kein Problem. Empfänger->MAX232->ATTINY2313->MAX232-TVT VGA-Controler... unsere Feuerwehr und Ich freuen uns, wenn jemand bissl helfen möchte... P.S Anfangs beschriebenes "Gerät" ist ein DME in der Wache.
Erstmal UART TX und RX sowie den RX interrupt anschalten:
1 | UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE); |
Und dann die ISR müsste denke ich so aussehen:
1 | ISR(USART_RXC_vect) |
2 | {
|
3 | unsigned char temp; |
4 | temp = UDR; |
5 | while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich |
6 | switch(temp){ |
7 | case 0x7B: |
8 | UDR = 0xE4; |
9 | break; |
10 | case 0x7C: |
11 | UDR = 0xF6; |
12 | break; |
13 | //usw.
|
14 | default:
|
15 | UDR = temp; //Zeichen so senden wie empfagen |
16 | }
|
17 | }
|
Habs jetzt nicht getestet, aber das Prinzip sollte klar sein
Also ich würd das warten aufs senden nicht in den Interupt packen, dann doch lieber in die Hauptschleife, eventuell sogar mit nem Buffer...
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.