Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63

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

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

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

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

Имею в девайсе экранчик 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
Лучшие ответы (1)
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 в четырехбитном режиме. Получилось вывести...

77
Эксперт .NET
 Аватар для Rius
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 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
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 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
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 14
11.04.2017, 16:08
А что не так?
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 16:09  [ТС]
Ну, младшие 4 разряда шины сидят на нуле. Мне всё равно нужно сначала в 4-х битный режим перевести.
0
Эксперт .NET
 Аватар для Rius
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 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
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 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
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 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
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 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
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 14
11.04.2017, 17:39
Цитата Сообщение от Romeo13D Посмотреть сообщение
Поясните.
Вы отказались от функции, которая помогает избежать:
  • багов в виде отправки команд когда не следует;
  • подбора задержек, которые надо либо брать с запасом (тогда всё будет относительно тормозить), либо иногда глючить.
0
0 / -1 / 0
Регистрация: 03.04.2017
Сообщений: 63
11.04.2017, 17:42  [ТС]
Rius, вы говорите об удобстве, но никак не о багах. Как я уже писал выше, пробовал ставить задержки заведомо на порядки выше требуемых.
0
Эксперт .NET
 Аватар для Rius
12351 / 7336 / 1625
Регистрация: 25.05.2015
Сообщений: 22,193
Записей в блоге: 14
11.04.2017, 18:01
Цитата Сообщение от Romeo13D Посмотреть сообщение
То, что дисплей после сброса работает четко, наталкивает на мысль
...что дисплей был неконтролируемо проинициализирован помехами. Возможно все возможные регистры из даташита надо переустановить на значения по умолчанию, если команды программного сброса нет.

И тут советы посмотрите ещё: Графический и текстовый режим дисплеев Winstar.
0
Модератор
Эксперт по электронике
8963 / 6729 / 921
Регистрация: 14.02.2011
Сообщений: 23,760
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
Ответ Создать тему
Новые блоги и статьи
с++ Что нового?
russiannick 06.06.2025
Продолжаю обзор dev-cpp5. 11. Посмотрев на проекты, предоставленные нам для обучения, становится видно, что они разные по содержащимся файлам где: . dev обязательно присутствует . cpp/ . c один из них. . .
WebAssembly в Kubernetes
Mr. Docker 06.06.2025
WebAssembly изначально разрабатывался как бинарный формат инструкций для виртуальной машины, обеспечивающий высокую производительность в браузерах. Но потенциал технологии оказался гораздо шире - она. . .
Как создать первый микросервис на C# с ASP.NET Core, step by step
stackOverflow 06.06.2025
Если говорить простыми словами, микросервисная архитектура — это подход к разработке, при котором приложение строится как набор небольших, слабо связанных сервисов, каждый из которых отвечает за. . .
Рисование коллайдеров Box2D v2 на Three.js с помощью порта @box2d/core
8Observer8 06.06.2025
Используется порт Box2D v2 под названием @box2d/ core - пакет NPM. Загрузил документацию Box2D v2 на Netlify: https:/ / box2d-v2-docs. netlify. app/ Документацию Box2D v2 можно скачать с официального. . .
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »