Съдържание:

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

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

Видео: Урок за асемблер на AVR 6: 3 стъпки
Видео: AVR 6# Переменные и арифметика 2024, Юли
Anonim
Урок за асемблер на AVR 6
Урок за асемблер на AVR 6

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

Днешният урок ще бъде кратък, където ще разработим прост метод за комуникация на данни между един atmega328p и друг, използвайки два порта, които ги свързват. След това ще вземем ролката за зарове от Урок 4 и Регистърния анализатор от Урок 5, ще ги свържем заедно и ще използваме нашия метод, за да съобщим резултата от хвърлянето на зарове от ролката до анализатора. След това ще разпечатаме ролката в двоичен формат, като използваме светодиодите, които конструирахме за анализатора в Урок 5. След като приключим с тази работа, ще можем да конструираме следващото парче от цялостния ни проект в следващия урок.

В този урок ще ви трябва:

  1. Вашата дъска за прототипи
  2. Вашата ролка за зарове от Урок 4
  3. Вашият регистър анализатор от Урок 5
  4. Два свързващи проводника
  5. Копие от пълния лист с данни (ревизия за 2014 г.):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Копие от Ръководството за комплекти инструкции (преработка от 2014 г.):

    www.atmel.com/images/atmel-0856-avr-instruc…

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

Стъпка 1: Как можем да накараме два микроконтролера да си говорят?

Как можем да накараме два микроконтролера да си говорят?
Как можем да накараме два микроконтролера да си говорят?

Тъй като започваме да разширяваме нашия проект, така че единственият ни краен продукт да се състои от колекция от по -малки части, ще се нуждаем от повече щифтове, отколкото един Atmega328P може да осигури. Затова ще направим всяка част от цялостния проект на отделен микроконтролер и след това ще ги накараме да споделят данните помежду си. Така че проблемът, който трябва да решим, е как можем да измислим прост метод, по който контролерите да говорят помежду си и да прехвърлят данни между тях? Е, едно нещо при тези контролери е, че всеки от тях изпълнява 16 милиона инструкции в секунда. Това е много точно определено време и затова можем да използваме това време за прехвърляне на данни. Ако използваме закъснения в милисекунди, за да съставим данните, тогава всъщност не трябва да сме толкова прецизни, тъй като процесорът изпълнява 16 000 инструкции за една милисекунда. С други думи, милисекундата е цяла вечност за процесора. Така че нека опитаме с хвърлянето на зарове. Искам да предам резултата от хвърляне на зарове от чипа за зарове към чипа на анализатора. Да предположим, че сте застанали от другата страна на улицата и аз исках да ви сигнализирам резултата от моето хвърляне на чифт зарове. Едно нещо, което бих могъл да направя, ако и двамата имахме часовник, бих могъл да включа фенерче, тогава когато сте готови да получите моите данни, включвате фенерчето си и двамата стартираме часовниците си. След това запазвам фенерчето си за точния брой милисекунди, докато заровете се хвърлят и след това го изключвам. Така че, ако завъртя 12, щях да запаля светлината си за 12 милисекунди. Сега проблемът с горното е, че за вас и мен няма начин да можем да определим времето достатъчно точно, за да разграничим между 5 милисекунди и 12 милисекунди. Но какво ще кажете за това: Да предположим, че сме решили да запаля светлината си за една година за всяко число на заровете? Тогава, ако хвърля 12, ще ви осветя 12 години и мисля, че ще се съгласите, че няма вероятност да направите грешка, като разберете номера, нали? Можете да си починете и да отидете да играете бейзбол, дори да отидете да играете глупости във Вегас в продължение на 6 месеца, стига в един момент през годината да погледнете от другата страна на улицата, за да видите дали светлината е включена, няма да пропуснете броене. Ами точно това правим за микроконтролерите! Една милисекунда за процесора е като година. Така че, ако включа сигнала за 12 милисекунди, почти няма шанс другият микроконтролер да го обърка за 10 или 11, без значение какво прекъсва и какво не се случва междувременно. За микроконтролерите милисекундата е вечност. Ето какво ще направим. Първо ще изберем два порта на контролера, които да бъдат нашите комуникационни портове. Ще използвам PD6 за получаване на данни (бихме могли да го наречем Rx, ако искаме) и ще избера PD7 за предаване на данни (бихме могли да го наречем Tx, ако искаме). Чипът на анализатора периодично ще проверява своя Rx пин и ако види сигнал, той ще падне до "комуникационна подпрограма" и след това ще предаде обратен сигнал към ролката за зарове, казвайки, че е готов за приемане. И двамата ще започнат да определят времето, а ролката за зарове ще предаде сигнал (т.е. 5V) за милисекунда на брой на заровете. Така че, ако хвърлянето беше двойна шестица или 12, тогава ролката за зарове щеше да настрои PD7 на 5V за 12 милисекунди и след това да я върне на 0V. Анализаторът ще проверява своя пин PD6 на всяка милисекунда, отчитайки всеки път и когато се върне към 0V, той извежда резултатното число на дисплея на анализатора, показвайки дванадесет в двоичен формат на светодиодите. Така че това е планът. Нека видим дали можем да го приложим.

