Beim Lesen von 16-bit-SFRs muss man zuerst das LOW lesen und danach das HIGH, welches in TEMP gelatcht wurde.

Falls die Auswertung von Ausdrücken von rechts nach links erfolgt, wird das nicht eingehalten und du liest Schrott. In C etwa ist teilweise nicht spezifiziert, wie die Auswertung erfolgt und Ausdrücke wie foo(a++,a++) haben unterschiedliche Semantik je nach C-Implementierung.

Ob andere IRQs aktiv sind weiß man, weil man idR das Programm selber geschrieben hat Bild  
Oder man fragt Kollegen, die die anderen Module machen. Oder schaut in die Quellen. Oder schaut sich Listfiles an. Falls ein OS auf dem AVR läuft sind ziemlich sicher IRQs aktiv. In dem Falle sollte das in der Doc zu deinem OS stehen.

IRQs können deshalb Probleme machen, weil sich dadurch die Interrupt-Response-Times vergrössern. Wenn die Zeit so groß wird, daß zwei oder mehr InCapt-Ereignisse auftreten, fängst du nur den letzten Wert, dementsprechend falsch wird dein Ergebnis. Die Latenz erhöht sich auch durch einen langen ISR-Prolog.

Wenn du von einem InCapt zu einem anderen nur 35 Zyklen hast ist das *absolut* verschärft, da würd ich nicht mal mehr mit C dran sondern nur mit Assembler und ohne externe Calls wie abs() um den Overhead von Funktions-Prolog und -Epilog zu umgehen.

Zitat Zitat von AVR Manual
The main challenge when using the Input Capture unit is to assign enough processor capacity for handling the incoming events. The time between two events is critical. If the processor has not read the captured value in the ICR1 Register before the next event occurs, the ICR1 will be overwritten with a new value. In this case the result of the capture will be incorrect.

When using the Input Capture interrupt, the ICR1 Register should be read as early in the interrupt handler routine as possible. Even though the Input Capture interrupt has relatively high priority, the maximum interrupt response time is dependent on the maximum number of clock cycles it takes to handle any of the other interrupt requests.
OS = Operating System
ISR = Interrupt Service Routine
SFR = Special Function Register