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

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

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

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


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


ТВ выход на bascom avr

Сообщений 151 страница 180 из 422

151

Супер! Я с "Compare" не разбирался.

Только лутом ещё рано пахнуть, надо разобраться с данными, хотя выводов памяти и МК - туча, на соплях просто так не повесить, а на макетке устать паять...

0

152

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

Супер! Я с "Compare" не разбирался.

Только лутом ещё рано пахнуть, надо разобраться с данными, хотя выводов памяти и МК - туча, на соплях просто так не повесить, а на макетке устать паять...

С Compare есть ньюансы. В Xmega почти каждый порт имеет два таймера, у первого вообще 4ре, у остальных по два. На 1 полноценный порт по два таймера. Чтоб заставить выходы OCxA и OCxB работать, надо таймер в PWM  режиме запускать и пины порта на выход сделать, потом в таймере указать, что CompareA=enabled и так-же с CompareB.
Так-же есть режим таймера, когда он по "А" включает, а по "В" отключает, вообщем если вникнуть, то проще чем в Atmega серии.
Теперь нужно выделить контроллеру область памяти, из которой DMA будет скидывать данные. Запуск данных инициировать по переполнении таймера, пока тот выводит, программа может менять адреса и считывать память. Вроде как всё должно работать, правда вот как успеть бы ещё записать в неё при этом.
Каналы событий это шедевр, жаль, что их мало  :rolleyes: , такая штука удобная, всё без прерываний и использования ЦП.

0

153

Вот досада, не как с этим DMA не получается нормально реализовать. Почему-то DMA выкладывает биты в регистр USART друг на друга, причём даже если инициатором включения указывать событие в DMA конца передачи USART.
Пробовал 80 байт сразу, инициируя событием по таймеру, то-есть после синхросигнала, чтоб раз и 80 байт вылетело, но всё как-то не так.
Реалтековский LCD проглотил программную синхронизацию развёртки на ура.
Всё прелопатил. Если заставить DMA выкладывать аккуратно в USART данные и запускаться от таймера, то вывод одной строки будет аппаратным, памяти должно хватить на 4ре строки, ну а программно уже надо будет просто успеть забить массивы данными из внешней памяти.
http://s8.uploads.ru/t/HRUgn.jpg

0

154

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

Если заставить DMA выкладывать аккуратно в USART данные и запускаться от таймера, то вывод одной строки будет аппаратным, памяти должно хватить на 4ре строки, ну а программно уже надо будет просто успеть забить массивы данными из внешней памяти.

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

0

155

У тебя нечто подобное на мой экран вышло.)
Кстати, вчера залез в экплен атмеловский, поглазеть на контроллер памяти внешней (EBI), пооблизовался, потом открыл хелп баскома, залез в раздел XRAM, там есть пример, при помощи DMA данные из внутренней и внешней памяти перекидывать - это сильно обнадеживает, можно из внешки кидать данные сразу в порт, а это уже другие объёмы получатся + без сброса адресации, а продолжении счета вперёд, получится аппаратный вывод видео данных из части SRAM/SDRAM.
Кстати говоря, работа с статической памятью значительно проще, там понятнее механика и меньше контактных подключений (ну и работать это всё по идеи быстрее будет, т.к. не нужно тратить такты МК на всякие внутренние процессы с рефрешем).
В общем ща делема, купить полноценный А1 и плату макетную под него заделать, купить готовый в сборе на плате с неким обвесом или всё-таки продолжить приключения с FPGA, чтобы получился полноценный VGA-контроллер для слабых МК (слабых по количествам портов).

0

156

А вот такая штука не прокатит? UM70с171

0

157

Что это?
Поисковики никакую информацию не выдают.
На али нет.
На ебай есть, цена около 500 руб.
Кот в мешке.

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

0

158

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

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

$hwstack = 64
$swstack = 32
$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


'отладочная индикация
Led Alias Portd.7
Config Led = Output

'переменные

Dim Lin1(80) As Byte
Dim Lin2(80) As Byte

Dim P As Byte                                               'для цикла
Dim L As Byte                                               'для бита
Dim D As Word                                               'для больших чисел
Dim B As Byte                                               'для малых чисел




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

'для опустошения буфера USART в конце передачи
Lin1(pixel) = 255
Lin2(pixel) = 255

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

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


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

Tv Alias Portd.3
Config Tv = Output
Portd_pin3ctrl = &B01000000


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


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


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

'прерывания по таймерам
Enable Interrupts
On Tcd1_cca Hsync                                           'Nosave                                    'вывод данных и обновление массива
Enable Tcd1_cca


'настройка тайймера вертикальной синхронизации для подсчёта строк по событию 1 и вывода синхроимпульса
Tcd0_cca = 1
'Tcd0_ccb = 3
Tcd0_per = 525                                              'кол-во линий
Config Tcd0 = Wgmode , Wgmode = Pwm , Prescale = &B1000 , Event_source = &B1000 , Comparea = Enabled       'на подсчёт таймера

'настройка таймера горизонтальной синхронизации
Tcd1_cca = 14                                               'конец гориз.сигнала и вызов прерывания вывода информации
'Tcd1_ccb = 1                                               '
Tcd1_per = 70                                               'частота развёртки, всё взаимосвязано
Config Tcd1 = Wgmode , Wgmode = Pwm_top , Prescale = 8 , Event_action = Restart , Comparea = Enabled       ', Compareb = Enabled

'программа
Do
   Led = Not Led
   Wait 1
Loop




'обработка строки
Hsync:
   If D < 480 Then
        L = Not L
         Dma_ch0_ctrla.7 = L.0
         Dma_ch1_ctrla.7 = L.7
        'забиваем данные, в каждую строку младьший байт номера строки из таймера вертикальнйо синхронизации
         If L.0 = 0 Then
            For P = 1 To Pixel
               Lin1(p) = B
               Next P
          Else
            For P = 1 To Pixel
               Lin2(p) = B
               Next P
         End If
      Else
      L = 127
      Usartd0_data = 255
      Dma_ch0_ctrla.7 = 0
      Dma_ch1_ctrla.7 = 0
   End If

   B = Low(d)
   D = Tcd0_cnt
Return

0

159

Так у тебя и будет месево, ты практически одновременно из двух потоков, в один порт данные пихаешь.)
Что ты хотел получить - непонятно.

0

160

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

Так у тебя и будет месево, ты практически одновременно из двух потоков, в один порт данные пихаешь.)
Что ты хотел получить - непонятно.

Пытался одну строку с одного запуска DMA вывести из массива, а вторую строку другим каналом DMA и так по очереди. А пока выводит один, подготавливаю данные для другого.
Таймеры работают сами по себе, вертикальную синхронизацию трогать смысла нет, так как она полностью зависит от горизонтальной, мониторам это нравится )))
Вроде как есть буфер отправки у UART, но в документации не понял, где и как он работает.
Сами DMA запускаются по событию CompareA таймера горизонтальной синхронизации.

0

161

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

Что это?
Поисковики никакую информацию не выдают.

Описание
Ссылка

0

162

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

Описание
Ссылка

Спасибо, сегодня тоже нашел доку. ;) Это не то. Это какой-то палитро генератор на 256 значений/ячеек (6-бит на цвет). Т.е. теоретически можно приспособить для вывода разрешения 256 пикселей, но нам-то надо в 2 раза больше. Т.е. ставить нужно пару и как-то их синхрить/клеить по горизонтали.

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

Пытался одну строку с одного запуска DMA вывести из массива, а вторую строку другим каналом DMA и так по очереди. А пока выводит один, подготавливаю данные для другого.

Слушай, включи воображение уже: тут физика простая, пока МК (сам процессор) не сможет успевать перебрасывать данные в буфер для DMA (подготавливать), нет никакой разницы, сколько их там тебе понадобится (количество DMA), тебе кажется, что повесив хоть 3 DMA ты решишь проблему. По существу, ты просто оттягиваешь неизбежное, а неизбежное то, что МК не успевает, а когда он начнет успевать, то вся производительность будет уходить на это, ибо проволочки/задержки - недопустимы. При таком раскладе, непонятно сколько времени останется на остальную работу (другие задачи).
DMA открывает совершенно другие возможности, в разы превышающие скорости МК.
Тут выход только один, как-то аппаратно всё настроить, чтобы МК был свободен и только изредко в что-то вмешивался. По этому не зря все разрешения в инете (в проектах) маленькие.

В общем я тут кое-что затеял, есть две идеи, но к сожалению они обе не очень простые...
По времени не знаю как получится, ибо жду когда заказы приедут, а тут НГ коллапс случился уже как 2 месяца назад и всё встало.) Вяло что-то приходит, но то, что нужно - нет. :(

0

163

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

......

Я пытаюсь реализовать 640х480
Судя по Datasheet, DMA канал может запускаться аппаратно, но не могу понять как, явно связано с Repead и Singleshot.
DMA использует шину данных процессора. То-есть работать в момент активной передачи не получится, хотя если DMA синхронизированна с передачей данных с Usart и настроен на занятие шины на 1 байт, то должно хватить времени на смену адреса.

Рисуем 480 линий из 525. Сейчас пытаюсь ограничение рисования 480 линий сделать аппаратным, а это уже минус кучи тактов сравнения 16 битных регистров.
От 480 до 525 линии нет транзакций DMA, тут можно использовать на приём данных (запись в память), все данные принимать за 1 раз смысла нет, можно за много раз.

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

Код:
 
        D = Tcd0_cnt
        B = Low(d)                                         
         For P = 1 To 20
               Lin1(p) = B
         Next P

Даже если будет внешняя память, шина данных одна  :smoke:

0

164

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

DMA использует шину данных процессора. То-есть работать в момент активной передачи не получится

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

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

DMA канал может запускаться аппаратно

Вот что я сумел найти, через события.
Назначаешь триггер DMA на событие, а на само событие вешаешь таймер:

Код:
EVSYS.CH0MUX = EVSYS_CHMUX_TCC1_OVF_gc; // триггер на таймер при переполнении

+1

165

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

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

Вот что я сумел найти, через события.
Назначаешь триггер DMA на событие, а на само событие вешаешь таймер:

Так я его и запустил по событию Compare A таймера горизонтальной синхронизации. Просто надо, чтоб он нужное кол-во бит выкинул в строку и ждал следующего запуска.
Не могу понять, как работают прерывания CCA и CCB у Pwm таймеров. CCB не хочет срабатывать, а так бы вообще красота была бы, если таймер счётчик вертикальной синхронизации вызывал по CompareA перерывание включающее DMA и прерывание по  CompareB (480) отключающее DMA.

0

166

Как назло в телефоне камера снимает только с близи, картридер завис с флешкой и фотоаппарат под рукой с изломанным USB входом, так уж фото с телефона:
http://s9.uploads.ru/t/QlAUw.jpg

DMA запускается по событиям CompareA строчного таймера. Пришлось использовать три таймера, два из них работают на одном событии, событие генерирует стройчный таймер.
Частоту кадров регулировать не надо, всё идёт от частоты строчки.
Не понимаю, почему всего 6 столбцов выведено, должно быть 12ть.
Выходы синхронизации идут из таймеров.

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

$hwstack = 64
$swstack = 32
$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


'отладочная индикация
Led Alias Portd.7
Config Led = Output

'переменные

Dim Lin1(200) As Byte
'Dim Lin2(80) As Byte

Dim P As Byte                                               'для цикла
Dim L As Bit                                                'для бита
Dim D As Word                                               'для больших чисел
Dim B As Byte                                               'для малых чисел




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

'для опустошения буфера USART в конце передачи
Lin1(pixel) = 255
'Lin2(pixel) = 255

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

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


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

Tv Alias Portd.3
Config Tv = Output
Portd_pin3ctrl = &B01000000


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


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

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




'настройка тайймера вертикальной синхронизации для подсчёта строк по событию 1 и вывода синхроимпульса
Config Tcd0 = Wgmode , Wgmode = Pwm , Prescale = E0 , Event_source = E0 , Comparea = Enabled       ', Compareb = Enabled      'на подсчёт таймера
Tcd0_cca = 1
Tcd0_ccb = 440                                              '                                              'ограничение рисования
Tcd0_per = 525                                              'конец всего кадра целиком
'таймер паузы запуска рисования кадра                                              'кол-во линий
Config Tcc0 = Wgmode , Wgmode = Pwm , Prescale = E0 , Event_source = E0       ', Event_action = Restart       ', Comparea = Enabled       ', Compareb = Enabled      'на подсчёт таймера
Tcc0_cca = 40                                               'отступ от верха экрана
Tcc0_per = Tcd0_per

'настройка таймера горизонтальной синхронизации
                                             'частота развёртки, всё взаимосвязано
Config Tcd1 = Wgmode , Wgmode = Pwm , Prescale = 8 , Event_action = Restart , Comparea = Enabled , Event_delay = Enabled 'конец гориз.сигнала и вызов прерывания вывода информации
Tcd1_cca = 21                                               'начало рисования строки и кадра
Tcd1_per = 133                                              'частота развёртки и видео сигнала в целом

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

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

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

'прерывание начала всего кадра
On Tcc0_cca Dmaen Nosave                                    'вывод данных и обновление массива
Enable Tcc0_cca

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

'программа
Do
   Led = Not Led                                            'если не моргает, значит всё в прерываниях
   Wait 1
Loop


'обработка строки
Hsync2:
Waitus 1                                                    'нужна задержка, чтоб не залезть на адрес, который передаётся DMA
'заношу данные в масиив, больше уже хуже
 D = Tcd0_cnt
        B = Low(d)                                          'L = Not L
         For P = 1 To 12
               Lin1(p) = B
         Next P
Return

'включает DMA
Dmaen:
Enable Tcd1_ovf
Dma_ch0_ctrla.7 = 1
Return

'отключает DMA
Dmads:

Dma_ch0_ctrla.7 = 0                                         'вывод данных и обновление массива
Disable Tcd1_ovf
Return

0

167

Попробуй код:

Код:
 D = Tcd0_cnt
        B = Low(d)                                          'L = Not L
         For P = 1 To 12
               Lin1(p) = B
         Next P

Заменить на упрощенку:

Код:
 
'        B = Tcd0_cntL
         For P = 1 To 12
               Lin1(p) =  Tcd0_cntL  'B
         Next P

Небольшая оптимизация, если напрямую Tcd0_cntL нельзя в массив адресовать (будет ругаться компиль), то раскомментируй соответствующие строчки/подредактируй.

Почему pixel у тебя 40? 40*8=320 всего лишь)

На счет почему 6, а не 12? Возможно выполнение команд МК в разы тормознее DMA вывода, неизвестно, надо пробовать. У тебя синхронизация не срывается? Стоит всё жестко? А то судя по настройкам, все хар-ки какие-то сомнительные, может несколько кадров накладывается в один или растягивается...

Отредактировано RDW (2016-12-15 17:54:44)

0

168

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

.....

Почему pixel у тебя 40? 40*8=320 всего лишь)

На счет почему 6, а не 12? Возможно выполнение команд МК в разы тормознее DMA вывода, неизвестно, надо пробовать. У тебя синхронизация не срывается? Стоит всё жестко? А то судя по настройкам, все хар-ки какие-то сомнительные, может несколько кадров накладывается в один или растягивается...

Отредактировано RDW (Сегодня 17:54:44)


Удалось сделать на 2х таймерах. Почему-то глюки страшные с CompareB, не может DMA от него запускаться (постоянно запущен), да и прерывания по Compare B глючно срабатывают.
Перевесил строчную развёртку на CompareB и стало хорошо.
Строчки не срываются, их можно настроить всего одним таймером (второй уже считает и генерирует кадровый импульс). DMA запускается когда надо, с задержкой после горизонтального импульса. (переделал)
Бит ENABLE DMA включаю заранее, чуть позже DMA включается по синхронизации.

