Forum: Mikrocontroller und Digitale Elektronik Einfach nur Zeichen senden


von Eddi (Gast)


Angehängte Dateien:

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

von Rolf Magnus (Gast)


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.

von Eddi (Gast)


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 :-(

von Eddi (Gast)


Lesenswert?

Mein Fehler, da war jetzt noch ne Verbindng offen. Er rödelt jetzt wie
verrückt!!! Bleibt nur noch die Sache mit der Verbesserung

von inoffizieller WM-Rahul (Gast)


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.

von Rolf Magnus (Gast)


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.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Es ist IMHO ein Wiki; da darf "jeder" dran rumändern. (Rechts neben
dem Beitrag steht meist "bearbeiten")

von Rolf Magnus (Gast)


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.

von Eddi (Gast)


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.

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von inoffizieller WM-Rahul (Gast)


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

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.