www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Probleme


Autor: Andy M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich habe ein Problem mit dem USART0 des MEGA644P.

Ich habe ihn wie folgt initialisiert:
#define UBRR_VAL 10

UCSR0B |= (1 << TXEN0);                       // UART TX einschalten
UCSR0C |= (1 << UCSZ01)|(1 << UCSZ00);    // Asynchron 8N1  

UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;

Und in der Hauptschleife lasse ich dann folgendes ausgeben:
while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
    {
    }

UDR0 = 'p';

Der Controller läuft mit 20 MHz - auf externe Taktquelle ist er gefused. 
Laut Datenblatt muss bei 20 MHz UBRR auf 10 gesetzt werden (Baudrate 
115,2k). Die Fehlerquote beträgt -1,4%. Ich habe es auch schon mit 
anderen Baudraten probiert (auch mit 2400 bei 520 für UBRR und 0% 
Fehler).

Im HTerm empfange ich immer nur 00h 80h abwechselnd.

Was habe ich übersehen? Ich such mich grade schon verrückt nach dem 
Fehler - wahrscheinlich liegt es nur an der Uhrzeit...

Liebe Grüße Andy

Autor: Eule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast den Receiver noch deaktiviert falls du ihn im Programm 
brauchst...

80h wäre ja ein P allerdings Großbuchstabe...

bist du sicher dass du auch in Hterm die richtige Bautrate, evtl 
Stoppbits und Flusskontrolle eingestellt hast?

versuchs mal so:
UDR0 = 112;

hier noch eine gute Seite:
http://www.cs.mun.ca/~rod/Winter2007/4723/notes/se...



so, nun gute nacht, gute besserung, alles gute und frohe weihnachten

Autor: Andy M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Receiver ist klar. Den brauche ich im Moment nicht.

Er gibt 0x80 aus - also eine hexadezimale Zahl. 80d (dezimal) wäre in 
ASCII ein "P".

In Hterm habe ich 115,2k als Baudrate, 1 Stopbit und keine Parity / CTS 
Flow control eingestellt. Wähle ich eine andere Baudrate, so kommt nur 
noch 0x00 an.

UDR0 = 112;
werde ich morgen probieren ...

Frohe Ostern :-D

Autor: Stefan_KM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Taktfrequenz hat denn dein Controller?

Die Baudrate sollte zum Quarz Takt passen, ansonsten wird der zeitliche 
Fehler zu groß.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
probiers mal so:

UBRR0H = (unsigned char) UBRR_VAL >> 8;
UBRR0L = (unsigned char) UBRR_VAL;

Autor: Andy M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Controller läuft mit 20 MHz. Die Baudrate habe ich 
selbstverständlich an die Taktfrequenz angepasst.

Die Werte mit (unsigned char) zu wandeln werde ich ausprobieren. Es wird 
aber mit großer Wahrscheinlichkeit keine Abhilfe schaffen, da ich die 
Werte für UBRR0H und L schon mal Byteweise eingetragen hatte (0, 129 für 
9600 Baud).

Hat noch jemand eine Idee, wo das Problem liegen könnte? Wenn ich TXD 
und RXD hinter dem MAX232 zusammenschalte, dann kriege ich im HTerm alle 
gesendeten Buchstaben korrekt wieder zurück. Die Beschaltung des MAX 232 
ist also korrekt.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schick doch mal ein anderes Bitmuster 0x0F, 0xF0, 0xAA und 0x55 sind da 
gute Kandidaten. Evtl. kann man erkennen, was da nicht passt.

Zum Takt:
Lass mal eine LED mit _delay_ms() blinken, und kontrollier, ob die Zeit 
plausibel ist.

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwo ein CLKDIV? bei den Fuses nicht richtig gesetzt?
Welchem Programmer verwendest Du?

Ist mir beim Programmieren des ATtiny2313 mit einem 
AN910-Serial-Programmer passiert: Da in der internen Tabelle des 
Programmers der ATtiny2313 nicht enthalten ist, wird empfohlen, den 
ATtiny26 einzustellen. Nur damit kann man nicht alle Fuses des 
ATtiny2313 auslesen, u.a eben den CLKDIV8 nicht. Und Setzen folgerichtig 
auch nicht. Also waren alle Baudraten und Zeiten 8 Mal länger. Statt 
9600Baud eben 1200Baud.


Blackbird

Autor: Andy M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Blackbird,

vielen  Dank! Das hört sich vielversprechend an. CLKDIV8 gibt es beim 
Mega644P auch - und es ist standardmäßig 0 (also programmed). Ich werde 
es nachher sofort austesten.

Lg Andy

Autor: Andy M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blackbird, vielen vielen Dank für den Hinweis. Der UART funktioniert nun 
wie gewollt!

Vielleicht wäre das ein Hinweis im Tutorial wert.

Lg Andy

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.