masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Categories:

AVR VGA (на самом деле не VGA)

Кеннеди в 1962 году: "Мы решили лететь на Луну не потому, что это легко, а потому, что это сложно"
Кто-то в зале, redneck в душе, не иначе: "Съесть мешок сосновых шишек тоже сложно".
(анекдот в качестве эпиграфа)
Сейчас примерно 100% моего времени занял ремонт, так что остаётся только мечтать. Вот и помечтаю.

Очень давно хочу сделать видеовыход с минимального устройства, чтоб был как у ZX-Spectrum или лучше. Давно хочу и даже знаю, куда применить - в качестве терминала для ретрокомпьютеров и ещё чтоб у условного робота (станка, самогонного аппарата) был режим, при котором его подключаешь к монитору/телевизору и настраиваешь как хочешь.

Это хакерство чистой воды - сделать сложно, интересно и красиво минимальными средствами.

Стоимость и сложность как минимум для отладочного режима желательна минимальной, чтоб было не жалко, что детали поставлены на всякий случай, чтоб потом не думать, где и какой взять провод, как подключить к компьютеру и какой программой что делать - особенно если прошло немало лет и аппарат чёрт-те где и непонятно у кого. Ради терминала же можно расщедрится и на железки поинтереснее, конечно.

На AVR подобных проектов полно (изображение выводится программно, аппаратных решений минимум), но есть нюанс - либо адово малое разрешение по горизонтали, но есть цвет либо приличное чёрно-белое. Первое годится для игр, второе - для текста, хотя и и другое не очень-то пригодно для комфортной работы с терминалом (цвет хочется).

Причины таковы - цветное изображение формируется побайтно. Один пиксель - один байт в порт, зато сразу 256 цветов. Но тогда на один пиксель нужно много тактов (его откуда-то нужно ещё взять) - два на чтение и одни/два на запись в порт (зависит от номера порта) и это если просто выводить из памяти, а если работать с символами, спрайтами и т.д., то много меньше. Причём про прямом выводе из памяти её не хватит для сколь-либо заметного числа строк - например, 320*200 это вся память, которую теоретически можно адресовать шестнадцатью битами, но даже её никто не даст без внешних микросхем. Однако можно поиграть со спрайтами, фоном и сделать, например, игровую консоль. Вот только мне не хочется делать игровую консоль, извините, хочется терминальную, и даже 192 пикселя мне мало.

Ещё можно подключить внешнюю память - через XMEM или так, но это требует сразу как минимум (для всего лишь 64К) 19 ног с XMEM и 26 - напрямую. Память даже можно не читать, а выставлять адрес и подавать данные на видеовыход через простую схему (+ регистр защёлка для XMEM)... Для специализированного устройства ("видеокарта" на AVR для чего-то ретровосьмибитного) я бы взял память побольше, подключил напрямую и обходился оставшимися ножками. По крайней мере, буду держать такую схему в голове - на дальней полке.

Чёрно-белое изображение неплохо выводится через SPI, тут 1 пиксель - 1 бит, память эксплуатируется бережнее в 8 раз, на получение же и вывод очередного байта есть 16 тактов, так как SPI работает максимум на половине тактовой частоты. Шансы сделать красиво есть, памяти (у некоторых моделей) хватит на что-то приличное в графике, не говоря уже о тексте; для чёрно-белого монитора уже хорошо, но хочется-то цветного или хотя бы градаций яркости - вот чтоб MC (типа "нортон") выглядел не убого. Но 64 символа в строке получаются железно (на телевизоре), что глаз радует... ну настолько, насколько глаз радует РАДИО-86РК.

И вот тут в голову приходит "Спектрум". Там двумя байтами задаётся сразу восемь пикселей - одним - 8 * точка/фон и другим - а какими именно цветами будут эти точка и фон (второй байт ещё и переиспользовался для восьми "первых" байт, давая характерные спецэффекты и почву для демок типа multicolor). И при воспоминании о программировании юности появляется идея совместить SPI и восьмибитный порт.

Во-первых, результат выглядит похоже на знакоместа и для терминала идеален, а для прочего - как минимум пригоден. Во-вторых, дополнительно нужна примерно одна микросхема типа мультиплексор (к531кп11, например), может ещё триггер придётся поставить задержать бит, тут экспериментировать нужно. В-третьих нужно вывести два байта, атрибуты - 3 или 4 такта в зависимости от номера порта, на собственно пиксели или символы остаётся целых 12 или 13 тактов, что даёт определённую надежду (в порядке бреда можно запустить SPI на 1/3 тактовой частоты и тогда на всё про всё будет 24 такта, чего точно хватит).

Один байт даст 16 цветов символа и фона, отдельные мерцание и повышенную яркость я делать не буду. В пределах строки имеем два байта на 8 точек 16 цветов. Как строки будут комбинироваться друг с другом и как адресоваться - не важно, важно, что в строке байты идут подряд - и скорее атрибуты отдельной последовательностью, а пиксели отдельно. Остальное - программно и поверх алгоритма вывода строки (да, multicolor возможен без дополнительных затрат процессорного времени, если памяти не жалко). Алгоритмов может быть более одного и разные строки тогда будут выводиться по-разному (ниже пригодится).

Направления возможного роста (но тут важно уметь остановится - ПЛИС или другой микроконтроллер приделывать не стоит).

1. у нас есть 8 бит атрибутов и необходимость, коммутируя синхросигналы, убирать RGB; может можно, обойдясь ещё одним корпусом низкой интеграции, переходить в режим, при котором 8 бит задают цвет как при типовом цветном режиме - для красивого, жрущего память режима низкого разрешения - в пределах небольшой части строк, естественно (или со спрайтами).
2. попробовать сделать 256 цветов фона и 256 - символа; цена - используемые выводы портов и чуть медленнее, аппаратно - то же самое, только резисторов больше; к сожалению придётся задерживать целый байт, иначе границы цвета и фона будут отличаться (хотя  может быть даже красиво).
3. совместить выводы портов цвета для использования за пределами вывода строки, например, кнопки сканировать (вот то самое отключение порта от RGB из пункта 1 для того и нужно).
4. рассмотреть, будет ли как-то работать SPI, если не дожидаться флага окончания посылки; цели - слать байт тогда, когда действительно пора, это можно и по тактам посчитать и попробовать выводить, например только первые 6 бит, а потом - уже следующий байт - для текстовых режимов высокого разрешения с узкими символами.
5. аналогично пункту 3 - совместить выход на SPI и использовать его вне вывода строки.

У нас есть VGA и телевизор, отличающие тактовой частотой. Часть трюков на VGA может и не получиться с приемлемым (не хуже, чем у "Спектрума") разрешением без разгона контроллера, зато на телевизоре можно попробовать использовать чересстрочную развёртку для повышения разрешения по вертикали - в отличии от CRT, на LCD-телевизорах она может оказаться приемлемой.

На 20 МГц AVR на VGA через SPI получается 256 пикселей по горизонтали. Вот в точности как Спектрум. Маловато для текста. Если взять кварц на 25 с чем-то МГц, то есть слегка разогнать контроллер, зато то будет 320 пикселей (VGA помните, Doom2 там или Heretic), что получше, до 52 символов можно при шестибитной ширине засунуть.

На TV (Pal, Secam) помню, что примерно 50 микросекунд на строку, что даст примерно 500 пикселей, если отдавать их через SPI на 10 МГц, при кварце на 20МГц.... однако! Вот что значит медленная развёртка! Без какого-либо разгона, а с разгоном можно и 640 получить (и сделать типовой экран с шириной строки 80 символов).

256 пикселей мне уже терпимо, больше - лучше. У 1284 - 16 килобайт памяти, а нужно 6 кб на экран 256*192 или 9600 для 320*240 плюс атрибутов сколько то - и это если говорить о честной графике, но неиспользуемые участки можно вообще не использовать, а текст выводить текстом, что тоже экономно.

Большую часть времени процессор занят выводом пикселей (но может быть и нет, если строка пуста), время обратного хода развёртки остаётся на программы. Там никакого realtime, к сожалению. На РК-86 отключали экран во время работы с магнитофоном, но можно пойти иначе - во время формирования импульсов есть изрядный запас времени и можно туда поместить аналоговый ввод-вывод, который для внешнего кода будет выглядеть как буфер с ПДП - например, нечто выводит число за числом на ЦАП (PWM).
Tags: КомпьютерноеЖелезо, Красиво, Философское, ХочетсяСтранного
Subscribe

  • Маленькая ехидная мысль про непримиримую борьбу

    Много раз слышал "если не можешь победить, присоединись" (как вариант - "...возглавь"). Звучит на первый взгляд логично, хотя и оппортунистично…

  • (no subject)

    "Володя, а теперь выйдите из себя и войдите по-нормальному"... запомнилась одна фраза, остальное было почти обыденным, только ещё были…

  • (no subject)

    Приснилось, что блоггерша из Уфы (за что мне Уфа, я там даже не был) прислала мне посылку - помочь разобраться с модулем приёмопередатчика - то ли…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments