Site Loader

Подключение кнопки к Atmega8 — №5

Как я изучал микроконтроллеры AVR

  1. Вы здесь:  
  2. Главная
  3. Программирование
  4. Как я изучал микроконтроллеры AVR
  5. Подключение кнопки к Atmega8 — №5

 

 

 Начнем с алгоритма работы нашей программы!

1. Если нажать кнопку КН1 подключенную к порту PB1, то на ножке микроконтроллера №15 появится минус источника питания и включится бегущий огонек.

2. Написать программу бегущего огонька с использованием циклы for.

Перейдем к написанию программы и рисованию электрической схемы!

1. Создаем новый проект в Atmel Studio 7 по пути

File > New > Projec…, выбираем C/C++ и тип проекта GCC C Executable Project, вводим название проекта (Name: и Solution name:).

2. Выбираем тип микроконтроллера с которым будем работать, в нашем случае Atmega8.

Программа нам выдает код в файле main.c*

 Приводим его к читабельному виду, удаляем лишние комментарии.

Добавим в электрическую схему из статьи Бегущие огни Atmega8 программа на СИ кнопку включения:

И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, 7 резисторов, 7 светодиодов, к порту PB1  ножки микроконтроллера №15 подключена кнопка КН1, а также обозначены выводы для подключения программатора, вернемся к программе.

Светодиоды у нас подключены к порту РD, настроим в программе ножки порта РD на выход, допишем в программе DDRD = 0b11111111;, так как кнопка у нас подключена к порту В настроим его ножки на вход DDRB = 0b00000000;, затем выключим порт D командой PORTD = 0b00000000;, по алгоритму наш микроконтроллер должен понимать, что когда мы подали минус — замкнув кнопку, для этого подтянем ножки порта В к +5в через внутренние резисторы микроконтроллера PORTB = 0b11111111;, можно использовать внешние подтягивающие резисторы, но об этом поговорим в другой раз когда будем бороться с дребезгом контактов.

С настройкой портов закончили, добавим переменную char r; для работы нашего бегущего огонька, присвоим директиве #define имя S которое будет хранить данные о задержке на 0,2 секунды. Чтобы наши светодиоды замигали, добавим в программу библиотеку задержек #include <util/delay.h>, а для мигания будем использовать функцию _delay_ms(), далее с помощью оператора #define укажем программе, что наш контроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.

Вот получился код:

Запишем в наш бесконечный цикл while код опроса порта на котором подключена кнопка и цикл мигания светодиодов:

Для опроса кнопки воспользуемся операторами if и else, строка if (PINB == 0b11111101) означает, если ножка порта PB1 равна минусу, то выполним код выделенный красным на рисунке ниже, иными словами запустим мигание светодиодов:


 В противном случае else, выключим порт D:

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

 

 

Исходный код программы Скачать архив

  • Назад
  • Вперед

Статьи по теме

Карта сайта

Карта сайта

Главная страница-Персональные страницы-Коновалов Дмитрий Александрович-Файлы

  • НАУКА
    • Темы
      • Квантовая информатика
    • Семинары
    • Публикации
    • Важнейшие результаты
    • Конференции
      • Только предстоящие конференции
      • Все конференции (+ прошедшие)
    • Партнеры
    • Научные школы
      • Научная школа «Ионно-лучевая и импульсно-энергетическая модификация материалов»
      • Научная школа «Химическая физика»
      • Научная школа «Когерентная и квантовая оптика»
  • ОБРАЗОВАНИЕ
    • Научно-образовательный центр
      • Положение о НОЦ
      • Состав и структура НОЦ
      • Образование
      • Мероприятия
      • Ссылки и контактная информация
    • Аспирантура
      • Обучающиеся
      • Расписание
      • Образовательные программы
      • Информационные ресурсы
    • Базовые кафедры
    • Именные стипендии
      • Лауреаты
    • ЭПР — электронный урок
      • Экскурсия школьников по КФТИ КазНЦ РАН
  • ДОСТИЖЕНИЯ
    • Важнейшие результаты
    • Разработки
      • Магнитно-резонансный томограф
        • Наши клиенты
        • Основные технические параметры и характеристики томографов
        • Эксплуатационные характеристики томографов КФТИ
        • Выявляемые патологии
        • Изображения полученные на МР-томографе
        • Отзывы о применении наших томографов
    • Патенты
    • Награды и премии
  • ИНСТИТУТ
    • Название
    • Структура института
    • Руководство
    • Советы
      • Учёный совет
        • Заседания Учёного совета
      • Диссертационный совет
        • Рекомендации диссертантам
        • Новости и объявления
        • Видео архив
        • Диссертации (архив)
      • Совет молодых учёных
        • Молодёжные гранты
    • Профсоюз
      • События
      • Документы
    • Награды и премии
    • Контакты
    • Положение о КФТИ ОСП ФИЦ КазНЦ РАН
    • Реквизиты
    • Результаты специальной оценки условий труда
  • <div>English page</div>

Программирование AVR 04: Написание кода и т.

д.

Добро пожаловать в четвертую и последнюю часть серии. Первых трех частей должно быть достаточно, чтобы сдвинуть вас с мертвой точки, но еще несколько обучающих примеров не помешают. Это также хорошее время, чтобы обсудить некоторые другие вещи, которые могут делать эти маленькие чипы. Присоединяйтесь ко мне после перерыва:

  • Расширьте пример кода, добавив функции в нашу простую программу, пока я предлагаю вам написать код самостоятельно.
  • Обсудите биты предохранителей AVR, как их использовать и на что обратить внимание
  • Коснитесь некоторых периферийных устройств, которые вы встретите в этих чипах

В качестве дополнения к серии я использовал пример оборудования из этой последней части для создания велосипедного заднего фонаря. Надеюсь, это вдохновит вас на создание чего-то более умного.

Дорожная карта серии:

  • Программирование AVR 01: Введение
  • Программирование AVR 02: Аппаратное обеспечение
  • Программирование AVR 03: Чтение и компиляция кода
  • Программирование AVR 04: Запись кода

Добавление к примеру оборудования

Пример кода, с которым я работал в последних двух частях этого руководства, немного скучен. Он заставляет один светодиод мигать и выключаться с частотой около 1 Гц. Этот светодиод был подключен к контакту PD0, поэтому давайте начнем с добавления светодиода и резистора к остальным контактам PORT D, чтобы в общей сложности получилось 8 светодиодов. Мы также должны поговорить о входах, поэтому давайте добавим переключатель на PC0. Вот схема, показывающая наши изменения:


Я переместил исходный светодиод на открытое пространство с правой стороны макетной платы. Я подключаю катод к заземляющей шине внизу, перемыкаю траншею резистором и соединяю перемычкой этого резистора с контактами порта D на микроконтроллере. Я расположил светодиоды в порядке возрастания справа налево, чтобы упростить их адресацию при написании кода:

Если вы знаете цветовые коды своих резисторов, вы заметите, что коричнево-зелено-красные резисторы, которые я использую, имеют номинал 1,5. кОм, подавляя ток до крошечной струйки для светодиодов. Ну, я использую суперяркие светодиоды, и эти резисторы были первыми, которые я вытащил. Они отлично подходят для прототипирования, но должны быть заменены правильно рассчитанным значением готового продукта.

Далее я подключил кнопку. Цифровые входы микроконтроллеров должны иметь значение 0 В или VCC (в нашем случае входное напряжение равно 5 В). Если они не имеют четкого значения, говорят, что они «плавающие», что может привести к ложным показаниям кнопок и другим неприятным событиям. Нам нужно настроить аппаратное обеспечение, которое всегда будет принудительно устанавливать значение 0 В или 5 В. Это оказывается совсем просто. При подключении переключателя от контакта к земле и резистора от контакта к VCC (называемого подтягивающим резистором) всегда будет очень небольшой ток 5 В, просачивающийся на контакт, за исключением случаев, когда неограниченный путь к земле создается нажатием кнопка. Нам даже не нужен собственный резистор, так как он есть внутри микроконтроллера, которым мы воспользуемся. Вот схема, показывающая, как выглядит это соединение вместе с внутренним подтягивающим резистором:

Это описание слишком длинное, но на самом деле мы всего лишь помещаем кнопку между PC0 и Ground. Контакт 23 — это PC0 на ATmega168, а контакт рядом с ним (контакт 22) — это GND. Я подключил переключатель соответственно. Обратите внимание, что на следующем изображении контакт 22 подключен перемычкой к шине заземления над ним, но закрыт черным проводом от кнопки:

И, наконец, я хочу подключиться к микросхеме для Внутрисистемное программирование. Мне нравится делать это с помощью созданной мной коммутационной платы. Это позволяет мне использовать 10-контактный кабель IDC для простого подключения к моему программатору:

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

Написание кода

Время попрактиковаться в написании собственного кода. Я придумал четыре примера прошивки, различающихся по сложности от «Hello World» до «Чертовски круто». Я кратко расскажу о каждом из них, но попутно вы должны попробовать написать свой собственный код, используя мои примеры как… примеры. Лучший способ научиться программировать — это написать небольшую часть кода, позволить компилятору покричать на вас за ошибку, а затем выяснить, как это исправить.

Мигают все 8 (8 светодиодов_1 Гц)

Прежде всего, можете ли вы вы заставить код из примера из Части 2 мигать всеми 8 светодиодами вместо одного?

Есть только две вещи, которые вам нужно изменить по сравнению с оригиналом, чтобы это произошло. Во-первых, при настройке ввода/вывода сделайте все контакты порта D выходами, а затем включите их все. Во-вторых, при переключении битов в подпрограмме обслуживания прерываний используйте битовую маску, которая влияет на все восемь битов. 9= 0xFF; // Используйте xor для переключения светодиодов

Как видите, обе части кода используют 0xFF в качестве битовой маски. Это байт, содержащий все единицы, который будет манипулировать каждым выводом в регистрах, к которым мы его применяем. Прежде чем я немного сдвинулся, используя это:

 '1<<0' 

Это привело к битовой маске 0x01, защищающей верхние семь битов от изменения во время манипуляций с регистром.

Заставьте светодиоды делать что-нибудь интересное (m168_led_effects)

Теперь я собираюсь сделать большой шаг вперед в сложности C-кода. Но я предлагаю вам самостоятельно разработать три различных типа светодиодных эффектов:

  • Двоичный счетчик, который считает 1 бит в секунду
  • Мигалка, которая попеременно зажигает каждый второй светодиод
  • Сканер Ларсона (простой, не требует ШИМ)

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

Определения: Я использую определения для общих настроек и для контактов ввода-вывода, портов и регистров направления. Это константы, которые компилятор заменит соответствующими значениями, но они значительно облегчат вашу работу. Если вы пройдёте большую часть проекта и поймёте, что вам нужно изменить часть аппаратного обеспечения, это упростит вам задачу. Нужно перейти с порта D на порт C? Нет проблем, измените #define, и остальная часть кода по-прежнему будет работать

Задержка: В AVR libc есть хорошая утилита задержки, называемая delay.h. Вы можете видеть, что я включил его в начало исходного файла, а также написал функцию с именем delay_ms(). Это умеренно точный способ отметить течение времени. Недостатком этого является то, что вы буквально тратите время, когда процессор может заниматься другими делами. Тем не менее, это просто, и если вы новичок в микроконтроллерах, вы, вероятно, поначалу часто будете использовать это.

В этой версии кода также примечательно то, что я использую функции для упрощения MAIN. Мне нравится делать это, когда я могу сделать программу более читабельной. Если вы используете описательные имена функций, другим будет легко увидеть, как работает прошивка, просто взглянув на main. Вот почему я так много комментирую свой код. Не только для других, но и для того, чтобы я мог быстро прочитать ее, если вернусь к ней позже и не вспомню, для чего изначально написал программу.

Прежде чем мы двинемся дальше, вот краткий обзор того, как я решил три задачи:

  • При отображении двоичного счетчика с частотой 1 Гц я просто запускаю Таймер 2 так же, как я делал это для мигающего светодиода во второй части руководства. Каждый раз, когда он срабатывает, я не переключаю контакты, а устанавливаю для всего порта значение 8-битной переменной, одновременно увеличивая его. ++binary_counter увеличивает это значение непосредственно перед установкой порта D. Крайне важно, чтобы это значение было глобальной переменной с ключевым словом volatile, поскольку оно изменяется как ISR, так и в основном цикле. Если вы не сделаете его изменчивым, компилятор может оптимизировать код таким образом, что это нарушит или нарушит предполагаемую функциональность.
  • Создание альтернативной мигалки очень похоже на переключение одного светодиода. Я настроил эффект, создав экземпляр переменной, где каждый второй бит равен 1. При использовании оператора исключающего ИЛИ (XOR) для этого значения все биты будут инвертированы. Я мог бы настроить прерывание с более короткой задержкой, чем прерывание в 1 Гц, чтобы позаботиться об этом, но вместо этого в целях обучения я использовал задержку.
  • Сканер Ларсона — классическое чудо. Основная функция состоит в том, чтобы зажечь один светодиод и перемещать его вперед и назад. Для этого я просто создал цикл для сдвига битов, ожидая после каждого изменения. Как только загорится светодиод в конце, программа выйдет из цикла и войдет в другой, чтобы сдвинуть биты в другую сторону. То же самое можно было бы сделать с помощью переменной, которая отслеживает, в каком направлении движется светодиод, проверяя каждую итерацию.

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

Заставьте кнопку что-то делать (m168_led_button)

Мы принесли кнопку на вечеринку, давайте изменим наши светодиодные эффекты, чтобы кнопка использовалась для переключения между тремя возможностями. Если вы никогда раньше не писали код для кнопки ввода, у вас мало шансов, что вы сможете сделать это самостоятельно, поэтому откройте код в папке m168_led_button и давайте пройдемся по нему.

Отказ: Кнопки часто регистрируют более одного нажатия, если не обрабатываются правильно, этот процесс называется устранением дребезга. Для этого есть аппаратное исправление, но вы можете узнать об этом в свободное время. Недавно я собрал пост, полный различных кодов для устранения отказов, но тот, который я почти всегда использую, основан на коде [Peter Dannegger]. Он состоит из нескольких частей:

  • Код для запуска таймера с прерыванием переполнения
  • ISR для обслуживания переполнения таймера, сброса таймера для 10-миллисекундных прерываний и опроса вывода кнопки.
  • Битовая маска и определения контактов, которые определяют, как кнопки подключены
  • Функция, используемая для проверки того, было ли зарегистрировано нажатие кнопки
  • Код для проверки этой функции и действия при нажатии кнопки.

Волшебство кроется в коде устранения дребезга ISR. Он переворачивает биты в двоичном счетчике, чтобы зарегистрировать четыре последовательных показания нажатия кнопки в общей сложности 40 мс. Это сигнализирует о законном нажатии кнопки, и когда вызывается функция get_key_press, она возвращает заполненную маску клавиши. Чтобы помочь понять, как работает этот код устранения дребезга, я включил пример кода, который называется button_debounce. Он был сокращен, чтобы включать только код, используемый для устранения дребезга. Нажатие кнопки переключает светодиоды.

Во время настройки оборудования я говорил об использовании внутренних подтягивающих резисторов. Я должен не забыть установить их в начале программы, иначе входной контакт будет плавающим. В таблице данных об этом говорится на странице 71. Когда контакт настроен на ввод с использованием регистра направления данных, запись высокого значения в бит порта для этого контакта активирует подтягивающий резистор. Оттуда текущий статус вывода можно получить из соответствующего регистра вывода. Обратите внимание, что ISR, используемый для устранения дребезга, читает KEY_PIN, который определен как регистр PINC в начале исходного кода. Вам не нужно читать регистр Pin, потому что ISR делает это за вас.

Моя реализация подавления дребезга кнопок в коде m168_led_button очень хороша, но мое использование кнопки — это хак. Я должен был использовать конечный автомат и избавиться от функций задержки в коде. Для простоты я просто засорял вызовы get_key_press по всему коду всякий раз, когда я зацикливал программу. Я использовал обнаружение нажатия клавиши, чтобы вернуться к главному из функции, в которой застряла программа.

Разберите это по частям, напишите простой код, который вы понимаете, и постепенно вы создадите базу знаний, необходимую для понимания этого кода в целом.

Создание чего-то полезного (m168_bike_light)

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

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

В этом примере также используется спящий режим. Одно замечание: в спящем режиме чип почти не потребляет ток, экономя заряд батареи. Но линейный регулятор мощности все равно сгорает как сумасшедший. Чтобы это было полезно, код должен быть перенесен на чип, работающий при низком напряжении. Например, вы можете использовать крошечную 13 и две батарейки АА без регулятора. Потребуется внести коррективы для меньшего количества контактов и скорректировать значения резисторов светодиодов, но это несложные изменения. Взгляните на код в папке m168_bike_light. Комментарии и ваши с трудом заработанные знания AVR помогут вам понять, как это работает. Удачи!

Теперь я перейду к обсуждению одной из наиболее важных частей этих микроконтроллеров:

Биты предохранителей AVR

Биты предохранителей представляют собой набор регистров, которые управляют некоторыми основными функциями линейки микросхем AVR. Вы можете думать о них как о другом типе памяти, запрограммированной отдельно от кода, который вы хотите выполнить.

Прочтите техническое описание

Фьюз-биты для ATmega168 рассматриваются, начиная со страницы 285 технического описания. Вам следует тщательно ознакомиться с этой информацией. Неправильное программирование этих регистров может сделать ваш чип бесполезным, если у вас нет программатора, способного к программированию высокого напряжения (HVP).

На нашем чипе есть три регистра фьюз-битов: расширенный фьюз-байт, старший фьюз-байт и младший фьюз-байт. Все они используют обратную логику, то есть «1» означает, что соответствующая функция НЕ выбрана. Я начинаю каждый проект с этими регистрами, установленными на заводские значения по умолчанию, информацию, которую я храню в текстовом файле с заводскими значениями предохранителей по умолчанию для всех микросхем, с которыми я работаю. В начале каждого проекта я пытаюсь поговорить с чипом, используя опцию «-v» AVRdude, чтобы убедиться, что программатор и чип работают правильно, чтобы сэкономить время на последующей отладке. Вот значения по умолчанию для ATmega168:

  • излияние: 0b11111111 (0xFF)
  • hfuse: 0b11011111 (0xDF)
  • lfuse: 0b01100010 (0x62)

Я коснусь большинства этих функций в следующем разделе. Но особую озабоченность вызывают биты, которые выбирают источник синхронизации, и бит отключения сброса. Если вы отключите контакт сброса случайно или для того, чтобы использовать его в качестве контакта ввода-вывода, вам нужно будет использовать HVP или debugWire, чтобы снова использовать программирование ISP. Если контакты синхронизации изменены, вам потребуется соответствующий внешний сигнал синхронизации или HVP по той же причине.

Вы можете запрограммировать фьюз-биты с помощью AVRdude. Собственно, в документации есть пример. Эта команда вернет предохранители к заводским настройкам:

 avrdude -c dragon_isp -P usb -p m168 -U efuse:w:0xff:m -U hfuse:w:0xdf:m -U lfuse:w:0x62:m 

Периферийные устройства AVR (краткий обзор)

Проведите краткий обзор функций, доступных на этом чипе. Это будет быстро, но у вас уже есть основные навыки, которые вам нужны. Просто прочитайте техническое описание и с помощью Интернета соедините остальные точки.

Память EEPROM

Большинство (если не все) микросхем AVR поставляются с электронно стираемой программируемой постоянной памятью. Это постоянная память, в которой хранятся данные между сбросами и при отсутствии питания на микросхеме. Именно здесь регистраторы данных хранят информацию и часто содержат такие вещи, как текстовые строки, данные шрифтов и т. д. AVR-GCC сгенерирует файл .EEP во время компиляции с любыми данными EEPROM, которые вы используете в своих программах. Это необходимо запрограммировать в чип отдельно от флэш-данных.

Таймеры (обычные и сторожевые)

Таймеры — это лучшее место с точки зрения функциональности. Они выходят далеко за рамки простого измерения времени и могут использоваться для вывода микросхемы из спящего режима, для генерации частот широтно-импульсной модуляции и многого другого. Некоторые чипы имеют асинхронные таймеры, такие как Timer/Counter 2 на ATmega168, которые могут использовать внешний тактовый сигнал отдельно от других таймеров.

Не упустите также сторожевой таймер. Эти таймеры могут сэкономить деньги и даже жизни. Это аппаратный таймер, активируемый через фьюз-биты, которые сбрасывают микроконтроллер, если он не обрабатывается программно. Почему вы хотите это сделать? Потому что никто не пишет идеальный код. При использовании сторожевого таймера вы часто сбрасываете его счетчик во время успешного выполнения кода. Таким образом, если ваш код когда-либо зависнет или попадет в цикл, сторожевой таймер автоматически перезагрузит устройство, избавив вас от привязки, вызванной программным обеспечением. Посмотрите, что [Джек Ганссле] говорит о них.

Счетчик реального времени

Выше я упоминал, что Таймер/Счетчик 2 может работать асинхронно с остальными таймерами/счетчиками. Почему это ценно? Одно из применений — счетчик реального времени (RTC). Это работает в сочетании с часовым кристаллом для отслеживания времени и даты.

Аппаратная ШИМ

Продолжая тему таймера/счетчика, эти микросхемы имеют аппаратную широтно-импульсную модуляцию. ШИМ генерирует сигнал между 0 В и VCC, часто включая и выключая выходной контакт. Используемая частота и рабочий цикл (соотношение высокого и низкого уровня за один период) устанавливаются в регистрах, и вам не нужно думать об этом снова, пока вы не захотите их изменить. Это полезно для множества вещей, таких как затемнение светодиода, управление серводвигателем или создание звука на пьезоэлементе.

АЦП

Если вы хотите измерить аналоговое значение, вам нужен аналого-цифровой преобразователь. Большинство микросхем AVR имеют несколько из них с разной степенью точности. Это позволяет вам делать такие вещи, как измерение уровня освещенности с помощью фоторезистора и считывание значения потенциометра (используя его как ручку настройки).

USART

ATmega168 имеет универсальный синхронный и асинхронный последовательный приемник и передатчик, которые позволяют обмениваться данными разными способами. Это включает в себя последовательную связь, такую ​​​​как USB (с использованием стека V-USB), а также стандарты связи между микросхемами, такие как SPI, I2C и TWI.

SPI

Семейство AVR часто включает в свое оборудование протоколы связи шины последовательного периферийного интерфейса. USART на ATmega168 предлагает функции основного SPI, используемые для управления другими микросхемами, которые также используют протокол, через три соединения; два для данных один для часов.

I2C/TWI

USART также предлагает аппаратные функции I2C и двухпроводного интерфейса. Как и SPI, это распространенные протоколы между чипами, но они используют только два провода; один для данных, а другой для тактового сигнала.

Аналоговый компаратор

Аналоговый компаратор использует два входных контакта для сравнения аналоговых сигналов. Основываясь на их соотношении, микросхема может быть настроена на срабатывание прерываний, если одно из них меняет значение по сравнению с другим. Два входа могут быть сопоставлены с любым выводом АЦП, но одновременно можно сравнивать только два значения. Я никогда не использовал эту функцию, и я основываю это описание исключительно на том, что я прочитал в техническом описании. Извини!

Биты блокировки

Любой код, который вы записываете в эти чипы, может быть прочитан и сохранен (хотя то, что возвращается, является машинным кодом, код C, который мы писали, никогда не может быть идеально воспроизведен из того, что вы получаете от чип). Затем его можно использовать для программирования других идентичных чипов. Но есть функция, называемая битами блокировки, которая может защитить этот код. После установки чип не может быть прочитан, и в зависимости от того, какие биты установлены, его нельзя будет перепрограммировать. То есть до тех пор, пока чип не будет стерт, что сбрасывает эти биты блокировки.

JTAG, debugWire и программирование высокого напряжения

В этом руководстве мы использовали системное программирование, но есть несколько других способов программирования микросхем AVR. JTAG — это стандартный интерфейс аппаратной отладки (и программирования), который есть у некоторых микросхем, но не у ATmega168. Многие из этих микросхем могут использовать протокол debugWire для программирования и отладки, используя только один провод, соединяющийся с выводом сброса. Протоколы JTAG и debugWire настраиваются с использованием фьюз-битов.

Высоковольтное программирование используется для спасения чипов, до которых невозможно добраться другими методами программирования. Существует два вида: параллельное программирование высокого напряжения, как в ATmega168, или последовательное программирование высокого напряжения, которое используют микросхемы с малым числом выводов. Если вы отключите вывод Reset или включите debugWire, или неправильно установите источник тактового сигнала в настройках фьюза, HVPP или HVSP должны сбросить фьюзы и спасти «замурованную» микросхему.

Питание и спящий режим

Микроконтроллеры работают так быстро, что часто просто теряют время, прокручивая бесконечный цикл в ожидании прерывания. Если вы работаете от батареи, это просто пустая трата сока. При использовании энергосберегающего и спящего режимов батареи могут работать дольше. Это достигается путем отключения энергоемких периферийных устройств, таких как АЦП, и выключения процессора, когда он не нужен, переводя его в спящий режим. Их немного сложно понять, но зачастую они того стоят

Заключение

Вот именно. Я прекрасно провел время, пишу об этом. Возиться с микроконтроллерами — мое любимое хобби, и я надеюсь, что оно стало и вашим. На самом деле это очень простые концепции, которые усложняются по мере того, как вы накладываете их друг на друга. Просто сравните исходный код Части 2 с кодом заднего фонаря велосипеда. Но в этом и прелесть. Это изобретательский эквивалент приключенческого романа «Выбери свой собственный». Так что придумайте вызов и посмотрите, куда он вас приведет!

Следуйте за мной

@szczys

Ресурсы

Часть 4 Пакет прошивки: Github Repository

Atmel AVR ATMEGA168 DataSheet (PDF)

AVR Libc Manual

HTTP:/WWW.GATHSLE.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle.comsle..com.

микрочипов для AVR | Встроенная лаборатория

Архив метки: mikroC для AVR


Опубликовано Шавон Шахрияр

Во встраиваемых системах часто необходимо генерировать аналоговые выходные сигналы от микроконтроллера. Примеры этого включают генерацию звуковых тонов, голоса, музыки, плавных непрерывных сигналов, функциональных генераторов, генераторов опорного напряжения и т. д. Традиционно в таких случаях наиболее распространенные методы основаны на Широтно-импульсной модуляции (ШИМ) , резисторе сети и внешний Цифро-аналоговый преобразователь (ЦАП) чипы типа MCP4921. Вышеупомянутые методы имеют различные индивидуальные ограничения и, кроме того, требуют взаимодействия с внешним оборудованием, что усложняет и увеличивает стоимость проектов. Микроконтроллеры XMega оснащены быстрыми 12-битными ЦАП, помимо блоков ШИМ, и снова зарекомендовали себя как очень универсальное семейство микроконтроллеров. В этом посте мы рассмотрим этот блок.

Подробнее

Опубликовано Шавон Шахрияр

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

 

Подробнее

Опубликовано Шавон Шахрияр

Ранее мы имели дело с блоком XMega Аналого-цифровой преобразователь (АЦП) . Мы знаем, что можем использовать АЦП для измерения напряжения и принятия решений на основе значений/уровней напряжения, но иногда достаточно определить уровни напряжения, а не измерять точные значения напряжения. В таких случаях, когда нам просто нужно проверить уровни напряжения относительно эталонного или порогового значения, нам нужен Аналоговый компаратор (AC) . Аналоговый компаратор можно использовать для сравнения двух уровней напряжения и на основании этого его можно использовать для генерирования логического выхода ( 0 или 1 ), чтобы указать, какой из двух уровней выше или ниже другого. Вот и все, а об аналоговых компараторах многого нет. Семейство микроконтроллеров XMega поставляется с высокопроизводительными модулями двойного аналогового компаратора. Однако до сих пор мы видели, что между традиционными 8-битными микропроцессорами и микропроцессорами XMega основное различие, помимо программирования, заключается в общих изящных улучшениях во всех общих аппаратных блоках. То же самое верно и для аналоговых компараторов XMega micros. В этом выпуске мы рассмотрим блок аналогового компаратора XMega.

 

Подробнее

Опубликовано Шавон Шахрияр

Любой микроконтроллер должен иметь контакты ввода-вывода для приема входных данных и предоставления выходных данных.

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *