Универсальная основа для контроллера с графическим интерфейсом на ATmega8 c OLED дисплеем

В статье рассмотрены следующие вопросы:

  • последовательная передача данных посредством интерфейса TWI (I2C) и аппаратная реализация этой технологии в микроконтроллерах (МК) AVR;
  • программа для поиска адреса устройства, подключённого к шине I2C;
  • подключение, настройка и применение OLED дисплея с разрешением 128*64 пикселей и со встроенным драйвером SSD1306;
  • работа аппаратной ШИМ AVR в режиме Normal;
  • схема безопасной коммутации микроконтроллера и мощной нагрузки;
  • Последовательная передача данных посредством интерфейса I2C (TWI) и аппаратная реализация этой технологии в МК AVR.

    Последовательные интерфейсы позволяют значительно экономить выводы МК, место на печатной плате и количество проводов. Так, например, подключение дисплея в данном проекте осуществляется посредством интерфейса TWI (он же I2C), который подразумевает всего два контакта. При этом схемотехническая простота сильно замедляет передачу данных, ведь за такт может быть передан максимум один бит информации, которую надо ещё и подготовить, что так же усложняет алгоритм работы МК.

    I2C имеет следующие отличительные особенности:

  • возможность объединять до 127 устройств на одной шине (практически это величина гораздо ниже из-за особенностей распространения сигнала, но всё равно этого более, чем достаточно);
  • подтверждение приёма сигнала в виде бита ACK/NACK, что открывает дополнительные возможности, которые будут рассмотрены ниже;
  • отсутствие аппаратной привязки к тому, кто на шине ведущий, а кто ведомый – в любой момент всё можно переопределить.
  • Работа этого интерфейса подробно освещена во всевозможных литературных источниках и видеоматериалах, но отдельные моменты всё же стоит оговорить. Особенности начинаются с того, что в МК AVR все события, происходящие с аппаратным I2C, сопровождаются всего одним(!) прерыванием. Этого мало, но так решили проектировщики AVR. Нам же остаётся создавать switch, в котором следует подробно описывать, что означают конкретные состояния статусного регистра, ведь от этого зависит, куда по прерыванию направится программа. В целом же передача по I2C сводится к действиям, указанным на рис. 1:

    Рисунок 1 — Работа с шиной I2C

  • определить скорость передачи в процессе инициализации. Так же можно (но не обязательно) определить и адрес нашего МК, если в будущем предполагается работа рабом (slave);
  • сделать СТАРТ;
  • отправить байт, где старшие 7 бит – уникальный адрес устройства, который можно узнать из datasheet’а или определить перебором, а младший бит – указание на запись(0) или чтение(1);
  • подождать подтверждение того, что устройство с таким адресом есть на шине и оно готово к взаимодействию (оно ответит низким уровнем на линии SDA, т.е. битом ACK);
  • теперь можно посылать или требовать любую информацию;
  • сделать СТОП.
  • Если адрес устройства неизвестен, то можно найти его последовательным перебором всевозможных значений до тех пор, пока устройство не пришлёт ACK. Учитывая частоту работы МК, нетрудно понять, что поиск адреса займёт совершенно незаметное количество времени. Исходный код программы, основанной на таком переборе, приложен к статье. При этом стоит учесть, что никакой индикации не предусмотрено и найденный адрес просто выводится на свободный порт МК.

    Больше подробностей можно узнать из прилагаемого исходного кода.

    Подключение, настройка и применение OLED дисплея с разрешением 128*64 пикселей и со встроенным драйвером SSD1306.

    В разных проектах одна и та же особенность может быть как плюсом, так и минусом, поэтому следует учесть следующее:

  • этот дисплей по размеру не более циферблата наручных часов (рис. 2), поэтому текстовую информацию на нём выводить почти бессмысленно. Основной упор следует делать на наглядные пиктограммы или крупные символы;
  • монохромное изображение (есть варианты подобных дисплеев с несколькими цветами, но восприятие от этого улучшается незначительно);
  • каждый пиксель является источником излучения, поэтому общая подсветка не требуется, что обуславливает низкое потребление тока и высокую контрастность;
  • нетребователен к питанию: от 3,3 до 5 В;
  • большое количество проектов с применением этого дисплея позволяет найти исчерпывающую информацию почти по любому вопросу.
  • Рисунок 2 — Геометрические параметры и расположение выводов

    Процесс взаимодействия с дисплеем состоит из передачи байтов команд и байтов данных. При этом возникает необходимость определять, что чем является. С этой целью после адреса дисплея посылается контрольный байт, у которого первые шесть разрядов всегда равны нулю, а два самых старших бита определяют, что будет следовать за контрольным байтом: команда, один байт данных, много байт данных. Причём в последнем случае после данных обязательно следует сделать СТОП.

    Вывести что-то на дисплей можно если:

  • сделать СТАРТ;
  • послать байт с адресом и битом, указывающим на запись (0);
  • послать набор команд для инициализации дисплея. При этом перед каждой командой необходимо посылать контрольный байт команд;
  • послать контрольный байт с указанием на запись много байт данных;
  • байт за байтом передать всё изображение;
  • сделать СТОП.
  • Необходимо учитывать, что одна картинка для дисплея с разрешением 128*64 занимает 1024 байта, что равноценно объёму не очень сложной программы. Но, существует возможность сэкономить память и перерисовывать не весь экран целиком, а отдельные пиксели, для этого существуют команды 0x21 и 0x22.

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

    Основные функции, необходимые для работы с дисплеем и функция инициализации дисплея описаны в исходном коде.

    Работа аппаратной ШИМ AVR в режиме Normal.

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

    Рисунок 3 — Основные параметры ШИМ

    В любом МК можно реализовать ШИМ программно, но это полностью уничтожит производительность. По этой причине рациональнее использовать встроенный таймер/счётчик. Инициализировав его определённым образом, можно добиться полной разгрузки процессора МК. В Atmega8 есть три таймера/счётчика, но в данном проекте для ШИМ выбран Timer/Counter1, потому что Timer/Counter2 будет подсчитывать время, а Timer/Counter0 не предназначен для ШИМ.

    Вся инициализация состоит из настройки 2-х регистров управления и одного регистра сравнения. При том необходимо разрешить прерывание по переполнению Timer/Counter1, ведь у счётного регистра TCNT1 Timer/Counter1 слишком большая разрядность (16 бит), из-за чего ШИМ получается медленный. Чтобы это исправить, необходимо по переполнению установить значение счётного регистра ближе к концу, тогда период ШИМ уменьшится хоть до продолжительности нескольких тактов. Между начальным значением TCNT1 и 0xFFFF необходимо выбрать значение 16 битного регистра сравнения OCR1A, чтобы по совпадению TCNT1 и OCR1A логический уровень на выводе OC1A изменялся на противоположный.

    Более подробно о настройке ШИМ можно узнать из документации на МК.

    Схема безопасной коммутации микроконтроллера и мощной нагрузки.

    При работе с МК следует учитывать, что сила тока одного вывода не должна превышать десятков миллиампер, иначе МК выйдет из строя. В случае, когда требуется ток больше, следует применять всевозможные транзисторы, реле, ОУ и их комбинации. Но при этом остаётся риск повредить МК, например, при неожиданном скачке сетевого напряжения, неисправности силового ключа и т.д. Чтобы полностью обезопасить МК и сделать схему максимально надёжной, достаточно предусмотреть опторазвязку. В данном проекте рассмотрено применение транзисторной оптопары. При зажигании светодиода в одной цепи, ток начинает идти по транзистору из второй цепи, которая как бы замыкается. Так происходит управление силовой частью схемы посредством света и электрический контакт МК имеет лишь со светодиодом (рис. 4), что совершенно безопасно для обоих, если использовать токоограничивающий резистор с сопротивлением 100-300 Ом. Отдельно стоит отметить, что для цепей переменного тока следует применять оптопары с симисторным выходом.

    Рисунок 4 — Схема с применением оптопары с симисторным выходом и снабберной цепи

    Итог

    Рассмотренных возможностей ATmega8 достаточно для создания на его основе контроллера несложного электротехнического устройства (рис.5). При этом не задействованной осталась большая часть выводов МК, вплоть до целых портов, что увеличивает гибкость схемы при дальнейшей доработке.

    Рисунок 5 — Общий вид на макетной плате

    В исходном коде также решена проблема с дребезгом, что в совокупности с остальными функциями даст возможность из элементарных блоков достроить свой графический интерфейс, свой обработчик нажатия кнопки, геркона, датчиков света и т.д. (всё, что работает на включение/выключение) и подключить любое другое устройство по I2C.

    Пример реализации рассмотренных возможностей указан на видео.


    Прикрепленные файлы:

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

    Ваш адрес email не будет опубликован.