Технический форум по робототехнике.
HarryStar » 23 сен 2011, 14:16
Michael_K писал(а):Это скорее всего из-за проверки конца передачи в цикле. Реально там всего один или два такта добавляется (не помню точно).
Нет не из за проверки, я пробовал так:
SPDR = lvideo[6];
while (!(SPSR & 0x80));
SPCR = 0x00; SPCR = 0x51; // SPI выключается и включается
SPDR = lvideo[7];
while (!(SPSR & 0x80));
SPCR = 0x00; SPCR = 0x51;
При этом все пиксели одного размера, но между 8-ками тонкая белая полоса, из за выставления MOSI в 1 во время включения SPI
Michael_K » 23 сен 2011, 15:07
А может быть с фазами SPI попробовать поиграть?
HarryStar » 23 сен 2011, 15:30
Нашел немного другой вариант, сейчас пытаюсь реализовать.
Столкнулся с проблемой: Как быстро поделить число на 3. Т.е. сделать это через битовые сдвиги, вычитание и сложение. Смотрел
forum87/topic8351-75.html#p212173но там про умножение, к делению вроде это не поможет. Думаю как сделать.
Michael_K » 23 сен 2011, 16:30
Таблицей?
HarryStar » 24 сен 2011, 02:02
Скорее всего да. Памяти под прогу полно, всего 12% занято, так что забью массивчик. Жаль проверить не успел, у меня весь комплекс на работе, домой редко его беру. В понедельник отпишусь о результатах.
HarryStar » 26 сен 2011, 12:13
Реализовал некий вариант, почти меня устраивающий.
На данный момент поддерживается 4 видеорежима:
40х29 - 256 градаций серого (используются только 64)
64х38 - 16 гр. с.
80х58 - 4 гр. с.
128х77 - 2 гр.с.
все на чистом Си без асма, все как я хотел.
Разрешение выбиралось из соображений соотношения 4:3 или 16:9, доступной памяти и удобства (по совокупности)
Изображение занимает почти весь экран, черных бордюров почти нет
Минус в следующем:
в режимах с пониженной цветностью различается яркость пикселей внутри 1 байта. Старшие биты самые яркие, младшие самые тусклые. Т.о. при выводе картинки (например фотографии) наблюдается вертикальная полосатость. При 16 гр.с. она почти незаметна, а при 4 и 2 - очень заметна.
Связано это с паразитным влиянием незадействованных битов на ЦАПе. Если их отключить, то все отлично, но мне надо все эти режимы, т.о. все разряды должны быть подключены (для программного выбора любого режима).
Думаю над устранением этой проблемы.
Michael_K » 26 сен 2011, 12:39
>> Связано это с паразитным влиянием незадействованных битов на ЦАПе.
Эмм... не понял.
HarryStar » 26 сен 2011, 12:42
На данный момент схема подключения видео следующая:
Пояснения:
Схема представляет собой обычный ЦАП на резисторах, которые образуют делитель напряжения совместно с сопротивлением в 75 Ом на любом видеовходе (например телевизора).
Резисторы сделаны подстроечными многооборотными для точной регулировки градаций серого.
Проблема:
Требуется программно (через свободные пины) отключать переменные резисторы от МК. Программный перевод ножек на "вход" помогает только частично, т.к. часть из них подтягивается к питанию и влияет на выходное напряжение, что мне не нужно.
Я так понимаю, мне надо поставить по 1 транзистору на каждый бит ЦАПа и управлять ими со свободного порта.
Подскажите, как лучше (а главное проще) подключить?
- Вложения
-
Michael_K » 26 сен 2011, 12:46
HarryStar писал(а):Требуется программно (через свободные пины) отключать переменные резисторы от МК.
Не понимаю, зачем?
HarryStar писал(а):часть из них подтягивается к питанию
Тоже не понимаю, зачем.
По-моему, в режимах с короткой "палитрой" все равно нужно задействовать все ноги ЦАП.
HarryStar » 26 сен 2011, 12:55
Для обеспечения нужного быстродействия на Си пришлось выводить пикселы так:
(пример для 4 градации серого)
- Код: Выделить всё • Развернуть
VPORT = lvideo[ 0]; PIXEL_SIZE2 VPORT<<=2; PIXEL_SIZE2 VPORT<<=2; PIXEL_SIZE2 VPORT<<=2; PIXEL_SIZE2
VPORT = lvideo[ 1]; PIXEL_SIZE2 VPORT<<=2; PIXEL_SIZE2 VPORT<<=2; PIXEL_SIZE2 VPORT<<=2; PIXEL_SIZE2
Т.о. на порту есть старшие 2 бита с нужными данными и 6 бит с левыми данными с соседних пикселей.
На экране получается каша.
Если перевести порт в режим 6 и 7 бит выход, остальные вход - то получается почти нормально (как сейчас у меня), но из-за того, что там неуправляемое значение (0 или 1 в зависимости от картинки) то входы настраиваются или в высокоомные или с подтяжкой на питание, что и вызывает влияние на картинку. Если их разъединить физически, то картинка идеальная, поэтому мне и нужен программный размыкатель, который я буду переключать в зависимости от устанавливаемого режима.
Добавлено спустя 41 секунду:PIXEL_SIZE2 - это макрос задержки
VPORT это у меня PORTB
Michael_K » 26 сен 2011, 13:05
хм... Неужели вот так хуже??? o_O
temp=lvideo[1]; VPORT=temp&0xc0; VPORT = (temp<<2)&0xc0;
Можно перецепить ЦАП на порт АЦП и отключать цифровые ноги битом PUD в SFIOR
Добавлено спустя 3 минуты 1 секунду:
Поправка. PUD отключает все пуллапы на всех ногах, так что можно и не перецеплять.
HarryStar » 26 сен 2011, 13:14
Что-то я не соображу что даст подтяжка 100 Мом...
учитывая что внутри МК входы подтягиваются через 40к, то 100 Мом можно пренебречь, это никак не изменит ситуацию.
Номиналы резисторов от 1к до 40к, соотв стоят переменники на 10к, 10к, 10к, 10к, 100к, 100к
Добавлено спустя 40 секунд:Michael_K писал(а):хм... Неужели вот так хуже???
Да, в разы
Добавлено спустя 1 минуту 20 секунд:PORTB<<=2; компилися в 1 ассемблерную команду, а любые попытки что-то вычислять сразу дают челую пачку команд на 1 пиксель.
Michael_K » 26 сен 2011, 13:17
HarryStar писал(а):Да, в разы
Вам надо срочно пересаживаться на GCC
HarryStar писал(а):PORTB<<=2; компилися в 1 ассемблерную команду
В КАКУЮ???
HarryStar » 26 сен 2011, 13:48
Ну не в одну, в мало
Это уж я так, образно (просто такое впечатление было). Но такая конструкция реально быстрее раз в 8-10
- Код: Выделить всё • Развернуть
;0000 0049 PORTB<<2;
IN R30,0x18
LDI R31,0
CALL __LSLW2
Добавлено спустя 4 минуты 13 секунд:Про SFIOR мысль интересная ...
Но SFIOR = SFIOR | 0b00000100; не дало никакого эффекта. Таки придется использовать аппаратное решение для отключения ненужных ног.
Michael_K » 26 сен 2011, 14:17
HarryStar писал(а):Но SFIOR = SFIOR | 0b00000100; не дало никакого эффекта.
Странно.