Hallo, ohne sich ein Dattenblatt zu Deinem µC runterzuladen, und sich die Register anzugucken, kann ich folgendes sagen...

Code:
#include <avr/delay.h>
Wo gibt es das ?

delay.h befindet sich meiner Meinung nach in util/ ....

Code:
 _delay_loop_2(300000000);
300000000 ??

Code:
void 	_delay_loop_2 (uint16_t __count)
so steht es in delay.h drin und jetzt überleg mal wie groß maximal uint16_t
sein kann.

warum springst Du as der ISR in eine Funktion raus? das kann man ruhig in der ISR erledigen, ohne sie zu verlassen.

Warum machst Du cli(); in der ISR ? das ist sinnlos.

und ja
Ja, Pausen in Interrupts sind böse
dem kann ich nur zustimmen....

Gruß Sebastian