www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: Pfleurys UART, senden & empfangen gleichzeitig?


Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ist es eigentlich problematisch, mit der UART ein Byte zu senden und 
dieses sofort wieder einzulesen (Verbindung RX-TX), mithilfe von Peter 
Fleurys UART-Code? Ich denke da an die Interrupts, die ja eigenltich 
gleichzeitig auftreten, Byte gesendet fertig (RX complete, 
SIG_USARTn_RECV) und Byte empfangen (TX complete, SIG_USARTn_TRANS).

Hintergrund ist der, daß per Hardware die RxD und TxD Leitungen 
verbunden sind (K-Line). Der Bus, der damit bedient werden soll, ist 
Multimaster fähig und somit müssen Datenkollisionen erkannt werden. Also 
jedes gesendete Byte muß mit dem gelesenen Byte übereinstimmen. Ich 
wollte ursprünglich dies mit Peter Fleurys UART-Code machen, hatte aber 
bisher immer das Problem, daß die eingelesenen Daten nie mit den 
gesendeten passten. Es war immer ein Versatz von ein paar Bytes drin, 
also das gesendete Byte habe ich einige Bytes später  einlesen können. 
Ein Bedienungsfgehler meinerseits oder ist das Teil da nicht für 
ausgelegt?

Der Controller dazu ist übrigens ein ATmega162, wegen 2 UART on Board, 
UART0 mit 115200 Baud und UART1 mit 9600.

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hegy,

Du schlägst Dir mit Sachen die Nacht um die Ohren, ... :-)
Probier mal, beide Uarts mit gleicher Baudrate einzustellen - ich denke, 
dass da bereits der Wurm begraben ist. (Fehlinterpretation durch falsche 
Rate)
Ebenfalls wichtig: gleiche Start/Länge/Stop/Parity, etc.

Gruß
Helmut

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich rate einfach mal.

die Bibliothek hat ja sende und Empfangsbuffer, bei dir werden die Daten 
also erstmal in den Buffer geschrieben und du verarbeitest sie dann 
später.

Hardwareseitig existiert ja nur ein 1 Byte Buffer, wenn du die Daten 
also auf der Leitung nicht verzögerst kannst du die Bytes nicht 
verzögert empfangen. halt nur über den software Empfangsbuffer der 
Bibliothek.

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beiden UART müssen mit unterschiedlichen Baudraten laufen, weil der 
Controller soll u.a. als "Durchreiche" dienen, also Daten vom Bus 
aufnehmen, zwischenspeichern und bei Verlangen weitersenden, aber eben 
mit anderer Baudrate. Das liegt daran, daß der zwischen zwei Bussystemen 
kommunikationsmäßig "eingeklemmt" ist.

Die Bibliothek hat einen Ringspeicher und ich vermute mal, daß da auch 
der Versatz herkommt. Generell, ob verzögert gesendet oder nicht, sobald 
ein Byte raus ist auf der 9600 Baud Leitung (UART1, 2. serielle 
Schnitte), muß das wieder eingelesen werden. Das wird es auch, dadurch 
daß Rx und Tx per HW-Umsetzer, derzeit ein K-Line IC, später RS485, 
zusammenhängen und der Receive Interrupt eingeschaltet ist. Und genau 
dann habe ich ja den Fall, daß 2 Interrupts gleichzeitig auftreten oder 
nicht?

Autor: Seth (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I(ch hab mal irgendwo gehoert, dass Kollisieonserkennung gerade nicht 
moeglich ist, da die Treiber zu niederohmig sind und man auch bei einer 
Kollision , das was man sendet zurueckliest. Der Tx und der Rx interrupt 
sind nicht gleichzeitig. Dies, da der Transmit holding register empty 
sofort kommt, da bei Einzelbyte senden das Byte Transmit holding 
register gerade ins Schieberregister durchfaellt. Auf der anderen Seite, 
kommt der Rx Interrupt erst wenn das ganze Byte gelesen wurde. 
Dazwischen sind 10 bit-Zeiten vergangen.

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das empfangene Byte wird wohl das Byte sein, das gesendet worden ist. 
Ich glaube nicht, daß durch Niederohmigkeiten irgendwas nicht eingelesen 
werden kann, da die anderen Busteilnehmer ja mithören und ggf. auch 
diese Daten verwerten. Also muß gesendet = empfangen sein, sofern keine 
Kollision entstanden ist.

Aber das mit dem TX Register Empty Interrupt (nicht TX Ready Int.) und 
den RX Ready (ich nenn das jetzt mal so) wäre eine Möglichkeit, die ich 
auch in Betracht gezogen habe, allerdings müßte dann der Code 
umgekrempelt werden.

Zum Bus nochmal ein Nachtrag: Er ist aufgebaut wie RS485, aber 
Unterschiede gibt es bzgl. der elektr. Werte von den Pull-Up und -Down 
Widerständen und dem fehlenden Abschlußwiderstand. Ganz genau, es ist 
ein J1708 Bus, wem das was sagt.

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.