Forum: Compiler & IDEs Warum empfängt mein UART immer nur 1 Zeichen?


von Daniela (Gast)


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

von Stefan (Gast)


Lesenswert?

Violation of Rule #1 (Give Complete Source Code) detected!
Thread will be eliminated in 24 hours!

von Ronny (Gast)


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.

von holger (Gast)


Lesenswert?

Hi,

>>Habe ich vielleicht ein Bit gesetzt das ich nicht sollte ?

ja, RXCIE und TXCIE solltest du auf 0 setzen wenn du
keine Interrupts zum empfangen/senden benutzt.


Gruss
 Holger

von Daniela (Gast)


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

von Ronny (Gast)


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.

von Daniela (Gast)


Lesenswert?

Danke Ronny

Komischerweise läuft es so wie ich es eingestellt habe.
Werde aber denoch die sache berichtigen.

Gruss

Daniela

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.