Hmm, ich versuch es mal informal.

Punkt 1. Ich würde es in ASM machen.

Also du richtest einen Timer ein der von 0-128 zählt und dann einen Interrupt auslöst. Dort fragst du den Pin ab.
Beim ersten mal Zähler=0
Wenn Pin=0 , dann Zähler=Zähler +1
Wenn Pin=1, dann geben Zähler aus.(Zwischendurch muss Pin=0 gewesen sein)

So könntest du die Zeit zwischen den Highpegeln zählen, denke ich.

Vielleicht hilft es dir.

Bis denn
Foxi