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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

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

Сообщение Anjey_N »

Привет! Не спешите меня футболить или стирать мой вопрос, как это сделали на форуме ELECTRONIX.ru .
Я пытаюсь запустить WinStar 1602. Прочитал много исходников, даташитов, наваял свою прогу инициализации. Только индикатор не переходит на 2 строки, остаётся на одной. Может посмотрите мой код, подскажите, где я ошибся. Там 3 файла: lcd.c lcd.h delay.h Пишу на Си
Вложения
LCD_Clock.rar
(1.61 КБ) 249 скачиваний
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

а почитать тему
http://radiokot.ru/forum/viewtopic.php?t=584
слабо?
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Нет, не слабо. Только я её читал, и не только эту тему, и перепробовал много вариантов. Только индикатор работать не желает
Может я в чём-то и не прав, но это моё мнение
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Изобретаете свой велосипед?
Используйте CVAVR,там всё гораздо проще,да и свои библиотеки там тоже можно прикручивать.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение 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 , которая включает дисплей.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Вы совершенно правы. я пропустил в подпрограмме инициализации 1 команду. Сейчас я переделал свой код, сделал подключение индикатора короткими проводами и индикатор ожил. Можно выводить сообщения на обе строки. Но программа работает только пошагово, а когда её запускаешь в автоматическом режиме, то виснет на опросе сигнала BF (окончание сигнала ЗАНЯТО). Посмотрите, пожалуйста, код!
Вложения
LCD_Clock.rar
(2.69 КБ) 210 скачиваний
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.

Чушь полная... 3-ы в начале надо выставить 8-и битный режим. что и сделано в программе.

Почему программа работает в пошаговом режиме и не работает в авто... А черт ее знает ) Сам никогда не пользовался считыванием данных с дисплея, длительность выполнения команды считаю таймером.
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

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


Индикатор физически подключён, я применяю JTAG. :shock: Зависание проходит, если перед каждой командой send_comand поставить задержку на 5 мсек delay_ms(5). Может пред выдачей команды не опрашивать бит BF?
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Есть же куча проектов без опроса BF , задержки и все работает.
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

попробую убрать опрос сигнала занятости и добавить где нужно задержки. Потом отпишу
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Pooher писал(а):
Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.

Чушь полная...

Не погорячились??? (см. вложение 2)

Может пред выдачей команды не опрашивать бит BF?


см. вложение 1.
Вложения
.JPG
XXX
(20.1 КБ) 459 скачиваний
init1.JPG
инициализация
(94.12 КБ) 380 скачиваний
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Pooher писал(а):Не погорячились??? (см. вложение 2)


Нет, чушь она и есть чушь.
В ваших вложениях приведена нормальная инициализация, как раз так и сделано у автора данного поста. Где вы нашли на своих вложениях тройную инициализацию 4-х битного режима??? или вы намекаете что производитель врет и команда 0х30 это не включение 8-и битного режима???

К автору поста. В каком месте у вас зависает программа? при инициализации на первом же send_command(LCD_4_BUS_MODE); ? Если да, то проблема может быть связана с тем, что в данный момент индикатор еще находится в 8-и битном режиме.
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение 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.
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Сейчас я сделал немного по другому.
Оставил опрос бита BF и в подпрограмму write__byte добавил задержку на 2 мсек. Всё работает. Пробовал ставить 1 мсек, индикатор виснет. Похоже ему 1 мсек для своих операций не хватает :cry:
Спасибо всем, кто откликнулся! :))
Может я в чём-то и не прав, но это моё мнение
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение 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));
}
:)
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Да, Вы правы!
Я сделал так как Вы указали и убрал задержку из write_byte - всё работает! :shock:
Тогда у меня ещё вопрос. Например я хочу выводить в первой строке показания часов. ЧЧ-ММ-СС. Мне нужно каждую секунду выводить всю строку или нарисовать один раз кадр: __ --__--__, а потом выводить раз в секунду значения секунд, раз в минуту значения минут ну и т.д. на указанное место?
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
Pippeytz
Потрогал лапой паяльник
Сообщения: 396
Зарегистрирован: Ср май 28, 2008 19:30:31
Откуда: Донецк
Контактная информация:

Сообщение Pippeytz »

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

Обматерился, но не нашл ее. Неплохо было бы на нее поглядеть :idea:
Полный пипеутз.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»