Zrobiłem w przerwaniu od timera0 (overflow co 256us) wykrywanie przejścia przez 0 i chcę synchronizować z tym inne wyjście procka (klasyczny ściemniacz do światła (:). Niestety pojawił się problem - impulsy wyjściowe 'drgają' co powoduje mruganie żarówki. Doszedłem do tego, że zrobienie tego z poolingiem, bez przerwań, eliminuje problem. No ale to bez sensu jest (szczególnie przy bardziej zaawansowanych programach). I tu pojawia się moje pytanie: czy coś sknociłem, czy to jakiś feature? Nie podejmę się opisywać co robiłem w celu naprawienia sytuacji, ale było to już chyba wszystko. Nie mogę niestety zmienić układu i podpiąć sobie to 50Hz do nóżki przerwania zewnętrznego.
W tej chwili (w trakcie walki wyrzuciłem obliczanie drugiej połówki sinusoidy) mam to zrobione tak (darujcie nazwy zmiennych (:):
SIGNAL (SIG_OVERFLOW0) { if (flagWait450Hz) { if (bit_is_set(PIN_50HZ, BIT_50HZ)) lastPinState = 1; else if (lastPinState == 1) { flagWait450Hz = false; flagWait2ON = true; countWait2ON = 0; lastPinState = 0; } } else if (flagWait2ON && ++countWait2ON > 4) { PORT_OBROTY |= _BV(BIT_OBROTY); flagWait2ON = false; flagWait2OFF = true; countWait2OFF = 0; } else if (flagWait2OFF && ++countWait2OFF >= 2) { PORT_OBROTY &= ~_BV(BIT_OBROTY); flagWait2OFF = false; flagWait450Hz = true; } }
No i oscyloskop synchronizuje się na jednym impulsie a kolejne drgają :/
Co można z tym zrobić? Może w ogóle zmienić podejście? Już całkowicie ugrzązłem a gugle nie pomagają :(