Forum: Mikrocontroller und Digitale Elektronik rs232 interrupt senden at90s2313


von M. B. (twin_mbj)


Lesenswert?

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?

von Torsten L. (bluehorn)


Lesenswert?

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

von mb (Gast)


Lesenswert?

Korrekt. Wie kommt man in den Interrupt zum ersten Schreiben in UDR?

von Christopher G. (cbg)


Lesenswert?

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.

von M. B. (twin_mbj)


Lesenswert?

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.

von Uwe .. (uwegw)


Lesenswert?

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

von M. B. (twin_mbj)


Lesenswert?

Genau, ich springe in ISR sende ein char, UDRE geht auf low. Und dann 
kann ich keinen UDR empty Interrupt mehr erzeugen.

von Christopher G. (cbg)


Lesenswert?

Probiers einfach mal aus und schau was passiert.

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
Noch kein Account? Hier anmelden.