Hallo Leute,
ich wollte die Auflösung von micros() vergrößern und habe mir dafür überlegt das ich folgenden Code Eingbe:
TCCR0B = (TCCR0B & 0xF8) | 0x01 ;
dieser Code setzt den Prescaler von Timer0 von 64 auf 1.
Das bedeutet für mich das ich von 4us Auflösung auf 0,0625us kommen müsste oder?
Und ab hier verstehe ich es auch nicht mehr
0,0625 us sind genau 16MHZ, das bedeutet doch, das der Process immer im ISR für den Timer laufen müsste oder? Tut er aber nicht.
Außerdem habe ich einfach mal über Serial.println die aktuellen micros() ausgegeben.
Das passt soweit auch, ich bekomme nun 64x zu viele "microsekunden" zurück, jedoch erhalte nur gerade Zahlen.
Kann mir einer die zwei Sachen erklären:
- Wenn ich den Prescaler auf 1 Setze beudetet es doch, das der Atmega nur in seiner Schleife laufen müsste oder?
- Warum erhalte ich immer bei der Rückgabe eine Gerade Zahl?
Vielen Dank
LÖSUNG:
Habe mir nun doch mal den Quellcode angeschaut und Antwort ist wie folgt.
Die Function micros hat folgenden Rückgabewert:
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
m gibt den Rückgabewert vom Timer0 overflow an (nachdem TCNTO von 0-255 gezählt hat)
t ist der aktuelle zähler vom Timer0 (TCNT0 zahl zwischen 0 - 255)
clockCyclesPerMicrosecond() rechnet 16000000L(HERZ)/1000000L sind
Und deswegen ergibt sich durch die Multiplikation von "4" ein vielfaches von 4