Hallo HeXPloreR,
er wertet in der Software nur das Low Signal aus.
Erst wenn sein gesamter Ampelablauf durch ist, wird die Variable err wieder auf 0 gesetzt. Prellen sollte da eigentlich keine Rolle spielen.
Aber Kondi kann nie schaden, 100nF geht auch.

Falls Speicherproblem: Tipps:
Ich weis nicht wie der Compiler seine Variablen ablegt, manche machen es sortiert nach Namen, oder man kann das sogar einstellen.
Vertausche mal die Variablen indem Du ihn andere Namen gibst oder die Reihenfolge veränderst wie sie definiert sind.
Nenn die einfach mal a_sec und probiere oder das nächste mal z_sec. Wenn der Compiler die dann Namentlich im Speicher sortiert landen sie
in andere Reihenfolge im Speicher und wenn es ein Speicherüberlappungsproblem ist wird sich das Programm dann auch anders verhalten.

Im .MAP File, falls dieser erzeugt wird, kann man nachschauen wo der Compiler die Variablen abgelegt hat.

Der Stack muss eingestellt sein, aber bei deinem Miniprogramm sollte das vermutlich voreingestellt sein.
Der Heap (Halde) wird nicht benötigt solange Du keine dynamische Speicherverwaltung benutzt. Hast Du ja nicht.

Ändere mal dein err zu einem char, nicht int, somit belegt die Variable nur noch 1 Byte.

Hast Du das mit dem sti() cli() ausprobiert ?