UART Probleme

Gast #1391295
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
Gast #1391319
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
Gast #1391325
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
Gast #1391729
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.
Gast #1391769
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
Gast #1391778
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

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