@ Hugo
Also, mich würde ja auch mal interessieren, ob es einen vernünftigen
Grund gibt, das so zu machen.
Das Verfahren hat aus meiner Sicht nur Nachteile.
1. Zusätzlicher Aufwand um EICRA, EIMSK und EIFR zu bedienen.
2. Ein Busy-Waiting auf die jeweilige Flanke.
Den Zweck könnte man auch ohne 1. erreichen, selbst wenn man
Busy-Waiting verwendet.
Und Busy-Waiting wendet man, meiner Meinung nach, auch nur in den ersten
Programmen an, um das Prinzip der Erkennung von Flanken mal zu lernen.
Oder, falls definitiv klar ist, dass die nachfolgende Änderung in einem
Zeitabstand kommt, der nicht gemessen werden muss und kürzer ist, als es
bräuchte, um einen Timer zu konfigurieren. (Also etwa Status-Abfragen in
der UART).
Ausserdem kann das, wenn man schon soweit ist, der Timer von alleine -
ohne Busy-Waiting, so dass die CPU nebenbei noch anderes tun kann.
Magst Du das mal erklären?
Mal Code ohne EICRA und Konsorten (mit irgendeinem Pin der auf Eingang
konfiguriert ist).
1 | uint16_t Capture(void)
|
2 | {
|
3 | // wait for low
|
4 | while (! (PORT & (1 << PIN)));
|
5 | // wait for high
|
6 | while (PORT & (1 << PIN));
|
7 |
|
8 | ; rising edge occurred
|
9 |
|
10 | TCNT1 = 0;
|
11 |
|
12 | // wait for falling edge
|
13 | while (! (PORT & (1 << PIN)));
|
14 |
|
15 | return (TCNT1);
|
16 | }
|