BALDA 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба Предлагаете и в приёмнике и в передатчике использовать DMA? А сколько тактов необходимо для передачи одного байта из увв во внутр. память и наоборот? И как оба процесса синхронизировать? Может я чето не понял у вас есть 10 линий ио для реализации параллельного интерфейса и нужно перекачать 1600 байт за 1 мс так? по схемотехнике: на приемнике: задействуем 1 полный порт для приема передачи 1 пин ввода вывода произвольный (разрешение интерфейса) 1 пин (строб для чтения данных) - если надумали работать через PWM таймера то зарезервировать вывод OC таймера если через евент систем - то любую ножку. --- далее: условимся что приемник будет командовать передатчиком т.е разрешать работу и стробить ---- что делает сигнал строба: по спаду - передатчик готовит данные на выдачу на порт по подъему приемник читает это все дело в буфер можно и наоборот главное четко это для себя определить. ---- в приемнике разрешаем работу ножки вывода строба определяем длительность спада как ОСА определяем длительность подъема как ОСВ задаем вершину счета (переменные PER или TOP) именно по ним коунтер таймера обнуляем ---- длительность периода можно регулировать мне хватило 3 такта длит спада 3 такта подъема итого 6 на период + ещё запас до вершины таймера (TOP) , хотя top может равняться = OCB 31,25 нС * 6 = 187,5 нС/байт *1600 = 300 мкС под ваше условие 1мс - можно спокойно сделать период 10тактов +10тактов = 20*31,25 *1600 = 1000мкС ---- свои тайминги можете крутить как хотите переменными OCA OCB и PER. --- Главное здесь то, что процу нужно обрабатывать только старт,стоп пакета и флаг прерывания дма. зыы: такие опыты я делал когда получил из образцов мега а1 ещё давным давно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 54 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба Может я чето не понял, у вас есть 10 линий ио для реализации параллельного интерфейса и нужно перекачать 1600 байт за 1 мс Только не за 1мс, а за 200мкс, то есть не больше 4 тактов на байт. Сколько тактов надо ДМА у хмеги не знаю, но есть подозрение что не успеет и синхронизацией с точностью до такта могут быть проблемы. А вот процессору, чтобы положить байт из порта в память с инкрементом надо два такта, а чтобы из памяти в порт - три такта. Если ДМА не успевает на передатчике единственная возможность это развернуть цикл 1536 раз LD REG, Y+ OUT PORT, REG LD REG, Y+ OUT PORT, REG ... 3 такта на байт. А на приёмнике тоже самое только IN REG, PORT ST Y+, REG NOP IN REG, PORT ST Y+, REG NOP ... и те же 3 такта на байт. на приёмнике можно флэш можно сэкономить добавив передатчику один NOP чтобы было 4 такта и сделав бесконечный цикл IN REG, PORT ST Y+, REG RJMP -2 4 такта на байт. Выходить из которого придётся по прерыванию либо внешнему от передатчика, либо по таймеру, меняя адрес возврата на стэке. Осталось только синхронизироваться, использовать просто прерывание нельзя, будет джиттер, так как не все инструкции однотактовые. Передатчик должен дёрнуть ногой в 1, подождать несколько NOPов, дернуть обратно в 0, опять подождать определённое количество NOPов и потом уже начинать LD OUT LD OUT. Приёмник должен сначала сделать поллинг ноги от передатчика, потом включить внешнее прерывание от этой же ноги на спад и сделать десяток другой NOPов, тогда в прерывание приёмник уйдёт строго синхронно с передатчиком, можно точно посчитать такты и вставить в передатчике нужное количество NOPов чтобы приёмник сэмплил данные строго через два такта после того как передатчик их выставил. SBIS PORT,PIN RJMP -2 //тут будет джиттер в несколько таков SEI NOP //а вот в прерывание по спаду он уже прыгнет с однотактовых NOPов без джиттера. NOP NOP ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BALDA 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба а кому нужен этот геморой чтоб 1/5 времени проц только и крутил поллинг? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 54 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба а кому нужен этот геморой чтоб 1/5 времени проц только и крутил поллинг? Есть другой способ передать и принять байт за 4 такта? что такое 1/5? поллинг нужен только для синхронизации, да и вообще не нужен, можно и прерывания использовать, главное чтобы было второе внешнее прерывание в которое процессор гарантированно уйдёт с однотактовых инструкций, иначе с точностью до такта не засинхронизоваться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба to _pv - именно так и планирую делать и это единственный вариант похоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BALDA 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба мое мнение вам нужно в корне пересмотреть вашу идею. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба мое мнение вам нужно в корне пересмотреть вашу идею. уточните какую именно идею нужно пересмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BALDA 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба уточните какую именно идею нужно пересмотреть? Нужно в одном изделии передавать с одной xmega на другую каждую миллисекунду 12288 бит = 1536 байт. Чем побыстрее, но не дольше чем за 200 мкс. Оба мк тактируются от общего внешнего генератора 32MHz. Свободных ног у каждого по 10 шт. есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба Это задача а не идея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BALDA 0 29 марта, 2016 Опубликовано 29 марта, 2016 · Жалоба ну остается только пожелать вам удачи в реализации этой задачи на AVR8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться