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

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

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

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


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


ТВ выход на bascom avr

Сообщений 331 страница 360 из 405

331

Не понял?
Если тебе надо обмен наладить с DMA для вывода видеоданных, то делаешь простой массив на весь объём. Адресацию в нём уже можно отдельно рассчитывать при загрузке данных.
Если тебе надо зачем то избыточно именно двухмерный, то просто надо пересмотреть алгоритм. Он же доп нагрузку наложет на производительность. Можно так же в одномерном расчеты делать...

Отредактировано RDW (2017-06-21 11:09:55)

0

332

Кратко как реализовано:

Код:
Config Dma = Enabled , Doublebuf = Disabled , Cpm = Rr
Config Dmach0 = Enabled , Burstlen = 1 , Chanrpt = Disabled , Ctr = Disabled , Singleshot = Enabled , Tci = Lo , Eil = Off , Sar = Transaction , Sam = Inc , Dar = None , Dam = Fixed , Trigger = &H6C , Btc = 35 , Repeat = 0 , Sadr = Varptr(adrs) , Dadr = Varptr(usartd0_data)
Start Dmach0

DMA при запуске командой "Dma_ch0_ctrla.7 = 1" выдаёт из ячейки памяти 35 байт в выход SPI.
Запуск DMA происходит по таймеру (OCA), который создаёт синхроимпульс (OCB).

Код:
Tcd1_cca = 28                                               'начало вывода DMA в SPI
Tcd1_ccb = 15                                               'длина импульса сигнала
Tcd1_per = 176                                              'развёртка (подбирается по частоте МК, это на 45мгц.
Config Tcd1 = Pwm , Prescale = 8 , Event_action = Restart , Compareb = Enabled , Event_delay = Enabled       'таймер горизонтальной развёртки

По таймеру вертикальной развёртки происходит разрешение прерывания и запрет прерывания, которое запускает транзакцию DMA:

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


Прерывания простые:

Код:
Enable Interrupts

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

'прерывание начала рисования строки
'On Tcd1_ovf Dmaen                                           'Разрешить выводить строку                                         ' Nosave                                   'вывод данных и обновление массива
'Enable Tcd1_ovf

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

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

'Прерывание в конце транзакции DMA
On Dma_ch0 Linedma
Enable Dma_ch0 , Lo


Код:
'Запуск транзакции DMA
Hsyncdata:
Dma_ch0_ctrla.7 = 1
Enable Dma_ch0 , Lo 'разрешаем прерывание по окончанию транзакции
Return

Dmaen: 'разрешаем прерывание вывода видео
   Enable Tcd1_cca , Hi
   Disable Tcf0_cca
Return

'Не разрешает вывод данных
Dmads:
   Usartd0_data = 255 'чистим SPI
   Disable Tcd1_cca

Проблема сейчас в том. что мне нужно как-то сделать смену адреса в DMA в прерывании:

Код:
Linedma:
Usartd0_data = 255
Disable Dma_ch0
 'ВОТ ТУТ чего-то надо сделать, чтоб в Dma_ch0_srcaddr = адрес нужной строки в памяти
Return


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

К примеру 35 байт по 200 раз вполне достаточно, но как выделить память то?

0

333

Ты так красиво всё изложил, непонятны проблемы.
- стопанул прерывание ДМА.
- записал в Dma_ch0_srcaddr адрес массива, который шагает по 35 байт.
- разрешил прерывание.
- выставил флаг.

В чем проблема?
Так не работает?
В Dma_ch0_srcaddr нельзя так просто записать?

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

Отредактировано RDW (2017-06-21 11:56:22)

0

334

Ну так я и делаю:
- DMA выплёвывает с адреса 35 бай в регистр SPI, каждый байт стартует после передачи 1 байта SPI, по окончанию вызывается прерывание
- Прерывание конца передачи DMA меняет адрес в регистре DMA
- Опять стартует и выводит это.
Аппаратная только развёртка и вывод линии видео данных.

Не могу организовать запись в память и последующий вывод. Вроде как в Bascom массив можно до 255, а мне надо 200 раз по 40 байт (максимум).
По сути дела каждые две строки один и тот-же массив.

0

335

Ой...оёёёёййй как мне стыдно  :shine:

Код:
Dim V1(dlina) As Byte
Dim V2(dlina) As Byte
Dim V3(dlina) As Byte
Dim V4(dlina) As Byte
Dim V5(dlina) As Byte
Dim V6(dlina) As Byte
Dim V7(dlina) As Byte
Dim V8(dlina) As Byte
Dim V9(dlina) As Byte
Dim V10(dlina) As Byte

Dim V11(dlina) As Byte
Dim V12(dlina) As Byte
Dim V13(dlina) As Byte
Dim V14(dlina) As Byte
Dim V15(dlina) As Byte
Dim V16(dlina) As Byte
Dim V17(dlina) As Byte
Dim V18(dlina) As Byte
Dim V19(dlina) As Byte
Dim V20(dlina) As Byte

Dim V21(dlina) As Byte
Dim V22(dlina) As Byte
Dim V23(dlina) As Byte
Dim V24(dlina) As Byte
Dim V25(dlina) As Byte
Dim V26(dlina) As Byte
Dim V27(dlina) As Byte
Dim V28(dlina) As Byte
Dim V29(dlina) As Byte
Dim V30(dlina) As Byte

Dim V31(dlina) As Byte
Dim V32(dlina) As Byte
Dim V33(dlina) As Byte
Dim V34(dlina) As Byte
Dim V35(dlina) As Byte
Dim V36(dlina) As Byte
Dim V37(dlina) As Byte
Dim V38(dlina) As Byte
Dim V39(dlina) As Byte
Dim V40(dlina) As Byte

Dim V41(dlina) As Byte
Dim V42(dlina) As Byte
Dim V43(dlina) As Byte
Dim V44(dlina) As Byte
Dim V45(dlina) As Byte
Dim V46(dlina) As Byte
Dim V47(dlina) As Byte
Dim V48(dlina) As Byte
Dim V49(dlina) As Byte
Dim V50(dlina) As Byte

Dim V51(dlina) As Byte
Dim V52(dlina) As Byte
Dim V53(dlina) As Byte
Dim V54(dlina) As Byte
Dim V55(dlina) As Byte
Dim V56(dlina) As Byte
Dim V57(dlina) As Byte
Dim V58(dlina) As Byte
Dim V59(dlina) As Byte
Dim V60(dlina) As Byte

Dim V61(dlina) As Byte
Dim V62(dlina) As Byte
Dim V63(dlina) As Byte
Dim V64(dlina) As Byte
Dim V65(dlina) As Byte
Dim V66(dlina) As Byte
Dim V67(dlina) As Byte
Dim V68(dlina) As Byte
Dim V69(dlina) As Byte
Dim V70(dlina) As Byte

Dim V71(dlina) As Byte
Dim V72(dlina) As Byte
Dim V73(dlina) As Byte
Dim V74(dlina) As Byte
Dim V75(dlina) As Byte
Dim V76(dlina) As Byte
Dim V77(dlina) As Byte
Dim V78(dlina) As Byte
Dim V79(dlina) As Byte
Dim V80(dlina) As Byte

Dim V81(dlina) As Byte
Dim V82(dlina) As Byte
Dim V83(dlina) As Byte
Dim V84(dlina) As Byte
Dim V85(dlina) As Byte
Dim V86(dlina) As Byte
Dim V87(dlina) As Byte
Dim V88(dlina) As Byte
Dim V89(dlina) As Byte
Dim V90(dlina) As Byte

Dim V91(dlina) As Byte
Dim V92(dlina) As Byte
Dim V93(dlina) As Byte
Dim V94(dlina) As Byte
Dim V95(dlina) As Byte
Dim V96(dlina) As Byte
Dim V97(dlina) As Byte
Dim V98(dlina) As Byte
Dim V99(dlina) As Byte
Dim V100(dlina) As Byte

0

336

Нет, там массивы точно не по 255, ибо я раньше так буфер для экрана делал в 1024 байт.
И вообще, там же был режим ДМА, когда адрес вроде не "обнуляется" после отправки, а останавливается на последней позиции - так и дальше передавать можно.

Ща главное научится выводить картинку, а там будет ясно как ей обновлять (в памяти).

Отредактировано RDW (2017-06-21 13:50:13)

0

337

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

