www.mikrocontroller.net

Forum: Compiler & IDEs Was für Probleme können in dieser UART Funktion auftreten?


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe hier die UART Funktion aus dem Tutorial, welche Probleme können 
bei der Verwendung auftreten?


    while (!(UCSRA & (1<<UDRE)))
    {
    }

    UDR = 'x';

Gut, mit der While Schleife blockiere ich das Programm. Aber können 
Daten verloren gehen wenn ich die Funktion mehrmals hintereinander 
aufrufe (z.B. String senden)?
Oder können Daten überschrieben werden?

Betriebsmodus wäre ohne jeglichen Interrupts.

Ist die Verwendung eines FIFO's deutlich besser und sinnvoller?

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist, mit welcher Häufigkeit pro Zeiteinheit (also 
Geschwindigkeit) die Daten erzeugt werden und wie diese Geschwindigkeit 
in Relation zur Baudrate steht.

Falls die Daten langsamer erzeugt als gesendet werden, ist diese 
einfache Funktion OK und es gehen keine Daten verloren.

Im umgekehrten Fall, wird zu beobachten sein, dass die Daten (falls das 
grundsätzlich der Fall ist) keinen Bezug zur Realzeit haben und immer 
weiter "hinterherhinken".

Falls aber die Daten nicht kontinuierlich so schnell erzeugt werden, 
also Pausen auftreten wäre ein FIFO nützlich. Den könnte man auch mit 
Polling aus der Hauptschleife betreiben (also abfragen ob er noch Daten 
enthält).

Langfristig (in Bezug auf die Entwicklung Deiner Fähigkeiten) wäre aber 
die Verwendung von Interrupts doch sinnvoll, da dies einiges einfacher 
macht.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, also es nicht so, dass ich keine Interrupts verwende. Ich verwende 
sie z.B. beim UART Rx...


Danke für deine Antwort!

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ok, also es nicht so, dass ich keine Interrupts verwende.
>Ich verwende sie z.B. beim UART Rx...

Nun. Ich wollte darauf hinaus, dass Du Interrupts mit Gewinn auch beim 
Senden verwenden kannst, gerade wenn Du einen Buffer verwendest. Den Du 
kannst einen Interrupt immer dann auslösen, wenn das Senderegister 
wieder leer ist.

Viel Erfolg.

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.