Servus,
Ich hab den Code nicht geschrieben
Laufen soll das auf einem ESP32
https://de.wikipedia.org/wiki/ESP32Der läuft mit bis zu 240MHz das verleitet dazu "opulent" und nicht schlank zu programmieren
Außerdem hat der 2 Prozessorkerne, und man könnte sofern man kann beide Kerne getrennt ansprechen.
Integriert ist WLan und Bluetooth und min 4MB Speicher da kann man schon einiges ablegen.
Ich wollte eigentlich die ATMega verwenden, bin aber am direktem konfigurieren der Register gescheitert. Der ESP kennt sowas nicht.
Der Richard aus dem Rubo Forum hat eine eigene IDE "LunaAvr" entwickelt, in der man die Timer/Register wunderbar ansprechen konnte.
Leider ist der in der Zwischenzeit gestorben
In der Arduini IDE werden die Timer vorkonfiguriert und für viele Funktionen verwendet, man kann eingreifen, aber für einen Laien wie ich einer bin ist das etwas zu komplex
Ich bin ja nicht gerade damit groß geworden
Was können die Register:
Und das machen sie Hardwarenahe ohne Programmcode

Hochzählen und man kann den Zählerstand bei einem externem Interrupt abfragen und dann den Zähler wieder auf 0 Stellen
Einen Zählerstand setzen von dem Runtergezählt wird und bei 0 eine Aktion auslöst.
Nachdem man 3 Timer hat, lässt sich das wunderbar einsetzen.
Zeit zwischen 2 Impulsen / 360Grad = Anzahl der Impulse je Grad daraus leiten sich die Impulse bis zum ZZP ab = Zyndspule abschalten. (Man kann natürlich je nach Auflösung, in 0,5Grad u.s.w rechnen)
Beim Impuls am OT beginnt ein Zähler runter zu zählen und bei 0 wird die Zündspule eingeschaltet. (Da lassen sich Ladezeiten u.s.w berücksichtigen)
Ja und das geht eigentlich recht schlank, weil das Hardwarefunktionen des Atmel sind, gesetzt müssen die Register halt werden.
Ja und dann gibts noch eine "Funktion des Entprellens" am Eingang, das wird auch nur gesetzt, und ned "programmiert"
Steht alles im Datenblatt vom Atmel, wenn man versteht was da steht

bei meinen nur rudimentären englisch Kenntnissen wird's nochmal schwieriger
z.B.
// timer functions
// ------------------------------------------------------------------------------
// Procedure to start timer
// ------------------------------------------------------------------------------
void startTimer()
{
TCCR1A = 0; // normal mode
TCCR1B = 0; // stop timer
TCNT1 = 0; // count back to zero
TCCR1B = bit(WGM12) | bit(CS11); // CTC, scale to clock / 8
if ( timerInterval > 65535 )
{
OCR1A = 65535;
}
else
{
OCR1A = timerInterval;
}
TIMSK1 = bit (OCIE1A);
} // end of startTimer
// ------------------------------------------------------------------------------
// Procedure to stop timer
// ------------------------------------------------------------------------------
void stopTimer()
{
TCCR1B = 0; // stop timer
TCNT1 = 0; // count back to zero
TIMSK1 = 0; // cancel timer interrupt
} // end of stopTimer
// ------------------------------------------------------------------------------
// Procedure to decrease timer interval
// ------------------------------------------------------------------------------
p.s.
Bluetooth ist dann natürlich auch nochmal schwieriger