Justus schrieb:
> Sporadisch kommt es vor das aus einer Interrupt-Routine Port-Pins an P0
> nicht gelöscht werden, obwohl der Befehl (LPC_GPIO0->FIOPIN &= ~0x01) in
> der Firmware korrekt aufgerufen wird.
Wenn im Vordergrundprogramm oder einem anderen Interrupt-Handler
ebenfalls auf dieses Register schreibend zugegriffen wird, können sich
die Zugriffe gegenseitig unterbrechen. Z.B. liest das Programm den alten
Inhalt aus, wird dann durch den Interrupt-Handler unterbrochen, der P0
zurücksetzt, und arbeitet nach Beendigung des Interrupt-Handlers auf
seinem alten Registerinhalt mit noch gesetztem P0 weiter. Also werden
solche Peripherie- und/oder Registeroperationen nicht atomar ausgeführt.
Viele aktuelle Microcontroller haben daher separate Periherieregister,
mit denen einzelne (oder mehrere) Bits gesetzt werden können, und
solche, mit denen die entsprechenden Bits zurückgesetzt werden können.
Dies vermeidet zum einen auf Programmseite viel Aufwand durch
Lesen->verunden->verodern->schreiben, und zum anderen sind die
Schreibzugriffe atomar. Der einzige Nachteil besteht darin, dass man
nicht gleichzeitig Bits setzen und zurücksetzen kann.
Ansonsten besteht noch die Möglichkeit, die Peripheriezugriffe durch
Interruptsperren o.ä. zu schützen.
<glaskugelmodus>
In Deinem Programm befindet sich der Fehler übrigens in Zeile 42.
</glaskugelmodus>