Артефакты на дисплее

Тема в разделе "Arduino & Shields", создана пользователем save.l, 23 мар 2025.

  1. save.l

    save.l Гик

    Добры день.
    Помогите победить появление артефактов при включении дисплея (видео во вложении).
    Дисплей 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();                                                     // очистка дисплея
    ...
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не знаю как у вас, но уже месяц Амперка жутко тормозит не у меня одного. А от видео - вообще глохнет. Вы картинку недвижную пришлите и словами скажите в чем беда.
    Возможно знаю в чем проблема. У вас на шине I2C - не одно устройство ?! Приемный буфер I2c принимает данные, независимо от адреса. А когда проходит команда именно его адреса - все что затесалось в приемный буфер - оказывается на экране. Сталкивался с этим. Там перед каждым выводом на экран надо делать "продувку" шины. Если найду в своем бедламе - выложу код. Надеюсь резисторы подтяжки не забыли поставить. Без них - низя.
     
  3. save.l

    save.l Гик

    На шине I2C устройств много. Но проблема только при включении: при подаче питания, на дисплее появляются артефакты (хаотичные иероглифы). Далее все работает как нужно.
    Добавил задержку:
    Код (C++):
      oled.init();                                                      // Инициализация дисплея
      delay(2000);
      oled.clear();                                                     // очистка дисплея
    и артефакты зависают на 2 сек. Получается проблема в моменте инициализации.
    Может библиотека...?!
    Про "продувку" интересно узнать.
     
  4. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не. Посмотрел. Продувка это из другой оперы. Но по вопросу - Вы уверены что выходят артефакты ? Может это фирменная аппаратная заставка дисплея или библиотеки ? У них вроде даже команды инициализации есть - с выводом фирмовой заставки или без. Если это только при подаче питания - нажмите ресет на процессоре и включите ваш девайс в питалово. И увидите фирмовую заставку - если она там есть.У меня в малюсеньком дисплейчике - точно была, похожая на крылья. И последнее ну и чем она вам мешает ?
     
    save.l нравится это.
  5. save.l

    save.l Гик

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

    parovoZZ Гуру

    код написан неправильно. Если устройство не ответит в период, когда процессор выполняет секцию Setup(), то как оно всё будет дальше работать?
    А артефакты - это нормально. Либо так запланировано, либо долго очищается статическая память. I2C же.
     
    Ariadna-on-Line нравится это.
  7. save.l

    save.l Гик

    вы про какой код?
    жаль если так конечно
     
  8. parovoZZ

    parovoZZ Гуру

    из первого поста
     
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну да. Дисплей щас - тотже процессор со встроенным ПО. Если в нем заложена неторопливая инициализация - он и будет медленно убирать сопли не реагируя ни на что. На дисплее что-то видно - если включена подсветка. А подсветка управляется аппаратно - без участия процессора дисплея - по сигналу на пине управления. Сделайте так чтобы по умолчанию подсветка была выключена. Или хост-проц в сетапе заставляйте её сразу выключать.
     
    Последнее редактирование: 24 мар 2025
    save.l нравится это.
  10. parovoZZ

    parovoZZ Гуру

    маловероятно. Скорее всего, матрица на ASIC.
    очистка памяти снаружи. После включения там мусор, ибо вся статическая память - D-триггеры.
     
    save.l нравится это.
  11. Ariadna-on-Line

    Ariadna-on-Line Гуру

    В дисплеях обычно память отдельно - экран отдельно. Команда
    LCD.clear () - очищает память. А чтоб эта чистота сдублировалась на экран - должна быть отдельная команда типа
    LCD.screen() или что-то подобное.
     
  12. parovoZZ

    parovoZZ Гуру

    Очистка памяти в дисплее - запись нулей по всем адресам. Это имеет смысл у тех дисплеев, которые допускают произвольный доступ к памяти. Отдельной команды, как правило, нет.
     
  13. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Продолжу тему. Делаю Бегущую строку на матрицах и MAX7219. С божьей и сообщества помощью сделал код. Все пучком, кроме одного - после подачи питания может с полчаса поработать безупречно. Потом либо погасает случайные одна или несколько матриц, либо включаются прожектором, либо неподвижные кракозябры зависают. При этом бегу текста это не мешает. После ресета - несколько секунд обязательно работает нормально, а дальше та же свистопляска. Видя эффект ресета на дисплей решил его "вписать". Но в библе нет такой функции. Дисплей инициализируется лишь единожды при старте класса. Тупо выдрал из библы то что касается аппаратной инициализации, и оформил в виде функции в в этой же библиотеке. Вставил ее вызов в цикл. Теперь при каждой итерации строки - пара секунд нормальной работы точно - и дальше непредсказуемо. Особого шума по питанию нет. Вот гадаю над чудом.
    ПС. Со стороны можно даже принять за развлекуху, но понять причину - надо.
     
    Последнее редактирование: 31 мар 2025
  14. ИгорьК

    ИгорьК Гуру

    Это комплексные косяки. Причин две с половиной: (1)питание, (2)нарушение контактов в соединении или в самом дисплее. Любых контактов.

    Следовательно, отдельные матрицы получают соответствующую команду, которую вы им не даете. А что дает? Питание или плохой контакт.

    Паяльник эффективнее.

    ---------------------

    У меня много этих матриц в устройствах. Некоторые работают много лет и никаких косяков. А некоторые просто глючат до того, что приходится все пропаивать. Один раз выбросил - ничего не помогало.

    Если совсем заморочиться, то осциллограф и ищем "что, где, когда". Но проще заменить.
     
    Последнее редактирование: 31 мар 2025
    Ariadna-on-Line нравится это.
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Заменить никогда не поздно. Пытаюсь понять какая конкретно команда реанимирует дисплей. Там в инициализации их - 6. Осциллограф косяков не видит. Все сигналы - в норме. Найду причину - отпишусь.
     
  16. ИгорьК

    ИгорьК Гуру

    Вы смотрите библиотеку? ИМХО, лучше смотреть страницу 7 даташита. Даже начинать со страницы 6.

    А какие косяки он должен увидеть? Надо понимать команды, что прилетают на конкретную МС и думать об них.
     
    Последнее редактирование: 31 мар 2025
  17. ИгорьК

    ИгорьК Гуру

    Вот оно:
    изображение_2025-04-01_074346003.png

    Первая матрица словила "правильные" данные в тест регистр. Третья матрица изменила яркость. Бывает, что матрица гаснет - Shutdown Mode.

    Возможно в момент ошибки в две другие матрицы "улетели" неправильные данные, но они были дальше переписаны.

    Все это не мешает работе в целом. Ну только тем, что на дисплее висит чушь :)

    В моем случае это какой-то импульс по питанию или наводка. Часы уже минут 10 так работают и ничего не меняется в поведении матриц. Ясный перец, непосредственно это выражается в комбинации состояний трех управляющих проводков.

    Словить это осциллографом не возможно, да, видимо и нет смысла, если только не возникает повторяющееся поведение конкретной матрицы. Но и в этом случае проблема будет в соединении или неисправности МС этой матрицы. Так что, паяльник или замена :)
     
    Последнее редактирование: 1 апр 2025
    Ariadna-on-Line нравится это.
  18. ИгорьК

    ИгорьК Гуру

    Теперь по инициализации. Псевдокод. Смотреть табличку 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 - единичка. Режим нормальной работы, а не угаснуть навеки.

    Потом во все матрицы можно отправить много ноликов, чтобы оно стало привычно серым.

    Вот и вся инициализация.

    Если указанные выше регистры словят нечто иное - матрица начинает вести себя весело и задорно. Как на фото.
     
    Последнее редактирование: 1 апр 2025
    Ariadna-on-Line нравится это.
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Согласен полностью. Однократная и единственная (при старте) инициализация периферии - чрезмерный оптимизм. Нашел-таки косяк. Все оказалось просто и загадочно. Плохой контакт +5в на разъёме модуля в середине строки - приводил к глюкам по всей строке. Обжал контакт - и все заработало.
    ПС. Вопрос - а че не вставите в код часов инициализацию матриц хотя бы раз в минуту ?
     
    ИгорьК нравится это.
  20. ИгорьК

    ИгорьК Гуру

    :) Как и ожидалось.

    Таки не нужно. Это эксцесс (прямо для этой темы) ;)
     
    Ariadna-on-Line нравится это.