Неравномерность свечения фона OLED 1306.

Logik
Offline
Зарегистрирован: 05.08.2014

Заливаем фон, выводим  на него большое и черное. Видим за ним заметно более яркую (обведено синим) область. Ей границы ( обведены красным) особо четко выделяются. Че за на..? У всех так? Я такого дерьма с времен ЧБ телевизоров не видел. Там это шлейфом называлось.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Наклонные полосы - издержки фото, в реале их нет.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

шлейф какой длины?

Logik
Offline
Зарегистрирован: 05.08.2014

Гдето сантиметров 7.  Интересно, наблюдается ли подобное у других.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Я бы в первую очередь встал на Vcc осциллографом, и посмотрел пульсации..

Logik
Offline
Зарегистрирован: 05.08.2014

dimax пишет:

Я бы в первую очередь встал на Vcc осциллографом, и посмотрел пульсации..

Я бы тоже. Да нету осцилографа. Но вобще им не откуда особо взятся. Питание с USB, плата нано, кроме OLED ничего нет. OLED жрет мало. К той же плате подключаю TFT 2,4 дюйма и все нормально.Немного смущает отсутст электролита на плате OLED. Но с его то потреблением..

Думаю тут надо определится одно из двух:

1. Бракованый немножко - на электролите сэкономили или ещё что.

2. Все такие, и режим такой ему противопоказан.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Logik, ежели нет осцилла, то запитаться от эталонного БП. Сколько там, 5 вольт? С наны кстати идёт примерно 4,6 при питании от USB, может не хватать.

Diemon
Offline
Зарегистрирован: 18.11.2011

Автор, дайте код, вечером попробую проверить...

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

dimax пишет:

Я бы в первую очередь встал на Vcc осциллографом, и посмотрел пульсации..

А я бы  в первую очередь встал на Vcc конденсатором 2200-3300 , и посмотрел пульсации..

Logik
Offline
Зарегистрирован: 05.08.2014

Код для поигратся.

 



#define SDA_PORT  PORTC
#define SDA_RPORT PINC
#define SDA_DDR   DDRC
#define SDA_PIN   4

#define SCL_PORT  PORTC
#define SCL_DDR   DDRC
#define SCL_PIN   5

#define SET_HIGHT(port,pin)   bitSet(port,pin);
#define SET_LOW(port,pin)     bitClear(port,pin);

#define SDA_HIGHT SET_HIGHT(SDA_PORT, SDA_PIN);asm volatile ("nop");
#define SDA_LOW   SET_LOW(SDA_PORT, SDA_PIN)
#define SCL_HIGHT SET_HIGHT(SCL_PORT, SCL_PIN)
#define SCL_LOW   SET_LOW(SCL_PORT, SCL_PIN)

#define SDA_OUT bitSet(SDA_DDR, SDA_PIN);
#define SDA_IN  bitClear(SDA_DDR,SDA_PIN);


#define SSD1306_ADDR		0x3C

#define LEFT	0
#define RIGHT	9999
#define CENTER	9998

#define SSD1306_COMMAND			0x00
#define SSD1306_DATA			0xC0
#define SSD1306_DATA_CONTINUE	0x40


// SSD1306 Commandset
// ------------------
// Fundamental Commands
#define SSD1306_SET_CONTRAST_CONTROL					0x81
#define SSD1306_DISPLAY_ALL_ON_RESUME					0xA4
#define SSD1306_DISPLAY_ALL_ON							0xA5
#define SSD1306_NORMAL_DISPLAY							0xA6
#define SSD1306_INVERT_DISPLAY							0xA7
#define SSD1306_DISPLAY_OFF								0xAE
#define SSD1306_DISPLAY_ON								0xAF
#define SSD1306_NOP										0xE3
// Scrolling Commands
#define SSD1306_HORIZONTAL_SCROLL_RIGHT					0x26
#define SSD1306_HORIZONTAL_SCROLL_LEFT					0x27
#define SSD1306_HORIZONTAL_SCROLL_VERTICAL_AND_RIGHT	0x29
#define SSD1306_HORIZONTAL_SCROLL_VERTICAL_AND_LEFT		0x2A
#define SSD1306_DEACTIVATE_SCROLL						0x2E
#define SSD1306_ACTIVATE_SCROLL							0x2F
#define SSD1306_SET_VERTICAL_SCROLL_AREA				0xA3
// Addressing Setting Commands
#define SSD1306_SET_LOWER_COLUMN						0x00
#define SSD1306_SET_HIGHER_COLUMN						0x10
#define SSD1306_MEMORY_ADDR_MODE						0x20
#define SSD1306_SET_COLUMN_ADDR							0x21
#define SSD1306_SET_PAGE_ADDR							0x22
// Hardware Configuration Commands
#define SSD1306_SET_START_LINE							0x40
#define SSD1306_SET_SEGMENT_REMAP						0xA0
#define SSD1306_SET_MULTIPLEX_RATIO						0xA8
#define SSD1306_COM_SCAN_DIR_INC						0xC0
#define SSD1306_COM_SCAN_DIR_DEC						0xC8
#define SSD1306_SET_DISPLAY_OFFSET						0xD3
#define SSD1306_SET_COM_PINS							0xDA
#define SSD1306_CHARGE_PUMP								0x8D
// Timing & Driving Scheme Setting Commands
#define SSD1306_SET_DISPLAY_CLOCK_DIV_RATIO				0xD5
#define SSD1306_SET_PRECHARGE_PERIOD					0xD9
#define SSD1306_SET_VCOM_DESELECT						0xDB


    uint8_t   Top;
    uint8_t   Left;
    uint8_t   Pages;
    uint8_t   Width;
    uint8_t*  Canva;

void sendTWIcommand(byte value)
{
    sendTWIcommandCnt(value);
    sendStop();

}

void sendTWIcommandCnt(byte value)
{
    sendStart(SSD1306_ADDR<<1);
    waitForAck();
    writeByte(SSD1306_COMMAND);
    waitForAck();
    writeByte(value);
    waitForAck();
}

void shiftOut(byte v)
{
    for (byte i=8;i;i--)
    {
        if (v & 0x80)
        { SDA_HIGHT;}
        else
            SDA_LOW;

        SCL_HIGHT;
        v <<=1;
        SCL_LOW;
    }
}


void writeByte(uint8_t value)
{
    SDA_OUT;
    shiftOut(value);

}


void sendStart(byte addr)
{
    SDA_OUT;
    SDA_HIGHT;
    SCL_HIGHT;
    SDA_LOW;
    SCL_LOW;
    shiftOut(addr);
}

void sendStop()
{
    SDA_OUT;
    SDA_LOW;
    SCL_HIGHT;
    SDA_HIGHT;
    SDA_IN;
}

void sendNack()
{
    SDA_OUT;
    SCL_LOW;
    SDA_HIGHT;
    SCL_HIGHT;
    SCL_LOW;
    SDA_IN;

}

void sendAck()
{
    SDA_OUT;
    SCL_LOW;
    SDA_LOW;
    SCL_HIGHT;
    SCL_LOW;
    SDA_IN;
}

void waitForAck()
{
    SDA_IN;
    SCL_HIGHT;

    loop_until_bit_is_clear(SDA_RPORT, SDA_PIN); 
    SCL_LOW;
}

void begin()
{

    bitSet(SCL_DDR, SCL_PIN);

    sendTWIcommand(SSD1306_DISPLAY_OFF);
    sendTWIcommand(SSD1306_SET_DISPLAY_CLOCK_DIV_RATIO);
    sendTWIcommand(0x80);
    sendTWIcommand(SSD1306_SET_MULTIPLEX_RATIO);
    sendTWIcommand(0x3F);
    sendTWIcommand(SSD1306_SET_DISPLAY_OFFSET);
    sendTWIcommand(0x0);
    sendTWIcommand(SSD1306_SET_START_LINE | 0x0);
    sendTWIcommand(SSD1306_CHARGE_PUMP);
    sendTWIcommand(0x14);
    sendTWIcommand(SSD1306_MEMORY_ADDR_MODE);
    sendTWIcommand(0x00);
    sendTWIcommand(SSD1306_SET_SEGMENT_REMAP | 0x1);
    sendTWIcommand(SSD1306_COM_SCAN_DIR_DEC);
    sendTWIcommand(SSD1306_SET_COM_PINS);
    sendTWIcommand(0x12);
    sendTWIcommand(SSD1306_SET_CONTRAST_CONTROL);
    sendTWIcommand(0xCF);
    sendTWIcommand(SSD1306_SET_PRECHARGE_PERIOD);
    sendTWIcommand(0xF1);
    sendTWIcommand(SSD1306_SET_VCOM_DESELECT);
    sendTWIcommand(0x40);
    sendTWIcommand(SSD1306_DISPLAY_ALL_ON_RESUME);
    sendTWIcommand(SSD1306_NORMAL_DISPLAY);
    sendTWIcommand(SSD1306_DISPLAY_ON);
    
}

void InitFrame(uint8_t bLeft, uint8_t bPageTop, uint8_t bWidth, uint8_t bPages, uint8_t* buf)
{
    Canva = buf;
    Width = bWidth;
    Top   = bPageTop;
    Left  = bLeft;
    Pages = bPages;
}


byte G(uint16_t a)
{
  if ((a<128) ||(a>128*5) || (a&0x7f)>100) return 0xff;
   return 0;
}

void setup()
{

    begin();

     InitFrame(0, 0, 128, 7, (byte*)&G);
     updateCallBack();

}


void updateCallBack(void)
{
    if(!Canva)
         return;
    sendTWIcommand(SSD1306_SET_COLUMN_ADDR);
    sendTWIcommand(Left);
    sendTWIcommand(Left+Width-1);

    sendTWIcommand(SSD1306_SET_PAGE_ADDR);
    sendTWIcommand(Top);
    sendTWIcommand(Top+Pages-1);

    sendStart(SSD1306_ADDR<<1);
    waitForAck();
    writeByte(SSD1306_DATA_CONTINUE);
    waitForAck();


    for (int b=0; b<Width*Pages; b++)		// Send data
    {
        writeByte(((byte (*)(uint16_t))Canva)(b));
        waitForAck();
    }

    sendStop();

}

void loop()
{

}

 

Joiner
Offline
Зарегистрирован: 04.09.2014

У меня тоже что-то такое наблюдается. Это, видимо конструктивная особенность. Когда жирная черная горизонтальная полоса, сбоку от нее светится ярче. Пишите белым по черному, и ни чего не будет.

У меня в тестовом скетче черным по белому жирно написано "The end!", так это смотрится на светлом экране как-будто эта надпись на светлой вдоль экрана полосе.

Logik
Offline
Зарегистрирован: 05.08.2014

Joiner пишет:

 Это, видимо конструктивная особенность.

Похоже на то. Может ещё кто подтвердит?

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

Logik пишет:

Joiner пишет:

 Это, видимо конструктивная особенность.

Похоже на то. Может ещё кто подтвердит?

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

Diemon
Offline
Зарегистрирован: 18.11.2011

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

Logik
Offline
Зарегистрирован: 05.08.2014

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

Diemon
Offline
Зарегистрирован: 18.11.2011

Если хотите, попробую еще на десятке таких же дисплеев :) Хотя они все с одной партии....

Logik
Offline
Зарегистрирован: 05.08.2014

Со временем статистика наберется и по разным партиям. Ещё не один на эти грабли прыгнет. А пока я буду исходить из того, что светлый фон не для этих экранов.

Joiner
Offline
Зарегистрирован: 04.09.2014

Logik пишет:

Со временем статистика наберется и по разным партиям. Ещё не один на эти грабли прыгнет. А пока я буду исходить из того, что светлый фон не для этих экранов.

Да чего там...Хороший экранчик. На белым по черному все ОК. Всего 2 проводочка не считая питания, малое энергопотребление, работоспособность без переделки на 3.3 и 5 вольт, отличный угол обзора, приятное четкое изображение.

Отличный экранчик!

Logik
Offline
Зарегистрирован: 05.08.2014

Согласен. Симпатичный. И достаточно шустрый. Я сча на нем осцилограф сварганил. Просто надо помнить что светлый фон не для этих экранов.