Hallo,
gut, dann sind wir ein Stück weiter.
Ja, mit Flag oder Merker meint man in der Regel eine boolsche Variable, die nur ein Ereignis dokumentieren soll, worauf man dann reagiert. Neuerdings heißt auch dieser Datentyp in der IDE richtigerweise bool und nicht mehr boolean, wird jedoch noch beides aktzeptiert. Hat mal Serenifly erklärt vor längere Zeit. ![]()
Du brauchst also ein Flag damit dieses hier außerhalb der ISR starten kann. Soweit ist dir das ja bewusst.
Da du hier aber gleich mit einer Verzögerung beginnst, brauchst noch den Zeitpunkt der Flag Setzung.
/*Funktioniert aber blockiert;
delayMicroseconds(triacONdelay);
digitalWrite(Zuendung, HIGH); //Phase anschneiden;
delayMicroseconds(25);
digitalWrite(Zuendung, LOW); //abschalten der Zündfreigabe, sodass bei nächstem 0-Cross Triac auch sicher aus ist;
*/
Im Grunde könnte deine ISR nur aus 3 Zeilen bestehen. Alle volatile. Den Rest machste in der loop inkl. zurücksetzen vom Flag. Falls die ISR eher wieder drankommt wie du außerhalb fertig bist, kannste den ISR Code noch so umschreiben das die neue Zeit nur neu gemerkt wird und das flag nur neu gesetzt wird wenn es "false". Das sollte jedoch nie der Fall sein, sonst hättest Zündausetzer.
Das wäre jetzt meine Vorschlag ohne bis ins letzte Detail zu gehen.
void zeroCrossDetected() {
++counterZeroCrosses; //Zähler für die Nulldurchgänge;
flag_TriacStartRoutine = true; // bool
time_TriacStartRoutine = micros(); // unsigned long
}
mit sinnvollen Variablennamen habe ich es nicht so ... benenne es wie du magst.
Die Funktion außerhalb könnte so aussehen, ob das funktioniert kann ich nicht testen.
if (flag_TriacStartRoutine == true) { // Startbedinung aus ISR
if (micros() - time_TriacStartRoutine >= triacONdelay) {
digitalWrite(Zuendung, HIGH); // Phase anschneiden
flag_TriacStartRoutine = false; // Flag zurücksetzen
zuendung_ein = true; // zusätzliche bool
}
}
if (zuendung_ein == true) {
if (micros() - time_TriacStartRoutine >= (triacONdelay + 25 )) {
digitalWrite(Zuendung, LOW); // abschalten der Zündfreigabe
zuendung_ein = false; // Flag zurücksetzen
}
}
Da es bei dir um µs geht, wird mit der zusätzliche bool ein ständig neues Zündung HIGH setzen vermieden innerhalb der nächsten 25µs. Der zusätzliche Code sollte schneller sein als mehrfach digitalWrite.
Viel Spass beim grübeln oder machst das ganz anders ...
atomic Zugriff nicht vergessen!