Hi Sternthaler,
nachdem Dein Vorname nur "... Schall und Rauch" ist, (Dein Spruch!) muss ich Dir auch noch verkünden, dass Du mit
auch noch FALSCH liegst!) (Oh, du dickes Ei!)Unser "while ( ! (UCSRA & 0x40)) ;"-Code dreht ja nun alles auf den Kopf. Das Bit bleibt also nicht dauerhaft auf 1, sondern auf 0. Denn nur dann kommen wir ja wieder aus dem while herraus, wenn es auf 0 gegangen ist.
Deutsche Spragge, schwere Spragge! English noch viel schwerer!)
... hatten wir schon: (und schon wieder ein "deja vu-Erlebnis"!)* Bit 6 - TXC: USART Transmit Complete
This flag bit is set when the entire frame in the Transmit Shift Register has been shifted out and there are no new data currently present in the transmit buffer (UDR).
Und da steht doch sinngemäß drin:
TXC = 1, wenn
* 1. das gesamte "Versand-Paket" (einschließlich "Start-", "Stopp-" und evtl. "Paritätsbit") hinausgeschoben (=versandt) wurde,
und
* 2. sich keine (weiteren/) neuen Daten im Transmit-Speicher (=UDR) befinden!.... ebenso => hier unwichtig!The TXC Flag bit is automatically cleared when a transmit complete interrupt is executed,
Bitte beachten "it can"!or it can be cleared by writing a one to its bit location.
Dass wir das _zur_Sicherheit_ machen, hatte ich ja auch schon geschrieben!
Na ja, auch HIER unwichtig!The TXC Flag can generate a Transmit Complete interrupt (see description of the TXCIE bit).
(Und das Alles steht bei mir auf Seite 154!
Na ja, es war schon ziemlich spät!)
Umgekehrt! "TXC auf 1, wenn alles geschoben ..." und der Speicher UDR leer ist.!- AVR setzt TXC auf 0 wenn alles geschoben ist.
- unser "while ( ! ...) sieht dies und while bricht ab
Ich würde, damit alle glücklich sind, alles so lassen, wie es ist! Bis auf
1. m.a.r.v.i.n's #define => ist m.M. nach 'ne gute Ergänzung!
2. Doppel-FOR-Schleife weg => braucht man nicht!
3. Bei TX ein: nicht das ganze Byte setzen "UCSRB = 0x10; //enable receiver", sondern _etwas_besser_ nur das entspechende Bit: "UCSRB |= 0x10; //enable receiver"
... und zum Ausschalten: "UCSRB &= ~0x10; //disable receiver" (dto. clear'en)
4. analog dazu das Gleiche beim Empfänger!
Jeder, der ein wenig "fortgeschrittener" ist, kann sich ja die vorgefertigten Funktionen nach Gusto anpassen!
Hi @damaltor!
Glaube ich nicht, dass es zu Null wird, sondern es bleibt 1. (Das mit dem "cleared" ist m.M. nach hier etwas verwirrend ausgedrückt!)TXC WIRD 0, wenn man es durch schreiben einer 1 (!) cleared.
Ich wette, dass erst der Schreib-Zugriff auf UDR 'ne Null draus macht! (Denn erst dann fängt der Sendeprozess an!)
So, ich muss jetzt weiterlernen, in dem ich Eure Programme analysiere!!)
cu Helmut
PS: Schade, dass ich noch keine Antwort auf meine Frage nach dem Zweck der Variablen "tot_count" in Go() bekommen habe! (Vielleicht kann mir hier jemand helfen?)
Lesezeichen