[AVR] Przerwania i 50Hz

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ą :(

Reply to
MoonWolf
Loading thread data ...
Reply to
Patryk Sielski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.