OLED 3.12" на SSD1322 по 8080
- Войдите на сайт для отправки комментариев
Сб, 16/09/2017 - 10:46
Выручайте, пожалуйста, господа.
Arduino ProMini, OLED на SSD1322, библиотека u8glib (1.19.1).
По SPI все нормально, но не хватает скорости при работе с большими шрифтами. Поэтому решил попробовать подключение по 8080.
Использованный коструктор для SPI:
U8GLIB_NHD31OLED_2X_BW u8g(10, A0); // cs, a0, reset = U8G_PIN_NONE)
Изменил выбор шины с 00 на 10 согласно таблице:
BS[1:0] Bus Interface Selection 00 4 line SPI (set as default) 01 3 line SPI 10 8-bit 8080 parallel 11 8-bit 6800 parallel
Соединение c ProMini:
OLED ProMini: 1 Vss -> GND 2 Vbat-> +3.3v 3 NC -> свободен 4 D0 -> 2 5 D1 -> 3 6 D2 -> 4 7 D3 -> 5 8 D4 -> 6 9 D5 -> 7 10 D6 -> 8 11 D7 -> 9 12 /RD -> Куда его? 13 /WR -> Куда его? 14 /DC -> A0 15 /RES-> свободен 16 /CS -> 10
Коструктор для 8080:
U8GLIB_NHD31OLED_BW u8g(2, 3, 4, 5, 6, 7, 8, 9, 10, A0); // d0, d1, d2, d3, d4, d5, d6, d7, cs, di, rw = U8G_PIN_NONE, reset = U8G_PIN_NONE)
Документацию на дисплей брал тут:
Его распиновка:
Pin No Symbol I/O Description 1 Vss P Ground of Logic Circuit. This is a ground pin, It also acts as a reference for the logic pins, It must be connected to external ground. 2 VBAT 3.3-5V Power Supply for Display Module Circuit. This is a Voltage supply pin. It Connected to external Source. 3 NC - Please let it Float. 4-11 DB0-DB7 I/O Host Data Input/Output Bus. These pins are 8-bit bi-directional data bus to be connected to the microprocessor’s data bus, When serial mode is selected, D1 will be the serial data input SDIN and DO will be the serial clock input SCLK. 12 /RD I Read/Write Enable or Read This pin is MCU interface input, When interfacing to an 68xx-series microprocessor, this pin will be used as the Enable (E) signal, Read/Write operation is initiated when this pin is pulled high and the CS is pulled low, When connecting to an 80xx-microprocessor,this pin receives the Read(RD) signal, Data read operation is initiated when this pin is pulled low CS is pulled low. 13 /WR I Read/Write Select or Write This pin is MCU interface input, When interfacing to an 68xx-series microprocessor, this pin will be used as Read/Write(R/W) selection input, Pull this pin to “High” for read mode and pull it to “low” for write mode, When 80xx interface mode is selected, this pin will be the write (WR) input, Data write operation is initiated when this pin is pulled low and the CS is pulled low. 14 /DC I Data/Command Control This pin is Data/Command control pin, When the pin is pulled high, the input at D7~D0 is treated as display data, When the pin is pulled low, the input at D7~D0 will be transferred to the command register. For detail relationship to MCU interface signals, please refer to the Timing Characteristics Diagrams. 15 /Reset I Power Reset for Controller and Driver This pin is reset signal input, When the pin is low; initialization of the chip is executed. 16 /CS I Chip Select This pin is the chip select input; The chip is enabled for MCU communication only when CS# is pulled low.
Перепробовал все возможные варианты подключения 12 и 13 пинов дисплея к 11, 12 и 13 пинам arduino. При соединении 13 пина дисплея c 13 пином arduino на экране появляется статический шум/мусор на очень низкой яркости. В остальных случаях - черный экран.
Как его запустить по параллельному 8080?
Куда подключать 12 и 13 пины?
Где косячу?
Вообще-то в данном случае говориттся про стандарт шины I8080. Используются 8 байт данных адресная шина и несколько линий управления. Для управления дисплеем обыно используются шина данных, сигналы RD, WR и возможно ещё некоторые управляющие сигналы. Легко эмулируется любым МК с достаточным количеством выводов.
Запустил с U8g2lib:
Конструктор:
При скорость шины SPI 4 МГц она должна обеспечивать более 16 FPS. Вам этого недостаточно?
В реальности, на 16MHz ProMini + библиотека u8glib + выбранные мной шрифты, вывод данных на экран длится порядка 176 ms. Для меня это много.
При скорость шины SPI 4 МГц она должна обеспечивать более 16 FPS. Вам этого недостаточно?
В реальности, на 16MHz ProMini + библиотека u8glib + выбранные мной шрифты, вывод данных на экран длится порядка 176 ms. Для меня это много.
1. Вы во второй раз упоминаете шрифты, как нечто, влияющее на скорость. Из этого я делаю вывод, что обновляется не весь экран, а его часть. По моим подсчетам, обновление всего экрана должно занимать 60 мс, если у Вас часть экрана за 176 - разбирайтесь, почему. Квстати, SPI у Вас работает на какой частоте?
2. Не буду подвергать сомнению Ваше утверждение, что для Вас 176 мс это много. Я сейчас работаю над проектом, в котором и 0.5 мс - это много. Исходя из этого я сделал следующее:
- выбрал текстовый экран, а не графический,
- разогнал частоту шины в несколько раз (насколько получилось с обеспечением стабильной работы),
- оптимизировал протокол обмена (уменьшил цикл с 6 фаз до 4),
- вывожу за раз по одному символу, а не строку целиком.
Возможно, какие-то из этих приемов помогут и Вам.
Вообще-то в данном случае говориттся про стандарт шины I8080. Используются 8 байт данных адресная шина и несколько линий управления. Для управления дисплеем обыно используются шина данных, сигналы RD, WR и возможно ещё некоторые управляющие сигналы. Легко эмулируется любым МК с достаточным количеством выводов.
1. 8 битов, а не байтов. Если, разумеется, речь идет о шине данных. Шина адреса в памяти - 16 битов, адресов портов - 8 битов. Сигналы RD и WR - это один и тот же сигнал, указывающий направление передачи данных. А сами данные передаются по синхронизирующим сигналам, сигналам готовности и пр.
2. Частота шины i8080 - 2 МГц, один цикл обмена - 3 такта, итого, 667 Кбайт/с. SPI на 4 МГц передает 500 Кбайт/с. Вы находите, что это большая разница? *
3. Насчет "легко эмулируется", это не совсем так: во-первых, эмуляция все-таки программная, во-вторых, на Uno/Nano за вычетом пинов, занятых последовательным портом, нет ни одного регистра шириной в полный байт, поэтому требуемые 8 бит нужно будет собирать по кусочкам. Не уверен, что с произвольным набором пинов это удастся осуществлять на частоте 2 МГц.
* это я написал в предположение, что работа с внешним устройством реализуется командами работами с памятью, команды работы с портами, насколько я помню (сами понимаете, что с i8080 я не работал минимум лет 20), выполняются заметно дольше.
1. 8 битов, а не байтов. Если, разумеется, речь идет о шине данных. Шина адреса в памяти - 16 битов, адресов портов - 8 битов. Сигналы RD и WR - это один и тот же сигнал,
Диагноз ясен. Дальше можно не продолжать.
1. Вы во второй раз упоминаете шрифты, как нечто, влияющее на скорость. Из этого я делаю вывод, что обновляется не весь экран, а его часть.
По алгоритму заложенному в библиотеку u8glib, происходит обновление вcего экрана за несколько циклов. С используемым конструктором:
цикл do {} будет выполнен 4 раза:
По моим подсчетам, обновление всего экрана должно занимать 60 мс
Размер шрифта влияет на скорость вывода. Если использовать, к примеру, только u8g_font_unifontr, то обновление занимает порядка 74 ms. И более 170 ms на смеси u8g_font_unifontr, u8g_font_fub30n и u8g_font_fub49n. Это на ProMini 16MHz.
Квстати, SPI у Вас работает на какой частоте?
А вот это вопрос. Я не знаю. Как определить, где смотреть? 0x0b3?
- разогнал частоту шины в несколько раз (насколько получилось с обеспечением стабильной работы),
Можно подробнее?
Квстати, SPI у Вас работает на какой частоте?
А вот это вопрос. Я не знаю. Как определить, где смотреть? 0x0b3?
Ну, вообще-то Вы сами должны выставить ту частоту, которая Вам нужна. Если нет - будет какая-то по умолчанию. Какая - не помню, можно посмотреть в библиотеке.
Можно подробнее?
http://arduino.ru/forum/apparatnye-voprosy/medlennaya-rabota-liquidcryst...
Сегодня получил такой дисплейчик и немного с ним повозился.
Изначально он был сконфигурирован как раз на 8080, но перепаял его на SPI4.
Пока наилучший результат - вывод изображения на весь экран (256*64) в 16-и градациях яркости (т.е. по два пикселя на байт) за 13.6 мс.
Но непонятки пока остаются.
PS. А дисплей - красивый. И размер хороший. Дороговат, правда.