Hallo Travoldos,

Ich versuche mal zu helfen/verbessern

1. Hardware:
Den Widerstand R3 mit 100k kannst Du Dir normalerweise sparen,
Weil Du ja sowieso die internen Pullup-Widerstände des AVRs benutzt.
( Nur so als Tipp um Hardwareaufwand zu sparen )

2. Software:
Ich will Dir keinesfalls zu nahe treten, sind nur Verbesserungsvorschläge:
Ich würde anstatt:
DDRB |= _BV(LED);
lieber:
DDRB |= (1<<LED);
verwenden.
Ist "standardisierter", und lässt sich von den meisten besser lesen...
Aber die obige Version ist sicherlich nicht falsch!


Nehmen Wir mal diese IF-Schleife unter die Lupe:
Code:
if (bit_is_set(PINA, BUTTON)) { 
            if (!bit_is_set(PINB, LED)) { 
                PORTB |= _BV(LED); 
            } else { 
                PORTB &= ~_BV(LED); 
            } 
}
Ich denke dein erster Fehler liegt schon in der ersten Zeile:
"if (bit_is_set(PINA, BUTTON))"
"Wenn Button-Pin High ist"

Dieser Fall tritt ein, wenn der Taster NICHT gedrückt ist.
Jetzt durchläuft er die zweite If-Funktion,
Ist die LED aus, schaltet er sie ein.
Das Programm beginnt erneut,

Eingang ist High (bit is set), er kommt in die erste IF.
Dann kommt er zur zweiten:
LED ist ein, er schaltet sie aus
Das Programm beginnt erneut.

Also schaltet er die LED ständig aus und ein.
Das erklärt, warum sie schwach leuchtet.


Wenn du nun den Taster drückst, dann kann er keine IF-Funktion durchlaufen.
Die LED zeigt nun den zu letzt gesetzten stand an.

Und ich wette, dass die LED bei manchen Tastenbetätigungen auch AUS ist.



Abhilfe:

In der ersten schleife schreiben:

if (bit_is_clear(PINA, BUTTON))


Das gaze ist aber auch kritisch!
Du müsstest die Tastenprellung berücksichtigen.
Mit dem Finger Tippst du zwatr nur einmal auf den taster,
aber der Kontakt prallt ein paar mal hin und her.
Also "Tippt" er ein paar mal mehr.
Daher kann es sein, dass die LED an und gleich wieder aus geht,
ohne dass man es sieht.