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

LCD - индикатор, проблемы

Добавлено: Чт май 28, 2009 19:25:31
Anjey_N
Привет! Не спешите меня футболить или стирать мой вопрос, как это сделали на форуме ELECTRONIX.ru .
Я пытаюсь запустить WinStar 1602. Прочитал много исходников, даташитов, наваял свою прогу инициализации. Только индикатор не переходит на 2 строки, остаётся на одной. Может посмотрите мой код, подскажите, где я ошибся. Там 3 файла: lcd.c lcd.h delay.h Пишу на Си

Добавлено: Чт май 28, 2009 20:22:37
GP1
а почитать тему
http://radiokot.ru/forum/viewtopic.php?t=584
слабо?

Добавлено: Чт май 28, 2009 20:57:27
Anjey_N
Нет, не слабо. Только я её читал, и не только эту тему, и перепробовал много вариантов. Только индикатор работать не желает

Добавлено: Пт май 29, 2009 00:35:25
Vov123
Изобретаете свой велосипед?
Используйте CVAVR,там всё гораздо проще,да и свои библиотеки там тоже можно прикручивать.

Добавлено: Пт май 29, 2009 06:36:47
BerZerK-ku
Хм... а у вас вообще что-то на экран выводится?
Мои сомнения на счет вашей инициализации:

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

 // SendDisplay(0x20,COMMAND);
//  Выбор 4-разрядной шины данных, 2 строки на дисплее, шрифт 5х8
  WaitEndBusy();                                        //  ждём снятие с-ла "Занято"
  SendDisplay(0x28,COMMAND);
  WaitEndBusy();                                        //  ждём снятие с-ла "Занято"  
  SendDisplay(0x08,COMMAND);
  WaitEndBusy();                                        //  ждём снятие с-ла "Занято"   
  SendDisplay(0x01,COMMAND);
  WaitEndBusy();                                        //  ждём снятие с-ла "Занято"    
  SendDisplay(0x06,COMMAND);
  WaitEndBusy();                                        //  ждём снятие с-ла "Занято"    
  SendDisplay(0x14,COMMAND);
  WaitEndBusy();                                        //  ждём снятие с-ла "Занято"    
  SendDisplay(0x31,DATA);
Верхняя строчка закоментирована зря, т.к. при посылке команды 0х28 LCD дисплей работает еще на 8-и битной шине, и потому скорее всего посылка младшей тетрады будет проигнорирована.
И еще, не видно команды 0b000011xx , которая включает дисплей.

Добавлено: Пт май 29, 2009 15:36:27
Pooher
Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.

Добавлено: Пт май 29, 2009 19:33:18
ARV
Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
а еще лучше - пользуйтесь готовыми библиотеками. я для WinAVR нашел отличную библиотеку - сам пользуюсь и горя не знаю! элементарно находится поиском (кстати, в комплекте с библиотекой i2c и 1-wire) :)

Добавлено: Вс май 31, 2009 08:08:04
Anjey_N
Вы совершенно правы. я пропустил в подпрограмме инициализации 1 команду. Сейчас я переделал свой код, сделал подключение индикатора короткими проводами и индикатор ожил. Можно выводить сообщения на обе строки. Но программа работает только пошагово, а когда её запускаешь в автоматическом режиме, то виснет на опросе сигнала BF (окончание сигнала ЗАНЯТО). Посмотрите, пожалуйста, код!

Добавлено: Вс май 31, 2009 10:14:10
Pooher
Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.

Добавлено: Пн июн 01, 2009 08:17:24
BerZerK-ku
Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Чушь полная... 3-ы в начале надо выставить 8-и битный режим. что и сделано в программе.

Почему программа работает в пошаговом режиме и не работает в авто... А черт ее знает ) Сам никогда не пользовался считыванием данных с дисплея, длительность выполнения команды считаю таймером.

Добавлено: Пн июн 01, 2009 20:47:09
Anjey_N
Pooher писал(а):Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Индикатор физически подключён, я применяю JTAG. :shock: Зависание проходит, если перед каждой командой send_comand поставить задержку на 5 мсек delay_ms(5). Может пред выдачей команды не опрашивать бит BF?

Добавлено: Пн июн 01, 2009 21:14:39
dosikus
Есть же куча проектов без опроса BF , задержки и все работает.

Добавлено: Пн июн 01, 2009 21:38:06
Anjey_N
попробую убрать опрос сигнала занятости и добавить где нужно задержки. Потом отпишу

Добавлено: Пн июн 01, 2009 21:41:00
Pooher
Pooher писал(а):
Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.

Чушь полная...
Не погорячились??? (см. вложение 2)
Может пред выдачей команды не опрашивать бит BF?
см. вложение 1.

Добавлено: Вт июн 02, 2009 06:11:31
BerZerK-ku
Pooher писал(а): Не погорячились??? (см. вложение 2)
Нет, чушь она и есть чушь.
В ваших вложениях приведена нормальная инициализация, как раз так и сделано у автора данного поста. Где вы нашли на своих вложениях тройную инициализацию 4-х битного режима??? или вы намекаете что производитель врет и команда 0х30 это не включение 8-и битного режима???

К автору поста. В каком месте у вас зависает программа? при инициализации на первом же send_command(LCD_4_BUS_MODE); ? Если да, то проблема может быть связана с тем, что в данный момент индикатор еще находится в 8-и битном режиме.

Добавлено: Вт июн 02, 2009 09:57:23
Anjey_N
К автору поста. В каком месте у вас зависает программа? при инициализации на первом же send_command(LCD_4_BUS_MODE); ? Если да, то проблема может быть связана с тем, что в данный момент индикатор еще находится в 8-и битном режиме.[/quote]

Да, сначала зависание происходило на первом send_command(LCD_4_BUS_MODE). я её заменил на write_byte(LCD_4_BUS_MODE) и последующую send_command(LCD_4_BUS_MODE | LCD_2_LINE | LCD_5x8CHAR) тоже заменил на write_byte. Зависать стало дальше, там где опрашивается бит BF.

Добавлено: Вт июн 02, 2009 10:02:52
Anjey_N
Сейчас я сделал немного по другому.
Оставил опрос бита BF и в подпрограмму write__byte добавил задержку на 2 мсек. Всё работает. Пробовал ставить 1 мсек, индикатор виснет. Похоже ему 1 мсек для своих операций не хватает :cry:
Спасибо всем, кто откликнулся! :))

Добавлено: Ср июн 03, 2009 06:33:35
BerZerK-ku
Ваши последние замечания подкинули данных, вообщем проблема зарыта в функциях wait_end_busy и read_byte. Сделайте вот так, и все должно заработать без задержек

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

void wait_end_busy(void)
{
unsigned char d;

  DEFAULT;
  do{ 
    SET_RW;                                        //  будем читать
    CLR_RS;                                        //  команду
    d = read_byte();
  }while(TESTBIT(d,BF));
} 
:)

Добавлено: Ср июн 03, 2009 18:07:57
Anjey_N
Да, Вы правы!
Я сделал так как Вы указали и убрал задержку из write_byte - всё работает! :shock:
Тогда у меня ещё вопрос. Например я хочу выводить в первой строке показания часов. ЧЧ-ММ-СС. Мне нужно каждую секунду выводить всю строку или нарисовать один раз кадр: __ --__--__, а потом выводить раз в секунду значения секунд, раз в минуту значения минут ну и т.д. на указанное место?

Добавлено: Ср июн 03, 2009 18:55:16
Pippeytz
ARV писал(а):
Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
а еще лучше - пользуйтесь готовыми библиотеками. я для WinAVR нашел отличную библиотеку - сам пользуюсь и горя не знаю! элементарно находится поиском (кстати, в комплекте с библиотекой i2c и 1-wire) :)
Обматерился, но не нашл ее. Неплохо было бы на нее поглядеть :idea: