Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom sterowanie diodą RGB

heyka 06 Mar 2012 22:01 4093 29
  • #1 06 Mar 2012 22:01
    heyka
    Poziom 17  

    Witam, chciałbym zgłębić tajniki sterowania diodą RGB za pomocą mikroprocesora avr, programowanego za pomocą Bascoma.
    Moje rozumowanie jest następujące:
    -katody diody RGB dołanczam do trzech portów procesora,
    - z portów wychodzą sygnały PWM, w zależność od wypełnienia sygnałów na poszczególnych portach dioda świeci różnymi kolorami

    Pytanie
    -jaki procesor wybrać aby można było wyprowadzić sygnały PWM z trzech portów, czy nada sie do rgo ATMega8?

    Wiem żę zaraz otrzymam wiele odpowiedzi typu "wykorzystaj google", próbowałem szukać ale nigdzie nie mogę znalść aby było to dokładnie wytłumaczone.

    0 29
  • #2 06 Mar 2012 22:36
    Zocha24
    Poziom 21  

    Jeśli chodzi o programowy pwm to myśle że prawie każdy AVR da rade (atmega8 też), a jeśli chodzi o sprzętowy to dopiero o ile się nie mylę atmega128

    0
  • #3 06 Mar 2012 22:48
    heyka
    Poziom 17  

    Chciałbym to zrobić jak najprościej, a więc programowo, chodzi mi o poznanie zasady jak sie za o zabrać.

    0
  • #4 06 Mar 2012 22:54
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zocha24 napisał:
    Jeśli chodzi o programowy pwm to myśle że prawie każdy AVR da rade (atmega8 też), a jeśli chodzi o sprzętowy to dopiero o ile się nie mylę atmega128

    A skąd ta wiedza? Bo chyba nie z książek ani datasheetów?

    @heyka
    Jak rozumie jesteś na samym początku drogi. W takim razie zastanów się czy iść drogą BASCOMa: LED + PWM + ludzkie oko

    0
  • #5 06 Mar 2012 22:54
    nanab
    Poziom 27  

    M8 ma 3x sprzętowy PWM. Najprościej będzie ich użyć.

    0
  • #6 06 Mar 2012 22:55
    Zocha24
    Poziom 21  

    Użyj timera do generowania przerwań, i co przerwanie będziesz inkrementować zmienne np R, G, B, i jak osiągną zadaną wartość ustawisz stan wysoki na odpowiednich pinach. gdy zmienne osiągną np 255 to je zerujesz. To się dzieje w przerwaniu. a w funkcji głównej masz pętle nieskończoną w której to mogą się zmieniać wartości R, G, B i tym samym tworzyć efekt zmieniania się kolorów, mam nadzieje że jasno wytłumaczyłem

    Przepraszam za pomyłke dawno nie widziałem datasheetów

    0
  • #7 07 Mar 2012 09:25
    heyka
    Poziom 17  

    ATMega ma trzy wyjścia PWM, rozumiem że są to: OC1A, OC1B oraz OC2, proszę o pomoc w skonfigurowaniu timera

    czy to może tak wyglądać?

    config timer1=pwm, pwm=8, compare a pwm=clear down,
    compare b pwm = clear down, prescale=1

    i jeszce jeżeli chodzi o pętle, czy przypisanie wartości realizuje się następujaco?
    przykladowo:
    pwm1a=200
    pwm1b=100
    ocr2=10

    jeżeli tak to rozumiem, że takie przypisanie powoduje podawanie sygnału na odpowiednie wyprowadzenie procesora z podanym wypełnieniem PWM?

    Dodano po 2 [godziny] 33 [minuty]:

    Proszę o podpowiedź czy poniższy kod zadziała?

    Code:

    $crystal = 1000000
    $regfile = "m8def.DAT"
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

    Dim R As Byte
    Dim G As Byte
    Dim B As Byte

    Enable Interrupts

    R = 255
    G = 255
    B = 255

    Do


    Wait 1

    Pwm1a = R
    Pwm1b = G
    Ocr2 = B

    Wait 1

    R = 170
    G = 255
    B = 255
    Pwm1a = R
    Pwm1b = G
    Ocr2 = B

    Wait 1

    R = 170
    G = 255
    B = 255
    Pwm1a = R
    Pwm1b = G
    Ocr2 = B

    Wait 1

    Loop


    0
  • #8 07 Mar 2012 09:34
    Zocha24
    Poziom 21  

    Musisz jeszcze ustawić drugi timer.

    0
  • #9 07 Mar 2012 11:05
    heyka
    Poziom 17  

    Drugi timer? Czy on służy do obsługi OCR2? Jak go ustawić?

    0
  • #10 07 Mar 2012 11:24
    Zocha24
    Poziom 21  

    Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Down , Pwm = On a i ładujesz do OCR0

    0
  • #11 07 Mar 2012 11:41
    heyka
    Poziom 17  

    Mam cos takiego:

    Code:

    $regfile = "m8def.dat"
    $crystal = 1000000

    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output


    Dim R As Byte
    Dim G As Byte
    Dim B As Byte



    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1

    Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Down , Pwm = On

    Do

    For R = 0 To 255
       Pwm1a = R
    Waitms 4
    Next R

    For R = 255 To 0 Step -1
       Pwm1a = R
    Waitms 4
    Next R

    For G = 0 To 255
       Pwm1b = G
    Waitms 7
    Next G

    For G = 255 To 0 Step -1
       Pwm1b = G
    Waitms 10
    Next G

    For B = 0 To 255
       Ocr2 = B
    Waitms 7
    Next B

    For B = 255 To 0 Step -1
       Ocr2 = B
    Waitms 13
    Next B


    Loop

    End


    Czy w powyższym kodzie mogę dodać Timer0 i od przerwania tego Timera mogę uruchamiać procedurę która pozwoliła by mi PO PRZYCIŚNIĘCIU PRZYCISKU, zmieniać efekt świecacej diody RGB, tz np chciałbym aby dioda świeciał ciągle w jednym kolorze, albo nie świeciła albo wykonywała płynne przejścia jak w kodzie powyżej.

    0
  • #12 07 Mar 2012 12:12
    Zocha24
    Poziom 21  

    Kolego poszukaj w polskiej pomocy bascoma tam wszystko jest dokładnie opisane

    0
  • #13 07 Mar 2012 12:24
    heyka
    Poziom 17  

    Oczywiście poszukam, chodziło mi tylko o to czy do obsługi przycisku powinienem zarządz do roboty Timer0, czy można wykorzystać np któryś z używanych juz Timerów?

    0
  • #14 07 Mar 2012 12:25
    Zocha24
    Poziom 21  

    Nie obsługę przycisków zrób w głównej pętli

    0
  • #15 07 Mar 2012 12:51
    heyka
    Poziom 17  

    Ok, tylko co jeżeli chciałbym żeby był np taki efekt: dioda świeci 4 sekundy na zielono, pozniej 4 sekundy na czerwono i powiedzmy 4 sekundy na żółto, jeżeli czas świecenia zrealizuję za pomocą funkcji Wait , to nici z obsługi przycisku w petli głównej, jeżeli bym to zrobił przerwaniem zewnętrznym wówczas program najpierw obsługuje przerwanie i sterowanie jest możliwe. Dobrze rozumuję?

    0
  • #16 07 Mar 2012 14:25
    Zocha24
    Poziom 21  

    koncepcja jest dobra, można wykorzystać przerwania INT0 i INT1

    0
  • #17 08 Mar 2012 09:48
    heyka
    Poziom 17  

    Poeksperymentowałem wczoraj, wszystko chodzi jak trzeba. Sterowałem diodą ze wspólną katodą, anody sterowałem wprost z wyprowadzeń procesora przez rezystory 330 om. Chciałbym rozbudować swoją lmpkę dodając kilka diód RGB. Wszystki narazie miały by działać jednocześnie więc połączyłbym je równolegle, tylko że pasowało by dodać tranzystor żeby nie obciążac wyjśc procesora. Posiadam BC 558, czy dobrze będzie jak do emitera dam +5V, bazę będe sterował przez rezystor 3,3k, z kolektora dam w szereg 330 om i led?

    Jak to zrealizuję chciałbym pójść dalej i spróbować sterować klikoma diodami rgb niezależnie, ale to chyba trzeba zrobić przez myltipleksowanie, a to już trochę wyższa szkoła jazdy.

    0
  • #18 08 Mar 2012 09:55
    Zocha24
    Poziom 21  

    Kolektor daj do + bazę przez rezystor do atmegi a emiter do diod z rezystorami

    0
  • #19 08 Mar 2012 11:57
    heyka
    Poziom 17  

    A sterowanie z procesora bedzie wówczas potencjałem ujemnym?

    0
  • #20 08 Mar 2012 20:40
    Zocha24
    Poziom 21  

    dodatnim jeśli to tranzystor npn a jeśli pnp to trzeba połączyć emiter do +, bazę przez rezystor do atmegi a kolektor do diod i wtedy zapalasz diody stanem niskim

    0
  • #21 10 Mar 2012 09:34
    heyka
    Poziom 17  

    Dzięki. Jeżeli masz jeszcze trochę cierpliwości dla mnie to proszę podpowiedz mi na czym polega realizacja programowego PWM, ATmega8 z diodą RGB działa świetnie, ale dla mnie to jak wynajmowanie TIR-a żeby przewieść kilogram cukru, chciałby zastosować jakiś mały procesorek Może ATtiny13 bo akurat taki mam.

    0
  • #22 22 Lut 2013 18:04
    heyka
    Poziom 17  

    Odświeżam temat, a jak wykonać sterowanie kilkoma, np. dwoma diodami, aby każda świeciła innym kolorem?

    0
  • #23 22 Lut 2013 18:17
    BlueDraco
    Specjalista - Mikrokontrolery

    Tak samo, jak jedną, ale razy 2 - 6 kanałów PWM.

    0
  • #24 23 Lut 2013 18:33
    heyka
    Poziom 17  

    tylko że sterowałem diodą przez sprzętowe pwm a w atmega 8 jest ich 3 więc nie mogę sterować sześcioma, trzebab by było użyć multipleksowania ale z tego co sie orietuję potrzebny jest do trgo timer, a timery sawykorzystane do generowania pwm.

    0
  • #25 23 Lut 2013 19:50
    emarcus
    Poziom 35  

    heyka napisał:
    tylko że sterowałem diodą przez sprzętowe pwm a w atmega 8 jest ich 3 więc nie mogę sterować sześcioma.


    Więc zastosuj ATMega48/88/168.
    Tam masz 6 kanałów PWM. Nawet możesz je dostac taniej niż ATMega8L (futurlec.com).

    e marcus

    0
  • #27 24 Lut 2013 13:29
    heyka
    Poziom 17  

    Jaka jest zasada programowgo pwm? Chcialbym to rozczaić.

    0
  • #28 24 Lut 2013 14:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Taka sama, jak sprzętowego, tylko musisz mieć przerwanie timera zgłaszane z częstotliwością równą iloczynowi częstotliwości PWM i liczby poziomów jasności - to zwykle za dużo na oprogramowanie tego w ciężkawej zabawce pt. Bascom.
    Jest na ten temat u Atmela dobra nota aplikacyjna.

    0
  • #29 24 Lut 2013 14:20
    heyka
    Poziom 17  

    A tak na chłopski rozum. PWM to wypełnienie sygnału, jak to zrealizować programowo? Sygnał podzielić za pomocą timera na "kawałki" i tym kawałkom nadawać odpowiednie długości? Czy dobrz rozumuję?

    0
  • #30 24 Lut 2013 16:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Odliczasz przerwania timera w cyklach po tyle przerwań, jaka jest długość okresu PWM (liczba możliwych stopni wypełnienia). Przez ileś okresów przerwań utrzymujesz na wyjściu poziom wysoki, przez pozostałe - niski. Odnajdź tę notę aplikacyjną u Atmela - tam jest to przyzwoicie zrobione.

    0