Möglicherweise optimiert der Kompiler die Zeile

for (unsigned int i = Takt/4000ul; i > 0; i--) ;

einfach weg, weil seiner Meinung nach nichts passiert. Versuch mal:

for (unsigned volatile nt i = Takt/4000ul; i > 0; i--) ;