Jump to content

    

Программная реализация интерфейса

Добрый вечер форумчане!!!!

Есть вот такая задачка

Необходимо программно реализовать интерфейс типа ARINC-429.

Последовательный интерфейс. По 1 проводу идут данные, по 2 проводу - синхросигнал (Частота 1,25 МГЦ).

Слово данных состоит из 22 разрядов -> 1...6 - адрес (1-младший бит адреса, 6 - старший бит адреса) + 7...22 - данные (7 - младший, 22 - старший).

Помогите реализовать выдачу и прием такого слова микроконтроллером. Желательно на ассемблере.

Заранее спасибо.

Если нужны уточнения пишите.

 

 

Share this post


Link to post
Share on other sites
Необходимо программно реализовать интерфейс типа ARINC-429.

Обязательно программно ? Если в МК этот интерфейс не поддерживается аппаратно, то программная реализация вас не спасет. 1.25 МГц - это слишком быстро. МК почти наверняка не справится. Или справится, но ресурсов больше ни на что не хватит. Проще говоря, как ни делай, а все равно выйдет посредственно или (скорее всего) не выйдет вообще. Это типичная задачка для простой CPLD. Какая-нибудь MAX3032 + код на AHDL. За день-другой вполне справитесь ...

Edited by kovigor

Share this post


Link to post
Share on other sites

А больше не чего реализовывать и не надо. Тупо прочитать слова (порядка 37 шт 22 разрядных слов), записать их в ОЗУ, и в определенный момент выкинуть все уартом в комп. Интервал между пачками (37 слов) 7*1,28 мс

 

И согласитесь говорить что не получиться не сделав даже попытки это как то не спортивно

Share this post


Link to post
Share on other sites
И согласитесь говорить что не получиться не сделав даже попытки это как то не спортивно

 

Попробовать можно, запустив шустрый AVR на предельной частоте и написав код на асме. А ведь надо бы еще и обработку ошибок реализовать, хотя бы минимальную. Пробуйте,только уж больно все это сомнительно выглядит ...

Edited by kovigor

Share this post


Link to post
Share on other sites

Шустрый AVR уже выбрал - ATmega88. Предельная частота по документации 20 МГц.

Если не трудно подскажите как 22разрядный код описанный код можно первое выдать и второе принять

Share this post


Link to post
Share on other sites
Необходимо программно реализовать интерфейс типа ARINC-429.

Последовательный интерфейс. По 1 проводу идут данные, по 2 проводу - синхросигнал (Частота 1,25 МГЦ).

Слово данных состоит из 22 разрядов

Точно 22 ? Википедия говорит о 32... 37 принимаемых слов идут подряд без разрывов или хоть какая-та пауза есть ? Если с разрывом, то AVR на 16...20 MHz пожалуй справится - поллингом (sbis/sbic) определяем фронт тактировки, принятый бит заносим в аккумулятор (ori), при этом на организацию цикла приема времени не остается, и для каждого принимаемого бита свой цикл и своя маска ori. А если плотно, без разрыва между словами - может быть, на 20 MHz и удастся, но придется репу почесать...

Share this post


Link to post
Share on other sites

Это сильно урезанный и переделанный ARINC 429

разрывы между словами есть. завтра измерю точное значение (порядка десятка микросекунд.)

а если не трудно можно пример кода для приема а то не очень понятно

 

Share this post


Link to post
Share on other sites
Шустрый AVR уже выбрал - ATmega88. Предельная частота по документации 20 МГц.

Если не трудно подскажите как 22разрядный код описанный код можно первое выдать и второе принять

 

Первым делом - не использовать прерываний. Любое прерывание, возникшее при приеме, снесет приемнику башку. А дальше - вообще не совсем ясно, как это впихнуть в МК, поскольку, если верить описанию интерфейса, он дифференциальный и трехуровневый. Потребуются трансиверы. Они есть ?

Share this post


Link to post
Share on other sites

есть согласующая схема на ее выходе ТТЛ сигнал Данные (Адрес+Данны) и синхросигнал

Share this post


Link to post
Share on other sites
а если не трудно можно пример кода для приема а то не очень понятно

Ну что-то типа:

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

.....

Share this post


Link to post
Share on other sites

16 тактов на прием одного бита - сомнительно, на грани фола

Share this post


Link to post
Share on other sites
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 шибко умный, ничего не выйдет.

Edited by nk@

Share this post


Link to post
Share on other sites
+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 - трудновато.

 

 

Share this post


Link to post
Share on other sites
По 1 проводу идут данные, по 2 проводу - синхросигнал (Частота 1,25 МГц). Слово данных состоит из 22 разрядов -> 1...6 - адрес (1-младший бит адреса, 6 - старший бит адреса) + 7...22 - данные (7 - младший, 22 - старший). Если нужны уточнения, пишите

Принять на такой скорости не проблема, или вы хотите полный дуплекс? Можно взглянуть на временные диаграммы? И уточните, на какой скорости хотите передавать данные в писюк?

Share this post


Link to post
Share on other sites
Как раз наоборот - ведь вывод одного набранного байта это всего лишь один 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: Я уже решал подобную задачу, и тут прийдется сильно поэкономить тактики :)

Edited by nk@

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this