Forum: Mikrocontroller und Digitale Elektronik atxmega usart rs485: Anzeige Senden beendet


von Jsc J. (alderaan)


Lesenswert?

Hallo,
ich habe mit einem atxmega128A1 usart eine RS485 Schnittstelle 
realisiert.
Zur Umschaltung Senden / Empfangen wird für den Bustreiber das RTS 
Signal benötigt. Ich setze RTS auf High (senden) wenn das erste Byte in 
den USART Buffer geschrieben wird. Beim erfolgten Senden des letzten 
Bytes soll RTS wieder auf low, damit das Modul empfangsbereit ist.

Folgendes Problem tritt auf:
Der USART hat einen 3 Byte Buffer, in den die 3 ersten Bytes eines 
Strings sofort geschrieben werden ohne dass schon gesendet wird. Erst 
beim Schreiben des 4. Bytes beginnt das Senden. Wenn ich das letzte Byte 
meines Strings in den Sendebuffer geschoben habe, wird also das 
drittletzte Byte gerade rausgesendet. Wenn ich dann RTS schon auf low 
lege können die 3 letzen Bytes nicht vom Empfänger gesehen werden. Ich 
habe keine Möglichkeit herausgefunden zu erkennen, dass alle bytes aus 
dem Buffer rausgesendet wurden. Es wird lediglich per TXCIF flag 
angezeigt, dass das transmit shift register leer ist. Damit ist das Byte 
aber noch nicht gesendet.

"TXCIF is not set until the USART has completed transmitting all data in 
the transmit shift register and the transmit buffers are empty."

Die Frage ist nun: Wie erkennt man, dass das Senden beendet wurde?

Gruss
JSC

von slw (Gast)


Lesenswert?

für gewöhnlich gibt's ein Interrupt, wenn UART mit Senden fertig ist. In 
der ISR ziehst Du Dein STR Signal wieder auf low

von Spess53 (Gast)


Lesenswert?

Hi

>für gewöhnlich gibt's ein Interrupt, wenn UART mit Senden fertig ist. In
>der ISR ziehst Du Dein STR Signal wieder auf low

Alternativ kann man auch das TXCIF-Bit abfragen.

MfG Spess

von jsc (Gast)


Lesenswert?

Danke für die Tipps,

das pollen des TXCIF bits in der Senderoutine hat nicht funktioniert
aber im Interrupt hat's geklappt!

************************************************
ISR(USARTD0_TXC_vect)
{
  SetRTS(0);//RS485 Empfänger enabled
}
************************************************
Gruss
JSC

von spess53 (Gast)


Lesenswert?

Hi

>das pollen des TXCIF bits in der Senderoutine hat nicht funktioniert
>aber im Interrupt hat's geklappt!

Du must es natürlich auch manuell zurücksetzen (Schreiben einer 1).

MfG Spess

von Wolfgang K. (opendcc)


Lesenswert?

Hallo,

weiß hier einer zufällig, wann genau das TXCIF-Bit kommt: wenn der 
Frame fertig ist und das Stopbit beginnt oder am Ende des ersten 
Stopbits?

Und weil wir schon dabei sind: Wann genau liefert der Empfänger 
RX-Ready? In der Mitte des Stopbits?

Danke, Wolfgang

von Falk B. (falk)


Lesenswert?

@  Wolfgang K. (opendcc)

>weiß hier einer zufällig, wann genau das TXCIF-Bit kommt: wenn der
>Frame fertig ist und das Stopbit beginnt oder am Ende des ersten
>Stopbits?

Am Ende des Stop-Bits. Ist ja ein AVR und kein PIC ;-)

>Und weil wir schon dabei sind: Wann genau liefert der Empfänger
>RX-Ready? In der Mitte des Stopbits?

Entweder dann oder am Ende des Stop-Bits. Denn das muss ja noch für 
einen eventuellen Frame Error geprüft werden.

MFG
Falk

von Wolfgang K. (opendcc)


Lesenswert?

Hallo,

das ist gut - dann kann ich mit fliegenden Fahnen (sprich ISR_NAKED) den 
RS485 Treiber umschalten. Und ich den Umschalt-Pin auf einen VPORT 
mappe, dann komme in der ISR nur mit einem "cbi 0x10, 4" gefolgt von 
einem reti aus.

Gruß, Wolfgang

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.