реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Инициализация LCD, Возможно ли повторно инициализировать LCD в работающей программе?
IF_P
сообщение Feb 12 2008, 20:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Контроллер на 51 процессоре. Использую LCD Bolymin BC-2004 или аналог МТС-S20400. Иногда происходит сбой LCD ("абракодабра").Восстановление информации только после Reset CPU. Пробовал в программе ввести повторную инициализацию LCD. Получил две черных строчки на экране. Если при старте программы два раза подряд вызвать программу Lcdinit получается аналогичная ситуация. Кто что может посоветовать?
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 12 2008, 20:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для реинициализации символьных LCD при зависаниях и сбоях лучше сразу предусмотреть ключ в питании LCD. Потому, что "защелкивание" только снятием/подачей питания "лечится".
Реинициализировать же чисто программно тоже можно. По крайней мере можно попробовать wink.gif
Процедуру реинициализации нужно начинать с программирования ширины шины данных. Трижды передать код 0x30, а на четвертый раз 0x38 для 8-ми битной шины или 0x28 для 4-битной шины (младший нибл я указал 8 для случая, если используется двух-/четырех-строчный дисплей и фонт 5*8) . Причем в случае использования 4-х битного подключения код 0x30 передавать не ниблами (0x3, 0x0, 0x3, 0x0, 0x3, 0x0) как ожидалось бы, а как для 8-ми битного режима. (0x3, 0x3, 0x3). Передавать код инициализации нужно конечно же с учетом сдвига, если используются не самые младшие пины порта МК.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 12 2008, 20:44
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(IF_P @ Feb 12 2008, 22:08) *
Кто что может посоветовать?
Выполнить правильно процедуру инициализации. Вот тут посмотрите: http://electronix.ru/forum/index.php?s=&am...st&p=143374


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 12 2008, 22:27
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(Сергей Борщ @ Feb 12 2008, 22:44) *
Выполнить правильно процедуру инициализации. Вот тут посмотрите: http://electronix.ru/forum/index.php?s=&am...st&p=143374

Программа рабочая,т.к. работает не один год. Без повторной инициализации все хорошо. Напр.

при старте программы
....
lcdinit();
....
===== все отлично=========

...
lcdinit();
lcdinit();
.....
=======два черных рядка на LCD========

Причем не квадратики наложена информация,т.е. инициализация прошла, но что-то ее сбило.

Нажимаю RESET CPU.

Снова старт программы и

...
lcdinit():
...
=========все хорошо=======

И так программа нормально работает до тех пор, пока я не пытаюсь произвести инициализацию для перестраховки от сбоев(по истечению времени или по нажатию кнопки)
Такое ощущение, что LCD запоминает что-то при инициализации, а после RESET CPU сбрасывает. Хотф не пойму как RESET CPU влияет на LCD
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 12 2008, 22:32
Сообщение #5


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата
Возможно ли повторно инициализировать LCD в работающей программе?

Не только возможно, но и ИМХО, необходимо делать это периодически. Правда при этом наблюдается легкое подмигивание, если применяется 4-х разрядная шина, но это можно объявить фичей smile.gif

У различных контроллеров ЖКИ эта процедура может слегка отличаться, в основном по временнЫм параметрам. Я на такое нарывался, когда при смене типа или производителя ЖКИ переставала нормально работать программная инициализация. Приходилось искать "улучшенный" алгоритм.
А то, что у ЖКИ модулей могут слетать настройки - так это общеизвестно.
Единственный контр.сигнал - BUSY может нормально выдаваться, а отображения на ЖКИ может не быть!
Считать настройки из модуля для проверки нельзя, поэтому приходится периодически его переинициализировать на ходу. Я это обычно делаю каждые 5-10 секунд.
Можно делать и реже, но за 5 минут, как показывает практика, ближайшие customers уже успевают добежать до телефона и позвонить со словами: "ВАШ ПРИБОР СЛОМАЛСЯ!!!"

to rezident: "защелкивания" LCD ни разу не наблюдал, так что в необходимости ключа на питание сильно сомневаюсь. Насчет того, что бывают случаи, когда модуль нельзя вывести из зависа программно - сомнительно, хотя отрицать такую возможность не буду. Но мне такие ЖКИ не попадались.

