Странные проблемы с LCD (совместимость с HD44780)

Я пытался подключиться к дисплею, совместимому с HD44780 (16x2), в течение нескольких часов, но столкнулся с некоторыми странными проблемами поведения, которые я не могу решить.

Моя установка:

  • Я использую LCD в 4-битном режиме (старшие четыре бита, D4-D7, как и во всех руководствах, которые я нашел, порядок правильный - несколько раз проверял).
  • ЖК-дисплей работает от регулируемого источника питания 5 В. (Я пробовал 3,3 В, тот же результат, меньше контраста)
  • Линия R/W заземляется с помощью подтягивающего резистора (зафиксирован в режиме записи).
  • Контраст задается горшком, и я могу получить одну линию квадратов, видимую при запуске.
  • Я использую очень медленные тайминги (ожидание ~200 мс — включить высокий уровень — ~ 200 мс — изменить данные — ~ 200 мс — включить низкий уровень)

Моя последовательность инициализации:

(с низким RS)

  • 0x03 - (три раза) (отправлено как один полубайт/байт)
  • 0x02 — включить четырехбитный режим (отправляется как один полубайт/байт)
  • 0x28 — Набор функций (2 строки, 4 бита) (отправляется как два полубайта, первый полубайт ms)
  • 0x01 - Очистить (отправлено в виде двух кусочков)
  • 0x06 - Установить режим ввода (увеличение курсора при записи, без смещения дисплея) (отправляется как два полубайта)
  • 0x08 — дисплей, курсор и мерцание отключены (отправлено как два фрагмента)
  • 0x0F — дисплей, курсор и мигание (отправляется как два фрагмента)

Здесь некоторые вещи происходят не так, как ожидалось:

  • Двухстрочный режим, похоже, не включается (нет темных фоновых квадратов на второй строке, там не пишутся символы)
  • Ясно не бывает
  • Курсор находится в 3-м квадрате вместо первого в конце этой последовательности инициализации

Затем я пытаюсь написать несколько символов с высоким уровнем RS, отправляя по 2 байта на символ.

Здесь я тоже получаю странное поведение: вместо того, чтобы писать 1 символ на 2 байта, он пишет 2 (по одному на байт). Я заставил его пройти через символы 0-15, и я получаю случайные символы (например, косую черту) и японские символы. Все они взяты из случайных мест в таблице символов, в основном из нижней строки, не в каком-либо обычном порядке, но всегда печатаются одни и те же символы в одном и том же порядке.

Мой вопрос: у меня действительно закончились идеи, чтобы исправить это. Я пропустил что-то очевидное? Какие у меня могут быть проблемы и как я могу отлаживать дальше?

Изменить: это то, что я вижу на своем экране после инициализации, это может быть полезноЖК-дисплей после инициализации

Редактировать 2:

Мой основной код:

GPIOPin lcdEnablePin = PIN_B(11);
GPIOPin lcdRSPin = PIN_B(10);
GPIOPin lcdDataPins[] = {PIN_E(2), PIN_E(3), PIN_E(4), PIN_E(5)};

//Set all pins as outputs
GPIO::pinModeDigital(lcdEnablePin, 1);
GPIO::pinModeDigital(lcdRSPin, 1);
for(int i = 0; i < 4; i++)
 GPIO::pinModeDigital(lcdDataPins[i], 1);

GPIO::writePinDigital(lcdRSPin, 0); //Instruction register
lcdSendData4(lcdEnablePin, lcdDataPins, 2); //Enable 4 bit
lcdSendData8(lcdEnablePin, lcdDataPins, 40); //Function set, 2 line
lcdSendData8(lcdEnablePin, lcdDataPins, 1); //Clear and return home
lcdSendData8(lcdEnablePin, lcdDataPins, 2); //Entry Mode, Increment cursor position, No display shift
lcdSendData8(lcdEnablePin, lcdDataPins, 8); //All off
lcdSendData8(lcdEnablePin, lcdDataPins, 15); //All on

GPIO::writePinDigital(lcdRSPin, 1); //Data register
for(int i = 0; i < 16; i++) //Write test data, 4 bit because that's what seemed to work
 lcdSendData4(lcdEnablePin, lcdDataPins, i);

Мои функции SendData:

void lcdSendData4(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 simpleBusy();

 //Set enable high
 GPIO::writePinDigital(lcdEnablePin, 1);

 simpleBusy();

 //Write data
 for(int i = 0; i < 4; i++)
  GPIO::writePinDigital(lcdDataPins[i], data & (1 << i));

 simpleBusy();

 //Falling edge
 GPIO::writePinDigital(lcdEnablePin, 0);
}

void lcdSendData8(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 lcdSendData4(lcdEnablePin, lcdDataPins, data >> 4); //Send MSB
 lcdSendData4(lcdEnablePin, lcdDataPins, data); //Send LSB
}
Достаточно ли долго вы ждете, прежде чем начать писать? И какое значение имеет "подтягивающий" резистор?
Вы соблюдали сроки в даташите?
Сферо: Резистор 1k
Игнасио: У меня нет таблицы данных для моего конкретного ЖК-дисплея, но задержки, которые я использую, значительно превышают максимальное время, указанное в таблице данных HD44780. Как я уже сказал в вопросе, я трачу около ~ 200 мс при включении высокого уровня, ~ 200 мс во время записи данных и ~ 200 мс после спада включения.
Вы уверены, что первые три 0x03 не включают 8-битный режим? В даташите есть некоторая неточность между страницами 42 и 46.
В этом листе данных есть красивая блок-схема на странице 14 (обозначена как 12), и в ней говорится, что требуется только 0x02 0x02 0x08.
Я также пробовал без 0x03s, и, к сожалению, это не имело значения. Я читал, что режим можно установить только один раз, но я также читал, что эта последовательность 0x03 является специальным «жестким сбросом». Также я пробовал физически отключить питание дисплея, затем снова подключить его и немного подождать, прежде чем запускать последовательность инициализации, чтобы убедиться, что первая инструкция, которую он получает, - это установленный 4-битный режим, также не помогло. Спасибо всем за ваши предложения.
Я добавил картинку, чтобы показать, что происходит после завершения инициализации. Вывод всегда именно такой.
Персонажи вовсе не случайны. Все они имеют младшие четыре бита в 1 1 1 1. Я бы сказал, что вы находитесь в 8-битном режиме, и младший полубайт воспринимается из воздуха. Попробуйте прикоснуться пальцем к пэдам D[0..3] и посмотреть, изменятся ли символы.
Наконец-то что-то заработало! Я попытался заземлить один из дополнительных контактов данных, и все символы изменились. :) Что интересно, порядок не совсем такой, как в карте персонажей. Итак, теперь вопрос в том, как мне убедиться, что я попаду в 4-битный режим?
Возможно, вы могли бы добавить свой исходный код, возможно, что-то не так с синхронизацией данных и форматированием
Я добавил источник. Также, глядя на эту страницу, я попытался добавить раскрывающееся меню 10 КБ, чтобы предотвратить его случайное срабатывание, не помогло. Завтра попробую перепаять все соединения, на всякий случай.
Чувак, я не могу найти слов, чтобы описать, как глупо я себя сейчас чувствую. Я еще раз посмотрел на свои соединения и заметил, что D6 и D5 были переставлены местами при переходе от моей макетной платы к ЖК-дисплею. Теперь все работает хорошо. Спасибо всем за предложения, извините за путаницу. Венни - вы должны добавить свое распознавание символов, имеющих один и тот же верхний бит, в качестве ответа, который я могу принять.

Ответы (4)

На некоторых моделях вам необходимо отправить команды начальной настройки несколько раз. Кроме того, некоторые модели, которые у меня есть, потребляют энергию агрессивно, импульсно, поэтому у меня есть большой конденсатор рядом с источником питания (+ -) ЖК-дисплея, чтобы избежать шума шины питания.

Вы до сих пор не упомянули линию E.

E должен быть низким, затем представить данные, установить E высоким, затем низким и т. д.

Добро пожаловать на форум! И да, он сделал. Он находится на пятой пуле (11-я строка).
Да, как упоминалось в вопросе, это то, что я делаю, с задержкой 200 мс между каждым шагом.

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

Добро пожаловать в EE.SE. Мы являемся своего рода сайтом вопросов и ответов, а не форумом. Вы опубликовали ответ, который лучше подходит в качестве комментария к вопросу. В будущем, пожалуйста, помните, что ответы предназначены для более крупной и активной помощи.
@Funkyguy IIRC StackExchange не позволяет пользователям с менее чем 15 баллами комментировать, только отвечать. chamod, вероятно, сделал все, что сайт позволял ему в то время. (это было не так давно в моем случае :)

Однажды я получил дисплей с похожим поведением. Мне нужно было установить его в 8-битный режим три раза и еще раз установить его в 4-битный режим, чтобы перевести его «действительно» в 4-битный режим. Это был единственный способ заставить его работать в 4-битном режиме. Может быть, это поможет.

Когда дисплей находится в 4-битном режиме, единственное, что отличает верхнюю и нижнюю половину каждой транзакции, — это четное или нечетное количество транзакций с момента переключения дисплея в 4-битный режим. Переключение на 8 бит, а затем обратно позволяет программному обеспечению и дисплею синхронизироваться друг с другом.