Работа с индикаторами

Программирование микроконтроллеров

Работа с индикаторами

alex83 » 30 апр 2015, 13:34

Динамическая индикация на 7-сегментных индикаторах
viewtopic.php?f=66&t=432#t_2


Работа с символьными LCD-дисплеями МЭЛТ
phpBB [media]

MT-16S2H.zip
Документация и библиотека для дисплея МЭЛТ MT-16S2H
(146.93 Кб) Скачиваний: 337

Грамотная инициализация
phpBB [media]

Indikator_.zip
Программа
(54.81 Кб) Скачиваний: 308

Обработка сбоев
phpBB [media]

programa.zip
(1.43 Кб) Скачиваний: 280
Аватара пользователя
alex83
Имя: Александр

Работа с графическим LCD MT-12232A(C)

alex83 » 15 июн 2015, 17:51

Данная обучающая (плохому :mrgreen: ) статья является продолжением обучающего курса по программированию микроконтроллеров AVR.
Предыдущие статьи курса:
Микроконтроллеры - это же просто!


Быстрые переходы

В ходе отладки различных устройств на микроконтроллерах иногда возникает необходимость в визуализации каких-либо событий или выводе информации. Конечно всё зависит от задачи, но зажигать светодиоды, применять скучные 7-сегментные или какие другие знакосинтезирующие индикаторы в наше время как-то уныло, поэтому сразу обратимся к графическим LCD-дисплеям, позволяющим выводить не только цифры и псевдобуквы, но и любую символьную информацию, а также рисовать простую графику.
В качестве подопытного был выбран графический дисплей разрешением 122х32х0.4 точки от отечественного производителя МЭЛТ с гордой надписью "Сделано в России" на печатной плате, импортозамещение, ёп :english_en: :fuck: .
Модель MT-12232A-2FLA имеет напряжение питания 5В, снабжена классической янтарной подсветкой(ну не люблю я синюшные гей-подсветки), а также возможностью регулировки контрастности. К недостаткам этой модели можно отнести то, что она не имеет 4-х битного режима работы и под шину данных придется отдавать целый порт.
Однако, под рукой данной модели не оказалось, а оказалась несколько другая модель - MT-12232C-2FLA, которая отличается от выше описанной напряжением питания 2,8В, "перепутанной" полярностью подсветки и несколько другой схемой регулировки контрастности. Да, мы легких путей не ищем. :duma:
MT-12232A.pdf
Даташит MT-12232A
(252.42 Кб) Скачиваний: 296
MT-12232C.pdf
Даташит MT-12232C
(230.37 Кб) Скачиваний: 304

Если у кого нормальный MT-12232A, то можно сразу перейти сюда.

p1Переделка MT-12232C в MT-12232A
Чтобы подключить такой индикатор пришлось бы применить стабилизатор на 2,8В и микросхему согласования уровней, либо попробовать вариант с использованием выходов контроллера, сконфигурированных как открытый коллектор, т.е. выключить подтяжку выводов контроллера к VCC и писать не в PORT, а в DDR. Выводы же индикатора подтянуть резисторами к питанию индикатора 2,8В. При этом лог.0 будет формироваться контроллером, а лог.1 - резисторами подтяжки, но в этом случае ещё нужно проверить фронты(допустимо до 100нс).
В общем, заморачиваться со всем этим не хотелось, поэтому возник резонный вопрос: как бы переделать индикатор под питание 5В? :mrgreen: Немного потусив на этом замечательном форуме и пообщавшись с тех. поддержкой МЭЛТа было выяснено, что это совсем не сложно сделать.
Всё дело в том, что "кристалы" обоих индикаторов работают в диапазоне 2.7В-5.5В и платы у них одинаковые, а разница только в запаянных/не запаянных элементах.

Таким образом, чтобы переделать MT-12232С в MT-12232A нужно:
  1. удалить с печатной платы индикатора резистор R11, а также конденсаторы С9 и С10;
  2. установить резистор R10=3.6 кОм;
Важное условие для успешной переделки - плата версии MT12232A v.6. Также можно ещё перепаять перемычки подсветки для соответствия полярности в разъеме. Подсветка уже рассчитана на питание 5В, поэтому больше с ней делать ничего ненужно.


Что касается регулировки контрастности, то за нее в MT-12232С также отвечает вывод 13, однако схема регулировки отличается от MT-12232A. Если посмотреть даташит на MT-12232С, то там вывод 13 будет помечен как NC - no connect, так вот это п.здешь, всё там прекрасно регулируется. Для регулировки контрастности в широких пределах нужно подключить между этим выводом и землей многооборотный "подстроечник" сопротивлением 5-10к. Так же можно подать на вывод 13 внешнее отрицательное напряжение порядка -4В (с током до 10мА, реально меньше) и регулировать контрастность величиной этого напряжения.

p2Изготовление шлейфа и прочая подготовка
Для тестирования и отладки опять же применим модуль Freeduino2009(с контроллером без Arduino-загрузчика). Паять практически ничего не придется, а для того чтобы индикатор было удобно подключать нужно изготовить кабель(шлейф) с переходными разъемами:
Разъем CN1 шины данных будет подключен к порту D контроллера(разъем J1 на схеме модуля), а разъем CN2 управляющих сигналов к порту B(разъем J3 на схеме модуля). Разъем CN3 питания должен быть подключен к разъему Power модуля, к контактам 3(Vcc) и 4(GND). Минус подсветки выведен на отдельный "шпинек" CN4, чтобы к нему можно было подключить ключ для управления подсветкой, а пока его можно подключить к земле(контакт 5 разъема Power модуля).
На сам индикатор нужно будет припаять разъем типа PLS-R. Для удобства и компактности можно направить его вверх. В итоге должно получится что-то вроде этого:
После изготовления шлейфа нужно внимательно проверить его, чтобы исключить вероятность ошибки.
Также нужно что-то придумать с питанием. Дело в том, что питать от USB компьютера что-то кроме модуля не хорошо и не безопасно, т.к. нагрузочная способность порта ограничена. На модуле хоть и установлен самовосстанавливающийся предохранитель, но лучше подстраховаться и изобрести внешнее питание, либо применить питание через USB от 1,5 - 2-х амперного USB-зарядника(от старого смартфона), к которому может быть подключен USB-кабель типа A-B. Но в этом случае необходимо помнить, что предохранитель модуля на 500мА.

Если индикатор MT-12232C переделывался в MT-12232A, то нужно настроить ему контрастность, для чего необходимо подключить вышеупомянутый подстроечник между 13 выводом и землей, установить его на максимальное сопротивление, подключить подсветку и подать питание на индикатор. Шину данных и управляющие линии подключать пока никуда не нужно.
Скорее всего при включении на экране будет поле из точек, что свидетельствует о переконтрасте. Для его устранения нужно плавно крутить подстроечник в сторону уменьшения сопротивления и поймать момент когда светящегося поля из точек практически не будет видно, после чего довернуть ещё чуть, чтобы оно совсем скрылось. Тут главное не переборщить, иначе и информации потом тоже не будет видно. В моем случае оптимальным оказалось сопротивление 640 Ом.
Если же применяется оригинальный MT-12232A, то подключать подстроечник необязательно, т.к. при питании 5В он "из коробки" будет иметь правильную контрастность. Вывод 13 в этом случае можно оставить незадействованным.


p3Программа драйвера
Теперь, когда всё готово, можно подумать и программном коде. Сперва я, было, ломанулся написать простой тестовый код, взяв за основу программу-пример на C, которую заботливо предоставляет производитель, но потом решил всё же поискать, а нет ли уже чего готовенького, и оказалось, что есть :roll: .
На самом деле практика искать готовый код перед тем как начать писать свой правильная, зачем тратить время и изобретать велосипед, который даже в обучающих целях не всегда оправдан, однако, это не значит, что можно слепо брать и применять чужой код. Даже если найден готовый код, то его нужно досконально изучить, а также исправить и переделать под свою задачу :old: .
MT-12232A,C,D.zip
Тестовая программа от производителя. Не для компилирования, просто как пример
(2.31 Кб) Скачиваний: 337


Мне попалась замечательная статья, где об этом индикаторе рассказывает человек, который уже прошел весь путь по его окучиванию и поделился опытом с остальными :agree: Для того, чтобы лишний раз не повторятся и чтобы было понимание эту статью нужно прочесть, а после скачать архив c программой драйвера для компилятора GCC, код которой мне понравился. Ниже выложен архив проекта программы драйвера, из которого убрано всё лишнее и оставлены только необходимые файлы:
MT12232_driver.zip
Драйвер LCD MT-12232
(9.38 Кб) Скачиваний: 330


p4Компиляция
Для того чтобы залить программу в контроллер её нужно скомпилировать, а перед этим внести необходимые изменения в код и осуществить его отладку.

  1. Первым делом открываем Atmel Studio, создаем новый проект и выбираем соответствующий микроконтроллер(в моем случае это ATmega168), после чего копируем файлы из архива за исключением main.c в папку с проектом:
    • lcd_graph_lib.c - библиотека
    • lcd_graph_lib.h - заголовочный файл
    • bits_macros.h - макросы операций с битами
    • font_6x8.h - шрифт
  2. Далее нужно переименовать файл проекта [имя проекта].c в файл main.c и заменить его содержимое на код соответствующего файла из архива. Кликаем правой кнопкой на имени файла, выбираем Rename и вводим новое имя.
  3. Не смотря на то, что ранее файлы программы были скопированы в папку проекта, Atmel Studio их не увидит до тех пор, пока они не будут добавлены к проекту. Кликаем правой кнопкой мыши по имени проекта, выбираем Add -> Existing Item..., выделяем скопированные ранее файлы программы драйвера и нажимаем Add.
    После нужно кликнуть Save All или нажать комбинацию клавиш Ctrl-Shift-S чтобы сохранить проект, иначе Atmel Studio может не запомнить добавленные файлы. В результате проект должен выглядеть так:
  4. Открываем заголовочный файл lcd_graph_lib.h и находим в его начале раздел с установками:
    • "частота тактирования мк" - нужно определить тактовую частоту микроконтроллера. В случае модуля Freeduino2009 она соответствует указанному значению, поэтому ничего менять не нужно.
    • "порт к которому подключены управляющие сигналы" - если соединительный шлейф был изготовлен по схеме выше, то порт совпадает и ничего менять не нужно.
    • "порт к которому подключена шина данных" - в нашем случае шина данных будет подключена к порту D, поэтому нужно внести соответствующие изменения.
    • "выводы к которым подключены управляющие сигналы жкд" - тут нужно внести некоторую ясность. Автор применил слово "выводы", которое может ввести в заблуждение начинающего, т.к. слово "вывод" прочно ассоциируется с выводом микросхемы и его номером. На самом же деле речь идет не о номере вывода, а о номере(бите) линии порта. Опять таки, если шлейф был изготовлен по схеме выше, то менять ничего не нужно.
  5. Когда все необходимые установки сделаны можно попробовать скомпилировать проект. Выбираем в главном меню Build -> Build [имя проекта]. Внизу во вкладке Output можно наблюдать ход процесса компиляции. Попытка компиляции окажется неудачной и завершится FAILED, а во вкладке Errors появится список ошибок и предупреждений.
    С чужим кодом всегда так, это нормально. Ошибки нужно пофиксить, для этого пробежимся по ним более подробно.

    Первым идет предупреждение библиотеки delay.h, которая используется для формирования задержек: #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]. У автора в файле lcd_graph_lib.h есть небольшой недочет. В разделе "Обязательные настройки" задана тактовая частота контроллера, а буквально пятью строками выше идет включение delay.h, для работы которой требуется определение F_CPU, а поскольку тактовая частота объявлена ниже, то delay.h ничего о ней не знает. Скорее всего автор допустил этот "недочет" умышленно, чтобы тот, кто будет использовать данный код не забыл задать тактовую частоту :) . Для исправления ситуации нужно вынести код объявления тактовой частоты выше включений файлов:

    После можно повторить процедуру компиляции и убедится в том, что предупреждение исчезло.

    Далее в списке идет три однотипных ошибки unknown type name 'prog_char' в разных файлах проекта. Что же это за ошибка такая? Вбиваем её в запросную дырку гугла и ищем тех, кто уже задавался аналогичным вопросом. Эта ошибка связана с устаревшим определением типа, т.е. программа написана для старого компилятора, подробнее можно прочитать здесь. Для исправления ошибки нужно использовать PROGMEM. PROGMEM — это спецификатор для типа переменной хранящейся в памяти программ.
    Для исправления ошибок дважды кликаем по тексту каждой ошибки в списке и попадаем на нужную строку в нужном файле. Исправляем ошибки:
    • в фале lcd_graph_lib.h заменаяем код
      Код: Выделить всё
      void LCDG_SendStringFl(unsigned char xPos, unsigned char yPos, prog_char *string);  //выводит строку из флэш

      на
      Код: Выделить всё
      void LCDG_SendStringFl(unsigned char xPos, unsigned char yPos, const char *string);  //выводит строку из флэш

    • в файле lcd_graph_lib.c заменяем код
      Код: Выделить всё
      //отображает на жкд строку из флэш памяти
      void LCDG_SendStringFl(unsigned char xPos, unsigned char yPos, prog_char * string)
      на
      Код: Выделить всё
      //отображает на жкд строку из флэш памяти
      void LCDG_SendStringFl(unsigned char xPos, unsigned char yPos, const char * string)

    • в файле font_6x8.h заменяем код
      Код: Выделить всё
      prog_char font_6x8_Data[] =
      на
      Код: Выделить всё
      const char PROGMEM font_6x8_Data[] =

    • в файле main.c заменяем код
      Код: Выделить всё
      prog_char text[] = "winavr test";
      на
      Код: Выделить всё
      const char text[] PROGMEM = "winavr test";
    Повторяем процедуру компиляции и убеждаемся в отсутствии ошибок и предупреждений. В выводе смотрим использование ресурсов памяти микроконтроллера:


p5Прошивка
Прошивку будем осуществлять этим способом:
viewtopic.php?f=66&t=422&p=1877#l4-6
Подключаем разъем для внутрисхемного программирования модуля и подключаем модуль к USB.
Запускаем Avrdude_prog, выбираем файл прошивки .hex (он будет в папке проекта в подпапке Debug) и нажимаем кнопку Программирование. Вместе с верификацией процесс займет некоторое время, после чего нужно убедится в отсутствии ошибок в консольном выводе Avrdude и отключить кабель программирования.


p6Первый пуск
Подключаем индикатор к отладочному модулю через заранее приготовленный шлейф и подаем питание. Если на предыдущих этапах всё было сделано верно, то дисплей включится и на нем появится вот это:


Далее можно(нужно) как следует изучить статью о подключении и использовании индикатора приведенную выше, освоить возможности библиотеки для работы с индикатором и оригинальный даташит на индикатор, чтобы понять что и как там происходит. Например, можно попробовать вывести строку из памяти программ. Меняем в коде main.c вызовы функций отображения текста и рисования на
Код: Выделить всё
LCDG_SendStringFl(0, 1, text);
, а выше в коде
Код: Выделить всё
const char text[] PROGMEM = "Мой текст";
вводим какой нибудь текст, в т.ч. на русском языке. Компилируем, прошиваем и проверяем. :wink:


Следующей задачей будет сопряжение модуля Freeduino2009 с ПК для реализации возможности обмена данными с программой, но перед этим нужно будет решить одну небольшую проблемку.
Аватара пользователя
alex83
Имя: Александр

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1