Arduino Drehzahlmesser, Hallsensor + 1.2" 7-segment Backpack Anzeige

Hi

...
volatile uint16_t rpmcount;   //Hier die Variable 'dicker' machen
...
 void loop()
 {
   delay(900);  //würde ich eher mit millis() machen, der Sketch wird wohl noch Mal mehr zu tun bekommen, als jetzt
   //detachInterrupt(0); //den Interrupt NICHT raus nehmen!!
   noInterrupts();  //ein Sperren der Interrupts reicht hier völlig
uint16_t temp=rpmcount;  //NUR die Variable auslesen
rpmcount=0;   //und Nullsetzen
   interrupts();  //Interrupts wieder zulassen, so wenig Zeit wie möglich die Interrupts sperren
   rpm = 30*1000/(millis() - timeold)*temp;  //hier hast Du 'alle Zeit der Welt'
   timeold = millis();
   
   //Write it out to Display
   matrix.print(rpm,DEC);
   matrix.writeDisplay();
   //attachInterrupt(0, rpm_fun, RISING);  //was nicht entfernt wurde, muß auch nicht erneuert werden

Dachte eher so.
Die Zeit, Die die Interrupts gesperrt sind, so kurz wie möglich halten.
Das Rechnen braucht WESENTLICH mehr Zeit, als das Auslesen.
Und dabei darf auch eine ISR zuschlagen - z.B. braucht millis() selber Interrupts, damit die Millisekunden gezählt werden können.
Hier kann Dir ebenfalls schnell Mal 'was durch die Lappen gehen'.

ISRs: so kurz/schnell wie möglich
ISRs sperren: ebenfalls so kurz wie möglich

MfG