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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.