UART Problem mit Baudrate

OP #944126
Lesenswert?

Hallo,

ich bin dabei, das AVR Tutorial durchzuarbeiten und bin derzeit bei der 
UART Schnittstelle. Dummerweise kriege ich nur komische Zeichen auf's 
Display und nichts Sinnvolles.

Bei der Fehlersuche ist mir aufgefallen, daß am Max232-Ausgang das 
Signal nur ca. 2000 Baud hat und nicht 9600. (immer das gleiche Zeichen 
geschickt und dann mit dem Oszi reingeschaut). Hat jemand von Euch eine 
Idee, woran das liegen könnte...?

Konfiguration:
- ATmega8 mit externem Quarzoszillator 3,686400 MHz.
- Das Testprogramm praktisch 1:1 aus dem Tutorial übernommen
  (habe die Zeile .equ F_CPU = 4000000 in .equ F_CPU = 3686400 geändert)

Noch eine Beobachtung - keine Ahnung, ob die was damit zu tun haben 
kann: Auf dem Bild im Anhang sieht man, wie der Ozillator schwingt. Es 
gibt einen großen Unterschied, ob der Ausgang frei ist oder ob er an den 
XTAL1 Pin angeschlossen ist. Ist das normal?

Getestet habe ich das ganze mit dem HyperTerminal und mit dem TeraTerm. 
Es zeigen beide nur Müll. Und an den Porteinstellungen habe ich 
natürlich auch schon "rumgespielt"...

Bin für alle Hinweise dankbar!
lg, Nino.
Angehängte Dateien:
OP #944134
Lesenswert?

Das war schonmal ein guter Tip, danke! Die Schwingung des Quarzes bleibt 
jetzt quasi gleich, wenn man ihn anschließt - ändert nur ganz 
geringfügig die Amplitude.

Leider hat sich an meinem Baud-Problem damit nichts verändert. Alles 
beim Alten :-(

lg, Nino.
Persönliche Seite #944135
Lesenswert?

Huhu Nino ;)

Wenn Du immer das selbe Zeichen sendest, wie misst Du denn dann den 
Takt? Stimmen die Pegel denn? (+/- 12V fuer low, high) und hast Du Deine 
USART richtig konfiguriert. Stell mal den Schaltplan ein und ebenfalls 
den Source (bitte als Attachment) dann kann ich mehr sagen. 
Fehlerquellen gibt es viele. Ausserdem solltest Du noch die 
Rahmenbedingungen nennen, also welches Terminal und welchen Zeichensatz 
Du verwendest etc pp.

lieber Gruss,
Michael
OP #944161
Lesenswert?

puhu... So viele mögliche Fehlerquellen - ich staune!

Also erstmal der Programmcode, der steht hier: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART im Kapitel 
"Senden von Zeichen". (meine einzige Änderung ist die Taktfrequenz)

Mein Versuchsaufbau ist Eigenbau. Siehe Foto. Die UART-Schnittstelle 
habe ich aus dem gleichen Link wie oben entnommen (Schaltplan ident). 
Allerdings habe ich auf Deinen (Michael) Hinweis hin einen Fehler in 
meiner Beschaltung entdeckt. Ich habe falsche Elkos eingebaut (22uF, 
keine Ahnung warum). Ich nehme an, der Pegel ist deswegen nur ca. +/- 8 
Volt.

Also ich werde das mal ändern und dann melde ich mich wieder mit 
Ergebnissen. Trotzdem beantworte ich noch die weiteren Fragen:

> Wenn Du immer das selbe Zeichen sendest, wie misst Du denn dann den
> Takt?

Also ich habe mir mit dem Oszi angesehen, wie lange das Zeichen, das 
sich wiederholt, dauert. Das waren 0,0005 Sekunden. Ich habe das als 
2.000 Zeichen pro Sekunden interpretiert, also 2.000 Baud. Habe ich da 
was falsch gemacht?

> ...und hast Du Deine USART richtig konfiguriert...

Exakt so wie im o.g. Programmcode. Habe daran nichts geändert. (Gibts da 
etwa noch mehr zu konfigurieren...?)

Die Frage nach dem Zeichensatz kann ich leider (noch) nicht beantworten. 
Aber allgemein sieht es nicht nach einem Zeichensatzproblem aus, denn 
ich erhalte am PC lauter idente Zeichen, auch wenn der ATmega8 
unterschiedliche Zeichen wegschickt.

Ich habe übrigens zwei Terminals getestet, HyperTerminal und TeraTerm. 
Beide liefern praktisch das gleiche Ergebnis. Nicht ganz die gleichen 
Zeichen aber der Effekt ist im großen und ganzen derselbe.

Also, wie oben schon erwähnt, werde ich vorerst mal die Elkos tauschen 
und mich dann wieder melden. Jedenfalls großen Dank für Eure raschen 
Antworten!

lg, Nino.
Angehängte Dateien:
Gast #944197
Lesenswert?

Hallo,

> das Zeichen, das sich wiederholt, dauert. Das waren 0,0005 Sekunden.
> Ich habe das als 2.000 Zeichen pro Sekunden interpretiert, also 2.000
> Baud. Habe ich da was falsch gemacht?

Baud: Bits/s. Bei 8N1 (8 Bits, kein Paritätsbit, 1 Stoppbit) und einem 
Startbit hast Du 10Bits/Zeichen. Wenn Dein Zeichen 2000 mal pro 
Sekunde übertragen wird, liegst Du bei 20000Bd! Bist Du ganz sicher, 
dass Deine Formulierung "Zeichen" in diesem Kontext stimmt?

Wie sind die (Clock-)Fuses gesetzt?

Gruß

  risu
OP #944212
Lesenswert?

Hallo!

> Bist Du ganz sicher,
> dass Deine Formulierung "Zeichen" in diesem Kontext stimmt?

Nein, bin ich nicht.

Anbei ein Screenshot von meinem Oszi. Man sieht zwei wie ich es nannte 
"Zeichen" (K). Einstellung ist 0,2ms pro Teilung, die Dauer beider 
"Zeichen" ist zehn Teilungen, also 0,002 Sekunden. Das wären 10.000 
baud. Wenn man ganz genau schaut, ist das letzte Bit eh nicht mehr ganz 
drauf, also sind's. 9.600.
Wenn man es so schulmäßig vorrechnet, dann stimmt auf einmal alles. Tut 
mir leid, daß ich das in einem meiner gestrigen Postings falsch 
geschrieben habe. Ärgere mich soeben selbst darüber. hgrmpf

So, und außerdem noch ein Screenshot meiner fuse bits, frisch ausgelesen 
(Ponyprog: Hakerl = 0). Wie man sieht, habe ich von der Werkseinstellung 
nur die CKSELx geändert. CKSEL=0000.

Eins ist mir noch eingefallen, bevor ich meine Kondensatoren rauslöte, 
um den Pegel von 8 auf 12 Volt zu ändern. Ich könnte auch einen falschen 
Max232 eingebaut haben. Es ist ein MAX232CPE. (Datenblatt folgt gleich) 
Paßt dieser Bauteil?

Danke und schönes Wochenende!
Nino.
Angehängte Dateien:
Gast #944252
Lesenswert?

Hallo,

OK, Du erzeugts also ein 9600Bd Signal, was ja auch Dein Ziel war.

CKSEL3..0=0 bedeutet, dass Du einen externen Oszillator verwendest 
(sieht auf Deinem Foto auch so aus).

Der Schaltplan fehlt noch, ebenso der Code (auf der von Dir genannten 
Seite stehen mehrere Beispiele; kopiere einfach Deinen Code und stelle 
ihn als Anlage hier ein).

Gruß

 risu
Gast #944302
Lesenswert?

Hi,

1. Dein Code ist nicht assemblierbar ("VollesRegíster" und "Zaehler" 
sind nicht definiert) -- also bestimmt nicht das, was auf Deinem 
Controller läuft!
2. Wie sind die "UART-Auswahl"-Brücken gesetzt?

Gruß

  risu
OP #944310
Lesenswert?

ooops - alte Version erwischt. Ich hatte da zu Testzwecken eine 
Warteschleife drinnen. Nun der zweite Versuch. Jetzt ist es bestimmt 
das, was auf meinem Controller läuft ;-)

Die Auswahlbrücken JP3 und JP9 sind auf den MAX232 gesetzt (sicher 
korrekt, denn es kommt ja "etwas" bis zum PC) und JP20 
(Spannungsversorgung) ist gesetzt, also "ein".

Grüße, Nino (dankbar)
Angehängte Dateien:
Gast #944411
Lesenswert?

Hallo Nino,

Code und Schaltplan sollten OK sein. Also noch einmal eine 
Bestandsaufnahme: Laut F_CPU + Code sendest Du tatsächlich mit 9600Bd, 
was ja grob durch das Oszillogramm bestätigt ist. Momentan wiederholst 
Du das zeichen 'T'. Deine letzte Fehlermeldung war aber:

> ich erhalte am PC lauter idente Zeichen, auch wenn der
> ATmega8 unterschiedliche Zeichen wegschickt.

Was kommt denn beim Senden der 'T's an? Ist die Masseverbindung zwischen 
PC und Deinem System (Pin 5 am RS-232 Konnektor) in Ordnung? Wie ist das 
Terminalprogramm konfiguriert (müsste sein: 9600Bd, 8N1) ... und "hängt" 
es am richtigen Port?

Gruß

  risu
OP #946094
Lesenswert?

Problem gelöst - aber fragts mich bitte nicht wie!

Nachdem ich mein UART-Problem vorerst mal auf die lange Bank geschoben 
hatte, ist mir bei einem anderen Projekt etwas aufgefallen:

Ich habe ein Countdown-Programm für einen Platinenbelichter gemacht 
(macht wahrscheinlich jeder Anfänger mal), und dabei habe ich bemerkt, 
daß der Countdown nicht ganz ident mit der Stoppuhr des Handys gelaufen 
ist. Ich tippte (richtig) auf ein Taktproblem, wußte aber nicht, wo ich 
ansetzen sollte, denn ich hatte alles laut AVR-Tutorial eingestellt. Ich 
vermutete weiter (richtig), daß dieses Taktproblem auch die Ursache für 
mein UART-Problem war.

Folglich habe ich das UART-Testprogramm wieder geladen, an den 
Einstellungen im Programm herumgespielt,  verschiedene Quarze und 
-oszillatoren ausprobiert, bis ich schließlich Erfolg hatte.

Mich verwundert jetzt nur, daß es keinen (für mich erkennbaren) 
Unterschied zur Ausgangssituation gibt :-| (?)

Zusammenfassend möchte ich vermerken, daß ich (Einsteiger) Dank Eurer 
Hilfe viel über Mikrocontroller und diverses "rundherum" gelernt habe 
und bedanke mich für die vielen Tips!

Grüße, Nino.
Gast #946114
Lesenswert?

Hi

> denn ich hatte alles laut AVR-Tutorial eingestellt.

Im Zweifelsfall gilt das Datenblatt.

>  verschiedene Quarze und -oszillatoren ausprobiert, bis ich schließlich >Erfolg 
hatte.

Na ja, auch eine Methode. Willst du das aber immer so machen?

MfG Spess
OP #946163
Lesenswert?

> Na ja, auch eine Methode. Willst du das aber immer so machen?

Die Strategie ist rauszufinden, welche Wirkung es hat, wenn man an 
irgendeinem Schräubchen dreht (das man noch nicht kennt). Funktioniert 
oft recht gut, wenn man sonst grade nicht weiter weiß :-)

lg, N.

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