Хроники лаборатории: полезные советы

TRENGTOR CUSTOM: разработка и изготовление электронных цифровых устройств

Небольшие практические заметки. Полезный опыт. Аналитика. Измерения. Особенности применения.

 

 

mikroPascal AVR: альтернативная библиотека для LCD HD44780

Самая противная часть комплекта микропаскалевских библиотек – это, несомненно, библиотека Lcd. Нет, в принципе она работает. Но если ей выводить не символы, а строки (Lcd_Out), то в вашем коде что-то будет постоянно ломаться при его работе. Далее, как правило, пишутся костыли, позволяющие заменить библиотечную функцию Lcd_Out путем посимвольного вывода строк. И на этом, как правило, всё заканчивается.

Строковый тип (string)

На мой взгляд, корнем проблем в библиотеках mikroPascal является манера разработчиков из mikroE передавать строковые параметры в библиотечные функции и процедуры с объявлением длины строк по умолчанию.

Например, вот так (в случае библиотеки Lcd):

procedure Lcd_Out(row: byte; column: byte; var text: string);

procedure Lcd_Out_CP(var text: string);

Казалось бы, ничего страшного, т.к. в парадигме языка Pascal длина строки ограничена 255 символами. Но в mikroPascal всё обстоит иначе и структура типа string совпадает с типом array of char из C.

string_name : string[length]

А что тут у нас с длиной length?

О, здесь-то и начинается самое интересное. Явным образом про длину не говорится вообще нигде и никак – ни в хелпе, ни в описании языка. Поэтому приходит вполне логичная мысль, что раз это так, то всё соответствует парадигме языка Pascal. Т.е. длина строки ограничена значением 255. Но это отнюдь не так!

Заглянем в описание String Library:

function strlen(var s : string) : word;

Обратите внимание: функция возвращает двухбайтовое значение. Это прозвенел звонок!

Пообщавшись на форуме технической поддержки mikroE, я выяснил, что теоретический предел для длины строки равен 64K.

На практике, разумеется, всё будет ограничено объемом ОЗУ микроконтроллера.

Внимание! Всего одна строка, объявленная с длиной по умолчанию, может затереть (и успешно затирает) содержимое ОЗУ, включая стек, статические, динамические переменные! Т.е. любое содержимое ОЗУ микроконтроллера!

Отсюда и проблемы с передачей строк в функции вывода стандартных библиотеках mikroPascal.

Тайминги

Тайминги, тайминги...

Как правило, от библиотеки ожидаешь, что она не несет в себе никаких неожиданных сюрпризов. И если что-то идет не так, то прежде всего винишь в этом себя и свой код. Но не стоит идеализировать разработчиков: там работают такие же разгильдяи, если не хуже.

Всерьез столкнуться с проблемой таймингов библиотеки Lcd мне пришлось тогда, когда я решил перенести проект с таймеров и прерываний (помешала нехватка счетчиков и отсутствие системы приоритетов прерываний) на диспетчер с сеткой 1 мс. Почему-то все заработало далеко не так, как изначально ожидалось.

Под подозрение попал обмен с дисплеем и пришлось срочно изготовить измерительный переходник для подключения логического анализатора к ЖК дисплею 16х2 (LCD 1602).

И вот тут-то моему удивлению просто не было предела: цикл вывода на дисплоей 6 смежных знакомест занимал более 11 мс, хотя по моим прикидочным расчетам (исходящим из стандартных для HD44780 задержек и длительностей обработки команд) не должен был превышать 700 мкс.

Стало понятно, что костылями делу тут уже не поможешь и надо писать свою библиотеку для дисплея.

Библиотека ULCD

Мной была написана библиотека ULCD, полностью совпадающая по своему синтаксису со стандартной библиотекай Lcd, за исключением длины передаваемых строк, явно ограниченных 40 символами (поскольку для дисплеев на микросхеме HD44780 и её аналогах большей длины не требуется).

С новой библиотекой всё наконец-то заработало именно так, как ожидалось, а вышеупомянутый цикл вывода на дисплей сократился с 11 мс до 500 мкс. Т.е. код дисплея ускорился приблизительно в 22 (двадцать два) раза!

Характеристики библиотеки ULCD

4-разрядный обмен с дисплеем; сигнал R/W не используется; произвольное назначение выводов микроконтроллера сигналам обмена с дисплеем.

Поддержка OLED Winstar WEH001602ALPP5N

Библиотека ULCD поддерживает полноценную работу с OLED Winstar WEH001602ALPP5N. Ошибки инициализации отсутствуют.

Следует особо отметить большой уровень шумов по питанию, создаваемых такими OLED. Это необходимо учитывать при разработке чувствительных устройств и принимать специальные меры по фильтрации цепей питания OLED.

Где взять библиотеку ULCD

Библиотека ULCD для компилятора mikroPascal Pro for AVR доступна на русурсе Libstock компании Mikroelektronika.

 

14 анваря 2017

 


Услуги

Ремонт гитарной электроники

Разработка электроники

Бытовая электроника

Термогигрометр

 

Гитарная электроника

Микрофонный преамп

Кабели и патчи

 

Инструменты

Контроллер для WSP80

 

Комплекты для сборки

Контроллер для WSP80

 

Хроники лаборатории

Полезные советы

 

Это полезно знать

Важное о влажности

 

Как сделать заказ

Контакты


Поддержать
сайт и его автора

 

 

Информация, представленная на сайте, не является офертой.

 

© yes.trengtor.com, 2014-2017. При цитировании обязательна ссылка.