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

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

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

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


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


ТВ выход на bascom avr

Сообщений 91 страница 120 из 421

91

Пётр, это я прекрасно понимаю, просто хотел дать понять Ev3658 - чтобы не вешал нос.)

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

Интересная статья

Наконец нашел ответ на мучащий вопрос, "надо ли выдерживать все эти паузы в "бордюрах" или можно сразу пытаться рисовать от начала и до конца":

Еще надо учесть, что во время импульса blank нам надо запирать выходы RGB. Если этого не сделать, ЖК мониторы не смогут автоматически определить границу растра и выровнять его.


Если зайти по ссылке в статье о разрешениях/таймингах, то мы увидим кучу других проэктов (как известных, так и похожих на нужное): http://tinyvga.com/ Использование: RAMDAC+SDRAM+AVR, ISA Video Card + AVR.
Правда там нет всех данных о деталях...

Отредактировано RDW (2016-10-25 22:39:52)

0

92

Схема сильно усложняется, но есть выход по скорости!
Если использовать 16 битную ОЗУ, то две точки можем выводить сразу, на выходе получаем нужные сигналы, первый выводим при наличии такта, второй при отсутствии такта.
Схема как-то большой получается, так как две ОЗУ надо как-то изолировать друг от друга в переключении.

0

93

А не проще ли найти КР580ВГ75 или ее аналоги. В свое время 8 мегагерцовый КР580ВМ80А отличненько со всем этим справлялся. Поищи схемы Ориона, Радио-86РК, Специалиста и т.д. :flag:

0

94

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

Наконец нашел ответ на мучащий вопрос, "надо ли выдерживать все эти паузы в "бордюрах" или можно сразу пытаться рисовать от начала и до конца":

Надо. Если забить на горизонтальный бордюр и использовать вертикальный, то не все мониторы будут работать. Ещё, бордюр отвечает как-то за соотношение сторон.
Так-то удалось линии вывести вот таким образом на 19 дюймовый ЖК Acer, причём к частоте развёртки не так сильно критично и к временным таймингам:

Код:
$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
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Vout Alias Portd.5
Gsyn Alias Portd.6
Vsyn Alias Portd.4

Config Vout = Output
Config Gsyn = Output
Config Vsyn = Output
Config Portd.7 = Output
Led Alias Portd.7

Dim X As Word

Dim Y As Word
Dim Pixel As Bit
Dim Tim As Byte
X = 1



Do

If Tim < 51 Then
   Incr Tim
   Else
   Vsyn = 0

   Tim = 0
Waitus 2
If X < 525 Then
   Incr X
   Else
   X = 1
End If

If X = 492 Then
   'Vout = 0
   Gsyn = 0
   'Waitus 30
   Else
   Gsyn = 1
End If
Vsyn = 1

If X < 240 And Gsyn = 1 Then
   Vout = Not Vout
   Else
   Vout = 0
   End If

End If


Loop
End
Фото

http://s3.uploads.ru/t/zpVwq.jpg
http://s6.uploads.ru/t/VnvRa.jpg

Но вот на китайском LCD 9 дюймов такое не прокатывает, моргает и никак не включается.

Отредактировано Ev3658 (2016-10-26 09:53:02)

0

95

sva-don написал(а):

А не проще ли найти КР580ВГ75 или ее аналоги. ....

Ага, и будет здоровенная плата с обвесным ))))
Может уж лучше вот это - CY7C107D - DATASHEET

0

96

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

...., у тебя дергать одной ногой даже не получилось, .....

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

0

97

Не, это бесполезно. Видео сигнал 640х480 не реально. Можно только с пропуском пикселей по горизонту. Использовать аппаратный SPI как вариант, но он на 8 мегагерц, может у Xmega быстрей сможет, всё равно не хватит.
Тут либо делать внешний генератор с счётчиком, который будет выводить линию из ОЗУ по приказу, либо ПЛИС или готовое чего нибудь из MX386 )

0

98

