Hallo Leute! Ich habe das Datenblatt studiert und habe mir Gedanken zu Interrupt gesteuerten rs232 Kommunikation wie folgt gemacht: - udre is set after reset - udre can only be cleared if udr is written and only then (exept reset) - udre is set within the transmisson from udr to the shift register. - udr empty interrupt is executed when udre is high and udr tranmitted to the shift register. Interruptgesteuerte Übertragung kann daher nur mit einem beschreiben von UDR erfolgen. sehe ich das richtig?
Hi MB, M. B. schrieb: > - udr empty interrupt is executed when udre is high and udr tranmitted > to the shift register. > > Interruptgesteuerte Übertragung kann daher nur mit einem beschreiben von > UDR erfolgen. > > sehe ich das richtig? Komische Fragestellung. Überhaupt geht eine Übertragung (uC->Gegenstelle) per UART nur durch Schreiben auf UDR (UART Data Register). Wenn man etwas empfangen möchte, muss man das UDR dagegen lesen. Der entsprechende Interrupt geht auf Vektor 8 (s. Seite 18 im Datenblatt, Interrupt Definition ist "UART, RX complete". Siehe auch Seite 45. Zitat: Bit 7 – RXC: UART Receive Complete<br> This bit is set (one) when a received character is transferred from the Receiver Shift Register to UDR. The bit is set regardless of any detected framing errors. When the RXCIE bit in UCR is set, the UART Receive Complete interrupt will be executed when RXC is set (one).
Korrekt. Wie kommt man in den Interrupt zum ersten Schreiben in UDR?
Wenn UDR leer ist, dann wird sobald der UDRE Interrupt aktiviert wird in die entsprechende ISR gesprungen. Globales Interruptflag muss natürlich auch gesetzt sein. Um UART per Interrupts zu realisieren schreibt man also zuerst die zu übertragenen Daten in einen Puffer und speichert irgendwie die Anzahl der im Puffer befindlichen Bytes. Wenn man dann senden möchte, so aktiviert man den UDRE Interrupt und holt in der ISR immer ein Byte aus dem Puffer und schickts per UART raus (ins UDR Register schreiben). Die UDRE ISR überprüft immer, ob der Puffer noch nicht leer ist bzw ob das letzte Byte ausgelesen wurde und deaktiviert dann den UDRE Interrupt. Hoffe das war verständlich.
Der aktivierte UDRIE wird nur ausgelöst wenn UDRE high, also muss zuerst UDR geschrieben werden. Das hinkt. Ich hätte gerne: Zeichen zum Senden verfügbar (weil zb RXCIE ausgelöst)=> springe in ISR (uart send, udr empty oder sonstwas). UDRE ist read only.
Ich würde den Absatz auf Seite 43 > When the UDRIE bit in UCR is set, the UART Transmit Complete interrupt > to be executed as long as UDRE is set. > UDRE is cleared by writing UDR. When interrupt-driven data > transmittal is used, the UART Data Register Empty Interrupt > routine must write UDR in order to clear UDRE, otherwise a new > interrupt will occur once the interrupt routine terminates. > UDRE is set (one) during reset to indicate that the > transmitter is ready. so interpretieren, dass der Interrupt sofort ausgelöst wird, sobald du ihn mit UDRIE freischaltest. Das Datenregister ist dann noch leer, somit ist gemäß dem letzten Satz UDRE gesetzt -> Interrupt
Genau, ich springe in ISR sende ein char, UDRE geht auf low. Und dann kann ich keinen UDR empty Interrupt mehr erzeugen.
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.