Оглавление:

Повторное использование выводов интерфейса SPI ATtiny84 / 85: 6 шагов
Повторное использование выводов интерфейса SPI ATtiny84 / 85: 6 шагов

Видео: Повторное использование выводов интерфейса SPI ATtiny84 / 85: 6 шагов

Видео: Повторное использование выводов интерфейса SPI ATtiny84 / 85: 6 шагов
Видео: Программирование микроконтроллеров Atmega, Attiny. Основные моменты. 2024, Июль
Anonim
Повторное использование выводов интерфейса SPI ATtiny84 / 85
Повторное использование выводов интерфейса SPI ATtiny84 / 85

Это руководство является продолжением инструкции «Отладка в цепи ATtiny84 / 85 с последовательным выходом» и расширяет эту аппаратную и программную конфигурацию для решения проблемы повторного использования выводов загрузки программ прикладной программой. В целом, между этим и инструкциями части 1 обсуждаются / демонстрируются следующие темы:

Тема ATtiny84 ATtiny85
Последовательная связь с использованием класса SoftwareSerial Икс Икс
Совместное использование контактов устройства между приложением и загрузкой Икс Икс
Прерывание смены пина Икс
Внешнее прерывание Икс
Спать в режиме POWER_DOWN; просыпаться по прерыванию Икс
Временное решение для "многократно определенной" ошибки связи вектора прерывания, связанной с SoftwareSerial Икс
Внутрисхемное изменение, загрузка, отладка,… цикл разработки для устройств ATtiny Икс Икс

Добавление компонента аппаратного ввода / вывода к одному из выводов, выделенных для интерфейса программирования SPI, иногда нормально, иногда - нет. Например, добавление светодиода в MISO просто вызывает мерцание светодиода во время загрузки, после чего он становится доступным для приложения. Однако добавление пьезозуммера к MISO приведет к ужасному визжащему звуку с последующим сбоем при загрузке.

В этом руководстве объясняется, как использовать мультиплексор 4x2: 1 для «восстановления» использования контактов, назначенных для сигналов MISO, MOSI и SCK интерфейса SPI, путем их защиты во время загрузки. Повторное использование вывода RESET требует замены предохранителя и не распространяется на этот подход. Двойное назначение контактов достигается с помощью мультиплексора для переключения между входами приложения и программирования в зависимости от того, выполняется ли загрузка. Код и схемы включены как для ATtiny84, так и для ATtiny85. Конфигурация ATiny84 рассматривается в первую очередь, поскольку она имеет два порта ввода-вывода и может использоваться для иллюстрации некоторых дополнительных проблем / решений. После обсуждения tiny84 те же сценарии обсуждаются для ATtiny85.

Шаг 1: необходимое оборудование

Изображение
Изображение

Большая часть необходимого оборудования была указана в инструкциях по части 1, поэтому ниже указано только новое оборудование.

Имя Возможный источник Как использовали
Мультиплексор 4x2: 1 Mouser Содержит четыре переключателя с 2 входами и 1 выходом, которые являются механизмом разделения сигналов интерфейса SPI и ввода-вывода приложений.
Переключатель SPST Подойдет любой тип переключателя (с фиксацией или с фиксацией). Переключатель используется для иллюстрации совместного использования контактов для ввода приложения.
Резистор 10 кОм Понижающий резистор для переключателя SPST, чтобы избежать плавающего входа
Изображение
Изображение
Изображение
Изображение

Мультиплексор является ключом к изоляции использования загрузки вывода от использования приложения. Общая функциональность мультиплексора 4x2: 1 довольно проста и состоит из 2 управляющих сигналов и 4 идентично работающих переключателей. Ниже описывается поведение каждого вывода мультиплексора:

Штырь Имя Функция
15 грамм Как указано в таблице истинности, мультиплексор работает только тогда, когда на выводе разрешения G низкий уровень. Поскольку мы никогда не хотим полностью отключать мультиплексор, контакт 15 будет подключен непосредственно к земле.
2-4; 5-7; 9-11;12-14 A (вход), B (вход), Y (выход) Есть четыре 2-х входных; Переключатели с 1 выходом, каждая группа из 3 контактов пронумерована последовательно в порядке A (вход), B (вход), Y (выход), например. для переключателя 1; вывод 2 = 1А; вывод 3 = 1В; контакт 4 = 1Y.
1 Выбирать Когда Select имеет низкий уровень, вход переключателя A подключается к соответствующему выходному контакту переключателя, Y. Когда select имеет высокий уровень, вход переключателя B вместо этого подключается к выходу. Переключатели управляются одновременно сигналом выбора и работают одинаково.
8 GND заземление ИС мультиплексора
16 VCC питание ИС мультиплексора

Шаг 2: Обзор тестовых случаев

Изображение
Изображение
Изображение
Изображение

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

СБРОС - идеальный выбор для сигнала выбора мультиплексора, так как он низкий во время загрузки, но снова становится высоким после завершения загрузки. Обратите внимание, что в любом случае можно использовать любой из переключателей мультиплексора, поскольку все переключатели работают одинаково. Кроме того, ни один из примеров не является «реалистичным»; вместо этого они были выбраны как наиболее простой способ проиллюстрировать методы изоляции

  1. Выходной случай: выход светодиода от контакта 4 ATtiny84 (SCK) изолирован с помощью переключателя мультиплексора 2

    • подключить вывод 2А мультиплексора к земле
    • подключите вывод 2B мультиплексора к выводу 4 ATtiny85
    • подключить выход 2Y к аноду светодиода

      • Ожидаемые результаты:

        • Светодиод не горит во время загрузки, так как подключен к 2А, заземлению.
        • Светодиод подключается к выходному контакту 4 приложения после загрузки через 2B и начинает мигать
  2. Случай входа: вход переключателя SPST на контакт 6 ATtiny84 (MOSI) изолирован с помощью переключателя мультиплексора 3

    • Подводящий провод MOSI от разъема программатора AVR перемещен на 3А.
    • вход переключателя 3В подключен к выходу SPST
    • выход 3Y подключен к выводу 6 ATtiny84

      • 3A, MOSI, подключен к выводу 6 во время загрузки
      • 3B, выход SPST, после загрузки подключается к выводу 6

Случай 1 считается успешным, если светодиод не мигает во время загрузки программы, а затем мигает каждые две секунды после загрузки, как и ожидалось под управлением программы. Без изоляции светодиод будет мигать во время загрузки, так как он подключен непосредственно к сигналу SCK, который меняет состояние на прием / передачу тактовых данных.

Случай 2 считается успешным, если сигнал MOSI перенаправляется на ATtiny84 во время загрузки, т.е. загрузка не завершается неудачей, и светодиод реагирует на включение / выключение SPST после загрузки. Случай 2 предотвращает один маловероятный сбой загрузки. Без изоляции переключатель SPST вызовет отказ, если 1) используется переключатель с защелкой и 2) переключатель остается во включенном положении во время загрузки. Когда коммутатор изолирован мультиплексором, он ни при каких обстоятельствах не может вызвать сбой загрузки. Немного натянуто, но для нас, стариков, утешительно.

Одним из последствий использования мультиплексора является то, что аппаратный компонент больше не может быть подключен напрямую к выводу ввода-вывода микроконтроллера. Это несколько неудобно, но позволяет компоненту оставаться на макетной плате во время тестирования вместе с другим оборудованием приложения и может быть перемещен обратно на свое законное место после завершения теста.

Шаг 3. ATtiny84, случай 1 - изоляция вывода приложения

Изображение
Изображение

Этот шаг описывает настройку для совместного использования выходного контакта приложения с сигналом загрузки. В качестве примера используется светодиод, подключенный к контакту 4 (SCK). Использование существующего светодиода в качестве примера позволяет акцентировать внимание на добавлении мультиплексора к аппаратной и программной среде части 1.

  • Аппаратное обеспечение

    • Добавьте мультиплексор на макетную плату в относительном месте, показанном на диаграмме выше. Мультиплексор расположен ближе к центру, чтобы оставить место для переключателя SPST, необходимого в случае 2.
    • Распространите сигнал RESET на мультиплексор, добавив выводной провод (желтого цвета) от контакта 11 ATtiny84 к контакту 1 мультиплексора.
    • Остальные настройки оборудования соответствуют шагу 2.

      • подключите контакт мультиплексора 2A непосредственно к земле
      • подключите контакт 2B к контакту 4 ATtiny84
      • подключить выход 2Y к аноду светодиода

        • Ожидаемые результаты:

          • во время загрузки 2Y подключен к земле (2A), поэтому светодиод не горит
          • После загрузки 2Y подключается к контакту 4 ATtiny84 - управление светодиодом приложения
  • Программное обеспечение

    • Код части 1 используется повторно; доступно из части 1, а не дублируется здесь
    • Загрузите и скомпилируйте программу части 1 в Arduino IDE.
    • Подключите программатор Tiny AVR к USB-порту ПК.
    • Подключите кабель Adafruit USB to Serial ко второму USB-порту.

      • COM-порт создается и автоматически становится доступным в списке портов IDE.
      • Запустите окно COM
    • Загрузите скомпилированный код в ATtiny84

Результаты прикладной программы такие же, как и для части 1, поскольку единственное изменение заключалось в перемещении светодиода в «защищенное» место: светодиод мигает с интервалом в 2 секунды; последовательный вывод такой же. Единственное отличие, которое должно произойти, заключается в том, что светодиод больше не мигает во время загрузки, поскольку в это время он подключен к земле через вывод 2A мультиплексора.

Изображение
Изображение

Шаг 4: ATtiny84, случай 2 - изоляция ввода приложения

Изображение
Изображение

Этот шаг основан на настройке для предыдущего случая изоляции вывода. Аппаратные изменения состоят в подключении переключателя SPST к выводу 6 ATtiny84 (MOSI) через мультиплексор. Таким образом, аппаратные изменения минимальны, но есть несколько изменений программного обеспечения, позволяющих переключателю SPST управлять светодиодом с помощью прерывания смены контакта. Обновленный код находится внизу этого раздела. Код следует скопировать в IDE Arduino; предлагаю сохранить его под именем Multiplexer_Input. (Прошу прощения за длину этого раздела, но это суть цели инструктируемого материала, и я думаю, что он лучше читается как монолит, чем вставка искусственных разрывов.)

Обновлять Место нахождения Цель
включить "взломанный" класс SoftwareSerial включить раздел Светодиод теперь управляется переключателем SPST через прерывание смены контакта. Класс SoftwareSerial должен быть изменен, поскольку в противном случае он выделяет ВСЕ векторы прерывания смены контактов. Это вызывает ошибку канала "множественное определение" для вектора (порт 0), назначенного коммутатору SPST. Взломанная версия SoftwareSerial должна быть помещена в тот же каталог, что и программа, чтобы она влияла только на это приложение.
Определение входного контакта SPST включить / раздел определения назначение входа SPST контакту устройства. Пин зависит от устройства, поэтому он добавляется в разделы #ifdef ATtiny8x.
SPST входной контактный режим функция настройки Вывод SPST настроен как ВХОД.
Настроить прерывание вывода SPST функция настройки Вектор прерывания назначается входному контакту SPST, так что изменение состояния переключателя вызывает прерывание. Регистры конфигурации и тип прерывания зависят от устройства. Чтобы сделать код как можно более простым, различия обрабатываются в определенном разделе #if.
Настройка полного последовательного сообщения функция настройки Сообщение о завершении настройки последовательного вывода изменено, чтобы отразить приложение ввода мультиплексора.
Добавить функцию ISR переключателя SPST раздел кода Добавлен ISR для прерывания смены вывода SPST. Код является общим, но используемый вектор зависит от устройства и определяется в разделах, зависящих от устройства, в верхней части программы. Чтобы убедиться, что ISR активирован, состояние светодиода изменяется. Хотя в реальном приложении это запрещено, генерируется сообщение последовательного вывода, отражающее новое состояние светодиода.
Изменить обработку цикла функция цикла ISR теперь управляет включением и выключением светодиода, чтобы исключить функциональность из процедуры цикла. Вызов режима сна добавлен для ATtiny84 как своего рода "дополнительный". Для этого приложения режим сна ATtiny85 не работает; возможно, из-за вмешательства класса Software Serial, поскольку он работает с удаленным SoftwareSerial.
Добавить режим сна раздел кода Для демонстрации использования мультиплексора функция сна не требуется. Просто добавлен, потому что обычно хотел бы дождаться ввода в режиме POWER_DOWN для экономии энергии, а не продолжать выполнение программного цикла, ничего не делая, пока не произойдет ввод.

Измените код класса SoftwareSerial

Класс SoftwareSerial необходимо изменить, чтобы он не перегружал все порты прерывания смены контактов. Код класса SoftwareSerial расположен по адресу

C: / Program Files (x86) Arduino / hardware / arduino / avr / библиотеки / SoftwareSerial / src

Найдите файл PCINT0_vect в SoftwareSerial.cpp, чтобы найти начальное местоположение для изменений кода. Добавьте следующий код непосредственно перед существующим оператором #if defined (PCINT0_vect).

#if defined (_ AVR_ATtiny84_)

#define MYPORT PCINT1_vect #elif defined (_ AVR_ATtiny85_) #define MYPORT PCINT0_vect #endif ISR (MYPORT) {SoftwareSerial:: handle_interrupt (); }

Теперь закомментируйте существующий блок кода, который выделяет векторы прерывания порта, как показано ниже (просто добавьте символы комментария / * и * / начального и конечного блока):

/*

# если определено (PCINT0_vect) ISR (PCINT0_vect) {SoftwareSerial:: handle_interrupt (); } #endif #if defined (PCINT1_vect) ISR (PCINT1_vect) {// SoftwareSerial:: handle_interrupt (); ISR (PCINT1_vect, ISR_ALIASOF (PCINT0_vect)); } #endif #if defined (PCINT2_vect) ISR (PCINT2_vect, ISR_ALIASOF (PCINT0_vect)); #endif #if defined (PCINT3_vect) ISR (PCINT3_vect, ISR_ALIASOF (PCINT0_vect)); #endif * /

Сконфигурируйте оборудование

Переключатель SPST подключается к контакту 6 ATtiny84 (MOSI), как описано в шаге 2. Для удобства процедура продублирована здесь.

  • Подключите вход переключателя 3A к выводу MOSI разъема Tiny AVR Programmer
  • подключите 3B к выходному контакту переключателя SPST ON
  • подключите 3Y к контакту 6 ATtiny84

    • ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ:

      • 3A, MOSI, будет стробирован на вывод 6 ATtiny84 во время загрузки.
      • 3B, выход SPST, будет стробирован на вывод 6 после загрузки

Запустите программу

Перед запуском переведите переключатель SPST в выключенное положение. В противном случае светодиод загорится при выключении переключателя и наоборот. Выполните процедуру для шага 3, чтобы загрузить, скомпилировать и загрузить программу ввода приложения с помощью Arduino IDE. Как и прежде, светодиод не должен мигать во время загрузки, поэтому единственным признаком того, что программа запущена и работает, будет последовательное сообщение в конце процедуры настройки: SETUP Complete - Input Example

В этот момент программа ожидает ввода от переключателя SPST. Установка переключателя в положение ON приведет к включению светодиода; при возврате в выключенное положение светодиод гаснет. Выходные сообщения подтверждают, что ISR была вызвана (ISR: Led HIGH, ISR: Led LOW). Обратите внимание, что последовательные сообщения идут в следующем порядке: сначала переходите в режим сна, ожидая изменения состояния переключателя; при получении входного сигнала переключателя вызывается ISR, переключает светодиод и документирует изменение; затем обработка возобновляется после вызова сна, поскольку прерывание выводит процессор из спящего режима.

Изображение
Изображение

ПРОГРАММА ДЛЯ ДАННОЙ ИНСТРУКЦИИ:

//************************************************************************

// ЧАСТЬ 2: Совместное использование контактов приложения / загрузочного устройства //. Модифицирует код Части 1 для поддержки повторного использования в приложении выводов, // назначенных интерфейсу программирования SPI //. Код "Comon" для ATtiny85 и ATtiny84 // ************************************** ******************************** #include "SoftwareSerial.h" // Модифицированный класс Arduino SoftwareSerial #include // Пока код обработки общий, используемые контакты зависят от устройства #if defined (_ AVR_ATtiny84_) || defined (_ AVR_ATtiny84A_) #define ledPin 4 // Переключение для включения / выключения подключенного светодиода #define rxPin 9 // Вывод, используемый для последовательного приема #define txPin 10 // Вывод, используемый для последовательной передачи #define SpstPin 6 // Вход от переключателя SPST (MOSI) #define ISR_VECT PCINT0_vect // Вектор прерывания изменения вывода SPST-переключателя #elif defined (_ AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // Вход от SPST-переключателя (INT0_VT0) #define IS // Переключатель SPST Вектор прерывания смены вывода #else #error В этом проекте поддерживаются только ATiny84 и ATtiny85 #endif // Создание экземпляра класса Software Serial, указывающего, какие // выводы устройства должны использоваться для приема и передачи SoftwareSerial mySerial (rxPin, txPin); // ------------------------------------------------ ------------------------ // Инициализируем ресурсы обработки // ------------------- -------------------------------------------------- --- void setup () {mySerial.begin (9600); // Задержка запуска последовательной обработки (2000); // Даем время последовательному COM-порту для завершения запуска. // в противном случае 1-й выход, вероятно, отсутствует или искажен pinMode (ledPin, OUTPUT); // Настроить вывод светодиода для ВЫХОДА pinMode (SpstPin, INPUT); // Настраиваем вывод переключателя SPST как определенный INPUT #if (_ AVR_ATtiny84_) || (_AVR_ATtiny84A_) // настраиваем прерывание смены вывода для обработки входа переключателя на выводе 6 (MOSI) GIMSK | = (1 <

Шаг 5: ATtiny85, случай 1 - изоляция вывода приложения

Изображение
Изображение

Вместо того, чтобы создавать дублирующую аппаратную установку для ATtiny85, вероятно, проще начать с готовой конфигурации для ATtiny84 из шага 4 и заменить чип tiny84 на tiny85. Тогда все необходимое оборудование уже доступно. При использовании этого подхода расположите tiny85 так, чтобы контакты 3 и 4 совпадали с последовательным кабелем tx и принимали провода. Затем остается просто переместить провода вывода интерфейса SPI, чтобы они соответствовали местам, требуемым для ATtiny85.

Если вы начинаете с нуля, просто следуйте общим шагам из шага 3 и приведенной выше диаграмме фритзинга. Код тот же, что и для ATtiny84 на шаге 3 с ожидаемыми теми же результатами - без мерцания во время загрузки; во время работы светодиод мигает с интервалом в 2 секунды, а сообщения последовательного вывода следуют за состоянием светодиода.

Изображение
Изображение

Шаг 6. ATtiny85, случай 2 - изоляция ввода приложения

Изображение
Изображение

Для настройки оборудования начните с конфигурации с шага 5 и добавьте переключатель SPST, как показано на приведенной выше диаграмме. На самом деле я использовал мгновенный переключатель для версии tiny85, и это немного упрощает проверку. Обратите внимание, что выход переключателя повернут на 180 градусов по сравнению с конфигурацией ATtiny84. Это изменение упрощает прокладку соединительных проводов, поскольку все 3 сигнала SPI находятся на одной стороне для ATtiny85.

Используйте ту же программу, что и для ATtiny84 Step 4. Ожидаются те же общие результаты - светодиод меняет состояние, когда переключатель SPST включается / выключается, и сообщения последовательного вывода документируют изменения. Сообщения GO TO SLEEP отсутствуют, поскольку для ATtiny85 не задействована функция сна. Несмотря на то, что используется одна и та же программа, существуют значительные различия в реализации, чтобы учесть тот факт, что ATtiny85 имеет только один регистр порта (порт 0):

  1. SoftwareSerial теперь выделяет прерывание смены вывода порта 0 для последовательной связи (напомним, что мы смогли использовать порт 1 для ATtiny84.)
  2. Прерывание от переключателя SPST должно быть реализовано с помощью внешнего прерывания 0 (INT0), поскольку единственное прерывание смены вывода назначается SoftwareSerial. Это действительно иллюстрирует то, что прерывания смены вывода и внешние прерывания логически независимы и могут использоваться в одном регистре порта.
  3. Ничего не получится от использования модифицированной версии SoftwareSerial - есть только один порт, и класс SoftwareSerial БУДЕТ его захватить. Однако модифицированный класс по-прежнему использовался, чтобы избежать изменений, не связанных напрямую с целью этого шага.

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