Das Problem dürfte darin liegen, dass der atmega8 die while-Schleife ständig (ziemlich schnell) durchläuft. In der Zeit, in der Du die Taste gedrückt hälst, zählt er folglich i immer weiter hoch. In der Variante (i == 4) ist die Bedingung also nur sehr kurz erfüllt, bei (i>=4) kommt es irgendwann zu einem Überlauf und i ist negativ, die LED schaltet um, bis i wieder größer 3 ist...

Wenn Du den Tastendruck zählen willst, musst Du die Taste entprellen und sicherstellen, dass er jedes Drücken nur einmal zählt. (geht sicher professionell auch - ich helfe mir einfach damit, dass ich in einer while-Schleife auf den Tastendruck warte, dann einen Moment Zeit vergehen lasse und danach mit einer while-Schleife warte, bis die Taste losgelassen ist; dann wieder von vorn)