mikrocontroller.net

Forum: Compiler & IDEs UART Synchron Empfang Mega128


Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem mit der Kommunikation zweier Atmega128 über UART1
(Unidirektional). Ich kann die Daten senden, aber nicht fehlerfrei
empfangen. Die UART ist syncron mit einer Datenrate von 115200 Bit/s
initialisiert. Die Atmegas laufen mit einem externen Quarz mit 13.824
MHz.

über
uint8_t Usart_Rx(void)
{
    while (!(UCSR1A & (1<<RXC)));
    return UDR1;
}

frage ich ab ob ein Zeichen verfügbar ist, ist das der Fall wird das
Zeichen, was im diesem Fall ein 8 Bitwort ist verglichen und bei
übereinstimmung ein Portpin gesetzt.

In der Main rufe ich die Funktion
Usart_Rx(); auf und schreibe das Wort dann in data:
data = UDR1;

Das Programm muss in der Whileschleife hängen, da vermutlich RXC nicht
gesetzt wird. deaktiviere ich den Funktionsaufruf Usart_RX(); wird das
8 Bitwort empfangen und der Port gesetzt, allerdings nur sporadisch
also mit hoher Fehlerrate.
gesendet werden mehrere das 8 Bit worte permanent in einer
Endlosschleife alle par
µs.
Ich hoffe Ihr könnt mir weiterhelfen.
MfG Paul

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. ich würde das Interruptgesteuert realisieren.
2. Du liest in der Usart_Rx()-Routine schon UDR und weist danach den
Inhalt von 'UDR1' 'data' zu. D.h.: Du liest zwei mal.
data = Usart_Rx();

Sollte dann schon ännahernd das sein, was Du willst.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...na huch, was passiert denn hier?

data = Usart_Rx();

Sollte da in Code-Tags stehen.

Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich schon geändert, das ist aber nicht das problem. Das Problem
liegt daran, das der Empfäger nur das Datenwort erkennt, wenn er zu
einem bestimmten Zeitpunkt angeschaltet wird, sonst nicht. Irgendwie
passt das mit dem Handling der UART nicht.
Kann man eigendlich Start und Stopbit der UART deaktivieren?

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck Dir einfach mal die UART-Lib von Peter Fleury an...

Autor: Paul Momsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die hilfr mir nicht weiter, ich möchte keine Zeichen senden oder so. Ich
möchte dem Empfänger zu jeder Zeit zuschalten können und er soll ein 8
Bitwort als Startwort erkennen und erst dann die restlichen Daten
empfangen. Das Startwort frage ich mit einer if Anweisung ab, aber wie
gesagt, das funktioniert nur sporadisch wenn es zufällig nach dem
Einschalten empfangen wird.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann...

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.