Оглавление:

Учебник AVR Assembler 6: 3 шага
Учебник AVR Assembler 6: 3 шага

Видео: Учебник AVR Assembler 6: 3 шага

Видео: Учебник AVR Assembler 6: 3 шага
Видео: Лекция 4. Архитектура AVR. Ассемблер 2024, Ноябрь
Anonim
Учебник AVR Assembler 6
Учебник AVR Assembler 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, и если он видит сигнал, он переходит к «подпрограмме связи», а затем передает ответный сигнал ролику игральных костей, сообщая, что он готов к приему. Они оба начнут отсчет времени, и ролик для игры в кости будет передавать сигнал (например, 5 В) в течение миллисекунды на число на кубике. Таким образом, если бы валок был двойной шестеркой или 12, то ролик для игры в кости установил бы его PD7 на 5 В на 12 миллисекунд, а затем снова установил бы на 0 В. Анализатор будет проверять свой вывод PD6 каждую миллисекунду, считая каждый раз, и когда он возвращается к 0 В, он выводит полученное число на дисплей анализатора, показывая двенадцать в двоичном формате на светодиодах. Посмотрим, сможем ли мы это реализовать.

Шаг 2: подпрограммы связи

Первое, что нам нужно сделать, это подключить два контроллера. Так что возьмите провод от PD6 на одном и подключите его к PD7 на другом, и наоборот. Затем инициализируйте их, установив PD7 на ВЫХОД на обоих и PD6 на ВХОД на обоих. Наконец, установите их все на 0 В. В частности, добавьте следующее в раздел Init или Reset кода на каждом микроконтроллере:

sbi DDRD, 7; PD7 настроен на вывод

cbi PortD, 7; PD7 изначально 0 В cbi DDRD, 6; PD6 настроен на вход cbi PortD, 6; PD6 первоначально 0 В clr всего; всего на кубиках изначально 0

Теперь давайте настроим подпрограмму связи на микросхеме игральной кости. Сначала определите новую переменную вверху, названную «total», которая будет хранить общее количество выпавших на паре игральных костей и инициализировать его равным нулю.

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

общаться:

cbi PortD, 7 sbi PortD, 7; Послать сигнал готовности ждать: sbic PinD, 6; прочитать PinD и пропустить, если 0V rjmp wait delay 8; задержка для синхронизации (обнаружена экспериментально) send: dec общая задержка 2; задержка для каждого числа кубиков cpi total, 0; 0 здесь означает «общее» количество отправленных задержек breq PC + 2 rjmp send cbi PortD, 7; PD7 до 0 В clr всего; сбросить общее количество кубиков до 0 ret

В анализаторе мы добавляем вызов из основной подпрограммы в подпрограмму взаимодействия:

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

sbic PinD, 6; проверьте PD6 на наличие сигнала 5 В для связи по вызову; если 5V идут на коммуникационный анализатор mov, всего; вывод на дисплей анализатора rcall analyzer

а затем напишите подпрограмму взаимодействия следующим образом:

общаться:

clr total; сбросить итог до 0 задержка 10; задержка для избавления от рикошетов sbi PortD, 7; установите PB7 на 5 В для сигнала готовности к приему: задержка 2; ждать следующего числа вкл. итог; инкремент общего сбика PinD, 6; если PD6 вернется к 0 В, мы закончим прием 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 таблицы данных и посмотрите, сможете ли вы понять, как это реализовать.

Мы будем использовать эти более сложные методы в будущем, когда добавим дополнительные контроллеры.

Тот факт, что все, что мы сделали с нашим анализатором, это взяли общую сумму игральных костей, а затем распечатали ее в двоичном формате с помощью светодиодов, не является важным. Дело в том, что теперь наш анализатор «знает», что такое бросок кости, и может использовать его соответственно.

В следующем уроке мы изменим назначение нашего «анализатора», введем еще несколько элементов схемы и будем использовать бросок игральных костей более интересным способом.

До скорого…

Рекомендуемые: