Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Lampka RGB by molszewski

molszewski 19 Apr 2013 19:15 20424 24
Altium Designer Computer Controls
  • Lampka RGB by molszewski


    Zaprezentować dziś chcę projekt lampki RGB który wykonałem na pracę zaliczeniową z systemów wbudowanych. Moim zdaniem osiągnięty efekt jest zadowalający więc może ktoś będzie zainteresowany wykonaniem urządzenia według mojego projektu.

    Jako, że jest to pierwszy zrealizowany przeze mnie projekt w którym wykorzystałem mikrokontroler, proszę o wyrozumiałość a zarazem o rady co warto było by poprawić na przyszłość w kolejnych projektach.

    Opis urządzenia:
    Wykonana przeze mnie lampka sterowana jest przez mikrokontroler Attiny 2313, do sterowania jasnością świecenia diod wykorzystałem trzy kanały PWM pracujące w odwróconym trybie Fast PWM.

    Początkowo kanały PWM pracowały w trybie Fast PWM jednak efekt nie był dla mnie zadowalający z powodu szpilek przy zerowym wypełnieniu (jeden z kolorów nie wygasał całkowicie).

    Urządzenie sterowane jest za pomocą czterech przycisków. Przyciskiem 1 (PROGRAM) zmieniamy tryb świecenia, przyciskiem 2 (HOLD) ustawiamy blokadę wyświetlanego koloru, przyciski 3 (+) i 4 (-) służą w zależności od wybranego trybu albo do regulacji tempa przejść pomiędzy kolorami lub wyboru kolorów zapisanych w pamięci.

    Dodatkową funkcją przycisku 2 (HOLD) jest zapisywanie aktualnie wyświetlanego koloru do pamięci eeprom mikrokontrolera. Dzięki temu gdy wylosowany zostanie kolor który nam się spodoba możemy zatrzymać na nim animację co spowoduje jego zapisanie w pamięci, dzięki temu nawet po wyłączeniu urządzenia mamy później możliwość powrócić do koloru który nam się podobał (należy go wybrać w trybie 1 w którym kolory pobierane są z pamięci). Ponowne zatrzymanie animacji nadpisuje wcześniej zapisany kolor!

    Urządzenie zapamiętuje w eepromie także swoją konfigurację, dzięki temu po odłączeniu od zasilania nie musimy od nowa go ustawiać. Urządzenie uruchamia się z takimi nastawami z jakimi zostało wyłączone (wybrany program, szybkość animacji itp.).

    Obsługa przycisków odbywa się w przerwaniu zewnętrznym wyzwalanym stanem niskim na wejściu. By wyzwalało je wciśnięcie każdego z przycisków zastosowałem 4 diody. W momencie naciśnięcia któregoś z przycisków, jedna z diod zostaję połączona do masy co wywołuje stan niski na pinie generującym przerwanie.

    We wszystkich pinach wejściowych aktywowane zostały rezystory podciągające dlatego sprawdzanie który przycisk jest wciśnięty odbywa się poprzez sprawdzenie stanu niskiego.

    Drgania styków wyeliminowałem programowo poprzez wykorzystanie przerwania zegarowego. Po wystąpieniu przerwania ustawiona na określoną wartość zostaje flaga. W przerwaniu generowanym przepełnieniem zegara wartość flagi zmniejsza się o 1, aż do ponownego osiągnięcia wartości 0. W tym czasie (gdy trwa odliczanie do 0) nie następuje obsługa sygnałów wejściowych – są one ignorowane.

    Jako, że sterowanie jasnością odbywa się przez PWM, można spokojnie zastosować tranzystory do sterowania diodami. Tranzystory są praktycznie cały czas albo otwarte albo zamknięte więc nie przegrzewają się i nie generują strat mocy.

    Urządzenie posiada 4 tryby pracy:

    Program 1: Statyczne kolory
    - W trybie tym urządzenie wyświetla 1 z 13 zapisanych w swojej pamięci kolorów. Zmiana koloru odbywa się za pomocą przycisków "+" i "-". Kolor nr 1 jest edytowalny - użytkownik może wpisać w jego miejsce dowolną inną barwę poprzez wciśnięcie przycisku "HOLD" w momencie wyświetlania pożądanego koloru (np. w trybie losowych kolorów lub trybie tęczy).

    Program 2: Tęcza (przejścia pomiędzy kolorami R->G->B)
    - W trybie tym następuje płynne przejście pomiędzy kolorami, poczynając od koloru czerwonego poprzez zielony do niebieskiego. Cykl ten jest ciągle powtarzany. Użytkownik może ustawić tempo animacji poprzez naciśnięcie przycisków "+" lub "-", które powodują odpowiednio zwolnienie lub przyspieszenie zmian kolorów (+ oznacza wydłużenie opóźnień).

    Program 3: Losowe kolory z płynnym przejściem
    - W trybie tym następuje wyświetlanie losowych kolorów. Przejście pomiędzy wylosowanymi kolorami jest płynne. Użytkownik może regulować czas wyświetlania danego koloru za pomocą przycisków "+" i "-".

    Program 4: Rozjaśnianie i Ściemnianie
    - W trybie tym następuje wyświetlanie kolorów zapisanych w pamięci urządzenia. Pomiędzy każdym z kolorów następuje sekwencja ściemniania i rozjaśniania tzn. obecny kolor zostaje wygaszony następnie płynnie zapala się kolejna barwa. Użytkownik może regulować czas wyświetlania danego koloru za pomocą przycisków "+" i "-". Czas animacji (przejście od jednego do drugiego koloru) jest stały.

    Do realizacji urządzenia wykorzystałem ogólno dostępne i tanie podzespoły elektroniczne. Płytka drukowana została przygotowana w domowych warunkach (na żelazku) metodą termotransferu.
    Program sterujący mikrokontrolerem napisany został w środowisku Atmel Studio 6.0, w języku C. Do programowania mikrokontrolera posłużył program avrdude z nakładką AVR8 Burn-O-Mat v2 oraz programator USBAsp. Schemat elektroniczny, schemat płytki drukowanej przygotowany został w programie Eagle 6.4.0.

    Czekam na opinie dotyczące mojego projektu w szczególności na uwagi odnośnie programu, ponieważ do oceny urządzenie oddaje dopiero w niedziele to jeszcze może coś zdążył bym poprawić.

    By nie zostać posądzonym o plagiat podpisuję się pod projektem imieniem i nazwiskiem :) Pozdrawiam
    Mateusz Olszewski

    Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski Lampka RGB by molszewski

    Code: c
    Log in, to see the code

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    molszewski
    Level 10  
    Offline 
    molszewski wrote 29 posts with rating 34, helped 0 times. Live in city Busko-Zdrój. Been with us since 2007 year.
  • Altium Designer Computer Controls
  • #3
    maciek_90
    Level 13  
    Po co jest ta dioda D2? Bo tak próbuje wymyśleć dla niej zadanie i nie bardzo potrafie.
  • #5
    maciek_90
    Level 13  
    Duże kondensatory to się zawsze dawało przed stabilizatorem, no ale nie będę się kłócił z notą katalogową, dzięki za wyjaśnienie. Ale w szkole i tak mnie inaczej uczyli :D. Sam projekt ok, a jaka jest f PWM nie ma widocznego migotania?
  • #6
    leonow32

    Level 30  
    Przy pisaniu programu zwróć uwagę na pewne szczegóły, które mogą zmarnować kilka godzin na szukaniu błędów...

    Code: c
    Log in, to see the code

    Po uruchomieniu programu wpisujesz dane do rejestrów w prawidłowy sposób, likwidując wcześniejszą wartość i tu wszystko jest OK, ale parę linijek niżej...

    Code: c
    Log in, to see the code

    W tym miejscu milcząco zakładasz, że te rejestry są wyzerowane, a Ty chcesz tylko ustawić jedynkę na CS00 (btw w drugiej linii powinno być CS10), ale jeśli w tym rejestrze przypadkowo znajdzie się jakiś śmieć? OK, po zresetowaniu procesora ten rejestr jest wyzerowany, ale skąd wiadomo, że procesor otrzymał prawidłowy sygnał resetujący? Tu jest haczyk, na który sam się kiedyś nadziałem ;) Tak więc najlepiej założyć, że po wystartowaniu programu wartość rejestrów jest nieznana i wpisywać do nich dane przy pomocy operatora = a nie |=
  • #7
    Sabre
    Level 18  
    dondu wrote:
    Zaglądnij do datasheet 7805, tam wszystko ładnie opisane :)
    Albo tutaj: http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html


    Ładnie wprowadzasz w ślepą uliczkę wszystkich elektrodowiczów i czytelników twojego bloga. Sam stwarzasz problem aby go później rozwiązać dodatkowym niepotrzebnym elementem. Producenci stabilizatorów zalecają pojemności rzędu 100nF na wyjściu stabilizatora, maksymalnie do 10uF. Ty zalecasz pojemności rzędy większe 100-200uF, przez co oczywiście wyjście stabilizatora jest obciążone dużą pojemnością co wymusza stosowanie tej dodatkowej diody.

    Cytując dalej z jedynej dokumentacji stabilizatorów firmy ST, którą linkujesz na blogu (w dokumentacjach innych producentów tego nie ma):

    Quote:
    Application with high capacitance loads and an output voltage greater than 6 volts need an external diode (see Figure 23 on page 34) to protect the device against input short circuit.


    Więc znowu, ta dioda zgodnie z zaleceniami producenta w tym układzie nie jest potrzebna gdyż napięcie wyjściowe jest 5V.

    Podsumowując, ten układ ma źle zaprojektowany układ zasilający.
  • #8
    yogi009
    Level 43  
    Całkiem przyzwoity projekt, można tu ew. poprawić (na przyszłość) kilka detali. Warstwa opisowa nie jest konsekwentna, albo drukuj same nazwy elementów, albo także ich wartości (wtedy wszystkie). Wartości czasem warto skrócić (zobacz opis diody). Z drugiej strony płytki w oczy rzuca się brak dobrej jakości topnika. Traktuje te uwagi jako konstruktywną krytykę. Pozdrawiam i życzę kolejnych projektów.
  • Altium Designer Computer Controls
  • #9
    Pablo2015
    Level 18  
    Witam,

    1)na schemacie masz jedną diodę LED RGB, a na płytce jest 3,

    2)nie prowadź ścieżek pod kątem prostym,

    3)fajnie że obróciłeś rezystor- f.Angle, robi to mało kto, a nie raz naprawdę warto :-),

    4)skoro położyłeś stabilizator (w dziwny sposób), mogłeś do tego użyć stosownej biblioteki, z położonym już elementem,

    5)zabezpiecz ścieżki,

    6)po co diody przy przyciskach? Zakładam, że chodzi o drgania styków? Nie można tego niwelować programem?

    7)procesor ATTiny2313 ma Enhanced Power-on Reset Circuit i nie wymaga podłączania niczego do pinu Reset.

    Poza tymi kilkoma pierdółkami wszystko jak najbardziej OK ;-) Fajnie zobaczyć inną lampkę RGB niż projekt Pana M:-) (który też jest super).

    Pozdrawiam i życzę dalszych sukcesów.
    Pablo201_5
  • #10
    bozar88
    Level 13  
    W swoim kodzie zmieniasz wartość rejestrów OCR** liniowo, co przekłada się na bardzo nieliniową jasność - na początku diody rozbłyskują nagle, aby potem jedynie nieznacznie ją zwiększać (coś jak wykres y=sqrt(x)). Innymi słowy zmiana OCR od 1 do 11 jest o wiele bardziej zauważalna dla oka niż od 241 do 251.
    Zastosuj tablicę (LUT - lookup table) 256 wartości będących trochę odwrotnością tej funkcji, tzn. każda następna wartość jest o sqrt(2)≈1.4142 większa od poprzedniej. Jeśli nie chcesz tego liczyć ręcznie, tu masz gotowca z Excela:
    Code: c
    Log in, to see the code
    Wtedy piszesz np. OCR1A = pgm_read_byte(&LUT[red]). LUT możesz przechowywać we flashu, bo pewnie masz go dużo wolnego, a zajmie 256B. Zaimplementowałem to na drobnym ATTiny13, w mojej lampce i wszystko pięknie się zmieściło.
    Dzięki temu trikowi uzyskasz płynniejsze, a dokładniej liniowe zmiany kolorów, co poskutuje przyjemniejszą dla oka animacją.
  • #11
    molszewski
    Level 10  
    dondu wrote:
    Przydałby się filmik :)

    Niestety filmik marnej jakości. Nie posiadam jeszcze żadnego elementu który rozpraszał by światło więc w celu uwidocznienia kolorów wykorzystałem małe pudełko. Kolory na filmie są mocno przełamane - w rzeczywistości są dużo bardziej wyraziste (dodatkowo niektóre odcienie jakby zostały uśrednione).



    maciek_90 wrote:
    Po co jest ta dioda D2? Bo tak próbuje wymyśleć dla niej zadanie i nie bardzo potrafie.

    Jako, że marny ze mnie elektronik (lepiej czuję się od strony programowej), posiłkowałem się poradami znalezionymi w internecie. Układ zasilania zaczerpnąłem z bloga wskazanego przez dondu:
    dondu wrote:


    lenow32 wrote:
    Przy pisaniu programu zwróć uwagę na pewne szczegóły, które mogą zmarnować kilka godzin na szukaniu błędów...

    Kod C - [rozwiń]
    TCCR0A = (1 << WGM00) | (1 << WGM01);
    TCCR1A = (1 << WGM10) | (1 << WGM12);

    Po uruchomieniu programu wpisujesz dane do rejestrów w prawidłowy sposób, likwidując wcześniejszą wartość i tu wszystko jest OK, ale parę linijek niżej...

    Kod C - [rozwiń]
    TCCR0B |= (1 << CS00);
    TCCR1B |= (1 << CS00);

    W tym miejscu milcząco zakładasz, że te rejestry są wyzerowane, a Ty chcesz tylko ustawić jedynkę na CS00 (btw w drugiej linii powinno być CS10), ale jeśli w tym rejestrze przypadkowo znajdzie się jakiś śmieć? OK, po zresetowaniu procesora ten rejestr jest wyzerowany, ale skąd wiadomo, że procesor otrzymał prawidłowy sygnał resetujący? Tu jest haczyk, na który sam się kiedyś nadziałem Tak więc najlepiej założyć, że po wystartowaniu programu wartość rejestrów jest nieznana i wpisywać do nich dane przy pomocy operatora = a nie |=

    Bardzo cenna uwaga, zapamiętam na przyszłość. Dzięki.

    yogi009 wrote:
    Całkiem przyzwoity projekt, można tu ew. poprawić (na przyszłość) kilka detali. Warstwa opisowa nie jest konsekwentna, albo drukuj same nazwy elementów, albo także ich wartości (wtedy wszystkie). Wartości czasem warto skrócić (zobacz opis diody). Z drugiej strony płytki w oczy rzuca się brak dobrej jakości topnika. Traktuje te uwagi jako konstruktywną krytykę. Pozdrawiam i życzę kolejnych projektów.

    Także dziękuje za uwagi. Do samej płytki zbytnio się nie przyłożyłem ponieważ jej realizacja nie była w zadaniu wymagana, nie mniej jednak też wychodzę z założenia, że jak coś robić to trzeba robić to dobrze - stąd moje prośby o uwagi ponieważ bardzo nie lubię robić czegoś niezgodnie z przyjętymi standardami.

    Pablo2015 wrote:
    Witam,

    1)na schemacie masz jedną diodę LED RGB, a na płytce jest 3,

    2)nie prowadź ścieżek pod kątem prostym,

    3)fajnie że obróciłeś rezystor- f.Angle, robi to mało kto, a nie raz naprawdę warto ,

    4)skoro położyłeś stabilizator (w dziwny sposób), mogłeś do tego użyć stosownej biblioteki, z położonym już elementem,

    5)zabezpiecz ścieżki,

    6)po co diody przy przyciskach? Zakładam, że chodzi o drgania styków? Nie można tego niwelować programem?

    7)procesor ATTiny2313 ma Enhanced Power-on Reset Circuit i nie wymaga podłączania niczego do pinu Reset.

    Poza tymi kilkoma pierdółkami wszystko jak najbardziej OK Fajnie zobaczyć inną lampkę RGB niż projekt Pana M (który też jest super).

    Pozdrawiam i życzę dalszych sukcesów.
    Pablo201_5

    Dzięki za uwagi. Tak więc:

    1. W eagle nie mogłem znaleźć diody RGB więc zastosowałem taki półśrodek w celu uwidocznienia na schemacie jak to ma być połączone.

    2 i 7. Cenna rada na przyszłość.

    3. No niestety przy projektowaniu płytki nie odwróciłem tranzystorów, zauważyłem to dopiero jak już miałem wlutowane rezystory i diody więc nie zmieniałem opisu elementów na mojej płytce. W załącznikach jest już wersja poprawiona.

    4. O tym żeby stabilizator był leżący zdecydowałem dopiero jak go wlutowywałem. Gdybym założył to sobie na etapie projektowania płytki pewnie położył bym go standardowo (bez wątpienia mój błąd). Nie mniej w tym wypadku pozycja leżąca (nawet na brzuszku;]) pozwala zaoszczędzić trochę miejsca dzięki temu urządzenie może być niższe.

    5. Ścieżki wymazałem roztworem kalafonii ze spirytusem, jednak chyba za mało tego dałem bo ścieżki się gdzieniegdzie utleniają.

    6. Diody przy przyciskach powiedzmy, że są swego rodzaju bramką OR. Przyciski obsługiwane są w przerwaniu zewnętrznym wywoływanym stanem niskim na PD2. Te diody są po to, żeby wciśnięcie któregokolwiek z przycisków powodowało wystąpienie na tym pinie stanu niskiego.
    Drgania styków wyeliminowałem programowo z wykorzystaniem timera.


    bozar88 wrote:
    W swoim kodzie zmieniasz wartość rejestrów OCR** liniowo, co przekłada się na bardzo nieliniową jasność - na początku diody rozbłyskują nagle, aby potem jedynie nieznacznie ją zwiększać (coś jak wykres y=sqrt(x)). Innymi słowy zmiana OCR od 1 do 11 jest o wiele bardziej zauważalna dla oka niż od 241 do 251.
    Zastosuj tablicę (LUT - lookup table) 256 wartości będących trochę odwrotnością tej funkcji, tzn. każda następna wartość jest o sqrt(2)≈1.4142 większa od poprzedniej. Jeśli nie chcesz tego liczyć ręcznie, tu masz gotowca z Excela:
    Code: c
    Log in, to see the code
    Wtedy piszesz np. OCR1A = pgm_read_byte(&LUT[red]). LUT możesz przechowywać we flashu, bo pewnie masz go dużo wolnego, a zajmie 256B. Zaimplementowałem to na drobnym ATTiny13, w mojej lampce i wszystko pięknie się zmieściło.
    Dzięki temu trikowi uzyskasz płynniejsze, a dokładniej liniowe zmiany kolorów, co poskutuje przyjemniejszą dla oka animacją.

    Rozwiązanie jak najbardziej słuszne. Tak jak kolega pisze zmiana jasności w mojej lampce jest liniowa a ludzkie zmysły nie działają liniowo tylko logarytmicznie więc zastosowanie tego rozwiązania dało by bez wątpienia lepszy efekt.
    Flasha mam zajętego równo w 100% (co do bita;]) jednak mam 60% wolnego eeproma, więc można by po małej optymalizacji kodu zaimplementować rozwiązanie proponowane przez kolegę bozar88.

    Jeszcze raz dziękuje wszystkim za porady. Będą bez wątpienia przydatne na przyszłość. Pozdrawiam.
  • #12
    dondu
    Moderator on vacation ...
    Sabre wrote:
    Ładnie wprowadzasz w ślepą uliczkę wszystkich elektrodowiczów i czytelników twojego bloga. Sam stwarzasz problem aby go później rozwiązać dodatkowym niepotrzebnym elementem. Producenci stabilizatorów zalecają pojemności rzędu 100nF na wyjściu stabilizatora, maksymalnie do 10uF. Ty zalecasz pojemności rzędy większe 100-200uF, przez co oczywiście wyjście stabilizatora jest obciążone dużą pojemnością co wymusza stosowanie tej dodatkowej diody.

    Cytując dalej z jedynej dokumentacji stabilizatorów firmy ST, którą linkujesz na blogu (w dokumentacjach innych producentów tego nie ma):

    Quote:
    Application with high capacitance loads and an output voltage greater than 6 volts need an external diode (see Figure 23 on page 34) to protect the device against input short circuit.


    Więc znowu, ta dioda zgodnie z zaleceniami producenta w tym układzie nie jest potrzebna gdyż napięcie wyjściowe jest 5V.


    Kolego Sabre, artykuł pokazuje i wyjaśnia do czego ta dioda służy oraz kiedy należy dodać większe kondenstory.

    W sprawie diody D2 jestem tego samego zdania co inżynierowie Texas Instruments:

    Texas Instruments wrote:
    In general, these protective diodes are a good idea on all positive regulators.

    Dlatego niezależnie od napięcia wyjściowego regulatora warto zastosować diodę D2 - to tzw. dobre praktyki kosztujące na dzień dzisiejszy 4 grosze.

    Pomijam już fakt, że zastosowanie D2 ma także wpływ na szybsze odcięcie zasilania mikrokontrolera po wyłączeniu zasilania głównego, co także jest dobrą praktyką w projektowaniu urządzeń sterujących.


    Sabre wrote:
    Producenci stabilizatorów zalecają pojemności rzędu 100nF na wyjściu stabilizatora, maksymalnie do 10uF. Ty zalecasz pojemności rzędy większe 100-200uF, ...


    Nigdzie nie zalecam takich pojemności jak podajesz, radzę czytać ze zrozumieniem coś co się krytykuje - podałem zakres od 10uF. Co więcej w artykule jest schemat z wyłącznie z kondensatorami 0,33uF i 0,1uF, a dopiero poniżej kilka zasad ewentualnego dobierania dodatkowych magazynów energii. A dlaczego tylko zasady? Ponieważ faktyczna wielkość i ilość kondensatorów magazynujących zależą od projektu urządzenia w tym także od projektu PCB, a nie od sztywnej zasady, że ma być tak jak w datasheet regulatora napięcia.

    Co więcej na początku artykułu napisałem:

    Quote:
    Dobre praktyki zasilania mikrokontrolerów
    - ...
    - stabilizator wraz z kondensatorami które znajdziesz w jego datasheet, powinien gwarantować stabilne zasilanie przy największym możliwym poborze mocy przez projektowany układ,
    - ...



    Proszę więc ponownie czytaj całość, a nie pojedyncze zdania i spróbuj zrozumieć co autor chciał przekazać, zanim zarzucisz komuś wprowadzanie czytelników w ślepą uliczkę.

    Nie podważam oczywiście fragmentu datasheet, który zacytowałeś.


    EDIT:
    @molszewski
    No teraz widać co układ potrafi :)
    Dobrze, że dodałeś ten filmik.
  • #13
    PiotrPitucha
    Level 33  
    Witam
    Pomarudzę na temat sterowania diodami w układzie wtórnika emiterowego, nie jest to dobry pomysł, strata napięcia na tranzystorze jest trudna do przewidzenia, szczególnie gdyby trzeba wymusić większe prądy.
    W zasadzie bez zmian układowych możnaby tam wsadzić tranzystory PNP i zastosować odwróconą logikę na wyjściu.
    Pozdrawiam Piotr
  • #15
    diodmen
    Level 1  
    Cześć, jak możesz to przyślij dokładniejszy schemat. Np. na schemacie r1 ile Ω lub kΩ. Jaka to płytka?
    Diodmen.
  • #17
    Brutus_gsm
    Level 25  
    Skoro już jesteśmy przy konstruktywnych krytykach, to i ja dodam kilka uwag:

    1) Schemat jest bardzo słabo czytelny. Staraj się stosować Vcc i GND, bo np. okolice resetu wyglądają na pierwszy rzut oka co najmniej dziwnie. Warto rozdzielić sekcje zasilania i głównego obwodu. Oto kawałek jakiegoś mojego projektu - sam powiedz, czy nie jest bardziej czytelnie?
    Lampka RGB by molszewski

    2) Schemat blokowy - świetna sprawa. Mało jest konstrukcji na forum, które takie coś przedstawiają. Bardzo to pomaga podczas pisania oprogramowania, ale sam nigdy nie mam weny, żeby takie coś zrobić.

    3) Jeśli już eliminujesz drgania styków programowo i w dodatku z użyciem timera, to mogłeś się pokusić o tak samo zrealizowane opóźnienia. [ciach - wprowadzanie w błąd ;) ]

    4) Diody przy przyciskach można usunąć i rozwiązać to trochę inaczej. Zmniejszy to ilość elementów oraz uprości płytkę. Jeśli chcesz, aby występowało przerwanie INT0, to podłączasz przyciski tak, żeby wspólnym końcem podłączone były do INT0 zamiast do masy. Przeciwnymi stronami do dowolnych pinów mikrokontrolera (mogą zostać tak jak teraz). Następnie w programie głównym podciągasz wejście INT0 do 5V, a na pozostałych pinach obsługujących ustawiasz stan niski. Wystąpienie przerwania ustawiasz na zbocze opadające albo na poziom niski. W przerwaniu zamieniasz role pinów, tj. na INT0 ustawiasz stan wysoki i sprawdzasz na którym wejściu, przy którym przycisku pojawił się stan wysoki. Może niezbyt jasno to wytłumaczyłem, ale to jest naprawdę łatwe ;) Taka konstrukcja umożliwia także usypianie i wybudzanie procesora przerwaniem INT0. Możesz spojrzeć w kod mojego starego pilota RC5 (sam wykorzystywałem kiedyś delay'e, wiem o tym ;) )
    Code: c
    Log in, to see the code


    5) Płytkę warto pocynować przed lutowaniem.


    Gratulacje projektu :)
  • #18
    molszewski
    Level 10  
    Dzięki wszystkim za opinie.
    Oddałem dziś projekt został oceniony na 5;]

    Dokonałem kilku zmian w programie więc wrzucam nową wersję:

    Code: c
    Log in, to see the code

    Najważniejsza zmiana to dodanie nieliniowej zmiany jasności. Udało mi się jedynie wygospodarować miejsce na tablicę 128 bajtów więc wartości dla 2 liczb są zawsze uśrednione (np. ta sama wartość dla: 0 i 1, 2 i 3, 4 i 5 ... 244 i 255).
    Zmieniłem także dość zakręconą funkcję przejścia pomiędzy losowanymi kolorami. Teraz wartości są wyliczane ze wzoru na interpolację liniową.

    W programie znajdują się 2 tablice. Jedna (wykomentowana) jest to rozkład zgodny ze schematem z posta kolegi bozar88,
    druga tablica jest to rozkład zgodny ze wzorem (x*x+254)/255.
    Dla mnie ten pierwszy wydawał się trochę zbyt nieliniowy;] nie mniej jak ktoś ma ochotę to można zakomentować 2 tablicę a wykorzystać pierwszą.
    Poniżej wrzucam wykres na którym widać różnicę wartości (na bordowo zależność z tablicy 2, na niebiesko z tablicy 1, kolor błękitny to zależność liniowa):
    Lampka RGB by molszewski


    Brutus_gsm wrote:
    Jeśli już eliminujesz drgania styków programowo i w dodatku z użyciem timera,
    to mogłeś się pokusić o tak samo zrealizowane opóźnienia. Mnóstwo pamięci pożera ci zainkludowany plik delay.h. Program z pustą pętlą while zajmuje 122 bajtów pamięci flash. Program z użytym _delay_ms() zajmuje 3242 bajtów!.(sprawdzane na atmega16).


    Podczas dzisiejszej walki o pamięć programu zrobiłem eksperyment, wywaliłem bibliotekę delay.h i zrobiłem własną funkcję opóźniającą. W przerwaniu zegarowym zmniejszana była wartość pewnej zmiennej. Funkcja opóźniająca ustawiała tą zmienną na zadaną wartość następnie w pętli while odczekiwałem aż zmienna znów osiągnie wartość 0 i wtedy program wracał do wykonywania głównego zadania.
    Niestety wynik tego był taki, że program się nie zmniejszył a wręcz doszło kilkadziesiąt bajtów. Nie wiem czemu się tak stało. Biblioteka i wszystkie jej funkcje były na 100% wykomentowane.

    Co do rozmiaru programu z użyciem _delay_ms() to wartość 3242 bajtów wydaje mi się mocno zawyżona. Cała pamięć attiny to 2KB chyba, że dla atmega 16 jest jakaś inna implementacja.
  • #19
    Brutus_gsm
    Level 25  
    molszewski wrote:
    Co do rozmiaru programu z użyciem _delay_ms() to wartość 3242 bajtów wydaje mi się mocno zawyżona. Cała pamięć attiny to 2KB chyba, że dla atmega 16 jest jakaś inna implementacja.

    Kurcze faktycznie, dopiero teraz zauważyłem, że próbę robiłem na jakimś starym projekcie z wyłączoną optymalizacją... Także - wycofuję się z tego co napisałem i przepraszam za wprowadzanie w błąd.
  • #20
    wirefree2
    Level 13  
    TI podaje takie rozwiązanie ale to dotyczy przypadku sportow extremalnych czyli nie zdażających się w praktyce dla stabilizatora 5V :

    "reverse-bias protection
    Occasionally, the input voltage to the regulator can collapse faster than the output voltage. This can occur, for
    example, when the input supply is crowbarred during an output overvoltage condition. If the output voltage is
    greater than approximately 7 V, the emitter-base junction of the series-pass element (internal or external) could
    break down and be damaged. To prevent this, a diode shunt can be used as shown in Figure 7."


    Musiałbyś zewrzeć wejście ukladu a na wyjściu musiało by być 7 lub wiecej V.
    W praktyce dla twojego ukladu taki wyjątek na nastąpi bo na wejściu masz pojemność i diode a na wyjściu 5V.
  • #21
    dondu
    Moderator on vacation ...
    TI podaje także tak:

    Quote:
    In general, these protective diodes are a good idea on all positive regulators.

    To tak zwana dobra praktyka kosztująca w tym wypadku 4 grosze.

    Ponowię jeszcze ten argument:

    Dondu wrote:
    Pomijam już fakt, że zastosowanie D2 ma także wpływ na szybsze odcięcie zasilania mikrokontrolera po wyłączeniu zasilania głównego, co także jest dobrą praktyką w projektowaniu urządzeń sterujących.

    podany powyżej.

    Nie chcesz, to nie dajesz. Twój wybór.
  • #22
    wirefree2
    Level 13  
    Wybacz ale stosowanie bezużytecznej diody nazywasz dobrą praktyką ? Dobra praktyka to jest stosowanie kondensatorów tantalowych zamiast elektrolitów w ukladach zasilania szkoda że nikt tego nie propaguje.
  • #23
    dondu
    Moderator on vacation ...
    wirefree2 wrote:
    Wybacz ale stosowanie bezużytecznej diody nazywasz dobrą praktyką ? Dobra praktyka to jest stosowanie kondensatorów tantalowych zamiast elektrolitów w ukladach zasilania szkoda że nikt tego nie propaguje.

    Nie tylko ja tak sądzę :) :

    Texas Instruments wrote:
    In general, these protective diodes are a good idea on all positive regulators.

    Jak już powiedziałem, nie chcesz, to nie stosuj - Twój wybór.

    Poza tym nie odniosłeś się do drugiego argumentu ...
  • #24
    diodman
    Level 1  
    Witaj, molszewski,
    ta lampka RGB jest fajna :D :D :D . Chciałem się ciebie zapytać ,czy tę płytkę zrobiłeś sam czy kupiłeś ze sklepu :?:
    Diodman.
  • #25
    molszewski
    Level 10  
    diodman wrote:
    Witaj, molszewski,
    ta lampka RGB jest fajna :D :D :D . Chciałem się ciebie zapytać ,czy tę płytkę zrobiłeś sam czy kupiłeś ze sklepu :?:
    Diodman.


    Płytkę zrobiłem sam.

    Tutaj możesz sobie zobaczyć jak to się robi:
    https://www.youtube.com/watch?v=Ktw8kxV1Jzc&gl=PL&hl=pl

    Pod hasłem termotransfer znajdziesz w internecie masę informacji o robieniu płytek w domowych warunkach.