Ну на сколько я понял, миниатюрно сделать и так не получится, тут упирается всё в большие частоты, а они доступны только на АРМах и ПЛИС. Ещё требуется широкое адресное пространство (идеально: 640х480х24bit=921 600) и куча управления и главное, что всё это должно управлять каким-то быстрым, универсальным способом (явно параллельно). Ещё надо понять какой реально объём стоит пропихивать/управлять, для МК 1МБ в секунду даже много, значит придется уменьшать, скажем до 640х480х8bit=307 200 - это уже реальнее, но: и про цену не нужно забывать (ОЗУ не дешевое), и хватит ли разрешения 640х480?

0

99

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

... и про цену не нужно забывать (ОЗУ не дешевое), и хватит ли разрешения 640х480?

ОЗУ халявные, есть везде, можно и бомжом прикинутся для этих нужд  :D
SDRAM и прочее в старых компьютерах аж в DIP корпусах и объём путный. Всё-же жалко, что скорость нужна дикая. Разрешения 640х480 или 800х600 для AVR за глаза.

Сейчас пробую через SPI и чувствую, без ассемблера тут никак. Всё-же хоть 30х20 символов + графический режим, уже не плохо, точней лучше, чем ничего  :rolleyes:

0

100

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

0

101

http://s6.uploads.ru/t/ZysBX.jpg
http://s2.uploads.ru/t/h2EVW.jpg

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 96
$swstack = 96
$framesize = 96


Gsyn Alias Portd.3
Vsyn Alias Portd.2

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Noss = 1 , Clockrate = 4
Config Portb.2 = Output
Portb.2 = 1
Config Portb.3 = Output
Spiinit

Config Timer2 = Timer , Prescale = 8 , Clear Timer = 1
On Oc2b Syn                                                
Compare2b = 61                                            
Enable Oc2b
Enable INTERRUPTS   'Íà óñìîòðåíèå



Config Gsyn = Output
Config Vsyn = Output



Dim X As Word

Dim P As Byte

X = 1


Do


Loop
End



Syn:


Vsyn = 0

Incr X
Timer2 = 8
If X = 526 Then

   X = 1
   P = 0
   Else
   nop ''это баланс
   nop
   nop
   nop
   nop

End If


'nop
'nop


If X = 492 Then 'импульс кадра
   Gsyn = 0
   Else
   Gsyn = 1
End If




Vsyn = 1
nop
If X < 481 Then 'вывод информации
Spiout P , 1
    Incr P
    'nop
   Else 'для баланса
   P = 0
Spiout P , 1

End If
Return

Не могу понять, как смогли выводить на 8 мегагерцах SPI? Вроде как мелькает информация о том, что в режиме Master можно удваивать частоту, но у меня не получилось.

Код прогарммы соответствует картинкам. Без понятия как убрать высокий уровень в SPI, может кто подскажет?.

0

102

А SPI используют для отрисовки информации/данных или синхронизации?

0

103

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

А SPI используют для отрисовки информации/данных или синхронизации?


Данных, он же регистр сдвига наоборот ))))
Вот только придётся на ассемблере искать решение, так как пауза между каждым выводимым байтом.
Если пригодится, то частоту в режиме Master удвоит вот это: Spsr.0 = 1
Получается, 16 мегагерц делим на 4ре = 4 и удваиваем = 8 мегагерц.
Если приткнём вторую Atmega, то можно по очереди выводить данные, а это уже 16 мегагерц. Пока один отдыхает, другой трудится, но это в теории.
Сейчас встрял на том, что если вывести три байта, то между ними пауза на экране, то-есть сплошную линию не вывести.
И хуже того, никак ассемблером не заменю строку инициализации и не найду возможность поменять режим вывода MOSI

Код:
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Noss = 1 , Clockrate = 4
' это должно заменить строку выше, но не менят, SPI работает в разы хуже, но думаю тут проблема не в регистрах:
Spcr.7 = 0
Spcr.6 = 1
Spcr.5 = 0
Spcr.4 = 1

Spcr.3 = 0
Spcr.2 = 0

Spcr.1 = 0
Spcr.0 = 0

Spsr.0 = 1

Отредактировано Ev3658 (2016-10-26 17:06:04)

0

104

Крути на ХМеге, там как раз получишь свои 16МГц)
Я кстати для своих игрищь с АЦП, как раз крутил асмом, ибо штатная функция баскома это делает не слишком оптимизировано...

0

105

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

Крути на ХМеге.....

Дорогая, да и время в этом году, как и  атмосферы для глубокого изучения нет, таймеры там по другому, прерывания и много чего другого.

Всё-же интересно, как они умудрились заполнять сдвиговый регистр и сразу его выводить, ведь экран заполняется текстом довольно плотно:
http://www.vga-avr.narod.ru/main_rus.files/image005.jpg

У меня-же длина данных равна следующей пустоте перед следующими данными, даже если выводить стразучетыре байта.
Spiout var , 4

0

106

Инициализация:

Код:
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Noss = 1 , Clockrate = 4
Spsr.spi2x = 1 'Удвоение частоты

Вывод:

Код:
Dim P As Byte
...
...
Incr P
Spiout P , 1
Spiout P , 1
Spiout P , 1
Spiout P , 1

Результат:

http://s2.uploads.ru/t/xiYV5.jpg
....

Код:
....
....

P(1) = B
P(2) = B
Spiout P(1) , 2
Incr B

Результат:
http://sh.uploads.ru/t/FlwTP.jpg

Нужно как-то убрать промежуток между пикселами  %-)

0

107

Вообщем, картина прояснилась!!!
Отказываемся от Bascom операторов для SPI и нежно переходим на регистры.
Инициализация SPI простая, разрешаем SPI, выбираем режим Master, отказываемся от прерываний, делитель ставим на х4 и вклчюаем удвоение частоты в Master режиме и т.п.

Код:
'Регистр управления SPI SPCR
Spcr.spie = 0                                               'разрешение прерывания
Spcr.spe = 1                                                'Разрешение SPI
Spcr.dord = 0                                               'Порядок сдвига
Spcr.mstr = 1                                               '1-ведущий 0-ведомый
Spcr.cpol = 0                                               'полярность синхронизаци
Spcr.cpha = 1                                               'Фаза синхронизации
Spcr.spr1 = 0                                               'частота синхронизации
Spcr.spr0 = 0                                               'частота синхронизации

'Регистр статуса SPI SPSR
Spsr.spi2x = 1                                              'удвоение частоты

Использование Spiinit не нужно.

Вывод инфомрации простой. Кидаем первый байт в регистр и включаем SS=1, после выдерживаем паузу перед закидыванием следующего байта:

Код:
nop
nop
nop
nop
nop
nop
Nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
Spdr = 0

В конце чистка регистра, иначе шлак выводится.

http://sf.uploads.ru/t/CjR1w.jpg
http://s2.uploads.ru/t/DY9B6.jpg

Собственно, ресурсов ещё нормально так остаётся, можно и с памятью работать и в носу ковыряться  :D
Правда всё-же есть расстояние между байтами.

0

108

Ура! Есть прогресс!

Расстояние между байтами ты не уберешь, ибо нужно время чтобы загрузить/извлечь новое значение в регистре SPI, для этого DMA придумали...

А ты паузы не выдерживаешь (как я понял), тупо кидаешь информацию по синхросигналу?

0

109

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

Ура! Есть прогресс!

Расстояние между байтами ты не уберешь, ибо нужно время чтобы загрузить/извлечь новое значение в регистре SPI, для этого DMA придумали...

А ты паузы не выдерживаешь (как я понял), тупо кидаешь информацию по синхросигналу?


Прерывание срабатывает и сразу выкидывается пучёк, я код выше выкладывал. Там тупо 525 строк отсчитывается и на исходную.
В конце каждой строки горизонтальный импульс, после которого вываливаю всё в SPI буфер до 480 строки и по достижению 492 строки делаю импульс вертикальнйо развёртки, после тишина до 525 и на исходную.

Паузы слишком большие, если не трудно, подскажите, как в Bascom можно работать напрямую с регистрами R0-R17, в версиях 2.0.7.1 по 2.0.7.8 были трудности, работалось без проблем, но в них появлялись сторонние данные и вели себя как-то не культурно. Может есть возможность какая зарезервировать его и использовать без проблем? SPI регистр на одной шине с регистрами висит, это даст чуток жару  :writing:

0

110

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

как в Bascom можно работать напрямую с регистрами R0-R17, в версиях 2.0.7.1 по 2.0.7.8 были трудности, работалось без проблем, но в них появлялись сторонние данные и вели себя как-то не культурно

Никаких особенностей для работы с регистрами нет, проблема в том, что Баском для своей работы их использует как хочет, что может влиять как на "свой" код/данные, так и на работу кода баскома, так же они легко могут портиться из-за прерываний. Надо просто это всё учитывать и гонять всё через стек.

0

111

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

.... Надо просто это всё учитывать и гонять всё через стек.

Не могу сообразить. Есть общая шина данных, как быстрей в неё загнать данные, чтоб из неё сразу в регистр SPI впихнуть?

0

112

Вообщем, последний пиксель из регистра выводится с задержкой. В версии Bascom 2.0.7.8 разрешается работать с регистрами R0,R1 и т.д. прям из кода и это ускоряет на пару тактов вывод в SPI, правда сам SPI как-то странно выводит, теоретически он выводит нормально всё, просто последний байт задерживается и это удлиняет одну линию на экране. Если выводить на 1 так раньше, то мы не успеваем вывести как только заносим опять, а в пол так-та занести в регистр не получается.
Разрешение экрана 640х480 60 герц, возможно если снизить частоту вывода, то задержка сгладится.

Без понятия, как он преодолел проблему длины последнего бита между байтами в строке "Простой VGA/Видео адаптер" не использовал удвоение частоты SPI:
http://www.vga-avr.narod.ru/main_rus.files/image004.jpg
Технические характеристики VGA-адаптера:
Количество символов: 20 строк по 20 символов
Разрешение матрицы знакогенератора: 8x12 точек
Кодовая таблица знакогенератора: WIN 1251
Формируемый сигнал: VGA
Разрешение: 640x480
Частота кадровой синхронизации: 60Hz

http://www.vga-avr.narod.ru/main_rus.files/image005.jpg

Количество символов: 20 строк по 38 символов
Разрешение матрицы знакогенератора: 8x12 точек
Кодовая таблица знакогенератора: WIN 1251
Формируемый сигнал: Composite Video(PAL/SECAM)
Разрешение: 625 строк (чересстрочная)
Частота кадровой синхронизации: 50Hz

640 \ 8 = 80 ячеек.
20 символов VGA * 8 = 160, 640/160 = 4 точки 1 выводимый пиксель.
Собственно так и есть, 4 точки на экране по горизонту и есть 1 пиксель, в Xmega можно уменьшить до 2 точек 1 пиксель.

Наверно он просто сделал не выводимую полосу, заодно и отступ между буквами, но мне же графику надо, это не допустимо  %-)

Отредактировано Ev3658 (2016-10-27 23:06:10)

0

113

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

Помню сколько мучал Xmega по SPI на асме, так не удалось сделать ровный вывод word-а (двух байт), там всегда идёт разрыв между ними, но Баском это делает ещё хуже. Время тратиться на обновление данных в регистре - это и есть сбивка во времени. Чтобы этого не было, нужно этот регистр заполнять как-то через DMA и следовательно, в ОЗУ должна размещаться (помещаться) вся строка целиком. Я по сей день DMA так и не баловался, надобности не было, т.ч. точно подсказать не смогу, как это сделать, надо самому разбираться...в общем если камень большой, то ОЗУ там значительно больше есть, у меня в основном А4, у них макс 4К (на всё), следовательно если пихать весь экран в МК, нужно 640*480/8=38400 байт, чот не мало, зато монохром. :D Ещё чую, что можно всё так настроить, что вся эта дребень будет полуаппаратно сама выводится не загружая МК.