Чисто теоретически, DMA канал должен передать нужное кол-во байт 1 байтовыми пакетами (занимает шину процессора на 1 пакет из памяти) - нужное кол-во раз, но больше 40ка не получается, да и в начале теряются 2-3 байта.
Ах да, я же на 32 мегагерцах остался, по этому не 80 байт, а 40байт. 2 точки на пиксель получается, хотя как-то мониторам не очень, но что Реалтек, что Ацер, всё воспринимает одинаково.

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

Отредактировано Ev3658 (2016-12-15 19:09:45)

0

169

Ну вот, уже упрощается. Проблема остаётся только одна! DMA слишком быстро отсылает информацию. На экране выводится только половина, то-есть каждый второй байт теряется. Если устранить эту проблему, то получится неплохой графический инструмент! 320х480 точек и 40 символов - 60 строк. Если разогнать МК, то 640х480 в лёгкую, больше и не надо.
На Acer
http://s9.uploads.ru/t/auD2X.jpg
На китайском LCD с реалтеком:
http://s3.uploads.ru/t/cSlh8.jpg

На картинке выводится 40 байт, но на деле видно половину.

Прилагаю код программы с комментариями:

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

$hwstack = 64
$swstack = 32
$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


'отладочная индикация
Led Alias Portd.7
Config Led = Output

'переменные

Dim Lin1(80) As Byte                                        'данные строки


Dim P As Byte                                               'для цикла
Dim B As Byte                                               'для малых чисел



'для опустошения буфера USART в конце передачи
Lin1(80) = 254
'Lin2(pixel) = 255

'настрйока выходов таймера
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


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


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


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

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




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

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

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

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

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

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

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

'программа
'Do
   'Led = Not Led                                            'если не моргает, значит всё в прерываниях
   'Wait 1
'Loop


'обновление данных в строке
Hsyncdata:
'заношу данные в масиив, больше уже хуже
        B = Tcd0_cnt                                        'L = Not L
               P = 0
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B

               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B

               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B

               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
               Incr P : Lin1(p) = B
Return

'включает DMA (по началу кадра и в начале каждой видимой строке)
Dmaen:
Enable Tcd1_ovf
Dma_ch0_ctrla.7 = 1
Return

'отключает DMA
Dmads:
Disable Tcd1_ovf
Return

Отредактировано Ev3658 (2016-12-16 12:50:12)

0

170

Кто тебе мешает уменьшить скорость передачи DMA? Просто настройки порта на отправку меняешь и всё. Поиграйся скоростью.

0

171

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

Кто тебе мешает уменьшить скорость передачи DMA? Просто настройки порта на отправку меняешь и всё. Поиграйся скоростью.

Это как?
Дело в том, что у меня DMA запускается в начале строки и все данные отсылает до конца строки, то-есть DMA должен отсылать всю строку иначе смысла DMA нет  :glasses:
Проверил, без DMA, оказалось при 32х мегагерцах кол-во пустых NOP между отправкой существенно:

Код:
   Usartd0_data = B
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            nop
            Usartd0_data = B

====================================================================================
Удивительно, 54 байта в строке при развёртке 54Гц вывелось без пробелов и DMA вот так (1 строка инвертная для проверки):

http://s1.uploads.ru/t/torFM.jpg

