Jump to content
svd

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

Recommended Posts

Нарисовалась у меня проблемка с модулем 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

Share this post


Link to post
Share on other sites
12 часов назад, Геннадий сказал:

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

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

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

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

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

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

Share this post


Link to post
Share on other sites
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 именно для цели быстрой проверки различных модулей, на которые у меня нет собственной библиотеки. И, поскольку я не программист, то такая проверка помогает решать проблемы и выявлять я ли накосячил в коде, или железка не пашет. Только вот с этим дисплеем я эту проверку сразу не сделал. Иначе бы вернул бы деньги за неработающий модуль

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

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

Share this post


Link to post
Share on other sites
15 минут назад, Геннадий сказал:

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

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

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

 

init_ssd1306_128x32.JPG

Share this post


Link to post
Share on other sites
7 минут назад, Геннадий сказал:

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

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

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

SSD1306.pdf TOL091G-12832X-1.pdf

Share this post


Link to post
Share on other sites
4 часа назад, svd сказал:

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

 

 

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

Share this post


Link to post
Share on other sites
43 минуты назад, fuckir сказал:

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
Posted (edited)
53 минуты назад, svd сказал:

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

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

res.jpg.237be4473a11be563dd065ff45ec2ac4.jpg

Edited by Геннадий

Share this post


Link to post
Share on other sites
4 минуты назад, Геннадий сказал:

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

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

spacer.png

Share this post


Link to post
Share on other sites
1 час назад, Геннадий сказал:

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

spacer.png

Общий вид модуля покрупнее. На всякий случай

Share this post


Link to post
Share on other sites
Только что, Геннадий сказал:

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

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

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

Share this post


Link to post
Share on other sites

Может проверить цепь сброса на шлейфе? Например, номинал резистора или емкость конденсатора.

Share this post


Link to post
Share on other sites
58 минут назад, Геннадий сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
14 часов назад, Геннадий сказал:

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

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

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

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

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

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

 

128x32_sch.JPG

Edited by svd

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • А я еще раз спрошу - как можно оценить звучание акустических систем по видео, снятому на телефон?  Как раз на Вашем видео бубнение, задраны высокие, и провалена середина. Ну как это можно оценить по видео????
    • Высокие цыкают и бас типа ящечный... просто вы привыкли к той интерференционной каше, которую даёт куча шириков на доске и отсутствие реального басового регистра. Ну да ладно, каждому свою. Ширики говорите... тогда винтажная классика жанра, "плоскомондый" коаксиал от Техникс, вот они дают реальный трёхмерный саунд не "пачкая его ящичным басом"...   
    • Помогите решить проблему не хватает напряжения в сети для сварки ручной электрод 2мм ,что посоветуете купить  номинал                   вес                   размер ЛАТР SUNTEK 500 ВА  3,5кг     135x132x150 ЛАТР SUNTEK 1000 ВА  6кг      158x182x207 или еще какие варианты , по бюджетнее . СПАСИБО. еще сварка не инверторная     
    • @blackbird62 Норм. не пугайтесь.У вас бОлее правильный ТВЗ ,чем с симметричной(полукольцами) обмоткой. Причём если лампы у вас не очень подобраны,как раз перестановкой их в плече можете и отыграть некоторый разброс в лампах. -------------------- Сколько сейчас они стоят ?
    • Точно,у меня с женой с этого начиналось,в 23 мне после армии и ей 18 почти после школы,но как то вот уже более 25 лет вместе 
    • Я тестером на прозвонке проверяю,а те что спаренные и более конечно через блок питания, с резистором,но вот так чтоб с сетью напрямую,мне в голову и не пришло,может уже часто ранее трясло нечаенно 
    • Ждем готовое изделие, желательно фото
  • Покупай!

×
×
  • Create New...