Skocz do zawartości
Kaytec

Losowe wybieranie - bascom AVR

Pomocna odpowiedź

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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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ą?

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...