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
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
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
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
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
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
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.