Witali Gustschin wrote:
> Vielen Dank für die Antwort!
>
>> Du musst simulierte 1027 µs (4 MHz, 9600 Baud) warten
>
>
> Aha! Und wie berechnet man diese Zeit aus dem Takt und der Baudrate?
Mist! Erwischt ;-)
Ich habe es nicht berechnet, sondern mit der Stopwatch im AVR Studio
beim Simulieren mitgestoppt. Breakpoint auf das return in uart_putc und
Autostep ALT+F5 laufen lassen. Dann Input Capture auslösen auf PB0...
Wenn es beim zweiten auszugebenden Zeichen dort stoppt, die Stoppuhr auf
0 resetten und weiter mit Autostep oder Run laufen lassen, bis das
dritte Zeichen ankommt. Dann sind 1027undpaarzerquetschte µs vergangen.
Berechnen... 2 Bytes sind 2x (1 Startbit, 8 Datenbits, 0 Paritybit und 1
Stopbit) = 20 Bits. Bei 9600 Bits/s dauert die Ausgabe also 20/9600 s =
2,08 ms.
2.08 ms bis der 2 Byte UART Puffer komplett leer ist, du brauchst aber
nur ein Byte freien Puffer für das nächste Zeichen, also 1/2*2,08 ms =
1,04 ms = 1042 µs. Dass der simulierte Wert etwas geringer ist, liegt
vielleicht an der Lage des Breakpoints.
Die Taktrate spielt keine wesentliche Rolle. Ich habe sie automatisch
mit angegeben, um meine Simulationsparameter (Atmega8, 4 MHz...)
festzuhalten, falls wir länger an dem Fall arbeiten sollten oder wenn du
das nachvollziehen willst, was ich gemacht habe.
>> Vielleicht gibt dir das eine Idee, dass UART Senden im Timer-Interrupt
>> keine gute Idee ist, wenn man einen genauen Timer braucht ;-)
>
> Danke! Das war nur ein Lernprogramm. Ich habe es aus einem anderen
> zusammengebastelt, mit dem ich früher was mit dem Timer ausprobiert
> habe.
Sollte auch keine Kritik in dem Sinn sein, sondern ein
Denkanstoss/Reminder, die ISR grundsätzlich so klein wie möglich zu
halten.