Keine RS232 Kommunikation bei CPU-Taktraten über 4 MHz

OP #6858880
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 ? :(
Gast #6858892
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.
Gast #6858930
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.
Gast #6858962
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.
Gast #6858984
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.
Gast #6859002
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.
#6859011
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.
Gast #6859012
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.
Beitrag #6859014 wurde von einem Moderator gelöscht.
Gast #6859028
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.
Gast #6859031
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.
OP #6859050
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 :)
Gast #6859068
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.
Gast #6859078
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).
Gast #6859082
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)
Gast #6859104
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.
Gast #6859210
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.
OP #6859221
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 :)
Angehängte Dateien:
#6859251
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.
Gast #6859346
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...
Gast #6859389
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.
Gast #6859577
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.
OP #6860896
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.
OP #6862616
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren