0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63

LCD 1602 инициализация только после Reset

11.04.2017, 15:54. Показов 15236. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Чрезвычайно удивляет ситуация, которая сложилась у меня с моим девайсом. Требуется совет.

Имею в девайсе экранчик LCD типа 1602 (какой то китайский друг), подключается по 4х битной шине.
Последовательность инициализации коротко:
Настраиваем порт;
Ждем 20 мс;
Разрядность шины = 8 бит ($3);
NOP ($0 - это для случая, если экран был инициализирован под 4-х битную разрядность: переводим обратно в 8-битный режим);
Ждем 4.1 мс;
Разрядность шины = 8 бит ($3);
Ждем 100 мкс;
Разрядность шины = 4 Бит ($2);
Ждем;
Разрядность шины = 4 Бит ($2); + размер символа ($8)
Очистка;
Ждем 5 мс;

Проблема в следующем.
При включении питания экран не инициализируется. Первая строка залита черными квадратами. Если микроконтроллер сбросить, инициализация и вывод на экран проходит в штатном режиме.

Пробовал увеличивать время первоначального ожидания (фактически делал остановку, пока не будет нажата кнопка, выжидал секунды). Пробовал садить RESET контроллера на ноль, после этого подавать питание, немного погодя отпускать RESET - та же история.

Пробовал увеличивать все задержки по максимуму (1,5 мс - строб = 1 - 1,5 мс - строб = 0 - 1,5 мс), не помогает. То, что дисплей после сброса работает четко, наталкивает на мысль, что выдержки я выбрал правильно. Не понятно, почему заводится только после ресета...

P.S. В протеусе всё ОК.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2017, 15:54
Ответы с готовыми решениями:

I2C и LCD 1602
Здравствуйте! тема избитая, но того, что мне надо не нашел сделал массив по которому буду дергать ноги uint8_t TX_Buf = {0x28,...

STM32F030F4 + 74HC595 + 1602 LCD
Приветствую! Пытаюсь осуществить передачу данных на дисплей через сдвиговый регистр, но дисплей не подает признаков жизни (видны знакоместа...

Вывод символов на дисплей LCD 1602
Добрый день! Инициализировал дисплей LCD 1602 при помощи микроконтроллера STM32f411 и CubeMX в четырехбитном режиме. Получилось вывести...

37
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 16:01
Попробуйте:
«переключение в графический режим происходило нормально, а из графического в «текстовый» — очень коряво». Тогда он вспомнил, что «когда-то, давным-давно, когда ДШ еще печатали на бумаге, в каком-то из ДШ на HD44780 я читал, что переключение режимов надо делать только при выключенном экране». И все заработало.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 16:03  [ТС]
Rius, вы имеете ввиду отправить команду LCD=OFF, инициализация, команда LCD=ON ?
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 16:04
Видимо да. Если у вас 0x08 это выключить, а 0x08 | 0x04 это включить.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 16:05  [ТС]
Rius, во время включения LCD по-умолчанию находится в 8-битном режиме. Как же мне отправлять команду 0x08 ?
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 16:08
А что не так?
LCD 1602 инициализация только после Reset
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 16:09  [ТС]
Ну, младшие 4 разряда шины сидят на нуле. Мне всё равно нужно сначала в 4-х битный режим перевести.
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 16:13
Попробуйте сначала в 4 битный, потом выключить, настроить и включить.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 16:18  [ТС]
Так вся настройка и заключается в том, чтобы перевести в 4-х битный режим :-)
Сделал по-другому, убрал всё лишнее. Теперь только перевод в 4-х битный режим.
Ждем 20 мс;
Разрядность шины = 4 бит ($2);
Разрядность шины = 4 Бит ($2); + размер символа ($8)
Включение $0c
Очистка;
Ждем 5 мс;

Добавлено через 13 секунд
Ничего не изменилось
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 16:18
Вот такое когда-то писал. Работало стабильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  BusWidth width = this->mBusWidth;
 
  this->mBusWidth = BusWidth::Bit8;
 
  this->functionSet(BusWidth::Bit8, CharGeneratorPage::First);
  this->functionSet(BusWidth::Bit8, CharGeneratorPage::First);
  this->functionSet(BusWidth::Bit8, CharGeneratorPage::First);
 
  if (width == BusWidth::Bit4) {
    this->functionSet(BusWidth::Bit4, CharGeneratorPage::First);
    this->waitWhileBusy();
 
    this->mBusWidth = BusWidth::Bit4;
 
    this->functionSet(BusWidth::Bit4, CharGeneratorPage::First);
    this->waitWhileBusy();
  }
 
  this->displayControl(false, false, false);
  this->waitWhileBusy();
 
  this->clearDisplay();
  this->waitWhileBusy();
 
  this->entryModeSet(ScrollMode::CursorRight);
  this->waitWhileBusy();
Шина походу была 8 битная.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 16:25  [ТС]
Rius, увы, пишу на ассемблере, не использую флаг Busy (RW вобще не использую), ваш синтаксис не понимаю, что где происходит, какие команды отправляются... вот если бы вы накинули задержки и команды в HEX-е, было бы замечательно

Добавлено через 1 минуту
Склоняюсь, всё-таки, к аппаратной проблеме, ибо испробовал различные последовательности инициализации, плюс те что нашел на форумах, плюс друг своей библиотекой поделился, плюс сам ранее писал для этого дисплея, не было проблем
Но всё же не пойму, где искать? Задержка после подачи питания никак не спасает.

Добавлено через 1 минуту
Смириться тоже не могу, ресет контроллера не выведен, оперирую проводочком и нулевой дорожкой...
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 16:33
А нет, была у меня именно 4 битная шина.
Задержек не использовал. Команд в HEX нет в чистом виде, их много и 3 уровня абстракции)
Ожидание в инициализации и в остальных командах выполнял так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void DisplayHD44780Common::waitWhileBusy()
{
  while (this->getBusyAndAddress()) {
  }
}
bool DisplayHD44780Common::getBusyAndAddress(uint8_t *address)
{
  this->setA0(A0Mode::Command);
  this->setRW(ModeDirection::Read);
  uint8_t data = this->readBits();
 
  if (address != nullptr) {
    *address = data & 0x7f;
  }
 
  return (data & 0x80) != 0;
}
Попробуйте с Busy. В 4 битном режиме тоже есть.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 17:08  [ТС]
Rius, Вы прислали кусок кода чтения флага Busy и адреса в CGRAM, немного не то, чего бы мне хотелось :-) команды в HEX-е я имел ввиду те, которые Вы засылаете в LCD (должны же они быть, если Вы сами писали библиотеку).

