Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

DIY MORE OLED-091 (технический разбор)

Вт июн 07, 2022 18:40:03

Фото (400кб)


OLED графический дисплей 0,91" 128x32 с интерфейсом I2C (400кГц)
Построен на базе "Китайского 14-pin OLED" (так и гуглить) стекла, с вмонтированным в него контроллером SSD1306 и 14-контактным гибким шлейфом.

ВНИМАНИЕ!
В выборке 5шт., брак составил 40%!
(возможно попалась подделка)
У обоих бракованных, вывод шлейфа 1 (C2P) оторван от кристалла под эпоксидной заливкой, починить невозможно.
Из за этого обрыва, одна из двух ступеней умножителя напряжения не работает, и свечение крайне тусклое.
Возможно лечится установкой 2-х диодов, но толком не проверял.

КОСЯКИ
Стекло приклеено к плате двухсторонним скотчем, после проверки работоспособности, рекомендуется переклеить чем то типа клея "Момент".
У самых выводов питания модуля, необходимо установить керамический конденсатор 1мкФ, так как поставить его на плате почему то "забыли".
Отсутствуют преобразователи уровня линий I2C.

ИСПОЛЬЗОВАНИЕ
Продавцы утверждают, что модуль совместим с питанием 3,0...5,0в, для этого на плате установлен стабилизатор напряжения 3,3в.
Но одновременно там установлены подтяжки 4,7к по линиям I2C, и сами эти линии имеют внутри микросхемы защитные диоды в питание.
В итоге, при питании процессора от более высокого напряжения, в сочетании с наличием подтягивающих резисторов с его стороны, в режиме сна индикатора, напряжение питания контроллера дисплея достигает напряжения питания процессора
(натекает через подтяжки и защитные диоды), из за чего контроллер оказывается под недопустимым напряжением!
Мои экземпляры от этого не сгорают, и работают корректно, но все же, ни кто не знает какой клон SSD1306 попадется в следующий раз...
Для борьбы с этим явлением, можно НЕ ставить подтяжки со стороны процессора, однако, если он запитан от 5в, нет строгой гарантии отсутствия ошибок из за несоответствия логических уровней сигналов.
Для гарантии корректной работы, нужно установить нормальные преобразователи уровня.

В остальном, экранчик неплох за свои деньги.
Можно получить 21х4 газетным шрифтом (купите очки), 16х4, 11х2, 8х2 шрифтами покрупнее. Выводить графику.
OLED не боится мороза, в отличии от LCD, которые при минус 20...25 работоспособны только очень условно.
Управление с AVR по I2C жрет очень много времени процессора, крутить мультики я бы в такой конфигурации не рекомендовал, но с нечастыми обновлениями вполне приемлемо.

Возможно кому то пригодится монтажная схема платы:

Re: DIY MORE OLED-091 (технический разбор)

Вт июн 07, 2022 19:10:06

~Dimon~ писал(а):Управление с AVR по I2C жрет очень много времени процессора
а у меня аппаратный i2c почти ничего не жрёт... :roll:

Re: DIY MORE OLED-091 (технический разбор)

Вт июн 07, 2022 19:29:12

На каком камне?
Очень много жрет аппаратный I2C у AVR.
Посмотрите сколько ему прерываний надо, они там на каждый чих, START, STOP, ACK, адресный байт...
А хуже всего, внутри прерывания надо еще разбираться в его причине, и дернуть нужный кусок кода. USART в этом смысле гораздо легче, разные события дергают три разных прерывания.
Ну и DMA нет конечно, дергаемся на каждый байт.

Re: DIY MORE OLED-091 (технический разбор)

Вт июн 07, 2022 19:39:59

У меня ST7, и тоже самое. Только не куча прерываний, а одно. И нет в этом никакого ужаса. DMA - это отдельная тема. У некоторых (полагаю, что у большинства < 32 бит) его вообще нет. В AVR есть DMA? Да ещё с возможностью работы, пока ядро в спящем режиме? Не знал... Давайте сравним, как передать кучку байт по I2C и иному другому варианту (без DMA). Передал старт, адрес, снова старт, команду и понеслось, при вызове прерывания увеличиваю счётчик адреса памяти и улетает следующий байт. Всё остальное время, до вызова прерывания, мк что-то делает и в итоге общее время работы существенно уменьшается, или не делает ничего. Ну, что с другими вариантами? да то же самое с большинством.
Иное дело, что скорость у некоторых может быть значительно выше. А, забыл: в самом конце надо послать стоп :)

