www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UBRR-Registerinhalt für UART über Formel berechnen!


Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag alle zusammen,

ich sitze hier gerade bei der Inbetriebnahme eines Atmega644P. Nun 
wollte ich die UART0-Schnittstelle in Betrieb nehmen. Anfangs habe ich 
einen fixen Wert (0x33) in das UBRR0-Register geschrieben, um bei 8MHz 
CPU-Clock eine Baudrate von 9,6k zu bekommen. Damit funktionierte die 
Schnittstelle wunderbar. Nun wollte ich den Registerinhalt wie üblich 
über gewisse define-Werte (F_CPU, BAUD) abhängigmachen. Aber dabei wird 
mir irgentein falscher Wert in das Register geschrieben und es kommen 
nur noch komische Zeichen am Rechner an.

Ich hab die optimierte Formel genommen, bei der der Wert gleich gerundet 
wird.

Tippe ich die Formel selbst mit dem Taschenrechner durch, komme ich 
wieder auf 0x33.

Danke für eure Hilfe
Matthias

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und jetzt möchtest du, dass wir dir sagen, was bei deinen Defines schief 
läuft, ohne sie jemals zu Gesicht bekommen zu haben?

Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast ja recht ;-)


Hier die Definitionen in der Header:
#ifndef F_CPU
#define F_CPU 8000000
#endif

#define BAUD_UART0 9600
#define UBRR0_VAL  ((F_CPU + BAUD_UART0 * 8) / (BAUD_UART0 * 16)-1)

Die Initialisierungsfunktion sieht wie folgt aus:
void uart0_init()
{
 UBRR0 = UBRR0_VAL;                           //0x33
 UCSR0B = (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0);
 UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}

Hinter der UBRR0-Zeile hab ich den auskommentierten Fixwert für das 
Register stehen. Mit dem funktionierts wunderbar.

Danke

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define BAUD_UART0 9600
ändere das in
#define BAUD_UART0 9600UL

Autor: matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,
so funktionierts. Könntest du mir vielleicht auch in 1 oder 2 Sätzen 
sagen, was das "UL" bewirkt?

Dankende Grüsse
Matthias

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
matthias schrieb:
> #define BAUD_UART0 9600
> ...
> #define UBRR0_VAL  ((F_CPU + BAUD_UART0 * 8) / (BAUD_UART0 * 16)-1)

Fällt Dir beim manuellen Nachrechnen am Zwischenwert „BAUD_UART * 8“ was 
auf?  Nein?  Sollte aber.  Du hast 2 Integer hingeschrieben.  Somit wird 
16 Bit signed gerechnet.  Das überschreitet den Wert einer Integer aber 
bei Weitem.

Mach aus den 8 8UL und dito mit den 16.

Edit:  zulange für die Antwort gebraucht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.