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.
Lesezeichen