Hallo Leute, ich versuch lediglich meinem ATMega128 ein Zeichen zu entlocken, das ich dann auf dem Windows-HyperTerminal empfangen will. Doch leider macht er keinen Mucks. Könnt ihr euch bitte mal meine Einstellungen anschauen, ich habe mitlerweile sooft drüber geschaut... Die Verbindung soll über RS485 laufen, dem Baustein muss ich lediglich sagen ober senden oder empfangen soll. Das mach ich indem ich den PE2 setze (senden). Aber der 128'er sendet ja nicht (mit Oszi überprüft), also is das erst mal noch nebensache. Mein µC läuft mom. noch mit 1MHz internen Takt. Und eingestellt sollte der USART auf Baud 9600, Parität keine, Stoppbit 1, Flussst. keine
Hast du da nicht was vergessen?
1 | while ( ! ( UCSR0A & ( 1 << UDRE0 ) ) ) |
2 | |
3 | UDR0 = 'x'; |
Das bedeutet, du versuchst, genau solange in einer Schleife zu senden, wie die Schnittstelle nicht bereit dazu ist.
Du hast vollkommen Recht!!! Im Datenblatt des 128'er steht drin das der Bereit ist wenn des UDRE 1 ist und nicht (wie angenommen) bei 0. Zwei Dinge: Erstens, ich hab die Anweisung while... vom AVR-GCC Tutorial UART Wie kann ich das ändern? Will ja nicht das noch andere Anfänger drüberfallen. Zweitens, nun macht er wie verrückt (wieder mit Oszi nachgeprüft). Auch nach dem 485'er Baustein. --> Signal ist also auf der Leitung. An der Gegenstelle hängt wieder ein 485-USB Wandler. Wenn ich nun mein HyperTerminal anwerf und die selben Übertragungswerte einstelle müsste er mir doch eigentlich den Bildschirm mit lauter x'en zumüllen. Tut aber gar nichts :-(
Mein Fehler, da war jetzt noch ne Verbindng offen. Er rödelt jetzt wie verrückt!!! Bleibt nur noch die Sache mit der Verbesserung
Du benutzt den intenen RC-Oszillator. Der ist nicht besonders frequenzstabil. Würdest du dann noch einen Baudratenquarz (z.B. 3,686MHz) benutzen, hättest du keine Probleme mit der momentan abweichenden Baudarate deines Controllers.
> Erstens, ich hab die Anweisung while... vom AVR-GCC Tutorial / > UART / Wie kann ich das ändern? Hast du nicht. Dein Code:
1 | while ( ! ( UCSR0A & ( 1 << UDRE0 ) ) ) |
Der vom Tutorial:
1 | while (!(UCSRA & (1<<UDRE))); |
Da ist ein kleiner, aber sehr wichtiger Unterschied.
Es ist IMHO ein Wiki; da darf "jeder" dran rumändern. (Rechts neben dem Beitrag steht meist "bearbeiten")
Um's nochmal klar zu machen (weil es auch ein paar kleine und unwichtige Unterschiede gibt): Es geht um das Semikolon dahinter. Wenn man das vergißt, wird die folgende Anweisung innerhalb der Schleife ausgeführt, was natürlich nicht sein soll. @Rahul: Nur so am Rande: IMHO (in my humble opinion - meiner bescheidenen Meinung nach) paßt hier nicht. Besser hätte AFAIK (as far as I know - soweit ich weiß) gepaßt.
>Da ist ein kleiner, aber sehr wichtiger Unterschied.
Habs bemerkt! Danke für den Schubs
while (!(UCSRA & (1<<UDRE)));
warte solange UDRE noch 0 ist --> dann erst Schreiben
nicht wie bei mir in der Schleife.
Drum schreib ich sowas so: while (!(UCSRA & (1<<UDRE))) ; Da sticht der ';' stärker raus und damit auch das der Schleifenkörper leer ist und es nur um die Bedingung an sich geht.
@Rolf: Danke für den Hinweis. Ich bin in dieser "Sprache" noch nicht so weit, und "IMHO" konnte ich mir bis jetzt am besten merken. @Screibweise: Ich schreibe es so: while (!(UCSRA & (1<<UDRE))); und lasse die nächste Zeile dann frei. Wenn sich die Schleife auf die folgenden Anweisungen bezieht, folgt unmittelbar in der nächsten Zeilte eine "{" oder eine einzelne, eingerückte Anweisung. Das liegt vermutlich daran, dass ich Quellcode gerne mit dem "Finger" lese (das wird einem in der Grundschule eigentlich abgewöhnt...).
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.