Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ТВ выход на bascom avr


ТВ выход на bascom avr

Сообщений 301 страница 330 из 417

301

Я тебе ща новерное открою "америку", но если представить, что МК разогнан в 2 раза, а это кажется существенная производительность 64МГц, по существу - копейки, т.к. как не крути, а всего лишь в ДВА раза!
Т.е. даже небольшой прирост производительности, сильно влияет на накопительные процессы, которые можно пересчитать под новую частоту, но принципиально нового ты ничего не получаешь!

0

302

Максимальная скорость SPI в USART делит тактовые сигналы на два. То-есть пока передаётся байт, у нас в запасе есть 8 тактов.
Если пиксель 25мГц, то контроллер должен работать на 50мГц. Дальнейший разгон производительности увеличит скорость строки, потребуется больше байт выводить.
Есть одна идея, попробовать принимать данные по мере вывода видимой части по максимум в память МК. А в бордюре между 480-525 строками их записывать в память.

0

303

Ev3658 написал(а):

Есть одна идея, попробовать принимать данные по мере вывода видимой части по максимум в память МК.

ТВ выход на bascom avr

0

304

Пётр написал(а):

ТВ выход на bascom avr

Это другая идея  :D
На последних видео, удалось принять три байта без ошибок и сразу записывать в память в каждой видимой и не видимой строке.
Но алгоритм разбития одного бита на байты занял существенные ресурсы, что не позволило вывести 640 точек (вывел 525).

Вот три байта принимаемых:
--------------------- Первый байт
Указывает на наличие точки или её стирание, так-же на наложение/не наложение.
Указывает на номер бита в байте, если байт равен 128, то включается стирание.
Так-же указывается, какая часть экрана используется (0-255,255-480)
--------------------- Второй байт
Адрес байта в строке (0-80)
--------------------- Третий байт
Адрес байта номера строки (0-255)
---------------------------------------------
Это позволит избежать обратной связи. То-есть рисовать и стирать точками.

В конце рисования одной строки строки происходит процесс:
Считается порт данных, если он не равен нулю, то происходит считывания байта, после VGA делает строб и так считывает оставшиеся два байта.
Дальше меняет адрес памяти и считывает видео байт, после по мере потребности накладывает/стирает и т.п.

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

======================
Точек 307200 - надо это как-то быстро заполнять. У меня получилось 525 точек за 1 кадр, умножить бы на десять и производительность будет радовать.

Отредактировано Ev3658 (2017-01-28 21:42:41)

0

305

Сдаюсь я. Шансы конечно есть, но уже время поджимает.
Даже с DMA не получится выйти на ту производительность, на которую хочется. Всё упирается в управлении.
Опробовал забивать массив с данными, некий буфер, который в бордюре между 480-525 строкой выполняется, но производительность не стала лучше.
Пробовал с DMA и без DMA, по всякому. Ну не как не получается. Уверен, что аппаратное расширение памяти даст прирост, но всё равно будет не достаточным как надо.
Завтра ещё попытаюсь, но после опробую 320/200 точек, пусть так хоть, может и знакогенератор поместится в прерывания. :canthearyou:

0

306

Нужно было брать XMega с контроллером внешней памяти и МК другой архитектуры - более производительный и с большей тактовой частотой. Возможно изучение новой архитектуры и разработка устройства заняла бы меньше времени чем попытка получить требуемый результат на XMega без контроллера памяти.

0

307

Пётр написал(а):

.....и с большей тактовой частотой. .....

Это поможет точно, но контроллер памяти хоть и упростит задачу с DMA, всё-же производительности Xmega A3 не хватит на нормальное общение, очень мало остаётся в конце строк и в нижнем бордюре, максимум, что получилось, вывод двух строк текста за 1 сек., но уверен, что с использованием аппаратной памяти этот показатель можно увеличить в 4-8 раз.
У меня теряется где-то 4 такта между отправкой байтов, в случае с DMA, возможно они смогут как-то работать. а не ждать конца отправки.
Вот, куда проще:

Код:
Usartd0_data = Datain
            Nop : Incr Lowadres
            Do
            Loop Until Usartd0_status.6 = 1

Регистр SPI = Порту памяти
Пропуск такта
Прибавить регистр порта +1
Выйти из цикла по окончанию передачи - вот тут примерно 4 такта теряется.
Выбор строки у меня можно просто:
Прогарммно:

Код:
If Hiadres = 255 Then Twoadres = 0
Incr Hiadres

Аппаратно:

Код:
Запускаем таймер по событию и через выходм Compare включаем выход старшего адреса (вторая половина экрана)
Hiadres = Tcd0_cnt

Вот аппаратная реализация вертикальной и горизонтальной развёртки (9х5мГц=45мГц):

Код:
Настройка видео выхода USART

Tv Alias Portd.3
Config Tv = Output
Portd_pin3ctrl = &B01000000                                 'аппаратная инверсия пина Usart
'Config Portd.7 = Output


'Настрйока USART
Config Com3 = 0 , Mode = Spi , Databits = 8
Evsys_ch0mux = &B1101_1000                                  'Настраиваем канал событий №0 на переполение таймера TCD1
'настройка тайймера вертикальной синхронизации для подсчёта строк по событию 1 и вывода синхроимпульса

Tcd0_ccb = 30                                               'граница начала рисования
Tcd0_ccc = Tcd0_ccb + 480                                   'граница конца рисования
Tcd0_cca = 525                                              'длина кадрового импульса
Tcd0_per = Tcd0_cca                                         'конец всего кадра целиком
Config Tcd0 = Pwm , Prescale = E0 , Event_source = E0 , Comparea = Enabled       'на подсчёт таймера


'настройка таймера горизонтальной синхронизации частота развёртки, всё взаимосвязано
Tcd1_cca = 73                                               '202                                              'начало рисования строки и кадра
Tcd1_ccb = 39                                               '200                                              'скважность сигнала
Tcd1_per = 1699                                             '1414                                             'частота развёртки и видео сигнала в целом (НАСТРОЙКА РАЗВЁРТКИ)
Config Tcd1 = Pwm , Prescale = 1 , Event_action = Restart , Compareb = Enabled , Event_delay = Enabled       'конец гориз.сигнала и вызов прерывания вывода информации


'прерывания по таймерам

'прерывание начала всего кадра
On Tcd0_ccb Dmaen                                                                               'Разрешение вывода данных
Enable Tcd0_ccb

'прерывание в начальной стадии рисования строки
On Tcd1_cca Hsyncdata                                                                  ' обновление массива
Enable Tcd1_cca , Hi

'прерывание концп видимой области
On Tcd0_ccc Dmads                                                                            'запрет вывода данных строки
Enable Tcd0_ccc


Enable Interrupts

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

0

308

Пётр написал(а):

Нужно было брать XMega с контроллером внешней памяти и МК другой архитектуры

Я об этом ещё в начале темы и неоднократно говорил, но целеустремленность Ev3658 меня поражала...   :cool:

Ev3658 написал(а):

но контроллер памяти хоть и упростит задачу с DMA, всё-же производительности Xmega A3 не хватит на нормальное общение

Да забудь ты про А3, нет там никакого контроллера памяти, EBI (какое смешное сокращение) есть ТОЛЬКО у А1. Причем в инете пишут, что с этим контроллером работает только один тип динамической памяти, который весьма трудно достать. Вообще читая доку, что-то я такого подтверждения там не нашел, по этому хотел руками пощупать (не вышло).

Ev3658 написал(а):

уже время поджимает

Ev3658 написал(а):

но после опробую 320/200 точек

Ну для такого уже не факт что нужна XMega, можно и на обычном попробовать.

Ev3658 написал(а):

Вот аппаратная реализация вертикальной и горизонтальной развёртки

За это огромное спасибо (только не хватает шапки с частотой и настройкой PLL).

зы: вообще мне тут наконец все детали приехали и платы (для FPGA), всё пытался делать не дорого (на дешевых "камнях"), по существу с этим как раз большой трабл, если делать всё по фэншую, то в кристалл всё не влезает (так процентов на 30-40), нужна оптимизация сильная, причем я ещё взял маленький корпус на 100 ног (tqfp, не 144), с трудом впихнул/подключил туда две SRAM+вывод и управление по шине 8-бит (отход от планов, думал сделать универсальную штуку для работы с EBI + несколько других интерфейсов (8 и SPI), в общем не до этого как оказалось). В общем опыт получен приличный, пока тоже голову ломаю, есть куча вопросов по компилятору VHDL (который порой такие перлы выдает из-за умности своей, в общем к этому надо привыкать). Первую неделю играюсь с кодом потихоньку, после как железку собрал...

0

309

RDW написал(а):

......
За это огромное спасибо (только не хватает шапки с частотой и настройкой PLL).....

Ой, да, глянул, выше настрйока таймеров на 50мГц. Кварц стоит 5мГц. В принципе особо не важно, всё настраивается в

Код:
Tcd1_per = 1699

Это сразу настраивает всё.
Выходы горизонтальной и вертикальной развёртки надо сразу указать на выход:

Код:
Hsyn Alias Portd.5
Vsyn Alias Portd.0
Config Hsyn = Output
Config Vsyn = Output

'Portd_pin5ctrl = &B01000000                                 ' Аппаратная инверсия пина порта
'Portd_pin0ctrl = &B01000000                                 ' Аппаратная инверсия пина порта

Тогда таймеры аппаратно их будут включать.

Шапка вот:

Код:
$regfile = "xm256a3def.dat"
$crystal = 50000000

$hwstack = 64
$swstack = 64
$framesize = 64


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
Config Osc = Enabled , Extosc = Enabled , Pllosc = Enabled , _
Range = 2mhz_9mhz , Startup = Xtal_256clk , Pllsource = Extclock , Pllmul = 10 , Plldiv2 = Disabled
Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Roundrobin , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled

Сам принцип простой. Есть три прерывания.
Одно срабатывает в начале кадра и в нём можно разрешить прерывание вывода видимой части (обнуляет адрес строк и т.п.)
Второй срабатывает в начале строки - можно включать DMA в нём и т.п.
Третье срабатывает и запрещает прерывание вывода строки.

0

310

На всякий случай, вот печатка - https://yadi.sk/d/mgeBVYZB3Bzhop
Вот порты, отвечающие за память:

Код:
'порты памяти
Datain Alias Pina                                           'шина данных чтения из памяти
Dataout Alias Porta                                         'шина данных записи в память
Lowadres Alias Portc                                        'адрес байта в строке
Hiadres Alias Portb                                         'адрес строки
Twoadres Alias Portf.3                                       'следующая часть памяти
Wr Alias Portf.5                                            'запись/чтение памяти

Config Hiadres = Output
Config Lowadres = Output
Config Twoadres = output
Config Wr = Output

Wr = 1                                                      'включаем чтение
Config Dataout = Input                                      'переводим порт на чтение из памяти

Запись в память:

Код:
               Hiadres = адрес строки 0-255
               Twoadres = части экрана 0-255/255-480-512
               Lowadres = номер байта в строке
               Dataout = записываемый байт
               Config Dataout = Output
               Wr = 0 - после этого байт запишется в память
тут можно просто менять адрес и данные, память всё схавает
               Wr = 1 - переводим память на чтение
               Config Dataout = Input возвращаем порт

Чтение тоже простое, указываете адрес и получаете данные:

Код:
                Hiadres = адрес строки 0-255
               Twoadres = части экрана 0-255/255-480-512
               Lowadres = номер байта в строке
               Переменная = Datain

Записываемые данные 255 - нет сигнала/ 0 - вклчюены. (инверсный)

Управляющая шина данных (как хотите, там полно выводов, я использовал:

Код:
Datavga Alias Pine 'получаемые данные из вне
Config Porte = Input 
'а это как хотите, на ход или выход:
Bit0vga Alias Pinf.0 
Config Portf.0 = Input

Bit1vga Alias Pinf.1
Config Portf.1 = Input

Strobvga Alias Portf.2
Config Strobvga = Output

Кварц лучше был на 5мГц, но и на 16 вполне годный.
Главное менять вот в этой строке:

Код:
Range = 12mhz_16mhz

и множитель.

0

311

Да, у тебя получилось всё более гибко, проще для перестройки под другие входные частоты.

Ev3658 написал(а):

Osc = Enabled

Эту штуку можно поставить в дизэйбл, ибо включает внутренний RC на 2МГц, который ты не юзаешь.

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

0

312

Вот тут два исходника, работаю. Управляющий контроллер с кварцем 16мГц х 3, VGA контроллер 5 мгц х9
Вот - https://yadi.sk/d/Hm5DHNVZ3C28gf

Отредактировано Ev3658 (2017-01-31 12:39:22)

0

313

А шрифт у тебя там 8х16? Классический?

0

314

RDW написал(а):

А шрифт у тебя там 8х16? Классический?

Не, шрифт повзаимствовал у вдохновляющего проекта - http://www.vga-avr.narod.ru/main_rus.html
шрифт - 8x12 точек
Хотя с примерами выше по ссылке, там уже любой подойдёт, но если встраивать, там шрифт нужен был читаемый с верху в низ по 8 битов.

0

315

Понятно, спасибо.

Общие стандарты на текст, для памяти: https://en.wikipedia.org/wiki/Text_mode

0

316

Я до сих пор не могу определиться с выходным напряжением для цветов, нигде не вижу информации о том, что стоят ли резисторы на землю 75 Ом в мониторе или их надо ставить самому? Если смотреть все платы китайские с VGA, то там ничего подобного нет. Пробовал выводить без резисторов 75 Ом (делитель), вроде картинка красится, но как-то блекло.

Вот здесь они нарисованы:

http://www.johnloomis.org/altera/DE2/vga_schematic.jpg

А вот здесь нету:

http://www.gammon.com.au/images/Arduino/VGA_Output_11.png

И здесь нет:

http://www.xess.com/static/media/uploads/blog/devbisme/2011-06-02/VGA_DAC.png

Отредактировано RDW (2017-01-31 14:41:24)

0

317

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

0

318

Я не про это.
Я про схемное решение.
Как мы знаем, на цвет должно подаваться 0.7 вольта, эти 0.7 можно получить делителем например из 3.3 вольта. Рассчитать делитель можно из расчета нижнего плеча резистора в 75 Ом (тот что идет на общий/минус). И в инете, на разных картинках - разные показатели. Я конечно понимаю, что там всё сложнее, ибо используется спец провод тоже на 75 Ом, но я ща не про это.
Как ты подключал вывод цвета, просто через резистор (и какой) или полноценный делитель из двух резюков?

0

319

Вот вам еще нашел, а то жалко, мучаетесь. :crazyfun:
MC6845P или S1D13504

0

320

MC6845P - фигасе, поддержка светового пера!  :D Вроде дешевая.
S1D13504 - это полуфабрикат, ему ещё RAMDAC подавай + непонятное ОЗУ и в продаже дешевого варианта не нашел.

0

321

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

Код:
For t=1 to 30
 For p=1 to 20
   y=y+1
 next p
next t

Вот так:

Код:
Tape=1
Case Select Tape
 Case 1:
   T=1
   P=1
   Tape=2:
 Case 2:
   Incr P
   IF P=20 Then Tape=3
 Case 3:
   Incr T
   P=1
   IF T=30 Then Tape=0
   Tape=2
End Select

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

Буфер обработчик будет выполнять тоже команды, накопленные в массиве.
В итоге для рисования 1 буквы мы не принимаем 8х12=96 точек х 3байта на точку = 288 байт, а достаточно будет 3х байт.

Как бы шанс есть, буду пробовать!

0

322

Кстати, тут случайно налетел на такое: https://www.kickstarter.com/projects/67 … -for-ardui
А я думал вообще никто не пытается даже пропихнуть в продажу вещи подобного плана... ;)

0

323

Перемычка какае-то на видео смущает.
И чего я пытаюсь 640х480, вон и 400х300 хватает  :hobo:
Отложил немного проект, но в принципе он почти завершен.

0

324

Ev3658 написал(а):

я пытаюсь 640х480, вон и 400х300 хватает

Нет, никаких 400х300!!! Только 640х480!!! Иначе смысла нет. При 640 на 480 точка и так крупная на 17 дюймах, по идеи надо ещё уменьшать её размер. :)
А на счет больших объёмов данных, так всё упирается в интерфейс передачи и где всё это хранить. Изначально, даже 320х240 большое разрешение (если не монохром) и тут всё равно будут проблемы с скоростью, а раз так, то нет смысла делать мало.

Кстати говоря, для станка можно и монохром отображать, вон в своё время был Херкулес, разрешение 720×348, вот эти 720 очень прилично смотрелось (правда на 15 дюймах). В общем можно смело делать 720х480.
Дальше, чтобы убыстрить вывод, придется внутри "агрегатора VGA" делать "процессор" с своим протоколом. Я правда пока о этом не думаю, ибо основа ещё непонятна...

0

325

Кстати, тема не наша, но как вариант решения: http://www.mcselec.com/index2.php?optio … mp;t=13753
Правда видимо не дешевое...

0

326

Это точно. 10 штук 2500р. В этот SSD1963 уже готовое решение или требует прошивки? Просто ограничен в Интернет )))
Есть готовые LCD дисплеи 11 или 7 дюймов, уже для Arduino, тоже там торчит.

0

327

Вроде да:

http://s9.uploads.ru/t/V61Fn.gif
https://www.terraelectronica.ru/news_postup.php?ID=2172
Но как-то всё тормознуто работает у людей при высоких разрешениях, возможно из-за выбора узкого интерфейса...

0

328

Ну всё... почти сдался!!!! Хотя всё-же решил опробовать интерфейс TWI, но для этого мне как-то надо научится работать с внутренней памятью.
Чисто теоретически памяти контроллера должно хватить на 320х200 точек, это 200 раз по 40 байт = 8000 байт.
Вроде в Xmega256A3-AU их как раз 8
Выбор адреса памяти в DMA проблем не составило:

Код:
Adrs = P * 40
'Adrs = Adrs + &H2000
Dma_ch0_srcaddr = Adrs

Но я не знаю как туда записать, да и как себе ячейку то отжать.
Пробовал навести шуму через:

Код:
For P = 0 To 200
Adrs = P * 40
O = Rnd(255)
'Adrs = Adrs + &H2000
Writeeeprom O , Adrs
Next P

Но чего-то не прокатывает.
Poke оказывается только с регистрами работает.

0

329

Не усложняй, создай тупо массив.

0

330

RDW написал(а):

Не усложняй, создай тупо массив.

Как-же его создать то? Мне надо примерно такой: Dim Video(200,40) As Byte
Двухмерные в 2.0.7.8 не поддерживаются.
Запуск (DMA трансляции в SPI с адреса) рисования строки каждый раз и адрес массива меняется через каждые две/три строки.
Прерывание по окончанию трансляции успевает сконфигурировать опять DMA для следующей трансляции.
Если использовать массив, то нужно будет в ручную 200 раз вбивать адрес массива.
Контроллера с EBI сейчас нет, но хочется проверить эту возможность на меньшем разрешении используя память МК, там её судя по документации 8кб.
Управление контроллером попробую через TWI, там вроде есть какой-то доступ к регистрам памяти.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ТВ выход на bascom avr