void
txoff() {
// wait for bytes still to go
loop_until_bit_is_set(UCSRA, TXC);
PORTD &= ~_BV(PD2); // disable transmitter
UCSRB |= _BV(TXEN); /* rx enable */
PORTC |= _BV(PC3); // disable txled
}
Obige Funktion sollte eigendlich den Ausgangstreiber für eine
Halbduplex RS485 Anwendung abschalten, sobald das letzte Zeichen
verschickt wurde.
Allerdings kommt das Programm scheinbar nicht über die Warteschleife
hinweg.
Unten sind noch mal die wichtige Funktionen für die Ausgabe.
inline void
sio_putchar(uint8_t c)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
}
#define SYSCLK 7372800UL
#define BPS_RATE 9600UL
void
ioinit() {
/* setup UART */
UCSRB = _BV(TXEN) | _BV(RXEN); /* rx/tx enable */
UBRRL = (SYSCLK / (16 * BPS_RATE)) - 1; /* Bd */
PORTD &= ~_BV(PD2); // disable transmitter
DDRD |= _BV(PD2); // set txen as output
...
}
void
txon() {
PORTD |= _BV(PD2); // enable transmitter
UCSRB &= ~_BV(TXEN); /* rx disable */
PORTC &= ~_BV(PC3); // enable txled
}
Jetzt habe ich die Hoffnung, daß ein anderes Augenpaar meinen Fehler sieht. Evtl mache ich ja im Umgang mit dem TXC bit etwas falsch und habe irgendwas wichtiges in der Doku überlesen.
Ich habe gerade den Fehler gefunden. Anstellen den Empfänger vor der Übertragung (zur Echounterdrückung) zu deaktivieren habe ich den Sender abgeschaltet. Dann können die Zeichen natürlich nicht raus.
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.