Работа с ЖКИ на контроллере HD44780 и его аналогах
А у тебя STM-ка на какой частоте работает? Индикатор устройство медленное, может из-за высокой частоты строб очень короткий получается, попробуй его удлинить.
- Реклама
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
вот весь файл http://svn.code.sf.net/p/rusefi/code/tr ... _HD44780.c
работает на 168мгц , но задержки есть в коде
работает на 168мгц , но задержки есть в коде
Задержки именно на ширину импульса строба? Я бы это проконтролировал осциллографом. Там строб должен быть не менее 1мкс.
rus084, гляньте тут http://forum.chipmk.ru/index.php/topic/ ... -lcd-16x2/ , возможно поможет чем...
Я бы проверил работу процедурки "lcdSleep(int period)" она ответственна за формирование коротких выдержек и делает это циклом "вхолостую". Компилятор мог просто почикать этот цикл в целях оптимизации т.к. результат работы цикла не востребован. Может быть, было бы проще реализовать задержки на таймерах.
И все-таки, надо бы проверить ширину импульса строба в железе.
И все-таки, надо бы проверить ширину импульса строба в железе.
- Реклама
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
Спойлер
Код: Выделить всё
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) это функция задержки в нормальном режиме
В индикаторе используется именно она для формирования строба а не какая-то другая.
И вообще с шустрыми процами надо быть всегда на стороже, на выводах уровни могут не успевать установится а ты даешь строб - это тоже плохо, нужно ждать некоторое время между выдачей данных на шину и началом строба. В даташите это все описано в виде диаграмм. На низкоскоростных камушках оно получается само собой, но на этом шустрике это может оказаться не так. Надо внимательно рассмотреть диаграмму, соответствуют ли все временные интервалы спецификации на индикатор. Может там у тебя все сейчас на грани и внутри индикатора создается race condition электрических сигналов, из-за которого он то работает(задержки чуть больше критических) то не работает.
И вообще с шустрыми процами надо быть всегда на стороже, на выводах уровни могут не успевать установится а ты даешь строб - это тоже плохо, нужно ждать некоторое время между выдачей данных на шину и началом строба. В даташите это все описано в виде диаграмм. На низкоскоростных камушках оно получается само собой, но на этом шустрике это может оказаться не так. Надо внимательно рассмотреть диаграмму, соответствуют ли все временные интервалы спецификации на индикатор. Может там у тебя все сейчас на грани и внутри индикатора создается race condition электрических сигналов, из-за которого он то работает(задержки чуть больше критических) то не работает.
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
я замотал в скотч провода и их перепутал
сделал такой патч
и все идеально пока работает
сделал такой патч
Спойлер
Код: Выделить всё
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);
}
Всем привет, дошел до освоения LCD, с инициализацией разобрался сразу, писал свою либу по даташиту, сейчас вот решил оптимизировать.
Первое с чем столкнулся, не могу поставить задержку delay_us(1) , компилятор ругается: constant out of range. Принимает минимум 2 микросекунды.
Вопрос почему, и второй как сделать задержку в 300-500 ns (наносекунд), возможно есть несколько вариантов ?
Первое с чем столкнулся, не могу поставить задержку delay_us(1) , компилятор ругается: constant out of range. Принимает минимум 2 микросекунды.
Вопрос почему, и второй как сделать задержку в 300-500 ns (наносекунд), возможно есть несколько вариантов ?
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
- Сообщения: 3443
- Зарегистрирован: Вт июн 28, 2011 12:11:50
- Откуда: Россия,Ставропольский край, ст.Бекешевская
Что у вас за мк?
asm("nop") - задержка, равная 1 такту процессора.olegleon писал(а):Вопрос почему, и второй как сделать задержку в 300-500 ns (наносекунд), возможно есть несколько вариантов ?
mega8, 16MHz значит один такт (nop) 62.5 ns тогда многоговато нопов надо для задержки в 500 nsrus084 писал(а):Что у вас за мк?
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
а вы работайте с нормальными компиляторами и нормальными библиотеками, и будет вам счастье.
WinAVR содержит "функцию" _delay_us(), которая с приемлемой точностью отрабатывает микросекундные задержки.
WinAVR содержит "функцию" _delay_us(), которая с приемлемой точностью отрабатывает микросекундные задержки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
хорошо, но все же остается открытым вопрос, как сделать задержки в наносекундах (300ns). Тот же строб E у LCD надо передергивать с периодом в 500 ns/
Не, можно и с 10us, но это же две большие разницы, 300ns и 10us.
Изучаю для себя, а для себя хочется хорошо, а не как-нибудь.
(писал чуть выше, уже библиотека рабочая, просто решил все оптимизировать по даташиту)
Не, можно и с 10us, но это же две большие разницы, 300ns и 10us.
Изучаю для себя, а для себя хочется хорошо, а не как-нибудь.
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
вы ничего не путаете?olegleon писал(а):Тот же строб E у LCD надо передергивать с периодом в 500 ns
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ну как бы есть такой докУмент, HD44780.pdf , который из 60-ти страниц, так в нем на 52стр. есть тайминги операций записи, Enable cycle time = 500ns min,
как бы максимумом не ограничено, но повторюсь, хочу по максимуму оптимизировать.
Возможно в чем-то я ошибаюсь или не правильно с графиком разобрался, направте на путь истинный, коли сошел я с него.
как бы максимумом не ограничено, но повторюсь, хочу по максимуму оптимизировать.
Возможно в чем-то я ошибаюсь или не правильно с графиком разобрался, направте на путь истинный, коли сошел я с него.
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
Может не так прочли даташит на индикатор и там написано что 500нс это МИНИМАЛЬНАЯ длительность импульса строба? Индикатор довольно медленный, 500нс импульс соответствует меандру частотой 1Мгц. При 8Мгц тактовой делаю паузу в 2-3 NOP-а и работает все замечательно. Сами команды дрыгания ножкой занимают 2 такта. Ну можешь всадить десяток NOP-ов, или вызвать процедуру пустую - переход по адресу вызова и немедленный возврат займет 16 тактов минимум.
ссылочку дайте - давненько не брал я в руки шашекдаташитовolegleon писал(а):ну как бы есть такой докУмент, HD44780.pdf , который из 60-ти страниц, так в нем на 52стр. есть тайминги операций записи, Enable cycle time = 500ns min
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
как бы в яндексе первая по запросу.
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Есть и на русском
http://cxem.net/doc/mc/HD44780-rus.pdf там на 13 стр. есть такая же таблица временных характеристик.
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Есть и на русском
http://cxem.net/doc/mc/HD44780-rus.pdf там на 13 стр. есть такая же таблица временных характеристик.
- Пахнет котом, - подумал Штирлиц.
- Зачем он нюхает мою лапу? - подумал кот.
- Зачем он нюхает мою лапу? - подумал кот.
Все правильно, для HD44780 при Vcc = 4.5 - 5.5 В минимальный период ENABLE составляет 500 нс, минимальная длительность ВЫСОКОГО уровня на ENABLE составляет 230 нс. Но есть ли смысл гнаться за предельной скоростью?



