Телеметрия (часть 1)

BigDaddy

Тим! Если у корпусов 16LCC сбоку есть хоть небольшая площадка от вывода который на брюхе, то припаять можно. Если нет, то тогда только феном.

smalltim

Пока вот что получается:

Стабилизатор питания +5В еще не прикручен, память еще не прикручена, питание памяти +3.3В тоже не прикручено.
Еще надо 2 кнопочки, 2 светодиодика. Ну и еще вход GPS да разъем SPI для общения с платой телеметрии.

smalltim

Сделал схему немного более читаемой:

Ой, в цепи ресета фигня нарисована, не обращайте внимания. Отосплюсь - поправлю, будет как положено и еще плюс кнопочка 😃

smalltim

По поводу того, как привязан PPM, входы с пирометровых голов и с магнитометров - поругайте, если не лень 😃

А мне надо очень хорошо подумать, как строить программу чтобы корректно выходной PPM формировать, без задержек и прочая, а то сервы будут дрожать. Раньше я почему-то об этом не подумал.
А у Атмег прерывания реентерабельные? Т.е. что будет, если стукнет прерывание пока я обрабатываю другое прерывание? Подозреваю, что ничего страшного не произойдет, но все тайминги на моей совести 😦

Dikoy
smalltim:

У двухосевого 1052 сравните корпус 10-pin MSOP и 16-pin LCC на странице 5.
И посмотрите 1-осевой 1051Z в корпусе 8-pin SIP на странице 4, который я собираюсь использовать, ибо 10-pin MSOP нигде на складах нет (cм efind.ru), а 16-pin LCC - кошмар.

Я паял MSOP, тоже не подарок. А у LCC есть выводы сбоку.

smalltim:

По поводу того, как привязан PPM, входы с пирометровых голов и с магнитометров - поругайте, если не лень 😃

А мне надо очень хорошо подумать, как строить программу чтобы корректно выходной PPM формировать, без задержек и прочая, а то сервы будут дрожать. Раньше я почему-то об этом не подумал.
А у Атмег прерывания реентерабельные? Т.е. что будет, если стукнет прерывание пока я обрабатываю другое прерывание? Подозреваю, что ничего страшного не произойдет, но все тайминги на моей совести 😦

Я вот одного не пойму - ну если всё равно городить внешний ОУ, почему сразу не поставить нормальный АЦП? 😃 Тот же корпус, но нет кучи пассива с пол процентными допусками, который ещё и отстраивать надо. Нету кучи математики для вычисления курса из того г-на, которое получится после усиления ОУ и оцифровкой меговским АЦП. Ну нафига себе проблемы то создавать? 😃
Видимо, тяга к аналогу, это как свинка. Надо один раз переболеть, чтобы потом на всю жизнь иммунитет…
Кстати, купить АЦП ничуть не сложнее, чем этот ОУ.

Прерывания в меге встают в очередь, по приоритетам. Внутри прерывания ничего не происходит, но после выхода из прерывания чип выполнит 1 команду и снова уйдёт в прерывание. Самое приоритетное в очереди.
Таблица приоритетов есть в ДШ.

Проблем с генерацией не будет - регистры таймеров с двойной буферезацией. То есть пока генерится один период ШИм, обновлять регистр можно как хош часто. В качестве нового значения будет принято то, которое было в регистре в момент окончания периода генерации.

Чёта я схему не пойму. А ШИМы там что, не аппаратные? 😃

Dikoy

Вот, фото моих пирометров 😃 Фото головы в сборе и графики чуть позжа.

dmk
smalltim:

А у Атмег прерывания реентерабельные? Т.е. что будет, если стукнет прерывание пока я обрабатываю другое прерывание? Подозреваю, что ничего страшного не произойдет, но все тайминги на моей совести 😦

Для нестинга (если Вы это имеете ввиду) у Атмег достаточно после входа в процедуру обработки прерывания установить флаг глобального прерывания (тем самым подтвердить прерывание). В следующем командном цикле может быть принято и обработано следующее прерывание (внутри текущего прерывания).

lodeworx

а, черт!..Полностью согласен! Про нормальный АЦП и по прерываниям. Походу PWM программный-дрожать будет в зависимости от сложности остального софта(подключал в свое время аналоговый стрелочный вариометр к 8051 без PWM- все вылизал, а стрелка дрожит, как осиновый листок). Не связывайся- много бестолкового секса будет 😃 . В приемнике можно- там ниче нет больше. А про выбор процессора, я лучше помолчу…(LPC21… 6 асинхронных каналов, например)…молчу 😵

smalltim

PWM аппаратный будет, это я протупил просто. Схемку перерисую.
Насчет нормального ацп - мне меговского хватает.

smalltim

Гуру, не будет наглостью попросить ссылок на доки, где описано, как правильно общаться по SPI между мегами?
Интересует не только передача данных, но и прошивка младшенькой меги силами старшей.
Ну и еще, до кучи, у старшенькой меги на том же SPI внешняя память должна висеть. Как это разрулить?

Раз набрался смелости, вот еще вопрос: а не сможет ли кто-нибудь за разумные деньги в несколько дней сделать пару печатных плат?
Заказывать на заводе - долго и дорого, да и надо-то пока только дорожки с одной стороны и никаких отверстий. Паять всё соплями к at90usbkey - неохота. И без этого есть что на нем поотлаживать 😃

lodeworx

Ну вот, грабли! Вилы! 😮 Ну вот, будем протокол придумывать! SPI- сдвиговый рег. обычный. В данной апп. OSD- мастер, вывод делать в кадровом прерывании, например, дополнительное прерывание вводить нельзя- будут строки выпадать, или сдвигаться, из- за очереди прерываний, а так, все ручками… Хотите ARINC-4xx освоить в “свободное” время 😛 ?? Для прошивки Мег, использую мегалоад- ниче удобнее не пробовал- автоопределение, по сбросу. Можно переписать на любой физ. интерфейс, а основную делать прозрачной, во время прошивки. Но, ARM7 имеют на борту заводской лоадер и оригинальные процедуры входа… SAM7S- USBloader, и всего 48 пинов! О чем еще мечтать?! вот под что плату нада делать, а не возиться с протоколом и читать всякую ересь 😉 !

Atmel’s AT91SAM7S is a series of low pincount Flash microcontrollers based on the 32-bit ARM
RISC processor. It features a high-speed Flash and an SRAM, a large set of peripherals, including
a USB 2.0 device (except for the AT91SAM7S32 and AT91SAM7S16), and a complete set
of system functions minimizing the number of external components. The device is an ideal
migration path for 8-bit microcontroller users looking for additional performance and extended
memory.

smalltim

Собственная софтинка для прошивки at90usb128 со штатным бутлоадером через USB у меня уже давно готова. Пересылка данных по USB меге и обратно готова. Не быстро правда, всего 32кБ/сек, но для моих нужд хватит. 2 МБ полетных данных с флеша сольется в компук за минуту.

Нужно только вот дополнительно уметь прошивать мегу8 через SPI силами at90usb128, подключенной к USB. Для удобства обновления прошивок платы телеметрии. Ну да сам разберусь, спасибо.
Количество граблей и прочего шума в теме зашкаливает, теперь буду писать в тему по минимуму.

Если кто-то сможет через недельку помочь с парой опытных экземпляров печатки, не забесплатно, конечно - стукнитесь, пожалуйста, в личку или в почту!

AlexJ
smalltim:

Гуру, не будет наглостью попросить ссылок на доки, где описано, как правильно общаться по SPI между мегами?
Интересует не только передача данных, но и прошивка младшенькой меги силами старшей.
Ну и еще, до кучи, у старшенькой меги на том же SPI внешняя память должна висеть. Как это разрулить?

  1. Ссылок не дам (atmel.com 😃 ), но могу дать свои рабочие исходники обмена между мегами на C.
  2. Прошивку ведомой меги силами главной не делал, т.к. у меня в ведомых мегах весьма простые программы сбора данных, которые достаточно было отладить один раз, все навороты в главной.
  3. С внешней памятью и т.д. на том же SPI никаких проблем, просто выбираешь с кем надо обмениваться сигналами SS и все. Иногда приходится дополнительно перенастраивать CPOL и CPHA.
  4. Не пробуй сэкономить и отказаться от SS, отличный способ создать себе массу проблем. Мне пришлось потратить кучу времени чтобы данные передавались надежно.
Dikoy
dmk:

Для нестинга (если Вы это имеете ввиду) у Атмег достаточно после входа в процедуру обработки прерывания установить флаг глобального прерывания (тем самым подтвердить прерывание). В следующем командном цикле может быть принято и обработано следующее прерывание (внутри текущего прерывания).

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

Dikoy
smalltim:

Гуру, не будет наглостью попросить ссылок на доки, где описано, как правильно общаться по SPI между мегами?
Интересует не только передача данных, но и прошивка младшенькой меги силами старшей.
Ну и еще, до кучи, у старшенькой меги на том же SPI внешняя память должна висеть. Как это разрулить?

Раз набрался смелости, вот еще вопрос: а не сможет ли кто-нибудь за разумные деньги в несколько дней сделать пару печатных плат?
Заказывать на заводе - долго и дорого, да и надо-то пока только дорожки с одной стороны и никаких отверстий. Паять всё соплями к at90usbkey - неохота. И без этого есть что на нем поотлаживать 😃

Прошивка младшей описана в ДШ, в разделе memory programming. А как правильно общаться… Да как хочется, так и общайся 😃 Я для себя выдумал такой протокол:
#[addr][sender][lenght][data]
Адрес получателя, отправителя, длина поля дата и данные. Работает на любом протоколе, в том числе на И2Ц.
Когда чип не выбран лапкой CS, он по спецификации должен держать свои лапы в Z. При программиовании и ресете лапы МК также переходят в Z, по этому следует предусмотреть подтяжку, чтобы память не подгаживала на шину, когда рулящий чип в ауте.

Платы могу сделать бесплатно, вот как доставить? Возможно, на след. неделе буду в Москве, но не факт… Почта недели две идёт.

ПС. Я таки победил пирометры! 😛 Работают!!! Все 4, горизонт видят, всё мериют и вообще работают супер. Пока испытывали только на шесте, но на неделе полетим и запишем в полёте. Но даже на шесте по пирометрам можно было выровнять потожение шеста так, что проверка отвесом показывала 100% совпадение.

lodeworx

Ну вот. С Днём Рождения, блин! 😃 Может сам на себя посмотреть:

С детства роботов люблю!
С “демо” данными:

Что- то типа: “В ШТОПОРЕ”, с маркером автопилота…

Сорри, нет фото-камеры…(OSD 72x192 слева скорость, в центре- курс, справа вертикалка, внизу- скольжение+ контроль скольжения +8 aux индикаторов-%) Ну и не сделать толком больше на Меге ниче- все завязано на строчном прерывании… 😃 ~20kb -opt 3. Про обмен датой:
Самое простое- обмен по SPI. Скажем 32 байта туда<->сюда +1 sync, по одному в конце строчного прерывания- мастером!

AlexJ
Dikoy:

Надо писать код, сохраняюший вектор возврата. А это есть изврат.

Всегда считал что он автоматом сохраняется в стеке 😃 а затем извлекается оттуда командой RETI. Просто в стеке окажется два вектора возврата, но и команд RETI будет выполнено две (может и больше уровней вложенности оказаться)

Проверено, работает. Но редко реально нужно.

dmk
Dikoy:

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

