Видеокарта на базе Arduino UNO R4 Renesas с поддержкой текстового режима и вывода на монитор VGA (640*480*60 Гц)

Текстовый VGA на Arduino Uno R4 Minima — библиотека RA4M1_VGA_Text v1.1.7-alpha + 11 демо

Принимайте новенького.

Ушёл примерно месяц работы - получилось то, что хочется показать. Это не классическая VGA-карта (без RAMDAC и внешней памяти), а эмуляция VGA-сигнала на одной Arduino Uno R4 Minima средствами её периферии. Пока только текстовый режим, графика в планах.

Что сделано

Библиотека RA4M1_VGA_Text v1.1.7-alpha выдаёт монохромный VGA 640×480 @ 60 Гц, текстовое поле 64×35 или 64×50 знакомест, шрифт CP866 8×8. Из железа - только три резистора на VGA-разъём и сама плата.

Как это работает

HSYNC - аппаратный, таймер, пин D9

VSYNC - программный GPIO, пин D8

Видеопоток - SPI1 на 24 МГц, пин D11, через делитель на зелёный канал VGA

Поток строится через два DMA-канала. Процессор в передаче не участвует, только готовит буфер следующей строки.

Ресурсы

Библиотека занимает ~14 КБ из 32 КБ RAM (текстовый буфер, 2 слота экранов, транспонированный шрифт, DMA-буферы). Свободно ~18 КБ под пользовательскую логику и данные игры. Слоты можно отключить #define VGA_SCREEN_SLOTS 0 — останется занято 7.7 КБ.

Что умеет

Текст: printf, printfAt, printAt, курсор с подчёркиванием

Графика знакоместами: drawBox, линии, fillRect/clearRect

Спрайты до 4×4 знакомест, режимы REPLACE/OVERLAY/SUBTRACT/XOR

Скролл региона в 4 направлениях

2 слота экранов: saveScreen/loadScreen с плавной или быстрой загрузкой

Колбэки в кадровом гашении для пользовательской логики

Пользовательский шрифт, инверсия, статус-бар с замером нагрузки CPU в реальном времени

Демо-пакет - 11 примеров

01_ScreenTest, 02_Functions, 03_Dynamic, 04_Rect, 06_SaveLoad, 07_Sprites, 08_Starfield, 09_ScrollRegion, 10_CustomFont, 11_LibraryTest, Snake. Все проверены на железе.

Видео звездного неба (08_Starfield) приложено к теме - видна плавность анимации и стабильность синхронизации.

В работе

Шрифт CP866 переделываю.

Синхронизация на некоторых мониторах с автозахватом не всегда адекватная. В процессе.

D2 и D3 заняты под подстройку позиции окна экрана..

Планы

4 цвета палитра или медленная палитра на 256 оттенков через ЦАП (A0) - фоны, градиенты, вспышки

Графический режим на той же архитектуре

Публикация на GitHub и на arduino.cc после стабилизации альфы.
Фото платы нет - разобрал, надо перепаять - разобраться с уровнями цветов, добавить 2 канала цвета, заложить канал звука и прочие мелочи. Что бы по 100 раз не переделывать плату.

Видео демо звездное небо.
Немного резюмируя - плата на самом деле унылая несмотря на мощное ядро. Памяти мало, пинов мало, DMA неполноценный. Но все тонкости прознал, когда был на середине пути. Поэтому решил добить. Получилось то, что получилось, я не совсем доволен. но поскольку на uno r4 minima библиотек мало, то пусть будет еще одна в копилку общую. Тем более с выводом на VGA монитор.

С форумом еще до конца не разобрался что да как.
Arduino UNO R4 Minima - младшая плата в новой линейке новинок. Имеет 32 бит процессор, 256 кб eeprom 32 кб ram. Есть DMA+SPI. Есть Один быстрый ЦАП до 500 кГц примерно. Входов - выходов мало. Плата в форм факторе как UNO R3.
Оказывается скетч надо. По чесноку - не готов пока делиться, так как в процессе идет. И да, суммарно файлов на 200кб получилось. 90% код. Основной файл вышел почти 1400 строк кода. Второй раз на такой подвиг я не пойду наверное никогда.
Ps не устраивает пост - снесите.

А нахрена тогда эта тема нужна? Да еще в разделе “ПРОЕКТЫ”?

Не, не надо. Оставьте себе.

Где Вы в VGA такое видели?
Да и с остальными цифрами много непоняток.
Если речь об использовании МК в качестве видеоконтроллера (безотносительно конкретных стандартов CGA, MDA, EGA, VGA), то советую посмотреть:

Стандартно EGA вроде - 40х25 знаков или 320х200 пикселей, VGA это 640х480 или 80х50 знаков. На VGA нужно выделять в 4 раза больше памяти чем на EGA.

“Стандартно” не только EGA, но даже CGA - это текст 80*25. И, кстати, VGA здесь не исключение.
Собственно, и по формату, и по цвету VGA - практически копия CGA. Отличия чисто косметические: в CGA знакоместо 8*8, а в VGA 9*16 пикселей.
Физически CGA - это всегда 200 строк растра. EGA добавил режим 350 строк растра (т.е. два возможных режима). А у VGA - уже три режима: 350, 400 и 480 строк растра. При этом в совместимых с CGA режимах на 200 строк - на самом деле физически строк 400 - каждая логическая строка (т.е. строка в видеопамяти) отображается 2 раза подряд.
По графике у CGA два режима: монохром 640*200 и 4-цветный режим (при двух палитрах) 320*200.
В EGA дополнительно появляются 16-цветные режимы с 200 и 350 строками.
У VGA - еще также 16-цветный 640*480 и 256-цветный 320*200. Максимально поддерживаемое разрешение для стандартного контроллера VGA при 256 цветах - 360*240, его нет среди стандартных режимов, но можно запрограммировать через регистры.

На всех CGA мониторах строчная развертка 16кГц. На EGA и VGA мониторы сначала переключались полярностью строчной и кадровой развертки. Поэтому можно было подключать CGA на вход телевизора. А далее - все. Это сейчас телевизоры стали понимать многие режимы и стали по сути мониторами.

Правильно.
А на VGA - почти вдвое выше.
Поэтому и 400 строк растра вместо 200.

Вижу народ к словам придираться начал. отчасти обосновано.
Шрифт - я могу сделать и 160х120 изменив знакогенератор. Просто прочесть никто не сможет. Сейчас типовой шрифт 8х8 пикселей.
Графика - Плата накладывает некоторые ограничения. В данный момент я решаю проблемы с текстовой версией. Вариант 64 в строку был выбран в угоду ex USSR компьютеров типа Радио 86РК. Если портировать оттуда программы, то переносимость будет очень высокая.
40 знаков в строке - малоинформативное, но можно.
Графический режим - максимум 600х480 1 бит. И снова ограничения платы. Можно выбрав 800
х600 режим получить честные 640*480, но тогда у нас для пользователя не остается памяти. Можно задействовать ЦАП на один цвет и получить палитру, но я снова решил оставить его пользователю. Какой смысл в оболочке, когда она все ресурсы забирает себе ?
На данный момент тестируется небольшая палитра из 4 цветов. Будет ли это раскраска только строки или одного символа или одного столбца - пока не знаю. Зависит от мощности процессора. Повторяюсь - цель - оставить пользователю максимум ресурсов.
На картинке 3D куб вращающийся - он выбирает много ресурсов. Оптимизация поможет. В графическом режиме можно будет сделать модели с зарисовкой стенок как в игре Elite как на скажем спектруме например не псевдографика.

Пусть это будет не VGA мне не принципиально. Переименовать тему я уже не могу.
ps как конечный автомат типа тетрис пинг понг или даже digger + exolon - оно заработает весьма вероятно, но тогда придется игру встраивать в движок. Снова сказываются ограничения платы.

Пока не будет поставлена внятная задача, они всегда будут сказываться.

Например,

1280х1024 full-color вообще забыть об этом проекте.

Если же поставить внятную задачу (например: смоделировать IBM PC/XT, чтобы гонять на нём “тетрис” и “диггер” с “пакменом”), то тогда появляется предметный разговор и, уже в рамках этого предметного разговора, стенания об ограничениях начинают напоминать жалобы танцора на физиологические особенности мужского организма.

наверное начать надо с кода, если он не помещается на форум оставить ссылку на проект, а не показывать картинке… наверное…)))

это как понять ? ладно бы зажали, это бы я понял…

картинки прикольные…
800 × 600=480 000 если всего 2 цвета =60 000 если будет какой то 1 цвет на экране быть чаще, то наверное можно добавить еще rle сжатие…
например следующие 57 подряд пикселей черные, и можно наверное как то попытаться экономнее записать кадр…

вращающийся куб я могу сделать и на esp32 и tft дисплее…
esp32 еще может принимать сокращенные данные и выводить только картинку, а другая плата выполнять что то еще… где не справится 1 esp справятся 2+!)))
и никакой новой ардуино не надо)))

Сейчас ищется как раз предел возможностей. И не последнюю роль играет низкоуровневый доступ. Для всех остальных случаев это просто игрушка и я рекомендую с ней не связываться. Это чуть более мощная плата ем обычная ардуино уно р3. Именно тот случай, когда пользуемся типовыми библиотеками.

Как с здесь, на гитхаб я впервые.
Делаю и тут и там, будет ссылка.

В процессе, есть баги котоыре нужно 100% обойти. Без документации вам думаю будет сложно.
Очень плохо что форум не склеивает сообщения. Буду знать.

Внятная задача - видеовыход на VGA монитор. сейчас как повторяюсь ищется предел возможностей железа.

с этим проблем нет, скажи как надо, любой поправит

Видеокарта на базе Arduino UNO R4 Renesas с поддержкой текстового режима и вывода на монитор VGA (640*480*60 Гц).
Спасибо.

Частота – в три раза
Флешь – в восемь раз
ОЗУ – в шестнадцать раз.

При этом 8 бит AVR без даже целочисленного деления и с умножением за два такта против 32-бит Cortex-M4 с длинным плавающим умножением и делением за 1 такт.

Вы это называете “чуть”?

:distorted_face:

Моё любимое!