Gast
#2727608
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 ...