|
Передать блок данных с мк на мк, как лучше реализовать? |
|
|
|
 |
Ответов
|
Mar 23 2016, 05:21
|

Местный
  
Группа: Свой
Сообщений: 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 не придется, т.к. вместо него будут выполняться полезные такты - инкремент счетчика, сброс активного сигнала управления и загрузка регистра с новым значением. Как раз на прием должно хватать. Ну если что можно довести нопами если приемник не будет успевать.
|
|
|
|
|
Mar 23 2016, 07:49
|
Гуру
     
Группа: Свой
Сообщений: 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 будет как раз четыре такта на цикл, и выходить из этого бесконечного цикла придётся по прерыванию от таймера или от внешнего, исправляя адрес возврата на стэке чтобы на те нопы после цикла выпрыгнуть
|
|
|
|
|
Mar 23 2016, 08:48
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 23 2016, 09:10
|
Гуру
     
Группа: Свой
Сообщений: 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мкс.
|
|
|
|
|
Mar 23 2016, 09:23
|
Участник

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

|
Цитата(_pv @ Mar 23 2016, 14:10)  и что-то не припомню наличие аппаратных циклов у xmegи, то есть вот этот макрос .rep он не бесплатный, а всё равно развернётся в dec и brne, так что тактов на нормальный цикл там в любом случае не хватит. а вот ценой нескольких кб флэша цикл можно действительно полностью развернуть, и передать всё за пару тактов на байт или за ~100мкс. .rep -- это директива ассемблера (в частности, gas), повторяет фрагмент до .endr указанное число раз. И за пару тактов не получится. Передатчик не может тратить меньше трёх тактов на передачу байта. Вот если передатчик ПЛМ'ка какая... то тут возникает вопрос со стабильностью приёма, т.к. входной тракт вывода порта микроконтроллера требует стабильного состояния сигнала в течении двух тактов минимум. Илья
|
|
|
|
Сообщений в этой теме
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 Я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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|