stalknr 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Добрый вечер форумчане!!!! Есть вот такая задачка Необходимо программно реализовать интерфейс типа ARINC-429. Последовательный интерфейс. По 1 проводу идут данные, по 2 проводу - синхросигнал (Частота 1,25 МГЦ). Слово данных состоит из 22 разрядов -> 1...6 - адрес (1-младший бит адреса, 6 - старший бит адреса) + 7...22 - данные (7 - младший, 22 - старший). Помогите реализовать выдачу и прием такого слова микроконтроллером. Желательно на ассемблере. Заранее спасибо. Если нужны уточнения пишите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 11 апреля, 2011 Опубликовано 11 апреля, 2011 (изменено) · Жалоба Необходимо программно реализовать интерфейс типа ARINC-429. Обязательно программно ? Если в МК этот интерфейс не поддерживается аппаратно, то программная реализация вас не спасет. 1.25 МГц - это слишком быстро. МК почти наверняка не справится. Или справится, но ресурсов больше ни на что не хватит. Проще говоря, как ни делай, а все равно выйдет посредственно или (скорее всего) не выйдет вообще. Это типичная задачка для простой CPLD. Какая-нибудь MAX3032 + код на AHDL. За день-другой вполне справитесь ... Изменено 11 апреля, 2011 пользователем kovigor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба А больше не чего реализовывать и не надо. Тупо прочитать слова (порядка 37 шт 22 разрядных слов), записать их в ОЗУ, и в определенный момент выкинуть все уартом в комп. Интервал между пачками (37 слов) 7*1,28 мс И согласитесь говорить что не получиться не сделав даже попытки это как то не спортивно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 11 апреля, 2011 Опубликовано 11 апреля, 2011 (изменено) · Жалоба И согласитесь говорить что не получиться не сделав даже попытки это как то не спортивно Попробовать можно, запустив шустрый AVR на предельной частоте и написав код на асме. А ведь надо бы еще и обработку ошибок реализовать, хотя бы минимальную. Пробуйте,только уж больно все это сомнительно выглядит ... Изменено 11 апреля, 2011 пользователем kovigor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Шустрый AVR уже выбрал - ATmega88. Предельная частота по документации 20 МГц. Если не трудно подскажите как 22разрядный код описанный код можно первое выдать и второе принять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Необходимо программно реализовать интерфейс типа ARINC-429. Последовательный интерфейс. По 1 проводу идут данные, по 2 проводу - синхросигнал (Частота 1,25 МГЦ). Слово данных состоит из 22 разрядов Точно 22 ? Википедия говорит о 32... 37 принимаемых слов идут подряд без разрывов или хоть какая-та пауза есть ? Если с разрывом, то AVR на 16...20 MHz пожалуй справится - поллингом (sbis/sbic) определяем фронт тактировки, принятый бит заносим в аккумулятор (ori), при этом на организацию цикла приема времени не остается, и для каждого принимаемого бита свой цикл и своя маска ori. А если плотно, без разрыва между словами - может быть, на 20 MHz и удастся, но придется репу почесать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Это сильно урезанный и переделанный ARINC 429 разрывы между словами есть. завтра измерю точное значение (порядка десятка микросекунд.) а если не трудно можно пример кода для приема а то не очень понятно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Шустрый AVR уже выбрал - ATmega88. Предельная частота по документации 20 МГц. Если не трудно подскажите как 22разрядный код описанный код можно первое выдать и второе принять Первым делом - не использовать прерываний. Любое прерывание, возникшее при приеме, снесет приемнику башку. А дальше - вообще не совсем ясно, как это впихнуть в МК, поскольку, если верить описанию интерфейса, он дифференциальный и трехуровневый. Потребуются трансиверы. Они есть ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stalknr 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба есть согласующая схема на ее выходе ТТЛ сигнал Данные (Адрес+Данны) и синхросигнал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба а если не трудно можно пример кода для приема а то не очень понятно Ну что-то типа: b7_0: sbis port,synch rjmp b7_0 ori acc1,$80 b7_1: sbic port,synch rjmp b7_1 b6_0: sbis port,synch rjmp b6_0 ori acc1,$40 b6_1: sbic port,synch rjmp b6_1 ..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stells 9 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба 16 тактов на прием одного бита - сомнительно, на грани фола Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nk@ 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 (изменено) · Жалоба 16 тактов на прием одного бита - сомнительно, на грани фола +1 вот-вот + время на укладку байтов в FIFO. Да еще и в UART надо запхнуть. Время между пачками скока? 1.28*7 = 8.96 милисек. Вам, чтоб выпхнуть 37 слов на скорости 115200 потребуется 37*(22/8)*1000/(115200/10) = 9.63 милисека. Нужно параллельно с приемом данных, отправлять в UART. Без прерываний параллельную отпраку не сделать нормально. С прерываниями - софтверный прием обосрётся. Выводы неутешительны. Хотя можно подвесить FTDI-232 и запулить на 1Mbit. Вижу 3 варианта - 1. Внешний сдвиговый регистр, лучче CPLD, как посоветовал kovigor + UART на повышенной скорости. 2. Берите ARM 3. Cлабая надежда есть, на нестандартное использование модуля TWI - кмк, единственный шанс реализовать на AVR, без внешних схем. PS: 3-й вариант возможен тока на TWI tinyAVR. Еслиб было 24 бита - можно было-бы использовать SPI, но это не наш случай. PPS: Щас еще раз глянул даташиты - на tiny должно получиться c TWI. На mega TWI шибко умный, ничего не выйдет. Изменено 11 апреля, 2011 пользователем nk@ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба +1 вот-вот + время на укладку байтов в FIFO. Да еще и в UART надо запхнуть. Время между пачками скока? 1.28*7 = 8.96 милисек. Вам, чтоб выпхнуть 37 слов на скорости 115200 потребуется 37*(22/8)*1000/(115200/10) = 9.63 милисека. Нужно параллельно с приемом данных, отправлять в UART. Без прерываний параллельную отпраку не сделать нормально. С прерываниями - софтверный прием обосрётся. Как раз наоборот - ведь вывод одного набранного байта это всего лишь один out, один лишний такт (а там определенный запас есть). Хотя одним не обойтись - если данные буферизовать в SRAM, то и на сохранение по два такта на байт, и на извлечение 2 (+1 на out). Однако на 20 MHz, пожалуй, реально. Реально даже если входные пакеты идут без пауз, непрерывно. А вот уложиться в паузу 9 mS - трудновато. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба По 1 проводу идут данные, по 2 проводу - синхросигнал (Частота 1,25 МГц). Слово данных состоит из 22 разрядов -> 1...6 - адрес (1-младший бит адреса, 6 - старший бит адреса) + 7...22 - данные (7 - младший, 22 - старший). Если нужны уточнения, пишите Принять на такой скорости не проблема, или вы хотите полный дуплекс? Можно взглянуть на временные диаграммы? И уточните, на какой скорости хотите передавать данные в писюк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nk@ 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 (изменено) · Жалоба Как раз наоборот - ведь вывод одного набранного байта это всего лишь один out Это если у Вас скорость порта заведомо выше скорости поступления данных, но у нас как раз наоборот(1.25Mbit ! против даже 1Мbit c FT-232). Прийдется организовывать FIFO, и по прерываниям с UART забирать данные, либо полингом смотреть статус UART в основном цикле, а это несколько больше одного out :) Однако на 20 MHz, пожалуй, реально. Реально даже если входные пакеты идут без пауз, непрерывно. А вот уложиться в паузу 9 mS - трудновато. На 20 MHz отправить в UART нереально. Т.е. отправить реально, а принять без ошибок, на 115200 - не выйдет. Сейчас у мамок com-порты отвратительные, с подстройкой фазы все очень плохо (особенно "радуют" мамки на nForce - чуть в сторону и приехали). Потери - гарантированы. Нужно либо кварц типа 14.7456 или 18.432, либо паять FT-232 и на нестандартной скорости шпарить через "виртуальный com port". И все-же советую tiny (например 2313) и заюзать TWI. Я уже так делал - нужно было принимать последовательности по 28 бит. Почему не использовать аппаратный сдвиговый регистр? Код найти постараюсь сегодня вечером, по крайней мере, метода проверена:) PS: Я уже решал подобную задачу, и тут прийдется сильно поэкономить тактики :) Изменено 12 апреля, 2011 пользователем nk@ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться