8(495) 662-59-14

Главная / Форум
  • РУС / ENG
(495) 662-59-14 Многоканальный телефон Не дозвонились?
Форумы >>ЖК индикаторы >>RE: MT-16S2D-2YLG v.7 - расхождения с даташитом!
RE: MT-16S2D-2YLG v.7 - расхождения с даташитом!

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Здравствуйте!

У меня есть индикатор MT-16S2D-2YLG v.7, с отличающимся от даташита поведением в четырёхбитном режиме.

1. Для выполнения очистки индикатора нужно 2мс, а не 1,5мс, иначе индикатор хоть и проинициализируется, но ничего показывать не будет.

2. Для выбора 1-й страницы знакогенератора с кодировкой win-1251 в четырёхбитном режиме нужна последовательность команд 0х3, 0х3, 0х3, 0х2, 0х2А, а не 0х3, 0х3, 0х3, 0х2, 0х28, подача команды 0х2А после инициализации страницу знакогенератора не переключает.

3. Оказывается, данные вполне нормально защёлкиваются импульсом Е длительностью 0,11мкс при длительности цикла в 0,7мкс. Увеличение длительностей импульса Е до 0,5мкс и цикла до 3мкс на поведение индикатора не влияет.

Индикатор MT-16S2D-2YLG v.7 работает совместно с платой MSTN-M100.

Ранее у меня был индикатор MT-16S2D-2Y v.7, он работал точно по даташиту. но его работоспособность при укороченных времянках я не проверял. Увы, проверить старый индикатор на моей программе не могу, к сожалению, я его сжёг...

Вот мой код

Код:

#define MT_A0 D8
#define MT_E D9
#define MT_DB4 D10
#define MT_DB5 D11
#define MT_DB6 D12
#define MT_DB7 D13

byte mt16; //записываемый в ЖК индикатор байт
byte sym; //счётчик символов
const byte text [32] {0xC6, 0xCA, 0xC8, 0x20, 0xCC, 0xDD, 0xCB, 0xD2, 0x20, 0x4D, 0x54, 0x31, 0x36, 0x53, 0x32, 0x44, 0xCF, 0xEB, 0xE0, 0xF2, 0xEA, 0xE0, 0x20, 0x4D, 0x53, 0x54, 0x4E, 0x2D, 0x4D, 0x31, 0x30, 0x30};

void mt16_s(byte mt16)
{
GPIO_SET(MT_DB4, mt16&16); //вывод старшего полубайта
GPIO_SET(MT_DB5, mt16&32);
GPIO_SET(MT_DB6, mt16&64);
GPIO_SET(MT_DB7, mt16&128);
GPIO_SET(MT_E, 1);
GPIO_SET(MT_E, 0);
GPIO_SET(MT_DB4, mt16&1); //вывод младшего полубайта
GPIO_SET(MT_DB5, mt16&2);
GPIO_SET(MT_DB6, mt16&4);
GPIO_SET(MT_DB7, mt16&8);
GPIO_SET(MT_E, 1);
GPIO_SET(MT_E, 0);
}

void mt16_d(byte mt16)
{
GPIO_SET(MT_A0, 1); //режим записи данных
mt16_s(mt16);
GPIO_SET(MT_A0, 0);
delayMicroseconds (40); //ожидание 40 мкс по даташиту
}

void mt16_k(byte mt16)
{
GPIO_SET(MT_A0, 0); //режим записи команд
mt16_s(mt16);
delayMicroseconds (40); //ожидание 40 мкс по даташиту
}

void lcd ()
{
mt16_k(0x80); //вывод верхней строки
for (sym=0; sym<=15; sym++)
{
mt16_d(text[sym]);
}
mt16_k(0xC0); //вывод нижней строки
for (sym=16; sym<=31; sym++)
{
mt16_d(text[sym]);
}
sym=0;
}

int main()
{
mt16=0x00; //сброс переменных
sym=0x00;
GPIO_ChangeDirection_Output(MT_E); //установка режима работы выводов
GPIO_ChangeDirection_Output(MT_A0);
GPIO_ChangeDirection_Output(MT_DB4);
GPIO_ChangeDirection_Output(MT_DB5);
GPIO_ChangeDirection_Output(MT_DB6);
GPIO_ChangeDirection_Output(MT_DB7);
GPIO_SET(MT_E, 0); //сброс выходов
GPIO_SET(MT_A0, 0);
GPIO_SET(MT_DB4, 0);
GPIO_SET(MT_DB5, 0);
GPIO_SET(MT_DB6, 0);
GPIO_SET(MT_DB7, 0);
delayMicroseconds (20000); //ожидание 20 мс по даташиту
GPIO_SET(MT_DB4, 1); //инициализация ЖК индикатора
GPIO_SET(MT_DB5, 1);
GPIO_SET(MT_E, 1);
GPIO_SET(MT_E, 0);
delayMicroseconds (40); //ожидание 40 мкс по даташиту
GPIO_SET(MT_E, 1);
GPIO_SET(MT_E, 0);
delayMicroseconds (40); //ожидание 40 мкс по даташиту
GPIO_SET(MT_E, 1);
GPIO_SET(MT_E, 0);
delayMicroseconds (40); //ожидание 40 мкс по даташиту
GPIO_SET(MT_DB4, 0); //установка четырёхбитного режима
GPIO_SET(MT_E, 1);
GPIO_SET(MT_E, 0);
delayMicroseconds (40); //ожидание 40 мкс по даташиту
mt16_k (0x2A); //установка разрядности
mt16_k (0x08); //выключение ЖК индикатора
mt16_k (0x01); //очистка ЖК индикатора
delayMicroseconds (2000); //ожидание 2!!! мс для очистки ЖК индикатора
mt16_k (0x06); //установка направления сдвига
//mt16_k (0x2A); //установка 1-й страницы знакогенератора
mt16_k (0x0C); //включение индикатора
while(1) //основной цикл программы
{
lcd (); //процедура вывода строк на ЖК индикатор
}
return EXIT_SUCCESS;
}


Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1276
Регистрация: 25.11.2009

Электромонтёр писал(а):
Ранее у меня был индикатор MT-16S2D-2Y v.7, он работал точно по даташиту. но его работоспособность при укороченных времянках я не проверял. Увы, проверить старый индикатор на моей программе не могу, к сожалению, я его сжёг...
Простите, но индикаторы MT-16S2D-2Y и MT-16S2D-2YLG электрически совершенно одинаковые, единственное различие - в наличии подсветки (и возможно параметрах ЖК стекла, на работу кристалла не влияющих). Потому они не могут работать кардинально по разному, как Вы утверждаете.

1. Время выполнения команды 0x01 в родной документации Ангстрема An6866.pdf указано именно 1.5мс,а не 2мс, и это очевидно правда. При соблюдении некоторых условий (по температуре, напряжению питания и т.д. - влияющих на частоту внутреннего генератора). Почему у Вас не работает с 1.5мс - надо разбираться.

2. Подача команды 0x2A/0x28 переключает знакогенератор в любой момент (после первых 4-х команд инициализации), а не только в процессе инициализации (которая собственно ничем от нормальной работы и не отличается).

3. Защёлкиваться может и парой десятков нс, это ни о чём не говорит и не даёт никакой гарантии что будет работать не только у Вас на столе.

Простите, но по Вашим словам видно что Вы не совсем понимаете разницу между гарантированными условиями и реально возникающими для конкретного экземпляра индикатора во вполне конкретных внешних условиях. В документации указываются условия, при которых любой индикатор из огромной партии будет работать в любых внешних условиях (в пределах рабочего диапазона разумеется). Любой и в любых. 90% из них будут работать с существенно меньшими задержками и вообще заметно быстрее. Но 10% - не будут. А при соблюдении указанных в документации условий работать будут практически 100% индикаторов (на самом деле разница между 100% и реальностью будет лишь из-за человеческого фактора на производстве).
В этой связи недавно видел любопытный факт: обычно кристаллы SDRAM работают с временами выборки около 30нс, но при отборе из сотен тысяч можно найти кристаллы, работающие с временем 2нс - аж в 15 раз быстрее!! Но никому и в голову не придёт заявлять такое для всей партии, заявят столько, сколько будут работать все кристаллы из партии, а не пара уникальных.

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

Если есть осциллограф, то можно проверить ушла ли частота внутреннего генератора слишком сильно от номинальной (не ниже 250кГц) - это бы объяснило странность с командой 0x01 - измерив её косвенным образом как это описано в п.8.4 документа An6866.pdf:

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Петухов_Дмитрий писал(а):
Электромонтёр писал(а):
Ранее у меня был индикатор MT-16S2D-2Y v.7, он работал точно по даташиту. но его работоспособность при укороченных времянках я не проверял. Увы, проверить старый индикатор на моей программе не могу, к сожалению, я его сжёг...
Простите, но индикаторы MT-16S2D-2Y и MT-16S2D-2YLG электрически совершенно одинаковые, единственное различие - в наличии подсветки (и возможно параметрах ЖК стекла, на работу кристалла не влияющих). Потому они не могут работать кардинально по разному, как Вы утверждаете.

Я и не говорил что это разные индикаторы, вполне возможно, что мне попался экземпляр, которому требуется не меньше 2мс на очистку индикатора. Я приобрёл точно такой же индикатор на замену старому, но с подсветкой! Алгоритм я под кальку взял уже отработанный на старом индикаторе!
А вот невозможность переключения знакогенератора в любой момент командами 0х28/0х2А у меня действительно имеет место, почему-то мой индикатор устанавливает кодировку только после инициализации.
Простите, но по Вашим словам видно что Вы не совсем понимаете разницу между гарантированными условиями и реально возникающими для конкретного экземпляра индикатора во вполне конкретных внешних условиях. В документации указываются условия, при которых любой индикатор из огромной партии будет работать в любых внешних условиях (в пределах рабочего диапазона разумеется). Любой и в любых.
Я же написал, что укладывающиеся в рамки даташита времянки не влияют на поведение индикатора! 2мс на очистку индикатора и невозможность переключения кодировок после инициализации и на родных времянках! По времянкам, я всё равно буду использовать "родные" для повторяемости. Мой индикатор-то уже работает! Смена кодировки для меня не актуальна!
Я тему создал не для ругани, а чтобы описать грабли.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1276
Регистрация: 25.11.2009

А Вы верните нормальные времена и ещё раз проверьте прохождение команд 0x2A/0x28, должны они работать. Потому что при уменьшении времён индикатор может не работать совершенно произвольным образом, в частности и таким вот.
Понимаете, если команды работают при инициализации (что сразу исключает производственный брак), то они будут работать и в любое другое время, просто потому что индикатор ничего не знает про инициализацию, для него это просто набор обычнейших команд. Значит Вы как-то не так их проверяете, что-то ещё вмешивается. Сделайте для гарантии задержку по 20мс и до и после команды 0x2A/0x28, уж так у них нет причины не сработать. А ещё лучше, выдавайте их подряд обе с задержкой между ними в пару секунд - должны просто глазами увидеть как меняются изображения символов (знакогенератор).

Время выполнения команды 0x01 можно увидеть на осциллографе, выдав индикатору команду и переключив в режим чтения старшего полубайта состояния с флагом BUSY (RW переключить на 1 и поднять и удерживать E=1) - как только он сбросится, так команда выполнилась, это и можно измерить осциллографом. Ну или даже самим контроллером если есть куда выдать результат измерения.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1276
Регистрация: 25.11.2009

Измерил время BUSY=1 после команды 0x01 на попавшем под руку индикаторе MT-16S2J-2FLA (полный аналог MT-16S2D). При питании 5.0В время оказалось 1.32мс. Частота встроенного генератора при этом составила 300кГц (её видно на дальнем от GND выводе незапаянного R7, не знаю так же ли он маркирован на MT-16S2D). Для номинальной частоты генератора 270кГц время выполнения команды составит 1.47мс, т.е. в пределах документации.

Команды 0x2A/0x28 проходят, отображение Вашего текста (взял из кода выше) вполне себе меняется раз в секунду (я команды шлю раз в секунду без обращений к индикатору в паузах).

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Всё прояснилось:


Просто Вам попался экземпляр индикатора, но возможно с заниженной частотой внутреннего генератора (что объяснило бы странность с командой 0x01).


Я увеличил задержку при включении индикатора до 25мс и страницы знакогенератора стали переключаться нормально на всех времянках. Задержки для очистки индикатора хватает 1,7мс, при 1,6мс индикатор уже запускается неустойчиво. Я для надёжности оставлю старые времянки 0,5/3мкс и поставлю задержки включения/очистки 2/30мс.

Благодарю за разъяснения.

Добавлено

Измерил частоту генератора индикатора с помощью осциллографа - у меня оказалось чуть меньше 250кГц. Причина непонятного поведения индикатора выяснена, премного благодарен Вам за помощь в поисках!

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1276
Регистрация: 25.11.2009

Хм, поставьте лучше вместо 30мс ещё побольше, например 50мс (или даже 100мс, всё равно глазом это всё малозаметно). А то индикатор ведь должен сбрасываться вообще за 12мс, 20мс это уже с большим запасом, а Вам и его не хватает, значит что-то мешает индикатору нормально произвести внутренний сброс (например слишком медленное нарастание питания, из-за чего индикатор может сброситься дважды, что может у Вас и происходит), можете неожиданно получить неустойчивую работу индикатора при небольшой смене внешних условий (до смешного, окно открыли проветрить - и индикатор перестал нормально запускаться, было уже такое у людей).

Вообще, за сигнал спасибо, придётся наверное заложить запас и в эту команду, до 2мс, в остальные то мы давно заложили, а про эту то ли не подумали, то ли забыли.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Ясно, поставлю 100мс. Кстати, первоначально пробовал увеличивать задержку включения до 200мс, но пока не увеличил задержку очистки в 2мс, индикатор не желал ничего показывать.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1276
Регистрация: 25.11.2009

Ну да, ведь после команды очистки не проходила команда включения (индикатор её не воспринимал), вот и не показывалось ничего.
Почему и удобно пользоваться опросом готовности перед командами/данными, даже в 4-х битном режиме (а если забить на совместимость с импортными индикаторами, то можно даже в инициализации немного её усложнив дёрганьем вывода A0 или RW). Заодно это и уменьшит загрузку контроллера обменом с индикатором до минимума.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Нашёл программку для преобразования строки текста в массив байтовых чисел в кодировке win-1251! Спасибо Доброму Человеку!

В верхнем окне программы набираем текст, а в нижнем ряд чисел:

Присоединен файл
Скачивание файлов доступно только зарегистрированным пользователям.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Индикатор MT-16S2D-2YLG работает в десяти сантиметрах от силового транзисторного моста 310В (выпрямленное от сети), частота ШИМ - 20кГц. Через 15-20 минут работы конструкции у индикатора пропадает изображение, хотя микроконтроллер работает как ни в чём не бывало и преобразователь нормально и адекватно реагирует на входные сигналы и команды с органов управления. При перезагрузке микроконтроллера проходит процедура инициализации и изображение появляется как ни в чём не бывало. Через 15-20-25 минут символы опять пропадают.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Петухов_Дмитрий
Пользователи

Сообщений: 1276
Регистрация: 25.11.2009

Время 15-20 минут связано вероятно с внешними условиями (что-то именно тогда происходит), в самом индикаторе ничего не может выжидать столько много времени. И греться столько времени он тоже не должен.

А в течении этого времени на индикаторе никаких посторонних символов или искажений выводимых символов не появляется?

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

Вообще работа индикаторов в условиях сильных помех - это отдельная песня, там много хитростей можно придумать. Ну например: каждые полсекунды выдавать ему все команды из процедуры инициализации (c правильными битами настройки режима индикатора) кроме команды очистки, которую заменить на команду Return Home, команду Set DDRAM Address и заполнять его весь правильными данными. При нормальной работе этого видно не будет - потому что этим состояние индикатора не изменяется (за исключением позиции курсора, который вернётся на своё место за пару мс, что глазом не видно) - зато при любом сбое изображение на индикаторе восстановится максимум через полсекунды, что в общем не так уж страшно. Эту же последовательность команд можно выдавать и при любом обновлении индикатора.

А вообще говоря - нужны стандартные средства борьбы с наводками.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение

Электромонтёр
Пользователи

Сообщений: 13
Регистрация: 15.12.2015

Иногда, проскакивают помехи, в виде черточек высотой точку, а шириной с знакоместо, сам индикатор заведомо исправный. wh1602 в таких условиях периодически мусор выдаёт. Странно, что индикатор приличное время работает нормально, обычно при сильных помехах отдельные символы нет-нет, но пропадают. Будем бороться с помехами.

Имя Для добавления сообщений Вы должны зарегистрироваться или авторизоваться Цитировать Получить ссылку на сообщение
Сейчас на форуме (гостей: 9, пользователей: 0 , из них : 0 )