Forum: Mikrocontroller und Digitale Elektronik UART Problem mit Baudrate


von Nino K. (nino)


Angehängte Dateien:

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.

von Björn W. (bwieck)


Lesenswert?

So wie das auf dem Oszillogrammen aussieht sind die Fuses für den Takt 
falsch gesetzt.

Setz mal auf ext. Clock anstatt ext. Crystal

Grüße
Björn

von Nino K. (nino)


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.

von Michael G. (linuxgeek) Benutzerseite


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

von Nino K. (nino)


Angehängte Dateien:

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.

von risu (Gast)


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

von Nino K. (nino)


Angehängte Dateien:

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.

von Nino K. (nino)


Angehängte Dateien:

Lesenswert?

Datenblatt MAX232CPE

von Gast (Gast)


Lesenswert?

>um den Pegel von 8 auf 12 Volt zu ändern.

Vergiss es. 8V sind in Ordnung, 12V werden es nicht werden und stammen 
aus einer Fehlinterpretation der V24. Normgerecht sind Pegel ab +/-3V.

von risu (Gast)


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

von Nino K. (nino)


Angehängte Dateien:

Lesenswert?

Hi,

korrekt: externer Ozsillator (3,686400 MHz). Funktioniert auch.

Hier der Code. (im Anhang)

lg, Nino.

von Nino K. (nino)


Angehängte Dateien:

Lesenswert?

...und ein Foto vom Quarz auf dem - räusper - high end Steckbrett ;-)

von Nino K. (nino)


Angehängte Dateien:

Lesenswert?

...und der Schaltplan

von risu (Gast)


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

von Nino K. (nino)


Angehängte Dateien:

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)

von risu (Gast)


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

von Nino K. (nino)


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.

von spess53 (Gast)


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

von Nino K. (nino)


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.

von David (Gast)


Lesenswert?

solange dies nicht zum standartvorgehen wird, sondern eher ein akt der 
verzweiflung kurz vor arbeitsende, ist doch ok...

von Nino K. (nino)


Lesenswert?

Kurz vor der Verzweiflung würde ich andere Methoden bevorzugen. Wozu hat 
man denn sonst Vorschlaghammer, Flammenwerfer und Dynamit zuause? Der 
Kreativität sind keine Grenzen gesetzt!

;-) N.

von Paul Baumann (Gast)


Lesenswert?

Wie Rio Reiser schon sagte:

Macht kaputt, was Euch kaputt macht. ;-)

http://www.youtube.com/watch?v=UwE8dlRnsio

MfG Paul

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.