Смещение по X на OLED SSD1306 баг?

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Прорезались зубы
Сообщения: 215
Зарегистрирован: Пн ноя 14, 2011 22:48:42

Сообщение zombie47 »

Заказываю эти дисплейчики (1.3" OLED Module 1.3 inch Display Module White/Blue 128X64SPI/IIC I2C ) уже давно. Так же давно заметил толи баг, толи не правильно инициализирую.
Причем я использовал разные библиотеки, и все время этот баг.

Код: Выделить всё

 status += ssd1306_WriteCommand(hi2c, 0xAE);   // Display off
    status += ssd1306_WriteCommand(hi2c, 0x20);   // Set Memory Addressing Mode
    status += ssd1306_WriteCommand(hi2c, 0x10);   // 00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
    status += ssd1306_WriteCommand(hi2c, 0xB0);   // Set Page Start Address for Page Addressing Mode,0-7
    status += ssd1306_WriteCommand(hi2c, 0xC0);   //Set COM Output Scan Direction    //C0 or C8 mirror  vertical
    status += ssd1306_WriteCommand(hi2c, 0x00);   // Set low column address
    status += ssd1306_WriteCommand(hi2c, 0x10);   // Set high column address
    status += ssd1306_WriteCommand(hi2c, 0x40);   // Set start line address
    status += ssd1306_WriteCommand(hi2c, 0x81);   // set contrast control register
    status += ssd1306_WriteCommand(hi2c, 0xFF);
    status += ssd1306_WriteCommand(hi2c, 0xA0);   //--set segment re-map 0 to 127  // A1 or A0 mirror horizontal
    status += ssd1306_WriteCommand(hi2c, 0xA6);   // Set normal display

    status += ssd1306_WriteCommand(hi2c, 0xA8);   // Set multiplex ratio(1 to 64)
    status += ssd1306_WriteCommand(hi2c, SSD1306_HEIGHT - 1); //0x3F

    status += ssd1306_WriteCommand(hi2c, 0xA4);   // 0xa4,Output follows RAM content;0xa5,Output ignores RAM content
    status += ssd1306_WriteCommand(hi2c, 0xD3);   // Set display offset
    status += ssd1306_WriteCommand(hi2c, 0x00);   // No offset
    status += ssd1306_WriteCommand(hi2c, 0xD5);   // Set display clock divide ratio/oscillator frequency
    status += ssd1306_WriteCommand(hi2c, 0xF0);   // Set divide ratio
    status += ssd1306_WriteCommand(hi2c, 0xD9);   // Set pre-charge period
    status += ssd1306_WriteCommand(hi2c, 0x22);

    status += ssd1306_WriteCommand(hi2c, 0xDA);   // Set com pins hardware configuration
    status += ssd1306_WriteCommand(hi2c, SSD1306_COM_LR_REMAP << 5 | SSD1306_COM_ALTERNATIVE_PIN_CONFIG << 4 | 0x02);   

    status += ssd1306_WriteCommand(hi2c, 0xDB);   // Set vcomh
    status += ssd1306_WriteCommand(hi2c, 0x20);   // 0x20,0.77xVcc
    status += ssd1306_WriteCommand(hi2c, 0x8D);   // Set DC-DC enable
    status += ssd1306_WriteCommand(hi2c, 0x14);   //
    status += ssd1306_WriteCommand(hi2c, 0xAF);   // Turn on SSD1306 panel
Например вот инициализация.
В таком случае есть смещение на 2 пикселя по горизонтали влево.
То-есть по Х первые два ряда пикселей как бы за экраном.
Но зато справа по X два ряда дополнительных пикселей, но они мусорные, в них нельзя рисовать.
Мне приходится изголятся, пишу в настройках хеадера что у меня ширина дисплея 130 пикселей.
и рисую квадрат например вот так:
Draw_Rectangle(2, 0, 129, 63, NOFILL, White, SQUARE);
ну то-есть рисую по Х с 2 до 129 , а не с 0 по 127 как хотелось бы правильно.
Ну и текст соответственно тоже приходится размещать с учетом этого смещения.
Что за смещение? Кто сталкивался? В чем может быть косяк?
photo_2024-06-09_03-35-43.jpg
(208.69 КБ) 124 скачивания
photo_2024-06-09_03-34-21.jpg
(209.94 КБ) 106 скачиваний
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1840
Зарегистрирован: Вт мар 28, 2023 21:17:15
Откуда: Universe

Сообщение Mursik »

А может там камень SH1106?
I have a dream...¯\_(ツ)_/¯
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Лень вникать, но вы уверены, что дисплей на SSD1306. Очень много в продаже именно 1.3" дисплеев на SH1106 а у них разводка сделана так, что первые 2 пикселя (и 2 последних, хотя это не имеет значения) не подключены. Поэтому самый левый пиксель имеет адрес не 0, а 2.

гуглите такой запрос: difference between ssd1306 and sh1106
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="zombie47",url="/forum/viewtopic.php?p=4589112#p4589112"]Кто сталкивался?[/uquote]
Я сталкивался ))
https://www.radiokot.ru/forum/viewtopic ... 8&t=190542
пульт.JPG
(190.56 КБ) 107 скачиваний
подключение к компу.jpg
(150.03 КБ) 88 скачиваний
да, действительно... первые два пикселя почему то не работают...
когда пишу приходится смещать курсов на два пикселя...

Код: Выделить всё

/////////////////////////////////////////////// курсор: 
// 128x64 = 1024 байт: цифра 5 + пробел 1 = 6 байт. 128/6=21 цифры/строка +2.
void kursor(char Page) //Set Page Address 
{
PORTB.5=0;         // D/C. 0 – Function, 1 – data. OLED 128x64   
SPDR=0b10110000|Page;  while(!(SPSR & (1<<7))); // Y - адрес 1011xxxx
SPDR=0b00010000;       while(!(SPSR & (1<<7))); // X - адрес 0001xxxx Hig

SPDR=0b00000010;  while(!(SPSR & (1<<7))); // X - адрес 0000xxxx Low (Начальное 2). // SH1106
//SPDR=0b00000000;  while(!(SPSR & (1<<7))); // X - адрес 0000xxxx Low (Начальное 0).// HDG12864F-1
PORTB.5=1;         // D/C. 0 – Function, 1 – data. OLED 128x64   
}
причём это только у контроллера SH1106
а контроллер HDG12864F-1 работает нормально, без смещения...
:dont_know:

библиотеки я никакие не использую... я всё сам пишу))

Код: Выделить всё

/////////////////////////////////////////////////////////// Режим OLED 128x64 -SH1106:
PORTB.7=0;         // SS OLED 128x64   
PORTB.5=0;         // D/C. 0 – Function, 1 – data. OLED 128x64      
SPDR=0xA8; while(!(SPSR & (1<<7))); // сколько строк будет использовано. 
SPDR=0x3F; while(!(SPSR & (1<<7))); // (128x64) 64 - строки. 
SPDR=0x81; while(!(SPSR & (1<<7))); // контрастность. 
SPDR=kontr; while(!(SPSR & (1<<7)));// контрастность 0...255. -начальное 250.
SPDR=0xA1; while(!(SPSR & (1<<7))); // развёртка слева направо (>>). 
/////////////////////////////////////////////////////////////////////////////// 
SPDR=0xC8; while(!(SPSR & (1<<7))); // развертка сверху вниз.  // SH1106
//SPDR=0xC0; while(!(SPSR & (1<<7)));// развертка снизу вверх.   // HDG12864F-1
/////////////////////////////////////////////////////////////////////////////// 
SPDR=0xDA; while(!(SPSR & (1<<7))); // развертка. 
SPDR=0x12; while(!(SPSR & (1<<7))); // прогрессивная. 
SPDR=0xD3; while(!(SPSR & (1<<7))); // смещение. 
SPDR=0x00; while(!(SPSR & (1<<7))); // смещение 0.
SPDR=0x40; while(!(SPSR & (1<<7))); // 01xx xxxx - начальное строка 0.
SPDR=0xAF; while(!(SPSR & (1<<7))); // Display 0xAF - ON.  
//SPDR=0xAE; while(!(SPSR & (1<<7))); // Display 0xAE - OFF.
PORTB.5=1;         // D/C. 0 – Function, 1 – data. OLED 128x64      
PORTB.7=1;         // SS OLED 128x64   
а я думал это только у меня фигня такая)) оказывается нет...
[uquote="zombie47",url="/forum/viewtopic.php?p=4589112#p4589112"]В чем может быть косяк?[/uquote]
Заводской брак))
Китайцы...
:tea:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 215
Зарегистрирован: Пн ноя 14, 2011 22:48:42

Сообщение zombie47 »

Лень вникать, но вы уверены, что дисплей на SSD1306. Очень много в продаже именно 1.3" дисплеев на SH1106 а у них разводка сделана так, что первые 2 пикселя (и 2 последних, хотя это не имеет значения) не подключены. Поэтому самый левый пиксель имеет адрес не 0, а 2.
Ну конечно не уверен))) Как тут можно быть уверенным. В принципе ответ понятен. Либо SH1106 либо брак.
а я думал это только у меня фигня такая)) оказывается нет...
просто все как и я ленились об этом написать спросить ) думая что только у них такая фигня.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Из англоязычных ресурсов, через переводчик:
- SSD1306 имеет расширенный набор команд по сравнению с SH1106
- SH1106 поддерживает только режим адресации страниц
- В SSD1306 добавлены специальные режимы горизонтальной и вертикальной адресации
- SSD1306 также поддерживает автоматическую прокрутку/scrolling

Если код/библиотека использует режим адресации страниц, то будет работать с любым из контроллеров (с разницей в длине строки - 128 против 132).
Если код/библиотека использует режим горизонтальной или вертикальной адресации, он будет работать только на SSD1306

Отрегулируйте длину строки и используйте дисплей.
Правда, есть трудность с многосерийное производство (нужен тест на каждом вложенном дисплее).
Контактная информация:
Реклама
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

нет трудностей с многосерийный производством...
мы добавили в меню "выбор экрана"... с сохранением в EEPROM...
и трудности у нас пропали))
:tea:
Прорезались зубы
Сообщения: 215
Зарегистрирован: Пн ноя 14, 2011 22:48:42

Сообщение zombie47 »

Что за смещение? Кто сталкивался? В чем может быть косяк?
Отвечая самому себе, дополняя: сейчас еще позаморачивался с этим дисплеем. Оказывается там 127 пикселей в ширину, а не 128 )
Причем там через китайский микроскоп видна маркировка у одного светодиода 125, и далее еще два светодиода. Итого 127. Ну и вручную посчитал внимательно. 127 их. Твердо и четко! Ну там когда фонариком светишь, граница светодиодов светится и видно где они заканчиваются.
Друг Кота
Аватара пользователя
Сообщения: 26075
Зарегистрирован: Пн фев 09, 2009 22:19:49
Откуда: Когда-то был прекрасный город для людей

Сообщение Муркиз »

:facepalm: А процедуру написать простенькую - зажечь пиксел по смещению, вывести его номер, сделать паузу посмотреть - в цикле - не проще ли было ?

ЗЫ. - Мы создали компьютер, чтобы экономить время !
- Нет, вы создали компьютер, чтобы убивать время !
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

мда....
надо в каждой строке посчитать. Внимательно.
Контактная информация:
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="zombie47",url="/forum/viewtopic.php?p=4593409#p4593409"]Оказывается там 127 пикселей в ширину, а не 128...
через китайский микроскоп видна маркировка...[/uquote]
не слушай этих старпёров)) они вечно всем недовольны...
ты всё делаешь правильно.
зато теперь мы знаем, что оказывается китайцы просто забыли добавить светодиодов...
:tea:
Прорезались зубы
Сообщения: 215
Зарегистрирован: Пн ноя 14, 2011 22:48:42

Сообщение zombie47 »

Так я сам старпёр )))
Блин казалось тут есть тэги для оффтоп сообщений. Но чет не вижу.
Прорезались зубы
Сообщения: 215
Зарегистрирован: Пн ноя 14, 2011 22:48:42

Сообщение zombie47 »

[uquote="zombie47",url="/forum/viewtopic.php?p=4593409#p4593409"]
Что за смещение? Кто сталкивался? В чем может быть косяк?
Отвечая самому себе, дополняя: сейчас еще позаморачивался с этим дисплеем. Оказывается там 127 пикселей в ширину, а не 128 )
Причем там через китайский микроскоп видна маркировка у одного светодиода 125, и далее еще два светодиода. Итого 127. Ну и вручную посчитал внимательно. 127 их. Твердо и четко! Ну там когда фонариком светишь, граница светодиодов светится и видно где они заканчиваются.[/uquote]
Что-то я ложанул. Перекомпилировал и тд и тп, пересчитал 128 пикселей)
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Повезло, что не 4К :)))
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 26075
Зарегистрирован: Пн фев 09, 2009 22:19:49
Откуда: Когда-то был прекрасный город для людей

Сообщение Муркиз »

Ну и убил время...
Ответить

Вернуться в «Периферия»