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