logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Jak wygenerować trzy liczby w C na ATmega32 z różnych zakresów?

eiliat 30 Mar 2012 19:15 2028 17
  • #1 10737423
    eiliat
    Poziom 15  
    Witam,

    Potrzebuje w jednej chwili wygenerować trzy liczby - jedną z zakresu 2-89 a drugą z zakresu 2-59 a trzecią z 0-8. Jak to wykonać w C na ATMege32?
  • #3 10737598
    eiliat
    Poziom 15  
    Powiedzmy 10ms.
  • Pomocny post
    #4 10737626
    mirekk36
    Poziom 42  
    eeee to co to za chwila, w procku to jak w matrixie ;) .... najprostsze rozwiązanie to użycie funkcji random - co za problem. 10ms to szmat czasu - wykona się i jeszcze kupa czasu zostanie.
  • #5 10738609
    eiliat
    Poziom 15  
    Użycie wyszukiwania zawsze zwraca mi tą samą liczbę. Jak tego uniknąć?

    Koduje tak:
    random(88);
  • #7 10739338
    eiliat
    Poziom 15  
    Witam,

    Czy użycie tego kodu dla M32 z wew. 2 MHz da mi pożądany efekt czyli losowanie liczb?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I czy to nie będzie tak, że za każdym razem po zresetowaniu procesora "losowe" liczby będą takie same?
  • Pomocny post
    #8 10739407
    Sokol_09334
    Poziom 15  
    Takie coś to zwykłe równanie matematyczne więc na pewno będzie się powtarzać.
  • Pomocny post
    #9 10739486
    dondu
    Moderator na urlopie...
    Sokol_09334 napisał:
    Takie coś to zwykłe równanie matematyczne więc na pewno będzie się powtarzać.

    Podobnie jak funkcja rand() i pozostałe z biblioteki stdlib.h
    Od tego jest seed (ziarenko):

    Cytat:
    The srand() function sets its argument seed as the seed for a new sequence of pseudo-random numbers to be returned by rand().

    W kodzie, który kol. eiliat zamieścił jest tym ziarenkiem jest:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Skuteczność tego algorytmu jest opisana tutaj: EPP: Generator liczb losowych by miszcz310
    a autora można dopytać na forum elektrody: miszcz310

    Alternatywne rozwiązanie to na przykład generator liczb losowych (nie pseudolosowych) na ADC, opisany tutaj
    lub inny całkowicie sprzętowy oparty na generatorze szumu: noise generator

    Zacznij może od zwykłego rand() z stdlib.h.
  • Pomocny post
    #10 10740314
    miszcz310
    Poziom 24  
    Cytat:
    Witam,

    Czy użycie tego kodu dla M32 z wew. 2 MHz da mi pożądany efekt czyli losowanie liczb?

    Kod C - [rozwiń]
    unsigned int stan_poprzedni=1; //Przy inicjalizacji bedzie to 'seed'
    const unsigned int a=22695477, c=1;

    uint8_t losuj()
    {
    stan_poprzedni=(a*stan_poprzedni+c);
    return stan_poprzedni%257;
    }



    I czy to nie będzie tak, że za każdym razem po zresetowaniu procesora "losowe" liczby będą takie same?



    To jest jakaś inna wersja tej funkcji powinno być tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Po resecie będziesz miał taką samą sekwencję liczb.

    A jak kolega chce losować liczbe z zakresu 0-8 to wystarczy losuj()%8, dla liczby z zakresu 2-59 losuj()%57+2, dla liczb z zakresu 2-89 losuj()%87+2.
  • #12 10741295
    eiliat
    Poziom 15  
    Witam,

    Zdecyduje się chyba na te rozwiązanie - czy mając M32 z 2 MHz wew. muszę zmieniać kod?
    http://mikrokontrolery.blogspot.com/2011/04/generator-liczb-losowych.html

    Oczywiście czas mi się skróci bo cykle będą szybciej wykonywane ale to bez różnicy - czas jest wystarczający dla mnie.

    I rozumiem że liczby są z zakres 0-255?

    Dodano po 1 [godziny] 29 [minuty]:

    Jak zmienić poniższą linijkę tak aby była kompatybilna z M32?
    ADCSRA  |=  (1<<ADFR);
  • Pomocny post
    #13 10743774
    dondu
    Moderator na urlopie...
    W mikrokontrolerze ATmega32 tryb Free Running mode, włącza się w rejestrze SFIOR bitami ADTS2:0 ustawionymi na 0. Ponieważ jest to domyślny stan tych bitów, to po resecie masz wybrany właśnie ten tryb pracy ADC.

    Natomiast w rejestrze ADCSRA musisz ustawić automatyczne wyzwalanie na bicie ADATE:

    Cytat:
     Bit 5 – ADATE: ADC Auto Trigger Enable
    When this bit is written to one, Auto Triggering of the ADC is enabled. The ADC will start a conversion
    on a positive edge of the selected trigger signal. The trigger source is selected by setting
    the ADC Trigger Select bits, ADTS in SFIOR.


    I to chyba wszystko.
  • #14 10748711
    eiliat
    Poziom 15  
    Czy teraz jest poprawnie?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zmieniłem też preskaler ADC na 2MHz :)
  • #15 10753174
    eiliat
    Poziom 15  
    Czy mogę prosić o pomoc?
  • #17 10754958
    eiliat
    Poziom 15  
    zadałem pytanie czy kod jest teraz poprawny skoro zmieniłem na 2 Mhz i próbuje go dostosować na m32. pytam bo nie moge teraz tego sprawdzić a chce już mieć pewność
REKLAMA