Данная обучающая (плохому
) статья является продолжением обучающего курса по программированию микроконтроллеров AVR.
Предыдущие статьи курса:
Микроконтроллеры - это же просто!Быстрые переходыВ ходе отладки различных устройств на микроконтроллерах иногда возникает необходимость в визуализации каких-либо событий или выводе информации. Конечно всё зависит от задачи, но зажигать светодиоды, применять скучные 7-сегментные или какие другие знакосинтезирующие индикаторы в наше время как-то уныло, поэтому сразу обратимся к графическим LCD-дисплеям, позволяющим выводить не только цифры и псевдобуквы, но и любую символьную информацию, а также рисовать простую графику.
В качестве подопытного был выбран графический дисплей разрешением 122х32х0.4 точки от отечественного производителя
МЭЛТ с гордой надписью "
Сделано в России" на печатной плате, импортозамещение, ёп
.
Модель
MT-12232A-2FLA имеет напряжение питания 5В, снабжена классической янтарной подсветкой(ну не люблю я синюшные гей-подсветки), а также возможностью регулировки контрастности. К недостаткам этой модели можно отнести то, что она не имеет 4-х битного режима работы и под шину данных придется отдавать целый порт.
Однако, под рукой данной модели не оказалось, а оказалась несколько другая модель -
MT-12232C-2FLA, которая отличается от выше описанной напряжением питания 2,8В, "перепутанной" полярностью подсветки и несколько другой схемой регулировки контрастности. Да, мы легких путей не ищем.
Если у кого нормальный MT-12232
A, то можно сразу перейти
сюда.
Переделка MT-12232C в MT-12232AЧтобы подключить такой индикатор пришлось бы применить стабилизатор на 2,8В и микросхему согласования уровней, либо попробовать вариант с использованием выходов контроллера, сконфигурированных как открытый коллектор, т.е. выключить подтяжку выводов контроллера к VCC и писать не в PORT, а в DDR. Выводы же индикатора подтянуть резисторами к питанию индикатора 2,8В. При этом лог.0 будет формироваться контроллером, а лог.1 - резисторами подтяжки, но в этом случае ещё нужно проверить фронты(допустимо до 100нс).
В общем, заморачиваться со всем этим не хотелось, поэтому возник резонный вопрос: как бы переделать индикатор под питание 5В?
Немного потусив на этом замечательном
форуме и пообщавшись с тех. поддержкой МЭЛТа было выяснено, что это совсем не сложно сделать.
Всё дело в том, что "кристалы" обоих индикаторов работают в диапазоне 2.7В-5.5В и платы у них одинаковые, а разница только в запаянных/не запаянных элементах.
Таким образом, чтобы переделать MT-12232
С в MT-12232
A нужно:
- удалить с печатной платы индикатора резистор R11, а также конденсаторы С9 и С10;
- установить резистор R10=3.6 кОм;
Важное условие для успешной переделки - плата версии
MT12232A v.6. Также можно ещё перепаять перемычки подсветки для соответствия полярности в разъеме. Подсветка уже рассчитана на питание 5В, поэтому больше с ней делать ничего ненужно.
Что касается регулировки контрастности, то за нее в MT-12232
С также отвечает вывод 13, однако схема регулировки отличается от MT-12232
A. Если посмотреть даташит на MT-12232
С, то там вывод 13 будет помечен как
NC - no connect, так вот это п.здешь, всё там прекрасно регулируется. Для регулировки контрастности в широких пределах нужно подключить между этим выводом и землей многооборотный "подстроечник" сопротивлением 5-10к. Так же можно подать на вывод 13 внешнее отрицательное напряжение порядка -4В (с током до 10мА, реально меньше) и регулировать контрастность величиной этого напряжения.
Изготовление шлейфа и прочая подготовкаДля тестирования и отладки опять же применим модуль
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-12232
A, то подключать подстроечник необязательно, т.к. при питании 5В он "из коробки" будет иметь правильную контрастность. Вывод 13 в этом случае можно оставить незадействованным.
Программа драйвераТеперь, когда всё готово, можно подумать и программном коде. Сперва я, было, ломанулся написать простой тестовый код, взяв за основу программу-пример на C, которую заботливо предоставляет производитель, но потом решил всё же поискать, а нет ли уже чего готовенького, и оказалось, что есть
.
На самом деле практика искать готовый код перед тем как начать писать свой правильная, зачем тратить время и изобретать велосипед, который даже в обучающих целях не всегда оправдан, однако, это не значит, что можно слепо брать и применять чужой код. Даже если найден готовый код, то его нужно досконально изучить, а также исправить и переделать под свою задачу
.
- MT-12232A,C,D.zip
- Тестовая программа от производителя. Не для компилирования, просто как пример
- (2.31 Кб) Скачиваний: 337
Мне попалась замечательная
статья, где об этом индикаторе рассказывает человек, который уже прошел весь путь по его окучиванию и поделился опытом с остальными
Для того, чтобы лишний раз не повторятся и чтобы было понимание эту статью нужно прочесть, а после скачать архив c программой драйвера для компилятора GCC, код которой мне понравился. Ниже выложен архив проекта программы драйвера, из которого убрано всё лишнее и оставлены только необходимые файлы:
КомпиляцияДля того чтобы залить программу в контроллер её нужно скомпилировать, а перед этим внести необходимые изменения в код и осуществить его отладку.
- Первым делом открываем Atmel Studio, создаем новый проект и выбираем соответствующий микроконтроллер(в моем случае это ATmega168), после чего копируем файлы из архива за исключением main.c в папку с проектом:
- lcd_graph_lib.c - библиотека
- lcd_graph_lib.h - заголовочный файл
- bits_macros.h - макросы операций с битами
- font_6x8.h - шрифт
- Далее нужно переименовать файл проекта [имя проекта].c в файл main.c и заменить его содержимое на код соответствующего файла из архива. Кликаем правой кнопкой на имени файла, выбираем Rename и вводим новое имя.
- Не смотря на то, что ранее файлы программы были скопированы в папку проекта, Atmel Studio их не увидит до тех пор, пока они не будут добавлены к проекту. Кликаем правой кнопкой мыши по имени проекта, выбираем Add -> Existing Item..., выделяем скопированные ранее файлы программы драйвера и нажимаем Add. После нужно кликнуть Save All или нажать комбинацию клавиш Ctrl-Shift-S чтобы сохранить проект, иначе Atmel Studio может не запомнить добавленные файлы. В результате проект должен выглядеть так:
- Открываем заголовочный файл lcd_graph_lib.h и находим в его начале раздел с установками:
- "частота тактирования мк" - нужно определить тактовую частоту микроконтроллера. В случае модуля Freeduino2009 она соответствует указанному значению, поэтому ничего менять не нужно.
- "порт к которому подключены управляющие сигналы" - если соединительный шлейф был изготовлен по схеме выше, то порт совпадает и ничего менять не нужно.
- "порт к которому подключена шина данных" - в нашем случае шина данных будет подключена к порту D, поэтому нужно внести соответствующие изменения.
- "выводы к которым подключены управляющие сигналы жкд" - тут нужно внести некоторую ясность. Автор применил слово "выводы", которое может ввести в заблуждение начинающего, т.к. слово "вывод" прочно ассоциируется с выводом микросхемы и его номером. На самом же деле речь идет не о номере вывода, а о номере(бите) линии порта. Опять таки, если шлейф был изготовлен по схеме выше, то менять ничего не нужно.
- Когда все необходимые установки сделаны можно попробовать скомпилировать проект. Выбираем в главном меню 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";
Повторяем процедуру компиляции и убеждаемся в отсутствии ошибок и предупреждений. В выводе смотрим использование ресурсов памяти микроконтроллера:
ПрошивкаПрошивку будем осуществлять этим способом:
viewtopic.php?f=66&t=422&p=1877#l4-6Подключаем разъем для внутрисхемного программирования модуля и подключаем модуль к USB.
Запускаем
Avrdude_prog, выбираем файл прошивки
.hex (он будет в папке проекта в подпапке
Debug) и нажимаем кнопку
Программирование. Вместе с верификацией процесс займет некоторое время, после чего нужно убедится в отсутствии ошибок в консольном выводе Avrdude и отключить кабель программирования.
Первый пускПодключаем индикатор к отладочному модулю через заранее приготовленный шлейф и подаем питание. Если на предыдущих этапах всё было сделано верно, то дисплей включится и на нем появится вот это:
Далее можно(нужно) как следует изучить статью о подключении и использовании индикатора приведенную выше, освоить возможности библиотеки для работы с индикатором и оригинальный даташит на индикатор, чтобы понять что и как там происходит. Например, можно попробовать вывести строку из памяти программ. Меняем в коде
main.c вызовы функций отображения текста и рисования на
- Код: Выделить всё
LCDG_SendStringFl(0, 1, text);
, а выше в коде
- Код: Выделить всё
const char text[] PROGMEM = "Мой текст";
вводим какой нибудь текст, в т.ч. на русском языке. Компилируем, прошиваем и проверяем.
Следующей задачей будет сопряжение модуля Freeduino2009 с ПК для реализации возможности обмена данными с программой, но перед этим нужно будет решить одну
небольшую проблемку.