Hallo,

ich hab den Thread nur überflogen, aber ein paar Anmerkungen möchte ich doch machen.

Zum Drehzahlbegrenzer...

Warum die Drehzahlbegrenzung nicht über die Frühverstellung realisieren?
Frühzündung ab 9500 U/min wieder leicht zurück nehmen -> der Motor verliert an Leistung und dreht nicht mehr höher.

Zur Realisierung:
Mit Timer 0 (8bit) kommst Du imo nicht weit. Benutzt Du Timer0 um die Umlaufzeit zu berechnen, handelst Du Dir alle 256 Takte einen Interruptaufruf ein, der erstmal 29 Register sichert und nachher wieder restauriert. Von den 256 Takten werden so alleine 116 'verbraten', also fast 50% Deiner gesammten Rechenleistung. Du kannst das zwar mit Nosave tunen, aber dann must Du höllisch aufpassen welche Register Du verwendest und die dann von Hand sichern.

Umdrehungszeitmessung und Zündpostitionsbestimmung lassen sich aber mit Timer1 erschlagen.

Vorgehen:
Timer1 als freilaufender Timer
Umdrehungsimpuls liest Timer 1
U_Time = Timer1_neu - Timer1_alt
Timer1_neu = Timer1_alt

Dann bestimmst Du die Werte für die Zündzeidpunkte und schiebst sie in die Timer1 OutputCompareRegister. Praktischerweise hat der Mega8 derer 2, für jeden Zylinder eines.

Dann brauchst Du imo zusätzlich noch eine Ladezeit für die Zündspule, oder aber Du lässt die Zündspulen immer eingeschaltet, dann frisst Deine Zündung aber unmengen von Strom.

Ciao,
Werner