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

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

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

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


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


ТВ выход на bascom avr

Сообщений 121 страница 150 из 422

121

Да..да и не дорогая:jumping:

0

122

И так, решил и я чуток поковыряться с DMA (глядя на непроходимость путей, вдруг помогу - чем смогу).
Скопипастил из хелпа баскома пример работы с портом, но порты/чип (xm128a4Udef.dat) у меня другой, решил под него всё начать делать - нифига не работает!!!  :angry:
Информация нет (по конкретики). Долго рылся в поиске и вот нашел очень полезный док: http://www.atmel.com/images/Atmel-42005 … Manual.pdf
Как я понял, DMA адреса для всех чипов одинаковые, взял данные о туда и вот чудо - заработало!
Выплевывает данные с usartc0 (COM1).

----- Array to USART over DMA -----

Hello Bascom
Hello  XMEGA

Ща буду пытаться понимать как из юсуарта делать эспиАЙ!  :D

+1

123

И так, оказалось всё настраивается легко (если знать что делать), результат следующий:

http://sf.uploads.ru/t/TH0Fp.gif
Маска: &B1100_0000

http://sd.uploads.ru/t/3DpKy.gif
Маска: &B1010_1010

Это массив из 14 байт, разрывов вообще нет!  :rofl: МК ничем не занят.  :music: А не, вру, светиком мигает раз в секунду.  :idea:

Единственный момент неприятный, это то, что начало с высокого уровня и заканчивается им, пробовал тупо аппаратно инвертить на выходе сигнал:
http://s9.uploads.ru/t/NrwZJ.gif
Если так делать, то ВСЕ данные будут соответствующие (надо не забывать их пред.подготавливать или так с ними и работать).
Первый импульс - это запуск и конфигурирование МК. Пробелы между блоками - это перезапуск DMA, такой:

Код:
Set Enable_dmach0                                           ' Enable the DMA Channel 0 (This bit is automatically cleard when transaction is completed)
Bitwait Dma_ready , Set                                     ' Wait until first DMA transaction is ready (DMA TRANSACTION COMPLETE Interrupt)
Reset Dma_ready

Полагаю, если на таймер повесить запуск строк, то "Bitwait" нафиг нужен и работать будет быстрее.

зы: если интересный результат, выложу код (а то уже поздно, нет времени причесывать).

+1

124

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

....зы: если интересный результат, выложу код (а то уже поздно, нет времени причесывать).

Ещё как интересен!!! Особенно с комментариями  :rolleyes:

0

125

Имел ввиду, что в коде было кучу экспериментов (хаосных), причесывать уже времени не было (спать/работа), надо там кое что ещё попробовать, чтобы ещё проще было. Вечером выложу.
А документик и правда полезный, много инфы из него берется.

Можно ради теста, картинку 640х480/8=38400 прямо в память МК запыхать и выплёвывать её (или больше, на весь размах). Правда она будет монохром, без всяких там цветов.

зы: получается uSPI  :D на 16МГц работает, для МК который на 32 - можно считать неплохо. Если мало, то можно и разогнать без ущерба до 48, тогда 24МГц пулять должен (хотя надо пробовать), вдруг там отваливаться что начнёт из блоков...

Отредактировано RDW (2016-11-30 10:42:51)

0

126

И так, как обещал код (чтобы не париться с кодировкой русского, сразу готовый файл/архив).

+1

127

Ещё возможно понадобится этот документ (работа с внешней памятью).
Правда эта штука пашет только на полных кристаллах, первой серии (например: А1), т.к. у всех остальных, отрезается контроллер внешней памяти. :(

+1

128

Когда читал про DMA, там есть связанные каналы и регистр, в котором можно настроить автоматическую передачу из двух каналов (называется двойная буферизация, либо 0/1 либо 2/3 либо 0/1 и 2/3), но из 3х не получится, только 2.
Так-же есть возможность указать кол-во повторов или бесконечный повтор DMA. Ещё указывается сдвиг адреса и даже в какую сторону. В теме про DMA прикрепил JPEG картинку, там нарисовал управляющие регистры, почти все, но регистры статуса все не рисовал, только основной, с боку пример копирования блока памяти и стрелки в регистры.
http://s0.uploads.ru/t/zFwUW.jpg
(картинку лучше скачивать, в браузере не просмотреть)

Отредактировано Ev3658 (2016-12-01 22:54:14)

0

129

Это всё понятно, меня смущает два момента:

1. для DMA не хватает такого функционала как, настройка каких-то действий ДО или/и ПОСЛЕ выполнения операции с данными (аппаратной);
2. сколько не читаю про работу VGA, смотрю сигналы...нет не у кого никаких четких понимания как оно работает, всё у всех по разному.
Например меня мучают вопросы:
     - HSync и VSync могут ли прийти одновременно?
     - Или HSync всегда находится как бы внутри VSync?
     - Какова минимальная длина импульса VSync/HSync?
     - вообще монитор срабатывает на эти все сигналы по фронту или спаду? Отсчет откуда?

Отредактировано RDW (2016-12-02 11:09:16)

0

130

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

....
Например меня мучают вопросы:
     - HSync и VSync могут ли прийти одновременно?
     - Или HSync всегда находится как бы внутри VSync?
     - Какова минимальная длина импульса VSync/HSync?
     - вообще монитор срабатывает на эти все сигналы по фронту или спаду? Отсчет откуда?

Отредактировано RDW (Сегодня 11:09:16)

На обычный LCD без проблем, достаточно частоту развёртки выставить правильно, всё остальное лишь бы фронт совпадал.
Я выкладывал кусок, там без проблем развёртка по таймерам схватывает.
Можно просто воткнуть, сделать развёртку вертикальную 60 герц (под нужное разрешение) и монитор без видео сигнала уже включается.
Сперва тоже думал, что чего-то сложное, но оказалось всё проще.
525 горизонтальный импульсов с частотой 60 герц - и всё. Само собой есть криетрии некоторых импульсов, но там разброс большой. даже если тупо валить импульсы, монитор скорей увидит.

0

131

Скорее всего - это особенность твоего монитора, возможно будет проблема с совместимостью.
Я так тоже предполагал, надо как всегда всё на живую пробовать...

0

132

Ну я опробовал на 3х офисных мониторах, два LCD и один CRT, всё было одинаковым, но на китайском VGA уже трудности.

0

133

Китайский LCD?

0

134

Да, есть такие 8-10 дюймов, с ними сложнее:
https://ae01.alicdn.com/kf/HTB1qdMGHXXXXXX2XVXXq6xXFXXXr/201630778/HTB1qdMGHXXXXXX2XVXXq6xXFXXXr.jpg?size=107593&height=600&width=800&hash=539d5ccf897376fe1b04d0592404ca4a
https://ru.aliexpress.com/item/Free-shi … yId=400401

0

135

Уууу..реалтек - не удивительно.)

0

136

Чот я весь в расстройствах поигравшись тут с VGA сигналом. Да генерить V/Hsync - не проблема, МК практически свободен. Да, получилось выплюнуть это всё на монитор (пришлось по колено в пыли оказаться), на экране получил 31КГц и 60Гц (можно подбирать относительно RC), даже получилось кривобоко выплюнуть задуманную картинку 640х480 (те что в общем комплексе, в реальности 800х525 со всеми "блек джеками и шлюхами"), НО! Картинка конечно дергается и растянута очень по всему экрану, ибо тормозит и есть проблема, с которой бороться ну никак не получится - это наимедленнейшая работа с массивом в памяти (для подготовки данных) и всякие там синхронизации и DMA не спасают...
А ведь цель была святая и простая, обеспечить хотя бы монохром в 640х480 (выше даже никто не думал) и вывод статической картинки из памяти программ.
...так вот, что же если говорить о внешней памяти - да ничего!
Чтобы вывести через DMA жалкие 100 байт (минимум для 640, со всякими там отступами), нужно Х-туча времени на получение этих данных (внешка RAM или память программ FLASH) и тут нужно выполнение одного из условий:

1. умение работы DMA на аппаратном уровне, напрямую с внешними источниками памяти;
2. или такую производительность, чтобы программно всё это делать кодом.

Первый вариант - фэйл, ибо возможности работать с памятью программ - нет. А внешняя память...если только у серии А1 (где есть аппаратный контроллер памяти) и то надо пробовать, её у меня в сборе нет, да ещё со всей обвязкой логики и памяти (специальной, пример можно подглядеть на http://www.atmel.com/ru/ru/tools/XMEGA-A1XPLAINED.aspx)
Второй вариант - вообще фантастика, нужен процессор как минимум в 100 раз шустрее.

Пробовал играться с DMA в 2-х режимах, сам вручную запускаю (когда нужно данные выплюнуть) и по событию от таймера (который считает Hsync)...

Вешать на внешку ОЗУ и с неё напрямую выводить картинку, управляя через МК - тоже не получится, тут есть тоже два момента:

1. МК не умеет быстро выставлять на 2-4 полноценных порта данные (всё происходит с задержкой), а это сбивка адреса данных при выводе через ОЗУ;
2. Если проблему первого пункта решить, то нужно ещё предусмотреть механизм похожий чем-то на DMA, но для этой ОЗУ (получается RAMDAC), чтобы и данные писать можно было когда-то и картинку отрисовывать.

А пока получаем такую кривизну:


Цвет зелёный. :)

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

зы: это всё мысли в слух, могу в чем-то ошибаться и данных недостаточно, нужно ещё много перепробовать.

+1

137

Ого! Так уже-же получилось! Изображение прыгает из-за не правильных бордюров, их подбирал как-то опытным путём.
К примеру для 640х480 выводится 525 строк, после 480 строки ничего не выводится. Так-же и с точками, выводится 640 и после должна быть тишина до 800 точек, типа небольшая пауза.
Паузами можно пользоваться, самая большая между кадрами.
Если 1 строку подготовить в DMA, то вторую строку можно подготовить заранее, а в паузе кадра обновить данные в памяти, хотя это теория.
Если не секрет, как таймеры настроили на аппаратную реализацию?
P:S: Лучше на три цвета подавать сигнал или на красный, некоторые злые мониторы поддерживают видео выход без V и G синхронизации. Без видео сигнала но с развёрткой монитор должен  уже включаться.

Отредактировано Ev3658 (2016-12-04 15:47:59)

0

138

Да, без видео данных, при наличии только синхронизаций монитор уже включается, так и отлаживал частоты (подстраивал под RC).
С бордюрами ещё поиграюсь, но я хотел схитрить: синхро сигналы заложены жестко, а вот данные уже заложены с учетом всех пауз и отступов, вот как выглядит оригинал:
http://sd.uploads.ru/t/fiWpv.gif

Дергается как раз из-за того, что МК не успевает обновить/подготовить данные для шустрого DMA и там пролетает Х количество кадров.
Обновлять между кадрами бесполезно, у меня ОЗУ в МК 4КБ, а надо чтобы влезал целый кадр хотя бы, а это 52500 байт (картинка выше).
Думал успевать как-то обновлять через строчку, но оказалось, что SPI так быстро кидает данные, что за это время трудно перебросить 100 байт строки (от картинки, 800 пикселей).
Надо видимо уже на асм уходить, пока лень.) Памяти катастрофически мало для данных.

На счет синхро импульсов: всех их повесил на таймера, 3 штуки.

Первый таймер: считает с скоростью около 31500, выставляет бит на выходе Hsync, считает 525 строк (в картинке) по достижению их выставляется бит Vsync и запускает второй и третий таймер (в зависимости от ситуации).
Второй таймер гасит фронт Hsync.
Третий таймер гасит фронт Vsync.
(можно регулировать скважность гашения)

0

139

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

....
Первый таймер: считает с скоростью около 31500, выставляет бит на выходе Hsync, считает 525 строк (в картинке) по достижению их выставляется бит Vsync и запускает второй и третий таймер (в зависимости от ситуации).
Второй таймер гасит фронт Hsync.
Третий таймер гасит фронт Vsync.
(можно регулировать скважность гашения)

Буду рад куску кода, пропустил бы временно таймеры и перешел бы сразу к DMA.

Тут вариант с таким разрешением только с внешней память.
Памяти МК должно хватить на строку без проблем, пока выводится строка, меняется адрес внешней памяти, в паузе загоняются данные и опять выводятся - типа того.
DMA даст возможность небольшую, расчёт нужно вести на то, что максимум частота порта не больше 2х мегагерц, в этом и есть трудности, лучше использовать 16 битную память, чтоб сразу 2 байта в порты загнать.

0

140

Не знаю как устроен DMA в XMega, но возможно поддерживается прерывания от DMA при передаче половины массива и полной передаче.
Смысл в следующем. Настраиваем DMA на постоянную "кольцевую" передачу из массива и пока передается одна часть массива - заполняем другую. Кстати это одна из задач где разрядность шины данных имеет значение. Чем она шире тем больше байт можно записать в ОЗУ за равное число тактов.

