mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfach nur Zeichen senden


Autor: Eddi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du da nicht was vergessen?
while ( ! ( UCSR0A & ( 1 << UDRE0 ) ) )
    
UDR0 = 'x';

Das bedeutet, du versuchst, genau solange in einer Schleife zu senden,
wie die Schnittstelle nicht bereit dazu ist.

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Erstens, ich hab die Anweisung while... vom AVR-GCC Tutorial /
> UART /  Wie kann ich das ändern?

Hast du nicht. Dein Code:
while ( ! ( UCSR0A & ( 1 << UDRE0 ) ) )

Der vom Tutorial:
while (!(UCSRA & (1<<UDRE)));

Da ist ein kleiner, aber sehr wichtiger Unterschied.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Eddi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.