Ähm... 9600kBaud wären 9,6MBaud
Du meinst 9600Baud, oder?
Was heißt das?
Daß in einer Sekunde 9600 Bits gesendet werden könnten - oder andersrum ein Bit 1/9600 Sekunden dauert.
Ok, wie arbeitet nun der Reciever im AVR?
Der hat quasi sowas wie einen eigenen Timer, der 1zu1 auf den Systemtakt gekoppelt ist. Läuft der "Timer" über, wird die Rx gesampled. Innerhalb eines Bits sechzehn mal (im Normal-Modus) - Oversampling sozusagen. Relevant sind die Samples 8, 9 und 10, von deren Ergebnis die Mehrheitsentscheidung den tatsächlichen Wert des Bits liefert (majority rules - eigentlich sollten alle drei ja gleich sein).
Inwieweit der "Timer" bei jeder Flanke der Rx-Leitung zurückgesetzt wird (Synchronisation), ist mir nicht bekannt, zumindest beim Startbit mit Sicherheit.
Egal, wenn Du die Baudrate im AVR "einstellst", legst Du eigentlich nur die Reichweite des "Timers" fest. Der Überlaufpunkt wird ins Baudratenregister geschrieben. Wenn Deine Hochsprache das für Dich erledigt, bekommst Du davon halt nur nichts mit. Welcher Wert ist das?
naja - der "Timer" soll sechzehnmal pro Bit überlaufen, also "Bitdauer"/16. Und zwar die "Bitdauer" in Takten. Wenn der AVR die "Bitdauer" in Takten nicht kennt, mußt Du sie normalerweise ausrechnen (lassen), bei vorgegebenen 9600Baud eben 1/9600s, und das wiederum in Takte des Controllers.
ABER
Eigentlich interessiert Dich/den AVR die tatsächliche Bitdauer in Sekunden ja gar nicht. Und die Bitdauer in Takten kannst Du ja einfach messen/mitzählen (wenn Du den Inhalt des zu empfangenden Bytes kennst).
Im Idle ist Rx (vom Sender her) high (1). Das Startbit ist Low (0), dann kommen die Datenbits beginnend mit dem LSB, ggf ein Paritätsbit und das Stopbit wäre wieder High (1) und verschmilzt mit dem Idle.
Nimmt man 0x55 als Datenbyte, hätte man:
0x55 = 0b01010101, ohne Paritätsbit wäre das dann
1=Idle->0(Startbit)->1(LSB)->0(Bit1)->1(Bit2)->0(Bit3)->1(Bit4)->0(Bit5)->1(Bit6)->0(Bit7)->1(MSB)->1=Stop=Idle
Du startest also einen Timer mit Prescaler=1, und läßt den laufen.
Dann horchst Du an der Rx auf die erste fallende Flanke, kommt die, setzt Du den Timer auf null zurück.
An Rx weiter gelauscht, bei der nächsten Flanke liest Du den Timer aus, und setzt ihn zurück. Das kannst Du jetzt für alle Flanken machen und den Mittelwert bilden, Du kannst auch die Standardabweichung der Werte ermitteln, wie Du willst...
Prinzipiell hast Du schon mit dem ersten ausgelesenen Wert die Dauer eines Bits in Takten. Den Wert teilst Du also durch sechzehn, ziehst eins ab, knallst das ganze in das/die Baudratenregister, fährst den restlichen UART hoch, und meldest Dein "Communication Online" an den PC.
Noch weiter Klarheiten zu beseitigen??