Игровая видеоконсоль на avr avga

Генерация видеосигнала при помощи контроллеров AVR. Часть 1. Аппаратная подготовка

Источник: http://vg.ucoz.ru/publ/programmirovanie_na_assemblere_avr/generacija_videosignala_pri_pomoshhi_kontrollerov_avr/3-1-0-8

Генераторатор видеосигнала на МК (теория)

Источник: http://my-avr.at.ua/publ/1-1-0-25

Данный проект посвящен формированию VGA сигнала при помощи 8-ми битных

Простой VGA/Видео адаптер

(проект о формированию VGA сигнала при помощи 8-ми битных MCU фирмы AVR)

Эта статья была опубликована в Atmel Application Journal #6 Winter 2006

(Что, в свое время дало мне “хорошего пинка” в деле мотивации

совершенствования моих познаний в области микроконтроллеров).

Предыстория проекта.

    Несколько месяцев назад, задавшись целью подключить VGA-монитор для вывода  текстовых данных с микроконтроллерной системы сбора информации – я с удивлением обнаружил, что ничего сколько-нибудь “внятного” и доступного для повторения “ на коленке ” по этой теме в Интернете отсутствует.

    Конечно, существуют  промышленные платы стандарта PC-104, можно кое-что “нарыть” и на www.opencores.org для реализации на FPGA, есть графические контроллеры Fujitsu, кто-то здесь недавно на местной конференции предлагал за 5000$ проект на ACEX’е, но надо признать – все это страшно далеко от народа..

    Хотелось что-то гораздо более “дешевое и сердитое”. Предварительные прикидки показывали, что из наиболее распространенных  и достаточно быстродействующих микроконтроллеров подходит продукция фирмы ATMEL.

    8-ми битное RISC ядро AVR обеспечивает пиковую производительность порядка 16 MIPS на тактовой частоте 16MHz. Плюс на подходе более скоростные семейства Mega48,88,168 поддерживающие официальную тактовую частоту 20MHz.

При этом скорость вывода данных через стандартный порт ввода-вывода при FOSC = 16MHz командами  вывода в порт (out portx..) 8 MIPS. К тому же я уже имел достаточный опыт  разработки устройств на микроконтроллерах  AVR.

И я  засучил рукава..

Результат своей работы я представляю на ВАШ суд.

Поставленная техническая задача:

    Цель которую я поставил для себя, достаточно проста на первый взгляд:

Ограничившись одним корпусом распространенного MCU типа Mega8,16,8535

и т.д., и минимумом внешних элементов сконструировать символьный дисплей-адаптер с разрешением  > 15×15 символов, который бы выводил информацию на VGA монитор при стандартных частотах VGA сигнала. Информацию символьный адаптер должен получать через стандартный USART порт микроконтроллера. Частота используемого микроконтроллера стандартная -16MHz.

    Данная задача на данный момент успешно решена.Более того – проект несколько расширен и дополнен введением формирования обычного видео ч.б. (PAL/SECAM) сигнала. Т.е. в зависимости от положения джампера тип формируемого видео сигнала VGA либо Composite Video.  

Фотографии и схемы проекта:

Ниже приводится принципиальная схема простого VGA/Video адаптера (откорректировано 28.06.2011):

Примечание

Принципиальная схема откорректирована, на  старой схеме были  ПЕРЕПУТАНЫ положение  порта PAL-синхронизации и джампера PAL – VGA!Из-за этого  в “железе” у многих схема  НЕ РАБОТАЛА.

Так все это выглядит в железе, собранном на “коленке” за один час:

А вот что мы получаем на экране монитора:

И телевизора:

Технические характеристики проекта:

Технические характеристики VGA-адаптера:

Количество символов: 20 строк по 20 символов

Разрешение матрицы знакогенератора: 8×12 точек

Кодовая таблица знакогенератора: WIN 1251

Формируемый сигнал: VGA

Разрешение: 640×480

Частота кадровой синхронизации: 60Hz

Скорость обмена UART 19200 bps

Технические характеристики Video-адаптера:

Количество символов: 20 строк по 38 символов

Разрешение матрицы знакогенератора: 8×12 точек

Кодовая таблица знакогенератора: WIN 1251

Формируемый сигнал: Composite Video(PAL/SECAM)

Разрешение: 625 строк (чересстрочная)

Частота кадровой синхронизации: 50Hz

Скорость обмена UART 19200 bps

Тип используемого микроконтроллера: Mega8, Mega16, , Mega32, Mega8535 и т.д.

Тактовая частота микроконтроллера стандартная – 16Mhz

Примечание:

  1. Для того чтобы избежать искажения изображения при приеме данных через UART, для VGA рекомендуется производить обмен данными с адаптером  в течении приблизительно 300-600 мкс после сигнала  вертикальной синхронизации VSYNC (во время обратного хода луча по кадру).
  2. Объема RAM памяти Mega8535 (512 байт) не достаточно для формирования Видео сигнала с разрешением 38×20 символов.

Алгоритм работы программы:

Пояснения по работе программы:

    Алгоритм рендеринга изображения достаточно традиционен, главное ноу-хау проекта в использовании для побитного вывода изображения – сдвигового регистра SPI SPDR через бит MOSI. При этом образуется двухступенчатый конвейер рендеринга:

В то время, как последующий байт для рендеринга выбирается из памяти,

предыдущий байт выводится через  сдвиговый регистр SPI SPDR MOSI..

Заключение:

    Поскольку данный проект написан на С (WinAVR GCC),  он легко масштабируем для увеличения разрешения и частот регенерации дисплея.

