rs232 interrupt senden at90s2313

OP #1581402
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?
#1581422
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).
#1581457
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.
#1581472
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren