Оглавление:

Чтение переключателей с ATtiny2313: 9 шагов
Чтение переключателей с ATtiny2313: 9 шагов

Видео: Чтение переключателей с ATtiny2313: 9 шагов

Видео: Чтение переключателей с ATtiny2313: 9 шагов
Видео: Учимся писать прошивки. 2024, Июль
Anonim
Чтение переключателей с ATtiny2313
Чтение переключателей с ATtiny2313

Было несколько инструкций, относящихся к выходам ATtiny2313 и аналогичных устройств AVR. Например, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Мотор-с-микропроцессором-AVR /. Работая над последней версией The Real Elliot, в которой показано, как управлять шаговыми двигателями, я обнаружил, что было бы действительно полезно иметь возможность запускать альтернативные разделы кода в одной и той же программе, чтобы мне не пришлось перепрограммировать каждый ATtiny2313. раз я хотел попробовать небольшое изменение кода (например, половинный шаг или запуск шагового двигателя в обратном направлении). Хотя легко написать код, используя оператор switch / case, позволяющий выбирать альтернативные варианты, необходим некоторый способ выбора регистра. Это означает, что необходимо считывать какое-то устройство ввода, чтобы контролировать случай. К счастью, ATtiny2313 имеет множество контактов ввода-вывода и хорошо разработан для считывания входов с переключателей. Эта инструкция покажет, как читать входные данные и принимать решения на основе их состояния. Поскольку это само по себе сделало бы довольно утомительное руководство, я объясню простой способ использования таймера / счетчика ATtiny2313 для управления маленьким динамиком в качестве пейджера. Также будет небольшое отступление о простых методах отладки.

Шаг 1: устройство ввода

Устройство ввода
Устройство ввода
Устройство ввода
Устройство ввода

Это руководство основано на превосходной работе Реального Эллиота и использует описанную им систему разработки ATtiny2313 Ghetto. Техническое описание ATtiny2313 от Atmel является исчерпывающим справочником по всем функциям, но его не всегда легко читать. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Ссылка содержит все спецификации AVR, найдите 2313.) На рисунке показан простой набор входных переключателей. Это просто набор из четырех переключателей включения / выключения; также известны как однополюсные переключатели на одно направление (SPST). Как правило, одно соединение или полюс каждого переключателя привязан к земле, в то время как другое соединение подтягивается через резистор ограничения тока (10 кОм или около того). Вход микроконтроллера подключен к полюсу с резистором. Если переключатель разомкнут, микроконтроллер считывает вход как HI. Если переключатель замкнут, микроконтроллер считывает вход LO. Обратитесь к схеме для получения подробной информации. ATtiny2313 упрощает ситуацию, предоставляя программируемые подтягивающие резисторы на выводах ввода / вывода, когда они настроены как входы. Это означает, что переключатели могут просто иметь один полюс, связанный с землей (LO), а другой полюс - со входом процессора. В первом примере показаны только два переключателя. Переключатели считываются и настраиваются с помощью следующего кода. Настройте переключатели как входы: (Код не требуется; это значение по умолчанию.) Включите подтягивающие резисторы: PORTB = _BV (PB0) | _BV (PB1); Прочитать входы: but1 = ~ PINB & 0x03; Обратите внимание на использование инверсии и маскирования для получения правильного значения.

Шаг 2. Мигающие огни для сигнала

Мы будем использовать эти два переключателя, чтобы мигать светодиодом программируемое количество раз. Светодиоды, которые мы будем использовать, будут мигалками, прославившими «Настоящий Эллиот». Переключатели 1 и 2 будут обрабатываться как две двоичные цифры, поэтому комбинация может представлять числа 0, 1, 2 и 3. Наша программа считывает два переключателя и мигает светодиодом соответствующее количество раз, но только если переключатель настройки изменились. Коммутаторы деблокируют в течение 500 миллисекунд (не оптимизировано). Алгоритм противодействия довольно прост. Переключатели считываются, и показания записываются. Если оно отличается от значения oldBut (последнего сохраненного значения), то программа задерживается на 500 миллисекунд, и переключатели считываются снова. Если значение совпадает с ранее прочитанным, значение oldBut будет обновлено, и светодиодный индикатор будет мигать столько раз, сколько подразумевается двоичным значением двух переключателей. Обратите внимание на инверсию значения, так как переключатель, который находится в положении «включено», читает LO. Переключатели будут постоянно сканироваться на предмет дальнейших изменений. Пожалуйста, обратитесь к более ранним инструкциям The Real Elliot, чтобы узнать больше о мигающих огнях. Взгляните на этот https://www.ganssle.com/debouncing.pdf, чтобы узнать больше о переключателях debouncing. Вот код ATtiny2313 для этого примера. Во время работы эта программа дважды мигнет светодиодом на PB4 (физический контакт 8), чтобы показать, что она инициализирована. Затем он считывает переключатели один и два и мигает от одного до трех раз в зависимости от настройки переключателя при каждом их изменении. Когда переключатели не меняются, светодиод будет медленно мигать. Чтобы запустить этот код, создайте новый каталог (назовите его «Базовый», если хотите) и загрузите в него следующий файл кода C и make-файл. Переименуйте Makefile1.txt в Makefile. С помощью WinAVR скомпилируйте программу и загрузите ее в свой ATtiny2313.

Шаг 3. Небольшое отступление по поводу отладки

Если вы похожи на меня (и любого другого программиста в мире), вы, вероятно, бывали в моменты, когда «безошибочный» код, который вы тщательно набрали и скомпилировали, не делает того, что вы от него ожидаете. Может, он просто ничего не делает! Так в чем проблема? Как ты узнаешь? К счастью, есть несколько способов заставить все работать. (Получите эту книгу, чтобы получить превосходное освещение темы отладки. Http://www.debuggingrules.com/) Я хотел бы предложить несколько простых предложений, относящихся к теме отладки приложений микроконтроллеров. Шаг первый - продолжить работу. что ты знаешь. Если у вас один раз сработал мигающий свет, используйте его снова, чтобы увидеть, где вы находитесь в своей программе. Мне нравится, когда светодиод дважды мигает, чтобы сигнализировать о запуске программы. Вы можете ввести код для этого изначально в начале вашей программы. Как только вы узнаете, что с вашим оборудованием все в порядке, создайте функцию, которая будет мигать. Вот функция, которую я использую. /*------------------------------------------ ------------------------------ ** blinkEm - функция мигания светодиода при использовании PD4 ** PD4 должен быть настроен как выход. ** ------------------------------------------------ --------------------- * / void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); считать--; }} Теперь можно использовать эту функцию в различных точках вашего кода как сигнал о том, что код уже выполнил свою работу. Знание того, что код запущен, означает, что вы можете внимательно изучить каждый запущенный раздел, но не сделал того, что вы ожидали, чтобы найти ошибки. Изменение одной вещи за раз - это также ключевой метод отладки (описанный в ссылке выше). Этот классический метод работает вместе с принципом «разделяй и властвуй»: делая небольшие шаги для постепенного добавления функциональности. Это может показаться медленным подходом, но он не так медленен, как попытка отладить сразу большой участок неработающего кода.

Шаг 4: дополнительная отладка

Часто мы хотим проверить часть кода, пропуская большинство строк в нем, а затем включив их по одной, когда мы проверяем, работает каждая из них. Обычно мы делаем это, «комментируя» строки, которые хотим пропустить. Расширение этого метода - вырезать и вставить блок кода, закомментировать оригинал (чтобы мы не потеряли его) и взломать копию. В C есть четыре простых способа закомментировать строки. Добавление «//» перед строкой закомментирует эту строку. Включение одной или нескольких строк в «/ *» и «* /» закомментирует весь раздел. Чтобы этот метод работал эффективно, в блоке кода не должно быть других символов «* /» (кроме конечного). Таким образом, эффективная дисциплина состоит в том, чтобы использовать // для комментариев внутри блоков кода и зарезервировать конструкцию / * * / для блоков комментариев и для комментирования разделов кода. Размещение "#if 0" в начале блока для закомментирования и завершение раздела с помощью «#endif». Более избирательное управление возможно с использованием «#ifdef (идентификатор)» в начале блока и «#endif» в конце. Если вы хотите, чтобы блок был скомпилирован, используйте "#define (идентификатор)" ранее в программе. Обратите внимание, что кавычки предназначены только для выделения и не должны использоваться. Объединение этих методов должно обеспечить полезный подход к отладке ваших программ на ATtiny2313. Вы можете найти эти инструменты полезными, когда мы продолжим работу с этим Руководством.

Шаг 5: Использование таймера / счетчика 0 для звуковых сигналов

Использование таймера / счетчика 0 для звуковых сигналов
Использование таймера / счетчика 0 для звуковых сигналов

ATtiny2313 имеет два мощных ресурса таймера / счетчика: один 8-битный и один 16-битный. Они могут быть сконфигурированы как генераторы частоты, контроллеры с регулируемой широтно-импульсной модуляцией и регистры сравнения выходов. Полная функциональность описана на 49 страницах технического описания. Однако мы воспользуемся простым случаем. Будет использоваться только таймер / счетчик 0 (8-битный), и он будет использоваться просто как генератор частоты. Частота будет направлена на небольшой динамик, чтобы издать звуковой сигнал. Таймер / счетчик 0 полностью описан на страницах с 66 по 83 спецификации ATtiny2313. Внимательное чтение этого материала обеспечит полное понимание Time / Counter 0. К счастью, достаточно простой режим, Clear Timer on Compare (CTC), - это все, что требуется для генерации звукового сигнала, который нам нужен.

Для режима, который мы будем использовать, работа таймера / счетчика проста. Когда выбран тактовый сигнал, счетчик запускается с нуля и увеличивает каждый тактовый импульс. Когда значение счетчика достигает значения в выходном регистре сравнения (TOP), счетчик сбрасывается на ноль и счет начинается снова. Выходной бит, связанный с таймером / счетчиком, переключается для получения выходного сигнала прямоугольной формы. Это напрямую приводит в действие аудиопреобразователь, который издает звуковой сигнал. Маленький звуковой преобразователь TDK издает звуковой сигнал. Подходящий блок - Digikey 445-2530-ND, TDK SD1209T3-A1 (я использовал его раннюю версию). Это версия на 3 вольта; Я ожидаю, что версия на 5 вольт также будет работать. Я подключаю его прямо к выходному порту Attiny2313, и, похоже, он работает нормально. У Sparkfun есть похожее устройство.

Шаг 6: Настройка таймера / счетчика 0

Режим CTC можно использовать для переключения выхода OC0A на контакт 2, порт B (физический контакт 14). Для включения вывода на этот вывод необходимо правильно установить DDRB. Код C для этого аналогичен настройке вывода для мигающего света. DDRB = _BV (PB2); // Порт B2 является выходом. Следующим шагом является подача тактового сигнала и загрузка регистра сравнения выходных данных для получения формы сигнала в виде частоты. Уравнение для результирующей частоты приведено в таблице данных (стр. 72). Члены уравнения будут описаны ниже. Вот уравнение: fOC0A = fclk_I / O / 2 * N * (1 + OCR0A) Где fOC0A: = выходная частота fclk_I / O: = частота источника тактового сигнала N: = коэффициент предварительного масштабирования тактового сигнала OCR0A: = значение в выходном регистре сравнения для Timer / Counter 0A. Clock Source Frequency, fclk_I / O Это частота системных часов. Значение по умолчанию - 1 МГц. Биты CS00, CS01 и CS02 TCCR0B управляют этим выбором. Поскольку эти биты также выбирают значение N, оно описывается далее. Значение предварительного масштабирования, NN - это значение, используемое для деления или предварительного масштабирования системных часов. Биты CS00, CS01 и CS02 TCCR0B управляют этим выбором. Табл. 41 на стр. 81 спецификации ATtiny2313 описывает комбинации. Поскольку желательна частота около 1 кГц, будут установлены биты CS00 и CS01 TCCR0B. Обратите внимание, что установка всех трех битов в 0 и, таким образом, отсутствие выбора источника тактовой частоты, фактически останавливает вывод. Это метод, который будет использоваться для запуска и остановки звукового сигнала. Значение TOP, OCR0A Это значение является значением TOP для счетчика, который загружается в выходной регистр сравнения для таймера / счетчика 0A. Когда это значение будет достигнуто, счетчик будет сброшен на ноль, и счет начнется снова, пока не будет достигнут TOP, и цикл будет повторяться. TOP легко модифицируется, поэтому частоту звукового сигнала легко изменить. Поскольку желательна частота около 1 кГц, TOP устанавливается на 7. (Обратите внимание, что предварительный делитель мог быть установлен на 8, а TOP на 63. Тот же результат - ваш выбор.) Выходная частота, fOC0A Использование уравнения для расчета результатов выходной частоты in: fOC0A = 1, 000, 000/2 * 64 * (1 + 7) fOC0A = 977 Гц Достаточно близко! Вот код для загрузки регистра сравнения выходных данных и регистра управления счетчиком таймера 0B. Пожалуйста, посмотрите фактический программный код, чтобы понять, как они используются. OCR0A = 7; // Временное значение TCCR0B = _BV (CS01) | _BV (CS00); // Выбираем внутренние часы & prescale = 8 TCCR0B = 0; // отсутствие источника часов отключает звуковой сигнал Установка режима времени / счетчика В качестве последней детали мы укажем желаемый режим таймера / счетчика, установив соответствующие биты в регистре управления таймером / счетчиком 0A. Режим CTC выбирается установкой бита WGM01, как описано в Таблице 40, стр. 79 спецификации. Поскольку мы хотим, чтобы выход переключался в каждом цикле, бит COM0A0 также необходимо установить, как описано в Таблице 34 на стр. 77. Вот код: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Режим переключения CTC

Шаг 7: Использование четырех переключателей

По мере того, как мы реализуем звуковой сигнал, давайте расширим наше оборудование и программное обеспечение для работы с четырьмя коммутаторами. Поскольку выход таймера счетчика 0A находится на порте B, вывод 2, мы не можем просто подключить несколько коммутаторов последовательно к порту B. Простым решением было бы использовать порт D, но давайте оставим этот порт доступным для других функций (возможно, шаговый двигатель). Итак, подключим дополнительные переключатели к PB3 и PB4. Считывание переключателей практически не изменилось. Значение маски изменяется на 0x1B (двоичное 00011011), чтобы замаскировать бит 2 вместе с 5, 6 и 7. Еще один прием используется для создания 4-разрядного двоичного числа. Сдвиньте биты 3 и 4 вправо на один бит и объедините их с битами 0 и 1 в 4-битное двоичное число. Это стандартный синтаксис C для сдвига и комбинирования битов, но он может быть малоизвестен новичкам. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // но 1 имеет показание переключателя Во время работы программа дважды мигнет и дважды подаст звуковой сигнал, сигнализируя об инициализации. Каждый раз, когда переключатели меняются, номер, который они представляют, будет звучать. Когда переключатели не меняются, светодиод будет мигать. Чтобы запустить этот код, создайте новый каталог (назовите его Beep, если хотите) и загрузите в него следующий файл кода C и make-файл. Переименуйте Makefile2.txt в Makefile. Используя WinAVR, скомпилируйте программу и загрузите ее в свой Attiny2313.

Шаг 8: Использование конструкции Switch / case

Последний шаг - «просто программное обеспечение»: как и было обещано, мы реализуем конструкцию switch / case. Хотя в этом примере показаны только два альтернативных действия, должно быть очень ясно, как использовать эту конструкцию для выбора одного из нескольких альтернативных разделов кода. В процессе работы эта программа контролирует переключатели и, если есть изменение, она будет издавать звуковой сигнал с соответствующим номером, если он нечетный; он будет мигать, если число четное. Он ничего не делает, если не изменится переключатель.

Чтобы запустить этот код, создайте новый каталог (назовите его Switch, если хотите) и загрузите в него следующий файл кода C и make-файл. Переименуйте Makefile3.txt в Makefile. Используя WinAVR, скомпилируйте программу и загрузите ее в свой Attiny2313.

Шаг 9: Заключение

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

Итак, это все! Теперь вы знаете, как использовать переключатели для управления выполнением вашей программы, считывая их и выбирая действие в зависимости от настройки переключателя. Вы также знаете, как создать звуковой сигнал, а также узнали некоторые стратегии отладки.

Если вы хотите проверить свое понимание, попробуйте изменить последнюю программу так, чтобы она звучала высокой тональностью, если она четная, низкой звуковой нотой, если нечетная, и непрерывным миганием светодиода, если переключатели не меняются. вернемся к разделу об отладке за помощью.

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