Код:
void I2C_IT_Function (void)
{        
   unsigned char Temp;
  I2C_ERROR |= (I2C_ErrCode)(I2CSR2 & ERR); // Error status copied to global variable
   Temp = I2CSR1;
   if (Temp & SB) //EV5
   {
      I2CDR = Address7bit; //Send address
   }
   else if ((Temp & EVF) && (!(Temp & BTF)))// EV6
   {
      I2CCR |= PE;
   }
   else if (Temp & BTF) //EV7-EV8
   {
   /// Tx ///   
      if (!(Address7bit & I2C_RX_MODE))
      {
         if (TxCount-- > 0)
         {         
            I2CDR = *(TxBuffer++);
         }
         else
         {         
            if (CanStop)
            {
               I2C_Generate_Stop();
               BusyFlag = 0;
            }
            else
            {
               Address7bit |= 0x01;
               if (RxCount == 1)
               {
                  I2C_ACK_Disable();
               }
               I2C_Generate_Start();
            }
         }
      }
   /// Rx ///
      else
      {
         if (RxCount == 2)
         {
            I2C_ACK_Disable();
         }
         if (RxCount == 1)
         {
            I2C_Generate_Stop();
            BusyFlag = 0;            
         }   
         if (RxCount-- > 0)
         {
            *(RxBuffer++) = I2CDR;
         }
      }
   }
   else
   {
      I2C_Interrupt_Disable(); 
   }
}

Много это сожрёт времени?

Re: DIY MORE OLED-091 (технический разбор)

Вт июн 07, 2022 23:47:17

Посмотрел у себя, обработка прерываний I2C - около 100 клоков на байт, при условии что мы обновляем экран целиком из буфера, все 512 байт одной пачкой.
Посимвольный вывод мелким шрифтом, из за некоторых особенностей контроллера, потребует две транзакции на символ, по 6 и 7 байт, не помню точно, 4 или 5 служебных прерываний на транзакцию, плюс по одному на каждый байт.
Итого, порядка 50...90 тыс. клоков на полное обновление.
При 10...20 полных обновлений в секунду, оно отожрет 0,5...2МГц только на прерывания I2C, из 8/10МГц доступных при питании ниже 4,5в.
Ну а дальше уже вопрос конкретного проекта, можем ли мы позволить себе столько?

В AVR нет DMA и FIFO, по крайней мере в 8-битных Тини/Мегах, с другими дел пока не имел.

Re: DIY MORE OLED-091 (технический разбор)

Ср июн 08, 2022 02:20:11

как-то не привык так оценивать... я смотрю по времени работы и расходу энергии.
Но, предположим, возьмём Ваш вариант. Пока это всё равно не делает I2C плохим :) ведь совершенно верно, неизвестно, позволяет это проект или нет. И тогда надо сравнить и альтернативные варианты, в таком же стиле.

А у меня вроде есть похожих пара дисплея. Повожусь на днях тоже, а то валяются подаренные без дела...

Re: DIY MORE OLED-091 (технический разбор)

Вт май 30, 2023 16:00:57

Еще косяки, обнаруженные по ходу эксплуатации:

1. Set COM Pins Hardware Configuration (0xDA) - не устанавливается в дефолтное значение по включению питания.
Нужно обязательно настраивать из прошивки.
Вообще, лучше производить настройку полностью, не полагаясь на дефолты. Эта инфа просто на заметку.

2. Похоже что нет гистерезиса на входе RESET.
Аппаратный сброс контроллера дисплея при подаче питания, производится RC-цепочкой на плате, и он может происходить дважды.
Если начинать инициализацию по готовности (контроллер принимает команды без ошибок на шине, и возвращает статус 0x41), в течении примерно секунды после инициализации, дисплей снова сбрасывается, в итоге экран черный, и из регистра
статуса читается 0x41 (Display OFF).
В одном устройчтве это безобразие случается примерно в 20% случаев, в другом в 100%.
Все повторные инициализации (не после подачи питания), проходят нормально.

Вот думаю теперь, как бы его надежно инициализировать при втыке питания, с минимальными костылями...
Хочется именно по готовности, не полагаясь на задержки, и без периодической проверки-реинициализации.
Ответить