OLED 3.12" на SSD1322 по 8080

Feofan
Offline
Зарегистрирован: 28.05.2017
Выручайте, пожалуйста, господа.
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 пины?
Где косячу?
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Feofan пишет:

Выручайте, пожалуйста, господа.
Arduino ProMini, OLED на SSD1322, библиотека u8glib (1.19.1).
По SPI все нормально, но не хватает скорости при работе с большими шрифтами. Поэтому решил попробовать подключение по 8080.
Вообще-то 8080 и 6800 - это процессоры, существенно отличающиеся от контроллеров AVR. Я бы не стал пробовать использовать эти настройки без детального ознакомления с особенностями ввода/вывода на указанных процессорах и их реализации в библиотеке.
 
Вероятнее, что проблема не в последовательном интерфейсе как таковом, а в чем-то другом.
Давайте считать: экран имеет разрешение 480х128 при глубине цвета 4 бита, что составляет 245760 бит.
При скорость шины SPI 4 МГц она должна обеспечивать более 16 FPS. Вам этого недостаточно?
alex_r61
Offline
Зарегистрирован: 20.06.2012

andriano пишет:

Вообще-то 8080 и 6800 - это процессоры, существенно отличающиеся от контроллеров AVR.

Вообще-то в данном случае говориттся про стандарт шины I8080. Используются 8 байт данных адресная шина и несколько линий управления. Для управления дисплеем обыно используются шина данных, сигналы RD, WR и возможно ещё некоторые управляющие сигналы. Легко эмулируется любым МК с достаточным количеством выводов.

Feofan
Offline
Зарегистрирован: 28.05.2017

Запустил с U8g2lib:

   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 -> +3.3v
  13 /WR -> 11
  14 /DC -> 12
  15 /RES-> свободен
  16 /CS -> 10

Конструктор:

U8G2_SSD1322_NHD_256X64_2_8080 u8g2(U8G2_R0, 2, 3, 4, 5, 6, 7, 8, 9, 11, 10, 12);//, U8X8_PIN_NONE);
//                               (rotation, d0, d1, d2, d3, d4, d5, d6, d7, enable, cs, dc [, reset]);

 

Feofan
Offline
Зарегистрирован: 28.05.2017

andriano пишет:

При скорость шины SPI 4 МГц она должна обеспечивать более 16 FPS. Вам этого недостаточно?

В реальности, на 16MHz ProMini + библиотека u8glib + выбранные мной шрифты, вывод данных на экран длится порядка 176 ms. Для меня это много.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Feofan пишет:

andriano пишет:

При скорость шины SPI 4 МГц она должна обеспечивать более 16 FPS. Вам этого недостаточно?

В реальности, на 16MHz ProMini + библиотека u8glib + выбранные мной шрифты, вывод данных на экран длится порядка 176 ms. Для меня это много.

1. Вы во второй раз упоминаете шрифты, как нечто, влияющее на скорость. Из этого я делаю вывод, что обновляется не весь экран, а его часть. По моим подсчетам, обновление всего экрана должно занимать 60 мс, если у Вас часть экрана за 176 - разбирайтесь, почему. Квстати, SPI у Вас работает на какой частоте?

2. Не буду подвергать сомнению Ваше утверждение, что для Вас 176 мс это много. Я сейчас работаю над проектом, в котором и 0.5 мс - это много. Исходя из этого я сделал следующее:

- выбрал текстовый экран, а не графический,

- разогнал частоту шины в несколько раз (насколько получилось с обеспечением стабильной работы),

- оптимизировал протокол обмена (уменьшил цикл с 6 фаз до 4),

- вывожу за раз по одному символу, а не строку целиком.

Возможно, какие-то из этих приемов помогут и Вам.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

alex_r61 пишет:

Вообще-то в данном случае говориттся про стандарт шины 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), выполняются заметно дольше.

alex_r61
Offline
Зарегистрирован: 20.06.2012

andriano пишет:

1. 8 битов, а не байтов. Если, разумеется, речь идет о шине данных. Шина адреса в памяти - 16 битов, адресов портов - 8 битов. Сигналы RD и WR - это один и тот же сигнал,

Диагноз ясен. Дальше можно не продолжать.

Feofan
Offline
Зарегистрирован: 28.05.2017

andriano пишет:

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

По алгоритму заложенному в библиотеку u8glib, происходит обновление вcего экрана за несколько циклов. С используемым конструктором:

U8GLIB_NHD31OLED_2X_BW u8g(10, 14);
//                         cs, a0, reset = U8G_PIN_NONE);

цикл do {} будет выполнен 4 раза:

u8g.firstPage();
do {
	позиционирование и вывод
} while (u8g.nextPage());

andriano пишет:

По моим подсчетам, обновление всего экрана должно занимать 60 мс

Размер шрифта влияет на скорость вывода. Если использовать, к примеру, только u8g_font_unifontr, то обновление занимает порядка 74 ms. И более 170 ms на смеси u8g_font_unifontr, u8g_font_fub30n и u8g_font_fub49n. Это на ProMini 16MHz.

andriano пишет:

Квстати, SPI у Вас работает на какой частоте?

А вот это вопрос. Я не знаю. Как определить, где смотреть? 0x0b3?

andriano пишет:

- разогнал частоту шины в несколько раз (насколько получилось с обеспечением стабильной работы),

Можно подробнее?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Feofan пишет:

andriano пишет:

Квстати, SPI у Вас работает на какой частоте?

А вот это вопрос. Я не знаю. Как определить, где смотреть? 0x0b3?

Ну, вообще-то Вы сами должны выставить ту частоту, которая Вам нужна. Если нет - будет какая-то по умолчанию. Какая - не помню, можно посмотреть в библиотеке.

Цитата:

Можно подробнее?

http://arduino.ru/forum/apparatnye-voprosy/medlennaya-rabota-liquidcryst...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сегодня получил такой дисплейчик и немного с ним повозился.

Изначально он был сконфигурирован как раз на 8080, но перепаял его на SPI4.

Пока наилучший результат - вывод изображения на весь экран (256*64) в 16-и градациях яркости (т.е. по два пикселя на байт) за 13.6 мс.

Но непонятки пока остаются.

 

PS. А дисплей - красивый. И размер хороший. Дороговат, правда.