Einfach nur Zeichen senden

Gast #395313
Lesenswert?

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
Angehängte Dateien:
Gast #395314
Lesenswert?

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.
Gast #395315
Lesenswert?

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 :-(
Gast #395317
Lesenswert?

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.
Gast #395318
Lesenswert?

> 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.
Gast #395320
Lesenswert?

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.
Gast #395321
Lesenswert?

>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.
Gast #395323
Lesenswert?

@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...).

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