Работа с ЖКИ на контроллере HD44780 и его аналогах

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А у тебя STM-ка на какой частоте работает? Индикатор устройство медленное, может из-за высокой частоты строб очень короткий получается, попробуй его удлинить.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

вот весь файл http://svn.code.sf.net/p/rusefi/code/tr ... _HD44780.c

работает на 168мгц , но задержки есть в коде
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Задержки именно на ширину импульса строба? Я бы это проконтролировал осциллографом. Там строб должен быть не менее 1мкс.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

rus084, гляньте тут http://forum.chipmk.ru/index.php/topic/ ... -lcd-16x2/ , возможно поможет чем...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Я бы проверил работу процедурки "lcdSleep(int period)" она ответственна за формирование коротких выдержек и делает это циклом "вхолостую". Компилятор мог просто почикать этот цикл в целях оптимизации т.к. результат работы цикла не востребован. Может быть, было бы проще реализовать задержки на таймерах.
И все-таки, надо бы проверить ширину импульса строба в железе.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

Спойлер

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

static void lcdSleep(int period) {
	if (BUSY_WAIT_DELAY) {
		// this mode is useful for displaying messages to report OS fatal issues

		int ticks = 168000000 / 1000000 * period;
		int a = 0;
		for (int i = 0; i < ticks; i++)
			a += i;
		// the purpose of this code is to fool the compiler so that the loop is not optimized away
		chDbgCheck(a != 0, "true");

	} else {
		chThdSleepMicroseconds(period);
	}
}
цикл используется для работы , когда ОС перестанет работать , типа синего экрана смерти .

а chThdSleepMicroseconds(int period) это функция задержки в нормальном режиме
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

В индикаторе используется именно она для формирования строба а не какая-то другая.
И вообще с шустрыми процами надо быть всегда на стороже, на выводах уровни могут не успевать установится а ты даешь строб - это тоже плохо, нужно ждать некоторое время между выдачей данных на шину и началом строба. В даташите это все описано в виде диаграмм. На низкоскоростных камушках оно получается само собой, но на этом шустрике это может оказаться не так. Надо внимательно рассмотреть диаграмму, соответствуют ли все временные интервалы спецификации на индикатор. Может там у тебя все сейчас на грани и внутри индикатора создается race condition электрических сигналов, из-за которого он то работает(задержки чуть больше критических) то не работает.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

я замотал в скотч провода и их перепутал
сделал такой патч
Спойлер

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

Index: hw_layer/lcd/lcd_HD44780.c
=============
--- hw_layer/lcd/lcd_HD44780.c	(revision 2732)
+++ hw_layer/lcd/lcd_HD44780.c	(working copy)
@@ -190,16 +190,16 @@
 	lcd_HD44780_write(0x80);
 	chThdSleepMicroseconds(40);
 
-	lcd_HD44780_write(0x08);	// display and cursor control
+	lcd_2x16_write_command(0x08);	// display and cursor control
 	chThdSleepMicroseconds(40);
 
-	lcd_HD44780_write(LCD_HD44780_DISPLAY_CLEAR);
+	lcd_2x16_write_command(LCD_HD44780_DISPLAY_CLEAR);
 	chThdSleepMilliseconds(2);
 
-	lcd_HD44780_write(LCD_HD44780_SHIFT_CURSOR_RIGHT);
+	lcd_2x16_write_command(LCD_HD44780_SHIFT_CURSOR_RIGHT);
 	chThdSleepMilliseconds(2);
 
-	lcd_HD44780_write(LCD_HD44780_DISPLAY_ON);
+	lcd_2x16_write_command(LCD_HD44780_DISPLAY_ON);
 
 	lcd_HD44780_set_position(0, 0);
 }
и все идеально пока работает
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

Всем привет, дошел до освоения LCD, с инициализацией разобрался сразу, писал свою либу по даташиту, сейчас вот решил оптимизировать.
Первое с чем столкнулся, не могу поставить задержку delay_us(1) , компилятор ругается: constant out of range. Принимает минимум 2 микросекунды.
Вопрос почему, и второй как сделать задержку в 300-500 ns (наносекунд), возможно есть несколько вариантов ?
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

Что у вас за мк?
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

olegleon писал(а):Вопрос почему, и второй как сделать задержку в 300-500 ns (наносекунд), возможно есть несколько вариантов ?
asm("nop") - задержка, равная 1 такту процессора.
Контактная информация:
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

rus084 писал(а):Что у вас за мк?
mega8, 16MHz значит один такт (nop) 62.5 ns тогда многоговато нопов надо для задержки в 500 ns
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а вы работайте с нормальными компиляторами и нормальными библиотеками, и будет вам счастье.
WinAVR содержит "функцию" _delay_us(), которая с приемлемой точностью отрабатывает микросекундные задержки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

хорошо, но все же остается открытым вопрос, как сделать задержки в наносекундах (300ns). Тот же строб E у LCD надо передергивать с периодом в 500 ns/
Не, можно и с 10us, но это же две большие разницы, 300ns и 10us.
Изучаю для себя, а для себя хочется хорошо, а не как-нибудь. :) (писал чуть выше, уже библиотека рабочая, просто решил все оптимизировать по даташиту)
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

olegleon писал(а):Тот же строб E у LCD надо передергивать с периодом в 500 ns
вы ничего не путаете?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

ну как бы есть такой докУмент, HD44780.pdf , который из 60-ти страниц, так в нем на 52стр. есть тайминги операций записи, Enable cycle time = 500ns min,
как бы максимумом не ограничено, но повторюсь, хочу по максимуму оптимизировать.
Возможно в чем-то я ошибаюсь или не правильно с графиком разобрался, направте на путь истинный, коли сошел я с него.
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Может не так прочли даташит на индикатор и там написано что 500нс это МИНИМАЛЬНАЯ длительность импульса строба? Индикатор довольно медленный, 500нс импульс соответствует меандру частотой 1Мгц. При 8Мгц тактовой делаю паузу в 2-3 NOP-а и работает все замечательно. Сами команды дрыгания ножкой занимают 2 такта. Ну можешь всадить десяток NOP-ов, или вызвать процедуру пустую - переход по адресу вызова и немедленный возврат займет 16 тактов минимум.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

olegleon писал(а):ну как бы есть такой докУмент, HD44780.pdf , который из 60-ти страниц, так в нем на 52стр. есть тайминги операций записи, Enable cycle time = 500ns min
ссылочку дайте - давненько не брал я в руки шашекдаташитов :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Родился
Аватара пользователя
Сообщения: 15
Зарегистрирован: Ср янв 22, 2014 17:44:19
Откуда: Одесса

Сообщение olegleon »

как бы в яндексе первая по запросу.
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Есть и на русском
http://cxem.net/doc/mc/HD44780-rus.pdf там на 13 стр. есть такая же таблица временных характеристик.
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Все правильно, для HD44780 при Vcc = 4.5 - 5.5 В минимальный период ENABLE составляет 500 нс, минимальная длительность ВЫСОКОГО уровня на ENABLE составляет 230 нс. Но есть ли смысл гнаться за предельной скоростью?
Контактная информация:
Ответить

Вернуться в «Периферия»