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

Jak uzyskać prawdziwie losowe liczby w BASCOM zamiast Rnd()?

15 Lut 2009 16:04 5380 13
REKLAMA
  • #1 6153910
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 6153949
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Możesz spróbować zapisywać wartość seed w pamięci eeprom po każdym użyciu (lub np przy co 10).
  • #3 6154049
    aleexander
    Poziom 15  
    Posty: 173
    Pomógł: 13
    Ocena: 9
    Witam!
    Zgadza się, funkcja Rnd() powoduje generowanie liczb pseudolosowych według pewnego określonego algorytmu. Aby uzyskać liczby "bardziej" losowe, oraz inną sekwencję liczb po każdym restarcie układu można zmienić podstawę generatora funkcji pseudolosowej.

    Dim ___rseed As Word
    ___rseed = Wartosc


    Jako Wartosc można podstawić wyjście przetwornika Adc (jeśli jest w użytym mikrokontrolerze), którego wyjście "wisi w powietrzu".
    Poszukaj też na Elektrodzie metody generowania szumu na bazie diody zenera. Jest to chyba najlepszy sposób na uzyskanie naprawdę dobrych liczb losowych.

    Pozdrawiam, aleexander
  • #4 6467853
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 6468752
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    chyba nic nie zrozumiales z tego co koledzy ci pisza. Nie potrzebujesz assemblera, w bascomie tez to zrobisz. Jak? tak jak ci koledzy napisali powyzej.
  • #7 6472974
    wader_669
    Poziom 28  
    Posty: 1512
    Pomógł: 93
    Ocena: 15
    start adc ok ale to __rseed = adc ?! co to jest???!!! Odsylam do helpa, poczytaj o adc.
  • REKLAMA
  • #8 6473007
    Belialek
    Poziom 22  
    Posty: 977
    Pomógł: 19
    Ocena: 124
    
    Start Adc
    Dim ___rseed As Word
    ___rseed = Getadc(0)
    


    i ruszylo w symulatorze :)
    dziekuje za motywacje, aczkolwiek odpowiedz znalazlem na forum - w helpie pod pozycja "adc" mialem pusto.

    EDIT:

    Wszystko fajnie jak mam mozliwosc wykorzystania procka z obsluga adc... a co w innym przypadku? np popularne tiny2313? istnieje jakas metoda?
  • #9 6473577
    aleexander
    Poziom 15  
    Posty: 173
    Pomógł: 13
    Ocena: 9
    Można zrobić to poprzez użycie zmiennej, której wartość zmienia się przy każdym uruchomieniu a następnie jest zapisywana w eepromie. Dzięki temu każde uruchomienie dawałoby inną sekwencję liczb generowanych funkcją random.
    Inną metodą jest wykorzystanie timera. Przykładowo, jako __rseed wpisujemy wartość, którą timer ma w momencie naciśnięcia przycisku. Jeśli timer będzie pracował z dostatecznie dużą szybkością, prawdopodobieństwo, że przycisk zostanie naciśnięty w tym samym momencie jest bardzo niskie :)

    Pozdrawiam, aleexander
  • #10 6477330
    ZbeeGin
    Poziom 39  
    Posty: 4305
    Pomógł: 600
    Ocena: 438
    Belialek napisał:
    A jak to zrealizowac w symulatorze?

    
    Start Adc
    Dim ___rseed As Word
    ___rseed = Adc
    


    Powoduje wyplucie bledu przez kompilator:

    
    Source variable does not match the target variable [ 0|ADC]
    

    Najpierw konfiguracja przetwornika do trybu FREE, a potem skorzystanie ze zmiennej specjalnej ADCD (Analog to Digital Conversion Data variable).
  • REKLAMA
  • #11 6512304
    fiskusmati
    Użytkownik obserwowany
    Posty: 769
    Pomógł: 18
    Ocena: 25
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pinc.2 , Db5 = Pinc.3 , Db6 = Pinb.2 , Db7 = Pinb.1 , E = Pinc.1 , Rs = Pinc.0
    Cls
    Start Adc
    Dim ___rseed As Word
    ___rseed = Getadc(9)
    
    Lcd ___rseed


    Dlaczego na LCD cały czas jest 00?
  • #12 6512383
    aleexander
    Poziom 15  
    Posty: 173
    Pomógł: 13
    Ocena: 9
    fiskusmati napisał:
    
    Dim ___rseed As Word
    ___rseed = Getadc(9)
    
    Lcd ___rseed


    Dlaczego na LCD cały czas jest 00?


    Atmega8, w obudowie DIP posiada 6 kanałów ADC...
    W obudowie TQFP i QFN jest ich 8.
    Ty próbujesz pobrać wartość z 10 kanału (liczymy od 0).
    Zamień 9 na wartość od 0 do 5 (podejrzewam, że Twoja Atmega jest w obudowie DIP):
    
    __rseed = Getadc(0)
    


    Oraz dodaj konfigurację ADC (przykładowo):
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    


    Pozdrawiam, aleexander
  • #13 6512429
    fiskusmati
    Użytkownik obserwowany
    Posty: 769
    Pomógł: 18
    Ocena: 25
    A co ma do tego budowa uC? :)

    Ja poprostu chce zeby wolosował dowolną liczbę, ale za kazdym razem inną a nie pseudorandom.
  • #14 6512812
    ZbeeGin
    Poziom 39  
    Posty: 4305
    Pomógł: 600
    Ocena: 438
    Kolego, przeczytaj dokładnie do czego służy ta zmienna i jak otrzymać liczbę pseudolosową za pomocą odpowiedniej do tego funkcji!!! Potem dopiero możesz zadawać pytania.

Podsumowanie tematu

✨ W dyskusji poruszono problem uzyskania prawdziwie losowych liczb w BASCOM zamiast standardowej funkcji Rnd(), która generuje liczby pseudolosowe powtarzalne po resecie mikrokontrolera. Zaproponowano kilka metod zwiększenia losowości: zapisywanie wartości ziarna (seed) w pamięci EEPROM po każdym użyciu, wykorzystanie wartości z przetwornika ADC, zwłaszcza gdy wejście ADC jest niepodłączone („wisi w powietrzu”), co pozwala na uzyskanie zmiennego sygnału szumu. Wskazano także na możliwość generowania szumu z diody Zenera jako źródła entropii. W przypadku braku ADC, np. w mikrokontrolerach ATtiny2313, sugerowano użycie wartości licznika timera w momencie naciśnięcia przycisku jako ziarna. Podano przykładowy kod inicjalizacji ADC i pobierania wartości z kanału ADC w BASCOM (Getadc(0)) oraz konieczność odpowiedniej konfiguracji ADC. Zwrócono uwagę na błędy wynikające z nieprawidłowego użycia funkcji Getadc oraz na ograniczenia liczby kanałów ADC w zależności od obudowy mikrokontrolera. Podkreślono, że nie jest konieczne używanie asemblera do poprawy losowości w BASCOM. Dyskusja zawierała także pytania o symulację ADC i problemy z kompilacją, które rozwiązano przez poprawne wywołanie funkcji Getadc i konfigurację ADC.
Wygenerowane przez model językowy.
REKLAMA