Forum: Mikrocontroller und Digitale Elektronik UART Konfigurieren


von charly (Gast)


Lesenswert?

Hi ich habe gerade vor für meinen ATmega16 die UART Schnittstelle zu 
implementieren.

Ich habe keinen Oszilator also verwende ich den internen Taktgeber. Laut 
den Fuses "SUT_CKSEL" steht bei mir der Wert "INTROSC_8MHz_6CK_64ms"

also gehe ich davon aus das ich für die Berechnung von UBBR F_CPU auf 
8000000UL setzen muss.

Baudrate ist mir egal iwas um 4800 oder 9600.

Für 9600 habe ich folgendes berechnet:

((8000000+9600*8)  / (9600*16) - 1) = 51

Also habe ich folgende Initialisierungsfunktion:
1
void uart_init(){
2
  //ubrr with 8MHz
3
  UBRRH = 0;
4
  UBRRL = 51;
5
  
6
  UCSRB |= (1 << RXEN) | (1 << TXEN);
7
  //uart format 8N1
8
  UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ2);
9
}

Was mache ich da falsch?

Hat einer von euch eine Idee ich teste das einfach mit einem
1
uart_putc(uart_getc());
 in der endlos Schleife

Bitte um Hilfe :) und vielen Dank für eure Aufmerksamkeit

von Ben S. (theben)


Lesenswert?

Hast du den internen Taktgeber kalibriert?
Die AVR Dinger sind recht ungenau ab Werk damit funktioniert meist der 
UART nicht.

von charly (Gast)


Lesenswert?

Wie kalibriert man das denn? Höre ich heute zum ersten mal also 
scheinbar habe ich das nicht gemacht.

Grüße

von Karl H. (kbuchegg)


Lesenswert?

charly schrieb:

> also gehe ich davon aus das ich für die Berechnung von UBBR F_CPU auf
> 8000000UL setzen muss.

exakt.
Aber kontrollier besser, ob der µC wirklich mit ca. 8Mhz läuft!
(dazu eignet sich zb delay_ms. Entweder die Zeit, die du angegeben hast 
stimmt oder sie stimmt nicht, wenn du in F_CPU die 8Mhz einträgst)

> Für 9600 habe ich folgendes berechnet:
>
> ((8000000+9600*8)  / (9600*16) - 1) = 51

Dazu gibt es Makros, die die Berechnung ausgehend von F_CPU und der 
gewünschten Baudrate für dich erledigen. Benutze sie!
Du willst derartige berechnete Zahlen nicht direkt im Code stehen haben!


> Was mache ich da falsch?

Was funktioniert denn nicht?

Wahrscheinlich stimmt deine µC-Takrate nicht. Wenn du mit 8Mhz rechnest, 
deine Fuse-Einstellung aber nach wie vor auf den 1Mhz Default steht, 
dann ist klar, dass da nichts vernünftiges dabei rauskommt.
Das ist der häufigste Fehler - also kontrollier, ob dein µC wirklich mit 
8Mhz läuft oder nicht.

Und dann ist natürlich noch das Nicht-Verwenden eines QUarzes 
problematisch. Die internen 8Mhz sind halt nur so lala genau.

>
>
1
> uart_putc(uart_getc());
2
>
> in der endlos Schleife

schlechte Idee.
Dein erster Test sollte ein einfaches
1
    uart_putc( 'X' );
sein.
Also erst mal nur Ausgabe und sonst nichts. Wenn du davon abhängig bist, 
dass sowohl die Eingabe als auch die Ausgabe fehlerfrei funktionieren 
müssen, dann ist das fürs erste schon mal eine Voraussetzung zu viel.


http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

von charly (Gast)


Lesenswert?

Danke guter Tipp also das geht schon einige ms auseinander. Bei 10s 
schon > 200ms Was kann ich denn zur Stabilisierung machen? Ggf eine 
geringere Freqeunz z.B. 1Mhz?

Gruß

von Dietrich L. (dietrichl)


Lesenswert?

charly schrieb:
> Für 9600 habe ich folgendes berechnet:
>
> ((8000000+9600*8)  / (9600*16) - 1) = 51

Die Formel ist falsch, allerdings das Ergebnis fast gleich:

((8000000)  / (9600*16) - 1) = 51,6

> Also habe ich folgende Initialisierungsfunktion:
> void uart_init(){
>   //ubrr with 8MHz
>   UBRRH = 0;
>   UBRRL = 51;

Dreh mal die Reihenfolge um: zuerst Low-Byte und dann High-Byte.

Jetzt kann zusätzlich zum Fehler durch Rundung von UBRR noch die 
Taktfrequenz zu sehr abweichen, dass die Übertragung nicht richtig 
funktioniert. Du brauchst ggf. einen externen Quarz.

Gruß Dietrich

von spess53 (Gast)


Lesenswert?

Hi

>Dreh mal die Reihenfolge um: zuerst Low-Byte und dann High-Byte.

Falsch. Beim Schreiben H-Byte dann L-Byte. Beim Lesen anders herum.

MfG Spess

von der alte Hanns (Gast)


Lesenswert?

Und auch die 51 stimmt, siehe 19.11 Examples of Baud Rate Setting.

von der alte Hanns (Gast)


Lesenswert?

> Bei 10s schon > 200ms
Also 2 %, ist doch gar nicht so schlecht; der Fehler liegt wohl an 
anderer Stelle.

von Dietrich L. (dietrichl)


Lesenswert?

spess53 schrieb:
> Falsch.

OK, habe ich mit gemerkt :-)

von Uwe (de0508)


Lesenswert?

Hallo charly,

da stellt sich immer die Frage, welche FuseBits sind nun wirklich 
gesetzt ?

Ich gehe mal von 1:8 Vorteiler CPU Clock aus.

von charly (Gast)


Lesenswert?

Danke es wird wohl auf einen externen Quarz hinauslaufen

von der alte Hanns (Gast)


Lesenswert?

Irrtum, danach geht die Fehlersuche an gleicher Stelle wieder weiter.

von der alte Hanns (Gast)


Lesenswert?

Der nächstliegende Schritt wurde Ihnen doch schon vom Moderator 
vorgegeben, nämlich die Checkliste, und dort speziell 'Sonstige 
Fehlerquellen'; nur noch durchlesen und Punkt für Punkt abhaken.

von Holger L. (max5v)


Lesenswert?

charly schrieb:
> UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ2);

(1 << UCSZ1) | (1 << UCSZ2) ist laut Datenblatt Reserved.

Für einen Character Size von vermutlich 8 Bit müßtest du doch eigentlich
(1 << UCSZ1) | (1 << UCSZ0) setzen ?

von dummy (Gast)


Lesenswert?

>(1 << UCSZ1) | (1 << UCSZ2) ist laut Datenblatt Reserved.

Und ausserdem gibt es kein UCSZ2 in UCSRC;)

von der alte Hanns (Gast)


Lesenswert?

> Für einen Character Size von vermutlich 8 Bit müßtest du doch eigentlich
> (1 << UCSZ1) | (1 << UCSZ0) setzen ?

Auch wahr.
Aber am besten, das UCSRC gar nicht setzen, der Initial Value passt doch 
schon.

> Und ausserdem gibt es kein UCSZ2 in UCSRC

Jaja, das ist im Datenblatt etwas irreführend.

von der alte Hanns (Gast)


Lesenswert?

> UCSZ2
Nanu, der C-Compiler bringt da keine Fehlermeldung?

von dummy (Gast)


Lesenswert?

>> UCSZ2
>Nanu, der C-Compiler bringt da keine Fehlermeldung?

Warum sollte er?

von der alte Hanns (Gast)


Lesenswert?

> Warum sollte er?
Mein Fehler, ich dachte, es sei nicht definiert, aber es steht ja in 
UCSRB.

von Holger L. (max5v)


Lesenswert?

der alte Hanns schrieb:
> Auch wahr.
> Aber am besten, das UCSRC gar nicht setzen, der Initial Value passt doch
> schon.

Und ein halbes Jahr später hast du den Salat.

der alte Hanns schrieb:
> Nanu, der C-Compiler bringt da keine Fehlermeldung?

Wäre natürlich schön wenn er das machen würde.
Er setzt zwei mal direkt hintereinander das 2. Bit in UCSRC, das zu 
erkennen sollte doch möglich sein ?

von der alte Hanns (Gast)


Lesenswert?

> Und ein halbes Jahr später hast du den Salat.
Helfen Sie mir auf die Sprünge, was meinen Sie damit?

von Holger L. (max5v)


Lesenswert?

Wenn man später nochmal nachlesen will was man gemacht hat ist es 
einfacher, zumindest für mich, wenn solche Einstellungen direkt im Code 
stehen.

Ich heiße Du nicht Sie ;)

von der alte Hanns (Gast)


Lesenswert?

"Ein alter Hund lernt keine neuen Tricks", an die ubiquitäre Duzerei 
werde ich mich nicht mehr gewöhnen.

von Holger L. (max5v)


Lesenswert?

Klasse.
Dann muß ich mich bei Ihnen wohl entschuldigen.

von der alte Hanns (Gast)


Lesenswert?

In keiner Weise, in der Richtung passt es, nur andersrum geht es mir 
nicht von den Lippen bzw. aus den Fingern.

von der alte Hanns (Gast)


Lesenswert?

