Spisu treści:

Samouczek asemblera AVR 11: 5 kroków
Samouczek asemblera AVR 11: 5 kroków

Wideo: Samouczek asemblera AVR 11: 5 kroków

Wideo: Samouczek asemblera AVR 11: 5 kroków
Wideo: Лекция 4. Архитектура AVR. Ассемблер 2024, Lipiec
Anonim
Samouczek asemblera AVR 11
Samouczek asemblera AVR 11
Samouczek asemblera AVR 11
Samouczek asemblera AVR 11
Samouczek asemblera AVR 11
Samouczek asemblera AVR 11

Witamy w samouczku 11!

W tym krótkim samouczku w końcu zbudujemy pierwszą część naszego końcowego projektu.

Pierwszą rzeczą, którą powinieneś zrobić, to przejść do ostatniego kroku tego samouczka i obejrzeć wideo. Więc wróć tutaj. [pauza, kiedy to robisz….] OK. Teraz kontynuuj.

Jeśli jeszcze nie zgadłeś, budujemy grę w kości! Oczywiście to, że buduję grę w kości, z pewnością nie oznacza, że musisz. Mam nadzieję, że to oczywiste. W każdym przypadku przydatne jest użycie mikrokontrolerów do sterowania segmentowanymi wyświetlaczami itp. i komunikowania się ze sobą - to jest głównie to, co tutaj robimy. Możesz napisać kod, aby używać ich w dowolny sposób. Na razie zamierzam zakodować je, aby grać w kości, chociaż później mogę zdecydować się na zmianę przeznaczenia segmentowych wyświetlaczy, aby zrobić coś innego.

Powodem, dla którego to buduję, jest to, że myślę, że w końcu mógłbym chcieć pełnowymiarowego stołu do gry w Vegas w mojej „męskiej jaskini” w piwnicy mojego domu. Jednak żaden z moich znajomych nie ma najmniejszego pojęcia, jak rozdawać, zdobywać punkty lub wypłacać zakłady i rzuty w kości. Pomyślałem więc, że byłoby fajnie, gdyby stół wykonał za nas całą pracę krupiera! Kiedy stawiamy zakład na stole, możemy również nacisnąć mały przycisk obok pola, na którym znajdują się nasze żetony, pokazując, ile jest tam postawione, a następnie mikrokontroler może obliczyć wypłatę za to pole po rzucie kostką i wyświetlić ją. Wciąż nie jestem jednak pewien, jak zorganizuję ten aspekt. Jedną z myśli, które miałem, było to, że każda osoba zostanie poproszona o postawienie wszystkich swoich zakładów po kolei, aby kontroler zapisał, gdzie są pieniądze każdej osoby, zanim zarejestruje następnego gracza i tak dalej. Następnie po rzucie komputer może pokazywać wypłaty na każdym polu, a także może prowadzić bieżącą „całkowitą gotówkę” dla każdego gracza.

Na jednym ze zdjęć na okładce tego samouczka musiałem użyć zdjęcia, na którym tego lata wyciągam 5 asów przy stole pokerowym w Vegas. Hehe. Zrób mi tę przyjemność.

Oto link do pełnej kolekcji moich samouczków asemblera AVR:

Krok 1: Kości

Kości!
Kości!
Kości!
Kości!
Kości!
Kości!

W tym samouczku będziemy konstruować tylko najprostszą część ostatecznej gry Craps. Nazywa się to „The Pass Line” i możesz na nią postawić. Możesz dowiedzieć się wszystkiego, co musisz wiedzieć o części gry „pass line”, oglądając krótki, 2-minutowy film instruktażowy, który dołączyłem do tego kroku.

Zbudujemy kolejny 4-cyfrowy wyświetlacz, który będzie śledził gotówkę krupiera w taki sam sposób, w jaki nasz obecny 4-cyfrowy wyświetlacz śledzi gotówkę gracza. Krupier zacznie od 20 dolarów, a gracz od 20 dolarów (całkowita możliwa kwota pieniędzy w grze to 9999 dolarów – maksimum naszych 4-cyfrowych wyświetlaczy, ale potrzebujemy tylko 20 dolarów na ten pierwszy element gry lub w przeciwnym razie byłoby ekstremalnie nużące i trudne do wygrania lub przegranej w przyzwoitym czasie). Jeśli gracz zbierze wszystkie pieniądze krupiera, wygrywa. Jeśli gracz straci wszystkie swoje pieniądze, wygrywa krupier.

Jak wygrywasz lub tracisz pieniądze? Cóż, ci z was, którzy grali w kości, widzieli ludzi „rzucających kości” na ulicy lub widzieli, jak grali przeciwko kasynu w Vegas, już wiedzą. Pozostałym osobom podam krótki opis „pass line” części gry, którą będziemy dzisiaj kodować.

W kości gra się od setek lat, sięgając czasów krucjat. Grali w nią żołnierze w okopach II wojny światowej, grali na ulicach, grali w kasynach i halach hazardowych. Zaczęło się tylko od przepustki, a wszystkie inne rzeczy zostały do niej dodane później. Będziemy śledzić ten sam postęp.

Sposób działania pass line jest taki. Stawiasz zakład, a następnie rzucasz kostką. Pierwsza rolka nazywana jest „rzutem wyjściowym”. Jeśli w rzucie wyjściowym uzyskasz 2 (wężowe oczy), 3 (as dwójka) lub 12 (samochody pudełkowe), przegrywasz zakład i nazywa się to „craps”. Jeśli wyrzucisz 7 (naturalna) lub 11 (yo lub jo-poziom), wygrywasz. Jeśli wyrzucisz inną liczbę, ta liczba stanie się Twoim „punktem”. Po ustaleniu „punktu” kontynuujesz rzucanie kostką w celu ponownego trafienia punktu przed wyrzuceniem 7. Jeśli zdobędziesz swój punkt przed wyrzuceniem 7, wygrywasz równe pieniądze. Tak więc zakład za dolara wygrywa dolara od krupiera. Jeśli dostaniesz 7 przed wyrzuceniem twojego punktu, nazywa się to „seven out” i przegrywasz swój zakład na rzecz krupiera.

Potem zaczynasz od nowa. Postaw zakład na linii przejścia i rzuć kostką, 7 lub 11 wygranych, 2, 3 lub 12 przegranych.

Istnieje wiele innych rodzajów zakładów, "nie pasują", "kursy pasują", "kursy nie pasują", "zakład Come", "Zakład nie pasują", "field", "horn", " twarde sposoby”, itp. itp. Szczegóły znajdziesz tutaj:

en.wikipedia.org/wiki/Craps

Jak powiedziałem powyżej, na razie będziemy kodować tylko część gry, która jest przepustką, która jest wszystkim, co mieli w czasach, gdy dzieci rzucały kośćmi o ścianę za pieniądze drugiego śniadania, więc od tego zaczniemy.

Zanim jednak zaczniemy kodować, zbudujmy wyświetlacz kasowy dealera. W tym celu chcę użyć jednego z większych 4-cyfrowych wyświetlaczy, które można dostać od Sparkfun lub gdzie indziej. Od teraz nie będę wymieniał materiałów na te tutoriale. Jeśli właściwie wszystko budowałeś razem ze mną, to już wiesz, skąd wziąć materiały i czym one są. Nie ma sensu wymieniać ich ani ile kosztują.

Więc weźmy jedną z naszych płyt prototypowych, duży 4-cyfrowy wyświetlacz, inny ATmega328p do sterowania tym wyświetlaczem i zbuduj go tak, jak robiliśmy to z rolką do gry i wyświetlaczem odtwarzacza wcześniej. Będziemy również dołączać nagłówki do zasilania, programowania i komunikacji TWI, tak jak inni.

Krok 2: Wyświetlacz gotówki dealera

Wyświetlacz gotówki dealera
Wyświetlacz gotówki dealera
Wyświetlacz gotówki dealera
Wyświetlacz gotówki dealera
Wyświetlacz gotówki dealera
Wyświetlacz gotówki dealera

Wyświetlacz krupiera skonstruowaliśmy w taki sam sposób, jak w przypadku 4-cyfrowego wyświetlacza gracza w poprzednim samouczku. Jedyne różnice polegają na tym, że jest większy i ma mniej pinów, więc inaczej go ułożymy i okablowamy.

Załączam zdjęcie okablowania tego wyświetlacza. Widać, że jest większy i ma mniej pinów niż nasz wyświetlacz gracza. Zdjęcie pochodzi ze strony sparkfun gdzie dostałem wyświetlacz i pokazuje które piny są zasilaniem dla każdej cyfry a które piny kontrolują każdy z segmentów w cyfrze.

Jak zwykle, powinieneś zacząć od podłączenia wyświetlacza do prototypowej płytki prototypowej i przetestować każdy segment, aby upewnić się, że rozumiesz, jak jest okablowany. Następnie powinieneś podłączyć go do pinów mikrokontrolera AVR na swojej płytce prototypowej i uruchomić go stamtąd, aż cały nasz kod będzie działał w tym samouczku. Na koniec zbuduj płytkę zewnętrzną i przylutuj ją. Następnie podczas testowania produktu końcowego będziesz wiedział, że wszelkie problemy wynikają z pracy lutowania i cięcia, a nie z kodu. Nie zapomnij też o dobrze znanym aksjomatem stolarskim „dwa razy mierz, raz tnij”, a w przypadku płytek drukowanych: „tnij dwa razy, raz lutuj”. Jak widać na zdjęciu, w końcu się zepsułem i kupiłem idealną przystawkę Dremel do tego rodzaju pracy. „Zestaw diamentowych punktów”. Kosztowało to 5 dolców, ale to o wiele mniej niż koszt terapii radzenia sobie z gniewem, która wiąże się z wykańczaniem mojej pracy przy strzyżeniu zbyt wiele razy z rzędu.

Do tego wyświetlacza używam rezystorów 330 omów. Piny COM przechodzą przez rezystor do GND, a zasilanie trafia do dowolnego segmentu, który chcesz wyświetlić. Zamierzam użyć PC0 do PC3 dla pinów COM i PB0, PB1, PB2, PB3, PB4, PD5, PD6 i PD7 dla segmentów.

Oto klucz do maksymalizacji szans na zrobienie tego dobrze:

  1. zaplanuj obwód
  2. przeciąć obwód
  3. sprawdź swoje okablowanie
  4. załóż rezystory, nasadki i oscylator kwarcowy
  5. ponownie sprawdź połączenia i okablowanie
  6. podłącz przewody zewnętrzne
  7. podłącz mikrokontroler
  8. ponownie sprawdź okablowanie
  9. dołącz 4-cyfrowy wyświetlacz
  10. sprawdź każdą cyfrę parą przewodów z płytki stykowej
  11. odłóż go na bok i napisz kod, wiedząc, że prawdopodobnie będziesz musiał coś poprawić później i mając nadzieję, że nie ukryłeś połączenia, które należy odciąć.

Pokazałem serię zdjęć mojej pracy związanej z okablowaniem. Proszę, zdaj sobie sprawę, że możesz dowolnie okablować swoje. Jest bardzo prawdopodobne, że znajdziesz lepszą mapę niż ja i powinieneś jej użyć. Nic w tych samouczkach nie zależy od sposobu podłączenia komponentów, o ile mają one prawidłowe porty wyjściowe. Które przypomina mi. Zauważ, że teraz są dwa nagłówki do SDA i dwa do SCL? Jak myślisz, dlaczego to zrobiliśmy?

Teraz, jak widać w załączonym kodzie na końcu samouczka, po prostu wyciąłem i wkleiłem kod z wyświetlacza odtwarzacza ostatniego samouczka do nowego pliku na wyświetlaczu krupiera. Następnie przejrzałem i zmieniłem tabelę wyszukiwania „segmentów”, aby odpowiadała nowej mapie pinów, zauważając, że dla tego wyświetlacza piny „com” są uziemione, a piny segmentowe mają napięcie 5 V, a nie odwrotnie, jak to było w przypadku innego wyświetlacza. Zmieniłem też inicjalizację portów, aby odzwierciedlić nowe okablowanie, zmieniłem adres wyświetlacza kasy dealerskiej na 0b1000000 aby walec z kostką mógł z nim rozmawiać, zmieniłem podprogram "cykl" tak aby wyłączał Piny PC0 do PC3 „com”, gdy chce zasilić określony segment, a ja zmieniłem „cyfrę”, która jest wyświetlana, ponieważ nowe okablowanie ma cyfry w odwrotnej kolejności (jeśli zostawiłeś to tak, jak było i próbowałeś wyświetlić 1234 to zamiast tego pojawiłby się jako 4321).

Oto nowa mapa rejestrów:

(PD7, PD6, PD5, PB4, PB3, PB2, PB1, PB0) = (punkt dziesiętny, c, g, b, f, a, e, d)

gdzie 1 jest WŁĄCZONE, a 0 WYŁĄCZONE.

Teraz przetestuj wyświetlacz, ustawiając najpierw inicjowaną wartość wyświetlacza na różne liczby, aby po włączeniu je wyświetlał. Dzięki temu dowiesz się, czy wszystko działa poprawnie.

Następnie zmodyfikuj kod dicerollera tak, aby używał nowego adresu dla urządzenia podrzędnego, połącz je ze sobą i uruchom. Powinno działać dokładnie tak samo, jak w poprzednim samouczku, z wyjątkiem tego, że rzuty kostką pojawiają się teraz na nowym ekranie.

Świetny! Teraz jesteśmy gotowi do napisania nowego kodu do gry w kości, aby komunikował się zarówno z wyświetlaczem gracza, jak i wyświetlaczem krupiera.

Krok 3: Zarys programu

Zarys programu
Zarys programu
Zarys programu
Zarys programu
Zarys programu
Zarys programu

Sposób, w jaki kod będzie działał w naszej grze, będzie polegał na tym, że rolka do gry zostanie zachowana jako główna i dodamy wyświetlacz krupiera jako dodatkowy niewolnik. Rolka do gry będzie kontrolowała grę i wyśle wynikłe zmiany w gotówce do krupiera, a gracz wyświetli po każdym rzucie. Na razie za każdym razem będziemy mieli po prostu zakład „pass line” wynoszący 10 $, więc nie musimy się zbytnio komplikować, gdy gracz zmieni swój zakład. Później, gdy mechanika już będzie działać, dodamy kolejny kontroler, który będzie dodatkowym masterem, który będzie kontrolował obstawianie i wypłaty, a nasz walec pozostanie mistrzem, ale będzie używany tylko do rzucania kostką. Umożliwi nam to dostęp do arbitrażu TWI, kolizji i innych ważnych aspektów komunikacji szeregowej, gdy masz wielu nadrzędnych i podrzędnych. Dodamy również kilka pojedynczych 7-cyfrowych wyświetlaczy z przyciskami pod nimi, które pozwolą nam obstawiać inne typy rolek, ale wszystko to pojawi się w przyszłych samouczkach. Na razie chcemy tylko, aby rolka do gry była mistrzem, a dwa wyświetlacze jako niewolniki. Kiedy naciśniemy przycisk, kod zadecyduje, czy wypłacić naturalny, wziąć pieniądze z kości, czy rozgałęzić się do serii rzutów „punktowych”, aż do wygranej lub siedmio-outowej.

Najpierw napiszmy podprogramy podrzędne. Są one proste, ponieważ wszystko, co zrobią, to zobaczą linię SDA w poszukiwaniu swojego adresu, jeśli zostaną wywołani, przeczytają nowy numer, aby go wyświetlić i wyświetlić. To wszystko! Nie muszą nawet rozmawiać z mistrzem, ponieważ mistrz będzie śledził ich sumy i przeprowadzał wszystkie obliczenia wypłat przed ich aktualizacją. W przyszłych samouczkach będziemy mieli niewolników piszących z powrotem do mistrza (na przykład, gdy mamy pojedynczy 7-cyfrowy wyświetlacz z przyciskami do określania kwoty zakładu, będą musieli powiedzieć mistrzowi, ile jest obstawiane na każdym wyświetlaczu, więc będziemy zaadresuj je za pomocą adresu + przeczytaj wywołanie z masterem w "trybie master receivera"), ale do tego dojdziemy w odpowiednim czasie.

Na razie wszystko jest inicjowane przez naciśnięcie przycisku rzucania kostką, po którym następuje obliczenie lub kolejne naciśnięcia przycisku, a na końcu wiadomość na każdym z wyświetlaczy z ich nowymi sumami. Po każdej wypłacie zostanie przeprowadzony test w celu ustalenia, czy gracz wygrał, czy przegrał, innymi słowy, czy po rzucie krupier zmniejszy się do zera, czy też po rzucie gracz wyniesie zero (ani krupier, ani gracz może stać się ujemny, ponieważ będą mogli postawić tylko 10 USD lub cokolwiek zostanie, jeśli jest to mniej niż 10 USD).

Tak to będzie działać. Zajmijmy się kodowaniem.

Krok 4: Główny kod komunikacyjny

Główny kod komunikacyjny
Główny kod komunikacyjny

Możemy teraz napisać procedurę komunikacyjną kostki do gry. Jest również prawie identyczny z tym, który pisaliśmy ostatnio, z wyjątkiem tego, że będziemy komunikować się z dwoma różnymi niewolnikami, a nie tylko z jednym. Zauważ, że dla każdego slave'a używamy innego adresu. Powinieneś samodzielnie zmodyfikować kod, a następnie po prostu przetestować go z każdym adresem i upewnić się, że działa tak jak w poprzednim samouczku, z wyjątkiem każdego oddzielnego ekranu.

Dołączę kod dla każdego komponentu, który po prostu wyświetla wynik rolki, aby można go było użyć do prawidłowego działania wyświetlaczy i sprawdzenia okablowania.

Kodowanie gry nie wprowadza niczego nowego, jeśli chodzi o polecenia języka asemblerowego lub komponenty mikrokontrolera AVR, więc nie czuję, że muszę przez to przechodzić linijka po linijce. Zapewne zauważyłeś, że kiedy wprowadzamy coś nowego, analizuję każdą linijkę w najdrobniejszych szczegółach, aż do tego stopnia, że cię irytuję, jeśli nie usypiam. Z drugiej strony nie zrobię tego, jeśli nie wprowadzę nic nowego. Tak jest dzisiaj. Myślę więc, że jesteś już przygotowany do zabawy z kodem, czytania kodu, analizowania kodu, rozumienia kodu, krytykowania kodu, wyśmiewania kodu i śmiania się z gościa, który go napisał. Więc pozwolę ci iść dalej i to zrobić. Jest prawie pewne, że znajdziesz wiele miejsc, w których możesz poprawić lub przynajmniej uprościć to, co napisałem.

Jak zwykle załączyłem ostateczną wersję kodu dla dwóch wyświetlaczy i dicerollera w kolejnym kroku wraz z filmem, na którym testuję to.

Krok 5: Ostateczny kod i wideo

Załączam wideo i 3 programy. Zauważysz, że możesz ustawić zakład oraz początkowego krupiera i gotówkę gracza na górze programu za pomocą wyciągów.equ.

W następnym samouczku dodamy możliwość obstawiania różnych rzeczy, co sprawi, że gra będzie bardziej ekscytująca. Ciekawą rzeczą w nowoczesnych Craps jest to, że masz wiele różnych sposobów obstawiania i maksymalizacji szans. W rzeczywistości Craps to gra o najwyższych szansach w Kasynie! … JEŚLI wiesz, jak to zagrać. Z drugiej strony, jeśli nie wiesz, jak grać, staje się to jedną z gier o najniższych szansach.

Gdy będziemy mieli więcej rzeczy, na które możemy postawić nasze pieniądze, wtedy zwiększę całkowitą sumę pieniędzy w grze.

Powinnam być zabawna!

Do zobaczenia następnym razem!

Zalecana: