Перейти к содержанию

SSD1306 128x32 I2C проблема с подключением


Рекомендуемые сообщения

Нарисовалась у меня проблемка с модулем 128х32 I2C.
Колупаюсь второй день. Вначале думал проблема в моём коде, но по факту пришел к выводу, что проблема в самом модуле.
Итак, по-порядку...
МК - ATtiny45.
Драйвер USI_TWI интерфейса взят из AN AVR310.
Начальные строчки в хидере выглядят так (полный код во-вложении)

// Defines controlling timing limits
#define TWI_FAST_MODE

//max Fck/2
#define SYS_CLK   4000.0  // [kHz]
//#define SYS_CLK   1000.0  // [kHz]     ATtiny2313

#ifdef TWI_FAST_MODE               // TWI FAST mode timing limits. SCL = 100-400kHz
  #define T2_TWI    ((SYS_CLK *1300) /1000000) +1 // >1,3us
  #define T4_TWI    ((SYS_CLK * 600) /1000000) +1 // >0,6us
 
#else                              // TWI STANDARD mode timing limits. SCL <= 100kHz
  #define T2_TWI    ((SYS_CLK *4700) /1000000) +1 // >4,7us
  #define T4_TWI    ((SYS_CLK *4000) /1000000) +1 // >4,0us
#endif

// Defines controling code generating
//#define PARAM_VERIFICATION
//#define NOISE_TESTING
#define SIGNAL_VERIFY

//USI_TWI messages and flags and bit masks
//#define SUCCESS   7
//#define MSG       0

Проблема в следующем. При подаче питания МК стартует и работает, согласно кода. Но при этом на дисплее ничего не отображается. Если произвести внешний сброс микроконтроллера, то все отлично выводится на дисплей. Цепь сброса МК содержит подтягивающий резистор 10 кОм, конденсатор 1 мкФ (установлен на случай медленно поднимающегося питания) и диода. Все согласно даташита.
Инициализация дисплея ориентирована именно на индикатор 128х32. Я эти нюансы знаю и даташит имеется.
При этом, если подключаю модуль 128х64, то все прекрасно работает. При чем что в режиме 128х32, что в режиме 128х64. Только в режиме 128х32 изображение выводится через строчку и поэтому выглядит растянутым по вертикали.
У меня только два соображения:
1) либо схема включения отличается и нет какого-то "важного" элемента на модуле 128х32;
2) либо модуль дефектный сам по себе. Но почему тогда он адекватно и стабильно запускается при внешнем сбросе МК без снятия питания, а при подаче питания, наоборот, не запускается?

Модуль бренда DM с маркировкой OLED-091
Есть адрес http://www.diymore.cc
Но инфы я там не нашел. Только ценники на товар.

Предвидя вопросы, добавлю инициализацию для 128х32

0xAE, // Выключить дисплей
 
0xD5, // Настройка частоты обновления дисплея
0x80,
///+----- делитель 0-F/ 0 - деление на 1
//+------ частота генератора. по умочанию 0x80
0xA8, // Установить multiplex ratio
0x1F, // 1/64 duty (значение по умолчанию), 0x1F - 128x32, 0x3F - 128x64
 
0xD3, // Смещение дисплея (offset)
0x00, // Нет смещения
 
0x40, // Начала строки начала разверки 0x40 с начала RAM
 
0x8D, // Управление внутреним преобразователем
0x14, // 0x10 - отключить (VCC подается извне) 0x14 - запустить внутрений DC/DC
 
0x20, // Режим автоматической адресации
0x00, // 0-по горизонтали с переходом на новую страницу (строку)
      // 1 - по вертикали с переходом на новую строку
      // 2 - только по выбранной странице без перехода
 
0xA1, // Режим разверки по странице (по X)
      // A1 - нормальный режим (слева/направо) A0 - обратный (справа/налево)
 
0xC8, // Режим сканирования озу дисплея
      // для изменения системы координат
      // С0 - снизу/верх (начало нижний левый угол)
      // С8 - сверху/вниз (начало верний левый угол)
0xDA, // Аппаратная конфигурация COM
0x02, // 0x02 - 128x32, 0x12 - 128x64
 
0x81, // Установка яркости дисплея
0xСF, // 0x8F..0xCF
 
0xD9, // Настройка фаз DC/DC преоразователя
0xF1, // 0x22 - VCC подается извне / 0xF1 для внутренего
 
0xDB, // Установка уровня VcomH
0x40, // Влияет на яркость дисплея 0x00..0x70
 
0xA4, // Режим нормальный
 
0xA6, // 0xA6 - нет инверсии, 0xA7 - инверсия дисплея
 
0xAF  // Дисплей включен

 

USI_TWI_Master_AVR310.zip

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, Геннадий сказал:

Сброс дисплея производите? Паузу после сброса (перед инициализацией) делаете?

У контроллера по даташиту нет команды сброса. Порядок инициализации я привел выше. Поэтому никакой паузы я не делаю, кроме задержки 64мс при старте самого микроконтроллера (определено фузе битами).

Сегодня удалось взять у кума такой же дисплей 128х32. Мой выполнен на плате с черной маской и маркировкой OLED-091, у кума модуль на синей платке.
Ну и самое интересное, дисплей на синей плате работает как надо. Все-таки проблема в железяке. Работа обоих железяк проверена как на моей макетке и с моим кодом, так и на платке arduino uno с примером из библиотеки adafruit. На платформе arduino такая же проблема с моим дисплеем, не стартует сразу после подачи питания, после Reset все запускается.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

8 минут назад, svd сказал:

...Поэтому никакой паузы я не делаю, кроме задержки 64мс при старте самого микроконтроллера (определено фузе битами).

Так сделайте. Выставьте линии порта в исходное состояние и сделайте паузу. 

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

43 минуты назад, Геннадий сказал:

Так сделайте. Выставьте линии порта в исходное состояние и сделайте паузу. 

Хорошо, поскольку у меня мк ATtiny45 сейчас стоит на макетке, то я использую интерфейс USI. При его инициализации вначале идет инициализация самого порта согласно AN AVR310

  PORT_USI |= (1<<PIN_USI_SDA);           // Enable pullup on SDA, to set high as released state.
  PORT_USI |= (1<<PIN_USI_SCL);           // Enable pullup on SCL, to set high as released state.
  
  DDR_USI  |= (1<<PIN_USI_SCL);           // Enable SCL as output.
  DDR_USI  |= (1<<PIN_USI_SDA);           // Enable SDA as output.

Я попробовал после этих строчек поставить задержку в 500 мс, попробовал добавить установку в ноль этих линий порта. Толку нет никакого. Потому, как проблема явно не программная, а проблема конкретной платы модуля. Я же выше написал, что протестировал дисплей на базе платы ардуино. И на ней такая же проблема. Я не пользуюсь ардуино, о прикупил платку UNO именно для цели быстрой проверки различных модулей, на которые у меня нет собственной библиотеки. И, поскольку я не программист, то такая проверка помогает решать проблемы и выявлять я ли накосячил в коде, или железка не пашет. Только вот с этим дисплеем я эту проверку сразу не сделал. Иначе бы вернул бы деньги за неработающий модуль

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Мне думается проблема именно программная. Чем отличается старт при подаче питания и при Reset-e MK? Наличием напряжения питания! Что-то у Вас с инициализацией дисплея не так (не учитываете переходные процессы в нем). Иногда требуются паузы между командами. Лучший способ - найти даташит или чей-то рабочий пример.

Ссылка на комментарий
Поделиться на другие сайты

15 минут назад, Геннадий сказал:

 Лучший способ - найти даташит или чей-то рабочий пример.

Даташит есть. Привожу картинку с него. Ни каких задержек там нет. Все задержки определены скоростью работы самой шины USI. А я ее пробовал от нормальной работы, до тормознутой для тини2313. Толку ноль.

Да и опять же, при чем тут мой код, если дисплей не дружит даже с библиотеками ардуины? 

 

init_ssd1306_128x32.JPG

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, Геннадий сказал:

Киньте весь даташит.

У меня их несколько. Самый полный SSD1306.pdf

Пример инициализации для дисплея 128х32 я привел из файла TOL091G-12832X-1.pdf

SSD1306.pdf TOL091G-12832X-1.pdf

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, svd сказал:

Даташит есть. Привожу картинку с него. Ни каких задержек там нет. У контроллера по даташиту нет команды сброса... 

 

 

Читайте внимательнее свой док. И сброс нужно делать, там это конкретно написано, ну и тайминги, соответственно, соблюдать

В поисках работы..

Looking for job

Ссылка на комментарий
Поделиться на другие сайты

43 минуты назад, fuckir сказал:

Читайте внимательнее свой док. И сброс нужно делать, там это конкретно написано, ну и тайминги, соответственно, соблюдать

Вам сложно показать то место в даташите, о котором Вы говорите? И какие конкретно тайминги? Тайминги шины I2C или некие тайминги при передаче команд контроллеру SSD1306?

Я привел и свою инициализацию, и блок-схему инициализации из даташита. Что я там пропустил?

И, повторюсь в N-й раз, дисплей неадекватно работает даже с готовыми библиотеками ардуины!

PS. Давайте так. От Вас точные инструкции где и что проверить в коде. По факту я перепишу код под Ваше разумение. И тогда либо я признаю, что я осёл и проглядел очевидное, либо будем с Вами на пару удивляться, где баг зарыт в этой железке.

PS2. И как сделать RESET, если интерфейс I2C и вывод #RES физически недоступен?

 

Ссылка на комментарий
Поделиться на другие сайты

53 минуты назад, svd сказал:

PS2. И как сделать RESET, если интерфейс I2C и вывод #RES физически недоступен?

Это Вам сказал кто-то или сами додумались?

res.jpg.237be4473a11be563dd065ff45ec2ac4.jpg

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Геннадий сказал:

Это Вам сказал кто-то или сами додумались?

Не смешно. В сети есть подобная схема. Видно, что RESET привязан к питанию. И кроме как передергиванием питания эту ногу не достать. 

spacer.png

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Геннадий сказал:

Почему из Вас нужно вытягивать информацию по крупинкам? У Вашего LCD шлейф 4-пиновый?

Я удивляюсь просто....

В самом первом моём сообщении, первое предложение: "Нарисовалась у меня проблемка с модулем 128х32 I2C" я явно указал тип подключения индикатора.

I2C бывает трехпроводным??? Питание не в счет.

Естественно 4 пиновый разъем, который содержит выводы GND, VDD, SDA, SCK.

PS. я тут на телефон видео записал, как стартуют два дисплея, включенные параллельно. Не знаю как видео прикрепить пока. Разберусь - выложу ролик. Там старт дисплеев наглядно виден 

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

А ля Спилберг...

Модули подключены параллельно. Нижний - это как раз тот дисплей, чо я взял у кума. Верхний - мой подопытный. 

Ссылка на комментарий
Поделиться на другие сайты

Я тоже удивляюсь. Вы реально считаете, что форумчане отложат свои дела и бросятся в Интернет собирать инфу по Вашему модулю? Хотите развернутого ответа, выкладывайте полную информацию о проблеме, а не только "собака, не работает как надо!". Обратите внимание на библиотеку Adafruit_SSD1306. Там есть что-то типа "Adafruit_SSD1306 display(OLED_RESET);". Значит при отсутствии аппаратного сброса есть программный.

Ссылка на комментарий
Поделиться на другие сайты

Только что, Геннадий сказал:

Значит при отсутствии аппаратного сброса есть программный.

Да в ардуине может быть что угодно. Я не знаю, как работает пример из библиотеки Adafruit, но мой дисплей там инициализируется спустя минимум 3 секунды, второй же откликается мгновенно. Я не знаю, как работает библиотека. И опыта нет, чтобы разобраться в чужом коде, тем более на плюсах, у меня нет. Но в даташите нет команды сброса. Это я перепроверял много раз.

Но даже если и есть костыли, чтобы заставить его сбросится,  меня не устраивает столь долгая инициализация отображения. Если он с дефектом, или, что смешнее, там подделка контроллера SSD1306, то проще выкинуть  его и заказать другой. Жаль только потерянного времени. 

Ссылка на комментарий
Поделиться на другие сайты

58 минут назад, Геннадий сказал:

Может проверить цепь сброса на шлейфе? 

Это проблематично. Схема, что я привел, актуальна для дисплея 128x64. И то, номиналы элементов китайцы могут переиграть.

Шлейф же дисплея 128*32 содержит 14 выводов, а не 30, как на схеме. Вызвонить который из них RESET вряд ли с ходу получится. Хотя общий принцип подключения такой же. На плате есть стабилизатор, есть 2 подтягивающих резистора. Явно есть мелкий диод. Дальше 7 конденсаторов и пара резисторов. И все. Даже нет перемычки для смены адреса

1 час назад, Геннадий сказал:

Попробуйте запустить так.

Напрямую привязать код ардуины к себе в проект не смогу, но постараюсь докопаться, что за сброс дисплея они лепят. Спасибо за ссылку! Мне она не попалась при поиске решения проблемы в интернете.

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Геннадий сказал:

Может проверить цепь сброса на шлейфе? 

Все-таки с утра пришел к мысли, что без изучения цепи сброса не обойтись никак. Но я не стал с ходу ее вызванивать, а, вначале, решил проверить напряжение на выводе RES# и сравнить его с рабочим дисплеем, взятым у кума. Но так как я не знал пока какой вывод шлейфа отвечает за сброс, то пришлось искать хоть какую-нибудь схему. Такой схемой стала общедоступная от паяльника TS100. Только цепь сброса отличалась и была аналогично, как на выше приведенной схеме. И состояла из резистора, диода и конденсатора.

Так вот! сразу скажу, ГРЁБАНЫЕ КИТАЙЦЫ!!!!!!  Тут мат уместен, но боюсь не простят....

Проблема, как и предполагал, оказалась 100% железнячная. Подключив вольтметр в цепь сброса (пардон, осциллографа нет) я увидел офигительно медленное нарастание напряжения в цепи сброса. Сразу родилась догадка, что производитель на плате тупо поменял местами два резистора: подтягивающий к питанию 4,7 кОм для цепи сброса и 560 кОм в цепи IREF. Пришлось нудно и аккуратно прозванивать подключение всех резисторов на плате. Догадка оказалась верной. После перепайки дисплей стал работать адекватно. Единственное, яркость дисплея меньше, чем у взятого у кума. Я не знаю с чем это связано. Возможно сам по себе дисплей такой, может он вообще БУ (ну хз какие они паяют на модули ардуин, а, возможно, и неправильное подключение на него повлияло.

Ну и в заключении, схема подключения дисплея.

Так, что, если кто купит подобный дисплей бренда DM и маркировкой OLED-091 и, если, он сразу не запустится, то решение проблемы Вы уже знаете

 

128x32_sch.JPG

Изменено пользователем svd
Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Здравствуйте, поделитесь пожалуйста кто-нибудь готовой библиотекой для дисплея ssd1306 с подлючением по i2c к авр (только не для ардуино). Весь интернет уже облазил, есть только для ардуино и для подлючения по spi. Пробывал spi под i2c переделывать, ничего не вышло. Единственый код который для i2c нашёл у меня не работает. Я уже замучился с этим дисплеем(. Помогите пожалуйста, буду очень благодарен

Ссылка на комментарий
Поделиться на другие сайты

04.05.2020 в 16:26, NIKE сказал:

Я уже замучился с этим дисплеем

Изучаем язык, на котором пишете и даташит на МК, для которого пишите. И никаких мучений не будет...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...