Я в своем девайсе не могу читать флаг Busy, потому что ногу R/W LCD посадил на ноль. Ибо никогда ей не пользуюсь.
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 17:17
Цитата Сообщение от Romeo13D Посмотреть сообщение
Я в своем девайсе не могу читать флаг Busy, потому что ногу R/W LCD посадил на ноль. Ибо никогда ей не пользуюсь.
Ну вот и ловите баги!

Цитата Сообщение от Romeo13D Посмотреть сообщение
команды в HEX-е я имел ввиду те, которые Вы засылаете в LCD
Да вот просто нету их. В том виде, в котором они привычно применяются повсюду в интернетах - массив магических байт.
А этот синтаксис вы говорите, что не понимаете:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Инициализация
  BusWidth width = this->mBusWidth;
 
  this->mBusWidth = BusWidth::Bit8;
 
  this->functionSet(BusWidth::Bit8, CharGeneratorPage::First);
  this->functionSet(BusWidth::Bit8, CharGeneratorPage::First);
  this->functionSet(BusWidth::Bit8, CharGeneratorPage::First);
 
  if (width == BusWidth::Bit4) {
    this->functionSet(BusWidth::Bit4, CharGeneratorPage::First);
    this->waitWhileBusy();
 
    this->mBusWidth = BusWidth::Bit4;
 
    this->functionSet(BusWidth::Bit4, CharGeneratorPage::First);
    this->waitWhileBusy();
  }
 
  this->displayControl(false, false, false);
  this->waitWhileBusy();
 
  this->clearDisplay();
  this->waitWhileBusy();
 
  this->entryModeSet(ScrollMode::CursorRight);
  this->waitWhileBusy();
 
  //
  this->functionSet(BusWidth::Bit4, CharGeneratorPage::Second);
  this->displayEnable(true);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void DisplayHD44780Common::functionSet(BusWidth width, CharGeneratorPage page)
{
  this->setA0(A0Mode::Command);
  this->setRW(ModeDirection::Write);
  uint8_t data = 0x28;
 
  switch (width) {
    case BusWidth::Bit4: {
      data |= 0x00;
      break;
    }
 
    case BusWidth::Bit8: {
      data |= 0x10;
      break;
    }
 
    default: {
      return;
    }
  }
 
  switch (page) {
    case CharGeneratorPage::First: {
      data |= 0x00;
      break;
    }
 
    case CharGeneratorPage::Second: {
      data |= 0x02;
      break;
    }
 
    default: {
      return;
    }
  }
 
  this->writeBits(data);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void DisplayHD44780Common::displayControl(bool enableDisplay, bool showCursor, bool blink)
{
  this->setA0(A0Mode::Command);
  this->setRW(ModeDirection::Write);
  uint8_t data = 0x08;
 
  if (enableDisplay) {
    data |= 0x04;
  }
 
  if (showCursor) {
    data |= 0x02;
  }
 
  if (blink) {
    data |= 0x01;
  }
 
  this->writeBits(data);
}
C++
1
2
3
4
5
6
void DisplayHD44780Common::clearDisplay()
{
  this->setA0(A0Mode::Command);
  this->setRW(ModeDirection::Write);
  this->writeBits(0x01);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void DisplayHD44780Common::entryModeSet(ScrollMode value)
{
  this->setA0(A0Mode::Command);
  this->setRW(ModeDirection::Write);
  uint8_t data = 0x04;
 
  switch (value) {
    case ScrollMode::CursorLeft: {
      data |= 0;
      break;
    }
 
    case ScrollMode::CursorRight: {
      data |= 0x02;
      break;
    }
 
    case ScrollMode::DisplayLeft: {
      data |= 0x03;
      break;
    }
 
    case ScrollMode::DisplayRight: {
      data |= 0x01;
      break;
    }
 
    default: {
      return;
    }
  }
 
  this->writeBits(data);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  enum class ModeDirection
  {
    Write,
    Read
  };
 
  enum class A0Mode
  {
    Command,
    Data
  };
 
  enum class ScrollMode
  {
    CursorLeft,
    CursorRight,
    DisplayLeft,
    DisplayRight
  };
 
  enum class CharGeneratorPage
  {
    First,
    Second
  };
 
  enum class BusWidth
  {
    Bit4,
    Bit8
  };
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 17:35  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Сообщение от Romeo13D
Я в своем девайсе не могу читать флаг Busy, потому что ногу R/W LCD посадил на ноль. Ибо никогда ей не пользуюсь.
Ну вот и ловите баги!
Поясните.

Полный код целиком обязательно прочту, спасибо.
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 17:39
Цитата Сообщение от Romeo13D Посмотреть сообщение
Поясните.
Вы отказались от функции, которая помогает избежать:
  • багов в виде отправки команд когда не следует;
  • подбора задержек, которые надо либо брать с запасом (тогда всё будет относительно тормозить), либо иногда глючить.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 17:42  [ТС]
Rius, вы говорите об удобстве, но никак не о багах. Как я уже писал выше, пробовал ставить задержки заведомо на порядки выше требуемых.
0
Эксперт .NET
 Аватар для Rius
11422 / 7303 / 1617
Регистрация: 25.05.2015
Сообщений: 22,072
Записей в блоге: 14
11.04.2017, 18:01
Цитата Сообщение от Romeo13D Посмотреть сообщение
То, что дисплей после сброса работает четко, наталкивает на мысль
...что дисплей был неконтролируемо проинициализирован помехами. Возможно все возможные регистры из даташита надо переустановить на значения по умолчанию, если команды программного сброса нет.

И тут советы посмотрите ещё: Графический и текстовый режим дисплеев Winstar.
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,752
11.04.2017, 18:08
Цитата Сообщение от Romeo13D Посмотреть сообщение
Ждем 20 мс;
Разрядность шины = 8 бит ($3);
NOP ($0 - это для случая, если экран был инициализирован под 4-х битную разрядность: переводим обратно в 8-битный режим);
Ждем 4.1 мс;
Разрядность шины = 8 бит ($3);
Ждем 100 мкс;
Разрядность шины = 4 Бит ($2);
Ждем;
Разрядность шины = 4 Бит ($2); + размер символа ($8)
Очистка;
Ждем 5 мс;
а где выключение дисплея?
я делал по вот такой схеме http://cxem.net/mc/mc134.php
на разных процессорах и с разными дисплеями никогда проблем не было

Добавлено через 3 минуты
и еще 8битный режим(3) выставляем три раза
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 18:11  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а где выключение дисплея?
Выключения, как в алгоритме по ссылке нету. Попробую завтра добавить.

Цитата Сообщение от ValeryS Посмотреть сообщение
и еще 8битный режим(3) выставляем три раза
Так тоже пробовал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2017, 18:11
Помогаю со студенческими работами здесь

как подружить stm32f4discovery + 16x2 (1602) lcd
есть такая плата stm32f4discovey и 16x2 lcd экран нужна библиотека lcd.h где для него взять драйвер те библиотеку например для CooCox...

Вывод слова на LCD 1602 в МК PIC16F628 с помощью C++
добрый вечер буду очень благодарен за помощь имеется в наличии pic 16f628,lcd 1602+ponyprog Задача состоит в том, чтобы при каждом...

Подключение LCD 1602 через I2C к STM32F4 без библиотеки Hal
Здравствуйте! Пытаюсь запустить дисплей LCD 1602(по I2C) при помощи STM32F411VET6U. На форуме целое множество примеров по поводу запуска...

LCD 1602 не работает - подсвечиваются только ячейки первой строки
Добрый день всем! Подскажите, пожалуйста, почему экран может не работать? Подключил без i2c. Подсвечиваются только ячейки первой...

Не находит адрес lcd 1602
Добрый день. У меня имеется raspberry pi 3 b+ и дисплей lcd 1602. Подключил по картинке (1 вложение) Пытаюсь на raspberry сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Полностью асинхронный счётчик на логике (сумматорах) трёх состояний и асинхронных регистрах трёх состояний. Структура "электронный Buttom Up"
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru