Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

elektroniczna ruletka

07 Kwi 2006 20:20 1425 5
  • Poziom 10  
    witam. od jakiegoś czasu zacząłem sie bawić z AVR. Chcę zaprogramować w bascomie AT90S2313 tak, aby po nacisnięciu przycisku losował jedną z 12 diod, po wylosowaniu, gdy wciśniety zostanie przycisk diody powinny wracać do pierwotnego stanu (diody wygaszone), diody reaguja na stan niski i sa podpiete pod wszystkie porty prócz d0-przycisk, d4 i d5- kwarc. pozdr. zolter17
  • Poziom 22  
    zastosuj funkcję rnd
    Przeznaczenie:

    Zwraca pseudolosową liczbę z określonego zakresu.



    zmienna = RND( zakres )

    gdzie

    zmienna dowolna zmienna numeryczna, w której znajdzie się wygenerowana liczba pseudolosowa,
    zakres liczba określająca górną granicę generowanych liczb.
    Użyj później tej liczby do wysterowania portów ledek i masz problem z głowy.
    Poczytaj zestaw instrukcji i funkcji w helpie.
    Pozdrawiam

    Dodano po 8 [minuty]:

    Dim cyfra As byte
    cyfra = Rnd(13) 'zwraca liczbę pseudolosową z zakresu 0-12
    select case cyfra'teraz w zależności jaka cyfra wylosowana zapalasz ledy
    case 1: reset portx.x
    case 2:reset port.x.y
    itd.

    end select
    pozostaje to zapiąc w pętlę zrobić wygaszenie reagujące na przycisk itd.
  • Poziom 10  
    funkcje RND znam. tez myslałem nad jej wykorzystaniem. ale mo chodziło o coś troszkę innego. jako poszątkujący napisałem coś takiego, pewnie to coś badziewnego no ale cóż, kazdy keidyś zaczyna. Najgorsze jest to ze gdy program zatrzyma sie na tej ostatniej diodzie wszystko staje i nie moge przejsć dalej, chciałem zrobic skok "Goto koniec" zeby po wcisnieciu przycisku zaczynało wszystko od początku.


    Config Portb = Output
    Config Portd = &B1111110
    Portb = 255
    Portd = 127
    Dim X As Integer
    Restart:
    Portb = &B11111111
    Portd = &B1111111
    Do
    If Pind.0 = 0 Then

    Do

    Portb = &B11111110
    Portd = &B1111111
    Waitms 50

    Portb = &B11111101
    Portd = &B1111111
    Waitms 50

    Portb = &B11111011
    Portd = &B1111111
    Waitms 50

    Portb = &B11110111
    Portd = &B1111111
    Waitms 50

    Portb = &B11101111
    Portd = &B1111111
    Waitms 50

    Portb = &B11011111
    Portd = &B1111111
    Waitms 50

    Portb = &B10111111
    Portd = &B1111111
    Waitms 50

    Portb = &B01111111
    Portd = &B1111111
    Waitms 50

    Portb = &B11111111
    Portd = &B1110111
    Waitms 50

    Portb = &B11111111
    Portd = &B1101111
    Waitms 50

    Portb = &B11111111
    Portd = &B1011111
    Waitms 50

    Portb = &B11111111
    Portd = &B0111111
    Waitms 50


    Loop Until X > 500
    End If
    Loop
    End
    Zwalniaj:
    X = Rnd(100)
    Do

    Portb = &B11111110
    Portd = &B1111111

    X = X + 5

    Waitms X

    Portb = &B11111101
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11111011
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11110111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11101111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11011111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B10111111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B01111111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B1110111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B1101111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B1011111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B0111111
    X = X + 5
    Waitms X
    Loop Until X > 500
    Do
    Koniec:
    If Pind.0 = 0 Then

    Goto Restart

    Loop
    End If
    End
  • Poziom 16  
    Pogram zatrzymuje sie, bo wykonujesz dwie pętle jedna w drugiej i nie ma mozliwości wyskoczenia z nich. W programie głównym nie ma wywołania podprogramu który napisałeś.

    Co do sposobu zapisu- straaasznie to długie. Ten kawałem który ma zaświecać LED-y w kółko proponuję zapisać tak:
    Code:
    Portb = &B11111111 
    
    Portd = &B1111111

    For k=0 to 7
      Reset Portb.k
      Waitms 50
      Set Portb.k
    Next k

    For k=1 to 7
      Reset Portd.k
      Waitms 50
      Set Portd.k
    Next k


    Instrukcje Set oraz Reset wpisują odpowiednio "1" oraz "0" do danego bitu nie zmieniając pozostałych. Bity liczymy od prawej strony bajtu zaczynając od zera. Znacznie krócej i dużo bardziej przejrzyście. No i miejsca w pamięci też mniej zajmie. W przypadku BASCOMa to ważne.
    Spróbuj przepisać program mniej więcej w takim stylu jak powyżej a przekonasz się, że ewentualnie błędy od razu zauważysz.

    Co do wyskakiwania z pętli, są różne sposoby. Jeśli np chcesz żeby pętla wykonywała się tak długa jak długo trzymasz wciśnięty przycisk to możesz to zrobić np tak:
    Code:
    Do
    
      ...
      ... (jakieś instrukcje)
      ...
    Loop Until Pind.0=1

    albo powiedzmy tak:
    Code:
    Do
    
      ...
      ... (jakieś instrukcje)
      ...
      If Pind.0=1 Then
      Exit Do
      End If
    Loop
  • Poziom 10  
    nio dziekuje za pomoc, ale nadal mi to nie wychodzi. moze mi to ktoś napisać, bo ja chyba tego narazie nie rozumiem-za wysokie progi, a w poniedzialek musze oddać projekt do sprawdzenia. pozdr i thx
  • Poziom 10  
    nie no, pisze kombinuje i nic mi nie wychodzi. losuje liczbe i według niej zmniejsza szybkość przeskoku pomiedzy diodami. na koncy swieci sie jedna dioda (tak jak powinnno być) ale pozniej przycisk nie reaguje, zeby mozna było je wygasić. POMOCY...

    Config Portb = Output
    Config Portd = &B1111110
    Portb = 255
    Portd = 127
    Dim X As Integer
    Restart:
    Do
    If Pind.0 = 0 Then
    Goto Zwalniaj
    End If
    loop
    Zwalniaj:
    X = Rnd(100)
    Do
    Portb = &B11111110
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11111101
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11111011
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11110111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11101111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11011111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B10111111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B01111111
    Portd = &B1111111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B1110111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B1101111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B1011111
    X = X + 5
    Waitms X
    Portb = &B11111111
    Portd = &B0111111
    X = X + 5
    Waitms X
    If Pind.0 = 0 Then
    Goto Restart
    End If
    Loop Until X > 400
    End