ATmega8 + OLED SSD1306

Обсуждаем контроллеры компании Atmel.
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: ATmega8 + OLED SSD1306

Сообщение Adrift »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4669671#p4669671"]А для ОЛЕДов придется делать конверсию шрифта в памяти. Либо иметь 2 версии одного шрифта - с построчной и постолбцовой организацией.[/uquote]
Есть еще вариант для любознательных )
Спойлер

Код: Выделить всё

constexpr uint8_t seven[] = 
{
	8, 12,
	0b00000000,
	0b11111110,
	0b11000110,
	0b11000110,
	0b00000110,
	0b00001100,
	0b00011000,
	0b00110000,
	0b00110000,
	0b00110000,
	0b00000000,
	0b00000000
};

template<const auto& Arr>
class Convert
{
public:
	consteval Convert()
	{
		int rpos = 0;

		for (int i = 0; i < height(); i++)
		{
			int wpos = i;
			for (int j = 0; j < width(); j++)
			{
				bool val = get(rpos++);
				put(wpos, val);
				wpos += height();
			}
		}
	}

	consteval bool get(int pos) { return Arr[pos / 8 + 2] & (0x80 >> (pos & 7)); }
	consteval void put(int pos, bool val) { data[pos / 8] |= val << (7 - (pos & 7)); }

	static consteval uint32_t width()  { return Arr[0]; }
	static consteval uint32_t height() { return Arr[1]; }

	uint8_t data[std::size(Arr) - 2]{};
};

constexpr Convert<seven> sevenMod;
sevenMod.data - это массив во флеше, так можно весь шрифт во время компиляции сконвертить, причем с дополнительными опциями, типа русские символы убрать, а английские оставить только заглавные и еще в начале таблицу со смещениями до символов добавить.
Реклама
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATmega8 + OLED SSD1306

Сообщение Just_Fluffy »

shonty писал(а):Можно и построчно, но я предпочитаю выводить символ столбцами слева направо. То тогда строка выводится последовательно столбцами. Если построчно, то вы как представляете? Вам нужно вывести строку символов, вы на каждый символ будете поле вывода переопределять?
Конечно, для каждого символа переопределяется окно по размеру символа, через RASET/CASET... Но тут я или криво читала даташиты на дисплеи, или оконный вывод построчный у TFT-дисплеев.
Хотя, какая мне разница, у вас получилось - я рада за вас.
shonty писал(а):а что там писать? вот только сейчас подключил дисплей и заранее написаный драйвер.
Я к тому, что написать на асме программу уровня тех устройств на 128 меге, что есть в статьях, особенно с вашим подходом оптимизации, экономии ОЗУ и максимального использования регистров - будет долго очень. И отлаживать ее - будет сложно...

Adrift, не, ну вы еще кресты притянули... Сейчас прибежит двадцать девятый и будет кричать, что это расточительно )))) Только современный ассемблер, только хардкор.
Белая и Пушистая
Реклама
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: ATmega8 + OLED SSD1306

Сообщение shonty »

Just_Fluffy писал(а):Но тут я или криво читала даташиты на дисплеи, или оконный вывод построчный у TFT-дисплеев.
Возможно и я криво читал даташит, а возможно производители не тем концом контроллер к матрице приклеивают..
но CASET я определяю как 0x2b, а RASET как 0x2a. Хотя с MADCTL как только не изгалялся :)
Just_Fluffy писал(а):Я к тому, что написать на асме программу уровня тех устройств на 128 меге, что есть в статьях, особенно с вашим подходом оптимизации, экономии ОЗУ и максимального использования регистров - будет долго очень. И отлаживать ее - будет сложно...
Не знаю что за устройства, но однажды я написал драйвер под ST7735, и в последствии с небольшими изменениями он был доработан и под ILI9341 и под разные разрешения от 128*128 до 240*320. Если попадётся 320*480, то переделать не составит больших затрат :dont_know:
И адаптировать драйвер под контроллер для меня тоже не особо затратно. например в LGT 32-х битный буфер spi, а имея базу, скорректировать не сложно))
Just_Fluffy писал(а):или оконный вывод построчный у TFT-дисплеев.
Вывод можно настроить полюбому..
Но рациональнее задавать один раз поле, а потом лить в него последовательно символ, несколько столбцов бакгроунда (межсимвольный промежуток), потом опять символ и т.д..
Поэтому перезаливка полей, даже на очень крупных шрифтах, глазу не заметна..)) я просто не так часто трачу времени на смену координат)) Дисплеи на 8мгц SPi работают довольно шустро. Глаз чуть-чуть только подлавливает первичную полную заливку))
Just_Fluffy писал(а):Но тут я или криво читала даташиты на дисплеи, или
или дисплеи, которые у нас традиционно принято считать ILI9341 и прочими, на самом деле идут с другими контроллерами, в частности могут попадаться SPFD5408A, R61520 и другие.. Ну это проявляется, если уж совсем досканально в настройках рзбираться.. Не помню.. там и 2 бита в MADCTL вроде разные.. ещё какие то редко используемые опции.. Но разница незначительна и заморачиваться не стоит..

И по поводу что на асме писать страшно)) В плане того же драйвера для ТФТ я вспотел только один раз) потом по накатаной..
Но, как говориться, лучше 100 раз вспотеть, чем один раз остыть :)) :))

Добавлено after 35 minutes 45 seconds:
Just_Fluffy, а как вы отрисовываете графики, если у вас горизонтальный вывод? График вроде выводится побарно))
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: ATmega8 + OLED SSD1306

Сообщение Adrift »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4669845#p4669845"]Но тут я или криво читала даташиты на дисплеи, или оконный вывод построчный у TFT-дисплеев.[/uquote]
Какой угодно там вывод и на современных дисплеях часто достаточно один байт поменять при инициализации. Например, для ST7735 чтобы как его не поверни отрисовка шла слева направо и сверху вниз нужно в MADCTL записать одно из 4-х значений: 0xA0, 0x60, 0xC0, 0x00. Однако бывают контролеры на которых поменял ориентацию на альбомную и нужно флипить X и Y, а если совсем замороченные где каких-то битиков не хватает, там еще сложнее.
Just_Fluffy писал(а):не, ну вы еще кресты притянули... Сейчас прибежит двадцать девятый и будет кричать, что это расточительно )))) Только современный ассемблер, только хардкор.
Пусть те кто кричат про расточительность попробуют сконвертить шрифт потратив 0 байт RAM и флеша и 0 тактов CPU, на чем угодно )

Добавлено after 25 minutes 29 seconds:
[uquote="shonty",url="/forum/viewtopic.php?p=4669873#p4669873"]а как вы отрисовываете графики, если у вас горизонтальный вывод? График вроде выводится побарно))[/uquote]
Что за график? Если что-то такое, то там только прямоугольники и линии, для которых направление отрисовки не имеет значения.

Изображение

Кстати, попробуйте на своем ILI9341 осциллограмму вывести, а потом энкодером ее масштабировать, у многих на ARM тормозит )
Вложения
graph.png
(19.86 КБ) 550 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: ATmega8 + OLED SSD1306

Сообщение shonty »

Adrift писал(а):Пусть те кто кричат про расточительность попробуют сконвертить шрифт потратив 0 байт RAM и флеша и 0 тактов CPU, на чем угодно )
не кричать не пробовать не буду :)))

Когда то я делал всякие шрифты. Делал индексированные переменной ширины. И, если речь идёт об экономии места, а шрифт очень крупный, то применял такой изврат:
Например из буквы "Щ" через таблицу индекса можно было выбрать Щ, Ш и Ц.
Из буквы "Ю" выбиралась О, причём и ру и ен.
Так же буквы А, С, Р, К.. и т. д. дублировали друг друга ру и ен..
А в основной таблице последовательность была "Ъ(небольшой пробел)Щ" и выбиралось соответственно Ъ, Ь, Ы, Щ, Ш, Ц :)
Английская заглавная "I" выбиралась в любом месте..
То есть для полной таблицы ascii высотой 24px экономия была существенная))

И в какой то момент я на всё это забил))
Мы же книги на дисплеях не пишем. И вполне хватает несколько каких то стационарных надписей. Поэтому мне проще сделать любую надпись одним блоком, пусть даже символы в надписях повторяются, но это всё равно будет экономичнее по многим параметрам, чем использование таблиц.
А таблицы у меня на в основном 0123456789ABCDEFx и дополнительные символы если нужны типа % и т.п..))
При накопленном опыте и инструментах в принципе любую блочную надпись сделать не сложно. Нужды в таблицах нет :dont_know:

Добавлено after 8 minutes 2 seconds:
Adrift писал(а):Кстати, попробуйте на своем ILI9341 осциллограмму вывести, а потом энкодером ее масштабировать, у многих на ARM тормозит )
масштабирование пока не осваивал и даже о алгоритме масштабирования пока не задумывался :dont_know:

Добавлено after 3 minutes 12 seconds:
Хотя вру.. В последнем графике есть зачатки настройки масштабирования.. Но это чисто что бы график в нужное поле вогнать )) Всё равно стационарно)
Реклама
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: ATmega8 + OLED SSD1306

Сообщение Adrift »

[uquote="shonty",url="/forum/viewtopic.php?p=4669939#p4669939"]Когда то я делал всякие шрифты. Делал индексированные переменной ширины. И, если речь идёт об экономии места, а шрифт очень крупный, то применял такой изврат:
Например из буквы "Щ" через таблицу индекса можно было выбрать Щ, Ш и Ц.
Из буквы "Ю" выбиралась О, причём и ру и ен.
Так же буквы А, С, Р, К.. и т. д. дублировали друг друга ру и ен..[/uquote]
Не вы одним таким страдали ) Вопрос в том делалось ли это все вручную или какая-то утилита все проделывала автоматически... Моя старая прога для ПК генерила вот такие текстурки:

Изображение

Тут 159 символов 8x12, где также обрезано пустое пространство по краям, потом символы поворачиваются или флипятся, cреди всего этого находятся дубликаты и т.д.. Заполнение текстуры 98% и упаковка в ней символов - это самая сложная часть. Потом я уже экспорт для мк добавлял...
shonty писал(а):Мы же книги на дисплеях не пишем. И вполне хватает несколько каких то стационарных надписей. Поэтому мне проще сделать любую надпись одним блоком, пусть даже символы в надписях повторяются, но это всё равно будет экономичнее по многим параметрам, чем использование таблиц.
А таблицы у меня на в основном 0123456789ABCDEFx и дополнительные символы если нужны типа % и т.п..))
При накопленном опыте и инструментах в принципе любую блочную надпись сделать не сложно. Нужды в таблицах нет :dont_know:
Суть в том, что у вас один шрифт, но перед использованием можно указать как именно его хочется использовать. Например, хотите вы все надписи делать одним шрифтов, а время выводить другим, тогда можно для этого другого передать строку ":0123456789" и будет создан новый массив во флеше где присутствуют только эти символы, с отрисовкой по горизонтали или диагонали, как вам угодно. И поскольку оригинальный массив не используется, то компилятор его выкинет, оставив только новый. Никаких утилит, работает с tiny13 )
shonty писал(а):масштабирование пока не осваивал и даже о принцыпе масштабирования пока не задумывался :dont_know:
Не, не в том смысле масштабирование ) Было в одном делении 10us, крутанули энекодер и стало 20us, старую осциллограму нужно стереть не затрагивая всего остального и потом нарисовать новую, возможно еще какой-то текст поменяется.
Вложения
font.png
(3.34 КБ) 557 скачиваний
Реклама
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATmega8 + OLED SSD1306

Сообщение Just_Fluffy »

shonty писал(а):Не знаю что за устройства, но однажды я написал драйвер под ST7735, и в последствии с небольшими изменениями он был доработан и под ILI9341 и под разные разрешения от 128*128 до 240*320. Если попадётся 320*480, то переделать не составит больших затрат
И адаптировать драйвер под контроллер для меня тоже не особо затратно.
Да причем тут драйвер!
Я к тому, что писать на асме весь функционал устройства при размерах кода более 4-8-16 кб долго и не всегда оптимально.
shonty писал(а):а как вы отрисовываете графики, если у вас горизонтальный вывод? График вроде выводится побарно))
попиксельно, батенька, попиксельно.
Точно так же, как не-горизонтальные, не-вертикальные линии, окружности...
Для дисплеев с 8бит на пиксель и выше - непосредственный вывод пикселя (да, это накладно, через RASET/CASET задать только первую координату, потом заслать 1 пиксель.
Для ОЛЕД1306 - драйвер в памяти держит видеобуфер, все рисование идет в этом буфере. Потом по команде идет апдейт в дисплей только тех областей, которые менялись после прошлого апдейта.
Adrift писал(а):Кстати, попробуйте на своем ILI9341 осциллограмму вывести, а потом энкодером ее масштабировать, у многих на ARM тормозит )
Так тут надо разделять математику и вывод. Если пытаться отрисовать 10000 точек на дисплее шириной 320 точек (т.е. 30+ точек на один столбец дисплея) - это одно. Если пробегаемся по массиву 10000 точек и усредняем их во второй массив 320 точек - и выводим только эти 320 точек - это другое.
В основном тормоза получаются в математике - обработать большой массив...
Белая и Пушистая
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: ATmega8 + OLED SSD1306

Сообщение shonty »

Just_Fluffy писал(а):попиксельно, батенька, попиксельно.
Точно так же, как не-горизонтальные, не-вертикальные линии, окружности...
нее.. :)) у меня по выводу графика более примитивный сюжет))
В памяти массив из 320 переменных. Тупо считываю переменную и выожу столбец графика. Что бы разрывов сильных не было точка графика 3px.
Поле один раз задаю. Столбцы сами инкрементируются..

Но я писал, я особо графиками не злоупотребляю))
Вот сейчас перед выбором стою: накатить график или просто в цифрах девиацию за определённое время выводить))

Кстати)) раз пошла такая пьянка)
Как вы относитесь к тачскринам на этих дисплеях?
я заказал 5 шт. дисплеев, а продавец перепутал, прислал с тачем.. Что то меня тач не впечатлил :dont_know:
Да он ещё блёклость какую-то придаёт..
Хотя вам наверное пофиг) Вы же на заказ кодите, а я для себя)
Так и не придумал как эти тачи оторвать :)) боюсь сломать :))

Добавлено after 8 minutes 21 second:
Just_Fluffy писал(а):попиксельно, батенька, попиксельно.
ну вот и разобрались)) Теперь мне понятно, почему вам с этими дисплеями работать грустно, а мне весело :)) :))

Добавлено after 6 minutes 55 seconds:
Попиксельно :shock: это вроде caset/raset/ramwrite + цвет пикселя.. :dont_know:
72 бита на пиксель? :facepalm:
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: ATmega8 + OLED SSD1306

Сообщение Adrift »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4669974#p4669974"]Так тут надо разделять математику и вывод. Если пытаться отрисовать 10000 точек на дисплее шириной 320 точек (т.е. 30+ точек на один столбец дисплея) - это одно. Если пробегаемся по массиву 10000 точек и усредняем их во второй массив 320 точек - и выводим только эти 320 точек - это другое.[/uquote]
Речь про тормоза вызванные медленной отрисовкой. Скажем в одном случае берем из массива 320 байт подряд, потом крутим энкодер и берем 320 байт через один. Выводят не точки, а наклонные линии, которые, в свою очередь, состоят из вертикальных или горизонтальных линий поменьше. Вот ими все и рисуется, а тормозит у тех кто рисует по точкам, хотя на AVR по идее будет тормозить в любом случае )
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATmega8 + OLED SSD1306

Сообщение Just_Fluffy »

Adrift, а как нарисовать не-вертикальную и не-горизонтальную линию можно? Только по точкам... Брезенхемом или другим алгоритмом (но брезенхем быстр и целочислен)... Другого пути нет.
А графики я рисую почти всегда линиями, кстати. От одной точки к другой.
Но с учетом того, что пределы графика редко когда совпадают с областью вывода - сначала все данные обрабатываются и укладываются в массив размерностью по ширине поля вывода.
Далее ищется мин/макс для масштабирования. Далее масштабирование можно делать сразу при выводе, либо прогнать по массиву.
Если точек данных меньше, нежели столбцов в области вывода - вывод растягивается. Ну и далее линии от первой точки ко второй, от второй к третьей и т.д.
В случае TFT, если ОЗУ позволяет, проще "отрисовать" график в каком то буфере, а потом выплюнуть весь буфер в область графика. Но тут уже надо смотреть, что будет быстрее.
shonty писал(а):Хотя вам наверное пофиг) Вы же на заказ кодите, а я для себя)
На заказ я консультирую тупых юзеров по работе в учетной системе, да правлю/пишу код на PLSQL.
А радиолюбительство - это хобби. Если на заказ что то получится сделать - хорошо. Но это сейчас стало достаточно редко...
shonty писал(а):Как вы относитесь к тачскринам на этих дисплеях?
Вполне нормально. Но после емкостных тачей на телефонах, когда там еще всякие покрытия олеофобные, резистивный пластмассовый тач возвращает меня в эпоху палмтопов со стилусами. Надо не прикасаться, а нажимать - не тач-скрин, а пуш-скрин))). И засирается он сильно.
А в остальном - волне себе норм. Опрос тача делается на SPI с медленной скоростью (500кГц, например), его можно сделать на машине состояний и на прерывании от SPI.
Минус тача в том, что его координаты никак не соответствуют координатам в дисплее. Нужно делать калибровку хотя бы по двум точкам диагональным, а лучше по 4м или по 9.
А дальше все просто. На экран добавляются контролы - это могут быть метки, кнопки, чеккеры, радиобатоны... При добавлении контрола задается его реакция на нажатия, области нажатий...
Далее рисовальшик рисует эти объекты на дисплее. Старт опроса тача идет по сигналу нажатия от него, дальше вычисляются координаты нажатия. После получения координат идет перебор экранных объектов - если нажатие попадает в область нажатия какого то из объектов - генерируется событие "нажатие" с номером объекта и номером его области нажатия. Либо сразу колбек на обработчик нажатия для конкретного контрола. Если никуда не попало - то нажатие игнорируется.
Но вот честно, на асме я б это не рискнула делать. Асмовые вставки для оптимизации обмена с дисплеем - да, можно. Ибо обмен - бутылочное горлышко при выводе графики. А остальное все - ЯВУ. Это проще и быстрее. А с моим подходом к абстракции от железа - даже легко переносимо между разными МК. И достаточно легко - между разными семействами МК.
Белая и Пушистая
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: ATmega8 + OLED SSD1306

Сообщение Adrift »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4670012#p4670012"]а как нарисовать не-вертикальную и не-горизонтальную линию можно? Только по точкам... Брезенхемом или другим алгоритмом (но брезенхем быстр и целочислен)... Другого пути нет.[/uquote]
Спойлер

Код: Выделить всё

drawLine(int x1, int y1, int x2, int y2, uint16_t color)
{
	int dx = std::abs(x2 - x1);
	int dy = std::abs(y2 - y1);

	if (!dx)
	{
		fillRect(x1, y1, 1, dy + 1, color);
		return;
	}

	if (!dy)
	{
		fillRect(x1, y1, dx + 1, 1, color);
		return;
	}

	if (dx > dy)
	{
		if (x1 > x2)
		{
			std::swap(x1, x2);
			std::swap(y1, y2);
		}

		int addy = (y2 > y1) ? 1 : -1;
		int sum = dx + dx / 2;
		int dx_ = dx;
		while (dx-- >= 0)
		{
			if (sum >= dx_)
			{
				setWindow(x1, y1, width() - x1, 1);
				sum -= dx_;
				y1 += addy;
			}
			writeColor(color);
			sum += dy;
			x1++;
		}
	}
	else
	{
		if (y1 > y2)
		{
			std::swap(x1, x2);
			std::swap(y1, y2);
		}

		int addx = (x2 > x1) ? 1 : -1;
		int sum = dy + dy / 2;
		int dy_ = dy;
		while (dy-- >= 0)
		{
			if (sum >= dy_)
			{
				setWindow(x1, y1, 1, height() - y1);
				sum -= dy_;
				x1 += addx;
			}
			writeColor(color);
			sum += dx;
			y1++;
		}
	}
}
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATmega8 + OLED SSD1306

Сообщение Just_Fluffy »

Adrift, оптимизированный Брезенхем )))))
Белая и Пушистая
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: ATmega8 + OLED SSD1306

Сообщение shonty »

Just_Fluffy писал(а):Минус тача в том, что его координаты никак не соответствуют координатам в дисплее. Нужно делать калибровку хотя бы по двум точкам диагональным, а лучше по 4м или по 9.
Да-да.. Середину вроде откалибровал, а края всё равно сбиваются :dont_know:
Just_Fluffy писал(а):И засирается он сильно.
И чисто по тактильным ощущениям, да и по эстетическим не нравится ..

А с работой то я его разобрался. как раз на lgt8 и гонял.
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: ATmega8 + OLED SSD1306

Сообщение Adrift »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4670020#p4670020"]оптимизированный Брезенхем )))))[/uquote]
Так на C/C++ пишешь один раз, потом только оптимизируешь )
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 534
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATmega8 + OLED SSD1306

Сообщение Just_Fluffy »

shonty, в интернетах пишут, что тач нельзя опрашивать на высоких скоростях, как то скорость SPI влияет на точность позиционирования. Может там АЦП работает не сам по себе, а в момент чтения данных, не знаю. Но требование к низкой скорости заставило меня на АВРке делать конвеер на прерывании. Я калибровку делала по 4 точкам в углах экрана. В принципе, хватает. Под палец области надо большие делать, точности хватает.

Adrift, Ага )) Везде так. И потом из года в год таскаешь за собой готовые блоки по проектам... Единственное, я по нормальному кресты так и не освоила. В школе пичкали бейсиком, в ВУЗе - паскалем.
Первый раз Си потрогала, когда автоматизацию управления установкой делали в одном НИИ в 1996 году.

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

Совсем оффтоп.
СпойлерБыл цикл интересных статей про графику у GoldenAndy. Я не со всем там согласна, но в целом - интересно и кой-какие идеи я себе утащила.Графика для микроконтроллера - 3 уровня абстракции
Сжатие изображений
Растровые шрифты и оптимизация занимаемого места
Инструмент сжатия изображений
Графическая библиотека
Белая и Пушистая
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: ATmega8 + OLED SSD1306

Сообщение shonty »

Just_Fluffy писал(а):shonty, в интернетах пишут, что тач нельзя опрашивать на высоких скоростях, как то скорость SPI влияет на точность позиционирования.
У меня в проекте на spi висел дисплей, тачскрин и ещё один датчик. У датчика spi вообще с обратным клоком был..
Так что при обращении к чему либо spi постоянно перенастраивался.

Аппаратный spi.

Добавлено after 39 seconds:
Всё соблюдал) и полярность клока и скорости))

Добавлено after 2 minutes 35 seconds:
Just_Fluffy писал(а):И давайте, если хочется поговорить про графику и разные дисплеи - то уползем в отдельную тему? А то как бы тема про мегу 8 и олед....
Давайте.. Но ведь начнём про одно, съедем на другое))
Аватара пользователя
kelvin
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вс дек 19, 2010 14:37:45
Контактная информация:

Re: ATmega8 + OLED SSD1306

Сообщение kelvin »

Приветствую!

купил GM009605 v4.3 (1шт) прикрутил к Nano3, но есть проблема..

Код: Выделить всё

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SSD1306_I2C_ADDRESS 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);
  
  // Инициализация дисплея
  if(!display.begin(SSD1306_I2C_ADDRESS, OLED_RESET)) {
    Serial.println(F("Failed to initialize SSD1306!"));
    while(1);
  }else{
    Serial.println(F("Success to initialize SSD1306!"));
  }

display.clearDisplay(); // Очистить экран
display.setTextSize(1); // Установить размер текста
display.setTextColor(SSD1306_WHITE); // Установить цвет текста
display.setCursor(0,0); // Установить курсор в начало
display.print(F("Hello, World!")); // Вывести текст
display.display(); // Обновить экран
}

void loop() {
  display.clearDisplay(); // Очистить экран
  display.setTextSize(1); // Установить размер текста
  display.setTextColor(SSD1306_WHITE); // Установить цвет текста
  display.setCursor(40, 25); // Установить курсор
  display.print(F("Круг:")); // Вывести текст
  display.drawCircle(64, 32, 20, SSD1306_WHITE); // Нарисовать круг
  display.display(); // Обновить экран
  delay(1000); // Задержка в 1 секунду
}
Монитор выдал: Success to initialize SSD1306!

А экран ничего. просто тёмный.
Брак?
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: ATmega8 + OLED SSD1306

Сообщение veso74 »

Код: Выделить всё

  if(!display.begin(SSD1306_I2C_ADDRESS, OLED_RESET)) {
заменить на

Код: Выделить всё

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Аватара пользователя
kelvin
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вс дек 19, 2010 14:37:45
Контактная информация:

Re: ATmega8 + OLED SSD1306

Сообщение kelvin »

Заработало!!!!

Благодарю!!
Кто стремится - тот добьется, кто ищет - тот найдет,
ибо выход всегда есть, напролом или в обход!
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

Re: ATmega8 + OLED SSD1306

Сообщение shonty »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4669493#p4669493"]Давайте вернемся в русло темы OLED1306. Дисплей имеет 1 бит на пиксель, организация - горизонтальными блоками высотой 8 пикселей (1 байт).
Любой вывод, который не идет сразу в 8 пикселей одного блока - сразу становится интересным - задача комбинирования уже отрисованного изображения и выводимого без доступа к данным отрисованного - становится нетривиальной.
Обычно для таких дисплеев выделяется буфер в ОЗУ. В нашем случае 64*128 = 8192 бита или 1 килобайт.
И все рисование производится в этом буфере, который потом можно выплюнуть в дисплей.
Можно уменьшить размер буфера, например, до 8 пикселей по вертикали, но это менее удобно.

Хотя, если писать на асме и стараться использовать только регистры, то, наверное, можно минимизировать использование ОЗУ. Но... зачем?[/uquote] Так и не смог понять, зачем вам считывать пиксели с матрицы, так как пиксели там те, которые вы сами нарисовали.. Но вот всерьёз задумался над переходными эффектами смены изображения.. типа растворения или "стекания".
Но мысль не использовать ОЗУ, а перед выводом делать AND или OR с маской. И программно это сделать не сложно. Тут основная сложность придумать нормальную маску.. :dont_know:
Для "растворения"/"проявления" в идеале подошёл бы генератор случайных чисел, но это затратно для меги :dont_know:
Ответить

Вернуться в «AVR»