Так,  на  микроконтроллерах Mega48,88,168 поддерживающих официальную тактовую частоту 20MHz возможно получение разрешения 20 строк по 25-30 символов при абсолютно той же схемотехнике (возможности оверклокинга автор намеренно не рассматривает).

                    Применения проекта не ограничиваются одним лишь терминальным вариантом (смотрите примеры в папке examples) – не смотря на серьезную загруженность процессора регенерацией дисплея, оставшейся мощности вполне достаточно для организации обработки например нескольких цифровых и аналоговых сигналов и реакции на них, а также выдаче результатов их измерений на дисплей в real-time (охранные системы, АСУТП, КИПиА и т.д.). Автор располагает улучшенными вариантами  подобных систем с разрешением символьного дисплея 40×24  символов в режиме VGA, работающими в коммерческих изделиях.

Вы можете свободно пользоваться материалами данной публикации в образовательных и некоммерческих целях. Все права на проект зарегистрированы. Перепечатка, публикация в  Интернете, журналах, использование в коммерческих приложениях – возможна только после согласования с автором .

Файлы:

Исходные тексты проекта, примеры применения

Данный материал в формате “PDF”

 

Примечание

Исходники подкорректированы  под WinAVR-20090313 portable ( “пофиксена” специфика команд: cbi, sbi, PRG_RDB etc.),
не устранены некоторые warnings, думаю они не критичны.

VGA_PAL_terminal_v1.3.zip от 28.06.2011 (скачать)

Полезные ссылки:

Теория Видео сигнала

Cornell University Electrical Engineering 476- Генерация видеосигнала на AVR

Теория VGA сигнала

https://www.youtube.com/watch?v=pxnaFB9irX0

Генерация VGA сигнала на PIC

За дальнейшим развитием проекта следите за:  http://www.vga-avr.narod.ru/

Связаться с автором можно по электронному адресу: simple-vga@rambler.ru

Ибрагимов Максим Рафикович     

г. Тольятти   

20.10.2005 г. Откорректировано 6.2011

Источник: http://www.vga-avr.narod.ru/main_rus.html

TV – дисплей. – AVR – AVR – Электросхемы в помощниках. – Electroschemes helpers

Давненько уже было желание подружить, схему на МК с выводом информации на телевизионный экран.

И очень кстати  такой  интересный вариант программы, сделал товарищ Soir.

Преимущества вывода информации от схемы с МК на экран телевизора по  сравнению с дисплеем , очевиден по нескольким причинам.

Это размер такого дисплея,   доступны от 3.5″  до х”  ( цена 3.5″ от 15$, что в принципе это уже конкурентоспособное с обычными ЖК индикаторами).

За один раз количество выводимой текстовой информации, с помощью МК на такой дисплей, до 640 текстовых знаков (а это уже, вне конкуренции).

Схема №1

Программа может работать, как без внешнего источника видео сигнала  (схема №1).

И универсально,  с внешним источником  видеосигнала, текст будет наложен на ваше видео,

а так же без внешнего источника видео сигнала , текст автономно будет выведен на экран (схема №2).

Схема №2

*на схеме, входные цепи АDC измерителей показаны условно, по этим  измерительным цепям,  какое в данном случае применить схемное решение для измерений, (входные напряжения для портов МК РС0 ….. РС3  от 0 до +2 .56V) пользователь принимает решение самостоятельно.

Детали отмеченные пунктиром, можно не ставить , но на всякий случай можно предусмотреть место для их установки (R2 только для схемы №2 производит регулировку насыщенности фона под текстом, на данный момент, в программе не использован в полной мере).
Детали ATmega168, LM1881, DS1307, 2хDS18b20, кварц 16MHz

Установленные кнопки в схеме предназначены только для коррекции текущего времени и даты.

Длительным нажатие Кн2 , делаем вход в это меню коррекции, и далее Кн1 +,    Кн2 >    , Кн3-.

При правильно прошитом МК и собранной схеме, при первом запуске  схема начинает работать сразу, а на экране будет видно наложенное изображение на экране TV. 

Если понадобится подстройка : сложностей не должно возникнуть ,  подстраивается только резистор R-1. Чтобы согласовать уровни сигналов А и В.

Для примера, осциллограмма работы программы, без внешнего видеосигнала на входе. 

 
 

Осциллограммы А и В не регулируемые.

Выход сигналов с МК в виде осциллограмм А и В, с помощью резистора R-1 смешиваются, до вида осциллограммы С. 
Далее, сигнал в виде осциллограммы С,   идет на вход AV  телеприемника.

FUSE: Программа МК работает с внешним кварцем, на частоте 16MHz.

Несколько фото отображения информации, на мониторе 7″  и  42″.

Видео – пример http://youtu.be отображения информации на TV экране.

  Прошивка, TV – ATmega 168.

Источник: http://c2.at.ua/load/avr/tv_displej/17-1-0-149

Как тактировать AVR

Прежде чем разбирать, какие бывают источники тактирования, чем они отличаются, их плюсы и минусы и тд,  нам нужно определиться, что вообще означает словосочетание тактовая частота. Да и вообще, что означает термин «частота»?

Как нам говорит учебник физики, частота — это количество колебаний, произведенных за определенный промежуток времени. Чаще всего этот промежуток времени называют периодом и для удобства измерений его берут равным одной секунде.

Какие можно привести примеры подобных колебаний? Это могут быть часы с кукушкой, маятник, качели

и даже круги на воде от камушка, который мы кинули в воду:

Более подробно про частоту и период можно прочитать в статье Электрические сигналы и их виды.

Так, теперь ближе к делу. Что же такое тактовая частота?

Любая операция МК или его мегакрутого брата-микропроцессора состоит из отдельных элементарных действий, то есть тактов.

Получается, тактовая частота — это сколько тактов в секунду может выполнить наш МК или процессор. Отсюда напрашивается вывод, чем больше тактовая частота, тем больше количество операций  за секунду может сделать МК или микропроцессор.

В МК AVR тактовая частота в основном измеряется в МегаГерцах. Как помните, приставка «Мега» означает один миллион. Если у нашего МК тактовая частота 8 МегаГерц, то это означает, что он может выполнять 8 000 000 тактов в секунду, или, грубо говоря,  около 8 000 000  различных операций в секунду ;-).

Пусть вас не пугает это число, потому что ваши настольные компьютеры, телефоны и планшеты уже работают на частоте в несколько ГигаГерц. Гига — это уже миллиард! Например, если частота процессора вашего компа 2 ГГц, это означает, что он может произвести 2 миллиарда операций в секунду).

Мало? Как оказалось на практике, уже стает мало)).

Вернемся к нашим баранам), а именно, к тактовой частоте. Допустим, мы имеем МК Tiny 2313, сконфигурированный на работу 8 МегаГерц и который  может выполнять при этом 8 миллионов тактов в секунду. Каждая операция процессора состоит из тактов.

А когда процессор выполняет нашу программу, записанную во Flash память, он тоже производит определенные операции которые указаны в программе.

Граничная частота МК Tiny 2313, как говорит нам Datasheet, довольно высокая и составляет аж целых 20 МГц! Это довольно много по меркам МК

Правда, это только с применением внешнего кварцевого резонатора.

Кварцевый резонатор, называемый часто просто кварц, может выглядеть по-разному:

На схемах он обозначается так:

На кварце часто указана частота, на которой он работает. Ниже на фото мы видим кварц, который работает на частоте 8 МегаГерц (8.000MHz)

В большинстве случаев стараются указывать частоту на корпусе кварца. Если у вас есть какое-либо ненужное цифровое устройство, вы вполне можете выпаять кварц на нужную частоту прямо оттуда. Но в  большинстве случаев в этом нет необходимости, так как  новый кварцевый резонатор  в радиомагазине стоит порядка 20-30 рублей.

Есть один нюанс, любезно предоставленный нам производителями микроконтроллера. Если нам нужно, чтобы программа выполнялась медленнее в восемь раз, мы можем этого добиться даже не переписывая программу и не выставляя задержки по новой, то есть в 8 раз длиннее.

Нам достаточно уменьшить частоту МК в восемь раз и программа будет для нас выполняться медленнее в восемь раз. Забегая вперед, скажу, что сделать это мы можем очень легко, выставив всего одну галочку при программировании фьюз-битов, в бите CKDIV 8.

Также легко мы можем отменить все наши изменения.

Этот способ мы использовали при прошивке МК в прошлой статье.

Существуют 4 варианта, которые применяются для тактирования МК:

— тактирование от внутреннего RC-генератора

— тактирование от внешнего кварца

— тактирование от внешнего генератора

— тактирование от RC-цепочки

Тактирование от внутреннего RC-генератора.

На тактирование от внутреннего RC генератора МК настроен сразу с завода и не требует внешних деталей.

Это означает, что с помощью МК, питания +5 Вольт и одного светодиода с резистором, мы уже можем заставить наш МК работать и выполнять программу без всяких сложных настроек и дополнительных деталей, задав скорость программно, путем выставления задержки «Delay».

  Имейте ввиду, что встроенный RC-генератор может работать только на четырех частотах: 1, 2, 4 или 8 МегаГерц, поэтому если вам требуется какая-нибудь эксклюзивная частота, типа 1 638 000  Герц, то такой способ не прокатит.

Тактирование от внешнего кварца

Тактирование от внешнего кварца чуточку сложнее.  Как же нам подключить внешний кварц? Для начала нам надо найти цоколевку МК, которую мы собираемся тактировать от внешнего кварца. Пусть в нашем примере это  будет Тiny 2313. Чтобы подключить внешний кварц, достаточно найти ножки микросхемы с названием «XTAL1»  и «XTAL2».

 Потом подсоединить кварц вот по такой схеме:

Потом при прошивке надо правильно выставить фьюзы. О них мы с вами поговорим в следующих статьях.

На реальных платах можно увидеть примерно вот такие схемы  расположения элементов с тактированием от кварца. Здесь изображен  МК AVR  в корпусе TQFP , конденсаторы в SMD исполнении, скорее всего в корпусе 0805, и кварц.

А здесь изображен МК в  корпусе DIP , два керамических конденсатора, так называемые “желтые капельки”, и кварц.

Как видно на схеме подключения кварца к МК, номинал нужных нам конденсаторов должен составлять 15-22 пикофарада. Расшифровать номинал таких конденсаторов, можно с помощью этого рисунка:

Тактирование от внешнего генератора.

К тактированию от внешнего генератора прибегают тогда, когда требуется синхронизовать МК с внешними цепями, либо этот МК тактируют какой-либо своей частотой от генератора частоты. Тактирующий сигнал подают на ножку XTAL1:

Тактирование от RC-цепочки

Тактирование от RC-цепочки осуществляется вот по такой схеме:

Здесь мы берем конденсатор емкостью не менее 22 пФ, а резистор от 10 Ом и до 100 КилоОм. По простой формуле можно с легкостью рассчитать частоту, на которой будет тактироваться наш МК:

где

F — частота, Гц.

R — сопротивление резистора, Ом.

С — емкость, Фарад.

Внутренний RC-генератор и внешняя RC-цепь дают нестабильную частоту, которая «гуляет» и зависит от температуры. Для того чтобы помигать светодиодом и прочих неответственных действий, нам это будет не принципиально. В наших проектах, поначалу не требующих особой точности, мы будем использовать тактирование от внутреннего RC-генератора.

Но чтобы получить очень точную частоту тактирования, которая почти не гуляет, надо использовать кварц. Тактирование от кварца важно при создании точных измерительных приборов, электронных часов, устройств сложной и точной автоматики, да и вообще любых устройств, где важна точность и не допустимы малейшие отклонения.

Итак, как мы помним из предыдущей статьи, некоторые ножки имеют двойное назначение, и помимо того, что могут использоваться как порты ввода-вывода, также используются для обеспечения расширения функций МК.

Действительно, если МК сконфигурирован для работы от внутреннего RC-генератора, вам достаточно подать на него питание +5 Вольт и землю, и микроконтроллер включится и начнет выполнять программу.

Но если вы выпаяли микроконтроллер из какого-либо устройства и он должен был в нем тактироваться от кварца, или по ошибке выставляя биты конфигурации, вы выставили тактирование от кварца, МК перестанет у вас быть виден в программе оболочке, и не сможет выполнять программу, даже если вы подадите на него +5 Вольт и землю.

Что же делать в таком случае? В первую очередь не паниковать) и собрать схему с тактированием от кварца, и тогда мы сделаем видимым наш МК, который вдруг может быть переставать у вас определяться оболочкой программатора и работать в схеме, если вы ошибочно переведете МК в режим тактирования от кварца, путем выставления определенных фьюзов. Об этом мы как-нибудь еще поговорим

Источник: https://www.ruselectronic.com/istochniki-taktirovaniya-mikrokontrollerov-avr/

Простой VGA/Видео адаптер (ATmega8, C)

Предыстория проекта.
Несколько месяцев назад, задавшись целью подключить VGA-монитор для вывода текстовых данных с микроконтроллерной системы сбора информации – я с удивлением обнаружил, что ничего сколько-нибудь “внятного” и доступного для повторения “на коленке” по этой теме в Интернете отсутствует.

Конечно, существуют промышленные платы стандарта PC-104, можно кое-что “нарыть” и на www.opencores.org для реализации на FPGA, есть графические контроллеры Fujitsu, кто-то здесь недавно на местной конференции предлагал за 5000$ проект на ACEX’е J, но надо признать – все это страшно далеко от народа.

Хотелось что-то гораздо более “дешевое и сердитое”. Предварительные прикидки показывали, что из наиболее распространенных и достаточно быстродействующих микроконтроллеров подходит продукция фирмы ATMEL. 8-ми битное RISC ядро AVR обеспечивает пиковую производительность порядка 16 MIPS на тактовой частоте 16MHz.

Плюс на подходе более скоростные семейства ATmega48,88,168 поддерживающие официальную тактовую частоту 20MHz.При этом скорость вывода данных через стандартный порт ввода-вывода при FOSC = 16MHz командами вывода в порт (out portx..) 8 MIPS. К тому же я уже имел достаточный опыт разработки устройств на микроконтроллерах AVR.

И я засучил рукава..

Результат своей работы я представляю на ВАШ суд.

Поставленная техническая задача: Цель которую я поставил для себя, достаточно проста на первый взгляд: Ограничившись одним корпусом распространенного MCU типа Mega8,16,8535 и т.д.

, и минимумом внешних элементов сконструировать символьный дисплей-адаптер с разрешением > 15×15 символов, который бы выводил информацию на VGA монитор при стандартных частотах VGA сигнала. Информацию символьный адаптер должен получать через стандартный USART порт микроконтроллера.

Частота используемого микроконтроллера стандартная -16MHz. Данная задача на данный момент успешно решена.

Более того – проект несколько расширен и дополнен введением формирования обычного видео ч.б. (PAL/SECAM) сигнала. Т.е. в зависимости от положения джампера тип формируемого видео сигнала VGA либо Composite Video.

Фотографии и схема адаптера:
Ниже приводится принципиальная схема простого VGA/Video адаптера:

Так все это выглядит в железе, собранном на “коленке” за один час, результат на экране монитора и на экране теллевизора.

Технические характеристики проекта:

Технические характеристики VGA-адаптера:

  • Количество символов: 20 строк по 20 символов
  • Разрешение матрицы знакогенератора: 8×12 точек
  • Кодовая таблица знакогенератора: WIN 1251
  • Формируемый сигнал: VGA
  • Разрешение: 640×480
  • Частота кадровой синхронизации: 60Hz
  • Скорость обмена UART 19200 bps

Технические характеристики Video-адаптера:

  • Количество символов: 20 строк по 38 символов
  • Разрешение матрицы знакогенератора: 8×12 точек
  • Кодовая таблица знакогенератора: WIN 1251
  • Формируемый сигнал: Composite Video(PAL/SECAM)
  • Разрешение: 625 строк (чересстрочная)
  • Частота кадровой синхронизации: 50Hz
  • Скорость обмена UART 19200 bps

Тип используемого микроконтроллера: Mega8, Mega16, , Mega32, Mega8535 и т.д.

Тактовая частота микроконтроллера стандартная – 16Mhz

Примечание: 1. Для того чтобы избежать искажения изображения при приеме данных через UART, для VGA рекомендуется производить обмен данными с адаптером в течении приблизительно 300-600 мкс после сигнала вертикальной синхронизации VSYNC (во время обратного хода луча по кадру).

2. Объема RAM памяти Mega8535 (512 байт) не достаточно для формирования Видео сигнала с разрешением 38×20 символов.

Алгоритм работы программы:

Пояснения по работе программы: Алгоритм рендеринга изображения достаточно традиционен, главное ноу-хау проекта в использовании для побитного вывода изображения – сдвигового регистра SPI SPDR через бит MOSI. При этом образуется двухступенчатый конвейер рендеринга:

В то время, как последующий байт для рендеринга выбирается из памяти, предыдущий байт выводится через сдвиговый регистр SPI SPDR MOSI.

Заключение:
Поскольку данный проект написан на С (WinAVR GCC), он легко масштабируем для увеличения разрешения и частот регенерации дисплея.

Так, на микроконтроллерах Mega48,88,168 поддерживающих официальную тактовую частоту 20MHz возможно получение разрешения 20 строк по 25-30 символов при абсолютно той же схемотехнике (возможности оверклокинга автор намеренно не рассматривает).

Применения проекта не ограничиваются одним лишь терминальным вариантом (смотрите примеры в папке examples) – не смотря на серьезную загруженность процессора регенерацией дисплея оставшейся мощности вполне достаточно для организации обработки например нескольких цифровых и аналоговых сигналов и реакции на них, а также выдаче результатов их измерений на дисплей в real-time (охранные системы, АСУТП, КИПиА и т.д.). Автор располагает улучшенными вариантами подобных систем с разрешением символьного дисплея 40×24 символов в режиме VGA, работающими в коммерческих изделиях

Исходные тексты проекта, примеры применения (34 Кб). Загрузок: 716
Данный материал в формате PDF (241 Кб). Загрузок: 554

Источник: http://eldigi.ru/articles/prostoi_video_vga_adapter

VGA своими руками. Подключение vga монитора к микроконтроллеру

ПодробностиКатегория: МикроконтроллерыОпубликовано 27.07.2015 10:08Автор: AdminПросмотров: 5194

Несколько месяцев назад я пытался подключить VGA-монитор к микроконтроллеру и выводить на экран текстовые данные, сделать своего рода VGA адаптера своими руками. К моему удивлению в интернете на эту тему очень мало информации.

Есть примеры, что там используют такие стандарты, как PC-104 или сложных АСВА реализаций. Другие решения включают в себя графические контроллеры от компании Fujitsu. Нашел один проект на ACEX за который просили $5000.Это все отличные решения но цены получаются довольно “кусачие”. 

Первоначальные расчеты показали, что 8-ми разрядный микроконтроллер фирмы ATMEL, с его 16 МГц тактовой частоты предоставления около и 16 MIPS были хорошими кандидатами для дальнейших исследований.

Также можно было использовать микроконтроллеры AVR такие как Mega48, Mega88 и Mega168, которые имеют тактовую частоту до 20 МГц. Поэтому я пришел к выводу, что с тактовой частотой 16 МГц я мог достичь чего-то в порядке скорости 8 МГц передаваемых данных из порт.

Я также выбрал AVR, как я уже создали довольно тело опыта работы с ним, и поэтому я начал работу проекта.

После примерно двух-трех месяцев исследования, я представляю вам плоды моего труда!

Цель проекта:

Была поставленна цель сделать из общедоступных микроконтроллеров, таких как Atmega8, Atmega16 и похожих, и с минимумом внешних компонентов сделать VGA адаптер своми руками который будет отображать по крайней мере, 15х15 символов на мониторе VGA с использованием стандартных частот VGA. Данные поступают в микроконтроллер при помощи UART порта.Тактовая частота микроконтроллера 16 МГц.

Схема подключения микроконтроллера к VGA монитору

Получились следующие характеристики:

VGA-порт:

  • Количество символов: 20 строк по 20 символов;
  • Разрешение матрицы символов: 8×12 точек;
  • Поддерживаемые кодовой страницы: WIN 1251;
  • Сформированный сигнал: VGA;
  • Разрешение: 640×480;
  • Частота вертикальной синхронизации: 60Hz;
  • Скорость обмена UART 19200 бит.

Терминал Видео:

  • Количество символов: 20 строк по 38 символов;
  • Разрешение индивидуальной матрицей символов: 8×12 точек;
  • Поддерживаемые кодовой страницы: WIN 1251;
  • Сформированный сигнал: композитный видео (PAL / SECAM);
  • Разрешение: 625 линий (с чересстрочной разверткой);
  • Частота вертикальной синхронизации: 50 Гц;
  • Скорость обмена UART 19200 бит;
  • Тип используемого микроконтроллера: mega8, Mega16, Mega32, Mega8535 и т.д.;
  • Тактовая частота микроконтроллера стандарта – 16 МГц.

Алгоритм работы программы

Исходные проект подключение vga монитора к микроконтроллеру

Источник статьи проекта VGA адаптера на микроконтроллере

Источник: http://www.radio-magic.ru/microcontrollers/262-vga-svoimi-rukami

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}
Возможность генерации видео при помощи микроконтроллеров avr заинтересовала меня с полгода назад.

Потратив совсем немного времени на поиски в интернете я нашел достаточно большое количество проектов различных авторов позволяющих генерировать видеосигнал.

Несмотря на достаточно большое количество конструкций в глаза бросались два основных ограничения подобных проектов:

Первое, вывод только черно-белого изображения, для цветного у контроллеров AVR или PIC просто не хватает быстродействия.

Второе,  низкое разрешение экрана, на уровне 160х100 точек – что конечно очень и очень мало для генерации на экране чего нибудь содержательного.. Это ограничение исходило из низкого быстродействия используемых микроконтроллеров.Например, тактовая частота микроконтроллера ATMEGA32, без разгона, 16 мгц. Микроконтроллер на языке ассемблера выполняет операции за 1-5 тактов, нужные нам операции для генерации видео это загрузка регистров, сдвиг, выдача бита в порт вводавывода занимают 1 такт, различные операторы переходов (для организации циклов и ветвлений) 2 такта. Таким образом реальные возможности микроконтроллера по генерации видеосигнала фактически подходили только для генерации изображения по качеству намного хуже какого нить давно забытого многими ZX-Spectrum…

Причем, низкое разрешение экрана – это ограничение не только быстродействия, но и зачастую объема памяти ОЗУ в микроконтроллерах: например, такой контроллер как ATMEGA16 имеет на борту всего 1 кб оперативной памяти. Если принять что один бит ОЗУ соответствует одному пикселу изображения, то максимум который мы сможем получить 1 кб * 8 бит в байте = 8192 пиксела изображения на экране…

Выше я указал разрешение 160 на 100 точек, это 16000 пикселов, для хранения которых нужно 16000 пикселов 8 бит = 2000 байт ОЗУ (уже видно что на ATMEGA16 графические изображения без ухищрений не получить никак – просто нет памяти !)Эти ограничения немного удручали и явно не побуждали к каким-то действиям..

Но в поиске мне повезло и я набрел на ресурс http://vga-avr.narod.ru/main_rus.html в котором подчерпнул идею как можно ускорить выдачу изображения на телевизор, с этого момента идея генерации видеосигнала силами AVR микроконтроллера завладела моей головой 🙂

первое с чем я столкнулся – это необходимость разобраться, а что же на самом деле представляет из себя видеосигнал.

Неплохо о видеосигнале написал Rickard Gunee в статье “How to generate video signals in real-time using a PIC16F84”. Данная статья есть в переводе с английского, с различными сокращениями. Я вряд ли напишу о видеосигнале лучше (вернее подобное наверное напишу, но вот иллюстрации скорее всего будут намного хуже), поэтому предлагаю Вам фрагмент этой статьи:

—————————————- начало вложенного фрагмента статьи ———————————————–

Как работает стандартный телевизор.

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

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

В системе PAL экран перерисовывается 25 раз в секунду. Чтобы уменьшить мерцание экрана при обновлении картинки, сначала рисуются все нечетные, а потом все четные линии. Поэтому картинка практически обновляется 50 раз в секунду. Для того чтобы получить цветное изображение, необходимо чтобы каждая точка экрана состояла из трех цветов: красного, зеленого и синего.

Здесь мы будим рассматривать только черно-белое телевидение, так как только его можно получить в реальном времени с помощью PIC16F84.

.
Электронный луч рисует изображение. Две части изображения образуют одно сплошное.

Различные телевизионные стандарты.

Существуют три основных телевизионных стандарта: NTSC, SECAM и PAL. NTSC ( National Television System Committe ) – это американский стандарт. Он имеет 525 строк и частоту обновления кадров 30 Гц.

SECAM ( Sequentil Color And Memory ) – французский стандарт и PAL ( Phase Alternating Lines ) имеют 625 строк в кадре при частоте кадров 25 Гц. Кроме различия кадровой и строчной частот эти стандарты отличаются способом кодирования цветного сигнала.

Далее мы будим рассматривать стандарт PAL.

Информация в видеосигнале.

Точки разной яркости образуют на экране изображение. Когда электронный луч проходит по экрану, его интенсивность изменяется за счет изменения уровня видеосигнала. Но в этом сигнале нет информации о том, в какой части экрана находится в настоящее время луч.

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

Телеприемник должен также знать, когда начинается новый кадр. Об этом сообщает специальная комбинация синхроимпульсов ( как функция 'Новый документ' при написании текста с помощью компьютера ).

При обновлении кадра 25 раз в секунду изображение будит заметно мерцать, поэтому сначала рисуются все нечетные, а потом все четные линии. За счет этого число кадров в секунду увеличивается до 50, и изображение становится более качественным. Информация о четности/нечетности строки передается в комбинации вертикальных синхроимпульсов.

Амплитуда видеосигнала изменяется в пределах от 0 до 1В. Уровень 0,3В соответствует черному цвету, а 1В – белому (яркость серого изменяется между этими значениями ). Уровень 0В соответствует синхроимпульсу.

Изображение разделено на строки. Каждая строка имеет длительность 64 мкс. В первые 4 мкс передается строчный синхроимпульс. Это производится переводом уровня сигнала в 0 для того, чтобы сказать телеприемнику, что началась новая строка.

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

Изображение рисуется слева направо с яркостью, соответствующей уровню видеосигнала. Черный цвет соответствует уровню 0,3В, и с увеличением уровня видеосигнала увеличивается яркость. Максимум яркости достигается при уровне видеосигнала 1В ( белый цвет ).

На рисунке показана осциллограмма строки видеосигнала.

Осциллограмма строки видеосигнала.

Объединение строк вместе в изображение.

Изображение состоит из 625 строк. Но телевизор не показывает все 625. Часть из них используется для синхронизации.

Другая часть ( не знаю точно сколько ) не видна на экране так как старым телевизорам требовалось некоторое время для перевода электронного луча из нижнего правого угла растра в верхний левый.

(В настоящее время эти строки используются для других возможностей, например для телетекста ).

Осциллограмма нескольких строк видеосигнала.

Вертикальная синхронизация.

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

Здесь показано, чем отличаются вертикальные синхроимпульсы в разных полукадрах. Уровень напряжения изменяется от 0 до 0,3 В. Цифры указывают номер строки.

—————————– конец цитируемого фрагмента статьи  ———————————-

Давайте прервемся на секунду, и

отметим себе важную информацию по “железной” реализации:

наше устройство должно генерировать минимум 3 уровня сигнала на выходе для подключения телевизора:

0 вольт – это уровень синхроимпульсов
0.3 вольта – это уровень “черного”, при данном сигнале телевизор рисует черным
1 вольт – это уровень “белого”, при данном сигнале телевизор рисует изображение белым

в принципе уровень белого не обязательно должен равняться 1 вольту, можно и 0.7 и 0.8 – просто изображение будет чуть “серее”

теперь вернемся в нашу статью….

———————————————– начало вложенного фрагмента статьи —————————————-

Для генерации видеосигнала необходима некая схема, способная создавать сигналы с амплитудой напряжения от 0 до 1В. Чтобы создать изображение Вам необходимо как минимум три уровня сигнала. Телевизор должен получать уровень черного и уровень синхросигнала для того, чтобы синхронизировать изображение.

Если Вы хотите большего, чем просто черный экран, Вам понадобится некоторый уровень серого или белого. Для получения трех необходимых уровней аналогового сигнала требуется два бита данных цифрового сигнала. Стандартное входное сопротивление видеовхода телевизора – 75 Ом.

Используя два резистора и два выхода порта микроконтроллера можно создать требуемые уровни напряжения.

При соединении обоих выходов D0 и D1 с землей, напряжение на видеовходе телевизора будит равно 0, что соответствует синхроуровню.
Выход D1 соединен с землей, а выход D0 – с +5В. В этом случае резистор 450 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 900 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,33В, что очень близко к уровню черного. (Истинный уровень черного 0,3В.)
Выход D0 соединен с землей, а выход D1 – с +5В. В этом случае резистор 900 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 450 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,67В. Это уровень серого.
Оба выхода D0 и D1 соединены с +5В. В этом случае резисторы 900 Ом и 450 Ом включены параллельно, а 75 Ом-ное сопротивление видеовхода телевизора, подключено к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 1В. Это уровень белого.

Эта схема позволяет получить четыре уровня напряжения. На рисунках представлены эквивалентные схемы четырех различных уровней напряжения и показано, каким образом они получаются. Номинал резисторов не критичен. Вы можете использовать большие, стандартные значения: 470 Ом и 1 кОм вместо 450 Ом и 900 Ом. Схема будит работать, просто немного изменится яркость изображения.

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

—————————– конец цитируемого фрагмента статьи  ———————————-

Теперь у тех кто внимательно читал наверняка в голове начала проявляться схема нашего будущего устройства, нарисуем !

Посмотрите свои припасы и выбирайте свой контроллер, могу вам посоветовать взять более “жирный” ATMEGA32 так как у него 2 кб ОЗУ которые мы будем использовать как видеопамять.

По номиналам резисторов, при питании микроконтроллера от 5 вольт я в первых своих тестах использовал постоянные резисторы следующих номиналов:

R3 = не устанавливал поскольку указываемое в некоторых схемах значение в 75 ом по моему мнению сильно нагружало на землю выводы порта С, и я не захотел рисковать.

Если вы хотите получить гарантировано рабочую конструкцию, то лучше не доверять написанным значениям резисторов, а поставить вместо них подстроечные резисторы номиналом в 1 ком и настроить на выходе напряжения:

– 0.3 вольта при PC0=1 и PC1=0  – 1 вольт при PC0=1 и PC1=1

Я для этого написал кратенькую программку на ассемблере (хотя нет, вру, в первый раз тестовую программу генерации уровней сигнала для настройки я написал на СИ, но делала она в точности тоже самое что и предложенная мною ниже программа на ассемблере).

.include “m32def.inc” ; Используем ATMega32 .CSEG .

org 0         cli ; на всякий случай запретим прерывания                 ; настроим порты        sbi DDRC , 0 ; режим работы PC0 – выход         sbi DDRC , 1 ; режим работы PC1 – выход         ; уровень синхроимпульса, на выходе 0 вольт         cbi PORTC , 0 ; PC0=0         cbi PORTC , 1 ; PC1=0         ; уровень черного, на выходе 0.

3 вольта ;       sbi PORTC , 0 ; PC0=1 ;       cbi PORTC , 1 ; PC1=0         ; уровень белого, на выходе 0.7 – 1 вольт ;       sbi PORTC , 0 ; PC0=1 ;       sbi PORTC , 1 ; PC1=1 loop:   rjmp loop
Вот в общем то и вся программа. Порядок действий думаю откровения не вызовет:

а) компилируем, заливаем в контроллер, мерим на выходе 0 вольт (уровень синхроимпульса) – с ним обычно проблем не бывает 🙂

б) комментируем строки задающие уровень синхроимпульса, и раскоментируем строки отвечающие за уровень черного, опять компилируем, заливаем в контроллер, мерим напряжение на выходе, подбираем R1 (тот который около 1 ком) чтобы было около 0.3 вольт

в) комментируем строки задающие уровень черного (строки задающие уровень синхроимпульса мы уже закоментировали ранее), и раскоментируем строки отвечающие за уровень белого, опять компилируем, заливаем в контроллер, мерим, подбираем R2 (тот который около 300 ом)  чтобы было около 1 вольта (можно чуть меньше)

Все замеры я осуществлял при подключенной нагрузке (телевизоре).

После того как вы проделали эту не сложную операцию – вы аппаратно готовы к генерации видео и можно переходить к следующему шагу:

Генерация видеосигнала при помощи контроллеров AVR. Часть 2. Синхроимпульсы

О видео сигнале.

Чтобы понять каким образом формируется видеосигнал в реальном времени, необходимо хорошо, в деталях, понимать каким образом получается видеоизображение. Поэтому прежде чем разбирать какой либо код поговорим сначала об этом.

Как работает стандартный телевизор.

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

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

В системе PAL экран перерисовывается 25 раз в секунду. Чтобы уменьшить мерцание экрана при обновлении картинки, сначала рисуются все нечетные, а потом все четные линии. Поэтому картинка практически обновляется 50 раз в секунду. Для того чтобы получить цветное изображение, необходимо чтобы каждая точка экрана состояла из трех цветов: красного, зеленого и синего.

Здесь мы будим рассматривать только черно-белое телевидение, так как только его можно получить в реальном времени с помощью ATMega8.

Электронный луч рисует изображение.

Различные телевизионные стандарты.

Существуют три основных телевизионных стандарта: NTSC, SECAM и PAL. NTSC ( National Television System Committe ) – это американский стандарт. Он имеет 525 строк и частоту обновления кадров 30 Гц.

SECAM ( Sequentil Color And Memory ) – французский стандарт и PAL ( Phase Alternating Lines ) имеют 625 строк в кадре при частоте кадров 25 Гц.

Кроме различия кадровой и строчной частот эти стандарты отличаются способом кодирования цветного сигнала. Далее мы будим рассматривать стандарт PAL.

Информация в видеосигнале.

Точки разной яркости образуют на экране изображение. Когда электронный луч проходит по экрану, его интенсивность изменяется за счет изменения уровня видеосигнала. Но в этом сигнале нет информации о том, в какой части экрана находится в настоящее время луч.

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

Телеприемник должен также знать, когда начинается новый кадр. Об этом сообщает специальная комбинация синхроимпульсов ( как функция 'Новый документ' при написании текста с помощью компьютера ).

При обновлении кадра 25 раз в секунду изображение будит заметно мерцать, поэтому сначала рисуются все нечетные, а потом все четные линии. За счет этого число кадров в секунду увеличивается до 50, и изображение становится более качественным. Информация о четности/нечетности строки передается в комбинации вертикальных синхроимпульсов.

Амплитуда видеосигнала изменяется в пределах от 0 до 1В. Уровень 0,3В соответствует черному цвету, а 1В – белому ( яркость серого изменяется между этими значениями ). Уровень 0В соответствует синхроимпульсу.

Строка видеосигнала.

Изображение разделено на строки. Каждая строка имеет длительность 64 мкс. В первые 4 мкс передается строчный синхроимпульс. Это производится переводом уровня сигнала в 0 для того, чтобы сказать телеприемнику, что началась новая строка.

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

Изображение рисуется слева направо с яркостью, соответствующей уровню видеосигнала. Черный цвет соответствует уровню 0,3В, и с увеличением уровня видеосигнала увеличивается яркость. Максимум яркости достигается при уровне видеосигнала 1В ( белый цвет ).

На рисунке показана осциллограмма строки видеосигнала.

Осциллограмма строки видеосигнала
Схемное решение.

Для генерации видеосигнала необходима некая схема, способная создавать сигналы с амплитудой напряжения от 0 до 1В. Чтобы создать изображение Вам необходимо как минимум три уровня сигнала. Телевизор должен получать уровень черного и уровень синхросигнала для того, чтобы синхронизировать изображение.

Если Вы хотите большего, чем просто черный экран, Вам понадобится некоторый уровень серого или белого. Для получения трех необходимых уровней аналогового сигнала требуется два бита данных цифрового сигнала. Стандартное входное сопротивление видеовхода телевизора – 75 Ом.

Используя два резистора и два выхода порта микроконтроллера можно создать требуемые уровни напряжения.

При соединении обоих выходов D0 и D1 с землей, напряжение на видеовходетелевизора будит равно 0, что соответствует синхроуровню.

Выход D1 соединен с землей, а выход D0 – с +5В. В этом случае резистор 450 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 900 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,33В, что очень близко к уровню черного. (Истинный уровень черного 0,3В.)

Выход D0 соединен с землей, а выход D1 – с +5В. В этом случае резистор 900 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 450 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,67В. Это уровень серого.

Оба выхода D0 и D1 соединены с +5В. В этом случае резисторы 900 Ом и 450 Ом включены параллельно, а 75 Ом-ное сопротивление видеовхода телевизора, подключено к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 1В. Это уровень белого.

Эта схема позволяет получить четыре уровня напряжения. На рисунках представлены эквивалентные схемы четырех различных уровней напряжения и показано, каким образом они получаются. Номинал резисторов не критичен. Вы можете использовать большие, стандартные значения: 470 Ом и 1 кОм вместо 450 Ом и 900 Ом. Схема будит работать, просто немного изменится яркость изображения.

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


Программно и аппаратно генерируемый сигнал.

В стандартных видеосистемах, таких, как видеокарта в ПК, информация о том, что выводить на экран берется из видеопамяти. Это осуществляется автоматически на аппаратном уровне. Синхроимпульсы формируются так же автоматически железом.

Все, что требуется от программы – это записывать в видеопамять то изображение, которое аппаратная часть должна вывести на экран. Это требует мощной аппаратной части и много памяти. Видеокарта в ПК имеет обычно несколько МБайт видеопамяти.

У PIC16F84 есть 68 Байт памяти, и эта память должна хранить не только изображение, но и другую информацию, например переменные. Невозможно держать в памяти всю картинку, как это происходит в видеокарте. Видеоданные должны формироваться непосредственно в момент вывода изображения на экран.

Создать изображение программным способом с помощью такого простого процессора достаточно трудно, это может быть только очень простое изображение. Зато этот способ очень дешев.

Строка, формирующая вертикальные полосы.

Первый тест, который я сделал, когда начал экспериментировать с программной генерацией видео – это получение вертикальных полос на экране. Надо создать строку, в которой информация о цвете изменяется в такой последовательности: серый – черный – белый – черный – серый.

Повторяя эту строку непрерывно, получим на черном фоне экрана изображение трех полос: две серые по краям и одна белая по центру экрана. Сигнал включает горизонтальный синхроимпульс, последующую задержку и информацию о яркости.

Телевизионное изображение будит устойчиво по горизонтали, а по вертикали может плавать или дрожать, так как вертикальные синхроимпульсы отсутствует. На рисунке показано как это примерно выглядит.                  

Осциллограмма сигнала, генерируемого кодом,

который приведен ниже. Низкие импульсы –

это серые полосы, высокий импульс в середине

– белая полоса.                             

Так выглядит видеосигнал на экране

телевизора. Две серых и одна белая полосы.

Материал немного был отредактирован.