Efekt płatków śniegu na Rainbowleds

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Efekt płatków śniegu na Rainbowleds

Post autor: niveasoft » 20 gru 2019, 19:07

Jakieś dwa lata temu powstał projekt "Ośmiornicy na suficie klubu dyskotykowego" Ta ośmiornica reagowała na beaty i była zbudowana z RAINBOWLEDS ws8212.

Ośmiornica reaguje na beaty muzyki i nawet zmienia randomowo scenariusz interpretacji, ale ... jak w klubie czasem jest cisza to włącza tryb "snowflakes" ":D

Efekt wygląda tak że czasem losowy piksel rozpali się na maks tak że błysnie a potem gaśnie pomału. Słowo losowy ma tu duze znaczenie. Im więcej ledów WS tym bardziej to randomowo rozpala czasem jakiś piksel tk jakby spadł tam płatek śniegu.

Mam dwa telefony i jak przeczytacie niezbyt drogie/ambitne. Pierwszy iPhone SE nie jest w stanie nagrać tego efektu. Wygasza te sparki na nagraniu i nie widac efektu. Drugi telefon Redmi 7A nagrał to tak jak mógł nagrać, ale obiecuję że to nie jest to co naprawdę ten efekt pokazuje.

link do ostatniego filmiku Redmi7A -> LINK

link do filmu gdzie sofware pracuje z AGC (automatic gain control) i wyszukiwaniem ciszy i wtedy automatycznie swflake_effect ->LINK

No i kod do tego efektu
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6. $baud = 115200
  7.  
  8. Const Number_of_leds = 45
  9.  
  10. '*******************************************************
  11. '*          TIMER SETTINGS FOR TIME BASE               *
  12. '*******************************************************
  13.  Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1
  14.  
  15.   'Compare0a = 124                                          '2ms @16MHz/256
  16.    Compare0a = 77                                           '5ms @16MHz/1024
  17.   'Compare0a = 155                                          '10ms @16MHz/1024
  18.  
  19. '*******************************************************
  20. '*             MULTIPURPOSE VARIABLES                  *
  21. '*******************************************************
  22.   Dim Helpb As Byte , N As Byte
  23.  
  24. '*******************************************************
  25. '*               RAINBOWLEDS SETTINGS                  *
  26. '*******************************************************
  27.  
  28. Config Rainbow = 1 , Rb0_len = Number_of_leds , Rb0_port = Portc , Rb0_pin = 0
  29.  Rb_selectchannel 0                                         'wybierz kanal
  30.   Rb_clearcolors : Rb_send                                  'i czysc po reset
  31.  
  32. Dim Color(3) As Byte
  33.  
  34. Const Snow_max = 20
  35.  
  36. Dim Numleds As Byte
  37. Dim Flash As Byte , Sparked As Byte
  38. Dim Los As Byte , Active As Byte , Running As Byte
  39. Dim Wait_time As Byte , Countdown As Byte
  40.  
  41. Dim Spark(3) As Byte
  42.  Spark(1) = &HFF
  43.  Spark(2) = &HFF
  44.  Spark(3) = &HFF
  45. Dim Heat(255) As Byte
  46.  
  47. Numleds = Number_of_leds
  48.  
  49.  
  50. Do
  51.  
  52.  If Tifr0.ocf0a = 1 Then
  53.   Tifr0.ocf0a = 1
  54.  
  55.     If Running = 0 Then
  56.         Running = 1
  57.  
  58.       Color(1) = Snow_max
  59.       Color(2) = Snow_max
  60.       Color(3) = Snow_max                             ' define a color
  61.  
  62.       For N = 0 To Numleds -1
  63.         Rb_setcolor N , Color(1)
  64.       Next
  65.  
  66.     Else
  67.  
  68.      If Flash = 1 Then
  69.       Flash = 0
  70.        Rb_setcolor Sparked , Color(1)
  71.         'Rb_send
  72.      End If
  73.  
  74.  
  75.      Helpb = Rnd(5)
  76.      If Helpb > 0 Then
  77.  
  78.        Los = Rnd(numleds)
  79.        Color(1) = Rb_getcolor(los)
  80.         Helpb = Color(1)
  81.  
  82.        Select Case Heat(los)
  83.         Case 0
  84.          'If Active < Numleds Then
  85.           Heat(los) = 1
  86.            'Incr Active
  87.          'End If
  88.         Case 1
  89.          If Helpb > 0 Then
  90.           Decr Helpb
  91.  
  92.           Color(1) = Helpb
  93.           Color(2) = Helpb
  94.           Color(3) = Helpb
  95.            Rb_setcolor Los , Color(1)
  96.              'Rb_send
  97.          Else
  98.           Heat(los) = 2
  99.          End If
  100.  
  101.         Case 2
  102.          If Color(1) < Snow_max Then
  103.           Helpb = Rnd(snow_max)
  104.           Helpb = Helpb / 4
  105.           Color(1) = Color(1) + Helpb
  106.           If Color(1) > Snow_max Then
  107.            Color(1) = Snow_max
  108.           End If
  109.           Color(2) = Color(1)
  110.           Color(3) = Color(1)
  111.            Rb_setcolor Los , Color(1)
  112.              'Rb_send
  113.          Else
  114.           Heat(los) = 0
  115.            If Active > 0 Then Decr Active
  116.          End If
  117.        End Select
  118.  
  119.      End If
  120.  
  121.     End If
  122.  
  123.     Rb_send
  124.  
  125.    If Countdown > 0 Then
  126.      Decr Countdown
  127.    Else
  128.      '-------------------------------------------[SNOW]--
  129.      'time to time spark one pixel
  130.       If Running = 1 Then
  131.        Sparked = Rnd(numleds)
  132.         Color(1) = Rb_getcolor(sparked)
  133.          Rb_setcolor Sparked , Spark(1)
  134.           Rb_send
  135.          Wait_time = Rnd(200)
  136.            Flash = 1
  137.       End If
  138.  
  139.  
  140.  
  141.     Countdown = Wait_time
  142.    End If
  143.  
  144.  
  145.  
  146.  'end if 2ms
  147.  End If
  148.  
  149. Loop
  150.  
  151.  
Awatar użytkownika
Oldman
Posty: 61
Rejestracja: 19 cze 2019, 11:15

Re: Efekt płatków śniegu na Rainbowleds

Post autor: Oldman » 21 gru 2019, 12:54

Działa ładnie choć migające choinki to nie moja bajka. Na dodatek układ reaguje tylko na Beaty a moja żona to Iwona więc po ptokach.. :lol:
Ale żeby nie było o niczym, o co chodzi z tym fragmencie? :
  1. If Tifr0.ocf0a = 1 Then
  2.   Tifr0.ocf0a = 1
Rozumiem że kasujesz bit w tym rejestrze ale skoro i tak jest skasowany (=1). Chyba, że w tym momencie już nie jest.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Efekt płatków śniegu na Rainbowleds

Post autor: niveasoft » 24 gru 2019, 13:18

Musze sie przyjrzec silnikowi Forum bo nie dostałem chyba powiadomienia o tym pytaniu.

Odpowiadam.
Timer mozna ustawić na dany interwał - to najcześciej wie każdy.
Timer dobiegając swój licznik ustawia flagę która ma wartośc 1 - jeden.
To jest konsekwencją tego , że musi być inaczej niz po resecie, a jak zerkniesz na takie tabelki od rejestrów to tam pisze jak wygląda rejejestr po resecie.
W skrócie na pewno jest tam zero więc jak timer dobija to ustawia cos przeciwnego. No i tu jest jedna rzecz którą każdy AVR`owiec powienien wiedzieć. Flagi kasuje się wpisując JEDEN a nie "kasuje" wpisując zero.
Dopiero wpisanie jedynki kasuje flagę i tam będzie w tym przypadku zero przez te następne 2ms :D


Aaaa no może dopowiem, że Timer ustawiony w tryb Clear_timer ustawia flagę OCFx.. czyli Timer0 ustawia OCF0. Timer2 OCF2 ..nowsze procki potrafią OCF2A i OCF2B..nawet C
TIFR to Timer Interrupt Register.. Jak uzywasz Clear_Timer to timer najczęściej nie osiąga maksymalnej pojemnosci i TOVx nie jest osiągane

TOVx i OCF to są flagi timerów. TOVx to chyba Top Of.. a OCF to chyba On Compare match.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Efekt płatków śniegu na Rainbowleds

Post autor: niveasoft » 24 gru 2019, 13:43

A zupełnie inna rzecz to to, że nie trzeba czasem ustawiać i WŁĄCZAĆ przerwania od Timera. Często ważę które przerwanie jest ważniejsze.. Xmega ma priorytety :D ale to pewnie nie temat na ten wątek.

W tym kodzie chodzi o to że Timer ustawił flagę i nalezy cos przetworzyć/pomyśleć. i to to jest fajne ze mozemy cos robić rzadziej np. co 2ms a z mocą obliczeniową 16MHz
Awatar użytkownika
Oldman
Posty: 61
Rejestracja: 19 cze 2019, 11:15

Re: Efekt płatków śniegu na Rainbowleds

Post autor: Oldman » 28 gru 2019, 16:31

Dziękuję za wyjaśnienie. Muszę więcej poczytać o rejestrach Timerów bo na razie nie do końca jeszcze rozumiem jak to funkcjonuje :oops:
Na przykład dlaczego kasujesz skasowany bit rejestru, czyli "jak jest jedynka to wpisz jedynkę". To że odmierzasz czas bez korzystania z przerwania od Timer0, to widzę. Sprawdzasz w pętli Do-Loop stan bitu Tifr0.ocf0a, który po osiągnięciu przez Timer0 wartości 77 (5ms) jest kasowany (=1). Ale chyba taki pomiar czasu może być obarczony błędem wynikającym z czasu trwania pętli? Wiem, nie zawsze jest to istotne: 5ms czy 6ms.
PS. Tak przy okazji: w linii nr 15 powinna być wartość 8ms a nie 2ms, choć tu to bez znaczenia.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Efekt płatków śniegu na Rainbowleds

Post autor: niveasoft » 28 gru 2019, 16:53

Nad resztą odpowiedzi zastanowię się i odpowiem jak to poskładam w krótką wypowiedź. Natomiast mogę szybko odpowiedzieć na pytanie "dlaczego kasujesz skasowany bit rejestru"

Odpowiadam : Timer skonfigurowany by zgłaszał to co chcemy co określony czas ustawia flagę. Można włączyć przerwanie od tego zdarzenia ale nie jest to obowiązkowe. Mozna sprawdzać czy flaga jest juz ustawiona i to oznacza że czas który wcześniej ustawiliśmy minął.

I tutaj coś co odpowiada na pytanie. : Jesli ustawimy tak że określony czas powoduje przerwanie to flagę kasuje procesor sam zaraz przed wyjściem z przerwania. Natomiast jeśli chcemy sprawdzać flagę czasu sami to też sami musimy ją kasować.

[EDIT1} -> "Na przykład dlaczego kasujesz skasowany bit rejestru"
Tak mają AVR`y że wpisanie zera nie kasuje bitu. Trzeba wpisać jeden a w tym miejscu pojawi się zero. To jest opisane w instrukcji do której nikogo nie zmuszam :D
Awatar użytkownika
Oldman
Posty: 61
Rejestracja: 19 cze 2019, 11:15

Re: Efekt płatków śniegu na Rainbowleds

Post autor: Oldman » 28 gru 2019, 17:11

niveasoft pisze:
28 gru 2019, 16:53
Trzeba wpisać jeden a w tym miejscu pojawi się zero.
To wiele wyjaśnia. A przeczytanie instrukcji to moje postanowienie noworoczne :geek:
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Efekt płatków śniegu na Rainbowleds

Post autor: niveasoft » 28 gru 2019, 17:18

Przepraszam Oldman że tak z nicka, ale chodzi o to że Rainbowleds maja Base_ zero znaczy że jak pierwsza LED to adres ma zero. Druga Led ma adres 1
ODPOWIEDZ