Program dla diody RGB - problem


Witam nie znalazłem podobnego temat więc założyłem ten. Mam taki mały problem, :) Mianowicie niedawno zająłem się programowaniem Attin2313 w Bascomie. Sugerując się kodem z pierwszego projektu lampki RGB na AT89C2051 napisałem podobny na Attiny2313. Moim zdaniem algorytm dla diody jest dobry i nie wiem co jest przyczyną niepoprawnej pracy. Po zaprogramowaniu cały czas świeci się czerwona dioda, zielona mruga niesynchronicznie a niebieska tylko mignie na samym początku. Pomoże ktoś z forumowiczów? Zamieszczam kod tego co udało mi się stworzyć :) Pozdrawiam RobkY...

Poniższy program jest już poprawiony i na pewno działa

'************************************************
'********** S T E R O W N I K    R G B **********
'************************************************
 
 
$regfile = "attiny2313.dat"
$crystal = 1000000                                          'częstotliwość na przyszłość należy zwiększyć
 
 
Config Portd = Output
 
'**** ZMIENNE ****
Dim Rled As Byte
Dim Gled As Byte
Dim Bled As Byte
Dim N As Byte
Dim Licznik As Byte
 
 
'**** NAZWY WYJŚĆ ****
Rd Alias Portd.2
Gd Alias Portd.1
Bd Alias Portd.0
 
 
'**** TIMER 0 ****
Config Timer0 = Timer , Prescale = 1
 
Enable Interrupts
Enable Timer0
On Timer0 Wyjscia
 
 
'**** POCZĄTEK ****
Rled = 100
Gled = 0
Bled = 0
N = 1
 
'**** PROGRAM GŁÓWNY ****
Do
 
  Select Case N                                             'płynne ustalone przejście kolorów - tęcza
 
    Case 1:                                                 'do żółtego
     Incr Gled
     If Gled = 100 Then N = 2
    Case 2:                                                 'do zielonego
     Decr Rled
     If Rled = 0 Then N = 3
    Case 3:                                                 'do morskiego
     Incr Bled
     If Bled = 100 Then N = 4
    Case 4:                                                 'do niebieskiego
     Decr Gled
     If Gled = 0 Then N = 5
    Case 5:                                                 'do fioletowego
     Incr Rled
     If Rled = 100 Then N = 6
    Case 6:                                                 'do czerwonego
     Decr Bled
     If Bled = 0 Then N = 1
  End Select
  Waitms 10
 
Loop
End
 
 
'**** PRZERWANIE TIMER 1 ****
Wyjscia:
 
Incr Licznik
 If Licznik = 100 Then Licznik = 0
 
 If Licznik < Rled Then
  Reset Rd
 Else
  Set Rd
 End If
 
 If Licznik < Gled Then
  Reset Gd
 Else
  Set Gd
 End If
 
 If Licznik < Bled Then
  Reset Bd
 Else
  Set Bd
 End If
 
Return
 
 
'**** KONIEC ****




Portret użytkownika Matt_x89

Witam Pierwsze co zauważyłem

Witam

Pierwsze co zauważyłem to w pętli Do Loop nasz przypisanie N =1 co oznacza że za każdym przebiegiem pętli do N jest wpisywane 1 i przez to nic się nie dzieje jeżeli jest spełniony warunek.
Co do częstotliwości procka to zwiększ ją do 8MHz bo dzięki temu uzyskasz zwiększa częstotliwość PWM. W Tinny są dwa Timery 8 i 16 bitowy. Zasad jest taka przy wyborze że jeżeli można osiągnąć ten sam cel na jednym i drugim to wybierz 8 bitowy. :)

Piszę w C i bascoma znam tylko podstawy ale troszkę popróbowałem na Atmega16 i prze kompilowałem Twój program. Zmień nagłówek do attiny3213 i daj znać czy działa :).

'************************************************
'********** S T E R O W N I K    R G B **********
'************************************************
 
$regfile = "m16def.dat"
$crystal = 1000000
 
 
Config Portd = &B11111111 : Portd = &B11111111
 
'**** ZMIENNE ****
Dim Rled As Byte
Dim Gled As Byte
Dim Bled As Byte
Dim N As Byte
Dim Licznik As Byte
 
 
'**** NAZWY WYJŚĆ ****
Rd Alias Portd.2
Gd Alias Portd.1
Bd Alias Portd.0
 
 
'**** TIMER 1 ****
Config Timer0 = Timer , Prescale = 1
 Enable Timer0 : On Timer0 Wyjscia
Enable Interrupts
 
 
 
'**** POCZĄTEK ****
Rled = 0
Gled = 0
Bled = 0
  N = 1                                                     ' w petli za każdym razem kolega wpisywał 1 do zmiennej N
 
