Und die printf brauchen keine Zeit?
Wenn du schon in einer ISR eine Ausgabe machst, dann bitte so
1 | ISR(INT2_vect)
|
2 | {
|
3 |
|
4 | uint16_t zeit = TCNT1;
|
5 | TCNT1 = 0;
|
6 |
|
7 | printf("%u;\r\n",zeit);
|
8 | }
|
damit der Zähler schon wieder weiterzählen kann, solange der printf
läuft.
Aber:
Das ganze ist insofern unsinnig, als du ja den Zähler nicht auf 0
zurücksetzen brauchst.
Man kann ja auch mit einer Uhr mit Sekundenzeiger stoppen, ohne dauernd
die Uhr zurückzusetzen. Einfach die Startzeit von der Endzeit abziehen
und die Differenz ist die verstrichene Zeit.
Hier beim Timer geht das nicht anders
1 | uint16_t startZeit;
|
2 |
|
3 | ISR(INT2_vect)
|
4 | {
|
5 | uint16_t zeit = TCNT1;
|
6 |
|
7 | printf("%u;\r\n", zeit - startZeit);
|
8 | startZeit = zeit;
|
9 | }
|
Und wenn man jetzt noch weiß, dass der µC genau für den Fall:
wenn Flanke an einem Pin auftritt, dann sichere SOFORT den Zählerstand
des Timers,
eine extra Hardware/Behandlung eingebaut hat, dann hat man da auch noch
die Interrupt-Latenz draussen. Dieses Spezialding nennt sich "Input
Capture" und ist das MIttel der Wahl, wenn es darum geht Pulse mit
höchstmöglicher Genauigkeit auszumessen. IN jedem Thread hier im Forum,
in dem es in irgendeiner Forum um Frequenzmessung geht, landet man
letzten Endes unweigerlich beim Input Capture. Du bist ja schlieslich
nicht der Erste, der Pules ausmessen / Frequenzen messen will.
Das man in einer ISR keine langsamen Ausgaben macht, brauch ich dir
hoffentlich nicht erzählen. Ich schreibe das jetzige Vorgehen jetzt
einfach mal den ersten Tests und Versuchen zu. Das du dir natürlich
genau dadurch erst mal fehlerhafte Ergebnisse eingehandelt hast, steht
auf einem anderen Blatt.