logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterownik RGB na attiny2313 - problem z Timer0 w C

OgoN92 22 Kwi 2018 12:18 2784 4
REKLAMA
  • #1 17183173
    OgoN92
    Poziom 9  
    Witam!

    Mam problem z timerami w języku C (w moim projekcie) dlatego zwracam się do Was o pomoc. Napiszę od początku, żeby przedstawić o co mi chodzi.

    Zbudowałem kiedyś sterownik taśmy led RGB oparty na mikroprocesorze attiny2313, w którym za pomocą jednego przycisku zmieniam podstawowe kolory na pasku ledowym (czerwony, zielony, niebieski) oraz ich podstawowe zmieszane odcienie (fioletowy, pomarańczowy, błękitny, biały). Dodatkowo tym samym przyciskiem (przytrzymując go dłużej) mogę zgasić taśmę ledową oraz ją zaświecić. Do działania przycisku jest wykorzystany Timer0. Poniżej zamieszczam mój dobrze działający kod wg. powyższego opisu (ładnie opisany):

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Teraz chciałem prosić o pomoc, ponieważ chcę zastosować kolejny Timer do sterowania PWM taśmą ledową. Problem polega na tym, że gdy wrzuciłem Timer1 do mojego projektu to kolory się wyświetlają, mogę przyciskiem je przełączać, ALE zauważyłem, że co ok. 1 sekunde dioda RGB lekko mrugnie i jest brak reakcji na dłuższe przytrzymanie klawisza.
    Zauważyłem także, że gdy chcę zmienić wartość wypełnienia to dioda tylko miga szybciej lub wolniej w zależności jaką wartość wpiszę 0-255.

    Mam wrażenie jakby Timery przeszkadzały sobie na wzajem? Nie wiem jak to rozwiązać. Poniżej zamieszczam aktualny kod jakby ktoś był miły zerknąć i pomóc/podpowiedzieć mi? Bardzo proszę :)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W powyższym programie jest tylko dodany kolejny timer oraz funkcja do sterowania PWM diodami RGB.

    Dodam tylko jeszcze, że gdybym nie wykorzystywał Timera do obsługi klawisza (wtedy odpada reakcja na dłuższe przytrzymanie) to sterowanie PWM by działało (testowałem). Ale zależy mi na tym, żeby klawisz działał tak jak opisałem.
  • REKLAMA
  • #2 17183240
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 17183908
    OgoN92
    Poziom 9  
    nowyARM napisał:
    Dlaczego nie używasz sprzętowego PWM?


    Ponieważ już nie zmienie pinów sterujących bo projekt był zrobiony rok temu.

    nowyARM napisał:
    Co do błysków, to zrób podwójne buforowanie nastaw wirtualnego pwm. W przerwaniu przepisuj rejestr buforowy do właściwego.


    Możesz bardziej rozjaśnić? Bo jestem początkujący i nie bardzo zrozumiałem?
  • REKLAMA
  • #4 17184016
    BlueDraco
    Specjalista - Mikrokontrolery
    Funkcja set_color() jest równoważna trzem instrukcjom podstawienia, ale wykonuje się niekiedy parę tysięcy razy wolniej niż te podstawienia. PWM nie buforowany i nieprecyzjny. Częstotliwość PWM za mała. Funkcja change_color zbędna - da się zapisać w dwóch linijkach po stablicowaniu kolorów.

    PWM powinien wyglądać mniej-więcej tak (wciąż z defektem, bo nieprecyzyjny, ale ujdzie):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 17189013
    OgoN92
    Poziom 9  
    Metodą prób i błędów rozwiązałem problem.

    Zainicjowałem timer wewnątrz funkcji "void change_color(void);" i teraz nie ma żadnych mignięć diody, tylko normalnie świeci z zadanym wypełnieniem zmiennych pwm_r, pwm_g, pwm_b 0-255. Przy krótkim wciśnięciu przycisku zmieniają się kolory oraz przy długim wciśnięciu zeruję zmienne pwm_r, pwm_g, pwm_b.

    Wszystko działa tak jak chciałem. Dziękuję za zaangażowanie w temat :)
REKLAMA