'**** PROGRAM GŁÓWNY ****
Do
 
 
 
  Select Case N                                             'płynne ustalone przejście kolorów - tęcza
     'zwiekszam jasnosc czerwonego
    Case 1:                                                 'do żółtego
     Incr Rled
        If Rled = 100 Then N = 2
     'zmniejszam jasność czerwonego jednocześnie zwiekszajc jasnosc zielonego
    Case 2:
       Decr Rled
        Incr Gled
        If Rled = 100 Then N = 3
    Case 3:
    Decr Gled
    Incr Bled
        If Bled = 100 Then N = 4
    Case 4:
    Decr Bled
     If Bled = 0 Then N = 1
 
 
     End Select
    Waitms 15
Loop
End
 
 
'**** PRZERWANIE TIMER 1 ****
Wyjscia:
 
Incr Licznik
 If Licznik = 100 Then Licznik = 0
 
 If Licznik < Rled Then
  Reset Rd
 Else
  Set Rd
 End If
 
 If Licznik < Gled Then
  Reset Gd
 Else
  Set Gd
 End If
 
 If Licznik < Bled Then
  Reset Bd
 Else
  Set Bd
 End If
 
Return
 
 
'**** KONIEC ****

Portret użytkownika robert.p93

Udało się uruchomić, działa

