Hallo Henk,
eine mit SIGNAL deklarierte Routine wird normalerweise nicht durch andere Interrupts unterbrochen. Eine mit INTERRUPT deklarierte schon, wenn der neue Interrupt eine höhere Priorität hat.
Schaltest du in deiner Routine explizit oder durch eine andere Funktion, die du aufruftst, die Interrupts wieder ein? (z.B. durch 'sei()').
-------------------
Die Lösung zum Problem mit 'uiMeinZahler' liegt im Schlüsselwort 'volatile'. Wenn eine Variable als 'volatile' gekennzeichnet ist, geht der Compiler davon aus, dass sich der Wert asynchron zum eigentlichen Programmfaden (thread) ändert (also z.B. durch einen zwischendurch aufgetauchten Interrupt). Der Variablenwert wird deshalb bei jedem Zugriff erneut aus dem Speicher geladen.
Ist eine Variable nicht als 'volatile' gekennzeichnet, geht der Compiler davon aus, dass sie sich nicht zwischendurch ändert und optimiert entsprechend. Wenn sie also einmal in einem Register ist, wird stets das Register genommen und nicht mehr nachgeladen. Wegen dieser Optimierung ist es auch sehr schwierig, die Ursache eines Problems zu erkennen, wenn die Codeschnipsel zu klein sind. Man kann dann nur raten.
Wenn du also in deinem Programm Variablen hast, die sowohl im Hauptprogramm als auch in einer Interrupt-Routine oder aber in mehreren Interruptroutinen angesprochen werden, egal ob lesend oder schreibend, must du sie als volatile deklarieren, damit es einwandfrei klappt.
Gruß Red Baron
Lesezeichen