Hi,
ich verwende hier RS-232 als Bus, habe also Sender und Empfänger am UART
miteinander jeweils verbunden und alle AVR-UARTs untereinander dann mit
einer Busleitung.
Die Kommunikation erfolgt unter den 3 AVRs ganz einfach. AVR1 sendet ein
Paket los, das dann von beiden anderen Empfangen wird. Diese werten das
dann aus. Danach ist AVR2 dran und sendet ein Paket auf den Bus während
AVR1 und AVR3 zuhören, das gleiche Spiel macht dann AVR3.
Nun habe ich testweise mal nur AVR1 und AVR2 am Bus hängen.
AVR1 sendet nun ein Paket, die Senderoutine sieht folgendermaßen aus:
1 | void uart_send(uint8_t byte)
|
2 | {
|
3 | UCSRB &= ~(1 << RXEN); // Empfnger ausschalten
|
4 | UCSRB |= (1 << TXEN); // Sender einschalten
|
5 |
|
6 | _delay_us(100); // Warten, Bus auf High damit Start-Bit korrekt erkannt wird
|
7 |
|
8 | UDR = byte;
|
9 |
|
10 | loop_until_bit_is_set(UCSRA, TXC);
|
11 | UCSRA |= (1 << TXC);
|
12 |
|
13 | UCSRB &= ~(1 << TXEN); // Sender wieder ausschalten
|
14 | UCSRB |= (1 << RXEN); // Empfnger wieder einschalten
|
15 | }
|
Ich denke die ist selbst erklärend. Dadurch, dass der Sender am Ende der
Routine wieder abgeschaltet wird habe ich am Bus nach dem Stop-Bit auch
wieder eine fallende Flanke. AVR2, der währenddessen die ganze Zeit am
Bus lauscht erkennt somit fälschlicherweise zwei eingehende Bytes. Erst
das echte, tatsächlich gesendete, dessen Empfang man durchs resetten des
RXC-Flag quittieren muss, und dann noch das fiktive Byte. Kann man den
Empfang dieses fiktiven Bytes irgendwie verhindern? AVR2 muss nämlich
warten, ehe er selbst dann ein neues Byte senden kann.
Ebenso verhält sich das, wenn AVR2 dann selbst ein Byte sendet. Der
Empfänger wird zwar abgeschaltet aber wenn er wieder eingeschaltet wird
liegt der Bus bereits auf Low-potenzial. Der Empfänger sieht diesen
Low-Zustand beim Einschalten fälschlicherweise als fallende Flanke an
und denkt, es würde gerade wieder ein Byte gesendet werden, welches man
dann am Ende wieder durch resetten des RCX-Flags quittieren muss. Etwas
nervig. Kann man das irgendwie verhindern?
An jedem Busteilnehmer hängt an der Busleitung noch ein niederomiger
Pulldown, damit sich beim Senden ständig Stromschleifen ausbilden um die
Übertragung störsicher zu machen. Eventuell könnte ich das ganze auch
jeweils gegen VCC schalten?
lg PoWl