Udało się uruchomić, działa jak należy tak i Twój program jak i mój po drobnej poprawce. Sęk był w tym że w głównej pętli brakowało opóźnienia 10-15 ms. Dodatkowo zmieniłem tak jak pisałeś Timer1 na Timer0 i N = 1 wyrzuciłem z pętli Do ... Loop. Zastanawiam się jeszcze jak zrealizować losowe przejścia kolorów? Masz może jakiś pomysł. Lampka RGB 2 Mirley`a super się prezentuje. Ale ja przeglądając kod nie bardzo go rozumiem, zwłaszcza interesują mnie te losowe kolory...
Dzięki wielkie za pomoc... Jak coś człowiekowi zacznie działać to jest większa motywacja do dalszej pracy. Dzięki, czekam na jakieś sugestie :):)

Portret użytkownika Matt_x89

Miło mi że pomogłem... :) Co

Miło mi że pomogłem... :) Co do losowych przejść kolorów to mam dwie proste propozycje jak to mogło by być:

'''*************Pierwsza propozycja
Do
 
  Rled = Rnd(100)
  Gled = Rnd(100)
  Bled = Rnd(100)
  Waitms 450
 
Loop
 
'*************** Druga propozycja
Do
 
 If Xyz = 100 Then
  Xyz = 0
  Rled = Rnd(100)
  Gled = Rnd(100)
  Bled = Rnd(100)
 End If
 
   Decr Rled
   Decr Gled
   Decr Bled
   Incr Xyz
    Waitms 15
 
Loop

Wyjaśnię jak to działa. W pierwszym przypadku będzie losowany kolor po czym procesor usypiam na 450ms żeby zobaczyć jaki kolor uzyskaliśmy. W następnym przebiegu losuję inny kolor. Do losowani używam funkcji Rnd(zakres). Jako jej argument podajesz zakres liczb z jakich ma losować w moim przypadku od 0 do 100.

W drugim przypadku jeżeli dodatkowa zmienna którą zadeklarowałem ma wartość 0 to losowane są wartości poszczególnych składowych RGB. Następnie wylosowane wartości są zmniejszane w każdym przebiegu pętli dopóki zmienna xyz nie osiągnie wartości 100 czego efektem jest ponowne wylosowanie wartości dla składowych RGB. Zakresy możesz wybierać dowolne, zachęcam do poczytania o funkcji Rnd().

Podmień w programie który wczoraj poprawiłeś pętle na te które zaproponowałem i sprawdź efekt ;) W przypadku drugiej pętli musisz zadeklarować zmienną Dim Xyz As Byte i ją wyzerować przed pętla Xyz = 0 na wszelki wypadek :)

Pozdrawiam

Portret użytkownika robert.p93

Pierwszy programik działa

Pierwszy programik działa super, losowe skokowe zmiany kolorów.
W drugim byłoby wszystko ok ale po zdekrementowaniu do 0 nowa wartość koloru np. Rled jest ustawiana skokowo i dopiero znowu zmniejszana, czyli nie jest to całkiem płynne, ale pobawiłem się trochę funkcją Rnd() i wymyśliłem sposób na losowe kolory. Mam jednak pewien problem nie wiem dlaczego nie losuje mi liczby Rand_r, Rand_g, Rand_b z poniższego kodu. Rled, Gled, Bled losowane są poprawnie. Linijka kodu z Rand_r wykonuje się ale nie losuje żadnej wartości, pozostaje 0. Sprawdzałem w symulacji. Proszę o pomoc w rozwiązaniu :):) Pozdrawiam.

Do
 
If Rled = 0 Or Rled = 100 Then                             
   Rled = Rnd(100)                                          'losuje wartość która bedzie incr lub decr
   Rand_r = Rnd(3)                                          'wybiera incr lub decr,               lecz tu właśnie nie wybiera nic...
End If
 
If Gled = 0 Or Gled = 100 Then
   Gled = Rnd(100)
   Rand_g = Rnd(3)
End If
 
If Bled = 0 Or Bled = 100 Then
   Bled = Rnd(100)
   Rand_b = Rnd(3)
End If
 
 
If Rand_r = 1 Then Incr Rled                                'incr wylosowaną wartośc do 100 następnie na początku programu znowu losuje
If Rand_r = 2 Then Decr Rled                                'decr wylosowaną wartość do 0 następnie na początku programu znowu losuje
 
If Rand_g = 1 Then Incr Gled
If Rand_g = 2 Then Decr Gled
 
If Rand_b = 1 Then Incr Bled
If Rand_b = 2 Then Decr Bled
Waitms 15
 
Loop
End

Próbowałem część programu Mirleya z lampki RGB 2 dot. losowania kolorów ale też nie działało poprawnie. Test był przy 1MHz ...

Portret użytkownika mirley

Re: RGB

A próbowałeś np dla Rnd(3) dac na chwile Rnd(100) i zobaczyć czy wtedy losuje. Może masz pecha i w symulacji kilka razy wypadło Ci 0 albo symulator źle działa.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika robert.p93

Dzięki za zainteresowanie.

Dzięki za zainteresowanie. Zwiększyłem wartość w Rnd poprawiło się losowanie lecz cały czas tylko decrementuje zmienne i skokiem wybiera następną wartość i znowu decrementuje. Nie mam pojęcia czemu to nie działa jak powinno.... Jeżeli masz jakieś cenne uwagi to podziel się nimi :) Pozdrawiam.

If Tryb = 4 Then
 
 Debounce , Pinb.0 , 0 , Przycisk , Sub
   If Rled = 0 Or Rled = 100 Then
     Rled = Rnd(100)                                        'losuje wartość która bedzie incr lub decr
     Rand_r = Rnd(41)                                           
   End If
 
   If Gled = 0 Or Gled = 100 Then
     Gled = Rnd(100)
     Rand_g = Rnd(41)
   End If
 
   If Bled = 0 Or Bled = 100 Then
     Bled = Rnd(100)
     Rand_b = Rnd(41)
   End If
 
 
   If Rand_r < 20 Then Incr Rled                            'incr wylosowaną wartośc do 100 następnie na początku programu znowu losuje
   If Rand_r >= 20 Then Decr Rled                           'decr wylosowaną wartość do 0 następnie na początku programu znowu losuje
 
   If Rand_g <= 20 Then Incr Gled
   If Rand_g > 20 Then Decr Gled
 
   If Rand_b <= 20 Then Incr Bled
   If Rand_b > 20 Then Decr Bled
   Waitms 15
End If

Dodałem jeszcze zmienną I (word) która cały czas zmienia podstawę na której pracuje Rnd. Znajduje się ona w przerwaniu timera0. f = 8MHz

Incr I
___rseed = I

Portret użytkownika gosc

ATmega8 problem

Witam,
Przepraszam z góry za podczepianie się do tematu ale jako jeden z nielicznych jest aktywny...Do rzeczy:
Zmontowałem sobie zegarek i termometr do samochodu z tego tematu: http://www.elektroda.pl/rtvforum/topic989801.html#5043414 . Schemat nie jest mój jednak PCB zrobiłem sam. Układ po wgraniu programu wyświetla poprawnie napis powitalny i następnie ciąg dziwnych znaków. Próbowałem z dwoma wersjami programu czy innym uC lecz nie pomogło. Czym może to być spowodowane i jak temu zaradzić? Poniżej projekt PCB i zdjęcia wariacji.

http://obrazki.elektroda.pl/8327869900_1345489290.jpg

http://obrazki.elektroda.pl/4440052600_1345489293.jpg

http://obrazki.elektroda.pl/9364595200_1345489296.jpg

http://obrazki.elektroda.pl/9364595200_1345489296.jpg

http://obrazki.elektroda.pl/5684320600_1345489299.jpg

http://obrazki.elektroda.pl/8665334700_1345489551.jpg

Przepraszam jeszcze raz ale pilnie potrzebuje porady...