Oled i2c не работает
Для начала, почему он не хочет работать даже в Протеусе?
Подходящая ли протеуская модель?
Правильно ли подключены выводы в модели экрана, особенно к шине?
Схема из Протеуса (на осциллографе самое начало передачи на экран ):
Листинг кода из примера:
//МАССИВ ДЛЯ ИНИЦИАЛИЗАЦИИ
//A0 - начало в правом углу; A1 - начало в левом углу
//C0 - начало снизу экрана; C8 - начало сверху экрана
//12 - прямая линия, 02, 22 - линия через строчку
//7F - яркость (максимум 0xFF)
unsigned char PROGMEM init[18]=
0xA8,0x3F,0xD3,0x00,0x40,0xA1,0xC8,0xDA,0x12,
0x81,0x7F,0xA4,0xA6,0xD5,0x80,0x8D,0x14,0xAF,
>;
//ЦИФРЫ
unsigned char PROGMEM DIGIT[5][24]=
0x00, 0x00, 0x00, 0x30, 0x30, 0xF8, 0xF8, 0x00, //1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x1F, 0x1F, 0x18, 0x18, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0x30, 0x18, 0x18, 0x18, 0x98, 0xF8, //2
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1C,
0x1E, 0x1B, 0x19, 0x18, 0x18, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0x30, 0x98, 0x98, 0x98, 0x98, 0xF8, //3
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x19,
0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0xF8, 0xF8, //4
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07,
0x06, 0x06, 0x1F, 0x1F, 0x06, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0xF8, 0xF8, 0x98, 0x98, 0x98, 0x98, //5
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x19,
0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00,
>,
>;
//СТАРТ
void START (void)
DA_HI;
CL_HI;
DA_LOW;
CL_LOW;
>
//СТОП
void STOP (void)
DA_LOW;
CL_HI;
DA_HI;
>
//ПЕРЕДАЧА БАЙТА и АСК
void SEND (unsigned char data)
unsigned char k;
//ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ
void OLED_INIT (void)
unsigned char k;
//ОЧИСТКА ЭКРАНА ДИСПЛЕЯ
void CLR_SCR (void)
unsigned char k, kk;
//выбираем Horizontal Addressing Mode (заполнение экрана по типу того как читаем книгу)
SEND(COM);
SEND(0x20);
SEND(COM);
SEND(0x00);
//заполняем строку слева направо
SEND(DATS);
for(kk=0;kk‹8;kk++)
for(k=0;k‹128;k++) SEND(0x00); //LSB вверху, MSB снизу
>
int main (void)
unsigned int k;
unsigned char kk;
CLKPR=0x80;
CLKPR=0x00; //предделитель отключён, рабочая частота 8 MHz
PORTA=0x00; //РА0 будет SCK, РА1 будет SDA
DDRA =0x00;
PORTD=0b00100000; //настройки СИДА для отладки, так можно обнулять
DDRD =0b01000000; //настройки СИДА для отладки, так можно обнулять
PORTB=0x00; //на всякий случай
DDRB =0x00; //на всякий случай
ACSR=0x80; //отключение компаратора для уменьшения потребления тока
_delay_ms(500); //пауза перед инициализацией - у меня очень нестабильное включение питания
OLED_INIT(); //инициализация дисплея
CLR_SCR(); //очистка экрана дисплея
while(1)
//рисуем кота
START();
SEND(NAME); //посыл адреса+0
SEND(DATS);
for(k=0;k‹1024;k++) SEND(pgm_read_byte(screen_1+k));
//последовательно выводим цифры от 1-го до 5-ти
while(1)
for(kk=0;kk‹5;kk++)
START();
SEND(NAME);
SEND(COM);
SEND(0x21); //Set Column Address (21h)
SEND(COM);
SEND(115); //будем выводить между 115.
SEND(COM);
SEND(126); //. и 126 колонками
SEND(COM);
SEND(0x22); //Set Page Address (22h)
SEND(COM);
SEND(6); //Будем крутиться между 6-ой.
SEND(COM);
SEND(7); //. и 7-ой страницами (строчками)
SEND(DATS);
for(k=0;k‹12;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем верхнюю часть цифры
for(k=12;k‹24;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем нижнюю часть цифры
Здравствуйте. Купил для проекта дисплей OLED 128X64 i2c, начал пробовать со стандартными скетчами adafruit - не работает, со скетчами из обзоров дисплея тоже. Сканер i2c дисплей видит, но при работе с программой, которая должна выводить изображение на дисплей, ничего не загорается. Подключен к arduino nano, sda к 4 аналоговому пину, scl к пятому. Питаю от 3.3V. Пример скетча:
В чем может быть проблема?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подключен к arduino nano, sda к 4 аналоговому пину, scl к пятому. Питаю от 3.3V.
В чем может быть проблема?
Или неисправность экрана или неверное подключение. Откуда Вы берете 3.3В и куда подключаете?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Надо бы фото дисплея с двух сторон. Обычно на нем уже стоит стабилизатор линейный в таком случае питать дисплей надо от 5 вольт
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Заметил, снизу на дисплее трещина еле заметная. Скорее всего она и есть причина того, что дисплей не работает, так как идет прямо по дорожкам в стекле. Так что видимо придется покупать новый.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
У меня подобная проблема возникла. Уже пользовался дисплеем с 4 пинами и проблем не было.
Сегодня пришло 2штуки с 7пинами. Я переставил две перемычки на обратной стороне для режима I2C. Но. экран пустой. Все библы перепробовал. Очень не хочется думать о его неисправности. Может я неправильно определил пины.
Подскажите, если можете как определить его исправность. Второй не работает по SPI
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я использовал первые четыре пина. На фото GND крайний справа. Две видимых дорожки использовал как А4 и А5
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ну хоть бы подписал что куда, я так понимаю 4тый справа у тебя SDA третий справа SDL, так чтоль?
Резистор 0ом ты переставил с R3 на R1? На R8 так же поставил 0ом? Ну грубо говоря перемычки.
Если все так то подключай и запускай I2C сканер. Сначала экран должен быть виден как I2C. Нет попробуй поменять SDA SCL местами. Потом уже смотри что за чип у тебя стоит, обычно продавец пишет какой чип. Ну если нет, то методом тыка переберай подходящие.
Преодоление проблем с экраном 0.96 128X64 OLED LCD I2C SSD1306
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Преодоление проблем с экраном 0.96 128X64 OLED LCD I2C SSD1306
Пытался запустить его со следующими библиотеками:
Вариант 3 не компилируется последней версией компилятора. После пропихивания (т.е. изменений таких, чтобы компилятор не ругался) программа так и не заработала, ну да ладно, в коде обнаружил экранный буфер, поэтому интерес к нему пропал.
Вариант 2 также не работал пока. не запустил вариант 1. После этого вариант 2 заработал. Если выключить питание, а затем включить (отключить и включить USB кабель), ситуация повторяется, т.е. не работет до первого запуска примеров из варианта 1.
Другими словами, в варианте 2 где-то что-то недоинициализируется, что, возможно, работает на оригинальном дисплее, но не работает на его китайской копии.
Вариант 1. В принципе, все работает, но есть два недостатка:
- Автор явно указывает, что библиотека несовместима с Wire, а для подключения других устройств по I2C рекомендует использовать другую пару контактов.
- Библиотека использует экранный буфер.
Собственно, дисплей приобретался для робота, а потому категорически не устраивают оба недостатка.
К I2C планировалось подключать кучу периферии вследствии того, что наблюдается острый дефицит ног контроллера, и выделить еще пару не представляется возможным. Равно как и обходиться без других I2C приборов.
Экранный буфер категорически не устраивает потому, что ТОЛЬКО этот буфер отъедает 2/3 всей доступной памяти. С этим можно мириться, если дисплей - центральный прибор в системе, построенной на Arduino (например, часы), но категоричекски неприемлемо, если ему отводится лишь роль вспомогательного средства индикации.
Подсчет простой:
- в Arduino Uno имеется 2 килобайта оперативной памяти (переходить на Мегу из-за одного только дисплея не хочу),
- среда разработки настойчиво предлагает оставлять для стека не менее 0.5 килобайта памяти, да и с использованием сторонних библиотек с такой оценкой трудно не согласиться,
- примерно 0.2-0.3 килобайт занимает каждая из подключаемых библиотек,
- экранный буфер требует 1 килобайт.
Итого: если использовать экранный буфер, то: экранный буфер + стек + библиотека управления дисплеем займет 1.7К из 2.0К, а на все остальное останется только 0.3К. Очевидно, что если требует подключать еще электромоторы, сервопривод, многочисленные датчики, да еще и писать логику управления роботом, памяти не хватит.
Единственная библиотека, способная обходиться без экранного буфера - вариант 2. Поэтому на нем и решил остановиться.
Путем сравнения с вариантом 1 выделил фрагмент, которого не хватало варианту 2 для полноценной инициализации дисплея.
В конец процедуры OzOLED::init() в файле OzOLED.cpp необходимо внести следующий код:
а перед ним разместить определение команд, которые не описаны в OzOLED.h (лучше помещать их в OzOLED.cpp, т.к. снаружи они не нужны):
После этого библиотека должна заработать даже на китайских дисплеях.
Но это еще не все.
Я, как крыловскавя мартышка, не вижу мелкие буковки шрифта 8х8 пикселей на дисплее резмером меньше дюйма. Даже в очках. Поэтому возникла потребность в более крупном шрифте, да вот беда, крупные шрифты занимают довольно много места, на этот раз во флеш-памяти, а ее тоже не слишком много - всего 32К. Дабы оставить себе свободу в программировании алгоритмов поведения робота, решил обойтись имеющимся фонтом 8х8, растянув его до 12х16 и 16х16. Получилось немного угловато, зато экономно по памяти. Шрифт 16х16, очевидно, рисуется квадратиками 2х2 пискеля, а с шрифтом 12х16 - хитрее: удваивается не каждый, а только каждый второй столбец пикселей. В результате есть два варианта: в одном удваиваются только четные столбцы, а в другом - нечетные. Решил реализовать оба варианта, а потом постепенно решить, который из них лучше смотрится.
Мудрить не стал, как и в исходном коде, для вывода разными фрифтами используются разные функции (описание в файле OzOLED.h):
И их реализация в OzOLED.cpp:
Пока все.
В дальнейшем планирую сделать еще столбчатую диаграмму - типа как в спектранализаторах, только на 128 значений. По мере готовности опубликую.
Да, опыт работы с Arduino у меня пока меньше недели, так что на окончательность кода не претендую. В первую очередь не очень представляюю себе всего многообразия моделей и особенностей работы с каждой из них. У меня пока есть только Uno, и ни на чем другом проверить возможности нет.
Выкладываю проект (см. ATmega48P + SSD1306.zip), сделан Atmel Studio 7 + схема Proteus 8.7
Для начала, почему он не хочет работать даже в Протеусе?
Подходящая ли протеуская модель?
Правильно ли подключены выводы в модели экрана, особенно к шине?
Если надо выложить дополнительно скрины пишите, выложу.
Схема из Протеуса (на осциллографе самое начало передачи на экран ):
Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет
На вебинаре были представлены линейка компонентов для электропитания и интерфейсные модули. Мы рассмотрели популярные группы изолированных и неизолированных (PoL) DC/DC-преобразователей последних поколений, новые компактные модульные источники питания, устанавливаемые на печатную плату (открытые и корпусированные), источники питания, монтируемые как на шасси (в кожухе и открытые), так и на DIN-рейку.
Мне показалось, что так будет проще.
А есть примеры подключения такого экрана по TWI на C/C++ в Atmel Studio?
Встраиваемые ИП LM(F) производства MORNSUN заслуженно ценятся производителями во всем мире, поскольку среди широчайшего ассортимента продукции компании можно найти источник питания для любых задач. Представители семейств LM и LMF различаются по мощности и выходному напряжению, их технические и эксплуатационные характеристики подходят для эксплуатации в любых электрических сетях и работают в широком диапазоне условий окружающей среды. Неизменными остаются высокое качество и демократичная цена.
Полезно знать как работать с устройством обоими способами, на случай если у вас много I2C устройств а шина одна,
и они между собой начинают глючить или адреса одинаковые, тогда некоторые можно повесить на другие выводы микроконтроллера.
Заработало с адресом 0b01111000 но глючно см. скрин (Глючный кот.jpg)
Выкладываю подправленный проект с которого сделан скрин (ATmega48P + SSD1306 (2).zip)
Каждый раз полоски в другом месте, один раз кот нарисовался нормально, почему так?
Цифры не выводятся вообще, почему?
Снижение частоты ,например, до 8мГц и 4мГц глюки не убирает.
Откуда на линии стробирования SCL берётся такая неравномерность битов
(промежутки плавно сокращаются в каждом байте, см. осциллограф на скрине)
это нормально ?
В на плате OLED экрана стоит стабилизатор на 3,3v и линии SCL SDA подтянуты к 3,3v резисторами по 10к.
Для начала, почему он не хочет работать даже в Протеусе?
Подходящая ли протеуская модель?
Правильно ли подключены выводы в модели экрана, особенно к шине?
Схема из Протеуса (на осциллографе самое начало передачи на экран ):
Листинг кода из примера:
//МАССИВ ДЛЯ ИНИЦИАЛИЗАЦИИ
//A0 - начало в правом углу; A1 - начало в левом углу
//C0 - начало снизу экрана; C8 - начало сверху экрана
//12 - прямая линия, 02, 22 - линия через строчку
//7F - яркость (максимум 0xFF)
unsigned char PROGMEM init[18]=
0xA8,0x3F,0xD3,0x00,0x40,0xA1,0xC8,0xDA,0x12,
0x81,0x7F,0xA4,0xA6,0xD5,0x80,0x8D,0x14,0xAF,
>;
//ЦИФРЫ
unsigned char PROGMEM DIGIT[5][24]=
0x00, 0x00, 0x00, 0x30, 0x30, 0xF8, 0xF8, 0x00, //1
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x1F, 0x1F, 0x18, 0x18, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0x30, 0x18, 0x18, 0x18, 0x98, 0xF8, //2
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1C,
0x1E, 0x1B, 0x19, 0x18, 0x18, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0x30, 0x98, 0x98, 0x98, 0x98, 0xF8, //3
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x19,
0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0xF8, 0xF8, //4
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07,
0x06, 0x06, 0x1F, 0x1F, 0x06, 0x00, 0x00, 0x00,
>,
0x00, 0x00, 0xF8, 0xF8, 0x98, 0x98, 0x98, 0x98, //5
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x19,
0x19, 0x19, 0x19, 0x1F, 0x0F, 0x00, 0x00, 0x00,
>,
>;
//СТАРТ
void START (void)
DA_HI;
CL_HI;
DA_LOW;
CL_LOW;
>
//СТОП
void STOP (void)
DA_LOW;
CL_HI;
DA_HI;
>
//ПЕРЕДАЧА БАЙТА и АСК
void SEND (unsigned char data)
unsigned char k;
//ИНИЦИАЛИЗАЦИЯ ДИСПЛЕЯ
void OLED_INIT (void)
unsigned char k;
//ОЧИСТКА ЭКРАНА ДИСПЛЕЯ
void CLR_SCR (void)
unsigned char k, kk;
//выбираем Horizontal Addressing Mode (заполнение экрана по типу того как читаем книгу)
SEND(COM);
SEND(0x20);
SEND(COM);
SEND(0x00);
//заполняем строку слева направо
SEND(DATS);
for(kk=0;kk‹8;kk++)
for(k=0;k‹128;k++) SEND(0x00); //LSB вверху, MSB снизу
>
int main (void)
unsigned int k;
unsigned char kk;
CLKPR=0x80;
CLKPR=0x00; //предделитель отключён, рабочая частота 8 MHz
PORTA=0x00; //РА0 будет SCK, РА1 будет SDA
DDRA =0x00;
PORTD=0b00100000; //настройки СИДА для отладки, так можно обнулять
DDRD =0b01000000; //настройки СИДА для отладки, так можно обнулять
PORTB=0x00; //на всякий случай
DDRB =0x00; //на всякий случай
ACSR=0x80; //отключение компаратора для уменьшения потребления тока
_delay_ms(500); //пауза перед инициализацией - у меня очень нестабильное включение питания
OLED_INIT(); //инициализация дисплея
CLR_SCR(); //очистка экрана дисплея
while(1)
//рисуем кота
START();
SEND(NAME); //посыл адреса+0
SEND(DATS);
for(k=0;k‹1024;k++) SEND(pgm_read_byte(screen_1+k));
//последовательно выводим цифры от 1-го до 5-ти
while(1)
for(kk=0;kk‹5;kk++)
START();
SEND(NAME);
SEND(COM);
SEND(0x21); //Set Column Address (21h)
SEND(COM);
SEND(115); //будем выводить между 115.
SEND(COM);
SEND(126); //. и 126 колонками
SEND(COM);
SEND(0x22); //Set Page Address (22h)
SEND(COM);
SEND(6); //Будем крутиться между 6-ой.
SEND(COM);
SEND(7); //. и 7-ой страницами (строчками)
SEND(DATS);
for(k=0;k‹12;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем верхнюю часть цифры
for(k=12;k‹24;k++) SEND(pgm_read_byte(DIGIT[kk]+k)); //рисуем нижнюю часть цифры
Читайте также: