u8g2lib и OLED SSD1306 128x64
- Войдите на сайт для отправки комментариев
Ср, 13/06/2018 - 01:21
Использовал кто нибудь такую комбинацию ? Решил перейти с u8g (без 2) и вылезла такая бяка - первый пиксел дисплея по X почему то идет как 2й в программе ( setCursor(2, ...) ) а две последние колонки дисплея не очищаются от мусора даже когда вручную заполняю буфер и делаю sendBuffer. Может кто уже сталкивался и подскажет как лечить ?
Может кто уже сталкивался и подскажет как лечить ?
взять другую библиотеку. Или написать свою.
У этой огромная куча шрифтов в комплекте, в том числе с кириллицей, не надо их искать отдельно и как то прикручивать. Первая версия без глюков работала.
Использовал кто нибудь такую комбинацию ? Решил перейти с u8g (без 2) и вылезла такая бяка - первый пиксел дисплея по X почему то идет как 2й в программе ( setCursor(2, ...) ) а две последние колонки дисплея не очищаются от мусора даже когда вручную заполняю буфер и делаю sendBuffer. Может кто уже сталкивался и подскажет как лечить ?
Да, есть такая беда у OLED с SSD1306
Инициализируете дисплей как? Вы не разрешение ни тип дисплея не написали, ни интерфейс.
Поэтому могу сказать только попробуйте инициализировать как
Это для I2C 128х64, если у вас другой найдите в примерах строку инициализации с комментарием - "but may solve the "every 2nd line skipped" problem" под ваш дисплей.
А чтобы вообще таких вопросов не возникало то содлиданен с b707
написать свою.
На все железо не напишешься, тем более вспомогательное типа дисплея, есть занятия поинтереснее ) Думал может общая какая проблема. Спасибо, попробую другой вариант инициализации, там подходящих к 128x64 SPI оказывается больше, чем я думал. Я же просто ткнул вместо u8g новую u8g2 с той же инициализацией, особо не ковырял и вылезла такая засада.
На все железо не напишешься, тем более вспомогательное типа дисплея, есть занятия поинтереснее ) Думал может общая какая проблема. Спасибо, попробую другой вариант инициализации, там подходящих к 128x64 SPI оказывается больше, чем я думал. Я же просто ткнул вместо u8g новую u8g2 с той же инициализацией, особо не ковырял и вылезла такая засада.
Ну так то да, просто у меня нет поинтереснее занятий :-) сидел както разбирался с дисплееем, задача была как можно больше памяти сэкономить, скорость вывода для меня не важна, ну и еще много чего не нужно из стандартных библиотек.
А это и есть общая проблема, поэтому и сделали 2 разных инициализации :-)
По описанию проблема не совсем такая, у меня не пропускает строки, просто все как будто сдвинуто за левую границу дисплея на пару пикселов, может не с того адреса начинает в память дисплея буфер загонять. Но один из альтернативных вариантов инициализации, надеюcь, подойдет.
Помогло проинициализировать как SH1106 oO
Вот у SH1106 как раз обычно бывает сдвижка на 2 пиксела. Если у 1306 ширина строки 128 пикселей, то у 1106 - 132. А там уж как китаец распаяет.
Вот у SH1106 как раз обычно бывает сдвижка на 2 пиксела. Если у 1306 ширина строки 128 пикселей, то у 1106 - 132. А там уж как китаец распаяет.
От оно как, а инициализация у них получается одинаковая?
Можно както определить программно или визуально какой чип стоит SH1106 или SSD1306?
Визуально, наверное при помощи лупы можно что-нибудь прочитать на корпусе.
А программно - надо смотреть оба дэйташита. Я, когда делал библиотеку, попытался команды в основном свести к общему знаменателю (т.е. если один не поддерживает какой режим или команду, то не использовать на обоих), а насчет смещения пикселей, как обычно, в зависимости от константы, установленной дефайном. Если пользователь неправильно установил - сам дурак. :)
Помогите решить проблему с дисплеем SSD1306 128х64 подключен по I2C аппаратной (HW) к МК STM32F103 с помощью библиотеки u8g2lib.
Дисплей отображает почему то только первых 8 строк, если я в библиотеке выбираю софт I2c (SW).
То дисплей замечательно работает (но медленно) , но почему то только на пинах HW i2c (SCL - PB6, SDA - PB7), пробовал выбирать на других - не работает .
Логический анализатор показывает, что с HW i2c данные для 1-ого кадра передаются не полностью, в отличии от SW i2c. Как буд то бы где то "забивает" буфер с данными и не хочет его очищать для HW i2c.
Эта библиотека на AVR микроконтроллерах работала замечательно, а на ARM такой косяк.
1. 64 пискеля в высоту - это и есть 8 строк текста размера 6х8.
2. Библиотека STM32 поддерживает только две скорости i2c: 100 и 400 кГц, причем любая попытка выставить что-то другое стабильно приводит к частоте 100 кГц.
3. Собственно, использование хардверного интерфейса, а не его софтверной эмуляции - наиболее правильное решение. Делая что-то другое, нужно очень хорошо себе представлять, для чего это делается.
4. Буфер i2c составляет 32 байта. Учитывая, что часть его уходит на заголовок, реально блок данных на дисплей оказывается короче. Я передаю по 16 байтов данных.
5. Никто не гарантирует работоспособность библиотеки, написанной для одного контроллера, на другом контроллере.
1. речь идет не о текстовых строках, а о пиксельных.
2. SW i2c u8g2lib работает на частоте близкой к 100кГц (70 кГц), HW работает на частоте 400кГц.
3. как раз таки проблема с HW i2c, а не SW. Да, мне бы тоже очень хотелось HW i2c, что бы работал.
4. да, это тоже знаю, и на AVR было 32байта буфер i2c, но все работало отлично.
5. Ну видимо придется переписывать скетчь под Adafruit GFX библиотеку для SSD1306, она оперативки больше требует и ROM памяти занимает больше, хотя на STM32 это не так критично как для AVR МК.
3. К сожалению, в Вашем сообщении №10 на этот счет противоречивая информация.
У меня проблем с SSD1306 не наблюдалось ни с AVR, ни с SAM3, ни с STM32, но я пользуюсь для экранов исключительно собственными библиотеками.
Кстати, что значит "данные для 1-го кадра" и "не полностью" - это сколько?
Вот смотрите сами https://yadi.sk/d/sF714HfUztt-Vw логи для сравнения между SW и HW подключением, использовался стандартный скетчь из примеров для этой библиотеки "U8G2Logo" только код из void loop перенес в void setup, что бы картинка была статичной, так легче в логическом анализаторе отслеживать, только 1 кадр.