Forum: Mikrocontroller und Digitale Elektronik Keine RS232 Kommunikation bei CPU-Taktraten über 4 MHz


von Hans I. (obiwahn)


Lesenswert?

Hallo
Ich habe bisher fast alle meine Atmel -Projekte mit 4 MHz Taktfrequenz 
betrieben.
Jetzt wollte ich mit einem ATmega16 rumbasteln, aber mit mehr Tempo.
Leider musste ich feststellen, das ich bei allen Taktfrequenzen über 
4,433 MHz keine RS232-Verbindung mehr
hinkriege. Da kommt nur noch Schrott an.
Ich habe versucht etwas an dem "UBRRL"-Wert zu justieren, aber ohne 
Erfolg.
Andere Monitor-Software hat auch nichts gebracht.
Bis 4,433 MHz kann ich Baudraten bis 19,2k erreichen. Darüber geht auch 
nichts mehr.
Bei höheren Taktfrequenzen funktioniert aber nicht einmal 2400 Baud.

Jetzt kommt die Gretchenfrage:
Ist das normal, oder funktioniert das mal wieder nur bei mir nicht ? :(

von Dietrich L. (dietrichl)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Hans I. schrieb:

> Leider musste ich feststellen, das ich bei allen Taktfrequenzen über
> 4,433 MHz keine RS232-Verbindung mehr

Wieviele hast du denn ausprobiert?

> Ich habe versucht etwas an dem "UBRRL"-Wert zu justieren, aber ohne
> Erfolg.

Das ist nicht verwunderlich. UBRRL ist ja auch nur eine Hälfte des 
zuständigen Registers UBRR.

> Jetzt kommt die Gretchenfrage:
> Ist das normal

Wenn man's falsch macht, ist es normal, dass es nicht funktioniert.

von H.Joachim S. (crazyhorse)


Lesenswert?

UBRRH brauche ich so gut wie nie mit Werten >0...

Ein Stück Programm mit deiner UART.Init wäre nicht schlecht.

von Hans I. (obiwahn)


Lesenswert?

Ich habs mit einem 6,8,10 und 16 MHz Quartz versucht. Ging alles nicht.
UBRRL ist schon klar das es nur das Low Byte ist. Da der Wert aber meist 
unter 255 liegt brauchte ich am High-Byte (UBRRH = 0) ja nichts machen.

von Chris L. (kingkernel)


Lesenswert?

Zeig mal bitte deinen Code für, sagen wir mal, 8 MHz, mit dem das dann 
auch von dir getestet wurde und nicht funktioniert.

von c-hater (Gast)


Lesenswert?

Hans I. schrieb:

> Ich habs mit einem 6,8,10 und 16 MHz Quartz versucht. Ging alles nicht.

Es liegt trotzdem an dir. Ich kann dir garantieren, dass die USART eines 
Mega16 bei allen genannten Takten wunderbar entsprechend dem Datenblatt 
funktioniert.

Kann es sein, dass du garnicht "auf Quarz" bist? Zeig' mal deine Fuses!

Und wie H.Joachim S. anmerkte: Auch das Posten deines Init-Codes für die 
USART wäre sicher sinnvoll.

von EAF (Gast)


Lesenswert?

Warum sollte er den fehlerhaften Code zeigen?
Dann ist doch sofort die Spannung raus.

von Wolfgang (Gast)


Lesenswert?

Hans I. schrieb:
> Jetzt kommt die Gretchenfrage:
> Ist das normal, oder funktioniert das mal wieder nur bei mir nicht ? :(

Funktioniert nur bei dir nicht.

Lass dein UART nach der Initialisierung irgendeinen Text senden und guck 
dir das mit einem LA oder Oszi an. Vorher macht es wenig Sinn, irgendwo 
dran rum zu probieren.

von Hans I. (obiwahn)


Angehängte Dateien:

Lesenswert?

Ich habe mal 2 Dateien angehängt. Fuse-Bits und meinen Quelltext.

Die RS232 Konfiguration nutze ich schon seit jahren und hat bisher immer 
funktioniert. Aber wie gesagt, bisher bin ich auch immer mit 4 MHz 
ausgekommen. Vllt mach ichs mir ja doch zu einfach :)

von jo (Gast)


Lesenswert?

Dietrich L. schrieb:
> http://ruemohr.org/~ircjunk/avr/baudcalc/avrbaudcalc-1.0.8.php

Vielen Dank für die sehr gelungene Zusammenstellung!

Man kann das zwar rechnen - aber so ist es natürlich viel 
übersichtlicher. Auf jeden Fall lohnt auch ein Blick auf die Spalte "% 
of error".

von c-hater (Gast)


Lesenswert?

Hans I. schrieb:
> Ich habe mal 2 Dateien angehängt. Fuse-Bits und meinen Quelltext.

Fuses passen, der Fehler steckt im Quelltext, nämlich hier:

> ldi temp1,0
[...]
> out UBRRH,temp1

Lies' das verdammte Datenblatt. Du kannst beim Mega16 nicht so einfach 
auf UBRRH zugreifen. Was du tatsächlich tust: du schreibst 0 auf UCSRC.

von Dyson (Gast)


Lesenswert?

Wolfgang schrieb:
> Lass dein UART nach der Initialisierung irgendeinen Text senden und guck
> dir das mit einem LA oder Oszi an.

Nicht irgendeinen Text, sondern fortlaufend 0x55 mit 1 Stopbit.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Lies' das verdammte Datenblatt. Du kannst beim Mega16 nicht so einfach
> auf UBRRH zugreifen. Was du tatsächlich tust: du schreibst 0 auf UCSRC.

Falsch. Ich hätte es erstmal wieder lesen müssen. So schnell vergisst 
man...

Passt schon.

von A. S. (Gast)


Lesenswert?

Hans I. schrieb:
> Bis 4,433 MHz kann ich Baudraten bis 19,2k erreichen. Darüber geht auch
> nichts mehr.
> Bei höheren Taktfrequenzen funktioniert aber nicht einmal 2400 Baud.

In der Regel kann jeder uart bis maximale Quarzfrequenz/16, /32 oder 
/64.

Bei glatten Quarzen passen die baudratn oft nicht. Der Fehler sollte <1% 
sein, über 3 geht nix mehr.

Es gibt uart-Quartze, mit vielfachen von 115200*16. Z.B. 22,1184 MHz. Da 
geht dann jede baudrate wieder. Senden immer, empfangen nur wenn genug 
Zeit zur Verarbeitung bleibt.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Passt schon.

Aber das nicht:

> ldi temp,0b00001000      ;Enable receiver

Das enabled den Transmitter, nicht den Receiver.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Das enabled den Transmitter, nicht den Receiver.

Allerdings benutzt du ja auch nur den Transmitter. Also auch nicht das 
eigentliche Problem. (Allerdings trotzdem durchaus ein Problem: wenn man 
einen Kommentar hinschreibt, dann sollte der auch passen).

von Korinthenkacker (Gast)


Lesenswert?

c-hater schrieb:
>> ldi temp,0b00001000      ;Enable receiver
>
> Das enabled den Transmitter, nicht den Receiver.

Damit schreibt man 0x08 in temp. Tuen tut das gar nichts.

von (prx) A. K. (prx)


Lesenswert?

Ist das ein Steckbrettaufbau? Die sind nicht immer sehr quarzfreundlich. 
Generell wäre ein Foto vom Aufbau kein Fehler.

Vergiss erst einmal RS232. Bau einen Code, der einfach nur einen Ausgang 
toggelt, mit beispielsweise 1 Hz. Wenn überhaupt nichts blinkt, läuft 
nichts. Wenn die falsche Frequenz ist, siehst du das.

von A. S. (Gast)


Lesenswert?

Dyson schrieb:
> Nicht irgendeinen Text, sondern fortlaufend 0x55 mit 1 Stopbit.

Auch ideal zum Test ist Ox0f z.b. alle 10ms. Da erkennt man direkt die 
ungefähre Baudrate beim mitlesen, wenn andere Zeichen erkannt werden.

Mit oszi auch im Wechsel mit 0xf0, für ein relativ perfektes 
Augendiagramm bei Trigger auf Startflanke.

von c-hater (Gast)


Lesenswert?

Korinthenkacker schrieb:

> Damit schreibt man 0x08 in temp. Tuen tut das gar nichts.

Ja, du hast recht. Getan wird dann genau eine Zeile später.

Beitrag #6859014 wurde vom Autor gelöscht.
von A. S. (Gast)


Lesenswert?

A. S. schrieb:
> Auch ideal zum Test ist Ox0f z.b. alle 10ms.

Sorry, Blödsinn.

wenn, dann 0xf0, damit zuerst nur Nullen, dann Einsen kommen.

Mit dem Startbit sind es aber 5, besser wären 4: Also 0xf8. Dann sind 
doppelte , vierfache und halbe Frequenz perfekt.

Auch der Umgekehrte Weg ist gut: Einen Empfänger kann man Sehr gut 
testen mit einem Funktionsgenerator. Für einen Uart mit 115k (8 Bit, 
ohne Parity) gehen Rechteck-Frequenzen von 12,8k (dann wird 0 empfangen) 
bis 23,04k (dann wird 0x0f empfangen). Man kann damit Empfang sehr 
einfach ausmessen, wenn man z.B. einen Empfangs/Fehlerzähler auf das 
gewünschte Zeichen setzt.

von c-hater (Gast)


Lesenswert?

(prx) A. K. schrieb:

> Vergiss erst einmal RS232. Bau einen Code, der einfach nur einen Ausgang
> toggelt, mit beispielsweise 1 Hz. Wenn überhaupt nichts blinkt, läuft
> nichts. Wenn die falsche Frequenz ist, siehst du das.

Ja, auf lausigen Systemtakt würde ich inzwischen auch tippen (da ich 
keine offensichtlichen Fehler im Code oder den Fuses finden konnte): Der 
Quarz ist schlecht angepaßt und schwingt nur wiederwillig mit 
Schluckaufs. Gerade so an der Grenze zu "schwingt garnicht". Das ist 
immer fies, das kann beliebige Fehlfunktionen der Peripherie auslösen.

Und leider: Das läßt sich mit dem LED-Trick nichtmal zuverlässig 
nachweisen. Ohne guten Oszi als Messmittel hilft da nur "Probieren", 
also Variation der Bürde-Kapazitäten. Allerdings hilft dabei wiederum 
dieses "gerade an der Grenze" wieder. Eine E6-Stufe höher oder tiefer 
geht mit einiger Wahrscheinlichkeit garnix mehr. Da weiß man dann 
immerhin schon, in welche Richtung man optimieren muss.

von Hans I. (obiwahn)


Lesenswert?

OK. Ich fasse mal zusammen.
Bis auf den "Enable Reciever"-Fehler ist der Code nicht schön, aber 
lauffähig.
Am PC wirds ja wohl auch nicht liegen.

Und wenn ihr mir alle sagt, "das muss laufen" dann kanns ja nur noch am 
Aufbau oder am Kabel liegen. Übrigends ein Lochraster-Aufbau mit 2m 
Kabel.
Werd morgen mal mit n Oszi gucken. Oder ich werde zuerst den Quartz 
gegen einen Quartz-Oszillator tauschen. Hab ja noch ein paar Optionen :)

von (prx) A. K. (prx)


Lesenswert?

Hans I. schrieb:
> Übrigends ein Lochraster-Aufbau

Vergiss die Bilder nicht. Oben und unten.

> Werd morgen mal mit n Oszi gucken.

Wobei Tastkopf an Quarz einen schönen Heisenberg abgibt. Soll heissen: 
Da zu messen ist ziemlich problematisch. Es hat auch schon Fälle 
gegeben, wo es nur so funktionierte. ;-)

: Bearbeitet durch User
von Rainer V. (a_zip)


Lesenswert?

jo schrieb:
> Vielen Dank für die sehr gelungene Zusammenstellung!

Ja, nicht schlecht. Allerdings hatte bisher das Datenblatt eines jeden 
Controllers mit UART, mit dem ich gearbeitet habe, eine solche Tabelle! 
Hab jetzt gerade keine Lust, die diversen Tabellen zu vergleichen...aber 
besser wär das :-)
Gruß Rainer

von Dyson (Gast)


Lesenswert?

A. S. schrieb:
> wenn, dann 0xf0, damit zuerst nur Nullen, dann Einsen kommen.
>
> Mit dem Startbit sind es aber 5, besser wären 4: Also 0xf8. Dann sind
> doppelte , vierfache und halbe Frequenz perfekt.

Irgendwie hast du einen Knoten im Kopf. 0xF0 fortlaufend gesendet: 
Startbit(0), 4 Nullen, 4 Einsen, Stopbit(1) ergibt einen schönen 1:1 
Wechsel mit 1/10 der Baudrate als Frequenz.

von Stefan F. (Gast)


Lesenswert?

Falls kein Oszilloskop vorhanden ist tut es auch ein Logic Analyzer für 
10 Euro.

von c-hater (Gast)


Lesenswert?

(prx) A. K. schrieb:

> Wobei Tastkopf an Quarz einen schönen Heisenberg abgibt. Soll heissen:
> Da zu messen ist ziemlich problematisch. Es hat auch schon Fälle
> gegeben, wo es nur so funktionierte. ;-)

Richtig, man mißt bevorzugt den Phasenjitter an einem abgeleiteteten 
Takt oder halt an CLKO (was der Mega16 aber nicht hat).

von S. Landolt (Gast)


Lesenswert?

> wenn ihr mir alle sagt, "das muss laufen" ...

Dann schließe ich mich mal an: auf meinem Steckbrett läuft es, z.B. 
mit UBRR=51 (9600 Bd bei 8 MHz) oder auch mit 8 (115200 Bd bei 16 MHz, 
trotz des Fehlers von 3.5 %).

(die derzeit nicht benutzte Interrupttabelle sollte noch korrigiert 
werden)

von A. S. (Gast)


Lesenswert?

Dyson schrieb:
> Irgendwie hast du einen Knoten im Kopf. 0xF0 fortlaufend gesendet:
> Startbit(0), 4 Nullen, 4 Einsen, Stopbit(1) ergibt einen schönen 1:1
> Wechsel mit 1/10 der Baudrate als Frequenz.

Fürs Oszi, ja. Für ein Terminalprogramm ist 0xf8 ein bisschen besser, da 
0xf0 bei halber Frequenz (z.B. 9k6 statt 19k2) schon Framing-Error 
wirft. Und bei doppelter/vierfacher Frequenz nicht genau an den 
Bitflanken wechselt.

von Dyson (Gast)


Lesenswert?

A. S. schrieb:
> Fürs Oszi, ja. Für ein Terminalprogramm ist 0xf8 ein bisschen besser, da
> 0xf0 bei halber Frequenz (z.B. 9k6 statt 19k2) schon Framing-Error
> wirft.

Ich bezog mich letztlich darauf:

Wolfgang schrieb:
> Lass dein UART nach der Initialisierung irgendeinen Text senden und guck
> dir das mit einem LA oder Oszi an.

von Wolfgang (Gast)


Lesenswert?

A. S. schrieb:
> Dyson schrieb:
>> Nicht irgendeinen Text, sondern fortlaufend 0x55 mit 1 Stopbit.
>
> Auch ideal zum Test ist Ox0f z.b. alle 10ms. Da erkennt man direkt die
> ungefähre Baudrate beim mitlesen, wenn andere Zeichen erkannt werden.

Der Vorteil von fortlaufend gesendetem 0x55 mit 1 Stopbit ist, dass man 
da gar nichts erkennen muss, sondern ein Frequenzzähler oder ein DSO mit 
passender Signalauswertung direkt die Baudrate anzeigen kann.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> direkt die Baudrate anzeigen kann.

sorry, muss heißen "... direkt die Hälfte der Baudrate anzeigen kann."

von Hans I. (obiwahn)


Angehängte Dateien:

Lesenswert?

Hier sind schonmal 3 Bilder von meinem Probeaufbau.

Der MAX232 ist wie der Programmieradapter nicht auf der Platine sondern 
in den Gehäusen die daneben liegen. Und falls jemandem der steckbare 
Quartz
sauer aufstösst, den hab ich nur zum schnelleren durchtesten 
verschiedener Quartze steckbar gemacht.
Was die ganze Messgeschichte angeht, ich hab nur ein 40 Jahre altes 
Hameg. Da sind meine Mittel recht begrenzt. Bei 4 MHz oder mehr 
irgendeinen Jitter am Systemtakt zu erkennen kann ich wohl vergessen. 
Die RS232-Signale kann ich mir aber mal angucken. Morgen :)

von (prx) A. K. (prx)


Lesenswert?

AVCC ist die Stromversorgung von Port A und mitnichten optional. Also 
auch dann beschalten, wenn man den ADC nicht benötigt.

Die Kerkos zwischen (A)VCC und GND packt man am besten direkt an die 
Pinpaare vom Controller. Da bei dir die Steckplatine dazwischen ist, 
wärs kein Fehler, an beide Pärchen auf dieser Platine je einen 100nF 
zu stricken.

: Bearbeitet durch User
von Köbes (Gast)


Lesenswert?

Den Oszi mit Tastkopf sollte man nicht an den Quarz klemmen.
Wenn man programmieren kann, ist auch schnell mal irgendein Ausgang
auf einen messbaren Bruchteil des Systemtakts programmiert - damit zeigt 
sich der Quarz- (???) oder Systemtakt und schon hat man den Fehler 
besser eingekreist.
Das geht fixer, als hier langatmig zu jammern...

