Hallo Teslanikola,

vom Grundaufbau geht das so.
Zwei Sachen:
1) mit Timer0 willst Du eine Sekunde Messzeit erzeugen.

Das heist, Du must 10E6 Timer-Takte warten bis Du die Zähler wieder stoppst. Du wartest aber nur 40 Takte.
Da Du 10E6 Takte nicht direkt mit Timer0 zählen kannst, brauchst Du eine weitere Variable, die die Anzahl der Overflow-Interrupts (Interrupt: OnTimer0) zählt.
1 Overflow_int = ein Timerdurchlauf

Ich würde zusätzlich den Prescale von Timer0 erhöhen.

Takte = Anz-Interrupts * Timerbreite * Prescale
10E6 = 38,1469 * 256 * 1024

38,1469 lassen sich nicht unmittelbar realisieren, Du kannst aber Timer0 mit einem Wert vorsetzen und dann bis zum 39sten Interrupt zählen.

Stop Timer 0
Timer0 = 218
Start Timer0
Start Timer1
Do
Loop Until Interrupt_Zähl_Variable = 39
Stop Timer1
Stop Timer0


d.h. der erste Overflow kommt nach (256-21 * 1024 Takten und jeder weitere Interrupt nach 256 * 1024 Takten.
Der 39ste Interrupt kommt also nach (256-21*1024 + 38*256*1024 Takten. Ingesammt also nach 10.000.384 Takten.

Damit liegst Du nur um 38.4 µs neben Deiner geforderten Messzeit. Hinzu kommt noch die Zeit für das abarbeiten des Programms vom Interrupt bis zum Timer-Stop.

Das ganze lässt sich auch noch optimieren, z.B. indem Du die benötigten Takte, die für das Abarbeiten berücksichtigst und gegen den Vorsetz-Wert aufrechnest.

2) Timer1 ist 16Bit breit. D.h. Du kannst bei 1s Messzeit Frequenzen bis 65535 Hz messen. Wird die Frequenz höher läuft Dir Timer1 über.
Um den Wert zu erhöhen musst Du wie beim Timer0 die Anzahl der OnTimer1-Interrupts zählen. Bei 1-2 MHz wirst Du irgendwann an Herdware Grenze des Atmel-Chips kommen. Höhere Frequenzen kannst Du dann nur noch messen, wenn Du sie vor der Messung z.B. mit einigen Flipflops runterteilst.

Ciao,
Werner