Hi Sternthaler,
nachdem Dein Vorname nur "... Schall und Rauch" ist, (Dein Spruch!:)) muss ich Dir auch noch verkünden, dass Du mit
Zitat:
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.
auch noch FALSCH liegst!:)) (Oh, du dickes Ei!)
Deutsche Spragge, schwere Spragge! English noch viel schwerer!:))
Zitat:
* 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).
... hatten wir schon: (und schon wieder ein "deja vu-Erlebnis"!)
Zitat:
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!
Zitat:
The TXC Flag bit is automatically cleared when a transmit complete interrupt is executed,
.... ebenso => hier unwichtig!
Zitat:
or it can be cleared by writing a one to its bit location.
Bitte beachten "it can"!
Dass wir das _zur_Sicherheit_ machen, hatte ich ja auch schon geschrieben!
Zitat:
The TXC Flag can generate a Transmit Complete interrupt (see description of the TXCIE bit).
Na ja, auch HIER unwichtig!
(Und das Alles steht bei mir auf Seite 154!:-)
Na ja, es war schon ziemlich spät!:))
Zitat:
- AVR setzt TXC auf 0 wenn alles geschoben ist.
- unser "while ( ! ...) sieht dies und while bricht ab
Umgekehrt! "TXC auf 1, wenn alles geschoben ..." und der Speicher UDR leer ist.!
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!
Zitat:
TXC WIRD 0, wenn man es durch schreiben einer 1 (!) cleared.
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!)
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?)