von H.Joachim S. (crazyhorse)


Lesenswert?

Köbes schrieb:
> Den Oszi mit Tastkopf sollte man nicht an den Quarz klemmen.
Mit 10:1-Tastkopf passiert da i.a. nicht viel. Verstimmt immer noch ein 
bisschen, aber kein Abreissen der Oszillation durch den Tastkopf. 100:1 
ist noch besser, aber nur selten vorhanden.

von Harry L. (mysth)


Lesenswert?

FCPU passend zum XTAL eingestellt?

Schon komisch, daß das noch niemand der ganzen "Experten" hier gefragt 
hat...

: Bearbeitet durch User
von Köbes (Gast)


Lesenswert?

H.Joachim S. (crazyhorse) schrieb:
> passiert da i.a. nicht viel.

I. A. ...
Das ist "Prinzip Hoffnung" statt simplem aussagekräftigem Funktionstest,
der auch gleich die tatsächliche Systemfrequenz offenlegt.

von Stefan F. (Gast)


Lesenswert?

Harry L. schrieb:
> FCPU passend zum XTAL eingestellt?
>
> Schon komisch, daß das noch niemand der ganzen "Experten" hier gefragt
> hat...

Die "Experten" haben erkannt, dass F_CPU in seinem Quelltext nicht 
verwendet wird und daher irrelevant ist.

von Falk B. (falk)


Lesenswert?


von m.n. (Gast)


Lesenswert?

Köbes schrieb:
> H.Joachim S. (crazyhorse) schrieb:
>> passiert da i.a. nicht viel.
>
> I. A. ...
> Das ist "Prinzip Hoffnung" statt simplem aussagekräftigem Funktionstest,

Nein, es ist das "Prinzip Erfahrung". Bei 32,768 kHz Quarzen kann es 
Probleme geben, dort einen Tastkopf anzuschließen. Bei höherfrequenten 
Quarzen ist dies nicht der Fall. Zudem ist die Frequenzabweichung dabei 
minimal.

Auch ganz ohne Messgerät kann man die interne Taktfrequenz hinreichend 
genau abschätzen: Eine LED im 1 s Takt blinken lassen und eine Minute 
lang mit dem Sekundentakt einer Uhr vergleichen. Im Idealfall kann man 
keine Abweichung der Phasenverschiebung feststellen, aber selbst, wenn 
pro Minute 61 oder 59 Impulse geblinkt werden, reicht dies für eine 
"gute" Baudrate aus.

von Hans I. (obiwahn)


Lesenswert?

OK. Problem gelöst !
And the winner is : Ich natürlich und (prx).
Hab seine Tips beherzigt und AVcc angeschlossen und 2x 100nF kerkos
direkt an die IC-Pins meiner Adapterplatine gelötet.
Jetzt geht 115,2 Kbps bei 16 MHz Taktfrequenz. Mehr konnte ich nicht 
erreichen. Bei höheren Baudraten meldet sich mein Uralt-PC mit "Falsche 
Parameter".
War wohl keine gute Idee den halben Controller ohne Stromversorgung 
einfach in der Luft hängen zu lassen. Also AVcc auch anschliessen wenn 
man Port A und ADC nicht braucht.

Aber auch vielen Dank bei allen anderen die sich hier beteiligt haben.

von Stefan F. (Gast)


Lesenswert?

Hans I. schrieb:
> Also AVcc auch anschliessen wenn man Port A und ADC nicht braucht.

Schließe AVcc bsser immer an, auch wenn du Port A nicht verwendest. Der 
Betrieb ohne AVcc ist nicht vorgesehen.

von Hans I. (obiwahn)


Lesenswert?

Noch ein Nachtrag.
Mit meinem kleinen Testprogramm konnte ich leider nur die Richtung
Controller --> PC testen. Das lief auch schon fehlerfrei.
Bei weiteren Tests musste ich leider feststellen des die Richtung
PC --> Controller immer noch Fehler bringt. Nicht viele, aber ab und zu 
war mal son Aussetzer dabei. Ich hab jetzt den Quarz gegen einen
16 MHz Quarzoszillator getauscht (Fusebits entsprechend einstellen !).
Jetzt läuft die Sache rund. Keine Fehler oder Aussetzer mehr.

von m.n. (Gast)


Lesenswert?

Aktiviere mal CKOPT in den fuse-bits. Ab > 8 MHz ist das sinnvoll bzw. 
notwendig, damit der Quarzoszillator stabil schwingt.

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.