Hallo
Das Problem mit dem Echo hätte ich auch genannt, allerdings wußte ich das mit dem UCSRB-Register nicht:
(aus asuro.c V2.3)Code:void SerWrite(unsigned char *data,unsigned char length) { unsigned char i = 0; UCSRB = 0x08; // enable transmitter while (length > 0) { if (UCSRA & 0x20) { // wait for empty transmit buffer UDR = data[i++]; length --; } } while (!(UCSRA & 0x40)); for (i = 0; i < 0xFE; i++) for(length = 0; length < 0xFE; length++); } void SerRead(unsigned char *data, unsigned char length,unsigned int timeout) { unsigned char i = 0; unsigned int time = 0; UCSRB = 0x10; // enable receiver /* non blocking */ if (timeout != 0) { while (i < length && time++ < timeout) { if (UCSRA & 0x80) { data[i++] = UDR; time = 0; } } if (time > timeout) data[0] = 'T'; } /* blocking */ else { while (i < length) { if (UCSRA & 0x80) data[i++] = UDR; } } }
Die Beschreibung der UCSRB-Bits aus dem Datenblatt:
Zuerst Bit3: Wenn gesetzt werden die normalen Porteinstellungen (Eingabe/Ausgabe) überschrieben. Wenn nicht gesetzt, werden schon gestartete Ausgaben nicht beeinflußt und nach dem Senden wird der Port nicht mehr überschrieben(, falls er von anderen Anwendung verwendet wird)• Bit 4 – RXEN: Receiver Enable
Writing this bit to one enables the USART Receiver. The Receiver will override normal
port operation for the RxD pin when enabled. Disabling the Receiver will flush the
receive buffer invalidating the FE, DOR and PE Flags.
• Bit 3 – TXEN: Transmitter Enable
Writing this bit to one enables the USART Transmitter. The Transmitter will override normal
port operation for the TxD pin when enabled. The disabling of the Transmitter
(writing TXEN to zero) will not become effective until ongoing and pending transmissions
are completed (i.e., when the Transmit Shift Register and Transmit Buffer Register
do not contain data to be transmitted). When disabled, the Transmitter will no longer
override the TxD port.
•
Bit4: Der Empfänger überschreibt die normalen Porteinstellungen, wenn er enabled ist.
Ich habe mit Absicht die Stellen mit "enables/disables the USART Transmitter" weggelassen, weil ich mich frage, ob der UART nicht trotzdem aktiv ist solange die Anwendung nicht an den Ports "rumfummelt". Dann könnte man nämlich doch beides gleichzeitig machen und z.B. den Receiver-Interrupt abfangen. Das könnte man mal testen, muss man aber nicht:
Ich würde selbstständige Sende- und Empfangsfunktionen schreiben (auf Basis der Lib-Funktionen) und das mögliche eigene Echo wegprüfen (if receive==send) . Nur ein Ansatz, noch nicht versucht oder geprüft.
Gruß
mic
Lesezeichen