
Zitat von
dgrobot
Code:
if (rx_aktiv) rx_aktiv-- ;
Code:
if (tx_aktiv) if (! --tx_aktiv) UCSRB |= ( 1 << RXEN ) ; // enable receiver interrupt + receiver
Hier, eine Zeile höher hat das if dann doch einen Sinn.
Du hast ja recht, da brauchts das nicht.
Aber die Zeile hatte ich kopiert und angepasst. (bin nicht nur denkfaul sondern auch schreibfaul!)
Arexx-Henk: Ich bin jetzt am überlegen wie du das meint ????
Wenn du eine Lösung ohne die Umschaltverzögerung kennst, dann baue es doch mal ein.
Es ist ja auch noch das Problem, das sich durch die gegenseitige Störung, nur der Transmitter oder der Receiver arbeiten darf.
Warum das alles ?
Ich möchte mit einem anderen ASURO oder Roboter und mit einem PC Daten austauschen können, ohne den eigentlichen Programmablauf zu unterbrechen. Da kann es nur von Vorteil sein, wenn der Datenaustausch per Interrupt und ausreichendem Puffer ablaufen kann.
https://www.roboternetz.de/phpBB2/vi...=176551#176551
Ich habe aber gerade einen ernsten Fehler gefunden für den ich noch keinen Ursache und Lösung gefunden habe.
Durch Zufall habe ich mal auf eine IR-Fernbedienung gedrückt - und das Testprogramm bleibt hängen ? ! ? ! ?
Edit: Habe den Fehler gefunden.
Ein ungültiges Zeichen muss von der UART abgeholt werden. Sonst wird der Interrupt ja nicht gelöscht ? ! ?
Code:
SIGNAL(SIG_UART_RECV)
{
int head_next;
head_next = rx_buf_head;
if ((UCSRA & ((1 << FE) | (1 << DOR) | (1 << PE ))) == 0)
{
rx_buf[head_next++] = UDR; // Das Zeichen im Buffer speichern
if (head_next >= UART_RX_BUF_LEN) head_next = 0; // Buffergrenze beachten
if (head_next != rx_buf_tail) rx_buf_head = head_next; // Überlauf ? noch Platz im Buffer ?
}
else head_next = UDR;
rx_aktiv = 5; // Transmitter erst einschalten wenn die Wartezeit abgelaufen ist.
}
Lesezeichen