Насколько мне известно, довольно многим интересно подключить микроконтроллер к обычному монитору и попробовать что-либо вывести на экран. В этой статье пойдёт речь о создании простейшей VGA-видеокарты на базе микроконтроллера atmega168-20.
Вообще говоря, этому проекту сто лет в обед. Но когда-то я обещал рассказать про эту видеокарту и здесь, но всё было лень. Теперь пришло время исполнить обещанное.
Данная видеокарта выдаёт картинку разрешением 254x240 точек при 256 цветах. Работает вся эта штука в стандартном VGA режиме 640x480 при 60 Гц развёртки. Испытывал я эту видеокарту с 6 мониторами (1 ЭЛТ и 5 ЖК), при этом на всех мониторах карта работала, за исключением монитора фирмы Acer. Чем ему не понравился сигнал, я так и не понял.
В макетном исполнении видеокарта выглядит вот так:
Видеокарта состоит из двух модулей: модуля памяти и модуля ЦАП'а.
Модуль памяти просто формирует сигналы синхронизации (HS, VS) и гашения луча (BL) и выдаёт наружу код цвета (D0...D7), который модуль ЦАП'а преобразует в уровень 0-0.7 В и подаёт на монитор. Микроконтроллер модуля памяти просто перебирает адреса статического ОЗУ, а данные из ОЗУ и есть цвета точек. С использованием микроконтроллера Atmega168 с частотой 20 МГц требуется 2 такта на одну точку, поэтому эта часть программы написана на ассемблере и развёрнута в повторяющийся фрагмент для каждой точки строки. Я позволю себе не описывать развёртку VGA-сигнала во времени, тем более, что в интернете полно информации на этот счёт (хоть и часто не совпадающей друг с другом), а я за давностью лет уже порядком подзабыл, какую временную диаграмму я реализовал в этой видеокарте.
Схема модуля памяти (открыв в новом окне можно увеличить).
Модуль ЦАП'а состоит из трёх обычных R-2R ЦАП'ов с ключами и выходным эмиттерным повторителем (из-за которого несколько «зарезается» диапазон цветов). Если кто придумает, как дёшево и сердито исправить это «зарезание» — милости прошу в комментарии. На радиокоте мне посоветовали заменить эмиттерный повторитель на истоковый, но я этот совет так и не проверил. Как видно из схемы, я отвёл 3 бита на красный, 3 бита на зелёный и 2 бита на синий цвет. Транзисторы я взял КТ-315. :)
Схема ЦАП'а.
Что именно будет отображать видеокарта определяет управляющий контроллер. Его задача — выставлять адрес на шину адреса (A0...A15), выставлять данные на шину данных (D0...D7), выставлять сигналы WR (запись по низкому уровню), OE (разрешение вывода данных при низком уровне) и выставлять сигнал A/B (переключение памяти на работу с управляющим контроллером по низкому уровню). Управляющий контроллер получает от платы памяти сигнал гашения луча (BL), который может быть использован для синхронизации записи в память видеокарты.
Работает такая видеокарта вот так:
Печатные платы и прошивки с их исходниками.
Удачи в развитии проекта!
Вообще говоря, этому проекту сто лет в обед. Но когда-то я обещал рассказать про эту видеокарту и здесь, но всё было лень. Теперь пришло время исполнить обещанное.
Данная видеокарта выдаёт картинку разрешением 254x240 точек при 256 цветах. Работает вся эта штука в стандартном VGA режиме 640x480 при 60 Гц развёртки. Испытывал я эту видеокарту с 6 мониторами (1 ЭЛТ и 5 ЖК), при этом на всех мониторах карта работала, за исключением монитора фирмы Acer. Чем ему не понравился сигнал, я так и не понял.
В макетном исполнении видеокарта выглядит вот так:
Видеокарта состоит из двух модулей: модуля памяти и модуля ЦАП'а.
Модуль памяти просто формирует сигналы синхронизации (HS, VS) и гашения луча (BL) и выдаёт наружу код цвета (D0...D7), который модуль ЦАП'а преобразует в уровень 0-0.7 В и подаёт на монитор. Микроконтроллер модуля памяти просто перебирает адреса статического ОЗУ, а данные из ОЗУ и есть цвета точек. С использованием микроконтроллера Atmega168 с частотой 20 МГц требуется 2 такта на одну точку, поэтому эта часть программы написана на ассемблере и развёрнута в повторяющийся фрагмент для каждой точки строки. Я позволю себе не описывать развёртку VGA-сигнала во времени, тем более, что в интернете полно информации на этот счёт (хоть и часто не совпадающей друг с другом), а я за давностью лет уже порядком подзабыл, какую временную диаграмму я реализовал в этой видеокарте.
Схема модуля памяти (открыв в новом окне можно увеличить).
Модуль ЦАП'а состоит из трёх обычных R-2R ЦАП'ов с ключами и выходным эмиттерным повторителем (из-за которого несколько «зарезается» диапазон цветов). Если кто придумает, как дёшево и сердито исправить это «зарезание» — милости прошу в комментарии. На радиокоте мне посоветовали заменить эмиттерный повторитель на истоковый, но я этот совет так и не проверил. Как видно из схемы, я отвёл 3 бита на красный, 3 бита на зелёный и 2 бита на синий цвет. Транзисторы я взял КТ-315. :)
Схема ЦАП'а.
Что именно будет отображать видеокарта определяет управляющий контроллер. Его задача — выставлять адрес на шину адреса (A0...A15), выставлять данные на шину данных (D0...D7), выставлять сигналы WR (запись по низкому уровню), OE (разрешение вывода данных при низком уровне) и выставлять сигнал A/B (переключение памяти на работу с управляющим контроллером по низкому уровню). Управляющий контроллер получает от платы памяти сигнал гашения луча (BL), который может быть использован для синхронизации записи в память видеокарты.
Работает такая видеокарта вот так:
Печатные платы и прошивки с их исходниками.
Удачи в развитии проекта!