Как я понял, Вы меня опять втягиваете в безсмысленный спор 😃 . А зря. Поверьте, кроме Вас есть еще люди, которые пишут и достаточно давно для AVR, да и для других процессоров.
Вложенные прерывания (Nested interrupts) вещь достаточно стандартная, и широко используемая. В случае AVR (как уже было сказано выше) по команде RETI автоматически из стека извлекается вектор возврата, причем количество вложенных прерываний ограничивается только размером стека. А вот STATUS регистр нужно сохранить в ручную, но это нужно делать вне зависимости от вложенности. В принципе, и вызов и возврат из подпрограммы происходят также, только не сбрасывается флаг прерываний. А отказываться от такого мощного инструмента как Nested interrupts (там где это необходимо), это действительно изврат.

Dikoy
dmk:

причем количество вложенных прерываний ограничивается только размером стека.

Об этом я и написал, вы опять не хотите вникать в суть, видя лишь верх.
Если вы будете писать код, который не успевает обрабатывать прерывания, очередь прерываний запросто переполнит стек. Что есть путь в никуда, умышленное снижение надёжности своей программы.
Не говоря про то, что стек у АВР, понятие весьма условное 😉
Это не PDP-6, та позволяла вообще на одних прерываниях жить…
Инструмент мощьный, но пользоваться надо осторожно. Я от него отказался и пока не встречал задачи, где без вложенных прерываний ну никак не обойтись, хотя пишу в основном шельф-менеджеры.

>>А вот STATUS регистр нужно сохранить в ручную, но это нужно делать вне зависимости от вложенности.
???
Если когда и сохраняют статус, то при ручном отключении прерываний внутри большого и важного прерывания. Но я это видел крайне редко в чужих кодах… И то если есть опасность включения настроек компилятора, разрешающий вложенность. Так сказать, для страховки (у нас тут основной критерий к коду - возможность повторного использования, реюзибл), на случай переноса куска кода в другую программу или компилятор. Если настройки нет и cli включается, компилер это заоптимизует и уберёт сам.

dmk
Dikoy:

Об этом я и написал …

Ну допустим не об этом Вы писали а о адресе возврата из прерывания, который вдруг куда-то исчезает. Возможно Вы не смогли правильно выразить свою мысль. Допускаю. Но к сожалению, создается впечатление, что это Вы в суть не вникли, но обязательно хотите оставить за собой последнее слово. Надеюсь, что это впечатление ложное.
Вложенностью прерываний можно и нужно пользоваться. А для того чтобы стек не переполнялся, действительно нужно уметь писать грамотный код (как Вы правильно заметили ранее).

Dikoy:

>>А вот STATUS регистр нужно сохранить в ручную, но это нужно делать вне зависимости от вложенности.

А здесь я допустил неточность, признаю. Это нужно делать в С программах только для прерываний, реализованных на ассемблере или с атрибутом naked. Но это было просто к слову.
А по существу, я вообще-то ответил smalltim-у, и поскольку комментировать или задавать вопросы он не стал, значит информация его либо удовлетворила, либо была излишней. Тем не менее, если интересно (smalltim-у), могу предложить свой код проекта OSD (тоже по мотивам Томаса Шерера двухлетней давности) на ATMega 168 , написанный на AVR GCC, с вложенным прерыванием строчного синхро. С его помощью я пытался реализовать графический и текстовый режимы в одном экране, вобщем довольно успешно. Хотя, по себе знаю, хуже нет чем ковыряться в чужом коде.

maloii
dmk:

Тем не менее, если интересно (smalltim-у), могу предложить свой код проекта OSD (тоже по мотивам Томаса Шерера двухлетней давности) на ATMega 168 , написанный на AVR GCC, с вложенным прерыванием строчного синхро. С его помощью я пытался реализовать графический и текстовый режимы в одном экране, вобщем довольно успешно. Хотя, по себе знаю, хуже нет чем ковыряться в чужом коде.

Не знаю как Тимофею но мне было б очень интересно посмотреть 😒 .