Skocz do zawartości

Losowe wybieranie - bascom AVR


Pomocna odpowiedź

Napisano

Po raz kolejny krótka piłka z mojej strony. Jak w bascomie zrobić funkcję "losu" czyli:

w odstępie od 0.0s do 2.5s w losowym momencie ma pojawić się jedynka na którymś porcie.

Jakiego polecenia użyć? Jak rozwiązać ten problem?

Pozdrawiam.

Jest funkcja RND.

Pozatym możesz sobie brać szumy za diodą zenera przy pomocy ADC zczytywać i to da ci jakieś losowe wyniki. Wynik zawsze będziesz miał w określonym przedziale wiec zrobic pseudo tabelke która bedzie przypisywała wartość pomiaru do długości odstępu.

RND kawałek z helpa:

Uwaga! Liczby są generowane przez odpowiedni kod programu. Każdy restart systemu, powoduje, że sekwencja tych liczb będzie taka sama.

Znaczy to że np jak to będzie projekt kostki do gry, czyli zakres I = Rnd(5) to gra będzie zawsze taka sama po wyłączeniu i włączeniu urządzenia? Trochę bezsensu, mógłby ktoś przedstawić jakieś rozwiązanie?, to ma być tylko fragment projektu wiec nie może to zajmować nóżek procesora.

[ Dodano: 20 Paź 09 12:53 ]

W sumie mógłby być to ten patent z diodą i ADC

było by to tak?:


Config Adc = Single , Prescaler = Auto , Reference = Internal 
Dim ___rseed As Word
Dim I As word 

Start Adc

___rseed = Getadc(0)
I = Rnd(2500)


i tutaj pytanie co i jak podłączyć pod ADC

Ja zrobiłbym tak:

Config Adc = Single , Prescaler = Auto , Reference = Internal

Dim losowa As Word
Dim I As word

Start Adc

'pobieranie wartości losowej z adc
losowa = Getadc(0)
losowa= losowa/250 'wartość wyssana z palca, dzielnik trzeba wybrać na podstawie wartości adc

waitms losowa 'czekaj przez ilość wylosowanych ms
portb.1 = 1 'po wylosowanym czasie na pb1 pojawi się jedynka

Aczkolwiek nie jestem pewien, czy dobrze Cię zrozumiałem 😉

edit: No i podepnij diodę zenera katodą do vcc, a anodą do adc0. Najlepiej by było, gdyby dioda miała napięcie przebicia około 1V, wtedy podczas dzielenia pomiaru tak ważne dla nas jedności nie zgubiłyby się nigdzie.

BoBBy, ok ale dzięki instrukcji Rnd(2399) mamy dokładny przedział od 0ms do 2500ms. bo ona generuje liczby na podstawie jakieś innej podstawy i właśnie ta podstawa musi być losowa. Możecie wytłumaczyć jeszcze dokładnie o co kaman z tą diodą?

Dioda zenera generuje duże szumy na "wyjściu", a szumy to nic innego jak szybkie zmiany napięcia. I właśnie te zmiany napięcia można odczytać, są one niemal idealnie losowe.

Z tego co pamiętam to te szumy trzeba wzmocnić to raz, dwa, że to napięcie nie jest w zakresie 0-5V tylko powiedzmy 4,98-5V więc trzeba by było przesunąć ten zakres użyteczny na coś bardziej zbliżonego do 0-5V.

Na szybko znalazłem ten temat na elektrodzie.

Ale poco cokolwiek wzmacniać?. Wydaje mi sie że nie do końca rozumicie idee rozwiązania z diodą zenera.

A więc 10-bitowy ADC ma rozdzielczosc przy napięciu odniesienia 5V 0.0049V.

Teraz jeśli szumy mieszczą się w 0.02V to jest faktycznie problem ale możemy przecież sprawdzić dodatkowo częstotliwość sygnałów 🙂. Bo przecież sygnał za diodą bedzie miał też swoje szumy 😃.

Ale dobra dla tych którym nie wsmak bawić sie w takie coś, faktycznie lepiej zrobić prosty wzmacniacz dwustopniowy na tranzystorach. Proste rozwiazanie, pare rezystorów dwa tranzystory i mamy generator szumów na pełnym paśmie akustycznym, z rozpiętością napięcia zależną od zastosowanego wzmocnienia.

Ale trzeba w takim wypadku uważać na samowzbudzanie się układu. Ale to taka ciekawostka 🙂.

Pozdrawiam

Edit, albo tak jak w rozwiązaniu tej konsoli do której linka dał Sabre.

T

Kurde, problem jest taki że układ jest już wykonany i nie ma na nim miejsca na dodatkowe elementy. Myślałem żeby zapisywać wartość do eepromu ale wytrzyma to około 100000 cykli włączenia wyłączenia, urządzenie ma pracować około 50 razy dziennie i nie ma paść po 5ciu latach.

A masz w urządzeniu zegar czasu rzeczywistego? albo jakiś inny zmienny sygnał? Może da się go wykorzystać do inicjalizacji generatora.

Zresztą nawet jeśli będziesz zapisywał do eeprom za każdym razem, powinno być ok:

5 lat x 365 dni x 50 = 91250 - więc powinno działać.

Możesz jeszcze zrobić inaczej - zapisywać do kilku komórek pamięci (cyklicznie). Wtedy zamiast 100k cykli możesz uzyskać np. 500k czy 1m i urządzenie 5 lat spokojnie podziała

A sposób z licznikiem? Czy da się w bascomie odliczać np od zera do 25? Klikając guzik licznik by stawał i liczba była by od razu "przekazywana" do następnej pętli.

[ Dodano: 21 Paź 09 07:09 ]

Wpadłem na inny pomysł. W układzie mam zasilacz z wieloma uzwojeniami wtórnymi. Na jednym z nich jest sinusoida 5V(-2.5 +2.5). Można by to wykorzystać jako podstawę do ___rseed = Getadc(0) - nigdy nie wiadomo jaka byłą by wartość w momencie naciśniecia przycisku. Tylko teraz pytanie, jakie napięcie odniesienia dać do układu?

[ Dodano: 21 Paź 09 10:29 ]

A co myślicie o tym aby zostawić nogę ADC niepodłączoną? stan nieokreślony - przetwornik będzie szaleć i o to chodzi.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...