UART Konfigurieren

Gast #3712597
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
#3712619
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
#3712640
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
Gast #3712736
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.
Gast #3712749
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.
#3712766
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 ?
Gast #3712874
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.
Gast #3712877
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...
Gast #3712889
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).
#3712919
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.
Gast #3712930
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.
#3712959
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.

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