Hallo oberallgeier,

danke für die Teil-Infos. Hilft schon mal etwas weiter.

Das habe ich hier gefunden:

Wenn die Variable Iz_diff0 nicht eine char-Variable, sondern ein längerer Datentyp wie z.B. int ist, dann kann es vorkommen, dass in rgl_mo_xx() der Zugriff auf diese Variable durch einen Interrupt unterbrochen wird.
Es kann dann sporadisch passieren, dass du beim Zugriff einen Teil der Bytes aus dem Speicher VOR der Int-Änderung holst, und das andere Byte NACH der INT-Änderung.

Sicherer ist folgendes in rgl_mo_xx():
Code:
  int   Iz_diff0_lokal;

   interrupt_sperren();    -- dieses sei() und oder das andere Dingsda.
   Iz_diff0_lokal = Iz_diff0;
   -- und alle weiteren Variablen, die in Interrupts 'angefasst' werden.
   interrupt_wieder_zulassen();  -- das andere Dingsda oder halt sei().

  weiter mit deiner Funktion
Das gilt grundsätzlich für alle Variablen die in Interruptfunktionen geändert werden können.
Bei char-Variablen sollte man mal genauer auf den Output vom Compiler schauen, ob ein Zugriff komplett in einem Assembler-Befehl abgearbeitet wird. Dann, und nur dann, kann das sei() oder nicht sei() weg gelassen werden.

Gruß Sternthaler
P.S.: Ja, ich fahre jetzt nach meinem ersten Nach-Urlaubs-Arbeitstag auch wieder nach Hause.