Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не запускается индикатор
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Flasher
в устройствах стоял WH1602D-YGH-CTK. Вот в новой партии решил вые.... и поставил синенькие WH1602C-TMI-CT. Все девайсы перестали показывать. Пишут какую- то муйню, причем видно что вторая строка на нем даже не инициализируется. Параллельно подпаяный старый индикатор работает.подключение 4 -битное, через 74hc164.без бизи флага.Тайминги уже чуть-ли не часовые...
Перебробовал несколько инициализаций- но бестолку. По идее они отличаются только перевернутыми ногами питания. Что посоветуете? или может кинете инициализацией?
МП41
А не могут ли отличаться полярности управляющих сигналов? Я вроде в протеусе сталкивался с такими граблями.
IgorKossak
МП41, контроллер у них один и тот же - KS0066, управление должно быть одинаковым.
Судя по описанию неполадки (с учётом правильности инициализации и таймингов), не проходит самое начало инициализации. Такое бывает если оборвана какая-то из линий в самом индикаторе.
По умолчанию он настроен на восьмибитный интерфейс. Можно попробовать в таком режиме вывести в него текст с целью проверки целостности линий.
МП41
В моем случае контроллер был один и тот же, а одна из линий - в инверсии. Чтобы не переделывать программу я вставлял просто инвертор в схему (ведь это моделирование, в реальности проще было бы подправить программу).

Эти ЖКИ (старый и новые) внешне хоть одинаковые по компоновке, распиновке и т.д.? - Ой, уже вижу, что буквы разные, C и D.
Flasher
Цитата(IgorKossak @ Oct 29 2009, 15:15) *
МП41, контроллер у них один и тот же - KS0066, управление должно быть одинаковым.
Судя по описанию неполадки (с учётом правильности инициализации и таймингов), не проходит самое начало инициализации. Такое бывает если оборвана какая-то из линий в самом индикаторе.
По умолчанию он настроен на восьмибитный интерфейс. Можно попробовать в таком режиме вывести в него текст с целью проверки целостности линий.


линии не могут быть оборваны, так как молчит весь десяток девайсов. DB0-DB3 уже пробовал сажать на землю. Сигналы управления 0, 3В и 5,1 В. Фронты крутые. R/W жестко на земле. распиновка у этих типов индикаторов одинаковая, только 1,2 нога-питание перевернуты. Играясь инициализациями как-то добился свечения 2 строк, но ничего не выводилось. Параллельно еще подцепил третьим-CCM1620- так эта зараза все инициализации проглатывает. Если пропустить процедуру инициализации- то на всех трех индикаторах - одинаковые кракозябры.Вывод- она по какой-то причине не проходит.
Александр Куличок
А как Вы осуществляете инициализацию?
Вот что пишут для контроллера HD44780.
Цитата
If the power supply conditions for correctly operating the internal reset circuit are not met, initialization by instructions becomes necessary.

Т.е. если в индикаторе не реализована схема сброса, то применяются следующие шаги по инициализации.
И далее инструкция по запуску в 4х-битном режиме (HD44780U стр. 46 рисунок 24, ссылка ниже):

1. Ждать >15 мс после подъема питания до 4,5В (или >40 мс при 3,3В)
2. Подаем команду перехода в 8-битный режим (RS=0, D = 0011xxxx). Флаг BF не проверять
3. Ждем >4.1 мс
4. Команда перехода в 8-битный режим (RS=0, D[7:0] = 0011xxxx) Флаг BF не проверять
5. Ждем >100 мкс
6. Команда перехода в 8-битный режим (RS=0, D[7:0] = 0011xxxx) Флаг BF не проверять
7. Дождаться завершения предыдущей инструкции ( для Fosc = 270 кГц t > 37 мкс)
8. Команда перехода в 4-битный режим (RS=0, D[7:0] = 0010xxxx) После этой инструкции можно уже проверять BF.
9. Команда перехода в 4-битный режим+размер индикатора (RS=0, D[7:4] = 0010, D[7:4] = NF** )
10 Display off [0000]:[1000]
11 Display clear [0000]:[0001]
12 Entry mode set [0000]:[01,I/D,S]

Обратить внимание, что пункты 2,4,6,8 выполняются в 8-битном режиме. Т.е. по одному стробу сигнала Е на 1 байт(вернее, 4 бита) данных
Начиная с п. 9 (включительно) команды подавать в 4-битном режиме (2строба х 4бита).
При выполнении п. 8-12 придерживаться таймингов.
Да, и самое главное. Не забыть включить индикатор (Display On = [0000]:[11CB])
XsanyaX
Александр Куличок +1.

Когда я начинал работать с ЖКИ - написал код инициализации, но не особо внимательно читая даташит... Этот код работал на нескольких моделяж ЖКИ. Но на очередном ЖКИ случилась трабла. Дисплей ничего не показывал и вешал прогу. Jtag-гом определил зависание на первом же опросе BUSY флага. Сразу переделал инициализацию, как рекомендовано в даташите... Вот уже несколько лет этот код кочует по разным девайсам с ЖКИ (HD44780 или аналогом) от разных производителей - проблем пока нету.
Flasher
delay_ms(255);
LCD_com(0x03); // 8 бит
delay_ms(10);
LCD_com(0x03); // 8 бит
delay_ms(10);
LCD_com(0x03); // 8 бит
delay_ms(10);
LCD_com(0x02); // переходим на 4 бита

LCD_com(0x02); // 4 бита, 2 строки, 5*8
LCD_com(0x08);



LCD_com(0x00); // дисплей выключить
LCD_com(0x08);


LCD_com(0x00); // очистка экрана
LCD_com(0x01);
delay_ms(10);

LCD_com(0x00); //Сдвиг вправо
LCD_com(0x06);
delay_ms(2);

LCD_com(0x00); // дисплей включить, курсор и мигание выключить
LCD_com(0x0C);
delay_ms(2);

Полностью совпадает hd44780u, но не работает. Другой дисплей, подпаянный параллельно но с буквой D все отображает. Дисплеи менял- есть несколько штук на разъемах. При таком варианте работают 2 строки. Но рисует кракозябли.
Flasher
Господа, спасибо за помощь. Вопрос решился. В процедуре вывода по интерфейсу я все время держу E=1 и роняю его в нолик только когда вся информация на DB4-DB7 выставлена. Просто добавил его импульсом после вывода информации на пару микросекунд- и все заплясало. Хотя явное отклонение от даташита. Что-то начинает закрадываться сомнение по поводу фиксации информации по перепаду E из 1 в 0. Может прав был товарищ МП41 ?
rezident
Цитата(Flasher @ Oct 30 2009, 03:26) *
Просто добавил его импульсом после вывода информации на пару микросекунд- и все заплясало.
А времянки в даташите, для чего приведены? См. Figure 6 . Write Mode Timing Diagram и таблицу перед ним. До кучи даташит еще одной разновидности клона HD44780U.
Flasher
при чем здесь времянки? Я же написал, что передний фронт у меня до выставления данных, а задний фронт, когда нужно защелкивать. Всё по даташиту. Причем по всем даташитам, которые я перечитал. Я всего лишь передний фронт переместил после процедуры установки данных, из чего можно предположить, что защелкивается по переднему фронту.
IgorKossak
Flasher, опубликуйте функцию LCD_com(), оба варианта.
Flasher
Работающий вариант (74HC164)
void LCD_com(unsigned char byte)
{
LCD_tetrada(byte&0x0F); // R/S=0
delay_us(50);
}

void LCD_tetrada(unsigned char tetrada)
{
unsigned char temp;
tetrada=tetrada<<3;
for(temp=5;temp>0;temp--)
{
CLK=0;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
if(tetrada&0x80)DATA=1; else DATA=0;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
tetrada=tetrada<<1;
CLK=1;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
}
LOAD=1;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
LOAD=0; // Задний фронт, по которому должна идти загрузка
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
DATA=1;
}

Не работающий вариант:
void LCD_tetrada(unsigned char tetrada)
{
unsigned char temp;
LOAD=1;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
tetrada=tetrada<<3;
for(temp=5;temp>0;temp--)
{
CLK=0;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
if(tetrada&0x80)DATA=1; else DATA=0;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
tetrada=tetrada<<1;
CLK=1;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
}
LOAD=0;
#asm ("nop");
#asm ("nop");
#asm ("nop");
#asm ("nop");
DATA=1;
}
rx3apf
Цитата(Flasher @ Oct 30 2009, 11:24) *
при чем здесь времянки? Я же написал, что передний фронт у меня до выставления данных, а задний фронт, когда нужно защелкивать. Всё по даташиту.

А не в том ли дело, что сигнал R/S защелкивается по _переднему_ фронту ?
Flasher
только что проверил про RS- 6 типов дисплеев - им все равно. Этот на защелкивание RS по переднему фронту не реагирует.
rx3apf
Цитата(Flasher @ Oct 30 2009, 13:45) *
только что проверил про RS- 6 типов дисплеев - им все равно.

И все ж, если "E" держать постоянно в "0" (а не в "1"), и стробировать уже после установки R/S - работает ?
Цитата
Этот на защелкивание RS по переднему фронту не реагирует.

Это так это ? Он не может ведь игнорировать состояние R/S, принципиально. А по диаграммам состояние R/S фиксируется по переднему фронту E, данных - по заднему.
Flasher
я перенес стробирование по переднему фронту E сразу же после установки RS. E и так все время в нуле. Индикатор не реагирует
IgorKossak
Flasher, Вы писали, что пытались увеличивать некоторые временные задержки. Это утверждение касается и приведённых Вами функций void LCD_tetrada(unsigned char tetrada)?
Дело в том, что работающий вариант от неработающего отличается четырьмя дополнительными нопами между CLK=1; и LOAD=0;.
Это время соответствует параметру Data Setup Time и для некоторых экземпляров может несколько превышать заявленную в документации величину.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.