Und wenn Du gleich eine Assembler Routine schreibst die 2 int Werte aufnimmt und einen long Wert zurückgibt ?Wie das auf die langsame Art (mit <<16) geht weiss ich.
Bei Codevision wären das genau 4 MOV Befehle.
Das dürfte aber nichts ausmachen, wenn man für die Zeitberechnung das ICR Register, anstatt des TCNT ausliest und verarbeitet.Es dann möglich, das der ICP Interrrupts schon ausgeführt wird, bevor der overflow Interrupt dran war.
Darin befindet sich ja der Zählerstand als der Input Capture Interrupt auftrat. Folglich sollten auch die Überlaufzähler noch nicht hochgezählt werden.
Auch wenn beide Interrupts 100% zeitgleich eintreffen wird der ICP Interrupt zuerst ausgeführt, weil er höher priorisiert ist.
Auch wenn jetzt einTimer Overflow Interrupt auftritt, ist es sogar besser, wenn er nicht ausgeführt werden kann, weil dadurch die Überlaufzähler ja auch auf dem alten Stand bleiben.
Wenn im Input Capture Interrupt alle Zeiten ausgewertet sind, kann ja der Overflow Interrupt immer noch korrekt ausgeführt werden.
Die Zeit, die vergeht bis das ICR ausgelesen wird ist ebenfalls unkritisch, weil sie ja bei jedem Zyklus gleich lang dauert ( Es sei denn man hat das im Programm extra anders gemacht ) .
Ich finde mit dem ICP lassen sich viele Probleme lösen, die man mit normalen Interrupts und Timer abfragen immer hätte ( Überholeffekte usw. ) .
Lesezeichen