Hallo,

Du könntest Dir beim Timer die ICP Funktion angucken, hier kann man den Timer, bzw. dann Counter, bis zur nächsten Flanke zählen lassen, der Counter schreibt automatisch den Wert in ein extra Register, damit man etwas Zeit hat, das auszulesen. Es kann auch ein IRQ ausgelöst werden, in dem man dann den Wert verarbeitet.

Ausschnitt mit Timer1 beim Mega32, so jetzt nicht getestet, nur zusammenkopiert :
Code:
$hwstack = 40
$swstack = 40
$framesize = 40

$regfile = "M32def.dat"                                     ' the used chip
$crystal = 16000000                                         ' frequency used
$baud = 9600

Config Timer1 = Counter , Capture Edge = Falling , Prescale = 256

Config Portd.6 = Input                                      '  ICP1 Eingang
Portd.6 = 1

' Array und zähler für Timerdaten
Const Maxcapt = 60
Dim Capt(maxcapt) As Word
Dim Ccnt As Byte

On Icp1 Icp_isr
Enable Icp1

' Reset IC IRQ
Tifr.icf1 = 1
Enable Interrupts

Do
    ' Reset IC IRQ
    Stop Timer1
    Timer1 = 0
    Capture1 = 0
    Tccr1b.ices1 = 0
    Tifr.icf1 = 1
    Ccnt = 0

    Start Timer1
    Enable Icp1

    ' warten bis array voll
    While Ccnt < Maxcapt
    Wend

    Disable Icp1

    ' Ausgeben
    For X = 1 To Maxcapt
        Print Capt(x)
    Next X

    Wait 2

Loop

' Capture IRQ
Icp_isr:

    Timer1 = 0
    Toggle Tccr1b.ices1

    ' bis max. MaxCapt, dann nix mehr einlesen !
    If Ccnt < Maxcapt Then
        Incr Ccnt
        Capt(ccnt) = Capture1
    End If

Return
Das Programm sollte 60 Wechsel messen und in einem Array sammeln, danach per UART ausgeben.