Hallo,
ich verwende einen ATmega640 und versende über USART0 mit 115kb einen
Befehl. Kommunikation ist halb-duplex. Anschließend warte ich auf die
Antwort. Ich polle hier mit Absicht.
Aber ich habe ein Verständnisproblem:
Laut Datenblatt wird TXCn high wenn das Transmit Shift Register den
Frame
komplett rausgeschoben hat und UDR0 kein neues Zeichen mehr hat.
Also warte ich im Quellcode, bis TXC0 high wird. Bei (1) im Code.
Jetzt sollte ich eigentlich den RS485 Treiber von senden auf empfangen
umschalten können. Mache ich dies sofort, fehlen mir einige Bits, da
zu diesem Zeitpunkt noch nicht alle Bits verschickt wurden. Kann ich
wunderschön im Logikanalyser sehen.
Ok. Ich kann eine entsprechende Wartezeit einbauen ( siehe (2) ). Dann
läufst wieder.
Aber ich verstehe es trotzdem nicht.
Kann mir jemand helfen ? Danke. Pepe.
UCSR0B = (1<<TXEN0); // Enable nur Transmitter
iPointer = 0;
do
{
C = mOutBufferSF[iPointer];
UDR0 = C;
while ((UCSR0A & (1<<UDRE0)) == 0) // Warten solange UDR voll ist
{
wdt_reset();
}
iPointer++;
} while ((uint8_t) C > 10); // Bis EOC verschickt wurde
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
while ((UCSR0A & (1<<TXC0)) == 0) // Warten bis Zeichen raus sind
{
wdt_reset(); (1) Warte bis TXC0 high ist
}
// Transmit ist durch, kompletter Befehl ist raus
(2) Hier wurde noch einige Bits nicht verschickt
_delay_us(Wartezeit damit das letzte Zeichen raus geht)
ioDisableTransmitter(); // RS485 Transmitter abschalten
ioEnableReceiver(); // Receiver aktivieren
... Warte auf Antwort ...
Hi Und wie ist die genaue Frage? TXC wird gesetzt wenn ein Byte gesendet wurde und kein Byte mehr im Puffer vorhanden ist. UDR sagt lediglich, das der Transmitter ein Byte aufnehmen kann. MfG Spess
Ich würde auf jeden Fall erst mal das TXC Bit vor der Kommunikation löschen. Bedenke: Das Bit wird nur dann gelöscht wenn * ein entsprechender Interrupt aufgerufen wird (ist bei dir nicht der Fall) * du selbst es löscht (ist in dem Codeausschnitt auch nicht der Fall) d.h nach der allerersten Übertragung stimmt das TXC Bit nicht mehr, weil es nie zurückgesetzt wurde. Und dann gibt es noch den Fall, dass deine Kommunikationsschleife etwas zu langsam ist und daher zwischendruch immer wieder mal ein TXC auftreten kann. D.h. eigentlich bist du nur dann auf der sicheren Seite, wenn du VOR dem Einschreiben des letzten Zeichens das TXC löscht.
Hi
>Warum kommt TXC0 schon bevor das letzte Byte komplett raus ist ?
Wenn du den Transmitter schnell genug fütterst nicht. Allerdings musst
du das Bit vor der Übertragung manuell zurücksetzen (Schreiben einer 1
) wenn du keinen Interrupt benutzt.
MfG Spess
Karl Heinz Buchegger schrieb: > D.h. eigentlich bist du nur dann auf der sicheren Seite, > wenn du VOR dem Einschreiben des letzten Zeichens das TXC löscht. Na ja, so richtig auf der sicheren Seite ist man nur, wenn man es danach macht. Und natürlich müssen beide Schritte (UDR beschreiben, TXC löschen) in eine Interruptsperre.
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.