www.mikrocontroller.net

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


Autor: Jsc Jsc (alderaan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: slw (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jsc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang K. (opendcc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang K. (opendcc)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.