Hallo leut.
Ich würde gerne meine RS232 schnittstelle mit meinem AVR UART-Anschluss
verbinden. Aber leider habe ich keinen MAX232 zu Hand.
Kann ich jetzt einfach Rx und Tx über Widerstände an den UART
anschließen?
Marc
Ich denke nicht das das fuktioniert. Der Max232 ist ein Pegelwandler und
macht aus 0V und +5 vom Controller -12 und +12 für die serielle RS232
Schnittstelle am PC.
Wie soll er den aus +5V mit nem Widerstand +12 machen.
Controller untereinander kann man direkt verbinden, aber nicht
Controller und PC.
Son MÄXchen kost doch nicht die Welt!
Gruß
Chriss
>Controller untereinander kann man direkt verbinden, aber nicht
Controller und PC.
Doch es geht !
Einfach einen Inverter dazwischen schalten, ist das Kabel kurz und der
PC hält sich an die RS232 Standards, dann geht es.
Der MAX232 invertiert zusätzlich die Signale, somit funktioniert der
Anschluß über Widerstände nicht. Ist aber kein Problem, du kannst die
Schaltung wie im Anhang benutzen. Interessant ist natürlich nur der
linke Teil :)
Thorsten
Es geht noch einfacher:
4,7k Vorwiderstand, 1k nach Masse und das ganze an einen BC547.
Kollektor an einen Portpin und Pullup aktivieren. Bei 19200Baud hatte
ich noch nie Probleme.
Bei Nutzung des AVR Hardware-Uart funktioniert der Ansatz nur ueber
Widerstaende nicht. Invertierung "muss" fuer Hardware-UART sein, da
PC und AVR "genau andersrum" eine "1" markieren (negative
Spannungen aussen vor, sind bei "modernen" PCs nicht mehr
erforderlich). Es existieren jedoch Software-UART-Routinen fuer AVR,
die direkt mit "invertierten" Signalen umgehen koennen. Der
Programmieraufwand ist hoeher und das Timing ist kritischer. Aber es
gibt "fertigen" Bibliotheken z.B. die "AVR Component Library"
avrfreaks/Projekt 59(?), die die Umsetzung erleichtern.
>negative Spannungen aussen vor, sind bei "modernen" PCs nicht mehr
erforderlich).
Wenn du als alten PC ein 50 Jahre altes Gerät meinst, dann stimme ich
dir zu.
Selbst 20 Jahre alte Geräte funktionieren mit TTL Pegel, da alle
üblichen RS232 Wandler (75189 usw.) eine Schaltschwelle im Bereich 1-2V
haben, wie TTL eben.
Danke für die Info.
Es funktioniert jetzt, aber wenn ich jetzt im Dezimaler schreibweise
vom Controller die zahl 65 an COM1 sende, erscheint in dem
HyperTerminal Programm ein völlig anderes zeichen als der Buchstabe A.
65 steht doch für A!
Warum wird ein völlig anderes Zeichen ausgegeben?
Marc
Ist jetzt vielleicht albern von mir, aber du sendest auch wirklich 65
dezimal ? Welches zeichen erscheint denn ? Probiers auch mal mit nem
anderen Terminalprgogramm, z. B. dem von Bray.
http://bray.velenje.cx/avr/terminal
Das Programm ist echt gut!
Und ich kriege vom Programm den Wert 159, aber der Controller sendet
den Wert 65.
Ich habe den TXD pin direkt mit RXD der Seriellen-Schnittstelle
verbunden, kann es daran liegen?
Ja, der läuft mit internem 1MHz.
Aber daran liegt es wohl nicht, der Terminal empfängt daten. Aber
nicht, was ich will. Und ich habe eine Schleife eingebaut, dass dafür
sogt, dass der Wert 65 ständig gesendet wird. Da kommt dann auch immer
159 am Terminal an
> Ich habe den TXD pin direkt mit RXD der Seriellen-Schnittstelle> verbunden, kann es daran liegen?
Schreibs doch gleich :) Das kann nicht funktionieren, da fehlt die
notwendige Invertierung. Siehe den von mir geposteten Schaltplan (der
Schaltplan selbst ist NICHT von mir).
Thorsten
Funktioniert jetzt besser, aber da wird trotzdem immer noch ein völlig
anderes Zeichen als das was ich haben will Ausgegeben. Oder ist nur die
ASCII-tabele auf http://www.asciitable.com/ falsch?
Mir ist aufgefallen, dass bei der übertragung vom Controller die Werte
0, 1, 6, 255 auch so vom Terminal verstanden wurden. Aber ausgerechnet
der Wert 65(A) wird als ein anderes Zeichen ausgegeben.
Warum?
Es funktioniert jetzt sehr gut, ohne Fehler.
Alerdings musste ich die Baudrate auf 2400 verringern. Hauptsache, es
funktioniert.
Danke für die hilfe.
Marc
Hmm, hast du mal ins Datenblatt geschaut ? Z. B. beim ATmega16 Seite
162, Tabelle 68 ? Alles größer 4800 Baud @ 1MHz produziert Fehler > +-
7%. Das kann nicht funktionieren !! Für eine fehlerfreie
RS232-Übertragung muß der Fehler deutlich unter 1% liegen. Wenn du
allerdings den Oszillator auf 8MHz stellst, sind 38k4 Baud problemlos
möglich, hab ich hier auch laufen.
Gruß
Thorsten
>Für eine fehlerfreie RS232-Übertragung muß der Fehler deutlich unter 1%
liegen.
Es reichen 5%, wenns nicht anderst geht. Für eine eine gute Schaltung
sollte der Wert unter 2-3% liegen, dann treten eigentlich nei
Übertragungsfehler auf.
Naja, man sollte sich aber nicht darauf verlassen. Für einzelne Zeichen
mögen die 5% vielleicht noch tolerabel sein. Wenn aber mehr Daten am
Stück bei hohen Baudraten übertragen werden sollen, kommst du nicht
weit. Weißt du zufällig, was dazu in der RS232-Spezifikation steht ?
Ich hatte da schonmal gesucht, aber nichts gefunden. Gibts die Spec
irgendwo zum download ?
Thorsten
Ich bin mir nicht sicher, ob es wirklich aktuelle RS232 Spezifikationen
gibt, denn der RS232 Standart ist uralt und geht nur bis 9600 Baud....
Die einzigen Probleme die ich bisher hatte, lagen alle an der
Kabelverbindung. Ganz gut sind Stereo Audiokabel mit getrennt
geschirmten Leitungen. Liegen RX und TX nebeneinander konnte ich mein
gesendetes Zeichen durch kapazitive Kopplung zwischen den Leitungen
wieder empfangen !