|
Измерение временных интервалов, с высокой точностью |
|
|
|
 |
Ответов
|
Oct 12 2006, 09:31
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(singlskv @ Oct 11 2006, 15:06)  Цитата(=GM= @ Oct 11 2006, 15:10)  Ну раз так, вот вам еще экономия. Не используйте регистры r5-r4 в прерывании, храните результат непосредственно в регистрах icr1h-icr1l. Будет сохранно, как в банке ... до следующего захвата.
А как Вы в основной программе планируете узнавать что произошел второй захват ?  А вы у GetSmart спросите, он всё знает(:-). Спокойно, GetSmart, шютю я(:-) Чуть посерьёзнее. Я вам про экономию регистров в прерывании говорю, "которых всегда не хватает", а вы плавно меняете тему. Какая разница, где хранить время текущего захвата, в регистрах r7-r6-r5-r4 или в r7-r6-icr1h-icr1l? Никакой разницы нет. Почти. Зато экономится два регистра! Ну а по делу, думаю есть несколько подходов. 1) Есть две переменные, скажем, oldTime и newTime (ваши r7-r6-r5-r4). Прерывание захвата должно переписывать содержимое newTime в oldTime, и только затем обновлять newTime. Основная программа в любое удобное для себя время(:-) определяет длительность интервала, просто вычитая содержимое oldTime из newTime. 2) Прерывание захвата чередует признак начала измерения и конца измерения, (можно просто счетчик на регистре, признак-младший бит), а основная программа доделывает остальное. Цитата(GetSmart @ Oct 11 2006, 15:25)  Цитата(=GM=) Автор топика намеревался измерять длительность секундных импульсов, а не период. Т.е., есть передний фронт импульса, длительность импульса и задний фронт импульса. Время начала импульса наша программа измерит, а как быть со спадом? Может быть перенастраивать ICES1 при первом входе в прерывание TIM_CAPT или есть более короткий путь? Ну дык у АВР есть возможность вызывать прерывание по любому изменению состояния входа. Надо только при запуске правильно инициализироваться (учесть текущее состояние), а дальше - понеслась. Неправильно. В том то и дело, что не один раз при запуске программы надо инициализироваться, а каждый раз при входе в захват(:-(. Потому что на четных захватах вы ловите переход 0-1 (начало импульса), а на нечетных захватах вы ловите 1-0 (конец импульса). Я и спрашивал, перенастраивать ICES1 каждый раз или есть другой способ, попроще? Цитата(GetSmart @ Oct 11 2006, 15:25)  Ведро маслят... Это многое объясняет... Как-нить при случае тоже ляпну такое  GetSmart, хорош бурчать, это у вас так что проявляется(:-)? Не злитесь, ляпните что-нибудь или тяпните, разрядка придёт, поверьте(:-). Добавлю специально для вас. Напротив моих окон стоит бангало, под ним живет более 20 диких кроликов, смешные такие...А недавно видел как ворона ссорилась с белкой, наскакивали друг на друга, прям как вы на меня(:-). GetSmart, жена маслята уже посолила, вот. Белые тут тоже водятся, но ехать далеко, в Нью Форист, неохота...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 15 2006, 02:25
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 12 2006, 12:31)  А недавно видел как ворона ссорилась с белкой, наскакивали друг на друга, прям как вы на меня(:-). Дык, эта, если смотреть со стороны, здесь все замечания вам по делу были сказаны, а вы все в шутку да в обидку воспринимаете.. Что ни пост - то перл: особливо это: Цитата Какая разница, где хранить время текущего захвата, в регистрах r7-r6-r5-r4 или в r7-r6-icr1h-icr1l? Ну уж никак не в аппаратно зависимых регистрах, которые нам абсолютно неподконтрольны. Вы что, правда не понимаете, что можно не успеть вычитать icr1h-icr1l до того как случится следующий захват? либо например наткнуться на ситуацию когда в момент вычитки L, произойдет следующий захват.
|
|
|
|
|
Oct 16 2006, 13:06
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Oct 15 2006, 01:25)  Что ни пост - то перл: особливо это: Цитата Какая разница, где хранить время текущего захвата, в регистрах r7-r6-r5-r4 или в r7-r6-icr1h-icr1l? Ну уж никак не в аппаратно зависимых регистрах, которые нам абсолютно неподконтрольны. Вы что, правда не понимаете, что можно не успеть вычитать icr1h-icr1l до того как случится следующий захват? либо например наткнуться на ситуацию когда в момент вычитки L, произойдет следующий захват. Я и не такие перлы могу выдавать(:-). Но вообще-то, в нашем случае никакой разницы на самом деле нет, посудите сами, как только произошел захват, возникло прерывание, в котором регистры icr1h-icr1l читаются и переписываются в r5-r4, т.е. и icr1h-icr1l, и r5-r4 изменяются практически одновременно (макс разница 32 мс, если есть длинное прерывание). Естественно предполагается, что вы должны успеть обработать r7-r6-r5-r4 до следующего захвата, который может случиться через секунду (по условию задачи). Ну и спрашивается, зачем тратить два регистра МК, если можно с таким же успехом хранить данные в регистрах захвата? Если же вы не успели, то произойдет новый захват, r5-r4 тоже испортятся, так что тут ничто не поможет, какая разница, что испорчено? Как меру борьбы, в прерывании можно сразу сохранять время захвата в озу, но опять же сохранять можно прямо из регистров захвата, r5-r4 тут не нужны. Вы-то сами понимаете, что при наличии длинного прерывания наступит крах вашей системы прерываний, если, скажем, возникнет два прерывания захвата в течение 65 мс? По существу, во время дискуссии выплеснули ребеночка, стали решать задачу измерения интервала при наличии длинного прерывания и меры по его устранению, хотя автор просил совета по измерению длительности секундных импульсов, а не периода, следовательно, по моему мнению, время между импульсами может быть любым, пусть, скажем, будет допустимый минимум 50 мкс между спадом одного импульса и фронтом другого, ну и где будут длинные прерывания? Или другими словами, минимальное время между двумя захватами должно составлять 50 мкс, что означает отказ от других прерываний, будь они длинные или короткие... Возможно, кому-то достаточно измерять импульсы от 32 мс до секунд и с длинными прерываниями, согласен, тогда забудьте о сказанном выше. Я бы сказал так, что постановка первоначальной задачи была нечеткой, отсюда все недоразумения. Что ещё? На справедливую критику не обижаюсь, с несправедливой борюсь по мере сил(:-), и посмеяться и пошутить люблю, но по-доброму.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 18 2006, 11:44
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 16 2006, 16:06)  Я и не такие перлы могу выдавать(:-). Но вообще-то, в нашем случае никакой разницы на самом деле нет, посудите сами, как только произошел захват, возникло прерывание, в котором регистры icr1h-icr1l читаются и переписываются в r5-r4, т.е. и icr1h-icr1l, и r5-r4 изменяются практически одновременно (макс разница 32 мс, если есть длинное прерывание). Естественно предполагается, что вы должны успеть обработать r7-r6-r5-r4 до следующего захвата, который может случиться через секунду (по условию задачи). Ну и спрашивается, зачем тратить два регистра МК, если можно с таким же успехом хранить данные в регистрах захвата?
Если же вы не успели, то произойдет новый захват, r5-r4 тоже испортятся, так что тут ничто не поможет, какая разница, что испорчено? Затем, что прерывание может произойти именно в момент вычитки значения, и мы можем прочитать недостоверные данные. Если же рез-тат будет храниться в r7-r6-r5-r4, то мы можем запретить флаг I при обращении к этой 32х битной переменной, и тем самым обезопасить себя от последствий описанного случая. Учить матчасть
|
|
|
|
|
Oct 18 2006, 14:14
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Oct 18 2006, 10:44)  Затем, что прерывание может произойти именно в момент вычитки значения, и мы можем прочитать недостоверные данные.
Если же рез-тат будет храниться в r7-r6-r5-r4, то мы можем запретить флаг I при обращении к этой 32х битной переменной, и тем самым обезопасить себя от последствий описанного случая. Here we go! Я ж вам сконструировал реальный пример. Ну запретили вы все прерывания, потом пришло два захвата до начала вашей обработки с интервалом в 50 мкс, и где будут данные от первого захвата, скажите? Правильно, в глубокой попе, а не в r7-r6-r5-r4. Как-то вы несистемно подходите к задаче измерения интервалов. Ну написали вы программку чтения данных из регистров icr1, дальше-то что делать? Ждать когда завершится длинное прерывание и фоновая программа наконец запретит прерывания, соизволит переписать r7-r6-r5-r4 в память и разрешит прерывания заново? Данах такую программу измерения! Пока ваша программа будет жевать сопли, там уж десять раз новый захват может возникнуть! На мой взгляд, чтобы программа обработки захвата была максимально быстрой, она должна записывать время захвата в буфер именно в программе обработки. Если вы согласны с этим, то какая разница откуда писать в буфер? Из r7-r6-r5-r4, или из r7-r6-icr1h-icr1l, или из r3-r2-icr1h-icr1l? Да без разницы! Но лучше из r3-r2-icr1h-icr1l (с возможной коррекцией), т.к. экономятся регистры и быстрее работает. Ну и никаких других прерываний, измерение интервалов само по себе ответственное дело(:-). Цитата(defunct @ Oct 18 2006, 10:44)  Учить матчасть  Согласен, учить не вредно (хотя конкретно здесь сказано вами не к месту). Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза! Кстати, почему никто не отвечает на вопрос что требуется измерение длины импульса (фронт и спад), а не периода (два фронта или два спада)? Все согласны что ли?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 18 2006, 16:04
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 18 2006, 17:14)  хотя конкретно здесь сказано вами не к месту Вам виднее. Цитата Кстати, почему никто не отвечает на вопрос что требуется измерение длины импульса (фронт и спад), а не периода (два фронта или два спада)? Все согласны что ли? Потому что это уже косметика. Цитата Если вы согласны с этим, то какая разница откуда писать в буфер? Из r7-r6-r5-r4, или из r7-r6-icr1h-icr1l, или из r3-r2-icr1h-icr1l? Разница огромная. Я предпочту запретить прерывания и прочитать достоверное значение из защищенного от изменений буфера. После чего, разрешив прерывания, будет выполнено обновление переменной и т.д. Этим я обезопашу себя и вас от дурацких вопросов в будущем - "окуда появилось это значение". Вы же со своей реализацией и вычиткой icr от таких вопросов ничем не застрахованы, если Вам с вашим системным подходом до сих пор не ясна проблема, то я попробую озвучить ее прямым текстом: - пол переменной у вас может быть прочитано из одного семпла, а вторая половина - из второго.
|
|
|
|
Сообщений в этой теме
AVR Измерение временных интервалов Jun 2 2006, 17:03 WHALE C точностью до микросекунды с кварцем на 1Мгц ника... Jun 2 2006, 17:07 GetSmart А инкрементировать ещё одни (старшие) 16 бит по пе... Jun 2 2006, 17:10 rezident Цитата(GetSmart @ Jun 2 2006, 23:10) А ин... Jun 2 2006, 17:20 AVR Цитата(GetSmart @ Jun 2 2006, 21:10) А ин... Jun 2 2006, 17:24 GetSmart ЦитатаC точностью до микросекунды с кварцем на 1Мг... Jun 2 2006, 17:23 GetSmart Чё-то я ослеп. Речь как раз об AVR. Берёте Мегу8, ... Jun 2 2006, 17:43 defunct Цитата(GetSmart @ Jun 2 2006, 20:43) Чё-т... Jun 2 2006, 19:26 GetSmart ЦитатаНельзя выйти на точность в 1мкс в случае ког... Jun 2 2006, 19:51 defunct Цитата(GetSmart @ Jun 2 2006, 22:51) Немн... Jun 2 2006, 20:32 GetSmart ЦитатаНу представьте захвачен ICR = 0. Что делать?... Jun 2 2006, 20:54 defunct Цитата(GetSmart @ Jun 2 2006, 23:54) Цита... Jun 2 2006, 20:57 smk Цитата(GetSmart @ Jun 2 2006, 23:54) Цита... Oct 5 2006, 16:30  defunct Цитата(smk @ Oct 5 2006, 19:30) У меня си... Oct 6 2006, 11:11 GetSmart Надо только в прерывании захвата смотреть, если чи... Jun 2 2006, 21:18 defunct Цитата(GetSmart @ Jun 3 2006, 00:18) Надо... Jun 2 2006, 21:45 GetSmart ЦитатаТам это учтено:
Да, я это написал когда ещё ... Jun 2 2006, 21:53 defunct Цитата(GetSmart @ Jun 3 2006, 00:53) Кста... Jun 2 2006, 22:05 GetSmart Вроде нормальный пример. Тока непонятно зачем R0 и... Jun 2 2006, 23:02 defunct Цитата(GetSmart @ Jun 3 2006, 02:02) Хотя... Jun 3 2006, 13:02 GetSmart ??? Jun 3 2006, 05:22 Rst7 О чем вы, господа? Забыли, что внутри проца есть е... Jun 3 2006, 06:28 GetSmart О чём вы, господин? Задержка всегда постоянная. И ... Jun 3 2006, 06:53 Rst7 Э, да, вспылил, был неправ Jun 3 2006, 07:20 Валентиныч А чем вызвано ограничение по кварцу - 1 МГц? (Или ... Jun 3 2006, 14:17 GetSmart defunct
Ну ёкарный бабай...
Ещё нужно заменить ... Jun 3 2006, 17:16 defunct Цитата(GetSmart @ Jun 3 2006, 20:16) defu... Jun 3 2006, 19:05 Sergiy все хорошо ребята - мона конечно извращаться с АВР... Jun 3 2006, 21:14 smk Цитата(Sergiy @ Jun 4 2006, 00:14) частот... Oct 5 2006, 17:02 SasaVitebsk Цитата(Sergiy @ Jun 4 2006, 00:14) все хо... Oct 5 2006, 23:37  Stanislav Цитата(SasaVitebsk @ Oct 6 2006, 03:37) Ц... Oct 6 2006, 11:58 Sergiy Да кстати в продолжение темы, а знаете зачем у ква... Jun 3 2006, 21:29 king2 И вот все равно не понимаю я...
Предположим, в эт... Oct 5 2006, 01:30 CD_Eater Не пойму, к чему эти обсуждения наилучшего кода, е... Oct 5 2006, 17:56 khach Как померять? Используя ГЛИН (генератор пилы) и вн... Oct 5 2006, 19:49 =GM= Ну вот, опоздал к началу обсуждения, как всегда, в... Oct 6 2006, 16:22 Stanislav Цитата(=GM= @ Oct 6 2006, 20:22) Задача д... Oct 9 2006, 10:46  =GM= Цитата(Stanislav @ Oct 9 2006, 09:46) Цит... Oct 9 2006, 12:56   Stanislav Цитата(=GM= @ Oct 9 2006, 16:56) Поясните... Oct 9 2006, 16:09 _artem_ =GM=, использование арифметических операций предпо... Oct 6 2006, 17:17 =GM= Цитата(_artem_ @ Oct 6 2006, 16:17) =GM=,... Oct 6 2006, 22:48 _artem_ Правильно говорите - я то невнимательно прочитал п... Oct 7 2006, 00:10 singlskv Подправил немного код GetSmart и defunct
- добавил... Oct 7 2006, 10:37 GetSmart Забавно. На этой странице всех повело совсем не в ... Oct 9 2006, 13:35 =GM= Цитата(singlskv @ Oct 7 2006, 09:37) Подп... Oct 9 2006, 13:59  singlskv Цитата(=GM= @ Oct 9 2006, 17:59) Хочу нем... Oct 9 2006, 16:34   Леонид Иванович ЦитатаНу и последнее, в подобных случаях предпочит... Oct 9 2006, 20:15    =GM= Цитата(Леонид Иванович @ Oct 9 2006, 19:1... Oct 10 2006, 11:04     singlskv Цитата(=GM= @ Oct 10 2006, 15:04) Что оче... Oct 10 2006, 11:19      SasaVitebsk Цитата(singlskv @ Oct 10 2006, 14:19) Цит... Oct 10 2006, 13:25       =GM= Цитата(SasaVitebsk @ Oct 10 2006, 12:25) ... Oct 10 2006, 14:36       defunct Цитата(SasaVitebsk @ Oct 10 2006, 16:25) ... Oct 10 2006, 22:32 GetSmart Цитата(=GM=)Код mov temp,r4 ;с возможным п... Oct 9 2006, 15:22 =GM= Цитата(GetSmart @ Oct 9 2006, 14:22) Цита... Oct 9 2006, 16:06 _artem_ Для микросекундной точности mожно скорректировать... Oct 9 2006, 16:11 Stanislav Цитата(_artem_ @ Oct 9 2006, 20:11) Для м... Oct 9 2006, 16:13 GetSmart Цитата(=GM=)Ничего не понял, поясните. Здесь никак... Oct 9 2006, 16:24 =GM= Цитата(GetSmart @ Oct 9 2006, 15:24) Цита... Oct 10 2006, 10:43  singlskv Цитата(=GM= @ Oct 10 2006, 14:43) 3) Одна... Oct 10 2006, 11:49   =GM= Чудак-человек, я согласен, что практически ваша пр... Oct 10 2006, 12:51    singlskv Цитата(=GM= @ Oct 10 2006, 16:51) Пусть о... Oct 10 2006, 13:23 GetSmart Павезло так павезло Oct 9 2006, 20:37 smk По моему скромному мнению, мне очень понравилась и... Oct 10 2006, 14:09 GetSmart Ой-Ой-Ой.
Ладно, господа. Я вас примирю. Использ... Oct 10 2006, 14:14 GetSmart Цитата(=GM=)Просто механически повторил ваш код, р... Oct 10 2006, 14:33 singlskv Еще подправил код:
- заменил на одну константу Con... Oct 10 2006, 16:20 =GM= Цитата(singlskv @ Oct 10 2006, 15:20) Еще... Oct 10 2006, 17:15  singlskv Цитата(=GM= @ Oct 10 2006, 21:15) Мне каж... Oct 10 2006, 17:52   =GM= Цитата(singlskv @ Oct 10 2006, 16:52) Цит... Oct 11 2006, 11:10    singlskv Цитата(=GM= @ Oct 11 2006, 15:10) Ну раз ... Oct 11 2006, 16:06  singlskv Цитата(=GM= @ Oct 10 2006, 21:15) Цитата(... Oct 10 2006, 18:06   =GM= Цитата(singlskv @ Oct 10 2006, 17:06) Цит... Oct 11 2006, 10:54 GetSmart Цитата(singlskv)Код in R5, ICR1H
mov R7, ConstF... Oct 10 2006, 20:19 singlskv [quote name='GetSmart' date='Oct 11 20... Oct 10 2006, 20:58 GetSmart defunct
Скучали тут без Вас
А почему все думают,... Oct 10 2006, 23:11 defunct Цитата(GetSmart @ Oct 11 2006, 02:01) А п... Oct 10 2006, 23:14 GetSmart Цитатакак "глюкодром" Класс!
Не, ну... Oct 10 2006, 23:34 defunct Цитата(GetSmart @ Oct 11 2006, 02:34) Не,... Oct 10 2006, 23:57 GetSmart Цитата(defunct)i - переход на длительный обработчи... Oct 11 2006, 02:49 AVR Прошу прощения за оффтоп, но для самого автора тем... Oct 11 2006, 17:25  singlskv Цитата(AVR @ Oct 11 2006, 21:25) Прошу пр... Oct 11 2006, 17:30  GetSmart Цитата(AVR @ Oct 11 2006, 23:25) Прошу пр... Oct 11 2006, 17:43      singlskv Цитата(=GM= @ Oct 18 2006, 18:14) Но вот ... Oct 18 2006, 20:07       =GM= Цитата(singlskv @ Oct 18 2006, 19:07) Цит... Oct 19 2006, 15:21 CD_Eater Цитата(defunct @ Oct 11 2006, 03:57) Цита... Oct 11 2006, 17:59 singlskv Цитата(defunct @ Oct 11 2006, 03:14) Цита... Oct 11 2006, 20:51 GetSmart Цитата(=GM=)GetSmart, хорош бурчать, это у вас так... Oct 12 2006, 10:18 GetSmart Цитата(=GM=)Как-то вы несистемно подходите к задач... Oct 18 2006, 14:43 =GM= Цитата(GetSmart @ Oct 18 2006, 13:43) Цит... Oct 19 2006, 14:55 GetSmart defunct
Любопытная вещь. Это я где-то уже видел и ... Oct 18 2006, 17:17 singlskv Цитата(=GM= @ Oct 19 2006, 18:55) Код....... Oct 19 2006, 17:20 GetSmart Цитата(=GM=)Похоже вам слово системщик, как быку к... Oct 20 2006, 02:23 =GM= GetSmart У вас же в последней проге слишком много ... Oct 20 2006, 10:08
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|