Перерыл все возможные гуглы, нашел несколько реализаций, нашел описание передачи видео-сигнала. Читал, смотрел, опять читал. С железом более-менее разобрался, принцип работы понятен.
А вот с софтом не очень, не хватает познаний. Так что все рассуждения основываются на познаниях из мануалов "для чайников"

Итак, купил LM1881, кварц 16 мгц, конденсаторы, резисторы, пару диодов. Подключил все это к меге16 - сигнал горизонтальной синхронизации на вход внешних прерываний INT0, вертикальной на INT1. Получается что прерывание по INT0 возникает в начале прорисовки каждой строки, а INT1 в начале каждого кадра (или полукадра, т.к. рисуется через строчку). Ногу PD7 сделал выходом и подключил обратно к центральной жиле видеокабеля через диод и сопротивление.
Сделал счетчик строк, который прибавляет 1 при каждом INT0 и обнуляет при INT1.
Посидел, подумал, написал... в прерывании INT0 ждем нужной строки, после чего ждем определенное время, включаем "питание" на PD7, опять ждем, выключаем питание. Получается горизонтальная линия определенной длины и с определенным смещением от левого края.
Нарисуем крест. В обработчике INT0 условие - если строка не та, которая нам нужна, то ждем, включаем PD7 и сразу же выключаем (чтобы получить штрих с наименьшим размахом). Т.к. задержка в каждой строке одинаковая, должна получится ровная вертикальная линия. Но не получается :


Фото стоп-кадра экрана прикрепил.
Вот кусок кода с обработкой прерываний:
Код
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (vert==150) {
i=10;
while(i--) { #asm("nop"); }
PORTD.7=1;
i=30;
while(i--) { #asm("nop"); }
PORTD.7=0;
}
else {
i=20;
while(i--) { #asm("nop"); }
PORTD.7=1;
PORTD.7=0;
}
vert++;
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
vert=0;
}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (vert==150) {
i=10;
while(i--) { #asm("nop"); }
PORTD.7=1;
i=30;
while(i--) { #asm("nop"); }
PORTD.7=0;
}
else {
i=20;
while(i--) { #asm("nop"); }
PORTD.7=1;
PORTD.7=0;
}
vert++;
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
vert=0;
}
Обучите, пожалуйста, чайника основным принципам правильного построения изображения на этой железной связке (LM1881 + atmega16). Для начала хотя бы прямых линий