Da die fachliche Seite der Diskussion offenbar ins Stocken geraten ist, 
sei mir gestattet, Holger L. noch etwas persönlicher zu antworten, der 
Moderator darf's dann auch bald wieder löschen:
Natürlich ist auch die Anredeform, wie alles Sprachliche (und überhaupt 
Alles) dem Wandel unterworfen, man denke an das friderizianische Er 
("Gehe Er mir aus dem Wege"), oder das Ihr:
»Wohlwend, Ihr könnt hier nicht mit uns von Euren Sachen reden; das sind 
unsere Kinder, vor denen es sich nicht schickt!«
...
»Du hast ihn scharf behandelt!« sagte er zu ihr, »wie zum Teufel gerätst 
du auf den Einfall, per Wohlwend und per Ihr mit ihm zu reden?«
»Ich denke, man spricht so mit den Sträflingen in den Zuchthäusern; in 
meinen Augen ist er aber nichts Besseres!«

Nur so die 2ct eines alten Hundes, pardon, eines alten Hanns.

von c-hater (Gast)


Lesenswert?

der alte Hanns schrieb:

> "Ein alter Hund lernt keine neuen Tricks", an die ubiquitäre Duzerei
> werde ich mich nicht mehr gewöhnen.

Wie alt bist du/sind Sie, wenn ich mal fragen darf?

Ich bin nämlich auch nicht mehr so ganz jung, habe aber keinerlei 
Probleme mit der Duzerei. Naja, Kind der sittenlosen 60er...

Du stammst vermutlich noch aus den 50ern oder noch früher. Trotzdem ist 
die Sache nicht hoffnungslos. Mein Alter Herr ist Baujahr 41 und hat's 
auch gelernt...

Hängt eigentlich wohl vor allem vom Umfeld ab. Am schlimmsten ist es 
wohl im Beamten-Milieu. Auch im Milieu der Quasi-Beamten, also z.B. 
aufwärts ab der mittlere Leitungsebene in großen Konzernen...

Naja, wäre ja auch das erste Mal in der Geschichte der Zivilisation, daß 
Beamte/Quasibeamte irgendwas zur Vereinfachung des Lebens unternehmen 
würden...

von der alte Hanns (Gast)


Lesenswert?

an c-hater

Vereinfachung bedeutet keineswegs immer Verbesserung.

Ansonsten ist es wohl eine Frage der Gewohnheit (auch so ein Merkmal des 
Alters): ich kann mit der neueren Literatur nicht viel anfangen, schon 
mit dem sonst geschätzten Arno Schmidt habe ich regelmäßig 
Schwierigkeiten; literarisch zu Hause fühle ich mich im 19. Jahrhundert, 
Hauff, Keller (siehe oben), Raabe - das prägt. Und wenn das dann 
abschätzig als 'Biedermeier reloaded' bezeichnet wird (Hallo, Herr 
Brunner!), dann ist mir das wurschtegal (einer der wenigen Vorzüge des 
Alters).

von Holger L. (max5v)


Lesenswert?

Ein Lehrer hat mir vor langer Zeit etwas beigebracht, kurz 
zusammengefasst : Entweder man sagt sie aus Respekt vor einer Person, 
oder man sagt sie weil es ein Arschloch ist. Was man aus dem letzten 
Zitat aus Excelsior entnehme könnte.
Außerdem kenne ich Leute die ein du zu persönlich finden, es ihren 
Freunden vorbehalten.
Da ich Sie nicht kenne und demnach nicht einschätzen kann wie es 
aufzufassen ist, wäre zumindest für mich noch eine kleine Erklärung 
hilfreich.

von der alte Hanns (Gast)


Lesenswert?

Warum, bitte, sollte ich Sie für ein "Arschloch" halten? (übrigens eine 
merkwürdige Theorie von Ihrem Lehrer).
Sie haben erkannt, was Moderator, spess53, ich und andere übersahen; 
Ihre Umgangsformen, soweit zu erkennen, sind einwandfrei, was man von 
vielen anderen hier nicht unbedingt behaupten kann. Kurz: Sie sind mir 
ein geschätzter Gesprächspartner, oder, falls das besser ankommt: ich 
rede gerne mit Dir.

von der alte Hanns (Gast)


Lesenswert?

Und jetzt wäre mir lieb, wenn charly melden würde, wie weit seine 
Schnittstelle gediehen ist.

von Holger L. (max5v)


Lesenswert?

Das ist ja nur eine der drei Möglichkeiten gewesen.
Zugegeben hatte ich die schlimmste Variante eher in Betracht gezogen.
Persönliche Erfahrungen, das Umfeld, die Anonymität im Internet etc...
Was die Theorie angeht, die finde ich gar nicht so verkehrt. Das Sie in 
dem (negativen) Fall soll Distanz ausdrücken, den Standpunkt 
verdeutlichen ohne direkt zu beleidigen.

Danke es geht mir auch so, ich wünsche Dir noch einen schönen Abend.

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.