www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Baudraten-Diskrepanz zwischen PC und uC


Autor: Christoph R. (chris232)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein Problem mit der Zeichen-Übertragung via UART von uC zum PC.
Wenn ich eine Baudrate von z.B. 4800 im Controller einstelle, muss ich 
im Terminalprogramm des PCs 600 einstellen, damit er die Zeichen 
empfängt. Ich habe einen externen 16Mhz Quarz und das UBBR auch richtig 
berechnet. Der Quarz ist i.O. Der Baudraten-Fehler liegt in der 
Toleranz.

Die Funktion zum Senden eines Zeichens ist die wohl bekannte aus 
RN-wissen.de

//---------------------------------------------------------------------- 
-

#define BAUDRATE 4800UL
#define F_CPU 16000000

void uart_init()
{
 uint16_t ubrr = (uint16_t) ((uint32_t) (F_CPU+BAUDRATE*8)/(16*BAUDRATE) 
- 1);

UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);

...

}
//---------------------------------------------------------------------- 
-


static inline int
uart_putc (const uint8_t c)
{
    // Warten, bis UDR bereit ist für einen neuen Wert
    while (!(UCSRA & (1 << UDRE)))
        ;

    // UDR Schreiben startet die Übertragung
    UDR = c;

    return 1;
}
//---------------------------------------------------------------------- 
-

Hat jemand eine Vermutung?

Gruß,
Christoph

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:

> Wenn ich eine Baudrate von z.B. 4800 im Controller einstelle, muss ich
> im Terminalprogramm des PCs 600 einstellen,

Das ist ein Faktor 8

> Hat jemand eine Vermutung?

Du hast die CLKDIV8 Fuse nicht deaktiviert.
Dein µC läuft nicht mit 16Mhz sondern mit 2Mhz

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Christoph R. (chris232)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Faktor 8 hat mich auch stutzig gemacht. Der Quarz ist richtig 
eingestellt, da ich mit einem Timer-Overflowinterrupt einen Ausgang 
getoggelt habe und die Änderung über ein Oszilloskop gemessen habe.

Wenn ich nun PC-seitig 1200 einstelle und im Controller 9600, klappt es 
wiederum nicht.

Ich benutze ACV Studio und der SUT_CKSEL ist auf Extern und High 
Frequenz gestellt - daher habe ich keine Möglichkeit CKDIV8-Fuse 
einzustellen, oder?

Die Kondensatoren des Max232 sind laut AVR-GCC Tutorial noch in der 
Toleranz.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:

> Ich benutze ACV Studio und der SUT_CKSEL ist auf Extern und High
> Frequenz gestellt - daher habe ich keine Möglichkeit CKDIV8-Fuse
> einzustellen, oder?

Welcher Prozessor?


Hast du eine LED an einem Ausgang?
In
http://www.mikrocontroller.net/articles/AVR_Checkl...
ist ein Testprogramm angegeben. Probiers mal aus.

Autor: Christoph R. (chris232)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe einen Atmega8..

Subjektiv blinkt die LED mit 1Hz - Aber ich hatte ja schon im 
Millisekundenbereich einen Ausgang getoggelt --> 8bit Timer mit 1024 
PreScaler und alle 16,4ms Overflow: ging.

Trotzdem schonmal Danke für die Tipps!

Autor: Christoph R. (chris232)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es lag an folgender Einstellung:

UCSRC = (1 << UCSZ1) | (1 << UCSZ0);

Nachdem ich diese Funktion rausgenommen habe, lief die Übertragung.
Weiß jemand was diese Einstellung aussagt? Ich verstehe die Beschreibung 
im Tutorial nicht:

Diese Bits setzten in Verbindung mit UCSZ2 aus dem UCSRB Register die 
Anzahl der Datenbits eines Frames. Diese Bits setzten den entsprechenden 
Paritätsmodus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph R. schrieb:
> Es lag an folgender Einstellung:
>
> UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
>
> Nachdem ich diese Funktion rausgenommen habe, lief die Übertragung.


Schau mal im Datenblatt deines Prozessors nach, ob es im Register UCSRC 
ein Bit namens URSEL gibt.

Wenn es eines gibt, dann zieh dir selbst die Ohren lang, dass du die 
Beschreibung bzw. das Tutorial nicht aufmerksam genug gelesen hast. Denn 
dann hast du nicht das UCSRC Register manipuliert sondern UBRRH

PS: Der Mega8 hat besagtes URSEL Bit.

Und es unterstreicht wieder einmal das, was hier jeden Tag zig mal 
gepredigt wird: Poste kompletten Code!
Oft genug steckt das Problem nicht in den geposteten Teilen. Wenn es 
dort wäre, würdest du es wahrscheinlich selber sehen. Da du es aber 
nicht gesehen hast, sind die Chancen gar nicht so schlecht, dass du an 
der falschen Stelle suchst.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Nachdem ich diese Funktion rausgenommen habe, lief die Übertragung.

?????????

>Weiß jemand was diese Einstellung aussagt?

Ja. Das Datenblatt.

Wenn die Bits beide 0 sind läuft die UART mit 5 Datenbits. Und richtig 
laufen kann es damit auch nur, wenn das PC-Programm auch auf 5 Datenbits 
eingestellt ist.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>Nachdem ich diese Funktion rausgenommen habe, lief die Übertragung.
>
> ?????????
>
>>Weiß jemand was diese Einstellung aussagt?
>
> Ja. Das Datenblatt.
>
> Wenn die Bits beide 0 sind läuft die UART mit 5 Datenbits. Und richtig
> laufen kann es damit auch nur, wenn das PC-Programm auch auf 5 Datenbits
> eingestellt ist.

8N1 ist der Default solange er an USCRC nicht dreht.
Aber: Solange er beim setzen das URSEL Bit weglässt, überschreibt er 
sich UBRRH und nicht UCSRA

Autor: Christoph R. (chris232)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bekenne mich schuldig, danke. Werde es das nächste mal beherzigen.

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.