Warum empfängt mein UART immer nur 1 Zeichen?

Gast #508388
Lesenswert?

Hallo

Ich Programmieren einen ATMega32 mit WinAVR

Ich schicke einen String von ca. 5 Buchstaben mit einem Terminalprogramm 
an den UART.

Leider kommt immer nur der 1. Buchstaben an. Warum das?

Habe ich vielleicht ein Bit gesetzt das ich nicht sollte ?



UCSRA = 
(1<<RXC)|(1<<TXC)|(1<<UDRE)|(01<<FE)|(0<<DOR)|(0<<PE)|(0<<U2X)|(0<<MPCM) 
;
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)|(0 
<<RXB8)|(0<<TXB8);
UCSRC = 
(1<<URSEL)|(1<<URSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1 
)|(1<<UCSZ0);


Grüsse

Daniela
Gast #508399
Lesenswert?

> UCSRA =
> (1<<RXC)|(1<<TXC)|(1<<UDRE)|(01<<FE)|(0<<DOR)|(0<<PE)|(0<<U2X)|(0<<MPCM) ;
> UCSRB=(1<<RXCIE)|(1<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2)|(0 
<<RXB8)|(0<<TXB8);

Das sind aber ganz schön viele Bits,die du da in einem 8-Bit Register 
setzen möchtest ;) Welche Settings(Baudrate,Bits pro Zeichen,etc) 
möchtest du den gern haben?Schau dir vielleicht besser nochmal das 
Kapitel über die UART im Datenblatt an,da steht eigentlich alles prima 
beschrieben,inklusive der Kontrollbits für die Register UCSRA,UCSRB und 
UCSRC.
Gast #508421
Lesenswert?

Hallo zusammen

Danke ich habe wirklich zu viele gesetzt. Hier die Lösung:

UCSRA=(1<<RXC)|(1<<TXC)|(0<<UDRE)|(0<<FE)|(0<<DOR)|(0<<PE)|(0<<U2X)|(0<< 
MPCM);
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2)|(0 
<<RXB8)|(0<<TXB8);
UCSRC=(0<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(0< 
<UCSZ1)|(0<<UCSZ0);

UCSRA brauch ich gar nicht.

Gruss

Daniela
Gast #508438
Lesenswert?

Wir nähern uns zumindest ;)

Schau nochmal das Bit URSEL in UCSRC genauer an.Und dann wirst du 
sicherlich nicht nur 5 Bit pro Frame übertragen wollen (wird mit 
UCSZ0..UCSZ2 eingestellt,siehe Datenblatt).

Als nächstes wirst du nun auf das Problem stossen,das dein Programm in 
eine Interruptroutine springen will,sobald ein Zeichen empfangen oder 
gesendet wurde.Wenn du die entsprechenden Vektoren schon korrekt gesetzt 
hast,bist du schon fast fertig.Wenn nicht,wird dein Programm abstürzen.

Um die UART sauber zu initialisieren fehlen dir dann noch die korrekten 
Werte für das Baudraten-Register UBRL/UBRH.Damit legst du in 
Abhängigkeit vom CPU-Takt die Baudrate fest.Auf Seite 143 im Datenblatt 
steht die Formel zur Berechnung des Baudraten-Prescalers und wie man ihn 
ins entsprechende Register bekommt.

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