Cube schrieb:
> Karl Heinz Buchegger schrieb:
>> Da führt kein Weg vorbei. Irgendwie musst du das unterscheiden.
>
> Ok, vielen Dank. Und ist es denn wenigstens üblich das so zu machen wie
> ich, sprich innerhalb der ISR auf das Bit "ICES1" hin zu prüfen, oder
> hat sich da etwas anderes bewährt?
Ich würde das als die beste Alternative ansehen.
Welche Möglichkeiten gibt es
* am Pin nachsehen ob der Pegel 0 oder 1 ist.
WEnn 0, dann muss es eine fallende Flanke gewesen sein
Wenn 1, dann muss es eine steigende Flanke gewesen sein
Problem: Vom Zeitpunkt der Flanke aus gerechnet, bis dann
endlich der Pin abgefragt wird, vergeht Zeit. Zeit, in der
der Pin seinen Zustand schon wieder geändert haben könnte.
-> ist also nicht 100% zuverlässig
* in einer Variablen mitzählen, der wievielte Aufruf das war
(oder, was aufs gleiche rauskommt: eine Variable abwechselnd
0 bzw. 1 setzen und anhand der entscheiden)
Problem: Wird auch nur 1 Flanke verpasst (aus welchem Grund auch
immer), kommt alles durcheinander. Anstatt der Länge des Pulses
misst man die Länge der Pause.
* Beim INput Capture nachfragen, worauf eigentlich reagiert wurde.
Also deine Methode
Vorteil: Man hat die Gewissheit, dass die 'Auskunft' auf jeden
Fall korrekt ist. Die ISR wurde aufgerufen, WEIL eine steigende
Flanke detektiert wurde. Befrage ich die Cature Unit, wie sie
gerade eingestellt ist, dann lautet die Auskunft: steigende Flanke
Wäre da eine fallende Flanke gewesen, hätte die Capture Unit mit
der Einstellung nicht reagiert.
Kommt also der Interrupt und sagt mir die Capture Unit, das sie
auf steigend konfiguriert ist, dann war da auch eine steigende
Flanke. 100% sicher.