Forum: Mikrocontroller und Digitale Elektronik UART Probleme


von Andy M. (Gast)


Lesenswert?

Guten Abend,

ich habe ein Problem mit dem USART0 des MEGA644P.

Ich habe ihn wie folgt initialisiert:
1
#define UBRR_VAL 10
2
3
UCSR0B |= (1 << TXEN0);                       // UART TX einschalten
4
UCSR0C |= (1 << UCSZ01)|(1 << UCSZ00);    // Asynchron 8N1  
5
6
UBRR0H = UBRR_VAL >> 8;
7
UBRR0L = UBRR_VAL & 0xFF;

Und in der Hauptschleife lasse ich dann folgendes ausgeben:
1
while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
2
    {
3
    }
4
5
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

von Eule (Gast)


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/serial/serial.html



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

von Andy M. (Gast)


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

von Stefan_KM (Gast)


Lesenswert?

Welche Taktfrequenz hat denn dein Controller?

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

von Jean P. (fubu1000)


Lesenswert?

Hi,
probiers mal so:

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

von Andy M. (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Blackbird (Gast)


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

von Andy M. (Gast)


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

von Andy M. (Gast)


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

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.