0

141

Я уже ранее писал не раз об этом, что основная сейчас проблема в том, что DMA работает только с встроенной RAM - толку от этого НУЛЬ, т.к. данным браться неоткуда. Чтобы стало проще, надо юзать всё по максимум (А1 серию).

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

Буду рад куску кода

Вот всё целиком, кусай сам, что надо. Там МК до 56МГц разогнан.
Если, что получится дельное - показывай.

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

максимум частота порта не больше 2х мегагерц

Где такое вычитал?

Отредактировано RDW (2016-12-04 20:46:44)

0

142

Может чего-то не понимаю, но где гарантия что все данные успевают передаваться модулем DMA?

Код:
Do
   For F = 1 To V_x_pixel
      My_array(f) = Lookup(tmp2 , Logo)
      Incr Tmp2
   Next F
   If Tmp2 >= 52500 Then Tmp2 = 0
Loop

Не является ли это причиной уплывания картинки вверх которое видно на видео?

Копировать данные нужно по прерыванию от DMA по окончанию передачи половины массива. Тогда все будет синхронно. И копировать лучше по два байта (XMega ведь 16-ти битная). Должно быть быстрее.
А еще лучше (если модуль DMA такое поддерживает) вместо копирования в массив, изменять адрес указателя на графический файл, задавая такое смещение от начала чтобы в регистре DMA указывался адрес нужной строки. Тогда можно сэкономить время на копировании.

0

143

Для DMA нужно подготовить 100 байт данных (100 х 8 = 800 пикселей). На первый взгляд кажется, что это очень мало, но как показали эксперименты, в голом баскоме (без оптимизации в асме), МК может обновить массив всего лишь на 4 байта без ущерба растяжки Hsync - это капля в море (за 31.75us). Причем нет уверенности, что с оптимизацией получится. А потом при таком раскладе, уже будет неясно, сможет ли МК вообще чем-то ещё заниматься (принимать данные с внешки).
По этому, дабы не страдать тупо и не синхронно сделал выплёвывание данных. :)
Но как ранее сказал, эксперименты пока не закончены, просто FPGA (VHDL) поглотило (дабы не зацикливать, решил отдохнуть).

0

144

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

....
Где такое вычитал?


Пробовал вывести, вроде как больше 3,4мГц пин не дрыгался при тактовом 32мГц.
А как до 54мГц разогнали МК?

0

145

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

А как до 54мГц разогнали МК?

в коде же всё есть, "pllmul"

0

146

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

в коде же всё есть, "pllmul"

Кварц на 16мГц?

Возвращаюсь в VGA, ибо это самый практичный интерфейса в поделках, как бы хотелось ЧПУ станок собрать и кардиограф с видео выходом.

0

147

Нет, встроенный RC.

0

148

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

Возвращаюсь в VGA, ибо это самый практичный интерфейса в поделках

Для него можно много оперативной памяти.

0

149

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

Для него можно много оперативной памяти.

Так это-же на халяву под ногами валяется  :D

0

150

Эх....скоро ЛУТом пахнуть будет  :D

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

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


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
Config Osc = Disabled , 32mhzosc = Enabled                  '32MHz

'configure the systemclock
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1


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

Hsyn Alias Portd.4
Vsyn Alias Portd.0
Config Hsyn = Output
Config Vsyn = Output

Evsys_ch1mux = &B1101_1000                                     'Настраиваем канал событий №1 на переполение таймера TCD1

Config Tcd0 = Wgmode , Wgmode = Pwm , Prescale = &B1001 , Event_source = &B1001 , Comparea = Enabled , Event_action = Updown       'на подсчёт таймера
Config Tcd1 = Wgmode , Wgmode = Pwm , Prescale = 64 , Event_action = Restart , Comparea = Enabled,


Tcd0_cca = 1
Tcd0_ccb = 2
Tcd0_per = 525



Tcd1_cca = 1
Tcd1_ccb = 3
Tcd1_per = 15




Do



Loop

http://se.uploads.ru/t/CT4ML.png

Аппаратная реализация горизонтальной и вертикальнйо синхронизации, вот, что делает мануал чудотворный  :hobo:
Монитору нравится, осталось мягко вывести данные.

Отредактировано Ev3658 (2016-12-13 20:12:28)

0


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