Das 2.te if hier
1 | int signal_laenge_messen()
|
2 | {
|
3 |
|
4 | //überprüft ob das BIT auf 1 steht, im Timer2 Reg. steigende Flanke am Eingang
|
5 | if (TCCR1B |= (1<<ICES1))
|
6 | {
|
7 | //löscht das BIT im Timer2 Reg. fallende Flanke am Eingang
|
8 | TCCR1B &= ~(1<<ICES1);
|
9 | TCNT2 = 0; //Timer2 reseten
|
10 | }
|
11 |
|
12 | if (TCCR1B &= ~(1<<ICES1))
|
13 | {
|
14 | i = TCNT2;
|
15 | printzahlen(i);
|
16 |
|
17 | print("\n");
|
18 | TCCR1B |= (1<<ICES1);
|
19 | }
|
20 | return 0;
|
21 | }
|
kannst du dir sparen.
Generell solltest du mehr 'else' einsetzen, wenn es nur 2 Möglichkeiten
gibt. Ein Bit kann entweder 1 oder 0 sein. Wenn es nicht 1 ist, dann
MUSS es 0 sein. Es gibt keine andere Möglichkeit.
Gleichzeitig liegt hier auch dein Problem
Du hast geschrieben
1 | if( Bit gleich 0 )
|
2 | setzte Bit auf 1
|
3 |
|
4 | if( Bit auf 1 )
|
5 | mach was
|
Bei der 2-ten Abfrage ist dein Bit IMMER auf 1. Denn entweder ist das
Bit von Anfang an schon auf 1, oder du setzt es auf 1, wenn es das nicht
war. Damit ergibt die 2-te Abfrage IMMER true.
Was du eigentlich wolltest
1 | if( Bit gleich 0 )
|
2 | setzte Bit auf 1
|
3 |
|
4 | else
|
5 | mach was
|
Solche Abfragen auf 2 Möglichkeiten sind meistens eine schlechte Idee
1 | if( x < 5 )
|
2 | ... // x wird hier nicht verändert
|
3 |
|
4 | if( x >= 5 )
|
5 | ...
|
1 | if( i < 10 )
|
2 | ...
|
3 | if( i >= 10 && i < 20 )
|
4 | ...
|
5 | if( i >= 20 )
|
6 | ...
|
x kann nur kleiner oder größer gleich 5 sein. Wenn es nicht kleiner ist,
dann ist es automatisch größer/gleich. Was soll es denn sonst sein?
Derartige 'Doppelabfragen' sind deshalb eine schlechte Idee, weil man
dann die Logik der Abfrage 2 mal im Code hat und beide Varianten das
Gegenteil aussagen müssen. Das ist erstens nur Schreibarbeit für nichts
und zweitens eine weitere Möglichkeit Fehler zu machen. Bei dir kommt
dann noch dazu, dass du dann innerhalb der jeweilige Alternative dann
auch noch die Grundlage der Abfrage veränderst (die 'Variable oder das
Register).
1 | if( x < 5 )
|
2 | ...
|
3 | else
|
4 | ...
|
1 | if( i < 10 )
|
2 | ...
|
3 | else if( i < 20 )
|
4 | ... // i kann hier nicht mehr kleiner als 10 sein
|
5 | // denn wenn es das wäre, dann wäre das Programm nie hier
|
6 | // her gekommen, sondern der erste if wäre genommen worden
|
7 | else
|
8 | ... // i kann hier nicht mehr kleiner als 20 sein (oder 10)
|
9 | // wieder: wenn es das wäre, dann wäre das Programm nie
|
10 | // an diese Stelle gekommen
|
Manchmal ist es also klug, nicht zuuuu explizit zu sein, sondern sich zu
überlegen, welche Dinge durch vorhergehende Abfragen schon
ausgeschlossen sind und diese Dinge implizit mitzubenutzen.