Ulf schrieb:
> aber es kommt nach dem Resetten des µC sehr leicht zu massivsten
> Fehlern.
...
> verwendet, die eigentlich genau sowas verhindern sollte. Leider
> schafft sies nicht immer, erst, wenn ich einen delay von 1ms reinsetze,
> klappt es immer. Was für Statusbits muss ich denn noch setzen, damit das
> Teil definitiv richtig sendet.
Das könnte auch ein ganz anderes Problem sein (abgesehen davon, dass
interner Takt versus Quarz sowieso immer verliert):
Das Problem ist in der Methodeik der seriellen Übertragung selber zu
finden. Der Empfänger kann nicht zweifelsfrei feststellen, wenn denn nun
eigentlich exakt ein neues Zeichen anfängt. Er macht dies indem er aus
der Ruhelage heraus die erste Pegeländerung als Beginn des Zeichens
wertet. Ab dieser Flanke ist alles weitere zeitgesteuert. Nachdem ein
Zeichen komplett übertragen wurde, kehrt alles wieder in die Ruhelage
zurück und die nächste Flanke triggert den Beginn des nächsten Zeichens.
Soweit so gut.
Wenn du jetzt aber den µC mitten in der Übertragung eines Zeichens
resettest, dann passiert es, dass zwar der µC schon längst aufgehört hat
zu senden, der Empfänger aber noch die Bitzeiten für einzelne Bits
abwarten will, weil ja für ihn das Zeichen noch nicht komplett empfangen
wurde.
Und jetzt entsteht das Problem. Beginnt dein µC wieder frisch mit seiner
Arbeit und fängt sofort wieder zu senden an, dann wertet der Empfänger
die Pegeländerungen (die vom µC aus eigentlich als der Beginn eines
neuen Zeichens gedacht waren) als noch zum vorhergehenden Zeichen
gehörig. Und ab dort kommt dann alles durcheinander.
Es ist ein bischen so, wie wenn du beim Zappen im Fernseher nicht
mitbekommst, dass in der Zwischenzeit der Sender gewechselt wurde. Das
sagt dann Humphry Bogart plötzlich: "Ich seh dir in die .. Windel mit
Nässeschutz". Nur dass es bei der UART dann eben um die Bitebene geht.
In dem Moment, wo du als Sender auf der UART eine kleine Pause einlegst,
ermöglichst du dem Empfänger, dass er sich wieder einwandfrei auf deine
Byteanfänge synchronisieren kann. Und genau das hat du mit deinem 1ms
delay gemacht.