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.