Amilio schrieb:
> zwischen den einzelnen Interrupts und erwarte konstant 32768. Das ist
> aber nicht der Fall. Es ist immer abwechselnd 32769 bzw. 32767. Im
> Schnitt passt das, aber warum ist die Differenz nicht immer konstant
> 32768?
Das nennt sich variable Interruptlatenz. Die setzt sich aus mehreren
Komponenten zusammen, in deinem Falle ist aber nur eine davon wirksam,
nämlich die Ausführungszeit der "unterbrochenen" Instruktion (die in
Wirklichkeit eben nicht unterbrochen wird), in deinem Fall das rjmp,
welches allein die Hauptschleife bildet. Je nachdem, wann der Interrupt
zuschlägt, wird er entweder sofort ausgeführt oder erst zwei Takte
später, eben um die Laufzeit der rjmp-Instruktion verspätet.
In deinem einfachen Fall könntest du das kompensieren, indem du einfach
in der ISR ein nop einfügst, dann erwischt der Interrupt die
Hauptschleife relativ immer im gleichen Moment und die variable Latenz
verschwindet. Das funktioniert so aber wirklich nur in sehr einfachen
Fällen, wo alle Instruktionen in der Hauptschleife genau zwei Takte lang
sind. Normalerweise hat man da aber Instruktionen mit unterschiedlichen
Laufzeiten drin, von einem Takt bis zu vier oder u.U. (bei den großen
AVRs oder denen mit externem RAM) sogar noch mehr.
Dazu können dann noch die anderen Quellen kommen, die zur variablen
Interuptlatenz beitragen, das sind cli/sei-Blöcke in der Hauptschleife
und konkurrierende Interrupts. Diese Sachen können die variable Latenz
leider sehr hoch treiben.
Wenn du unter solchen Bedingungen die ISR synchron zum
Timer-Interruptereignis bekommen willst, mußt du das aktiv mittels
entsprechendem Code in der ISR machen. Leider verbrauchst du dabei dann
in der ISR immer mindestens so viel Rechenzeit, wie die variable Latenz
im schlimmsten Fall dauert und diese Rechenzeit ist wirklich verloren,
während die variable Latenz selber ja nicht verloren ist, weil etwas
sinnvolles in dieser Zeit passiert.
Routinen, die solche Synchronisierung leisten können, wurden hier im
Forum vor etwa drei Monaten in einem Thread ausgiebig diskutiert. Mußt
du mal die Suche bemühen, ich kann mich leider nicht an den Titel des
Threads erinnern.