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

[mega16][bascom] Sterowanie 25 LED - programowy PWM

gray77 13 Mar 2011 20:02 14131 66
  • #1 9273041
    gray77
    Poziom 12  
    Witam.
    Chciałbym zrobić sterowanie 25 ledami. Powiedzmy, ze ma to być linijka ledow podświetlająca podjazd do garażu. Będzie ona załączana dwoma czujnikami. W momencie wykrycia obiektu, ma się ona zaświecać z tej strony co obiekt, powoli rozjaśniając kolejna diodę. Po upływie określonego czasu powoli ma wygaszać kolejne ledy. Będzie to coś podobnego jak w moim innym temacie klik, z tym ze nie chce mieć zajętych wszystkich nor uC, bo będę ich jeszcze potrzebował.

    Dużo czytałem i szukałem rozwiązań. Mógłbym zastosować parę TDA8444 (10 x ADC) ale nie mam pojęcia jak nim sterować przez I2C. Nie znalazłem żadnych przykładów. No i czy da się na tej kości lub na innej (jakiej?) zrobić tak, by każda dioda po kolei się rozjaśniała i pozostawała zaświecona i na odwrót? Np. wysyłam sygnał PWM (0-max świecenia) na led1, po osiągnięciu max świeci led1 i procedura powtarza się dla led2 - led25.
    Moze jakiś ekspander portów (tylko jak przekazywać PWM na poszczególne linie)?
    Chce jak najmniej lini uC zając, przekazując wykonanie "efektu" układom podrzędnym.
    Jak to rozwiązać? Jak tym sterować?

    I proszę nie krytykować, ze brak schematów, jakiegokolwiek kodu.... Kod stworze gdy będę wiedział jak i czym sterować ledy.
  • #2 9273280
    tadzik85
    Poziom 38  
    Najlepsze wyjście to sterowanie np z rodziny MBI. Może tym się zainteresuj. Obslugują do 16 diod i dla kazdej mozna ustawić jasnośc.
  • #3 9273311
    gray77
    Poziom 12  
    Nigdy nie miałem z nimi do czynienia. Zacząłem przygodę niedawno z AVRami i Bascomem. Chyba nie będę potrafił się przesiąść na inna platformę. Wolałbym kontynuować AVRy bo mam je w domu już.
  • #4 9273337
    tadzik85
    Poziom 38  
    To nie procesory a układy peryferyjne. Sterujesz nimi za pomocą dowolnego procka.

    mbi5030 zajrzyj do noty katalogowej.
  • #5 9273753
    gray77
    Poziom 12  
    tadzik85 napisał:
    mbi5030 zajrzyj do noty katalogowej.
    To może być albo na pewno jest zbyt skomplikowane dla mnie.

    Najlepsza opcja byłoby wysłać PWM na dana nogę i potem zatrzasnąć jak będzie max. Wtedy znów PWM na kolejna nogę i zatrzask, itd... Oczywiście peryferyjny układ sterowany przez uC.
  • #6 9273870
    tadzik85
    Poziom 38  
    albo podlaczysz wszystkie diody do procka albo wykorzystasz układ wspomniany przeze mnie inaczej szkoda zachodu
  • #7 9274918
    SylwekK
    Poziom 32  
    Wydaje mi się, że spokojnie można spróbować multipleksowo zasilać diody z programowym PWM powiedzmy 4-o bitowym - dla LED wystarczy, a i sam program nie powinien być skomplikowany. Wybieranie multipleksowe to prosta sprawa. Zrobić tablicę jasności dla każdego leda, i tylko wpisywać tam dane w dowolnej konfiguracji pozostanie.
  • #8 9274948
    tadzik85
    Poziom 38  
    Tak a f przemiatania nie będzie wcale mała co?
  • #9 9275022
    SylwekK
    Poziom 32  
    No faktycznie z multiplexem to nie zadziała tylko na pojedynczych pinach... cóż, głośno się zastanawiałem :) wtedy szybciej ewentualne błędy wychodzą i nowe pomysły wskakują...
  • Pomocny post
    #10 9279811
    Konto nie istnieje
    Konto nie istnieje  
  • #11 9280476
    gray77
    Poziom 12  
    gustaw66 napisał:
    gray77 a może spróbować w ten sposób...

    Tak i ten sposób powinien być dobry. Teraz muszę posiedzieć nad kodem i popróbować czy spełni moje oczekiwania.

    Dzięki.
  • #13 9280570
    gray77
    Poziom 12  
    Jednak po głębszym zastanowieniu, pierwsza LED będzie działać wedle tego schematu. Po dojściu na max świecenia np 5-tej LED, gdy cykl się będzie powtarzał dla kolejnej LED, wcześniejsze 5 również zgasną i będą się rozświetlać w miarę zwiększania wypełnienia PWM.
  • #14 9280610
    SylwekK
    Poziom 32  
    Będzie ok. Dla każdej diody robisz zmienną (tablica) i cyklicznie w zależności od wartości tej zmiennej zmieniasz sobie wartości tych zmiennych. Innymi słowy to tak jak by zrobić programowy pwm dla każdej diody ale aby procesor wyrobił to wystarczy jeden (tak... jeden) pwm, bo w danym momencie tylko jedna dioda się rozświetla, a pozostałe po rozświetleniu dostają już full napięcie. Przemyśl to ;) Co innego jak byś chciał sobie migać wszystkimi w jednym czasie - wtedy dla każdej bez indywidualnego pwm się nie obejdzie.
  • #15 9280645
    Konto nie istnieje
    Konto nie istnieje  
  • #16 9280671
    gray77
    Poziom 12  
    SylwekK napisał:
    Będzie ok. Dla każdej diody robisz zmienną (tablica) i cyklicznie w zależności od wartości tej zmiennej zmieniasz sobie wartości tych zmiennych. Innymi słowy to tak jak by zrobić programowy pwm dla każdej diody ale aby procesor wyrobił to wystarczy jeden (tak... jeden) pwm, bo w danym momencie tylko jedna dioda się rozświetla, a pozostałe po rozświetleniu dostają już full napięcie. Przemyśl to ;) Co innego jak byś chciał sobie migać wszystkimi w jednym czasie - wtedy dla każdej bez indywidualnego pwm się nie obejdzie.


    Cos mi się widzi, ze to jest wyższa szkoła jazdy jak dla mnie. Nie wiem czy sobie poradzę tak jak piszesz. Na tablicach jeszcze nic nigdy nie robiłem. Mam już kod na programowy PWM i chyba przy nim zostanę. Minus tego jest taki, ze zajmuje prawie wszystkie nogi uC.

    Edit:

    gustaw66 sposób drugi. Cos a'la efekt knight rider, tylko płynne rozjaśnianie i wygaszanie. Oczywiście jak się rozświetlą, to będą się świecić przez 5 min i dopiero potem zaczną się po kolei wygaszać.


    b1 - led1 -------------------------------------- led25 - b2

    b1 - bariera 1
    b2 - bariera 2

    Jeśli b1 wykryje ruch, płynnie rozświetli od led1 do led25, poświeci 5 minut i wygasi od led1 do led25.

    Jeśli b2 wykryje ruch, płynnie rozświetli od led25 do led1, poświeci 5 minut i wygasi od led25 do led1.
  • #17 9280738
    Konto nie istnieje
    Konto nie istnieje  
  • #18 9280780
    gray77
    Poziom 12  
    gustaw66 napisał:
    Tylko nie wiem, czy bym sobie poradził z takim kodem ?
    Może ktoś mądrzejszy wypowiedziałby się czy tok rozumowania jest słuszny.


    Ja sobie na pewno z tym nie poradzę. Zastosuje program z odpowiednio szybka zmiana stanu każdej końcówki uC. To chyba będzie najszybszy sposób, tym bardziej, ze zalążek kodu już powstał.
  • #19 9280821
    tadzik85
    Poziom 38  
    ale wy kombinujecie aż za bardzo. przecież wystarczy programowy PWN w którym parametrem jest również port mikroprocka i żadne multipleksowanie konieczne nie jest
  • #20 9280862
    gray77
    Poziom 12  
    tadzik85 napisał:
    ale wy kombinujecie aż za bardzo. przecież wystarczy programowy PWN w którym parametrem jest również port mikroprocka i żadne multipleksowanie konieczne nie jest

    Wtedy robimy PWM na powiedzmy porcie a6 i gdy dojdzie do max ustawiamy tam po prostu "1" a PWM przechodzi na kolejna nogę... To by znacznie zmniejszyło i uprościło program...

    Czy mógłbyś wrzucić kawałeczek kodu odpowiedzialnego właśnie za to zadanie?
  • #21 9281043
    SylwekK
    Poziom 32  
    O tym mówię przecież, tylko zastosowanie dodatkowej tablicy bardzo uprości indeksowanie portów i ułatwi kierowanie kierunkiem zapalania...
  • #22 9281189
    Konto nie istnieje
    Konto nie istnieje  
  • #23 9281218
    gray77
    Poziom 12  
    gustaw66 napisał:
    Jak to jest z tym PWM ? Nigdzie nie doczytałem, że pwm jest dostępny na dowolnej końcówce ?

    Bo nie jest.
    Sprzętowy jest na kilku końcówkach (zależnie od uC) tylko.
    Z tego co wiem, to programowo można zrobić go na praktycznie każdej nodze uC. Trzeba odpowiednio szybko zmieniać jej stan.
  • #24 9287415
    gray77
    Poziom 12  
    Witam ponownie.
    Prace nad projektem postępują. Niestety nie udało się zrealizować zamierzeń, ale sterowanie będzie tak: po wykryciu obiektu przez czujnik, będą się zapalać kolejne ledy, po upływie jakiegoś czasu wszystkie będą płynnie wygaszone przez wyjście PWM, które będzie sterowało anodami wszystkich led poprzez tranzystor.

    Mam pytanie dla znawców tematu. Czy tranzystory NPN (BC547) widoczne na schemacie da się zastąpić jakimś układem scalonym?

    [mega16][bascom] Sterowanie 25 LED - programowy PWM

    Jak widać będzie ich musiało być 25 a znacznie by uprościło sprawę zastosowanie scalaka. Wiadomo, że będzie on musiał wysterować 8 ledów.
  • #25 9287555
    Konto nie istnieje
    Konto nie istnieje  
  • #26 9287568
    SylwekK
    Poziom 32  
    Użyj kilku ULN2008 (jeden ma 8 wyjść ). Jak będę miał chwilkę to może Ci skrobnę ten programik na wygaszanie ale chwilowo mam troszkę urwanie głowy...
  • Pomocny post
    #27 9291922
    SylwekK
    Poziom 32  
    Pobawiłem się dziś chwilkę programowym PWM. Jest to rozwiązanie na 8 kanałów - 25 może być ciężko pociągnąć ale oczywiście możesz próbować rozbudować program i zmienić częstotliwość zegara czy wywołania przerwań.

    Pierwszy to demonstracja tworzenia w zasadzie dowolnie biegnącego światła - dane umieszczamy w liniach Data (wartości od 0 zgaszone do 8 max zapalone).

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Drugi to już dokładnie efekt o jaki Ci chodziło tyle, że na 8 kanałów zaprogramowany w pętlach For...Next. Zwiększyłem tylko rozdzielczość PWM w zakresie 0-128. Analogicznie do tego rozwiązania można zrobić tylko jeden pwm i przemieszczać się między portami wtedy już nie ma problemu, żeby ten efekt dla 25 kanałów zrobić ale to już zadanie dla Ciebie - ciasto wyrobione Ty go upiecz ;)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    :idea: Zwróć uwagę w jak prosty sposób przypisywany jest PWM do dowolnego portu.


    ...i jeszcze schemacik do demonstracji programów...

    [mega16][bascom] Sterowanie 25 LED - programowy PWM

    Pozdrawiam


    EDIT: Te programy to wstępny zarys większej całości sterownika, który właśnie opracowuję (ale nie LED, itp.) więc gdy dostosowywałem parametry to wyszła mała zmiana (wcześniej nie zwróciłem na to uwagi) - zmniejszyłem rozdzielczość ze 128 poziomów do 64. Przy tym zegarze i preskalerze PWM działa o wiele płynniej dla 8 kanałów. Wcześniej potrafiło gubić wartości... Zresztą do diod LED to i tak aż nadto :)
  • #28 9303762
    gray77
    Poziom 12  
    Słuchajcie. Wszystko powoli się kreuje i nabiera kształtów ale napotkałem dziwne zjawisko, którego nie umiem wytłumaczyć.

    Przy deklarowaniu portów na początku programu mam tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i wszystko byłoby ok, gdyby nie w miejscu gdziezadziała czujnik:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    ustawiam PWM na 0 by włączyć katody ledów i potem, gdy program przechodzi do ustawiania "1" na kolejnych pinach portu A równocześnie zostaje ustawiona "1" na pinie 2 i 3 portu C. Kolejność powinna być: port A 0-7 potem port C 0-7.

    Co jest nie tak?

    EDIT: Sprawdziłem na drugiej atmedze, by mieć pewność, że pierwsza nie jest uwalona i obie zachowują się identycznie.
  • #29 9304193
    SylwekK
    Poziom 32  
    Nie analizowałem tego wszystkiego ale czy ten drugi listing to przypadkiem nie jest to coś co się wykonuje w przerwaniu ?? Jeśli tak to przede wszystkim nie może być tam dwóch "return". Bascom zinterpretuje tylko pierwszy ret jako powrót z przerwania i może stąd jest problem...
  • #30 9304774
    gray77
    Poziom 12  
    SylwekK napisał:
    Nie analizowałem tego wszystkiego ale czy ten drugi listing to przypadkiem nie jest to coś co się wykonuje w przerwaniu ?? Jeśli tak to przede wszystkim nie może być tam dwóch "return". Bascom zinterpretuje tylko pierwszy ret jako powrót z przerwania i może stąd jest problem...

    Nie, to nie jest przerwanie. To jest tylko podprogram dla czujnika pierwszego.

    W przerwaniu mam tylko jeden return na samym końcu (nie ma więcej pomiędzy nazwa przerwania i powrotem) i tam tylko wykonuje sie zwiększanie flag. Nie ma tam nic więcej a tym bardziej zadnych waitow.
REKLAMA