0

114

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

.... там всегда идёт разрыв между ними, но Баском это делает ещё хуже. В....К.

Есть теория. разрыв связан с SCK тактами и последним битом на выходе.
http://se.uploads.ru/t/T32Fk.png

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

0

115

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

Ещё чую, что можно всё так настроить, что вся эта дребень будет полуаппаратно сама выводится не загружая МК.

Даже не знаю, но тоже чувство было пол месяца назад, сейчас мозг изнасявкан и теперь я на измене  :confused:
А можно в МК использовать какой нибудь счётчик или таймер для подсчёта WORD переменной, а то как-то работать с двухбайтовыми переменными жутко тормозит МК?

0

116

SPI работает так (общее):

- загружаешь регистр для отправки;
- запускаешь процесс отправки;
- в этом же регистре, обратно прилетают данные с внешки.

Т.е. крутить по кругу просто загруженный регистр не получится, он постоянно портится. Иными словами, у SPI нет четкого режима "отправка/получение" данных - оно едино. А время пикселей - идет, не ждет пока загрузишь новые данные.
Почему у тебя есть эффект тянучки данных - непонятно, возможно проблема в следующем, пока ты загружаешь данные в SPI, у тебя нога МК весит всегда не в нуле и не в единице, а в зависимости от последних отправленных данных (последнее значение) и мажет пиксель последними данными. Чтобы этого не было - ты должен успевать "гасить" значение для луча монитора. Как это сделать? Ну тут уже фантазия как работает: увеличивать скорость загрузки SPI, чтобы время было быстрее отрисовки пикселя или поставить внешний ключ, который бы автоматом после отправки 8 бита тушил выход...а, можно ещё вход SPI на землю посадить и делать гашение луча, тогда мазать будет только "черным".

Отредактировано RDW (2016-10-28 12:39:07)

0

117

Во: http://www.batsocks.co.uk/readme/XMegaExamples.htm#XTV читай внизу про чудеса DMA. :D

Короче, надо пробовать: http://avrhelp.mcselec.com/index.html?config_dmachx.htm
Это так можно а-ж 800 пикселей и больше в памяти хранить (одной строкой).

Отредактировано RDW (2016-10-28 12:54:35)

+1

118

Мозг сломал. Datsheet какой-то не полный, даже с переводом не понять, что да как работает. Блок схем почти нет, информация по регистром хаотично разбросана, такое ощущение, что серия Xmega выкинули в продажу для галочки.
Без понятия, как связать DMA с Usart, как вообще использовать регистр сдвига в Usart, да и таймеры просто вынесли мозг  :'(
В Datasheet столько информации, что держать в голове нет возможности. Примеры в Bascom Avr есть, но там всё не то, причём это уже не Bascom, а прямое обращение к регистрам, то-есть можно уже смело на Си переходить или ещё проще, на ассемблер.
До конца неделю покурю Datasheet и сдамся. 333 страницы, около 160 листов двухстороннего текста  :smoke:

0

119

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

серия Xmega выкинули в продажу для галочки.

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

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

Без понятия, как связать DMA с Usart, как вообще использовать регистр сдвига в Usart

Это да, надо просто взять имеющийся пример и попробовать. Если он работает, то двигаться дальше, по части настройки уарт в аля SPI...это я уже не раз говорил.

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

да и таймеры просто вынесли мозг

Не знаю, эта штука вроде в Баскоме нормально сделана, всё работает без проблем, надо просто (как и везде) привыкнуть.

зы: кстати мне пришли чипы AS6C4008, как время летит...

0

120

Память  8-)  512х8 от 3.3 до 5.5в., очень вкусная штука!

0


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