10 kostek w jednej.pdf

(957 KB) Pobierz
Kostka.qxd
+
10 kostek w jednej
2491
Do czego to służy?
Zacznijmy od początku – najpierw Bóg stwo−
rzył Ziemię, potem stworzył człowieka i osa−
dził go na Ziemi. Dał człowiekowi wolną wo−
lę, a człowiek postanowił uprościć sobie życie
i stworzył mnóstwo rzeczy powodujących, że
ma więcej czasu. Posiadając coraz więcej
wolnego czasu człowiek, odkrył nudę i posta−
nowił na powrót zapełnić wolny czas. W tym
celu wymyślił różne gry, ale prawdziwą atrak−
cją było wprowadzenie do nich odrobiny
przypadkowości zwanej szczęściem, losem,
przeznaczeniem, hazardem... Aby szczęście
mogło się przejawić, wymyślono kostkę – to
był pierwszy przełom. Drugi właśnie następu−
je teraz i aktualnie o nim czytasz.
Tą drogą doszliśmy skrótowo od stworze−
nia świata do chwili obecnej, a ja kończę spe−
kulować i zabieram się do rzeczy.
Układ jest, kolejnym zresztą, opracowa−
nym przeze mnie „kombajnem losującym”.
Zawiera on w sobie 10 kostek, są to k3, k4,
k6, k8, k10, k12, k20, k30, k50 i k100. Z te−
go typu kostkami spotkałem się w swojej ka−
rierze Mistrza Gry i Gracza.
Tak na marginesie: bardziej spostrzegaw−
czy, ale mniej obeznani z grami fabularnymi
stwierdzą może, że nie da się stworzyć figu−
ry przestrzennej o 3 ścianach, więc w rze−
czywistości nie istnieje kostka 3−ścienna.
Jednak w literaturze można spotkać się z ta−
kim tworem – w tym celu po prostu rzuca się
kością k6, wynik dzieli przez dwa i zaokrą−
gla w górę. W podobny sposób można
w przedstawionym układzie uzyskać kostki
k25, k5, k2.
Projektując układ postawiłem przede
wszystkim na prostotę obsługi. Odpowiednia
kostka jest wybierana po prostu za pomocą
10− pozycyjnego przełącznika kodującego
BCD. Oprócz przełącznika wyboru kostki je−
dyne ruchome części to włącznik zasilania
oraz przycisk startu losowania.
Aby uatrakcyjnić układ, dodałem do nie−
go maleńki głośniczek wytwarzający różne
stuki i trzaski podczas losowania. Symulację
foniczną kostki można wyłączyć przytrzy−
mując przycisk losowania podczas włączania
układu – na początek trochę poprotestuje pi−
szcząc, ale po chwili zamilknie (tak nawia−
sem pisząc, to ten pisk to nie moja sprawka –
to wina procedur umieszczonych w proceso−
rze przez kompilator).
Jakby tego było mało, wynik po puszcze−
niu przycisku nie ukazuje się od razu, lecz
zwalnia, a ostatecznie miga trzykrotnie. Pod−
czas losowania wyświetlacza pojawia się
obiegająca go kreska. W czasie losowania
oraz podczas zwalniania wyniku zmiany
ustawień lub ponowne naciskanie przycisku
nic nie daje. Zostało to wprowadzone, aby
zapobiec ewentualnym próbom oszustwa.
Ale to nie wszystko! Kostki k3, k4 i k6 są
wyświetlane w postaci kropek (jak w praw−
dziwej kostce), wyniki kostek k10 i k100 za−
czynają się od 0, a reszty od 1 – również tak
jak jest naprawdę.
Drogi Czytelniku czy trzeba Cię jeszcze
przekonywać? Tak? To dodatkowo napiszę,
że program został napisany w taki sposób, że
posiadając BASCOM−a i programator mo−
żesz w prosty sposób zaprojektować własne
typy kostek i niemal dowolny wygląd poka−
zywanych wyników oraz animacje inne niż
obiegająca wyświetlacz kreska!
Myślę, że nie trzeba nic więcej pisać – ten
układ reklamuje się sam.
dzeń układu U1 koder dziesiętny S1 został
podłączony razem z wyświetlaczem – jego
odczyt jest dokonywany po każdorazowym
przeskanowaniu wszystkich linii wyświetla−
cza. Diody D1−D4 zabezpieczają nas przed
sytuacją, w której koder S1 zwierałby ze so−
bą linie sterujące katodami wyświetlacza –
nie spowodowałoby to co prawda uszkodze−
nia układu, jednak z pewnością uniemożliwi−
łoby prawidłowe wyświetlanie wyników.
Tranzystor T6 steruje głośnikiem poprzez re−
zystor R13, który zmniejsza co prawda gło−
śność, ale też, co jest dość istotne, pobór prą−
du. Dioda D5 została dodana, aby spiąć
ewentualne przepięcia pojawiające się na
cewce głośnika. Przełącznik S2 to przycisk
startu losowania.
Układ powinien być zasilany napięciem
z przedziału 2,7 – 6V co umożliwia zastoso−
wanie dwóch baterii R6, które przy stosunko−
wo małym poborze prądu przez układ (śre−
dnio około 100mA) powinny wystarczyć na
8−10 godzin pracy non−stop.
Naturalnie dusza układu nie mieści się na
schemacie, ponieważ jest nią program sterują−
cy umieszczony w kostce U1. Tutaj ze wzglę−
du na ograniczoną ilość miejsca omówię tylko
jego fragmenty.
Dla tych, którzy chcieliby program przero−
bić na AVR−a mam smutną wiadomość: nie−
stety nie będzie to łatwe ze względu na użycie
przeze mnie w kodzie dużej ilości asemblera.
Program zawiera się w dwóch plikach:
Kostka.bas i Dane kostki.bas. Pierwszy
z nich zawiera główną część programu i jego
edycje zalecałbym osobom troszkę bardziej
obeznanym z tematem. Drugi natomiast za−
wiera podprogram Ustaw_adres_danych , ta−
blice zawierającą dane animacji (w moim
przypadku kreska obiegająca wyświetlacz),
tablice Data_typy_kostek zawierającą liczbę
ścianek kostki dla kolejnych pozycji kodera
S1 i kilka tablic opisujących wygląd kostki.
Jak to działa?
Schemat ideowy układu przedstawiony jest
na rysunku 1. Nie jest to układ zbyt skompli−
kowany, co udało się osiągnąć dzięki zasto−
sowaniu mikrokontrolera AT89C2051.
Wyświetlacz pracuje na zasadzie multi−
pleksowania z częstotliwością około 80Hz.
Ze względu na niewielką liczbę wyprowa−
Elektronika dla Wszystkich
89
420281991.043.png 420281991.044.png 420281991.045.png
Tablice wyglądu kostki składają się z ele−
mentów po 5 bajtów. Każdy taki element opi−
suje jakby kolejną ściankę kostki (wyobraź−
cie sobie, jaka to była robota wpisać dane dla
k100), przy czym 0 oznacza diodę zapaloną,
1 – zgaszoną. Tablice są ułożone w taki spo−
sób, że obraz będzie wyglądał na wyświetla−
czu identycznie jak na tablicy. Najlepiej zo−
baczyć to na przykładzie danych do kostki k3
pokazanych na Listingu 1. Przy tej kostce
program wewnętrznie losuje liczby z zakresu
0−2, gdy zostanie wylosowane 0, to pobra−
nych zostanie 5 pierwszych bajtów z tablicy
i wyświetlona zostanie pojedyncza kropka,
gdy zostanie wylosowana 1 – pobrane zosta−
ną bajty 6−10... itd.
Podprogram Ustaw_adres_danych jest
napisany w asemblerze, ale jego działanie
jest stosunkowo proste: Jest on wywoływany,
gdy zostanie zmieniona pozycja S1, a jego
zadaniem jest – na podstawie zawartej
w akumulatorze pozycji przełącznika – wpi−
sanie do zmiennej W_adres_danych_kostki
wskaźnika do odpowiedniej tablicy. Zmienna
ta jest następnie używana podczas wizualizo−
wania wyniku losowania.
Po zmianie ustawienia kodera i upływie
około 1 sekundy wyświetlany jest nowo wy−
brany typ kostki (miga trzy razy), przy czym
k100 jest wyświetlana jako C (rzymskie 100),
ponieważ na wyświetlaczu nie potrafiłem po−
kazać liczby 100
„po Polsku”. Po co
to opóźnienie? Dzię−
ki temu rozwiązaniu
unikniemy kilka−
krotnego migania
kolejnych typów ko−
stek podczas kręce−
nia przełącznikiem –
po wybraniu typu
kostki liczba jej
ścianek wyświetli
się dopiero po 1 se−
kundzie i tylko raz.
Na Listingu 2
przedstawiłem pętle
główną (zresztą nie−
przyzwoicie krótką),
Listing 3 natomiast
pokazuje fragment
obsługi przerwania
Timera 0 odpowie−
dzialny za obsługę kodera. Oto krótki komen−
tarz: Po wykryciu zmiany ustawienia S1 do
zmiennej B_stalosc_kostki wpisywana jest
pewna stała wartość, która następnie jest
zmniejszana co 1/80 sekundy. Gdy jej wartość
„zejdzie” do zera, wybór kostki jest „zatwier−
dzany”, co objawia się ustawieniem bitu
Bit_kostka_zmieniona, co z kolei powoduje
w pętli głównej wyświetlenie nowej kostki i 3−
krotne mignięcie wyświetlacza. Należy tutaj
zaznaczyć, że chociaż typ kostki jest wyświe−
tlany z opóźnieniem, to sama kostka jest wy−
bierana natychmiast, co może spowodować,
że gdy naciśniemy przycisk losowania zaraz
po przestawieniu S1 nie zostanie wyświetlony
nowy typ kostki, mimo że losowanie odbywać
się będzie z kostką zgodną z pozycją S1.
Listing 2
Pętla_główną:
Do
Debounce Losuj , 0 , Losowanie
If Bit_kostka_zmieniona = 1 Then
B_wynik = 0 '− aby nie otrzymywać
bzdurnych wyników
Reset Bit_kostka_zmieniona
'− aby jak najszybciej uzyskać
info. o ponownej zmianie
Gosub Wyświetl_ustawioną_kostkę
Gosub Mignij_3x
End If
Loop
Z ciekawszych elementów programu wy−
pada jeszcze przedstawić fragment odpowie−
dzialny za losowanie – widzimy go na Listin−
gu 4: Po wejściu w tryb losowania ustawiane
są zmienne Bit_losowanie_trwa i Bit_anima−
cja – pierwsza powoduje, że w obsłudze prze−
rwanie timera 0 przestaje być testowany ko−
der, funkcja drugiej jest oczywista. Następnie
zmienna B_wynik jest zmieniana w zakresie
od 0 do B_wybrana_kostka − 1 (na przykład
Rys. 1 Schemat ideowy
90
Elektronika dla Wszystkich
Listing 1
Data_k3:
'1
Data &B1111111
Data &B1111111
Data &B1110111
Data &B1111111
Data &B1111111
'2
Data &B1111111
Data &B1111111
Data &B1011101
Data &B1111111
Data &B1111111
'3
Data &B1110111
Data &B1111111
Data &B1111111
Data &B1111111
Data &B1011101
420281991.046.png 420281991.001.png 420281991.002.png 420281991.003.png 420281991.004.png 420281991.005.png 420281991.006.png 420281991.007.png 420281991.008.png 420281991.009.png 420281991.010.png 420281991.011.png 420281991.012.png 420281991.013.png 420281991.014.png 420281991.015.png 420281991.016.png 420281991.017.png 420281991.018.png 420281991.019.png 420281991.020.png 420281991.021.png 420281991.022.png 420281991.023.png 420281991.024.png 420281991.025.png 420281991.026.png 420281991.027.png 420281991.028.png 420281991.029.png 420281991.030.png 420281991.031.png 420281991.032.png 420281991.033.png 420281991.034.png
Listing 3
If B_licznik_wierszy = 0 Then
If B_stalosc_kostki <> 0 Then
Decr B_stalosc_kostki
If B_stalosc_kostki = 0 Then Set
Bit_kostka_zmieniona
dzwieku odpowiednio ustawiona
Gosub Wyswietl_wylosowana_wartosc
Next
Reset Glosnik 'Aby głośnik nie
pobierał więcej prądu
Wykaz elementów
Rezystory
R1−R5 . . . . . . . . . . . . . . . . . . . . . . . . . . .3,,3−4,,7k
R13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
Gosub Mignij_3x
Reset Bit_losowanie_trwa
Reset Bit_kostka_zmieniona 'Aby
uniknąć wyświetlania typu kostki zaraz po
losowanu'gdy użytkownik nie poczekał po
jej zmianie przed rozpoczęciem losowania
Erase Temp_for
Goto Petla_glowna
(w ukłładziie niie przewiidziiano R6−R12)
Kondensatory
C1,,C2 . . . . . . . . . . . . . . . . . . . . . . . . . . . .20−40pF
C3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4,,7
End If
If Bit_losowanie_trwa = 0 Then
Gosub Przelacznik_do_acc
cjne A, {B_ostatnie_ustawienie},
Zmien_ustawiona_kostke
'Nie wiem czy if nie niszczy acc?
sjmp Nie_zmieniaj_kostki
!Zmien_ustawiona_kostke:
Mov {B_ostatnie_ustawienie}, A
Gosub Ustaw_nowa_kostke
B_stalosc_kostki =
Const_opoznienie_wyboru
!Nie_zmieniaj_kostki:
End If
Else
(... Obsługa wyświetlacza)
µ
F/16V
C4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100
µ
F/16V
Półprzewodniki
U1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .AT89C2051
T1−T5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .BC558C
T6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .BS170
D1−D5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1N4148
Różne
W1 . . . . . . . . . . . . .wyświiettllacz LED mattrycowy 5x7,,
wspóllna anoda
G1 . . . . . . . . . . . . . . . . . . . .miiniiatturowy głłośniiczek
S1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .koder BCD
S2 . . . . . . . . . . . . . . .miikroprzełłączniik z przyciiskiiem
S3 . . . . . . . . . . . . . .przełłączniik biisttabiillny do druku
X1 . . . . . . . . . . . . . . . . . .rezonattor kwarcowy 6MHz
dla k6: 0−5), aż do puszczenia przycisku. Od
tego momentu wyświetlacz wyświetla już
wyniki, ponieważ zmienna Bit_animacja
jest zerowana i program przechodzi do
zwalniania losowania: Zostało ta zrealizo−
wane w dwóch krokach w pętlach For... Ne−
xt za pomocą instrukcji Waitms . W pierw−
szym kroku losowanie zwalnia bardzo nie−
wiele, a w drugim zwalnia już dość mocno.
Taki sposób zwalniania został dobrany na
drodze eksperymentów, ponieważ po prostu
ładnie się prezentuje. Po zakończeniu obu
pętli niepotrzebna już zmienna Temp_for
jest usuwana, a wynik jest wyświetlany
i miga trzykrotnie. Ostatecznie bit Bit_loso−
wanie_trwa jest zerowany i wyko−
nywany jest skok spowrotem do pę−
tli głównej. Całe zwalnianie trwa
mniej więcej 3 sekundy. Uwaga:
przy analizie tej części programu
należy pamiętać, że opóźnienie in−
strukcji Waitms jest bazowane na
12MHz rezonatorze i ponieważ
w układzie zastosowano rezonator
6MHz, to generowane opóźnienia
będą 2 razy dłuższe.
W pliku Dane kostki.bas znajdują
się odpowiednie komentarze ułatwia−
jące stworzenie własnej kostki, dlat−
ego mam nadzieje, że jest to czyn−
ność dość prosta.
Osoby zainteresowane dokładniej−
szym poznaniem programu zachęcam do ana−
lizy kodu źródłowego, którą powinny ułatwić
dość bogate komentarze.
Listing 4
Losowanie:
B_wynik = 0
Set Bit_losowanie_trwa
Set Bit_animacja
If Bit_wylacz_dzwiek = 0 Then Gosub
Dzwiek_start 'Jęśli stukać to inicjacja
dźwięku
Płłyttka drukowana modułłu
jjestt dosttępna jako kiitt szkollny
AVT−2491
Do
Incr B_wynik
If B_wynik = B_wybrana_kostka Then
B_wynik = 0
Loop Until Losuj = 1
Gosub Wyswietl_wylosowana_wartosc
Reset Bit_animacja
Gosub Dzwiek_stop
Dim Temp_for As Byte
B_zmienna_dzwieku = 0
If Bit_wylacz_dzwiek = 0 Then Set
Const_bit_glosnika 'Czy stukać?
For Temp_for = 1 To 25 Step 1
'Pierwszy etap zwalniania
Incr B_wynik
If B_wynik = B_wybrana_kostka Then
B_wynik = 0
Waitms Temp_for
Waitms Temp_for
Mov A, {B_zmienna_dzwieku}
Xrl P1, A 'i stuk jeśli zmienna dzwieku
odpowiednio ustawiona
Gosub Wyswietl_wylosowana_wartosc
Next
For Temp_for = 1 To 240 Step 40
'Drugi etap
Rys. 2 Schemat montażowy
Układ nie został zaprojektowany pod ką−
tem umieszczenia go w konkretnej obudowie.
Proponuję zamontować go wraz z pojemni−
kiem na baterie na jakiejś sztywnej podkładce
– mnie osobiście taki wygląd układu odpo−
wiada, ale bardziej ambitni mogą dobrać od−
powiednią obudowę we własnym zakresie.
Kostka po zmontowaniu nie wymaga żad−
nego uruchomienia i jest od razu gotowa do
zabawy.
Montaż i uruchomienie:
Montaż przeprowadzamy w trochę niety−
powy sposób. Zaczynamy od jednej zwor−
ki i dwóch połączeń „kabelkowych”,
których ze względu na zastosowanie jed−
nostronnej płytki drukowanej nie udało mi
się uniknąć. Teraz następuje właśnie ten
nietypowy moment: Wszystkie rezystory
oraz diody D1,D4,D5 montujemy od stro−
ny druku. Należy zwrócić szczególną uwa−
gę na polaryzacje tych ostatnich. Dalszą
część montażu przeprowadzamy w typowy
sposób: zaczynając od elementów o naj−
mniejszych gabarytach, a kończąc na naj−
większych.
Incr B_wynik
If B_wynik = B_wybrana_kostka Then
B_wynik = 0
Waitms Temp_for
Waitms Temp_for
Mov A, {B_zmienna_dzwieku}
Xrl P1, A 'stuk jeśli zmienna
Radosław Koppel
Uwaga! Pliki z programem można ściągnąć
ze strony internetowej EdW
www.edw.com.pl/library/pliki/kostkaRK.zip.
Elektronika dla Wszystkich
91
420281991.035.png 420281991.036.png 420281991.037.png 420281991.038.png 420281991.039.png 420281991.040.png 420281991.041.png 420281991.042.png
Zgłoś jeśli naruszono regulamin