Inhoudsopgave:

AVR Assembler Tutorial 11: 5 stappen
AVR Assembler Tutorial 11: 5 stappen

Video: AVR Assembler Tutorial 11: 5 stappen

Video: AVR Assembler Tutorial 11: 5 stappen
Video: AVR Ассемблер. Урок 11. LCD. AVR Assembler. Lesson 11. LCD. 2024, November
Anonim
AVR-montagehandleiding 11
AVR-montagehandleiding 11
AVR-montagehandleiding 11
AVR-montagehandleiding 11
AVR-montagehandleiding 11
AVR-montagehandleiding 11

Welkom bij les 11!

In deze korte tutorial gaan we eindelijk het eerste deel van ons afstudeerproject bouwen.

Het eerste dat u moet doen, is naar de allerlaatste stap van deze tutorial gaan en de video bekijken. Kom dan hier terug. [pauzeert terwijl je dat doet….] Oké. Ga nu verder.

Als je het nog niet geraden hebt, we bouwen een Craps-spel! Natuurlijk, alleen omdat ik een craps-spel aan het bouwen ben, betekent dat zeker niet dat je dat moet doen. Ik hoop dat dat vanzelfsprekend is. Het is in ieder geval nuttig om microcontrollers te gebruiken om gesegmenteerde displays enz. te besturen en met elkaar te communiceren -- dat is voornamelijk wat we hier doen. Je kunt code schrijven om ze te gebruiken zoals je wilt. Voor nu ga ik ze coderen om craps te spelen, hoewel ik later kan besluiten om de gesegmenteerde displays opnieuw te gebruiken om iets anders te doen.

De reden dat ik dit bouw, is omdat ik denk dat ik uiteindelijk een Vegas craps-tafel op ware grootte wil in mijn "mannenhol" in de kelder van mijn huis. Geen van mijn vrienden heeft echter ook maar het minste idee hoe ze moeten handelen, scoren of uitbetalen met craps-inzetten en -rolls. Dus ik dacht dat het cool zou zijn om de tafel al het dealerwerk voor ons te laten doen! Als we een weddenschap op de tafel plaatsen, kunnen we ook op een kleine drukknop drukken naast het vakje waarop onze fiches staan om te laten zien hoeveel er daar is geplaatst, dan kan de microcontroller de uitbetaling voor dat vakje berekenen na de dobbelsteenworp en deze weergeven. Ik ben er echter nog niet helemaal uit hoe ik dit aspect ga organiseren. Een gedachte die ik had was dat elke persoon zal worden gevraagd om al zijn weddenschappen om de beurt te plaatsen, zodat de controller zal registreren waar het geld van elke persoon is voordat de volgende speler wordt opgenomen, enzovoort. Na de worp kan de computer de uitbetalingen op elk veld laten zien en kan ook een "totaal geld" voor elke speler bijhouden.

Voor een van de omslagfoto's van deze tutorial moest ik gewoon een foto gebruiken waarop ik deze zomer 5 azen aan de pokertafel in Vegas trok. Hehe. Verwen mij.

Hier is een link naar de volledige verzameling van mijn AVR-assembler-tutorials:

Stap 1: Craps

Craps!
Craps!
Craps!
Craps!
Craps!
Craps!

In deze tutorial bouwen we alleen het eenvoudigste deel van het uiteindelijke Craps-spel. Dit wordt "The Pass Line" genoemd en u kunt erop wedden. Je kunt alles leren wat je moet weten over het "pass line"-gedeelte van het spel door de korte instructievideo van 2 minuten te bekijken die ik bij deze stap heb gevoegd.

We zullen nog een 4-cijferig display bouwen dat het geld van de dealer bijhoudt op dezelfde manier als ons huidige 4-cijferige display het geld van de speler bijhoudt. De dealer begint met $ 20 en de speler begint met $ 20 (het totale mogelijke geld in het spel is $ 9999 -- het maximum van onze 4-cijferige displays, maar we hebben slechts $ 20 nodig voor dit eerste stuk van het spel of anders is het extreem vervelend zou zijn en moeilijk te winnen of te verliezen in een behoorlijke hoeveelheid tijd). Als de speler al het geld van de dealer neemt, wint de speler. Als de speler al zijn geld verliest, wint de dealer.

Hoe win of verlies je geld? Welnu, degenen onder jullie die Craps hebben gespeeld, mensen hebben zien "dobbelen" op straat, of het hebben zien spelen tegen het casino in Vegas, zullen het al weten. Voor de rest van jullie, laat me je een korte beschrijving geven van het "pass line"-gedeelte van het spel dat we vandaag gaan coderen.

