Телеметрия (часть 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, с вложенным прерыванием строчного синхро. С его помощью я пытался реализовать графический и текстовый режимы в одном экране, вобщем довольно успешно. Хотя, по себе знаю, хуже нет чем ковыряться в чужом коде.

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

dmk

Да ради бога. Только e-mail в личку бросьте.

Dikoy
dmk:

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

Я писал о возможности потери вектора возврата при уровни вложенности более 1. Поясню.
Стек может переполниться запросто, причём даже не самими векторами возврата. Любая функция, особенно, если вызывается редко и из прерывания, да написана не тобой, может резко возжелать стек. А там уже данные основного кода. И вот тут очередному прерыванию понадобится сохранить вектор. А некуда! И всё - ниточка прервалась и получаем “адресе возврата из прерывания, который вдруг куда-то исчезает”.
Понятно, что если функции не хватит стека, это само по себе нехорошо. Но проц может и не зависнуть от этого. А вот от потерявшегося прерывания зависнет 100%. Или уйдёт на нулевой адрес (рестарт). Причём переменные в памяти и регистры сохранят свои значения и если код писался без лишней инициализации (есть такие экономщики, ставящие на дефолтные значения по ДШ) армагидец обеспечен.

А вы можете выложить видео с последнего полёта куда-нибудь, где его можно скачать? На том сайте дают только смотреть…

dmk
Dikoy:

Я писал о возможности потери вектора возврата при уровни вложенности более 1.

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

lodeworx

Вот, “босяцкий” индуктивный рпм сенсор, средствами меги, может работать БЕЗ ПРЕРЫВАНИЙ!

(Катушка- половина рас…еного РЭС-22)
[codebox]
int FeatureCalcRpm;
ADMUX |=_BV(REFS0) |_BV(REFS1); //2.56v at AREF pin
ADCSRA |=_BV(ADEN); //Включаем шнягу…
ACSR |=_BV(ACIC); //Компаратор- как источник сигнала ICP, по отрицательному фронту…
TCCR1B |=_BV(CS11); //|_BV(ICNC1); //Timer1_Freq=XTAL/8 минимальная частота измерения~30.5hz макс.~1mhz
или частота проверки бита захвата. У меня проверка в конце “тела” строчного прерывания 15625херц

if (bit_is_set(TIFR,ICF1)) {
TIFR|=_BV(ICF1); //сброс
TCCR1B = 0x00; //стоп
TCNT1=0x00; //сброс
FeatureCalcRpm=ICR1; //сохраняем
TCCR1B |=_BV(CS11);//|_BV(ICNC1); //старт
}
RotationzPerMinute=(XTAL/8/FeatureCalcRpm)*60; //>>1, если 2 магнита
[/codebox]
Резистором “чувствительность” можно менять область применения 😁
(без него-“измеритель шума”)

maloii
Dikoy:

А вы можете выложить видео с последнего полёта куда-нибудь, где его можно скачать? На том сайте дают только смотреть…

Если Вы имеете в виду видео последнего полета с улетом 😁 ,то на страничке где вы смотрите, снизу в правом углу есть ссылка на скачать в исходном качестве, но эта ссылка видна только для зарегистрированных.