Das Problem liegt in der Zeile mit
RPM = (counter*60) / 50
dabei wird counter *60 als integer (als 15 Bit + Vorzeichen ) ausgerechnet, und das geht früh schief.
Etwas besser wäre es da RPM = (counter*6) / 5 zu schreiben. Da hat man einen Faktor 10 mehr Platz nach oben. Wenn man dann noch counter als unsigned wählt, hat man nochmal den doppelten Platz. Ober wenn die rechenzeit nicht so kritisch ist kann man auch statt der 6 einen 6L oder 6UL schreiben, dann geht die Rechnung mit 32 Bits.
Es geht hier mit den Datentypen etwas sehr durcheinander - da ist alles mit dabei, was dem Compiler nicht so entgegen kommt.
Das CLI() und SEI() in der ISR ist auch keine gute Idee. Das kann jenachdem was GCC an Optimierungen macht ggf. auch noch schief gehen. In der ISR sind weitere Interrupts sowieso gesperrt. Die LCD-Befehle in der ISR sind nicht optimal. Da wäre ggf. zu überlegen Interrupts in der ISR freizugeben (per SEi()) - das ist aber auch nicht ohne Probleme. Eine sichere aber langsamere Alternative ist es nach der Ausgabe noch mal den Timer und die Interupt Falgs zurück zu setzen, also erst dann die nächste Messung zu starten.
Lesezeichen