Добры день. Помогите победить появление артефактов при включении дисплея (видео во вложении). Дисплей Winstar WEH001602A. Библиотека и порядок инициализации следующие: Код (C++): #include <LiquidCrystal_I2C_OLED.h> // библиотка для OLED ... LiquidCrystal_I2C oled(ADDR_OLED, 16, 2); // Указываем I2C адрес и параметры дисплея (16 символов, 2 строки) ... void setup() { oled.init(); // Инициализация дисплея oled.clear(); // очистка дисплея ...
Не знаю как у вас, но уже месяц Амперка жутко тормозит не у меня одного. А от видео - вообще глохнет. Вы картинку недвижную пришлите и словами скажите в чем беда. Возможно знаю в чем проблема. У вас на шине I2C - не одно устройство ?! Приемный буфер I2c принимает данные, независимо от адреса. А когда проходит команда именно его адреса - все что затесалось в приемный буфер - оказывается на экране. Сталкивался с этим. Там перед каждым выводом на экран надо делать "продувку" шины. Если найду в своем бедламе - выложу код. Надеюсь резисторы подтяжки не забыли поставить. Без них - низя.
На шине I2C устройств много. Но проблема только при включении: при подаче питания, на дисплее появляются артефакты (хаотичные иероглифы). Далее все работает как нужно. Добавил задержку: Код (C++): oled.init(); // Инициализация дисплея delay(2000); oled.clear(); // очистка дисплея и артефакты зависают на 2 сек. Получается проблема в моменте инициализации. Может библиотека...?! Про "продувку" интересно узнать.
Не. Посмотрел. Продувка это из другой оперы. Но по вопросу - Вы уверены что выходят артефакты ? Может это фирменная аппаратная заставка дисплея или библиотеки ? У них вроде даже команды инициализации есть - с выводом фирмовой заставки или без. Если это только при подаче питания - нажмите ресет на процессоре и включите ваш девайс в питалово. И увидите фирмовую заставку - если она там есть.У меня в малюсеньком дисплейчике - точно была, похожая на крылья. И последнее ну и чем она вам мешает ?
Именно артефакты, они всегда разные. Иногда бывает просто "точка" появляется, а иногда весь дисплей в кракозябрах. На работу не влияет. Но как то не эстетично, почему бы не попытаться убрать - психануть всегда успею
код написан неправильно. Если устройство не ответит в период, когда процессор выполняет секцию Setup(), то как оно всё будет дальше работать? А артефакты - это нормально. Либо так запланировано, либо долго очищается статическая память. I2C же.
Ну да. Дисплей щас - тотже процессор со встроенным ПО. Если в нем заложена неторопливая инициализация - он и будет медленно убирать сопли не реагируя ни на что. На дисплее что-то видно - если включена подсветка. А подсветка управляется аппаратно - без участия процессора дисплея - по сигналу на пине управления. Сделайте так чтобы по умолчанию подсветка была выключена. Или хост-проц в сетапе заставляйте её сразу выключать.
маловероятно. Скорее всего, матрица на ASIC. очистка памяти снаружи. После включения там мусор, ибо вся статическая память - D-триггеры.
В дисплеях обычно память отдельно - экран отдельно. Команда LCD.clear () - очищает память. А чтоб эта чистота сдублировалась на экран - должна быть отдельная команда типа LCD.screen() или что-то подобное.
Очистка памяти в дисплее - запись нулей по всем адресам. Это имеет смысл у тех дисплеев, которые допускают произвольный доступ к памяти. Отдельной команды, как правило, нет.
Продолжу тему. Делаю Бегущую строку на матрицах и MAX7219. С божьей и сообщества помощью сделал код. Все пучком, кроме одного - после подачи питания может с полчаса поработать безупречно. Потом либо погасает случайные одна или несколько матриц, либо включаются прожектором, либо неподвижные кракозябры зависают. При этом бегу текста это не мешает. После ресета - несколько секунд обязательно работает нормально, а дальше та же свистопляска. Видя эффект ресета на дисплей решил его "вписать". Но в библе нет такой функции. Дисплей инициализируется лишь единожды при старте класса. Тупо выдрал из библы то что касается аппаратной инициализации, и оформил в виде функции в в этой же библиотеке. Вставил ее вызов в цикл. Теперь при каждой итерации строки - пара секунд нормальной работы точно - и дальше непредсказуемо. Особого шума по питанию нет. Вот гадаю над чудом. ПС. Со стороны можно даже принять за развлекуху, но понять причину - надо.
Это комплексные косяки. Причин две с половиной: (1)питание, (2)нарушение контактов в соединении или в самом дисплее. Любых контактов. Следовательно, отдельные матрицы получают соответствующую команду, которую вы им не даете. А что дает? Питание или плохой контакт. Паяльник эффективнее. --------------------- У меня много этих матриц в устройствах. Некоторые работают много лет и никаких косяков. А некоторые просто глючат до того, что приходится все пропаивать. Один раз выбросил - ничего не помогало. Если совсем заморочиться, то осциллограф и ищем "что, где, когда". Но проще заменить.
Заменить никогда не поздно. Пытаюсь понять какая конкретно команда реанимирует дисплей. Там в инициализации их - 6. Осциллограф косяков не видит. Все сигналы - в норме. Найду причину - отпишусь.
Вы смотрите библиотеку? ИМХО, лучше смотреть страницу 7 даташита. Даже начинать со страницы 6. А какие косяки он должен увидеть? Надо понимать команды, что прилетают на конкретную МС и думать об них.
Вот оно: Первая матрица словила "правильные" данные в тест регистр. Третья матрица изменила яркость. Бывает, что матрица гаснет - Shutdown Mode. Возможно в момент ошибки в две другие матрицы "улетели" неправильные данные, но они были дальше переписаны. Все это не мешает работе в целом. Ну только тем, что на дисплее висит чушь В моем случае это какой-то импульс по питанию или наводка. Часы уже минут 10 так работают и ничего не меняется в поведении матриц. Ясный перец, непосредственно это выражается в комбинации состояний трех управляющих проводков. Словить это осциллографом не возможно, да, видимо и нет смысла, если только не возникает повторяющееся поведение конкретной матрицы. Но и в этом случае проблема будет в соединении или неисправности МС этой матрицы. Так что, паяльник или замена
Теперь по инициализации. Псевдокод. Смотреть табличку 2 (управляющие матрицей адреса, аж пять штук) на упоминаемой ранее странице 7 даташита и дальше описание регистров. Код (Lua): numberOfModules = 4 -- Адреса: SCAN = 0x0B DECOD = 0x09 DIST = 0x0F INTENS = 0x0A SHUT = 0x0C for i = 1, numberOfModules do sendByte(i, SCAN, 0x07) sendByte(i, DECOD, 0x00) sendByte(i, DIST, 0x00) sendByte(i, INTENS, 0x01) sendByte(i, SHUT, 0x01) end SCAN регистр каждой матрицы получает семерку - работать со всеми диодиками. DECOD регистр получает нолик - не выеживаться и не интерпретировать данные как цифирь, а просто включать/выключать диоды. DIST - ноль, никакого тестирования матрицы. INTENS - интенсивность. По выбору стреляющего. От 0 до 15. SHUT - единичка. Режим нормальной работы, а не угаснуть навеки. Потом во все матрицы можно отправить много ноликов, чтобы оно стало привычно серым. Вот и вся инициализация. Если указанные выше регистры словят нечто иное - матрица начинает вести себя весело и задорно. Как на фото.
Согласен полностью. Однократная и единственная (при старте) инициализация периферии - чрезмерный оптимизм. Нашел-таки косяк. Все оказалось просто и загадочно. Плохой контакт +5в на разъёме модуля в середине строки - приводил к глюкам по всей строке. Обжал контакт - и все заработало. ПС. Вопрос - а че не вставите в код часов инициализацию матриц хотя бы раз в минуту ?