Die Berechnung der Frequenz wird ja mit dem Update-Flag freigeschaltet. Es wird also erst wieder ein neuer Wert eingelesen, sobald die vollständige Berechnung bestätigt ist. Tritt ein Interrupt auf, während Update = FALSE ist, wird die Interrupt-Routine nicht ausgeführt, sondern direkt wieder verlassen. Also die Frequenzmessung funktioniert für meine Zwecke zu 100%.

Sobald ich den TWI-Client abziehe, wird die Frequenz wieder richtig angezeigt. Ich verstehe nicht, wie ein paar Funktionen im pollenden Betrieb meine Interrupt-Routine beeinflussen können. Mit cli() habe ich auch schon versucht das zu verriegeln, aber das hatte keine Wirkung, da die Interrupt-Routine cli() zu Beginn ja selbst auch ausführen.

Es geht also darum:
Code:
while(1)
{
   if (Update) //Update => Freischaltbedingung für vollständige Messung
    {
      Frequenzberechnung...
      Update = FALSE;  //Neue Messung erlauben
    }

   I2C_Sende();
   I2C_Stop();
   I2C_Empfange();
   I2C_Stop();
}
Bei jedem Schleifendurchlauf wird also einmal per I2C gesendet. Wenn ich die I2C-Befehle auskommentiere, stimmt die Berechnung natürlich wieder. Ich kann mir überhaupt nicht erklären, warum die Interrupt-Routine vom pollenden I2C gestört werden könnte.

Die gemessene Frequenz wird von einem Atmega8 generiert.