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
Violation of Rule #1 (Give Complete Source Code) detected! Thread will be eliminated in 24 hours!
> 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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.