...
И вообще, там же был режим ДМА, когда адрес вроде не "обнуляется" после отправки, а останавливается на последней позиции - так и дальше передавать можно.
...

Да вот тут-то и проблема. DMA запускается и тактирует смену адреса (INC) по завершению передачи SPI. После отправки именно строки, канал останавливается.
Самому останавливать канал в принципе реально, счётчик байтов 16 битный.
Вот только как делать паузу в передаче не знаю, её надо очень точно делать, один так и картинка не картинка.

0

338

Я тебе уже свою идею ранее описывал, ещё раз попробую донести. Можно схитрить (имхо). Тупо выплёвываешь ВЕСЬ объём данных в SPI (естественно со всеми синхроимпульсами), т.е. весь объём памяти нужный для отрисовки. А вот всякие там паузы межкадровые и бордюры, ты можешь сразу нарисовать в памяти "нулями". Всё. Мой первый пример вывода так и работал, а синхронизация там сбивалась по другой причине...

0

339

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

... Тупо выплёвываешь ВЕСЬ объём данных в SPI (естественно со всеми синхроимпульсами), т.е. весь объём памяти нужный для отрисовки. ...

Это хорошо, когда память резиновая, но у меня крайне нищебродный вариант  :D
DMA нормально останавливать и продолжать не получается, если длинный массив заработает, то есть шанс адресацию править.
Надеюсь так прокатит:
p=10
Адрес = Varptr(video(p))

0

340

в DMA 16 битный счетчик адреса, памяти для монохрома должно хватить с лихвой (640 х 480 / 8 = 38400 или 800 х 600 / 8 = 60000)

Отредактировано RDW (2017-06-21 14:35:25)

0

341

В принципе удалось вывести данные, правда разрешением 340х230 при 45мгц контроллера.
Памяти сожрало не мало - 7900 байт. Развёртка 640х480

Свернутая картинка

http://s9.uploads.ru/t/i8UgR.jpg

Теперь надо как-то реализовать очень быстрое общение между контроллерами, вот тут то и загвоздка, это не получалось при 640х480.

0

342

Как так? 340х230 должно было отлопать 9775 байт  %-)

0

343

Ой...да... чего-то тупанул, 34 байта на 230 линий )))))
Я тут оставлю рабочий код, выводящий букву "Ж" на экране:

Код
Код:
$regfile = "xm256a3def.dat"
$crystal = 45000000
$hwstack = 24
$swstack = 24
$framesize = 24


$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 = 9 , Plldiv2 = Disabled
Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled



'настрйока выходов таймера
Hsyn Alias Portd.5
Vsyn Alias Portd.0
Config Hsyn = Output
Config Vsyn = Output

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


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

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


'Настрйока USART
Config Com3 = 10000000 , Mode = Spi , Databits = 8
'Config Com4 = 0 , Mode = Spi , Databits = 8

'Настройка канала событий на срабатывания переполнения таймера горизонтальной синхронизации.
Evsys_ch0mux = &B1101_1000                                  'Настраиваем канал событий №0 на переполение таймера TCD1


'кол-во байт в одной строке
'Const Pixel = 4

Dim Li As Byte
Dim Stroka As Byte
Dim Adrs As Word
Const Dlina = 34

'переменные текста
Dim S1 As Word
Dim S2 As Word
'Dim X As Byte
'Dim Y As Byte
'Dim Yy As Byte

'Dim B As Byte
'Dim Hiy As Bit
'Dim Nalozhenie As Bit
'Dim Lin As Byte
Dim M1 As Word
Dim M2 As Byte
Dim L As Byte
Dim Adres As Word




Const Ram = 7860
Dim V(ram) As Byte







For Adrs = 1 To Ram
'V(adrs) = Adrs                                              'Rnd(255)
V(adrs) = 255
Next Adrs
L = Asc( "Ж")
Gosub Text:
'DMA шаманство

Config Dma = Enabled , Doublebuf = Disabled , Cpm = Rr
Config Dmach0 = Disabled , Burstlen = 1 , Chanrpt = Disabled , Ctr = Disabled , Singleshot = Enabled , Tci = Lo , Eil = Off , Sar = Transaction , Sam = Inc , Dar = None , Dam = Fixed , Trigger = &H6C , Btc = Dlina , Repeat = 0 , Sadr = Varptr(v(1)) , Dadr = Varptr(usartd0_data)
'Start Dmach0
'Dma_ch0_ctrla.7 = 1
'настройка таймера горизонтальной синхронизации частота развёртки, всё взаимосвязано

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


'настройка тайймера вертикальной синхронизации для подсчёта строк по событию 1 и вывода синхроимпульса
Tcd0_cca = 525                                              'длина кадрового импульса
Tcd0_ccb = 36                                               'граница начала рисования
Tcd0_ccc = Tcd0_ccb + 460                                   'граница конца рисования
Tcd0_per = 525                                              'конец всего кадра целиком
Config Tcd0 = Pwm , Prescale = E0 , Event_source = E0 , Comparea = Enabled       'на подсчёт таймера


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

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


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

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



On Dma_ch0 Linedma
Enable Dma_ch0                                              ', Lo


Goto Prog:
Text:
L = L + 32
   S1 = L - 32
   S1 = S1 * 12
   S2 = S1 + 12

   Adres = 1000
   For M1 = S1 To S2
      L = Lookup(m1 , Fonts)
      V(adres) = L
      Adres = Adres + Dlina
   Next M1
Return




Prog:
Do

Loop

'обновление данных в строке



Hsyncdata:
Dma_ch0_ctrla.7 = 1
Enable Dma_ch0                                              ', Lo
Return

Linedma:
Disable Dma_ch0

Incr Stroka
If Stroka = 2 Then
   Incr Li
   Stroka = 0
   Adrs = Li * Dlina
   Adrs = Adrs + Varptr(v(1))
   Dma_ch0_srcaddr = Adrs
End If
Return

'разрешает вывод данных
Dmaen:
   Li = 0 : Stroka = 0
   Enable Tcd1_cca , Hi
   Disable Tcf0_cca
Return

'Не разрешает вывод данных
Dmads:

   Usartd0_data = 255
   Disable Tcd1_cca
   'Dma_ch0_ctrla.7 = 0
   'Dma_ch0_trfcnt = Dlina
Return




Fonts:
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11101111                                             '
Data &B11101111                                             '
Data &B11101111                                             '
Data &B11101111                                             '
Data &B11101111                                             '
Data &B11101111                                             '
Data &B11101111                                             '
Data &B11111111                                             '
Data &B11101111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11010111                                             '
Data &B11010111                                             '
Data &B11010111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
Data &B11111111                                             '
.....не лезет в форум.......

0

344

в теории, на 15000 можно сделать 400х300 картинку (пропорции ТВ) и 1КБ на всякие там внутренние плюшки, а вот про буфер можно забыть

0

345

У меня фактическое разрешение VGA 640x480, оно в принципе так и выводится, только точки удвоены для экономии ресурсов МК.
Знакогенератор работает отлично, теперь нет проблем с дрожанием, по сути дела можно даже осциллограф простой замутить на 1 контроллере.
Если придумать интерфейс, то получим ЖК экран разрешением 34 символа на 19 строк или 272х228 точек = 7752 байта
В Xmega256A3-AU всего 8кб.
Собственно остаётся только придумать как-то блин стабильную и быструю передачу данных и желательно без многодрыга, во!

0

346

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

В Xmega256A3-AU всего 8кб

Странно, в датащите написано 16К.

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

стабильную и быструю передачу данных и желательно без многодрыга

Думаю тут с этим будут большие проблемы, т.к. МК работает на макс использование. Пути два:

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

0

347

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

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

Ну не, есть время разгуляться после транзакции DMA (боковой бордюр), вроде как успеваю подготовить адрес который второй раз подготавливать не надо.
Так-же есть довольно много времени в нижнем бордюре, где из 512 строк рисуются 456 (228 с видео данными, дублируются).
Тут даже можно АЦП опросить, вывести в график и ещё музыку проиграть )))) Только памяти не хватит, завтра опробую ещё.
А что за мультипроцессорная штука в Usart? Для рисования пиксела, нужно как-то передать информацию:
-16 бит адрес
-Данные 8 бит
-Операция с данными (это уже отдельными выводами) наложение,удаление
Больше 8кб у меня глюки, МК стопорит.

Отредактировано Ev3658 (2017-06-21 22:43:24)

0

348

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

А что за мультипроцессорная штука в Usart

Не понимаю о чем это ты или ты про это?

0

349

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

Не понимаю о чем это ты или ты про это?

Не совсем то. В контроллере аппаратно реализован 9 бит, который регистрирует приём адреса, в Datasheet на русском нет подробной информации.
Если вдруг можно передать два раза по 8 бит как адрес и 2 раза информацию через пару проводков на скорости 10мгц, будет хороший LCD экран )
Кстати да, походу 16 кБ., только нужно это в конце всех переменных размещать.
Блин, теперь можно делать переносной ЭКГ прибор с VGA выходом, можно много чего сделать, но мне нужен срочно VGA интерфейс, проект в отсутствии VGA интерфейса очень затянулся и надо как-то его сдвинуть.

0

350

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

через пару проводков на скорости 10мгц, будет хороший LCD экран

Для LCD есть: SPI и прочие параллельные интерфейсы.

Не выдержал, всё-таки заказал иксплэйн у чип-дипа, больно интерес твоя тема подогревает. :) А вот с фпга чот подзабил, лень рисовать схему и разводить (выводов до уопы) c учетом прошлых ошибок (хотя детали давно все уже есть).

0

351

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

...Не выдержал, всё-таки заказал иксплэйн у чип-дипа....


Вот рабочий исходник, работает от кварца 5мгц, но можно под любой адаптировать.
Знакогенератор тоже есть, но закоментирован.
Всё что надо, придумать как в ячейку памяти (массив) занести данные.
Аппаратные синхроимпульсы - сами по себе не зависимо от программы
DMA запускается каждую строку, н оадрес меняется каждые две строки
Свободное место (ресурсы) есть в конце каждой строки и в конце видимой части экрана.
Вот, пользуйтесь на здоровье, можно заточить даже под 4-8 кб.ОЗУ

Единственный минус, в массив V(1)= нужно заносить инверсные данные.
Длину байтов в строке и размер памяти массива - есть константы.
http://s0.uploads.ru/t/UFA8m.jpg

Код:
$regfile = "xm256a3def.dat"
$crystal = 45000000
$hwstack = 14
$swstack = 14
$framesize = 14


$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 = 9 , Plldiv2 = Disabled
Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled



'настрйока выходов таймера
Hsyn Alias Portd.5
Vsyn Alias Portd.0
Config Hsyn = Output
Config Vsyn = Output

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


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

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


'Настрйока USART
Config Com3 = 10000000 , Mode = Spi , Databits = 8
'Config Com4 = 0 , Mode = Spi , Databits = 8

'Настройка канала событий на срабатывания переполнения таймера горизонтальной синхронизации.
Evsys_ch0mux = &B1101_1000                                  'Настраиваем канал событий №0 на переполение таймера TCD1

Dim Li As Byte                                              'Номер выводимой линии
Dim Stroka As Byte                                          'Номер строки вывода
Dim Adrs As Word                                            'Адрес для DMA
Const Dlina = 34                                            'длина в байтах в строке

'переменные текста
Dim S1 As Word                                              'для цикла знакогенератора
Dim S2 As Word                                              'для цикла знакогенератора
Dim M1 As Word                                              'для цикла знакогенератора
Dim L As Byte                                               'Символ вывода
Dim Adres As Word                                           'адрес вывода данных в текстовом модуле
Dim Adrsv As Word                                           'адрес ячейки памяти видео данных



Const Ram = 14752
Dim V(ram) As Byte
Adrsv = Varptr(v(1))

'Очистка памяти:
For Adrs = 1 To Ram
V(adrs) = 255                                               'Для проверки V(adrs) = Adrs
Next Adrs

'DMA шаманство
Config Dma = Enabled , Doublebuf = Disabled , Cpm = Rr
Config Dmach0 = Disabled , Burstlen = 1 , Chanrpt = Disabled , Ctr = Disabled , Singleshot = Enabled , Tci = Lo , Eil = Off , Sar = Transaction , Sam = Inc , Dar = None , Dam = Fixed , Trigger = &H6C , Btc = Dlina , Repeat = 0 , Sadr = Varptr(v(1)) , Dadr = Varptr(usartd0_data)

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


'настройка тайймера вертикальной синхронизации для подсчёта строк по событию 1 и вывода синхроимпульса
Tcd0_cca = 525                                              'длина кадрового импульса
Tcd0_ccb = 40                                               'граница начала рисования
Tcd0_ccc = Tcd0_ccb + 479                                   'граница конца рисования
Tcd0_per = 525                                              'конец всего кадра целиком
Config Tcd0 = Pwm , Prescale = E0 , Event_source = E0 , Comparea = Enabled       'на подсчёт таймера


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

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

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

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



On Dma_ch0 Linedma                                          'Прерывание по окончанию вывода строки DMA
Enable Dma_ch0
Goto Prog:

'(
'Подпрограмма вывода теста
Text:
   S1 = L - 32
   S1 = S1 * 12
   S2 = S1 + 12
   Adres =                                                  'позиция в памяти для рисования
   For M1 = S1 To S2
      L = Lookup(m1 , Fonts)
      V(adres) = L
      Adres = Adres + Dlina
   Next M1
Return
')


Prog:
Do

Loop
End

'Старт DMA строки
Hsyncdata:
Dma_ch0_ctrla.7 = 1                                         'Запуск DMA транзакции
Enable Dma_ch0                                              'разрешение прерывания по окончанию передачи DMA
Return

'Прерывание по окончания транзакции DMA канала, подготавливает адрес в каждую вторую строку и чего нибудь делает ещё
Linedma:
Disable Dma_ch0                                             'Обязательный запрет повтора прерывания
Incr Stroka                                                 'Для подсчёта строки
If Stroka = 2 Then                                          'каждую вторую строку подготавливаем новый адрес
   Stroka = 0
   Adrs = Li * Dlina                                        'Сдвигаем адрес на вторую строку
   Adrs = Adrs + Adrsv                                      'прибавляем начальный адрес памяти массива
   Dma_ch0_srcaddr = Adrs                                   'заносим адрес в регистр DMA
   Incr Li                                                  'прибавляем строку
   Else
   nop                                                      'тут можем чего нибудь делать ещё
End If
Return


'разрешает вывод строк
Dmaen:
   Li = 0                                                   'сбрасываем линии
   Enable Tcd1_cca , Hi                                     'разрешаем прерывание запускающее DMA
Return


'Не разрешает вывод строк
Dmads:
   Disable Tcd1_cca
'   Usartd0_data = 255                                         'очищаем буфер
Return


Проще некуда  :idea:

+2

352

Ну вот, работа того, что постом выше:

0

353

Вот это зачОтное ДЕМО! И моник у тебя классный.

0

354

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

И моник у тебя классный.

На большом красивей всё:
http://sd.uploads.ru/t/uCAlV.jpg
Всё равно есть помехи.
Пробовал точки рисовать и линии, получается, но без Declare Sub, есть всё-же проблемы адреса в памяти, чего-то на неё влияет, а чего не знаю.

0

355

Чот черный у тебя не черный (фон). Помехи могут быть из-за "соплей" (вч всё-таки) или там другого характера помехи?

0

356

Послюнявиться: http://www.hobbytronics.co.uk/serial-vga
Там ниже есть информация реализации.

0

357

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

Чот черный у тебя не черный (фон).....?

Фотоаппарат на помойку просится  :dontknow:

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

Послюнявиться: http://www.hobbytronics.co.uk/serial-vga
....

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

0

358

Для рисования точки:

Код:
Sub Point(byval Xx As Word , Byval Yy As Byte)
Adres = Yy * Dlina
Vr2 = Xx / 8
Adres = Adres + Vr2
B = Xx Mod 8
B = 7 - B
V(adres).b = D
End Sub

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

0

359

Этот участок

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

Vr2 = Xx / 8

можно заменить на сдвиг вправо на 3. А этот участок

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

B = Xx Mod 8

На этот

Код:
B = Xx And 7

+2

360

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

Этот участок

можно заменить на сдвиг вправо на 3. А этот участок ....

Спасибо! Порой забываешь о таких нюансах ))))
Есть всё-же проблема, как-то память всё равно подглючивает, даже снижение скорости не улучшило, но всё-же вот так вот примерно:

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

Код:
Dma_ch0_ctrla.7 = 1                                        
nop
nop
nop
nop
nop
nop
nop


Есть наработки как вывести осциллограмму?

0


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