Craps wordt al honderden jaren gespeeld, daterend uit de tijd van de kruistochten. Het werd gespeeld door troepen in de loopgraven van de Tweede Wereldoorlog, het werd gespeeld op straat, het werd gespeeld in casino's en gokhallen. Het begon met alleen de paslijn en alle andere dingen werden er later aan toegevoegd. We zullen dezelfde ontwikkeling volgen.

De manier waarop de pass line werkt is dit. Je plaatst een weddenschap en dan gooi je de dobbelstenen. De eerste worp wordt de "come-out roll" genoemd. Als je een 2 (slangenogen), een 3 (ace deuce) of een 12 (box cars) krijgt op de come-out roll, verlies je je inzet en wordt dit "craps" genoemd. Als je een 7 (een natuurlijke) of een 11 (een jo of jo-leven) gooit, win je. Als je een ander nummer gooit, wordt dit nummer je "punt". Zodra een "punt" is vastgesteld, blijft u de dobbelstenen gooien met als doel het punt opnieuw te raken voordat u een 7 gooit. Als u uw punt krijgt voordat een 7 is gegooid, wint u zelfs geld. Dus een inzet van een dollar levert je een dollar op van de dealer. Als je een 7 krijgt voordat je punt wordt gegooid, wordt dit "zeven uit" genoemd en verlies je je inzet van de dealer.

Daarna begin je opnieuw. Plaats een weddenschap op de pass line en gooi de dobbelstenen, 7 of 11 overwinningen, 2, 3 of 12 verliezen.

Er zijn veel meer soorten weddenschappen, "don't pass", "pass odds", "don't pass odds", "come bet", "don't come bet", "field", "horn", " harde manieren", enz enz enz. Details vindt u hier:

en.wikipedia.org/wiki/Craps

Zoals ik hierboven al zei, zullen we voorlopig alleen het deel van het spel coderen dat alles was wat ze hadden in de tijd dat kinderen dobbelstenen tegen de muur gooiden voor elkaars lunchgeld en dus dit is waar we zullen beginnen.

Laten we echter, voordat we beginnen met het coderen van dingen, de kassa van de dealer bouwen. Hiervoor wil ik een van de grotere 4-cijferige displays gebruiken die je bij Sparkfun of elders kunt krijgen. Vanaf nu ga ik geen materialen meer vermelden over deze tutorials. Als je eigenlijk alles samen met mij hebt gebouwd, weet je al waar je de materialen kunt krijgen en wat ze zijn. Het heeft voor mij geen zin om ze op te noemen of hoeveel ze kosten.

Dus laten we een van onze prototypeborden pakken, een groot 4-cijferig display, een andere ATmega328p om dat display te besturen, en het bouwen zoals we deden met de dobbelsteenroller en het spelersdisplay daarvoor. We zullen ook headers toevoegen voor stroom, voor programmering en voor TWI-communicatie, net als de anderen.

Stap 2: Cash-display van de dealer

Dealer Cash Display
Dealer Cash Display
Cash-display van de dealer
Cash-display van de dealer
Cash-display van de dealer
Cash-display van de dealer

We construeren het dealerdisplay op dezelfde manier als we deden met het 4-cijferige display van de speler in de laatste tutorial. De enige verschillen zijn dat hij groter is en minder pinnen heeft, dus we zullen hem anders rangschikken en bedraden.

Ik heb een foto bijgevoegd van de bedrading van dit scherm. Je kunt zien dat deze groter is en minder pinnen heeft dan onze playercash display. De afbeelding is van de sparkfun-pagina waar ik het display heb gekregen en het laat zien welke pinnen de macht hebben voor elk cijfer en welke pinnen elk van de segmenten in een cijfer besturen.

Zoals gewoonlijk moet u beginnen met het aansluiten van het scherm op uw prototype-broodbord en elk segment testen om er zeker van te zijn dat u begrijpt hoe het is aangesloten. Vervolgens moet je het aansluiten op de pinnen van een AVR-microcontroller op je breadboard en het vanaf daar uitvoeren totdat al onze code in deze tutorial werkt. Ten slotte moet u aan het einde het externe bord bouwen en erop solderen. Wanneer u het eindproduct test, weet u dat eventuele problemen afkomstig zijn van uw soldeer- en snijwerk en niet van de code. Vergeet ook niet het bekende axioma uit het timmerwerk "twee keer meten en één keer knippen", of in het geval van het maken van printplaten: "twee keer knippen, één keer solderen". Zoals je op de foto kunt zien, ging ik uiteindelijk kapot en kocht ik het perfecte Dremel-hulpstuk voor dit soort werk. Een "Diamant Punt Set". Het kostte 5 dollar, maar dat is een stuk minder dan de kosten van de woedebeheersingstherapie die gepaard gaat met het te vaak achter elkaar opknappen van mijn snijwerk.

Ik gebruik 330 ohm weerstanden voor dit scherm. De COM-pinnen gaan door de weerstand naar GND en de stroom gaat naar het segment dat u wilt weergeven. Ik ga PC0 tot en met PC3 gebruiken voor de COM-pinnen en PB0, PB1, PB2, PB3, PB4, PD5, PD6 en PD7 voor de segmenten.

Hier is de sleutel tot het maximaliseren van uw kansen om het goed te doen:

  1. het circuit in kaart brengen
  2. verbreek het circuit
  3. controleer je bedrading
  4. bevestig de weerstanden, de doppen en de kristaloscillator
  5. controleer de aansluitingen en bedrading opnieuw
  6. bevestig de externe draden
  7. bevestig de microcontroller
  8. controleer de bedrading opnieuw
  9. bevestig het 4-cijferige display
  10. controleer elk cijfer met een paar draden van het breadboard
  11. leg het opzij en schrijf de code, wetende dat je later waarschijnlijk dingen zult moeten aanpassen en hopen dat je een verbinding die moet worden verbroken niet hebt verdoezeld.

Ik heb een reeks foto's van mijn bedradingswerk laten zien. Realiseer je alsjeblieft dat je vrij bent om de jouwe te bedraden zoals je wilt. Het is zeer waarschijnlijk dat u een betere kaart kunt vinden dan ik en dat u deze moet gebruiken. Niets in deze tutorials hangt af van hoe uw componenten zijn bedraad, zolang ze de juiste outputpoorten hebben. Wat me eraan herinnert. Merk op dat er nu twee headers naar SDA gaan en twee naar SCL? Waarom denk je dat we dat deden?

Nu, zoals je kunt zien aan de bijgevoegde code aan het einde van de tutorial, heb ik de code van de spelerweergave van de laatste tutorial eenvoudig geknipt en geplakt in een nieuw bestand voor de dealerweergave. Toen ging ik door en veranderde de opzoektabel "segmenten" om overeen te komen met de nieuwe pinkaart, waarbij ik opmerkte dat voor dit scherm de "com"-pinnen zijn geslepen en de segmentpinnen 5V zijn in plaats van andersom zoals het was voor het andere scherm. Ik heb ook de initialisatie van de poorten gewijzigd om de nieuwe bedrading weer te geven, ik heb het adres van het dealercash-display gewijzigd in 0b1000000 zodat de dobbelsteenroller met hem kan praten, ik heb de subroutine "cyclus" gewijzigd zodat het de PC0 via PC3 "com" pinnen wanneer het een bepaald segment wil voeden en ik heb het "cijfer" gewijzigd dat wordt weergegeven, aangezien de nieuwe bedrading de cijfers in de tegenovergestelde volgorde heeft (als je het liet zoals het was en probeerde het 1234 weer te geven in plaats daarvan zou zijn verschenen als 4321).

Hier is de nieuwe registerkaart:

(PD7, PD6, PD5, PB4, PB3, PB2, PB1, PB0) = (decimaal punt, c, g, b, f, a, e, d)

waarbij 1 AAN is en 0 UIT is.

Test nu het display door eerst de geïnitialiseerde waarde van het display in te stellen op verschillende cijfers, zodat deze bij het inschakelen worden weergegeven. Dit zal u vertellen of alles correct werkt.

Pas vervolgens de diceroller-code aan zodat deze het nieuwe adres voor de slave gebruikt, haak ze aan elkaar en voer het uit. Het zou precies hetzelfde moeten werken als wat we in de vorige tutorial hebben gedaan, behalve dat de dobbelstenen nu op het nieuwe scherm verschijnen.

Super goed! Nu zijn we klaar om de nieuwe code voor de dobbelsteenrol te schrijven, zodat deze communiceert met zowel het spelersdisplay als het dealerdisplay.

Stap 3: Programmaoverzicht

Programmaoverzicht
Programmaoverzicht
Programmaoverzicht
Programmaoverzicht
Programmaoverzicht
Programmaoverzicht

De manier waarop de code voor ons spel gaat werken, is dat we de dobbelsteenroller als de meester behouden en het dealerdisplay als een extra slaaf toevoegen. De dobbelsteenroller bestuurt het spel en stuurt de resulterende veranderingen in contanten naar de dealer en de speler toont na elke worp. Voor nu hebben we gewoon dat de pass line-inzet elke keer $ 10 is, dus we hoeven nog niet al te ingewikkeld te worden als de speler zijn inzet verandert. Later, zodra we de mechanica hebben werken, zullen we een andere controller toevoegen die een extra master zal zijn die de weddenschappen en de uitbetalingen zal regelen, en onze dobbelsteenroller blijft een master, maar wordt alleen gebruikt voor het werpen van de dobbelstenen. Dit stelt ons in staat om TWI-arbitrage, botsingen en andere belangrijke aspecten van seriële communicatie te behandelen wanneer u meerdere masters en slaves hebt. We zullen ook een aantal enkele 7-cijferige displays toevoegen met drukknoppen eronder waarmee we op andere soorten worpen kunnen wedden, maar dat alles zal in toekomstige tutorials komen. Voor nu willen we alleen de dobbelsteenroller als master en de twee displays als slaven. Wanneer we op de knop drukken, zal de code beslissen of we een natural uitbetalen, geld nemen van een craps, of branch naar een "point" serie rollen tot een overwinning of een zeven-out.

Laten we eerst de slave-routines schrijven. Deze zijn eenvoudig in die zin dat ze alleen naar de SDA-regel voor hun adres kijken, als ze worden gebeld, zullen ze het nieuwe nummer lezen om het weer te geven en weer te geven. Dat is alles! Ze hoeven niet eens terug te praten met de master, omdat de master hun totalen bijhoudt en alle uitbetalingsberekeningen uitvoert voordat ze worden bijgewerkt. In toekomstige tutorials zullen we slaven laten terugschrijven naar de master (als we bijvoorbeeld enkele 7-cijferige displays hebben met drukknoppen voor het inzetbedrag, zullen ze de master moeten vertellen hoeveel er op elk display wordt ingezet en dus zullen we adresseer ze met een adres + lees oproep met de master in "master receiver mode") maar daar komen we te zijner tijd op terug.

Voor nu wordt alles op gang gebracht door het indrukken van de dobbelsteenworpknop, gevolgd door een berekening of verder indrukken van de knop en tot slot een bericht naar elk van de displays met hun nieuwe totalen. Na elke uitbetaling zal er een test zijn om te bepalen of de speler heeft gewonnen of verloren, met andere woorden, of het geld van de dealer nul wordt na een worp, of dat het geld van de speler nul wordt na een worp (noch de dealer of de speler negatief kunnen worden, omdat ze alleen $ 10 mogen inzetten of anders wat er nog over is als het minder dan $ 10 is).

Zo gaat het dus werken. Laten we gaan coderen.

Stap 4: Mastercommunicatiecode

Hoofdcommunicatiecode
Hoofdcommunicatiecode

We kunnen nu de communicatieroutine van de dobbelsteenrol schrijven. Het is ook bijna identiek aan degene die we de vorige keer schreven, behalve dat we zullen communiceren met twee verschillende slaven in plaats van slechts één. Merk op dat we voor elk van de slaven een ander adres gebruiken. U dient de code zelf aan te passen en deze vervolgens met elk adres te testen en ervoor te zorgen dat deze net zo werkt als de vorige zelfstudie, behalve met elk afzonderlijk scherm.

Ik zal de code voor elk onderdeel bijvoegen die eenvoudig het resultaat van de rol weergeeft, zodat het kan worden gebruikt om de displays goed te laten werken en de bedrading te controleren.

Het coderen van het spel introduceert niets nieuws wat betreft assembleertaalcommando's of AVR-microcontrollercomponenten en dus heb ik niet het gevoel dat ik het regel voor regel moet doornemen. Je hebt waarschijnlijk gemerkt dat wanneer we iets nieuws introduceren, ik elke regel tot in de kleinste details doorloop tot het punt dat je je ergert als je niet in slaap valt. Aan de andere kant zal ik dat niet doen als er niets nieuws wordt geïntroduceerd. Dat is vandaag het geval. Dus ik denk dat je nu klaar bent om met de code te spelen, de code door te lezen, de code te analyseren, de code te begrijpen, de code te bekritiseren, de code te bespotten en de man uit te lachen die de code heeft geschreven. Dus ik zal je laten gaan en dat doen. Het is vrijwel zeker dat je veel plaatsen zult vinden die je kunt verbeteren of op zijn minst vereenvoudigen wat ik heb geschreven.

Ik heb, zoals gewoonlijk, de definitieve versie van de code voor de twee schermen en de diceroller bijgevoegd in de volgende stap, samen met een video waarin ik het ding test.

Stap 5: Definitieve code en video

Ik heb de video en de 3 programma's bijgevoegd. U zult merken dat u de inzet en het startgeld van de dealer en speler bovenaan het programma kunt vastleggen met.equ-verklaringen.

In de volgende tutorial zullen we de mogelijkheid toevoegen om op verschillende dingen te wedden, wat het spel spannender zal maken. Het interessante van moderne Craps is dat je een groot aantal verschillende manieren hebt om in te zetten en je kansen te maximaliseren. Craps is zelfs het spel met de hoogste kansen in het casino! … ALS je weet hoe je het moet spelen. Aan de andere kant, als je niet weet hoe je moet spelen, wordt het een van de spellen met de laagste kansen.

Zodra we meer dingen hebben om ons geld op in te zetten, zal ik het totale geldbedrag in het spel verhogen.

Ik zou leuk moeten zijn!

Tot de volgende keer!

Aanbevolen: