@ Thorben B. (kingt)
> SN75176.png
Vorsicht! Wenn du RE beim Senden auf HIGH legst, geht der R AUsgang auf
Tristate! Da braucht man einen Pull-Up gegen VCC!
>Wenn ich vom Mikrocontroller einen String sende, kommt beim Empfänger
PC mit FT232, ja?
>manchmal das letzte Zeichen gar nicht an oder ein völlig falsches
>Zeichen wird angezeigt.
>Meine Sende-Funktion sieht so aus:
>void Sende_String(char *s)
>{
> _delay_us(1);// kurz warten bis der FT232R wieder auf Empfang ist
Kann man sich schenken, der FT232 geht wenige Mikrosekunden, nachdem er
das letzte Bit gesendet hat, auf Empfang.
> PORTD |= (1<<PD2);// RS485-Tranciever vom µC auf Senden schalten
> while (*s)
> {
> while (!(UCSRA & (1<<UDRE)));
> UDR = *s;
> s++;
> }
OK.
> while (!(UCSRA & (1<<TXC)));// Warte bis TXComplete
Ha, Fehler. TXC muss erstmal gelöscht werden, und zwar am Anfang deiner
Routine.
"Bit 6 – TXC: USART Transmit Complete
This flag bit is set when the entire frame in the Transmit Shift
Register has been shifted
out and there are no new data currently present in the transmit buffer
(UDR). The TXC
Flag bit is automatically cleared when a transmit complete interrupt is
executed, or it can
be cleared by writing a one to its bit location. The TXC Flag can
generate a Transmit
Complete interrupt (see description of the TXCIE bit)."
Versuchs mal so
1 | void Sende_String(char *s)
|
2 | {
|
3 | PORTD |= (1<<PD2); // RS485-Tranciever vom µC auf Senden schalten
|
4 | UCSRA |= (1<<TXC); // TXC löschen
|
5 |
|
6 | while (*s)
|
7 | {
|
8 | while (!(UCSRA & (1<<UDRE)));
|
9 | UDR = *s;
|
10 |
|
11 | s++;
|
12 | }
|
13 |
|
14 | while (!(UCSRA & (1<<TXC)));// Warte bis TXComplete
|
15 | PORTD &= ~(1<<PD2); // RS485-Tranciever vom µC wieder auf Empfang schalten
|
16 | }
|
>Ohne Wartezeit kommt das letzte Zeichen immer falsch an.
Logisch, TXC ist schon gesetzt, von der letzten Übertragung.
> Wähle ich die
>Wartezeit am Ende der Funktion zu groß, kommt das letzte Zeichen auch
>immer falsch an und wird manchmal auch noch zwei- dreimal wiederholt.
Kann nicht sein.
>Die while-Schleife mit TXC hat komischerweise keine Auswirkung auf das
>Ergebnis.
Logisch, siehe oben.
MfG
Falk