Страница 1 из 2

Графический ЖК дисплей на LC7981

Добавлено: Вт июл 22, 2008 08:12:39
BerZerK-ku
Есть ЖК индикатор WG160160B с контроллером LC7981. Но в процессе работы появились трудности... Если в занковом режиме выставить не 20 8-и битных символов, а меньше, то начинаются глюки. Либо искажается изображение, либо 2-3 столбца в середине сдвигаются на строчку в низ. В графическом режиме примерно тоже самое, при переходе на вторую половину экрана, в случае <20 символов при 8-битах данных или при 6-7 битах практически всегда, выводится белиберда.

Встречался кто-нибудь с подобной проблемой? как ее можно решить?

Добавлено: Чт июл 24, 2008 07:30:10
BerZerK-ku
Странный индикатор какой-то. Ему плевать на установку кол-ва занков по горизонтали. Если это >10 , то задействован весь экран, если <10 то вся левая половина. Такое ощущение что он может нормально работать только в 2 режимах, 8 бит * 20 знаков или 8 бит*10 знаков.

Добавлено: Сб июл 26, 2008 23:07:31
Mozart
вообще я работал с ЖК но не с таким. в доку не вникал но вопрос
1. надо устанавливать курсор начало вывода знака? (просто может для каждой строчки надо устанавливать принудительно)
2. потом когда выводите что-то надо указывать границы знака? (я имею ввиду активную область в которой будете рисовать знак или ещё что-то)
3. одна строчка выводится не смещается?

Добавлено: Пн июл 28, 2008 08:57:02
BerZerK-ku
Mozart писал(а):вообще я работал с ЖК но не с таким. в доку не вникал но вопрос
1. надо устанавливать курсор начало вывода знака? (просто может для каждой строчки надо устанавливать принудительно)
2. потом когда выводите что-то надо указывать границы знака? (я имею ввиду активную область в которой будете рисовать знак или ещё что-то)
3. одна строчка выводится не смещается?
1. В графическом режиме перед выводом каждого байта на дисплей в программе выстанавливал курсор. В знаковом просто писал данные, в LC7981 идет автоинкремент индекса.
2. Границы задаются при инициализации.
3. Смещается.

У данного ЖК (или точнее у его контроллера LC7981), есть следующие настройки для графического режима: кол-во значащих бит в байте Hp, кол-во знаков по горизонтали Hn. Т.е. по идее общее кол-во используемых точек в строке: Hn*Hp.
В моем случае, если 80<Hn*Hp<160 , то информация выводится на весь экран, т.е. 160 точек. При этом часть информации выводится со сдвигом по горизонтали, а часть еще и сдвигается на строку по вертикали. Если же 0<Hn*Hp<80, то все то же самое, но только на левой половине экрана.
Мои выводы:
данный ЖК просто не поддерживает всех возможностей своего контроллера и работает только при режиме 80 или 160 точек в строке.

Кстати, в знаковом режиме при настройке использования неполной строки наблюдались те-же искажения.

Добавлено: Пн июл 28, 2008 09:28:28
Mozart
попробуйте по одному символу выводить, мможет быть надо принудительно задавать положение курсора.

ширина знака какая? и какая ширина экрана?

а ещё вопрос строка смещается вниз я правильно понял?

Добавлено: Пн июл 28, 2008 14:20:43
BerZerK-ku
Mozart писал(а):попробуйте по одному символу выводить, мможет быть надо принудительно задавать положение курсора.

ширина знака какая? и какая ширина экрана?

а ещё вопрос строка смещается вниз я правильно понял?
По описанию на микросхему ширина знака может быть: 6-8 точек. У меня нормально ЖК запустился только при 8.
В том то и дело что не вся строка смещается вниз, а около 20-30 точек в середине экрана. Этот эффект проявляется с 1-ой строки.
Дисплей 160 на 160 точек.

Пример 1.
Экран в знаковом режиме, 8 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в любую позицию, все в норме.
Пример 2.
Экран в знаковом режиме, 7 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в 19 позицию первой строки. На экране появляются ДВЕ восьмерки. Первая на '21' позиции, примерно там где отобразилась бы в случае 8-и битного знака. Вторая на ~14 позиции, и смещена на 1 строку вниз ( см. рисунок). Откуда это взялось то?!

Добавлено: Пн июл 28, 2008 14:56:07
Mozart
Откуда это взялось то?!
исходник в студию!!!...

первое мог накосячить с выводом, второе посмотри errata на проц, может там что-то пишут, третье два символа рядом что ли не выводятся??

попробуй принудительно указать адрес с которого будет выводиться символ.

Добавлено: Вт июл 29, 2008 06:49:06
BerZerK-ku
Mozart писал(а):
Откуда это взялось то?!
исходник в студию!!!...

первое мог накосячить с выводом, второе посмотри errata на проц, может там что-то пишут, третье два символа рядом что ли не выводятся??

попробуй принудительно указать адрес с которого будет выводиться символ.
Исходник кинул. Упростил до минимума: настройка портов, инициализация ЖК, вывод 1 символа. Проблема не исчезла.

Символы дублируются на экране, со смещением по вертикали.

Ошибся с выводом? Дак дело в том что при 8-и битном режиме все норм, меняю в настройках режима ЖК ширину знака (dNumPoint) и начинаются проблемы.

Errata на LC7981 не встречал.
На сайте производителя ЖК есть только pdf на контроллер, никаких дополнительный сведений.

Добавлено: Вт июл 29, 2008 09:35:03
Mozart
если не секрет какой компилятор пользуете??
это для удобства...

Код: Выделить всё

#define dWriteRegCom(byte) ({
	PORTC = 0x08;		\
	_NOP();			\
	PORTC |= 0x02;	\
	_NOP();			\
	DDRD=0xFF;		\
	PORTD=byte;		\
	_NOP();			\
	_NOP();			\	
	_NOP();			\
	_NOP();			\
	PORTC&=0xFD;	\
	_NOP();			\
	PORTC=0x04;		\
	DDRD=0x00;		\
	PORTD=0x00;		\
})
и ещё перепишите функцию ReadBusy

Код: Выделить всё

void ReadBusy(void) 
{ 
   unsigned char busy = 0x00; 
   while (busy) 
   { 
      PORTC=0x09; 
      _NOP(); 
      SetBit(PORTC,E); 
      _NOP(); 
      _NOP(); 
      //tt=PIND>>7; 
	  busy = PIND & 0x80;
      // if (PIND & (1 << 7)) 
      // { 
         // busy = 0x00; 
      // } 
      PORTC=0x04; 
   } 
}
и следовательно если вы её будете вызывать без While!!!

Добавлено: Вт июл 29, 2008 09:40:40
Mozart
ИМХО когда передаёте символы в дисплей прерывания лучше запрещать...

Добавлено: Вт июл 29, 2008 09:46:45
BerZerK-ku
Mozart писал(а):если не секрет какой компилятор пользуете??
[
IAR. Когда еще только начинал с МК знакомиться, мой "учитель" порекомендовал писать в IAR, а отлаживать в AVR Studio. Псоледним пользуюсь не часто, стараюсь отлаживать сразу в железе.

За советы спасибо.

Хм... на счет прерываний верно.

Добавлено: Вт июл 29, 2008 09:56:34
BerZerK-ku
Mozart писал(а):

Код: Выделить всё

void ReadBusy(void) 
{ 
   unsigned char busy = 0x00; 
   while (busy)  
   { 
      PORTC=0x09; 
      _NOP(); 
      SetBit(PORTC,E); 
      _NOP(); 
      _NOP(); 
      //tt=PIND>>7; 
	  busy = PIND & 0x80;
      // if (PIND & (1 << 7)) 
      // { 
         // busy = 0x00; 
      // } 
      PORTC=0x04; 
   } 
}
и следовательно если вы её будете вызывать без While!!!
:) данная функция не будет работать, т.к. при такой инициализации в тело while непопасть, busy должно быть изначально ненулевым.

Добавлено: Вт июл 29, 2008 11:58:33
Mozart
дык... никто бизи туда и не посылает...
я так понял из вашего кода, что он устанавливается на 8 ногу порта Д,

Код: Выделить всё

tt=PIND>>7;
вот в теле вайл и происходит ожидание этого сигнала, если вы внимательно посмотрите.

потом, почему я прицепился к этому?... потому что из-за того что проц не готов принять комманду или данные он её просто игнорирует или искажает...

Добавлено: Вт июл 29, 2008 13:20:32
BerZerK-ku
Э-э-э, я всего лишь указал на маленькую ошибку...

unsigned char busy=0x00;
while(busy){..};

При таком определении busy, программа никогда не попадет внутрь цикла.

Добавлено: Вт июл 29, 2008 14:24:51
Mozart
да очепятался... ну поставьте while(!busy) {}

Добавлено: Ср июл 30, 2008 09:24:57
Mozart
как успехи?...

Добавлено: Ср июл 30, 2008 09:52:29
BerZerK-ku
Mozart писал(а):как успехи?...
Да все так же :) Данные вами советы, это всего лишь причесывание программы :)

Добавлено: Ср июл 30, 2008 10:26:58
Mozart
ну не совсем причёчывание программы... у мну просто нету ваше железки... вы попробовали с бизи???
попробуйте ещё задержку между выводами знаков поставить...

ибо если у вас выводится один размер нормально (меньший я так понял) а другой нет (больший) то просто контроллер не успевает

Добавлено: Ср июл 30, 2008 11:41:32
BerZerK-ku
Mozart писал(а): вы попробовали с бизи???
попробуйте ещё задержку между выводами знаков поставить...
Задержка между знаками? дак в выложенной программе на экран послывается всего 1 знак и норм. выводится только в 8-и битном режиме.

Функция считывания флага работает и работала раньше. Так что грешить на неуспевание не стоит.

Добавлено: Чт июл 31, 2008 11:31:20
Mozart
Пример 1.
Экран в знаковом режиме, 8 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в любую позицию, все в норме.
Пример 2.
Экран в знаковом режиме, 7 точек на знак по горизонтали, 10 по вертикали. Вывожу "8" в 19 позицию первой строки. На экране появляются ДВЕ восьмерки. Первая на '21' позиции, примерно там где отобразилась бы в случае 8-и битного знака. Вторая на ~14 позиции, и смещена на 1 строку вниз ( см. рисунок). Откуда это взялось то?!
первое не правильно всё таки пишите... во втором примере что-то нарушается, проверьте длительности, посмотрите осциллографом, возьмите другой ЖК, может этот вам глючный попался (что врятли).
может быть вообще по другому писать надо для второго примера...

з.ы. чудеса бывают, но редко.
з.з.ы. даташит я не смотрел... :?