WEH001602 Winstar: стабильная библиотека.
- Войдите на сайт для отправки комментариев
Чт, 25/07/2019 - 16:57
внешний вид индикатора:
описалово здесь https://www.winstar.com.tw/ru/products/oled-module/oled-character-display/weh001602a.html
ищется стабильная библиотека.
изначально приобретался для проекта где стабильно работал в графическом режиме в связке с немодифицированной библиотекой LiquidCrystal.
сейчас возникла необходимость переключения из графического в текстовый и обратно режимы.
смотрел на хабре статьи с рекомендациями:
- увеличить таймаут инициализации - бессмысленное телодвиженние: путает нулевую и первую строки.
- следом посылать толи четыре, толи пять комманд с 0x00: вообще всё ломается.
- ресетить индикатор, отключая питание - влом нагромождать ненужное.
~~~~
добился стабильной переинициализации индикатора при ресете дуино, но мусор на четверть секунды, таки пролетает.
*с кодом выше индикатор работает с ESP32 при напряжении питания 3.3V.
а, если добавить в код пин RW:
то это
не обязательно.
а, если добавить в код пин RW:
то это
не обязательно.
таки, нет - отваливается первая строка дисплея.
боле-менее корректный ресет, переключение графический-текстовый режимы на лету.
а, если добавить в код пин RW:
то это
не обязательно.
таки, нет - отваливается первая строка дисплея.
А если банально: delay(512); ?
я тоже так думаю, но подозреваю, что рекомендатель того цикла с делаями микросекунд руководствовался чем то ещё, ускользающим от моего скромного понимания.
https://habr.com/ru/post/400833/
Я думаю, что надо научиться думать.
Исходя из этого:
-------------------
В библиотеке для этого используется функция delayMicroseconds(50000) (строка 120 файла LiquidCrystalRus_OLED.cpp). Для контроллера WS0010 нужно иметь задержку в десять раз больше — не менее 500 мс (см. последнюю страницу даташита по указанной выше ссылке).
-------------------
И этого:
-------------------
delayMicroseconds()
Currently, the largest value that will produce an accurate delay is 16383. This could change in future Arduino releases. For delays longer than a few thousand microseconds, you should use delay() instead.
-------------------
Следует вывод - у автора поста имеются определённые проблемы.
вспомнил, почему delayMicroseconds() , а не банальный delay().
Начиная с версии Arduino 0018, функция delayMicroseconds() больше не отключает прерывания.
Следует вывод - у автора поста имеются определённые проблемы.
строка delayMicroseconds(50000); присутсвует в библиотеке LiquidCrystal.
Исходя из руководства - она бессмысленна в текущих IDE. И автор поста об этом не задумывается.
Исходя из руководства - она бессмысленна в текущих IDE. И автор поста об этом не задумывается.
автору поста об этом задумываться нет смысла, т.к. он меняет в коде библиотеки 50000 микросекунд на 32 раза по 16000, что есть корректно для данного типа дисплея и не выходит за рамки требований максимального значения delayMicroseconds().
*но сам факт грубой ошибки в популярной библиотеке дуино - рвёт эмбедеров на клочки.посмотрел в Arduino.h
что там пишут про четвёртую часть от unsigned int - не совсем понятно.
максимальное значение принимаемое delayMicroseconds() - 65535
возможно, имелось ввиду, что в первой четверти значений диапазона 0-65535 можно надеяться на более-менее точность, а далее - нет, но то, что строка: delayMicroseconds(50000) - верна по сути. факт.
Интересно не то, какое максимальное значение помещается в unsigned int, а то, как это значение потом запихивается в аппаратный таймер для обеспечения нужной величины задержки.
Интересно не то, какое максимальное значение помещается в unsigned int, а то, как это значение потом запихивается в аппаратный таймер для обеспечения нужной величины задержки.
как как это значение потом запихивается в аппаратный таймер для обеспечения нужной величины задержки?
как-то мне это не очевидно, а в контексте того что на дуино ESP32 void delayMicroseconds(uint32_t us), то совсем не понятно - что делать и в какую сторону бечь.
sadman41, что ты хотел мне этим сказать? - ты, таки, нашёл грубую ошибку в одной из самых популярных библиотек дуино или это не совсем ошибка, а ты просто решил поумничать?
Тебе, Клопоуций, лечиться надо. Кидаешься на всех, как злая собака за калиткой.
Камменты в коде тебе объясняют, почему больше 1/4 от uint16_t использовать вредно. Но ты давай, размышляй дальше про точность за пределами 16383 и о корректности вызова функции с аргументом 50000. И используй циклы по 16000 мкс, потому что кто-то там где-то их тоже использовал.
что делать и в какую сторону бечь.
видимо бежать
Тебе, Клопоуций, лечиться надо. Кидаешься на всех, как злая собака за калиткой.
т.е. это Я в теме, которую сам же и создал - как собака, кидаюсь на флудеров?
ок. гав!, бродяги! - нечего тут без толку околачиваться.
Камменты в коде тебе объясняют, почему больше 1/4 от uint16_t использовать вредно.
мало того, что камменты в коде меня не убеждают, что delayMicroseconds(50000) - вредно(где и почему вредно?)
так и ты скачешь как блоха в попытках докопаться на ровном месте - выше утверждал, что
Исходя из руководства - она(delayMicroseconds(50000)) бессмысленна в текущих IDE. И автор поста об этом не задумывается.
а, теперь ты поменял своё мнение с "бессмысленна" на "вредна".
Но ты давай, размышляй дальше про точность за пределами 16383 и о корректности вызова функции с аргументом 50000. И используй циклы по 16000 мкс, потому что кто-то там где-то их тоже использовал.
пока тебя здесь не появилось - всё находилось в состоянии равновесия: delayMicroseconds(50000) в коде библиотеки LiquidCrystal, таймаут фикса - в моём коде. и, какая в хера разница, как он(таймаут) реализован, если - корректно и, даже, ты-блоха до него не можешь докопаться.
сгинь, не раздражай меня.
что делать и в какую сторону бечь.
видимо бежать
\о
Клапауций! Ты зачем-то защищаешь явный кусок говнокода. ИМХО.
Вот такой херни не может быть в нормальном коде никогда! Это костыль.
Правильно сказано, что (исключительно для AVR) не стоит использовать более 16383 в delayMicroseconds(). Автор просто взял по 16 тыщ столько раз, сколько ему надо.
delayMicroseconds(50000) в AVR ядре полность эквивалентно delayMicroseconds(848) **). ( ;)) для смеха уточню, что в 1.8.7 всё еще так). Там просто для тактовой в 16МГц аргумент на 4 делится ;))).
(** много раз пересчитывал, что будет с 50000 после (50000<<2)>>2) $))) )
Мне казалось, что ты повзрослел, чтобы спорить без уверенности в правоте... жаль.
В ArduinoIDE функция delay() не гарантирует длительность задержки, лишь "не меньше чем", а delayMicroseconds() предоставляет системную задержку в фиксированное время, достаточно аккуратно приближенное к заданному. Вот и разница. Поэтому и такой странный костыль. Но это не повод его тиражировать. Это костыль времени разработки.
-------------------------------------
Кроме того, ты и твои оппоненты забыли (как мне кажется), что ты теперь пишешь под ЕСП. А там вообще всё иначе - просто delay(), запускает таймер для измерения интервала, а delayMicroseconds() - обращение к функции API os_delay_us(), реализация которой за пределами досигаемости "ембеддеров", и лежит на ответственности компании Еспрессив. ;))
Мне так показалось, потому, что вся аргументация свелась к цитированию wiring.c от ядра AVR.
sadman41, что ты хотел мне этим сказать? - ты, таки, нашёл грубую ошибку в одной из самых популярных библиотек дуино или это не совсем ошибка, а ты просто решил поумничать?
Да, delayMicroseconds(50000) === delayMicroseconds(848) ПОЛНОСТЬЮ эквивалентно. (для AVR)
Использование - явная ошибка, которых полно в самых популярных библиотеках.
Мне кажется, что в этом случае тебе стоит извиниться перед садман41, просто чтобы себя уважать. Но это твое дело, конечно.
Мне кажется, что в этом случае тебе стоит извиниться перед садман41, просто чтобы себя уважать. Но это твое дело, конечно.
за что извиняться?
выскочило что-то - докопалось до delayMicroseconds(50000) в библиотеке LiquidCrystal.
почему оно не идёт на https://www.arduino.cc/ и не занимается этим там?
а, предъявляет это мне в то время, когда мне не важно, что вообще происходит в библиотеке LiquidCrystal - все телодвижения по корректной инициализации дисплея проходят в опубликованном выше коде.
Кроме того, ты и твои оппоненты забыли (как мне кажется), что ты теперь пишешь под ЕСП.
А там вообще всё иначе -
ты, вообще, читал название и содержание первых постов темы?
здесь выясняется, как всё на самом деле(с) или я тут пытаюсь запустить дисплей?
всем, кто ещё недоговорил о delayMicroseconds() - прошу последовать всюда Великое Недополнение: delayMicroseconds();
Клапауций! Ты зачем-то защищаешь явный кусок говнокода. ИМХО.
Вот такой херни не может быть в нормальном коде никогда! Это костыль.
Совершенно верно!
Ну ведь правда, гораздо изящнее:
delayMicroseconds(16516);
зря ты это написал - щаз набегут...
Вот ведь издалека видно человека с хорошим вкусом! Мазл тов!
Подскажите купил такой дисплей его можно подключить и проверить через l2c?