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![]()
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.
OS = Operating SystemZitat von AVR Manual
ISR = Interrupt Service Routine
SFR = Special Function Register







Zitieren

Lesezeichen