u8g2lib и OLED SSD1306 128x64

Morroc
Offline
Зарегистрирован: 24.10.2016

Использовал кто нибудь такую комбинацию ? Решил перейти с u8g (без 2) и вылезла такая бяка - первый пиксел дисплея по X почему то идет как 2й в программе ( setCursor(2, ...) ) а две последние колонки дисплея не очищаются от мусора даже когда вручную заполняю буфер и делаю sendBuffer. Может кто уже сталкивался и подскажет как лечить ? 

b707
Offline
Зарегистрирован: 26.05.2017

Morroc пишет:

Может кто уже сталкивался и подскажет как лечить ? 

взять другую библиотеку. Или написать свою.

Morroc
Offline
Зарегистрирован: 24.10.2016

У этой огромная куча шрифтов в комплекте, в том числе с кириллицей, не надо их искать отдельно и как то прикручивать. Первая версия без глюков работала.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Morroc пишет:

Использовал кто нибудь такую комбинацию ? Решил перейти с u8g (без 2) и вылезла такая бяка - первый пиксел дисплея по X почему то идет как 2й в программе ( setCursor(2, ...) ) а две последние колонки дисплея не очищаются от мусора даже когда вручную заполняю буфер и делаю sendBuffer. Может кто уже сталкивался и подскажет как лечить ? 

Да, есть такая беда у OLED с SSD1306

Инициализируете дисплей как? Вы не разрешение ни тип дисплея не написали, ни интерфейс.

Поэтому могу сказать только попробуйте инициализировать как

U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);       // same as the NONAME variant, but may solve the "every 2nd line skipped" problem

Это для I2C 128х64, если у вас другой найдите в примерах строку инициализации с комментарием - "but may solve the "every 2nd line skipped" problem" под ваш дисплей.

А чтобы вообще таких вопросов не возникало то содлиданен с b707

b707 пишет:

написать свою.

Morroc
Offline
Зарегистрирован: 24.10.2016

На все железо не напишешься, тем более вспомогательное типа дисплея, есть занятия поинтереснее ) Думал может общая какая проблема. Спасибо, попробую другой вариант инициализации, там подходящих к 128x64 SPI оказывается больше, чем я думал. Я же просто ткнул вместо u8g новую u8g2 с той же инициализацией, особо не ковырял и вылезла такая засада.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Morroc пишет:

На все железо не напишешься, тем более вспомогательное типа дисплея, есть занятия поинтереснее ) Думал может общая какая проблема. Спасибо, попробую другой вариант инициализации, там подходящих к 128x64 SPI оказывается больше, чем я думал. Я же просто ткнул вместо u8g новую u8g2 с той же инициализацией, особо не ковырял и вылезла такая засада.

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

Morroc
Offline
Зарегистрирован: 24.10.2016

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

 

Помогло проинициализировать как SH1106 oO

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот у SH1106 как раз обычно бывает сдвижка на 2 пиксела. Если у 1306 ширина строки 128 пикселей, то у 1106 - 132. А там уж как китаец распаяет.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

andriano пишет:

Вот у SH1106 как раз обычно бывает сдвижка на 2 пиксела. Если у 1306 ширина строки 128 пикселей, то у 1106 - 132. А там уж как китаец распаяет.

От оно как, а инициализация у них получается одинаковая?
Можно както определить программно или визуально какой чип стоит SH1106 или SSD1306?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Визуально, наверное при помощи лупы можно что-нибудь прочитать на корпусе.

А программно - надо смотреть оба дэйташита. Я, когда делал библиотеку, попытался команды в основном свести к общему знаменателю (т.е. если один не поддерживает какой режим или команду, то не использовать на обоих), а насчет смещения пикселей, как обычно, в зависимости от константы, установленной дефайном. Если пользователь неправильно установил - сам дурак. :)

krepton85
Offline
Зарегистрирован: 02.02.2016

Помогите решить проблему с дисплеем SSD1306 128х64 подключен по I2C аппаратной (HW) к МК STM32F103 с помощью библиотеки u8g2lib.

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

Дисплей отображает почему то только первых 8 строк, если я в библиотеке выбираю софт I2c (SW).

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

То дисплей замечательно работает (но медленно) , но почему то только на пинах HW i2c (SCL - PB6, SDA - PB7), пробовал выбирать на других - не работает .

Логический анализатор показывает, что с HW i2c данные для 1-ого кадра передаются не полностью, в отличии от SW i2c. Как буд то бы где то "забивает" буфер с данными и не хочет его очищать для HW i2c. 

Эта библиотека на AVR микроконтроллерах работала замечательно, а на ARM такой косяк.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. 64 пискеля в высоту - это и есть 8 строк текста размера 6х8.

2. Библиотека STM32 поддерживает только две скорости i2c: 100 и 400 кГц, причем любая попытка выставить что-то другое стабильно приводит к частоте 100 кГц.

3. Собственно, использование хардверного интерфейса, а не его софтверной эмуляции - наиболее правильное решение. Делая что-то другое, нужно очень хорошо себе представлять, для чего это делается.

4. Буфер i2c составляет 32 байта. Учитывая, что часть его уходит на заголовок, реально блок данных на дисплей оказывается короче. Я передаю по 16 байтов данных.

5. Никто не гарантирует работоспособность библиотеки, написанной для одного контроллера, на другом контроллере.

 

krepton85
Offline
Зарегистрирован: 02.02.2016

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 МК.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

3. К сожалению, в Вашем сообщении №10 на этот счет противоречивая информация.

У меня проблем с SSD1306 не наблюдалось ни с AVR, ни с SAM3, ни с STM32, но я пользуюсь для экранов исключительно собственными библиотеками.

Кстати, что значит "данные для 1-го кадра" и "не полностью" - это сколько?

krepton85
Offline
Зарегистрирован: 02.02.2016

Вот смотрите сами https://yadi.sk/d/sF714HfUztt-Vw логи для сравнения между SW и HW подключением, использовался стандартный скетчь из примеров для этой библиотеки "U8G2Logo" только код из void loop перенес в void setup, что бы картинка была статичной, так легче в логическом анализаторе отслеживать, только 1 кадр.