TWI stört meinen Interrupt zur Frequenzmessung
Ich messe eine Frequenz, indem ich die Flanke vom INT0 auswerte. Bei der ersten Flanke wird TCNT1 in Start gespeichert und bei der zweiten Flanke wird TCNT1 in Stop gespeichert. In der main-Schleife wird dann über eine Freischaltbedingung die Frequenz in Hz berechnet. Das funktioniert einwandfrei.
Jetzt wird in der main-Schleife das Ergebnis nach der Berechnung per I2C an das Display geschickt. Währenddessen können ja ruhig weitere Flanken gemessen werden, da der Interrupt0 ja Vorrang hat. Leider stimmt das Ergebnis nicht mehr, sobald die I2C Befehle im Programm sind.
Wie kann das sein, dass die Zeit falsch gemessen wird, obwohl der Interrupt doch Vorrang hat und ja auch garantiert einmal ohne Unterbrechung abgearbeitet wird?
Die I2C Bibliotheken basieren auf denen von P.Fleury. Also es wird der Hardware-TWI benutzt. Ich konnte im Code auch nirgendwo einen anderen Interrupt finden. Aber die INT0-Routine sperrt ja sowieso andere Interrupt, während sie aktiv ist?
Code:
// Interrupt INT0
ISR(INT0_vect)
{
static unsigned char ErsteFlanke = TRUE;
if( Update ) //Erst erneut Messen, wenn vorher ausgewertet wurde.
return;
if( ErsteFlanke )
{
StartTime0 = TCNT1; //Zeit der ersten Flanke speichern
NumberOverflow = 0;
ErsteFlanke = FALSE;
}
else
{
EndTime = TCNT1; //Zeit der zweiten Flanke speichern
Update = TRUE; //Berechnung freigeben
ErsteFlanke = TRUE;
}
}
int main()
{
while (1)
{
if(Update) // Berechnung der Frequenz
{
Drehzahl = (NumberOverflow * 65536) + EndTime - StartTime;
Drehzahl = F_CPU / Drehzahl;
Update0 = FALSE;
}
// I2C
if (!TWIM_Start (SlaveAddress, TWIM_WRITE))
{
TWIM_Stop ();
}
else
{
TWIM_Write (display_value);
TWIM_Stop ();
Delay_ms (1);
}
if (!TWIM_Start (SlaveAddress, TWIM_READ))
{
TWIM_Stop ();
}
else
{
Data[0] = TWIM_ReadNack ();
TWIM_Stop ();
Delay_ms (1);
}
}
}
Liste der Anhänge anzeigen (Anzahl: 1)
Code
Hier mal als Anhang der Code. Danke schonmal für die Mühe!