Du hast eigentlich schon alles selbst beantwortet.
Feste Zeitspanne: Einen Timer-Interrupt, der dem Hauptprogramm den
Zählerwert mitteilt und den Zähler wieder auf 0 stellt. Am besten den
16-Bit Timer mit Compare-Interrupt verwenden, da kann man sehr genau die
Zeitbasis einstellen. Schau Dir im Datenblatt mal die Compare-Funktion
an (wichtig ist auch das CTC-Bit).
Zählen: Entweder über Polling oder einen Externen Interrupt. Wenn der
Controller nebenbei noch viel machen soll, ist der Externe Interrupt
erste Wahl.
Bei niedrigen Frequenzen kann man aber auch die Zeit zwischen zwei
Impulsen heranziehen, ist genauer.
Dann noch die Umrechnung. 500ms sind ne halbe Sekunde, Umdrehungen /Sec.
: Zählerwert verdoppeln, Umdrehungen/min: Zählerwert x 120
(vorausgesetzt 1 Impuls/Umdrehung).