Код:
B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B


             B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B

                        B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B

                        B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B

            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = Not B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B

            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B
            B = Tcd0_cnt
            Usartd0_data = B
            Do
            Loop Until Usartd0_status.6 = 1
            B = Tcd0_cnt
            Usartd0_data = B

Жесть!!! Между выводами оказывается есть куча времени  :D

Получается, DMA нужен только исключительно для работы с памятью.

Отредактировано Ev3658 (2016-12-16 14:58:32)

0

172

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

Это как?

У тебя в коде есть такая строка:

Код:
Config Com3 = 0 , Mode = Spi , Databits = 8

Вот 0 (нуль) в этой строке - скорость. ;) Её можно менять, тем самым, аппаратно ты делаешь задержку на отправку данных. Пиксель при этом должен растягиваться...

+1

173

Охохохо.....  :D

Код:
Config Com3 = 8000000 , Mode = Spi , Databits = 8

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

Вообщем ЛУТом уже точно реально пахнет!!!! Надо вкуривать EBI, в описании нигде не нашел какие шины, порты и т.п. можно использовать для рсширения.
Удалось вывести на китайский LCD аж нестандартное разрешение, при этом Aсer ругается, но под него можно тоже всё подстроить.
690 точек на 480 с лишним.
Выводится всё напрямую, с проверкой опустошения.
В конце вывода запускается DMA и оно начинает активно копировать значение таймера в массив.
Копирует нормально, главное, чтоб при этом процессор не занялся чем нибудь.
http://s9.uploads.ru/t/8zBic.jpg

Код:
$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


'отладочная индикация
Led Alias Portd.7
Config Led = Output

'переменные

Dim Lin(70) As Byte                                         'данные строки

Dim B As Byte

'настрйока выходов таймера
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


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


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


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

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




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

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

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

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

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

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

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

'программа
Do
   Led = Not Led                                            'если не моргает, значит всё в прерываниях
   'Wait 1
Loop


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

nop
nop
nop
nop
nop
nop
nop
nop
nop
If Tcd0_cnt > 3 Then
            Usartd0_data = Lin(1)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(2)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(3)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(4)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(5)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(6)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(7)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(8)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(9)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(10)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(11)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(12)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(13)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(14)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(15)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(16)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(17)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(18)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(1)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(19)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(20)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(21)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(22)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(23)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(24)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(25)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(26)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(27)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(28)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(29)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(30)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(31)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(32)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(33)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(34)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(35)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(36)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(37)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(38)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(39)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(40)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(41)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(42)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(43)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(44)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(45)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(46)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(47)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(48)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(49)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(50)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(51)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(52)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(53)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(54)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(55)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(56)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(57)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(58)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(59)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(60)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(61)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(62)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(63)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(64)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(65)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(66)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(67)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(68)
            Do
            Loop Until Usartd0_status.6 = 1

            Usartd0_data = Lin(69)
            Do
            Loop Until Usartd0_status.6 = 1
End If
Dma_ch0_ctrla.7 = 1
Start Dmach0
Enable Tcd1_cca
Return



'разрешает вывод данных
Dmaen:
Enable Tcd1_cca

Return

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

Return

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

P:S: Чисто теоретически можно использовать несколько SPI памяти, развесить по портам и брать с регистров данные  :idea:

Отредактировано Ev3658 (2016-12-16 17:12:08)

0

174

Супер!

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

Надо вкуривать EBI

Для него нужно А1! Возможно к 20 числу приедет мне эксплейн, не удержался, купил (лень железо делать). А вообще, на сайте атмела всё есть, достаточно скачать разводку эксплейна, чтобы понять куда и что подключать, там же есть описание EBI в Xmega128A1.

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

Удалось вывести на китайский LCD аж нестандартное разрешение

Ой, я вчера на NEC 17-ку ухитрился случайно вывести а-ж 120Гц, от чего он мне вывел сообщение о том, что хар-ки находятся вне пределов, при этом картинку 640х480 отлично выводил.  :D

0

175

Я тут подумал...подумал...и понял, что DMA нужно только для принятия команд LCD дисплея от другого контроллера.
Внешнюю память можно использовать любую, чтоб не париться с многобитным адресом, можно реализовать частично аппаратно.
Берём по максимум:
1 строка = 100 байтам, для выбора ячейки можно INCR порт.
Строк к примеру 600. Чтоб выбрать нужную ячейку памяти, используем ещё 4 бита, которые можно вывести аппаратно  :writing: , а именно с первого таймера порта CompareA,CompareB,CompareC,CompareD.
Получается, перед отправкой достаточно только прибавить 8 битное значение на порту адреса памяти и послать данные с порта в регистр Usart  :rolleyes:
И если хватит производительности, то записываем адрес.
И того для выбора ячейки памяти, используем аппаратное решение таймера, младшие выставляем программно перед отправкой, это просто гениально  :D

0

176

Осталось только подтвердить на практике.  :D

0

177

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

Осталось только подтвердить на практике.

Протеус в голове говорит: "Делай ЛУТ...делай..." ,а лень говорит: "не слушай мозг, собери пауком..."  :D
Раскидываю ЛУТ, но вот беда. Вчера был очень нервный день и походу организм ответил аллергией, а это значит, что надо будет уходить с работы раньше задуманного, так уж надо срочно доделывать проект и эта видео карта должна быть готова в этом месяце.

0

178

Разбаловал ты начальство - это однозначно. :glasses:

0

179

Они мне заявили, что я теперь за слесарей должен работать, в открытую заявили. 5 слесарей не смогли воткнуть два болта, за два дня подтянуть 10ток болтов и даже сварщик заварил всё, что можно и нельзя заварить. Из-за качества таких кадров я обязан работать слесарем.
Сказал, что в начале лета меня не будет, типа ищите замену, но поиск замены возложили на меня, ну где я найду человека, который программирует, разбирается ПК, электронике, электротехнике и ещё гайки на 24 крутить может, двигатель снять, шпонки заменить, шестерёнку на вал одеть и т.п.
Надо успеть до апреля сделать первый прототип, дам им гарантию на электронный блок  :D  Если бы устроился на завод ради денег, то есть места где по лучше заработать можно, надоело это колхозное рукожопное халтурное хамство.

0

180

Слушай, ты человек быстро обучаемый и легко понимаешь весьма сложные вещи (именно понимаешь, разбираешься). Ты можешь пойти учеником или с условием роста в любую фирму (была б такая) и там изучить любое направление, которое интересно тебе.
Потерял столько времени и денег с ними. Можешь конечно сделать им модуль управления станком (даже целый комплекс) и попытаться им его продать с поддержкой (и платой за неё), но судя из того, что ты рассказываешь, они платить не собираются не за что, причем хотят всё в кратчайшие сроки (за которые обычно двойная оплата идёт), я вообще не понимаю, как у них народ работает, причем работой это сложно назвать, больше похоже на рабство... Они монополисты на всю область?
Эти товарищи совсем обнаглели, бежать давно пора от туда.
Я закончить весьма сложно будет, тебе надо время ещё на: железо, код для него, внешнюю взаимосвязь/взаимодействие с компьютером (возможно адаптация под какое-то готовое ПО), отладка всего...в общем там работы непочатый край.

Вот этот контроллер дисплея, очень хорошая тема как: для развития и вообще изучения новых направлений. Это полезно не только тебе, но и мне - за это хочу сказать большое спасибо.) Подтолкнул в ряд новых алгоритмов и направлений (в железе). Надо тему всё-таки довести до логического конца, может из этого ещё что-то путное выйдет. Какая нибудь ера гибрида между дуней и спектрума. :D

Отредактировано RDW (2016-12-18 09:43:32)

0


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