Съдържание:

Урок за асемблер на AVR 11: 5 стъпки
Урок за асемблер на AVR 11: 5 стъпки

Видео: Урок за асемблер на AVR 11: 5 стъпки

Видео: Урок за асемблер на AVR 11: 5 стъпки
Видео: AVR Ассемблер. Урок 5. Динамическая индикация. AVR Assembler. Lesson 5. Dynamic indication. 2024, Ноември
Anonim
Урок за асемблер на AVR 11
Урок за асемблер на AVR 11
Урок за асемблер на AVR 11
Урок за асемблер на AVR 11
Урок за асемблер на AVR 11
Урок за асемблер на AVR 11

Добре дошли в Урок 11!

В този кратък урок най -накрая ще изградим първата част от нашия окончателен проект.

Първото нещо, което трябва да направите, е да отидете на последната стъпка от този урок и да гледате видеоклипа. Тогава се върнете тук. [пауза, докато правите това …] Добре. Сега продължете.

Ако още не сте се досетили, ние изграждаме Craps игра! Разбира се, това, че създавам игра на глупости, със сигурност не означава, че трябва. Надявам се това да се подразбира. Във всеки случай е полезно да използвате микроконтролери за управление на сегментирани дисплеи и т.н., и да комуникирате помежду си - това е основното, което правим тук. Можете да напишете код, за да ги използвате, както искате. Засега ще ги кодирам, за да играят глупости, въпреки че по-късно може да реша да пренастроя сегментираните дисплеи, за да направят нещо друго.

Причината, поради която изграждам това, е, защото си мисля, че в крайна сметка може би искам пълна маса за вегаски глупости в моята „пещера за мъже“в мазето на моята къща. Въпреки това, никой от приятелите ми няма и най -малка представа как да се справя, да отбелязва или да изплаща залагания и хвърляния. Така че реших, че би било страхотно масата да свърши цялата работа на дилъра вместо нас! Когато правим залог на масата, можем също да натиснем малко бутон до квадрата, на който са чиповете ни, за да покаже колко е поставено там, след това микроконтролерът може да изчисли изплащането за този квадрат след хвърлянето на заровете и да го покаже. Все още не съм съвсем сигурен как ще организирам този аспект. Една мисъл, която имах, беше, че всеки човек ще бъде помолен да направи всичките си залози на свой ред, така че контролерът да запише къде са парите на всеки човек, преди да запише следващия играч и т.н. След това, след броенето, компютърът може да покаже изплащанията на всеки квадрат и също така може да поддържа текуща "обща сума" за всеки играч.

За една от снимките на корицата на този урок просто трябваше да използвам снимка, на която изкарвам 5 аса на покер масата във Вегас това лято. Хехех. Угадете ми.

Ето линк към пълната колекция от моите уроци за AVR асемблер:

Стъпка 1: Глупости

Глупости!
Глупости!
Глупости!
Глупости!
Глупости!
Глупости!

В този урок ще конструираме само най -простата част от последната игра Craps. Това се нарича "The Pass Line" и можете да залагате на него. Можете да научите всичко, което трябва да знаете за частта "pass line" на играта, като гледате краткото 2-минутно видео с инструкции, което съм приложил към тази стъпка.

Ще изградим друг 4-цифрен дисплей, който ще следи парите на дилъра по същия начин, по който настоящият 4-цифрен дисплей следи парите на играча. Дилърът ще започне с $ 20, а играчът ще започне с $ 20 (общите възможни пари в играта са $ 9999-максимумът от нашите 4-цифрени дисплеи, но ще имаме нужда само от $ 20 за това първо парче от играта или по друг начин би било досадно в краен случай и трудно би спечелило или загубило за прилично време). Ако играчът вземе всички пари на дилъра, той печели. Ако играчът загуби всичките си пари, тогава дилърът печели.

Как печелите или губите пари? Е, тези от вас, които са играли Craps, виждали хора да „пускат зарове“на улицата или са го виждали да играе срещу казиното във Вегас, вече ще знаят. За останалите, позволете ми да ви дам кратко описание на частта "pass line" на играта, която ще кодираме днес.

Craps се играе от стотици години, датиращи от времето на кръстоносните походи. Играеше се от войските в окопите на Втората световна война, играеше се по улиците, играеше се в казина и хазартни зали. Започна само с пропускателна линия и всички останали неща бяха добавени към нея по -късно. Ние ще следваме същата прогресия.

Начинът на работа на пропускателната линия е следният. Вие правите залог и след това хвърляте заровете. Първата ролка се нарича "излизаща ролка". Ако получите 2 (змийски очи), 3 (асо двойка) или 12 (боксови коли) на излизащия рулон, губите залога си и той се нарича "craps". Ако хвърлите 7 (естествено) или 11 (йо или йо-левен), печелите. Ако превъртите друг номер, този номер се превръща във вашата "точка". След като се установи "точка", вие продължавате да хвърляте заровете с цел да ударите отново точката, преди да хвърлите 7. Ако получите точката си преди хвърлянето на 7, печелите дори пари. Така че доларовият залог ви печели долар от дилъра. Ако получите 7 преди вашата точка да бъде хвърлена, това се нарича "седем аут" и губите залога си от дилъра.

След това започвате отново. Направете залог на линията на подаване и хвърлете заровете, 7 или 11 печалби, 2, 3 или 12 загуби.

Има много други видове залози, „не подавайте“, „коефициенти за преминаване“, „не пропускайте коефициенти“, „дойде залог“, „не идвайте залог“, „поле“, „клаксон“, „ твърди начини и т.н. и т.н. и т.н. Можете да намерите подробности тук:

en.wikipedia.org/wiki/Craps

Както казах по -горе, засега ще кодираме само частта от пропускателната линия на играта, което е всичко, което имаха през деня, когато децата хвърляха зарове в стената за пари за обяд един на друг и от тук ще започнем.

Въпреки това, преди да започнем да кодираме неща, нека изградим дисплей за касата на дилъра. За това искам да използвам един от по-големите 4-цифрени дисплеи, които можете да получите от Sparkfun или другаде. Отсега нататък няма да изброявам материали за тези уроци. Ако всъщност сте строили всичко заедно с мен, тогава вече знаете откъде да вземете материалите и какви са те. Безсмислено е да ги изброявам или колко струват.

Така че нека вземем една от нашите прототипни дъски, голям 4-цифрен дисплей, друг ATmega328p за управление на този дисплей и да го изградим, както направихме с ролката за зарове, и дисплея на плейъра преди. Също така ще прикачваме заглавия за захранване, за програмиране и за TWI комуникации, както и другите.

Стъпка 2: Дисплей на касата на дилъра

Дисплей на касата на дилъра
Дисплей на касата на дилъра
Дисплей на касата на дилъра
Дисплей на касата на дилъра
Дисплей на касата на дилъра
Дисплей на касата на дилъра

Ние конструираме дисплея на дилъра по същия начин, както направихме с 4-цифрения дисплей на играча в последния урок. Единствените разлики са, че той е по -голям и има по -малко щифтове, така че ще го подредим и окабелим по различен начин.

Прикачих снимка на окабеляването на този дисплей. Можете да видите, че той е по -голям и има по -малко щифтове от нашия дисплей на кеш плейъра. Картината е от страницата на sparkfun, откъдето имам дисплея и показва кои щифтове са мощност за всяка цифра и кои щифтове контролират всеки от сегментите в цифра.

Както обикновено, трябва да започнете, като включите дисплея в макета си за прототипиране и тествате всеки сегмент, за да сте сигурни, че разбирате как е свързан. След това трябва да го свържете към щифтовете на микроконтролер AVR на вашата макет и да го стартирате от там, докато целият ни код работи в този урок. И накрая, в края трябва да изградите външната платка и да я запоите. Тогава, когато тествате крайния продукт, ще знаете, че всички проблеми идват от вашата работа по запояване и рязане, а не от кода. Също така, не забравяйте добре познатата аксиома от дърводелството „измерете два пъти и изрежете веднъж“, или в случай на изработка на платки: „изрежете два пъти, запоявайте веднъж“. Както можете да видите на снимката, най -накрая се счупих и купих перфектната приставка Dremel за този вид работа. "Комплект диамантена точка". Това струваше 5 долара, но това е много по -малко от цената на терапията за управление на гнева, която идва с увеличаването на работата ми за рязане твърде много пъти подред.

Използвам резистори от 330 ома за този дисплей. COM щифтовете преминават през резистора към GND и захранването преминава към всеки сегмент, който искате да покажете. Ще използвам PC0 до PC3 за COM щифтовете и PB0, PB1, PB2, PB3, PB4, PD5, PD6 и PD7 за сегментите.

Ето ключът към увеличаване на шансовете ви да го направите правилно:

  1. начертайте схемата
  2. прекъснете веригата
  3. проверете кабелите си
  4. прикрепете резисторите, капачките и кристалния осцилатор
  5. проверете отново връзките и окабеляването
  6. прикрепете външните проводници
  7. прикрепете микроконтролера
  8. проверете отново окабеляването
  9. включете 4-цифрения дисплей
  10. проверете всяка цифра с чифт проводници от макета
  11. оставете го настрана и напишете кода, знаейки, че вероятно ще трябва да промените нещата по -късно и се надявате да не сте прикрили връзка, която трябва да бъде прекъсната.

Показал съм поредица от снимки на моята кабелна работа. Моля, осъзнайте, че сте свободни да изпращате своите по всякакъв начин. Много е вероятно да намерите по -добра карта от мен и трябва да я използвате. Нищо в тези уроци не зависи от това как са свързани вашите компоненти, стига да имат правилните изходни портове. Което ми напомня. Забележете, че сега има две заглавки към SDA и две към SCL? Защо мислите, че го направихме?

Сега, както можете да видите от прикачения код в края на урока, просто изрязах и поставих кода от дисплея на плейъра на последния урок в нов файл за дисплея на дилъра. След това преминах и промених таблицата за търсене на "сегменти", за да съответства на новата карта на пиновете, отбелязвайки, че за този дисплей "com" щифтовете са заземени и сегментните щифтове са 5V, а не обратното, както беше за другия дисплей. Промених и инициализацията на портовете, за да отразяват новото окабеляване, промених адреса на дисплея на дилъра на 0b1000000, така че ролката за зарове да може да говори с него, промених подпрограмата "цикъл", така че да изключи PC0 до PC3 "com" щифтове, когато иска да захранва определен сегмент и промених "цифрата", която се показва, тъй като новото окабеляване има цифрите в обратен ред (ако сте го оставили както е било и сте се опитали да го покажете 1234 вместо това би се показал като 4321).

Ето новата карта на регистъра:

(PD7, PD6, PD5, PB4, PB3, PB2, PB1, PB0) = (десетична точка, c, g, b, f, a, e, d)

където 1 е ВКЛЮЧЕН и 0 е ИЗКЛЮЧЕН.

Сега тествайте дисплея, като първо зададете инициализираната стойност на дисплея на различни числа, така че при включване да ги показва. Това ще ви каже дали всичко работи правилно.

След това променете кода на diceroller, така че да използва новия адрес за подчиненото устройство, свържете ги заедно и го стартирайте. Тя трябва да действа точно като това, което направихме в последния урок, с изключение на това, че хвърлянето на зарове сега се показва на новия дисплей.

Страхотен! Сега сме готови да напишем новия код за зарове, така че да комуникира както с дисплея на плейъра, така и с дисплея на дилъра.

Стъпка 3: Очертание на програмата

Очертание на програмата
Очертание на програмата
Очертание на програмата
Очертание на програмата
Очертание на програмата
Очертание на програмата

Начинът, по който кодът ще работи за нашата игра, е, че ще запазим ролката за зарове като главен и ще добавим дисплея на дилъра като допълнителен роб. Точката за зарове ще контролира играта и тя ще изпрати получените промени в брой на дилъра и играчът се показва след всяко хвърляне. Засега просто ще имаме залог за пропускаща линия $ 10 всеки път, така че не е нужно да се усложняваме все още, когато играчът променя залога си. По -късно, след като механиката работи, ще добавим още един контролер, който ще бъде допълнителен майстор, който ще контролира залаганията и изплащанията, а нашата игра на зарове ще остане майстор, но ще се използва само за хвърляне на заровете. Това ще ни позволи да влезем в арбитраж на TWI, сблъсъци и други важни аспекти на серийната комуникация, когато имате множество господари и подчинени. Също така ще добавим редица единични 7-цифрени дисплеи с бутони под тях, които ще ни позволят да залагаме на други видове ролки, но всичко това ще дойде в бъдещите уроци. Засега просто искаме ролката за зарове като главен, а двата дисплея като подчинени. Когато натиснем бутона, кодът ще реши дали да изплати натурален, да вземе пари от крапс, или да се разклони към "точка" серия от хвърляния до победа или седем аута.

Нека първо напишем подчинени подпрограми. Те са прости с това, че всичко, което ще направят, е да следят линията на SDA за своя адрес, ако бъдат повикани, те ще прочетат новия номер, за да го покажат и покажат. Това е всичко! Те дори не трябва да говорят с капитана, тъй като капитанът ще следи техните суми и ще прави всички изчисления на изплащанията, преди да ги актуализира. В бъдещите уроци ще имаме роби, които пишат обратно на капитана (например, когато имаме единични 7-цифрени дисплеи с бутони за сумата на залога, те ще трябва да кажат на капитана колко се залага на всеки дисплей и затова ще го направим адресирайте ги с адрес + прочетено обаждане с капитана в "режим на главен приемник"), но ще стигнем до това своевременно.

Засега всичко се подтиква чрез натискане на бутона за зарове, последвано от изчисление или по -нататъшно натискане на бутон и накрая съобщение до всеки от дисплеите с техните нови суми. След всяко изплащане ще има тест, за да се определи дали играчът е спечелил или е загубил, с други думи, дали дилърската парична сума става нула след хвърляне или ако кешовата сума става нулева след хвърляне (нито дилъра, нито играча могат да станат отрицателни, тъй като ще им бъде позволено да залагат $ 10 или друго, което е останало, ако е по -малко от $ 10).

Така че така ще работи. Нека да кодираме.

Стъпка 4: Основен комуникационен код

Главен комуникационен код
Главен комуникационен код

Вече можем да напишем рутинната комуникация на ролката за зарове. Той също е почти идентичен с този, който написахме миналия път, с изключение на това, че ще комуникираме с два различни роби, а не само с един. Обърнете внимание, че за всеки от подчинените използваме различен адрес. Трябва сами да промените кода и след това просто да го тествате с всеки адрес и да се уверите, че работи точно като последния урок, с изключение на всеки отделен дисплей.

Ще прикача кода за всеки компонент, който просто показва резултата от ролката, така че да може да се използва, за да накара дисплеите да работят правилно и да провери окабеляването.

Кодирането на играта не въвежда нищо ново, що се отнася до командите на асемблерния език или компонентите на AVR микроконтролера и затова нямам чувството, че трябва да преминавам през него ред по ред. Вероятно сте забелязали, че когато въвеждаме нещо ново, преминавам през всеки ред до най -малки детайли до степен да ви изнервя, ако не ви приспивам. От друга страна няма да направя това, ако не се въведе нищо ново. Така е и днес. Така че мисля, че вече сте подготвени да играете с кода, да прочетете кода, да анализирате кода, да разберете кода, да го критикувате, да се подигравате на кода и да се смеете на човека, който е написал кода. Така че ще ви позволя да продължите и да го направите. Почти сигурно е, че ще намерите много места, които можете да подобрите или поне да опростите написаното от мен.

Аз, както обикновено, прикачих окончателната версия на кода за двата дисплея и зарове за зарове в следващата стъпка, заедно с видеоклип, на който тествам това нещо.

Стъпка 5: Окончателен код и видео

Прикачих видеото и трите програми. Ще забележите, че можете да поправите залога и началния дилър и кеш в горната част на програмата с.equ изявления.

В следващия урок ще добавим възможността да залагате на различни неща, което ще направи играта по -вълнуваща. Интересното за съвременните Craps е, че имате множество различни начини да залагате и да се опитате да увеличите максимално шансовете си. Всъщност Craps е играта с най -висок коефициент в казиното! … АКО знаете как да го играете. От друга страна, ако не знаете как да играете, това се превръща в една от игрите с най -ниски коефициенти.

След като имаме повече неща, на които да залагаме парите си, аз ще увелича общата сума пари в играта.

Би трябвало да се забавлявам!

До следващия път!

Препоръчано: