модуль генерации TV видео сигнала на atmega16
|
|
ВитГо | Дата: Воскресенье, 19.08.2012, 09:55 | Сообщение # 1 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Заинтересовала меня Тема
в качестве контроллера будет использована atmega16 или atmega32 выбор в пользу последней будет сделан если не будет хватать 1 кб ОЗУ
известные мне проекты по теме: http://www.vga-avr.narod.ru/ первый сайт который более менее чтото объяснял и содержал в себе открытые исходники, правда комментарии только на английском (хотя разработчик русский), я пытался списываться с ним, но помощи не получил.
http://www.benryves.com/products/avrtvgame сайт на английском языке. самое интересное это исходники ! код написан очень правильно, видео драйвер отделен от всего остального (там написано 2 игры: тетрис и змея). драйвер видео написан на асме+си. в настоящее время я разбираюсь в том как он устроен
http://blog.vinu.co.in/2012....on.html - очень хороший ресурс, короткие и лаконичные примеры, понятные иллюстрации, примеры написаны на Си. самое то чтобы начать !
еще находил несколько, но уровень их документирования и отсутствие исходников прошивки не делают их ценными источниками.
теперь самое главное: формат видеосигнала несмотря на его нужность - найти более менее подробное описание не так просто, в большинстве случаев рассказывается как формируется строка изображения и тактично обходиться вопрос как генерируются кадровые импульсы...
чтобы не делать абы как я нашел несколько документов с более подробным описанием видеосигнала: Сигнал чернобелого изображения самое толковое из массы перелопаченной мной информации. отталкиваясь от информации что там приведена можно начинать писать свой генератор видео сигнала Видеостандарты: сигналы, форматы, стыки. В.Л. Штейнберг - хорошая книга по форматам видеосигнала, не такая подробная, но чтото можно подчерпнуть и из нее ГОСТ 7845-92: Стандарт: система вещательного телевидения - ну и самая подробная (но не всегда понятная) информация конечно была взята из ГОСТа
применяя эти три источника информации я и разбирался в формате видео сигнала
в итоге нашел самую правильную иллюстрацию длительностей импульсов видеосигнала
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 19.08.2012, 15:51 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| теперь, когда с видеосигналом более менее понятно (у меня в голове уже даже начинает складываться картинка алгоритма) нужно посчитать что же мы все таки сможем получить на выходе:
итак у нас строка на телевизор имеет длинну 64 мкс из них 4.7 мкс - это строчный синхроимпульс около 8 мкс - уровень черного для синхронизации остается около 51-52 мкс на изображение
я хочу получить разрешение по горизонтали около 320 точек
посчитаем с какой скоростью мне нужно выводить биты изображения (длительность вывода одного бита) 50 мкс\320=0.156 мкс на одну точку
я планирую вывод сделать при помощи SPI фактически это аппаратный сдвиговый регистр, имеющий физический вывод у контроллера, называется он _MOSI SPI может тактироваться от тактового генератора с несколькими делителями в реале нас интересует частота тактирования 8 мгц. это доступно с делителем 4 и умножением частоты на 2 тактовая частота меги будет 16 мгц (максимум для 16 меги) итого (16/4)*2=8 мгц
1/8000000=0.125 мкс на такт
нам нужно было 0.156, будет 0.125... ИМХО отлично !
p.s. отлично, потому что предполагаю что SPI будет передавать байты не друг за другом в притык, а с некоторым интервалом, в 1 или 2 периода... к сожалению найти осцилограмму передачи 2х байт данных мне не удалось, везде ограничиваются передачей одного байта... поэтому предположив что вместо 8 таков на байт у нас будет 10 (2 такта на синхронизацию) получим 10*40*0.125=50 мкс - как раз влезем на экран !
Дальше будем считать количество строк для вывода
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 19.08.2012, 16:29 | Сообщение # 3 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Теперь по доступным для рисования строкам
всего у нас 625 строк в одном кадре всего доступно для вывода 576 строк, остальные тратятся на кадровую синхронизацию если дублировать данные по строкам получится 576\2=288 точек по вертикали этого достаточно для 288\8=36 строк символов высотой в 8 точек
мне столько вряд ли будет нужно, поэтому остановлюсь на 32 строках=256 строк графики или 512 строк видеосигнала остальные 64 строки - оставим на рамку изображения сверху и снизу
ИТОГО наше поле для вывода будет иметь 32 строки по 40 символов в строке для хранения нужно будет 32*40=1280 байт в ОЗУ...
и вот тут мы понимаем что atmega16 нам не подходит так как у нее всего 1024 байт ОЗУ нужно для проекта использовать atmega32, у которой 2048 байт ОЗУ
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 19.08.2012, 23:22 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| суть до дело я написал тестовую программу для генерации видео состоящего из двух полукадров
программа на си тестовая программа в папке doc архива схема и номиналы резисторов
ценное в этой разработке: информация о нужных для телевизора кадровых синхроимпульсах. программа генерирует полный видеосигнал с двумя полукадрами по схеме приведенной в первом сообщении
к сожалению великолепно описанный проект http://blog.vinu.co.in/2012....on.html предлагает упрощенную вертикальную синхронизацию, и ни один из моих 3-ех телевизоров не синхронизировался по вертикали поэтому я написал то что должно быть по ГОСТу - и после некоторых доработок все заработало как надо
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Суббота, 25.08.2012, 20:38 | Сообщение # 5 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| продолжаю написание программы для вывода видео..
текущая логика работы программы:
использую таймер Т1 по совпадению с OCR1A - осуществляется вывод синхроимпульсов горизонтальной и вертикальной синхронизации по совпадению с OCR1B - осуществляется вывод данных строки видео сигнала.
вывод в строку осуществляется через SPI на частоте 8 мгц
могу подтвердить что линия в пиксель между символами существует, но этот пиксел наследует состояние леворасположенного.. так что все не так страшно как думалось...
удалось добиться строгой вертикальности пикселов (без сдвига по горизонтали) !!
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 28.08.2012, 19:25 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Начало положено !!!
режим 40х28 строк, с графическим окном 88х72 (при общем разрешении экрана 320х224)
положение графического окна можно задавать с точностью до 8х8 точек (с точностью до текстового знакоместа)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 28.08.2012, 19:29 | Сообщение # 7 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| текстовый режим 40х28 с графическим окном 88х72 (при общем разрешении экрана 160х224)
получается в 2 раза меньше разрешение графической области по горизонтали чем в сообщении выше (с другим режимом)
для разнообразия графическое окно максимально подвинуто вправо :-)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 28.08.2012, 19:46 | Сообщение # 8 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Ну и так уж и быть режим окна 88х72 (при общем 320х224) с позиционированием посередине
по вертикали тоже позиционируется !!
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Вторник, 28.08.2012, 19:47 | Сообщение # 9 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Надпись на изображении "ВИДЕО" - это надпись моего телека :-)) я пока цвет не генерю (хотя в планах есть !)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Пятница, 31.08.2012, 01:40 | Сообщение # 10 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| переписал программу генерации видео таким образом чтобы ее можно было добавлять в любой другой проект.
сейчас пишу подпрограммы взаимодействия..
текущие подпрограммы: avrtv_clr - очистка экрана avrtv_at - позиционирование текстовой печати avrtv_char - печать символа
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Пятница, 31.08.2012, 01:42 | Сообщение # 11 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| кстати, переписанная программа получилась более удобной в плане настройки вывода и имеет большие возможности по настройке генерируемого видеосигнала.
эксперименты продолжаю :-)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Пятница, 31.08.2012, 20:21 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| текущие характеристики модуля:
- текстовый режим 28 строк по 42 символа
- в работе используются два прерывания меги OCR1A_COMP и OCR1B_COMP
текущие вызовы модуля: avrtv_init - инициализация и старт генерации видео avrtv_clr - очистка экрана avrtv_at - позиционирование текстового вывода avrtv_char - вывод в текущих координатах символа avrtv_str - вывод строки из flash начиная с текущих координат вывода avrtv_strln - вывод строки из flash начиная с текущих координат вывода, после вывода строки перевод вывода в начало следующей строки avrtv_hex8 - вывод 8ми битного шестнадцатеричного числа с текущих координат вывода avrtv_dec16 - вывод 16ти битного десятичного числа с текущих координат вывода avrtv_row_up_scroll - скроллинг экрана на 1 строку вверх
какие еще процедуры стоит добавить ?
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Пятница, 31.08.2012, 20:36 | Сообщение # 13 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Пример использования модуля в проектах
Code .include "m32def.inc" ; используем контроллер ATMega32 (или другой с больших объемом памяти)
.include "lib_avr-tv\lib_avrtv_const.asm" ; константы модуля avr-tv константы модуля avr-tv должны быть включены в исходники раньше всех остальных частей
.DSEG
.include "lib_avr-tv\lib_avrtv_dseg.asm" ; сегмент данных модуля avr-tv сегмент данных нужно включить в DSEG сегмент исходников, раньше основного модуля, но позже констант
.CSEG
.ORG 0x0000 rjmp START
.ORG OC1Aaddr rjmp AVRTV_OCR1A ; Прерывание AVR-TV
.ORG OC1Baddr rjmp AVRTV_OCR1B ; Прерывание AVR-TV
START: ldi R16 , low (RAMEND) ; установка стека out SPL , R16 ldi R16 , low (RAMEND) out SPH , R16
call AVRTV_INIT ; инициализация библиотеки AVR-TV call avrtv_clr ; очистка экрана
; здесь ваша программа.... ldi R16 , 0 ldi R17 , 0 call avrtv_at ; установка координат печати ldi R16 , 'A' call avrtv_char ; печать символа А
.include "lib_avr-tv\lib_avrtv.asm" ; библиотека avr-tv, исполняемая библиотека модуля, включается в сегмент CSEG, после констант и сегмента, данных модуля
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Пятница, 31.08.2012, 23:41 | Сообщение # 14 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| начал писать цикл статей про генерацию видео: вдруг кого нить заинтересует и он решит самостоятельно повторить\улучшить мою разработку
Генерация видеосигнала при помощи контроллеров AVR. Часть 1. Аппаратная подготовка.
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 02.09.2012, 07:11 | Сообщение # 15 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| написана вторая часть статьи
Генерация видеосигнала при помощи контроллеров AVR. Часть 2. Синхроимпульсы
Виталий (аka ВитГо)
|
|
| |