Стъпка 2: Комуникационни подпрограми

Първото нещо, което трябва да направим, е да свържем двата контролера. Така че вземете проводник от PD6 от едната и я свържете към PD7 от другата, и обратно. След това ги инициализирайте, като настроите PD7 на OUTPUT и на двата, и PD6 на INPUT и на двата. Накрая настройте всички на 0V. По -конкретно, добавете следното към секцията Init или Reset на кода на всеки микроконтролер:

sbi DDRD, 7; PD7 е настроен на изход

cbi PortD, 7; PD7 първоначално 0V cbi DDRD, 6; PD6 настроен на вход cbi PortD, 6; PD6 първоначално общо 0V clr; общо на зарове първоначално 0

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

След това напишете подпрограма за комуникация с анализатора:

общуват:

cbi PortD, 7 sbi PortD, 7; Изпращане на сигнал за готовност изчакване: sbic PinD, 6; прочетете PinD и пропуснете, ако 0V rjmp чака закъснение 8; забавяне за синхронизиране (намерено това експериментално) изпрати: dec общо забавяне 2; забавяне за всеки брой на смъртта cpi общо, 0; 0 тук означава, че са изпратени "общи" закъснения в броя breq PC+2 rjmp изпрати cbi PortD, 7; PD7 до 0V clr общо; нулирайте общите зарове на 0 ret

В анализатора добавяме rcall от основната рутина към подпрограмата за комуникация:

clr анализатор; подгответе се за нов номер

sbic PinD, 6; проверете PD6 за 5V сигнал rcall комуникация; ако 5V отиват да комуникират mov анализатор, общо; изход към дисплея на анализатора rcall анализатор

и след това напишете подпрограмата за комуникация, както следва:

общуват:

clr общо; нулиране на общото на 0 закъснение 10; забавяне, за да се отървете от скачанията sbi PortD, 7; настройте PB7 на 5V за сигнал за готов прием: забавяне 2; изчакайте следващия номер, включително общо; прирастване общо sbic PinD, 6; ако PD6 се върне към 0V, ние сме готови rjmp получаване; в противен случай се върнете обратно за повече данни cbi PortD, 7; нулирайте PD7, когато приключите ret

Ето! Сега всеки микроконтролер е настроен да съобщава резултата от хвърлянето на заровете и след това да го показва на анализатора.

Ще приложим много по -ефективен начин за комуникация по -късно, когато трябва да прехвърлим съдържанието на регистър между контролери, вместо само хвърляне на зарове. В този случай, ние все още ще използваме само два проводника, които ги свързват, но ще използваме 1, 1, за да означаваме „започнете предаване“; 0, 1 означава "1"; 1, 0 означава "0"; и накрая 0, 0 означава "крайно предаване".

Упражнение 1: Вижте дали можете да приложите по-добрия метод и да го използвате, за да прехвърлите хвърлянето на зарове като 8-битово двоично число.

Ще прикача видео, което показва моята работа.

Стъпка 3: Заключение

Заключение
Заключение

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

Отсега нататък просто ще прикачвам файловете, съдържащи код, вместо да го изписвам тук. Просто ще напишем разделите, които се интересуваме от обсъждане.

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

Упражнение 2: Вместо да използвате сигнал за готовност, за да покажете коляното за зарове е готово за предаване и друго, когато анализаторът е готов за приемане, използвайте „външно прекъсване“, наречено „Прекъсване при смяна на щифт“. Щифтовете на atmega328p могат да бъдат използвани по този начин, поради което те имат PCINT0 през PCINT23 до тях в диаграмата на изводи. Можете да приложите това като прекъсване по подобен начин, както направихме с прекъсването на таймера за препълване. В този случай "манипулатор на прекъсване" ще бъде подпрограмата, която комуникира с ролката за зарове. По този начин не е нужно всъщност да извиквате комуникационната подпрограма от main: тя ще отиде там всеки път, когато има прекъсване, идващо от промяна на състоянието на този щифт.

Упражнение 3: Много по-добър начин за комуникация и прехвърляне на данни между един микроконтролер към колекция от други е използването на вградения 2-жичен сериен интерфейс на самия микроконтролер. Опитайте се да прочетете раздел 22 от листа с данни и да видите дали можете да разберете как да го приложите.

Ще използваме тези по -сложни техники в бъдеще, когато добавим още контролери.

Фактът, че всичко, което направихме с нашия анализатор, е да вземем общата сума на зарове и след това да го разпечатаме в двоичен формат, използвайки светодиоди, не е важното. Факт е, че сега нашият анализатор "знае" какво представлява хвърлянето на зарове и може да го използва съответно.

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

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

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