void ICACHE_RAM_ATTR intNull() { /* Interruptroutine bei Erkennung Nulldurchgang an PIN * Die Mutter der Phaseninterrupts * Sehr zeitkritisch, bitte keine weitere Unterbrechung * Verwendet globale Variable und startet Timer1, wenn erforderlich */ noInterrupts(); // Interrupts unterbinden igNullMy = micros(); igTckS = igTckSNeu; // neue Zeit übernehmen sRam.sFlg.bHw0 = true; timer1_detachInterrupt(); if (!sRam.sFlg.bNot) { // nur im normalen Betrieb delayMicroseconds ((int)(sRam.iNullVerz * NUL_T1_TICK / 1000)); if (igTckS < NUL_MIN_V) { // nahe min. Helligkeit / nahe Phasenanfang sRam.sFlg.bInv ? ANST_1 : ANST_0; // sofort absteuern } else { sRam.sFlg.bInv ? ANST_0 : ANST_1; // ansteuern // if (sRam.iTckHw - igTckS >= NUL_MIN_V) { // nicht nahe max. Hell. / Phasenende timer1_write (igTckS); timer1_enable (TIM_DIV16, TIM_EDGE, TIM_SINGLE); timer1_attachInterrupt (intT1); // } } } interrupts(); for (int i=0; i<7; i++) { // Test iTest2[i] = iTest[i]; // Test iTest[i] = igNullMy; } // for iTest[0] = igTckS; // Test iTest[1] = igNullMy; // Test iTest[5] = igTckSNeu; iNulChk++; // Test ob Interrupt läuft } // intNull()