Zu meinen Fragen: wann muss ich den Timer immer vorladen? So wie jetzt in der ISR oder reicht einmal im Hauptprogramm?
In der ISR.
Und warum komme ich nicht auf die errechnete Frequenz?
Du hast zwischen den Interrupts nur 50 Befehlszyklen für die Abarbeitung. Zum einen benötigt die Sicherung und Wiederherstellung in der ISR eine nicht unerhebliche Zeit, zum anderen muß der Code der ISR auch noch abgearbeitet werden.
Zwischen den Interrupts stehen nur 50 Befehlszyklen zur Verfügung und die gesamte Abarbeitungszeit des Interrupts ist einfach größer als diese 50 Befehlszyklen. In diesem Zusammenhang ist
nicht wirklich optimal. Sobald der verwendete Compiler die Division tatsächlich ausführt, um den Rest zu ermitteln, wird das Ergebnis niemals rechtzeitig zur Verfügung stehen. Da es nur darum geht, zu ermitteln, ob
timer_cnt gerade oder ungerade ist, würde ich nur das LSB testen (die Chancen sind dann viel höher, daß der Compiler einen möglichst optimalen Code generiert).
if (timer_cnt & 0x01) // timer_cnt ungerade
{
...
}
else // timer_cnt gerade
{
...
}
Viele Grüße
Bernd