roboforum.ru

Технический форум по робототехнике.

TV-AVR

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение 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
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 23 сен 2011, 15:07

А может быть с фазами SPI попробовать поиграть?
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение HarryStar » 23 сен 2011, 15:30

Нашел немного другой вариант, сейчас пытаюсь реализовать.
Столкнулся с проблемой: Как быстро поделить число на 3. Т.е. сделать это через битовые сдвиги, вычитание и сложение. Смотрел forum87/topic8351-75.html#p212173
но там про умножение, к делению вроде это не поможет. Думаю как сделать.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 23 сен 2011, 16:30

Таблицей?
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение HarryStar » 24 сен 2011, 02:02

Скорее всего да. Памяти под прогу полно, всего 12% занято, так что забью массивчик. Жаль проверить не успел, у меня весь комплекс на работе, домой редко его беру. В понедельник отпишусь о результатах.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение 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 - очень заметна.

Связано это с паразитным влиянием незадействованных битов на ЦАПе. Если их отключить, то все отлично, но мне надо все эти режимы, т.о. все разряды должны быть подключены (для программного выбора любого режима).
Думаю над устранением этой проблемы.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 26 сен 2011, 12:39

>> Связано это с паразитным влиянием незадействованных битов на ЦАПе.
Эмм... не понял.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение HarryStar » 26 сен 2011, 12:42

На данный момент схема подключения видео следующая:
Пояснения:
Схема представляет собой обычный ЦАП на резисторах, которые образуют делитель напряжения совместно с сопротивлением в 75 Ом на любом видеовходе (например телевизора).
Резисторы сделаны подстроечными многооборотными для точной регулировки градаций серого.

Проблема:
Требуется программно (через свободные пины) отключать переменные резисторы от МК. Программный перевод ножек на "вход" помогает только частично, т.к. часть из них подтягивается к питанию и влияет на выходное напряжение, что мне не нужно.

Я так понимаю, мне надо поставить по 1 транзистору на каждый бит ЦАПа и управлять ими со свободного порта.
Подскажите, как лучше (а главное проще) подключить?
Вложения
cxema-tv.jpg
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 26 сен 2011, 12:46

HarryStar писал(а):Требуется программно (через свободные пины) отключать переменные резисторы от МК.

Не понимаю, зачем?

HarryStar писал(а):часть из них подтягивается к питанию

Тоже не понимаю, зачем.

По-моему, в режимах с короткой "палитрой" все равно нужно задействовать все ноги ЦАП.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение 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
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 26 сен 2011, 13:05

хм... Неужели вот так хуже??? o_O
temp=lvideo[1]; VPORT=temp&0xc0; VPORT = (temp<<2)&0xc0;

Можно перецепить ЦАП на порт АЦП и отключать цифровые ноги битом PUD в SFIOR

Добавлено спустя 3 минуты 1 секунду:
Поправка. PUD отключает все пуллапы на всех ногах, так что можно и не перецеплять.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение 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 пиксель.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 26 сен 2011, 13:17

HarryStar писал(а):Да, в разы

Вам надо срочно пересаживаться на GCC :)

HarryStar писал(а):PORTB<<=2; компилися в 1 ассемблерную команду

:shock: В КАКУЮ???
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: TV-AVR. (бывш Время выполнения PORTB.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; не дало никакого эффекта. Таки придется использовать аппаратное решение для отключения ненужных ног.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: TV-AVR. (бывш Время выполнения PORTB.1 )

Сообщение Michael_K » 26 сен 2011, 14:17

HarryStar писал(а):Но SFIOR = SFIOR | 0b00000100; не дало никакого эффекта.

Странно.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5