Die Fehler beim Compilieren kommen daher, das io.h nicht eingebunden ist. Da werden die ganzen Register und Bit namen erst definiert.

Der prescaler sollte eher bei 8 liegen. Die einstellung geht im Register TCCR1B.

Den Zugriff für die 16 Bit Registerpaare macht GCC schon selber, das ist also schon richtig so.

Es müssen noch ein paar mehr Variablem als volatile markiert werden, denn auch auf flag und postion wird in der ISR und main zugriffen. Bei den Variablen kommt man im wesentlichen mit dem Typ unsigned int aus. Man braucht da kein LONG. Das zurücksetzen des Zähler ist auch nicht nötig. Wenn ein Überlauf auftritt, dann wird der bei der Differenzbildung richtig berücksichtigt, wenn man konsequent beim Datentyp unsigned int bleibt.