Отладку процедур инициализации я обычно провожу так - выдираю и вставляю кабель ЖКИ (или сам модуль) прямо под питанием, на ходу. Восстановление работоспособности модуля должно происходить через 5-10 сек, при вызове прогр. переинициализации. А иначе грош цена такой программе!
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 12 2008, 23:05
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(Baser @ Feb 13 2008, 00:32) *
Не только возможно, но и ИМХО, необходимо делать это периодически.


Я тоже к этому пришел.

Но получается, что lcdinit() нормально работает только один раз (вначале), а при повторном вызове сбивает настройки LCD. Что это? Плохо написана программа инициализации?
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 12 2008, 23:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Baser @ Feb 13 2008, 03:32) *
to rezident: "защелкивания" LCD ни разу не наблюдал, так что в необходимости ключа на питание сильно сомневаюсь. Насчет того, что бывают случаи, когда модуль нельзя вывести из зависа программно - сомнительно, хотя отрицать такую возможность не буду. Но мне такие ЖКИ не попадались.
Статическое электричество это довольно занимательная штука. Особенно, когда по ТУ корпус прибора, имеющий внешние металлические элементы (переднюю панель, например), нельзя соединять с общим проводом самого устройства и LCD в частности.

Цитата(IF_P @ Feb 13 2008, 04:05) *
Но получается, что lcdinit() нормально работает только один раз (вначале), а при повторном вызове сбивает настройки LCD. Что это? Плохо написана программа инициализации?
Не видя исходный текст этой "программы инициализации", можно делать абсолютно любые умозаключения. Только помогут ли они?
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 13 2008, 07:54
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(rezident @ Feb 13 2008, 01:17) *
Не видя исходный текст этой "программы инициализации", можно делать абсолютно любые умозаключения. Только помогут ли они?


Вот исходный текст программы. Режим LCD - 4 разрядный.

Цитата(IF_P @ Feb 13 2008, 09:06) *
Вот исходный текст программы. Режим LCD - 4 разрядный.


Уточнение по управляющим сигналам.
Прикрепленные файлы
Прикрепленный файл  lcdinit.txt ( 1.05 килобайт ) Кол-во скачиваний: 130
Прикрепленный файл  lcdinit.txt ( 1.13 килобайт ) Кол-во скачиваний: 111
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 13 2008, 08:04
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(IF_P @ Feb 13 2008, 09:54) *
Вот исходный текст программы. Режим LCD - 4 разрядный.
Вы спросили совета. Во втором и третьем ответах вам дали разжеванный как для ребенка ответ, что именно и в какой последовательности нужно делать в процессе инициализации. В десятом(!) сообщении вы выкладываете исходник, в котором эти рекомендации нифига не выполнены и спрашиваете "почему не работает?". Да вот потому и не работает, что инициализация у вас сделана неправильно! Помогать дальше не буду - разбирайтесь сами, информации в этой ветке вам дали достаточно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 13 2008, 09:31
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(Сергей Борщ @ Feb 13 2008, 10:04) *
Вы спросили совета. Во втором и третьем ответах вам дали разжеванный как для ребенка ответ, что именно и в какой последовательности нужно делать в процессе инициализации. В десятом(!) сообщении вы выкладываете исходник, в котором эти рекомендации нифига не выполнены и спрашиваете "почему не работает?". Да вот потому и не работает, что инициализация у вас сделана неправильно! Помогать дальше не буду - разбирайтесь сами, информации в этой ветке вам дали достаточно.


Прошу извинить, что, возможно, задал лишние вопросы. Но железо на работе, а я писал с домашнего компа. Сегодня буду разбираться.
Go to the top of the page
 
+Quote Post
aleksey_g
сообщение Feb 13 2008, 16:38
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066



А если все-таки применить ключ по питанию, то не позаботясь об шинах индикатора, его легко спалить!
ЖКИ это КМОП! Нужно помнить об тиристорном эффекте.
(Это со своего опыта. При отладке не спалил, но нагрел нехило)
Go to the top of the page
 
+Quote Post
IF_P
сообщение Feb 14 2008, 21:51
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Спасибо всем, кто откликнулся. Посмотрел по ссылке и вспомнил, что так и было вначале, а потом "исчезло". все работает.Вот только задержки после 0x30 поставил меньше (2mS), а то индикация "проваливается" при реинициализации.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 12:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016