Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 16 kwi 2024, o 12:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 27 maja 2012, o 12:39 
Offline
Użytkownik

Dołączył(a): 19 kwi 2012
Posty: 29
Pomógł: 0

Witam.
Robię właśnie program mający za zadanie zapalać losową diodę LED po przyciśnięciu przycisku.
Teraz pojawia się problem. Chciałbym aby liczba była z zakresu 1-3.
Macie jakieś pomysły? Program piszę dla Atmegi8 i bez losowania zajmuje 62.5% pamięci Flash.
Oto on:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
sig off ;(



Ostatnio edytowano 27 maja 2012, o 12:50 przez Mateusz97, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 12:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

może jakieś szczegóły , bo nie bardzo to widzę

w tym wypadku wystarczy puścić pętle for gdzie i będzie 1 do 3
i w warunku sprawdzać stan przycisku

no ale moim zdaniem trochę bez sensowne

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 12:51 
Offline
Użytkownik

Dołączył(a): 19 kwi 2012
Posty: 29
Pomógł: 0

1 przycisk zapala i zgasza diody po kolei, a drugi ma losować diodę, zapalać ją i zgasić.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 13:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

No zaiste ten kod co teraz wkleiłeś to zmora delayowa , aż mnie wzdryga że nie powiem iż niema szału
to musi ważyć .... i konsumować cenne zasoby procka .....
spróbuj się pozbyć tych deley-ów to raz

2 ... hmmm... pętle pętle pętle ....

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 13:19 
Offline
Użytkownik

Dołączył(a): 19 kwi 2012
Posty: 29
Pomógł: 0

Jakieś propozycje? A wracając do tematu jak zrobić losowanie?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 13:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Jeśli liczbe którą potrzebujesz wylosować potrzebujesz co jakiś nieokrągły
czas - np po naciśnięciu przycisku, czy nie wiem... co tam sobie kombinujesz
to najprościej by było puścić w szybkiej pętli inkrementacje, tak żeby sobie latało
w zakresie 0-255 w kółko, to zawsze coś innego wypadnie w momencie naciśnięcia tego
guzika...

Przyjrzyj się też z bliska standardowej funkcji random() w avrgcc (nie
rand tylko random :P), jej nagłówek znajdziesz w stdlib.h.

kawałek źródła biblioteki:

* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.


W tym zastosowaniu może też sprawdzi się taki prosty generator 16 bitowych liczb
pseudolosowych:

Random(n):= [(random(n-1)+1)*75] mod 65536

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 13:47 
Offline
Użytkownik

Dołączył(a): 19 kwi 2012
Posty: 29
Pomógł: 0

Może pan podać jakiś przykład np. losowania liczb od 1-9? Coś mało to zrozumiałem. I jak uprościć program, aby nie było w nim delayów?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 15:51 
Offline
Użytkownik

Dołączył(a): 06 paź 2011
Posty: 92
Lokalizacja: Kraków
Pomógł: 2

Według mnie funkcja random zjada strasznie dużo zasobów. Nie lepiej użyć do tego np. ostatniego bitu ADC?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 16:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Oczywiście że można użyć szumów na ADC (występują tylko na niższych bitach)
bo ww przypadku AVR, które mają skończona ilość stanów na portach , nie można mówić
o losowości , raczej tylko o pseudo losowości, ale na tym poziomie proponuję się zainteresować
właśnie funkcją random, po poznaniu której napisanie prostego algorytmu do pseudo losowego
generowania liczb nie będzie sprawiać problemu
np:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


najprościej , ale może nie najoptymalniej :)

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2012, o 17:43 
Offline
Użytkownik

Dołączył(a): 19 kwi 2012
Posty: 29
Pomógł: 0

Jaki zakres liczb generuje ten kod?
Jak zoptymalizować kod, aby było niewiele delayów?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO