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.

losowe zapalanie Led

dom85 11 Lip 2005 12:14 3691 15
  • #1 11 Lip 2005 12:14
    dom85
    Poziom 10  

    mam zrobić znajomemu urzadzenie do ćwiczenia refleksu. mam zamiar podłączyć około 20 diod led tak aby zapalały sie losowo. Jedna po drugiej z pewnym opóźnieniem. Myślelem o zbudowaniu tego na jakims mikrokontrolerze ale nie chce od razu od niego zaczynać. mam nadzieje że ma ktoś jakieś ciekawe pomysły. mile widziane jakiś schematy

    0 15
  • #2 11 Lip 2005 21:25
    nemo07
    Poziom 36  

    Przy tylu diodach potrzebujesz furę pinów sterujących. Choćby z tego względu µC jest optymalny. Do tego potrzebujesz jakiś algorytm generatora pseudolosowego i po ptokach. :P Pozdro

    0
  • #3 11 Lip 2005 22:03
    marek_Łódź
    Poziom 36  

    nemo07 napisał:
    Przy tylu diodach potrzebujesz furę pinów sterujących.
    Bez przesady 20 diod można wysterować w matrycy 4x5 , czyli w sumie 9 pinów + jakiś ULN2803 (linie tej matrycy można również wykorzystać do obsługi klawiatury).

    Można też ten układ zbudować na klasycznej cyfrówce (TTL lub CMOS) Dajesz dwudekadowy licznik z wyjściem 1 z 10 bezpośrednio na diody 2x(7490+7442), sterujesz to z generatora względnie wysokiej częstotliwości (np. 10 MHz), cały układ bramkujesz generatorem np. 0,3 Hz (impuls co 3 s) Takie zdudnienie powinno już dać odpowiedź "pseudolosową". Dla większej pewności mozna w układzie przeładowania pojemności wolnego generatora dołożyć szumiący wzmacniacz (generator szumu), zmieniający w niewielkim zakresie okres generatora. Do tego układ detekcji poprawnie naciśniętego klawisza i licznik. Po drugiej stronie masz mikroprocesor z kawałkiem peryferii??? Co jest prostsze?

    0
  • #4 11 Lip 2005 22:20
    nemo07
    Poziom 36  

    Co jest prostsze? Oczywiście µC i to z odstępem! Potrzebujesz dołożyć co najwyżej jeden standardowy latch, jakich wiele, za 10 centów dla µC, który ma przynajmniej 13 pinów I/O, albo żadnego, jeśli µC ma przynajmniej 20 pinów I/O. Jesteś w stanie konkurować? Nawet Twój pomysł z generatorem, bramkowaniem itd masz już w µC. Wystarczy chcieć użyć. :P

    0
  • #5 11 Lip 2005 22:35
    marek_Łódź
    Poziom 36  

    nemo07 napisał:
    Co jest prostsze? Oczywiście µC i to z odstępem!


    ;-) ;-) Poprawna odpowiedź!

    0
  • #6 12 Lip 2005 15:23
    _jta_
    Specjalista elektronik

    Całkiem dobry generator liczb losowych (okres 2^31-1, brak korelacji)
    daje się zrobić z rejestru przesuwnego 31-bitowego, i bramki EOR.
    Schemat: X-13_przerzutnikow-Y, EOR(X,Y)-18_przerzutnikow-X;
    tylko że na jeden impuls zegara dostaje się jeden bit pseudolosowy,
    do większej ilości potrzeba więcej taktów zegara, i zbierać bity.

    0
  • #7 14 Lip 2005 09:05
    marek_Łódź
    Poziom 36  

    _jta_ napisał:
    Całkiem dobry generator liczb losowych (okres 2^31-1, brak korelacji)
    daje się zrobić z rejestru przesuwnego 31-bitowego, i bramki EOR.
    Schemat: X-13_przerzutnikow-Y, EOR(X,Y)-18_przerzutnikow-X;
    tylko że na jeden impuls zegara dostaje się jeden bit pseudolosowy,
    do większej ilości potrzeba więcej taktów zegara, i zbierać bity.


    Co się równie prosto implementuje w asemblerze na dowolnym procesorku.

    0
  • #8 14 Lip 2005 11:54
    _jta_
    Specjalista elektronik

    To akurat pochodzi z programu komputerowego - jakby ktoś chciał, to mogę podesłać.
    Z tym, że mój program w pełnej wersji jest dużo za dobry do takiego zastosowania.
    Zwracam tylko uwagę, że długość rejestru (31) i przesunięcie (13) nie są dowolne - jest
    trochę takich kombinacji, dla których uzyska się dobry generator liczb pseudolosowych
    (i da się to udowodnić) a inne będą działać źle, i mogą dawać liczby mało losowe.
    Lub mogę - jak ktoś zechce - opisać, jak się to sprawdza (ale to sporo liczenia).

    0
  • #9 14 Lip 2005 12:26
    nemo07
    Poziom 36  

    To brzmi ciekawie, co piszesz, _jta_. W literaturze można znaleźć pewne, rzekomo "optymalne" układy z różnymi długościami rejestrów i punktami "tapping", ale interesował by mnie ewentualnie generalny algorytm ewaluacji rozkładu statystycznego - oczywiście tylko taki, który da się bezproblematycznie przełożyć na C/C++, to by robiło sens.

    0
  • Pomocny post
    #10 14 Lip 2005 13:59
    lechoo
    Poziom 39  

    Jeśli użyjesz mikrokontrolera, to proponuję zastosować algorytm liniowego generatora pseudolosowego. Opisać go można uproszczonym wzorem:

    Xn+1 = a * Xn + c (modulo m)

    gdzie a - liczba pierwsza, c można przyjąć 1, zaś m powinno też być odpowienio wysoką liczbą pierwszą.

    Warto przechowywać bierzącą wartość X w eepromie, żeby ciąg liczb pseudolosowych nie powtarzał się.

    0
  • #11 14 Lip 2005 17:16
    marek_Łódź
    Poziom 36  

    _jta_ napisał:
    To akurat pochodzi z programu komputerowego - jakby ktoś chciał, to mogę podesłać.


    Co się równie łatwo implemetuje na rejestrze przesuwającym i bramce XOR

    ;-)

    0
  • #12 14 Lip 2005 18:36
    _jta_
    Specjalista elektronik

    nemo07 napisał:
    To brzmi ciekawie, co piszesz, _jta_. W literaturze można znaleźć pewne, rzekomo "optymalne" układy [...]

    Tak w skrócie: jeśli N jest długością rejestru, i 2^N-1 jest liczbą pierwszą, a wykonanie
    2^N-1 operacji generowania liczby losowej przywraca początkowy stan generatora, to:
    1) 2^N-1 jest okresem generatora, i
    2) jeśli generator jest typu wielomianu x^N+x^S+1 (gdzie S<N) w arytmetyce modulo 2,
    to nierównomierność rozkładu wartości bitu jest 1/okres ('1' jest o 1 raz więcej, niż '0').
    (ten powrót do stanu początkowego jest sprawdzany w moim programie;
    pewnie najtrudniejsze będzie sprawdzenie, że 2^89-1 jest liczbą pierwszą...)

    Zasadniczo taki generator jest już całkiem dobry do wielu zastosowań, ale ma jeszcze
    dość poważną wadę: generuje tylko 1 bit pseudolosowy, żeby wygenerować więcej,
    trzeba by powtarzać generowanie B razy (gdzie B jest wymaganą ilością bitów), można
    tego uniknąć, jeśli zamiast rejestru użyje się tablicy z liczb minimum B-bitowych; wtedy
    trzeba ją odpowiednio zainicjalizować, żeby nie było korelacji między różnymi bitami;
    są generatury, w których zamiast XOR stosuje się dodawanie, ale nie znam dowodu,
    że takie generatory nie dają jakichś korelacji - a to już są wszystko generatory na tyle
    dobre, że doświadczalnie się tego nie zbada - nie ma na to dość dobrych komputerów.

    Drugi, zwykle mniej istotny problem, to korelacje tworzone przez sam algorytm, zwykle
    akurat takie w niczym nie przeszkadzają, ale dobrze jest nałożyć na wyniki generowane
    w taki sposób jakiś inny generator liczb losowych lub pseudolosowych (jeśli potrzebne
    są losowe, to byle jaki generator sprzętowy plus taki rejestr dają dobre wyniki).

    U mnie pierwsza wada jest usunięta przez odpowiednią inicjalizację tablicy, druga
    przez użycie dwóch generatorów o różnych okresach, i wzięcie XOR z ich wyników.

    ZIP zawiera generator w wersji dla DOS-u (języki: Fortran, C), TAR w wersji dla Unix-a
    (i ze zmienionymi nazwami - kolega potrzebował mieć dwa niezależne generatory...).

    Aha: te programy można znacznie uprościć - ja kombinowałem, żeby działały
    tak samo niezależnie od długości słowa maszynowego, np. na 13-bitowych...

    Gdzieś w opisach jest artykuł z odnośnikami do publikacji zawierających prawidłowe
    kombinacje długości i przesunięcia (przy których nie ma skróconych okresów). Jest
    tych kombinacji dużo - w jednej z tych publikacji są na mikrofilmie, więc żeby móc to
    przeczytać trzeba iść do biblioteki, która ma czytnik mikrofilmów.

    0
  • #14 16 Sie 2005 15:10
    _jta_
    Specjalista elektronik

    To zależy jaką losowość chce się uzyskać: tego typu generator sprzętowy daje jakiś szum,
    ale losowy to on raczej nie jest, spotkałem się z zastosowaniem takiego szumu jako klucza
    do identyfikacji - każdy tranzystor ma niepowtarzalne (to znaczy każdy inne) charakterystyki
    szumów, i przez analizę korelacji w sygnale "losowym" rozpoznawało się klucze...

    0
  • #16 15 Paź 2008 21:45
    _jta_
    Specjalista elektronik

    13 Paź 2008 17:36 w PM "Generator losowy"

    nezd napisał:
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=326193&highlight=
    Mam ogolnie problem z układem generujacym losowe liczby z programowalnym zakresem :>...
    Masz moze cos przydatnego co by mi ułatwilo rozwiazanie tego zadania ?
    Albo jakis uklad w (spice worchbenk)lub cos w tym stylu..
    Chcialbym to zrobic w technoligi ttl lub cmos w sumie
    A na poczatek jezli wiesz lub posiadasz jakas symulacje takiego ukladu(bez procesorow i kontrolerow)

    Zakres dla rozkładu równomiernego robi się w taki sposób, że najpierw robi się generator
    dający rozkład równomierny, a następnie możliwym wartościom tego generatora przypisuje
    się wartości, które chcemy uzyskać, w możliwie prosty sposób - np. przez resztę z dzielenia,
    odrzucając wyniki generatora, które są za duże - powiedzmy, że chcemy mieć zakres 0..24,
    mamy generator 0..255, to dzielimy przez 25, jeśli wynik jest 10 to powtarzamy losowanie, jeśli
    mniejszy - to resztę z dzielenia przyjmujemy jako wygenerowaną liczbę "losową". Można nawet
    prościej, ale tracąc więcej wyników losowania: z wylosowanej liczby bierzemy 5 bitów, które
    dają liczbę w zakresie 0..31, jeśli jest ponad 24 to powtarzamy losowanie... jeśli chcesz to zrobić
    bez procesora, to ten drugi sposób jest łatwiejszy; można jeszcze stosować mnożenie - np.
    liczbę 0..255 mnożymy przez 25 i bierzemy bity 8..12, ale rozkład jest trochę nierównomierny,
    a mnożenie nie jest operacją łatwą do wykonania bez procesora - porównanie jest łatwiejsze.
    Chyba, że zakres ma być zawsze postaci 0..2^k-1 - wtedy po prostu losujesz k bitów. ;)

    0