реклама на сайте
подробности

 
 
> Передать блок данных с мк на мк, как лучше реализовать?
zombi
сообщение Mar 22 2016, 14:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Нужно в одном изделии передавать с одной xmega на другую каждую миллисекунду 12288 бит = 1536 байт.
Чем побыстрее, но не дольше чем за 200 мкс.
Оба мк тактируются от общего внешнего генератора 32MHz.
Свободных ног у каждого по 10 шт. есть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
RadiatoR
сообщение Mar 23 2016, 05:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Да что вы заморачиваетесь, если обработка в прерывании устраивает (хотя я бы так не делал) то сделал бы примерно так (помойму в атхмеге есть команда на изменение значения 1 ноги):
1. на приемнике прерывание на управляющей ноге по спаду сигнала
Это код для передатчика, для приемника будет похожий, но с обработкой 1 прерывания и мониторингом состояния активного сигнала.
Код
SendSignal=1;//Устанавливаем активный сигнало о готовности к передаче;
while(ReadyToSend);// Тут ожидаем от 10 ноги сигнала, тчо приемник вошел в прерывание и готов принимать. Можно тут добавить еще пожарный таймер, что бы вышел из цикла если долго ожидает.
for(ushort i=0; i<1536;i++)
{
    SendSignal=1;// Управляющая нога сбрасывается в 1
    Portx=buf[i];
    SendSignal=0;// Устанавливаем сигнал в активное состояние - для мониторинга приемником
}

В принципе если выдерживать эту последовательность то и вставлять nop не придется, т.к. вместо него будут выполняться полезные такты - инкремент счетчика, сброс активного сигнала управления и загрузка регистра с новым значением. Как раз на прием должно хватать. Ну если что можно довести нопами если приемник не будет успевать.
Go to the top of the page
 
+Quote Post
_pv
сообщение Mar 23 2016, 07:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(ЯadiatoR @ Mar 23 2016, 11:21) *
Да что вы заморачиваетесь, если обработка в прерывании устраивает (хотя я бы так не делал) то сделал бы примерно так
for(ushort i=0; i<1536;i++){
SendSignal=1;// Управляющая нога сбрасывается в 1
Portx=buf[i];
SendSignal=0;// Устанавливаем сигнал в активное состояние - для мониторинга приемником
}[/code]

скомпилируйте это и посмотрите что получится, напомню у ТС есть всего 4 такта

я так понимаю без дма можно сделать только
:loop
IN REG, PORT
ST Y+, REG
RJMP loop
NOP
NOP
NOP
NOP

будет как раз четыре такта на цикл, и выходить из этого бесконечного цикла придётся по прерыванию от таймера или от внешнего, исправляя адрес возврата на стэке чтобы на те нопы после цикла выпрыгнуть
Go to the top of the page
 
+Quote Post
501-q
сообщение Mar 23 2016, 08:48
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 24-02-09
Из: Екатеринбург
Пользователь №: 45 296



Цитата(_pv @ Mar 23 2016, 12:49) *
я так понимаю без дма можно сделать только
:loop
IN REG, PORT
ST Y+, REG
RJMP loop
NOP
NOP
NOP
NOP

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


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

Но если памяти хватает, то можно тупо повторить 1536 раз фрагмент:
in reg, PORT_PIN
st Y+, reg
rjmp 1f
1:

Вот так:
.rep 1536
in reg, PORTx_PIN
st Y+, reg
rjmp 1f
1:
.endr

Если устраивает три такта на передачу байта, то rjmp заменить на nop.

Илья

Сообщение отредактировал 501-q - Mar 23 2016, 08:52
Go to the top of the page
 
+Quote Post
_pv
сообщение Mar 23 2016, 09:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(501-q @ Mar 23 2016, 14:48) *
Но если памяти хватает, то можно тупо повторить 1536 раз фрагмент:
in reg, PORT_PIN
st Y+, reg
rjmp 1f
1:

Вот так:
.rep 1536
in reg, PORTx_PIN
st Y+, reg
rjmp 1f
1:
.endr
Если устраивает три такта на передачу байта, то rjmp заменить на nop.


от прерывания по таймеру из цикла придётся выходить на передатчике, на приёмнике можно таймер сэкономить и заканчивать по внешнему прерыванию от передатчика.
и что-то не припомню наличие аппаратных циклов у xmegи, то есть вот этот макрос .rep он не бесплатный, а всё равно развернётся в dec и brne, так что тактов на нормальный цикл там в любом случае не хватит.
а вот ценой нескольких кб флэша цикл можно действительно полностью развернуть, и передать всё за пару тактов на байт или за ~100мкс.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zombi   Передать блок данных с мк на мк   Mar 22 2016, 14:20
- - ЯadiatoR   При 32МГц в 200мкс 6400 тактов. Как раз должно хва...   Mar 22 2016, 14:52
- - zombi   Цитата(ЯadiatoR @ Mar 22 2016, 17:52) Одн...   Mar 22 2016, 15:28
- - ЯadiatoR   Ну вариантов определения первого байта не много - ...   Mar 22 2016, 15:37
|- - zombi   Цитата(ЯadiatoR @ Mar 22 2016, 18:37) (а ...   Mar 22 2016, 15:46
- - _pv   это если они от одного источника тактируются или о...   Mar 22 2016, 16:08
- - Lerk   _pv, Цитата(zombi @ Mar 22 2016, 17:20) О...   Mar 22 2016, 16:20
- - _pv   да, действительно. тогда проблем не должно быть, т...   Mar 22 2016, 17:10
- - 501-q   Цитата(zombi @ Mar 22 2016, 19:20) Нужно ...   Mar 23 2016, 04:21
|- - 501-q   Цитата(_pv @ Mar 23 2016, 14:10) и что-то...   Mar 23 2016, 09:23
- - ЯadiatoR   Ну на деле есть 6400 тактов. Конечно, компилятор р...   Mar 23 2016, 07:59
|- - _pv   Цитата(ЯadiatoR @ Mar 23 2016, 13:59) Ну ...   Mar 23 2016, 09:34
- - ЯadiatoR   Ну флеш то заиспользовать не проблема - а принимат...   Mar 23 2016, 09:18
- - ЯadiatoR   rjmp это хорошо, а кто инкремент будет делать? Или...   Mar 23 2016, 09:44
|- - _pv   Цитата(ЯadiatoR @ Mar 23 2016, 16:44) rjm...   Mar 23 2016, 09:48
|- - 501-q   Цитата(_pv @ Mar 23 2016, 14:48) ST Y+, r...   Mar 23 2016, 10:36
- - ЯadiatoR   сначала написал - потом подумал, жалко удалить ком...   Mar 23 2016, 09:58
- - ILYAUL   ЦитатаНо если памяти хватает, то можно тупо повтор...   Mar 23 2016, 20:36
- - piroman   SPI + DMA и нет проблем.   Mar 24 2016, 11:41
|- - ЯadiatoR   Цитата(piroman @ Mar 24 2016, 14:41) SPI ...   Mar 24 2016, 11:55
- - Kovrov   Для приема: Триггер ДМА завести по прерыванию внеш...   Mar 28 2016, 12:21
|- - zombi   Цитата(Kovrov @ Mar 28 2016, 15:21) Тригг...   Mar 28 2016, 13:51
|- - 501-q   Цитата(zombi @ Mar 28 2016, 18:51) Предла...   Mar 29 2016, 04:12
||- - Kovrov   Цитата(501-q @ Mar 29 2016, 09:12) Ч...   Mar 29 2016, 07:06
|- - Kovrov   Цитата(zombi @ Mar 28 2016, 18:51) Предла...   Mar 29 2016, 07:28
|- - _pv   Цитата(Kovrov @ Mar 29 2016, 13:28) Может...   Mar 29 2016, 09:08
- - Склихасовский   у меня был подобный опыт реализация LVDS на хмега...   Mar 29 2016, 05:27
- - ЯadiatoR   Может тут имелась ввиду не сама сложность, а то, ч...   Mar 29 2016, 07:10
- - Kovrov   а кому нужен этот геморой чтоб 1/5 времени проц то...   Mar 29 2016, 09:16
|- - _pv   Цитата(Kovrov @ Mar 29 2016, 15:16) а ком...   Mar 29 2016, 09:20
- - zombi   to _pv - именно так и планирую делать и это единст...   Mar 29 2016, 09:22
- - Kovrov   мое мнение вам нужно в корне пересмотреть вашу иде...   Mar 29 2016, 09:48
|- - zombi   Цитата(Kovrov @ Mar 29 2016, 12:48) мое м...   Mar 29 2016, 10:26
|- - Kovrov   Цитата(zombi @ Mar 29 2016, 15:26) уточни...   Mar 29 2016, 10:53
|- - zombi   Это задача а не идея.   Mar 29 2016, 11:13
- - Kovrov   ну остается только пожелать вам удачи в реализации...   Mar 29 2016, 11:15


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 01:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016