Die Logic in dem Programm oben sieht auf den ersten Blick OK aus. Allerdings wird der Puls durch aktives Warten ausgegeben. Für eine spätere Anwendung ist das ziehmlich unpraktisch.
Ein kleines Problem ist noch im Code: der zugriff auf Timer01 im Hauptprogramm ist nicht Atomar. das heißt es ist nicht sicher das high und low Byte immer zusammengehören, wenn mittendrin ein Interrupt auftritt. Das kann gelegentliche Fehler verursachen.
Ist denn sicher das der Controller wirklich mit 8 MHz läuft und nicht den internen 1 MHz.

Bei 8 MHz sind 10 µs gerade man 80 Zyklen. Allein das sichern der Register für die ISR kann schon so um die 30 Zyklen brauchen.