Цель: Целью этого проекта является использование ассемблерных программ, которые будут встроены в среду Arduino C, а также познакомить с вводом и выводом данных с платы Arduino. Вход будет представлять собой переключатель для запуска программы с помощью подтягивающего или понижающего резистора, а выход будет управлять светодиодом, мигающим сигналом SOS азбукой Морзе. Кажется, что это будет сложно, но на каждом этапе вам будут давать подсказки. И вы можете использовать предыдущую лабораторную функцию задержки и R16 для разных времен задержки.
Во времена телеграммы и радиотелеграфии, до и даже после того, как голос был закодирован, средством связи был «таппер» или причудливый переключатель с использованием азбуки Морзе, с помощью которого отправитель мог набрать сообщение, используя длинные и короткие длительность или «отводы». На принимающей стороне будет реле или тональный сигнал, который будет повторять постукивания, чтобы их можно было услышать и перевести обратно в слова. В коде Морзе буква S кодируется тремя короткими точками или продолжительностями, а буква O кодируется тремя длинными тире или продолжительностями. Азбукой Морзе для обозначения бедствия или помощи является SOS, которая выглядит как …---… …---… и так далее.
Эта лаборатория отправит сигнал SOS кодом Морзе на светодиод, когда переключатель включен, и остановится после отправки полного сигнала SOS, когда переключатель выключен.
Вот пример того, как это должно звучать: https://www.youtube.com/watch?v=Zsb7stKelq4
Создание входа для переключателя. Такая, казалось бы, простая операция требует некоторого размышления при ее выполнении на микропроцессоре.
Вот несколько общих шагов для ввода данных:
Обратитесь к разделу 14 таблицы данных AVR, посвященному портам ввода-вывода. Обратите внимание на аппаратное обеспечение одного контакта ввода-вывода в AVR.
Внутреннее оборудование для контакта ввода-вывода в AVR
Все это оборудование необходимо для настройки контакта в качестве входа или выхода, а также некоторых других функций, таких как внутренние подтягивающие резисторы, спящие режимы и синхронизация с часами. Очевидно, что контакты ввода-вывода не являются простыми, но в этой лабораторной работе нас будут интересовать только простые входы и выходы. Для этого нам нужен регистр DDR и порт для ввода или вывода, который мы будем использовать.
Ранее мы видели, как были настроены выходы для мигания светодиода на бите 5 PORTB.
Вы можете выбрать любой контакт порта, доступный для этого на вашем Arduino, но затем вы должны определить его порт и бит.
Выход: PORTB, регистр 5, бит 5, используется внутри для светодиода, а также выведен на разъем (контакт 13 на UNO), но не используйте его внешне - у него недостаточно токовой мощности для управления двумя светодиодами.
• Предложение: используйте PORTB, зарегистрируйте 5 бит 4 (контакт 12 на UNO) для вывода.
Ввод: существует множество других вариантов, которые вы можете использовать (за исключением того, что не используйте контакты ввода-вывода 0 или 1, поскольку они необходимы для связи с компьютером). • Предложение: PORTB, регистр 5, бит 3 (контакт 11 на UNO) может использоваться в качестве входа.
Типичная настройка: вы выбираете контакты для входа и выхода.
Чтение ввода: Чтобы прочитать ввод, зная порт, вы должны использовать инструкцию IN, показанную ниже, и адрес контактов для порта, который вы используете. Например, чтобы прочитать бит 4 PORTB (контакт 18 UNO), вы должны использовать эту инструкцию для чтения порта.
Петля:
В r17, 0x03; //читаем контакты PORTB в регистр 17
Теперь вам нужно выбрать бит 4, соединив его с помощью AND с 0x10, чтобы замаскировать все остальные биты. После этого это зависит от вашей входной конфигурации и от того, используете ли вы подтягивание или понижение. Здесь мы используем понижающий резистор.
Если вы используете подтягивающий резистор, замыкание переключателя приведет к 0, в противном случае это 1, поэтому вы можете выполнить инструкцию AND, а затем выполнить переход, если он равен нулю.
АНДИ r17, 0x08; //И r17 с 08h
БРНЕ старт; //если переключатель не замкнут (т.е. 1), то возвращаемся назад и выполняем цикл
При использовании подтягивающего резистора замыкание переключателя приведет к 1, в противном случае — к 0:
АНДИ r17, 0x08; //И r16 с 08h
запуск BREQ; //если переключатель не замкнут (т.е. 0), то возвращаемся назад и выполняем цикл
Создание вывода очень похоже на создание ввода. Вы должны настроить вывод порта как выход. Затем вы можете использовать CBI или SBI, чтобы сделать его нулем или единицей.
Вот несколько общих шагов для вывода:
Разработка программы Эта лабораторная работа очень похожа на предыдущую лабораторную работу по миганию светодиода. Этот эскиз прилагается в качестве основы для начала. Вам просто нужно изменить структуру, чтобы создать SOS в соответствии с приведенными выше правилами, и использовать вход для переключателя для запуска SOS и выход для управления светодиодом. Используйте функцию задержки, чтобы настроить различные задержки для точек, тире и т. д., как показано ниже в рамке.
См. документ, определяющий временные соотношения, и следуйте этим правилам при разработке программы для кода Морзе SOS.