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

[AVR] AVR i BILLBORD LED

grafiksaba 01 Wrz 2008 13:11 2742 19
REKLAMA
  • #1 5495968
    grafiksaba
    Poziom 11  
    Serdecznie witam,

    Czy da się zrobić billbord led w oparciu o AVR? Może ktoś przybliży w podpunktach co do tego bilbordu led jest potrzebne i na jakiej zasadzie to działa? Jak za pomocą ledów da się wyświetlić kolorowe zdjęcie?
  • REKLAMA
  • #2 5496554
    szelus
    Poziom 34  
    1. billboard, czyli tablica
    2. Tak samo, jak na każdym innym mikrokontrolerze. Zobacz np. https://www.elektroda.pl/rtvforum/topic829792.html
    3. Trzeba użyć LEDów RGB. I aby uzyskać półtony (więcej niż 8 kolorów na punkt), trzeba jednak sterowanie trochę skomplikować. Sam AVR raczej nie da rady. Chyba, że ikony 16x16 punktów ;)
    4. Użyj funkcji szukaj.
  • REKLAMA
  • #3 5497232
    dawid512
    Poziom 32  
    Zawsze możesz multiplexować takie coś i jest to w miare proste ;).
    Jaki rozmiar ma mieć ta tablica?
  • #4 5502550
    grafiksaba
    Poziom 11  
    Proszę powiedzieć coś więcej o tych diodach Jak uzyskać kolor np:
    R 186 G 179 B 214
  • #5 5502947
    Konto nie istnieje
    Konto nie istnieje  
  • #6 5504683
    szelus
    Poziom 34  
    Nie mam praktyki w tym względzie. ale nie wydaje mi się, aby tablica o 100 multipleksowanych kolumnach była realizowalna fizycznie (a nie teoretycznie). Tzn. prąd efektywny diody jest przy multipleksowaniu N razy mniejszy od impulsowego, gdzie N jest liczbą kolumn. Wprawdzie zasilana impulsowo dioda świeci (pozornie) trochę jaśnej, więc może znajdą się diody wytrzymujące 10mA*100=1A w impulsie. Ale to dawałoby 300A na kolumnę, nie 6A. Sterowanie wierszy musiałoby wytrzymywać ten 1A.

    Przy 100 kolumnach częstotliwość multipleksowania powinna wynosić co najmniej 10kHz. Przy 8 bitowym PWM częstotliwość PWM musiałaby być ok. 2,5MHz. Nie jest to jakoś oszałamiająco dużo, ale dla programowego PWM raczej ciasno. BASCOM odpada ;)

    Podsumowując, wydaje mi się, że liczbę kolumn należałoby znacząco zwiększyć, a co za tym idzie, ilość podzespołów do sterowania również.
    Koszta, koszta, koszta.... I mówimy tylko o matrycy 100x100 pikseli.
  • #7 5504828
    grafiksaba
    Poziom 11  
    Dziękuje wszystkim za wskazówki, jeszcze jak ktoś by mi wyjaśnił ten sprytny sposób programowalnego sygnału PWM na każdą nogę mikrokontrolera. Chociaż teoretycznie. Bo faktycznie atmega8 ma chyba możliwość tylko 1 sygnału PWM, a więc na jedną diodę RGB potrzebuje aż 3 PWM czyli 3 mikrokontrolerów, ach te koszty.
  • REKLAMA
  • #10 5505033
    grafiksaba
    Poziom 11  
    Przepraszam, faktycznie ma 3 kanały: oc1a, oc1b, oc2. Ale to i tak za mało, więc proszę o informację na czym polega ten sprytny sposób na programowy PWM na każdą nogę mikrokontrolera.
  • #11 5505065
    szelus
    Poziom 34  
    Kol. Rocket_93 pisał o PWM programowym, czyli o sterowaniu z programu każdym wyjściem oddzielnie. Programowy PWM na 21 wyjść będzie nietrywialny, zwłaszcza, że musi chodzic synchronicznie z multipleksowaniem.
  • #12 5505222
    grafiksaba
    Poziom 11  
    Ale jak tego dokonać? Jakieś sugestie pomysły.
    Jeśli programowy PWM na 21 jest zbyt skomplikowany, to napisze Pan coś więcej o programowym PWM na 1 wyjście, pod warunkiem że nie będzie to OC1a, oc1b, oc2 w atmedze 8 tzn może a pewnie musi korzystać z tych liczników ale dioda nie będzie podłączona do tego wyjścia.
    Wiem że w atmedze8 mam możliwość sprzętową - 3 kanałów pwm, czyli trzy konkretne wyjścia, na których mogę zdefiniować wypełnienie sygnału PWM (czyli jasność świecenia diody). A jak tego dokonać na pozostałych wyjściach? Czy to da się zrobić?
  • #13 5505256
    acid12
    Poziom 21  
    da sie, odpowiednio szybko (w odpowiedniej czestotliwości, i ilości) zmieniajac stan na wyjsciu, poczytaj na czym polega PWM
  • REKLAMA
  • #14 5505352
    grafiksaba
    Poziom 11  
    Nadal nie mogę, nie potrafię sobie tego ułożyć w głowie, nie oszukujmy się jestem początkującym i potrzebuje wskazówek, poczytaj to dla mnie za mało. Napisz coś więcej, daj więcej wytycznych.

    Tak na szybko to sobie wyobrażam tak:
    dla ułatwienia steruje 6 diodami przez atmega8, każda dioda ma być sterowana przez sygnał PWM z zakresu 0 do 255.

    generuje sygnał PWM 8 bitowy na jednym wyjściu (oc1a) będzie on służył do sterowania jasnością wszystkich 6 diod

    konfiguruje timer który będzie odpowiedzialny za włączanie diod multipleksowo tak jak wyświetlacz led cyfr,
    czyli najpierw włączę 1 diodę,
    zostanie ona wyłączona
    później kolejna i tak do sześciu
    jak będzie szybko to oko da się oszukać że są cały czas włączone.

    diodę podłącze z jednej strony do 5V pomiędzy opornik 550 a z drugiej strony do wyjścia pb1(oc1a), a pomiędzy wstawię triaka sterowanego przez optotriaka podłączonego do portu np. PD0 (tzn na którym nie można ustawić wypełnienia PWM i tak dla kolejnych wyjść odpowiedzialnych za włączanie diod). Czyli jeśli włączę triaka ustawiając poziom niski na PD0 to sygnał PWM zostanie przekazany na diodę D1, później wyłączę triaka ustawiając poziom wysoki, ustawie nowa wartość PWM na oc1a, ustawię poziom niski na PD1 co włączy drugiego triaka i przekaże nowy sygnał PWM na diodę2 itd. Jako sygnał wejściowy do triaka będzie OC1A czyli właśnie PWM.

    Czy to może zadziałać? Jeśli nie co to znaczy programowy PWM, bo ja to tak zrozumiałem.
  • #15 5505368
    szelus
    Poziom 34  
    Np. taki pseudokod, oddajacy ideę programowego PWM wielokanałowego (pisane na kolanie):
    
    while (true)
    {
      for (j = 0; j < LICZBA_PORTOW; ++j)
      {
        if (pwm_portu[j] > 0)
          wlacz_port(j);
      }
    
      for (i = 0; i < LICZBA_KROKOW_PWM; ++i)
      {
    
        delay(CZAS_KROKU_PWM);
    
        for (j = 0; j < LICZBA_PORTOW; ++j)
        {
          if (pwm_portu[j] < j)
            wylacz_port(j);
        }
      }
    }
    


    Oczywiście, będzie problem z wykonaniem czegoś takiego, jeżeli wymagana czestotliwość PWM jest wysoka. Żeby to działało, czas wykonania całego powyższego kodu musi być pomijalny w porównaniu do opóźnienia wprowadzanego funkcją delay().

    -----------------
    Powyższe to była odpowiedź na pytanie z postu o 3 do góry :)
    -------------------
    grafiksaba napisał:

    Tak na szybko to sobie wyobrażam tak:
    dla ułatwienia steruje 6 diodami przez atmega8, każda dioda ma być sterowana przez sygnał PWM z zakresu 0 do 255.

    generuje sygnał PWM 8 bitowy na jednym wyjściu (oc1a) będzie on służył do sterowania jasnością wszystkich 6 diod


    To mimo wszystko jest to PWM sprzętowe.

    Cytat:

    Konfiguruje timer który będzie odpowiedzialny za włączanie diod multipleksowo tak jak wyświetlacz led cyfr,
    czyli najpierw włączę 1 diodę,
    zostanie ona wyłączona
    później kolejna i tak do sześciu
    jak będzie szybko to oko da się oszukać że są cały czas włączone.

    Musi ten timer chodzić z czestotliwościa co najmniej 40Hz * ilość diod.

    Cytat:

    diodę podłącze z jednej strony do 5V pomiędzy opornik 550 a z drugiej strony do wyjścia pb1(oc1a), a pomiędzy wstawię triaka sterowanego

    Triak się nie nadaję. Musisz użyć tranzystorów.
    Cytat:

    Czyli jeśli włączę triaka ustawiając poziom niski na PD0 to sygnał PWM zostanie przekazany na diodę D1, później wyłączę triaka ustawiając poziom wysoki, ustawie nowa wartość PWM na oc1a, ustawię poziom niski na PD1 co włączy drugiego triaka i przekaże nowy sygnał PWM na diodę2 itd. Jako sygnał wejściowy do triaka będzie OC1A czyli właśnie PWM.

    W zasadzie tak, tylko czestotliowość PWM musi być albo duuużo wyższa, niż tego timera. Jeżeli PWM 8-mio bitowy, to co najmniej 256 razy większa, pod warunkiem, że to wszystko chodzić bedzie synchronicznie.

    Ponieważ jesteś początkujący, to napisz co dokładnie chcesz zbudować. Będzie łatwiej coś konkretnego doradzić.
  • #16 5505669
    grafiksaba
    Poziom 11  
    Byłem na mieście i spodobał mi się wyświetlacz LED na którym wyświetlają reklamy, taki billbord. Wiem już że kosztowe bo LED RGB są po ok. 1zł / szt, ale nadal interesuje mnie zbudowanie chociaż miniaturki czegoś takiego. Koledzy powiedzieli jak działają LEDY RGB, i że muszę na 1 diodę wysłać 3 sygnały PWM aby uzyskać kolor RGB na jednej diodzie. Największy problem mam właśnie z sygnałem PWM. Przecież nie będę zaprzęgał 1 mikrokontrolera do obsługi 1 diody:)

    I najlepszym rozwiązaniem jest właśnie te programowe PWM, choć wogóle nic z tego nie rozumiem. Nie ukrywam że brak mi wiedzy. Patrząc na Twój kod myślowy, proszę o opis słowny,
    bo jak mi się wydaje najpierw włączasz wszystkie diody, później hmm liczba kroków to chyba wypełnienie PWM, czyli chyba liczba od 1 do 255 dalej czekaj, no właśnie skąd będę wiedzieć ile ma wynosić czas_kroku_PWM, a później wyłączasz diody i od początku cały program.

    Zatem żeby zrozumieć programowe PWM powiedzmy że najpierw podłączę 2 diody do portów mikrokontrolera i jedna będę chciał zaświecić z wypełnieniem pwm 10 a drugą 255. Najlepiej bym to zrozumiał jakby przełożył mi Pan ten kod na programowe PWM

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    'tu będą diody którę chcę zaświecić z wypełnieniem 10 a drugą 255
    'tylko zeby bylo to programowe to powiedzmy niech będą to PD1 i PD2
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    
    '8bitowy PWM czyli wartości od 0 to 255 co jest dla mnie istotne
    'że 255 to max wartość
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    
    Do
    
       Pwm1a = 10
       Pwm1b = 255
    
    Loop
    End
    
  • #17 5505882
    szelus
    Poziom 34  
    [quote="grafiksaba"]
    bo jak mi się wydaje najpierw włączasz wszystkie diody,
    [quote]
    Tak
    Cytat:
    później hmm liczba kroków to chyba wypełnienie PWM, czyli chyba liczba od 1 do 255

    Nie, to zakres PWM, dla 8 bitów 256. Dla mniejszej rozdzielczości odpowiednio mniej.
    Cytat:
    dalej czekaj, no właśnie skąd będę wiedzieć ile ma wynosić czas_kroku_PWM,

    To wychodzi z obliczeń o których pisałem powyżej :
    czas_kroku = 1 / (częstotliwość odświeżania * liczba kolumn * liczba kroków PWM)
    Cytat:

    a później wyłączasz diody i od początku cały program.

    Ale zauważ, że moment wyłączenia każdej zależy od ustawionego dla niej wypełnienia PWM (w tablicy pwm_port). Im niższe, tym dioda świeci się krócej.

    Niestety, BASCOMa nie używam, wiec kodu w nim nie wrzucę. A ile pikseli chciałbyś docelowo osiągnąć? Wydaje mi się, że jakieś 8x8 będzie do osiągnięcia z 40-nóżkowej megi.
  • #18 5505946
    grafiksaba
    Poziom 11  
    to przełóż mi to na C, dwie diody podłączone kolejno do PD0, PD1,
    jedna ma mieć wypełnienie PWM 10 a druga 255,
    programowe pwm 8 bitowe, zbocze narastające, mikrokontroler atmega8

    na przykładzie kodu załapie o co chodzi z tym programowym PWM :)
  • #19 5507685
    szelus
    Poziom 34  
    
    #define LED_1_ON()     (PORTD |= 1)
    #define LED_1_OFF()    (PORTD &= 0xfe)
    #define LED_2_ON()     (PORTD |= 2)
    #define LED_2_OFF()    (PORTD &= 0xfd)
    
    uint8_t krok;
    
    volatile uin8_t led1_pwm, led2_pwm;
    
    
    SIGNAL (SIG_OVERFLOW0)
    {
    
        if (++krok == 0)
        {
            if (led1_pwm > 0)
            {
                LED_1_ON();
            }
            if (led2_pwm > 0)
            {
                LED_2_ON();
            }
            
        }
        else
        {
            if (krok >= led1_pwm)
            {
                LED_1_OFF();
            }
            if (krok >= led2_pwm)
            {
                LED_2_OFF();
            }
        }
    }
    
    main()
    {
    
        krok = 0;
        /* inicjalizacja, konfiguracja portow,                           *
         * inicjalizacja timera 0 - tryb CTC,  przerwania co 10ms itd... */
    
        sei();
    
        led1_pwm = 10;
        led2_pwm = 255;
    
        while (1) volatile asm("nop");
    
    }
    


    Taki szkielet. Pominąłem szczegóły inicjalizacji. Założyłem, że LEDy są wpięte pomiędzy wyjście a masę (zapalane stanem wysokim).
    Nie wiem, co miałeś na myśli pisząć o zboczu narastającym...

    Można to też zrobić na opóźnieniach, ale zawsze uważałem, że od mierzenia czasu są timery :)
  • #20 5518098
    asembler
    Poziom 32  
    Czegos nie rozumiem. Na początku mówione było o 8 kolorach a teraz mówi sie o 8 bitach PWm na kolor to bedzie 16 milionów kolorów jak sie nie myle. Przy 3 bitach na kolor bedzie 512 kolorów? Jeżeli tako to programowe PWM na wszystkich nogach Atmegi8 so bardzo proste.
REKLAMA