timerwert = TCNT1;
und wer sagt dir, dass der Timer bei 0 weggelaufen ist?
Du musst schon die Differenz der Timerstände beim Starten und dem
Timerstand beim Stoppen nehmen. Wenn du das unsigned rechnest musst du
dann den ersten Overflow unter Umständen noch nicht einmal einrechnen.
1 | MCUCR = (1<<ISC11)|(0<<ISC10); //Die Fallende Flanke an Pin INT1 erzeugt einen Interrupt und der timer wird ausgeschalten
|
2 | MCUCR = (1<<ISC01)|(0<<ISC00); //Die fallende Flanke an Pin INT0 erzeugt einen Interrupt und der timer wird eingeschalten
|
und deine Lichtschranke liefert beim durchbrechen welche Flanke?
Das hier
löscht nicht das TOIE1 Bit. Das verändert TIMSK überhaupt nicht.
Ein Bit wird gelöscht mit
1 | TIMSK &= ~( 1 << TOIE1 );
|
gilt sinngemäss auch für alle anderen Bits, die du mittels 0<<irgendwas
auf 0 zu setzen versuchst.
Bitmanipulation
> Teilweise noch eine halbe Sekunde nachdem auslösen der Lichtschranke.
Ja nachdem wo der Interrupt diesen Code hier
1 | timerwert = TCNT1;
|
2 | time = (i*65536.0*takt)+(timerwert*takt);
|
3 |
|
4 | sprintf(ausgabe, "%f", time); //Ausgabe
|
5 | lcd_clear();
|
6 | lcd_string(ausgabe);
|
7 | _delay_ms(100);
|
unterbricht, kann sich dann der finale Wert noch mal ändern. Und je
nachdem wo der Interrupt den Code unterbricht, kann das dann auch schon
mal etwas länger dauern. sprintf braucht Zeit, lcd_clear braucht Zeit
(und führt zu Flackern), lcd_string braucht Zeit und _delay_ms braucht
sowieso Zeit.