Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение временных интервалов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3
defunct
Цитата(=GM= @ Oct 20 2006, 13:08) *
Насчет 0.5 такта правда, на фирме посоветовался с электронщиком, вроде проходит.
Интересно, что defunct думает по поводу полтакта, пропал он куда-то...

Хм... ну
Код
rising:    in     r16,ICR1L;24 обработка фронта
           in     r17,ICR1H;24
....
....
falling:   in     r16,ICR1L;50 обработка спада
           in     r17,ICR1H;51


Помним, были когда-то темы про архиваторы сжимающие любой объем данных до одного бита, вечные двигатели и т.п.. Теперь вот точность в 0.5 такта... Я думаю, это просто галиматья какая-то, если честно.
Input capture работает с разрешающей способностью 1 такт, компаратор со "сглаживателем" ~4 такта. У AVR c его периферией нет возможности обеспечить точность в 0.5 такта. Электронщикам с которыми Вы советовались - незачОт.

Цитата
Меня интересуют потенциальные возможности аврок.

В даташитах можно найти ответ на этот вопрос.

Цитата
Цитата

GetSmart Интересно чем отличается конструкция {sei ; ret} от {iret} ? Если я не ошибаюсь, она только хуже.

Это следствие смены детектора перехода (0-1 или 1-0), чтобы не портить установку. Я сам не очень уверен здесь, хотя делал всё по описанию. Обратите внимание на строчки 25, 26 и 52, 53.

Это от лукавого. В описании точно такого нет. Может быть это из banned курса?
Выход из прерывания - RETI (автоматом взводит флаг I).
GetSmart
Цитата(=GM=)
Нового ничего, за исключением того, что прерывание таймера1 по переполнению не сбрасывается в данном прерывании, что есть правильно.
Оба варианта примерно одинаковые, иногда один немного лучше, иногда другой.

Больше всего мне режет глаз ошибка из-за которой строки 35/35 и 61/62 не совпадают. Но даже обе эти пары строк неправильные. Первая увеличивает почему-то младшие 16 бит результата, а вторая - средние (!) 16 бит. Когда обе должны увеличивать только старшие 16 бит.

Цитата
Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?
Для этого Найдите форум полных извращенцев smile.gif

По поводу Меги @ 16 я тоже не смог придумать как поднять скорость выше 43 мбит/сек. А 400 было для самого дешёвого АРМа.
singlskv
Цитата(GetSmart @ Oct 21 2006, 05:45) *
Цитата
Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?
Для этого Найдите форум полных извращенцев smile.gif

А в чем проблемма мерить импульсы длительностью от 1 такта ? blink.gif
Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт
другой спад smile.gif

Пошел искать форум полных извращенцев ... biggrin.gif
=GM=
Цитата(defunct @ Oct 20 2006, 20:01) *
Цитата

GetSmart Интересно чем отличается конструкция {sei ; ret} от {iret} ? Если я не ошибаюсь, она только хуже.

Это следствие смены детектора перехода (0-1 или 1-0), чтобы не портить установку. Я сам не очень уверен здесь, хотя делал всё по описанию. Обратите внимание на строчки 25, 26 и 52, 53.

Это от лукавого. В описании точно такого нет. Может быть это из banned курса?
Выход из прерывания - RETI (автоматом взводит флаг I).

Вот цитата из док2467н на атмегу 128, с.119
Measurement of an external signal’s duty cycle requires that the trigger edge is changed after each capture. Changing the edge sensing must be done as early as possible after the ICRn Register has been read. After a change of the edge, the Input Capture flag (ICFn) must be cleared by software (writing a logical one to the I/O bit location). For measuring frequency only, the clearing of the ICFn flag is not required (if an interrupt
handler is used).

Вот до чего додумался. Флаг icf1 очищается при ВХОДЕ в прерывание. При смене edge флаг icf1 опять устанавливается, поэтому его надо очистить программно, чтобы не возникло дополнительного ложного прерывания при выходе из данного. А я-то думал, что флаг icf1 очищается в reti(:-(. Вот так вот, век живи, век учись, дураком помрешь...Если все так, как описано, то можно убрать sei+ret и оставить reti.
=GM=
Хотел ответить в одном сообщении, да больно тематика постов разная(:-).
Цитата(singlskv @ Oct 22 2006, 20:16) *
Цитата(GetSmart @ Oct 21 2006, 05:45) *

Цитата
Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?
Для этого Найдите форум полных извращенцев smile.gif

А в чем проблема мерить импульсы длительностью от 1 такта ? blink.gif
Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт
другой спад smile.gif

Пошел искать форум полных извращенцев ... biggrin.gif

Не надо никуда ходить. Если импульсы идут с периодом в 1 мкс, на втором импульсе ваша система заткнется, не успеет переварить(:-).

А вообще, хочу вас, коллеги, огорчить(:-(. Весь сыр-бор разгорелся из-за вопроса, можно ли измерить секундный интервал с точностью 1 мкс, используя 1МГц атмегу.

Так вот ответ неутешительный: НЕЛЬЗЯ! Максимальная ошибка равна ПЛЮС-МИНУС ОДНА микросекунда, что в итоге составляет 2 мкс. Правы были товарищи, которые говорили нельзя, а мы не поверили коллективному разуму(:-(.
singlskv
Цитата(=GM= @ Oct 23 2006, 15:16) *
Хотел ответить в одном сообщении, да больно тематика постов разная(:-).
Цитата(singlskv @ Oct 22 2006, 20:16) *

Цитата(GetSmart @ Oct 21 2006, 05:45) *

Цитата
Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?
Для этого Найдите форум полных извращенцев smile.gif

А в чем проблема мерить импульсы длительностью от 1 такта ? blink.gif
Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт
другой спад smile.gif

Пошел искать форум полных извращенцев ... biggrin.gif

Не надо никуда ходить. Если импульсы идут с периодом в 1 мкс, на втором импульсе ваша система заткнется, не успеет переварить(:-).

Заметьте, я говорил только про импульсы а не про ИНТЕРВАЛЫ между ними.
Очевидно что такая система заткнется и при интервалах между импульсами в 30-40 тактов,
так как просто не будет успевать обработать полученные данные.
А вот для одиночных импульсов с достаточно большими промежутками между ними,
такая система (с двумя таймерами) вполне работоспособна.

Цитата
А вообще, хочу вас, коллеги, огорчить(:-(. Весь сыр-бор разгорелся из-за вопроса, можно ли измерить секундный интервал с точностью 1 мкс, используя 1МГц атмегу.

Так вот ответ неутешительный: НЕЛЬЗЯ! Максимальная ошибка равна ПЛЮС-МИНУС ОДНА микросекунда, что в итоге составляет 2 мкс. Правы были товарищи, которые говорили нельзя, а мы не поверили коллективному разуму(:-(.

Ну это вообщем-то правда точность действительно +-1 мкс.
GetSmart
Уйду я от вас. ##пые вы :-(

Кто сказал 2 мкс ??? На самом деле для любого изменения состояния ошибка 0..1 мкс. Не может захват сработать раньше прихода строба!!! А вот уже для двух изменений будет +-1. Это именно запрашиваемая точность. И вообще, категоричность - признак ##пости.
=GM=
singlskv Заметьте, я говорил только про импульсы а не про ИНТЕРВАЛЫ между ними.
Очевидно что такая система заткнется и при интервалах между импульсами в 30-40 тактов,
так как просто не будет успевать обработать полученные данные. А вот для одиночных импульсов с достаточно большими промежутками между ними, такая система (с двумя таймерами) вполне работоспособна.


Для пачки (порядка 100-200-300) коротких импульсов время обработки можно снизить до 10 тактов, но это все же не 1 такт(:-(.

GM А вообще, хочу вас, коллеги, огорчить(:-(. Весь сыр-бор разгорелся из-за вопроса, можно ли измерить секундный интервал с точностью 1 мкс, используя 1МГц атмегу. Так вот ответ неутешительный: НЕЛЬЗЯ! Максимальная ошибка равна ПЛЮС-МИНУС ОДНА микросекунда, что в итоге составляет 2 мкс. Правы были товарищи, которые говорили нельзя, а мы не поверили коллективному разуму(:-(.

singlskv Ну это в общем-то правда точность действительно +-1 мкс

Так шта-а, всем учить матчасть(:-). И мне в том числе.
singlskv
Цитата(GetSmart @ Oct 23 2006, 17:09) *
Уйду я от вас. ##пые вы :-(

Кто сказал 2 мкс ??? На самом деле для любого изменения состояния ошибка 0..1 мкс. Не может захват сработать раньше прихода строба!!! А вот уже для двух изменений будет +-1. Это именно запрашиваемая точность. И вообще, категоричность - признак ##пости.

Ну дык я и имел в виду для двух измерений: от фронта до спада точность +-1.


Цитата(=GM= @ Oct 23 2006, 17:10) *
singlskv Заметьте, я говорил только про импульсы а не про ИНТЕРВАЛЫ между ними.
Очевидно что такая система заткнется и при интервалах между импульсами в 30-40 тактов,
так как просто не будет успевать обработать полученные данные. А вот для одиночных импульсов с достаточно большими промежутками между ними, такая система (с двумя таймерами) вполне работоспособна.


Для пачки (порядка 100-200-300) коротких импульсов время обработки можно снизить до 10 тактов, но это все же не 1 такт(:-(.

ИМХО
Для одиночного единичного импульса можно определять длительности от 1 такт, но
с точностью +-1 такт. smile.gif
=GM=
GetSmart Уйду я от вас. ##пые вы :-(

Ну куда вы пойдете, зачем? В пустыню, ##трый вы наш(:-)? Там вам АВР быстро $йца открутит, он всех оттуда распугал, неохота даже заходить(:-)

GetSmart Кто сказал 2 мкс ??? На самом деле для любого изменения состояния ошибка 0..1 мкс. Не может захват сработать раньше прихода строба!!! А вот уже для двух изменений будет +-1. Это именно запрашиваемая точность. И вообще, категоричность - признак ##пости.

Ну я сказал 2 мкс, и что? И не категорично совсем, всё подлежит обсуждению, чтобы все стороны пришли к консенсусу(:-). Вот представьте себе, вам надо отмерить 100 см рейку, а линейка ваша дает точность +-1 см. У вас рейки будут от 99 см до 101 см, т.е. 2 см разницы, так же и во времени, только в микросекундах.

А насчет раньше или позже, возьмите два таймера по singlskv, один фиксирует фронт, другой - спад. Представьте себе вот две ситуации.

1) 100.001 мкс - фронт, 102.999 мкс - спад, измерится как 2 мкс, реальная длина - 3 мкс.

2) 100.999 мкс - фронт, 102.001 мкс - спад, измерится как 2 мкс, реальная длина - 1 мкс.

Как видим, по результату измерения вы НЕ можете сказать, что реальная длина импульса лежит в пределах микросекунды, то есть от 1.5 мкс до 2.5 мкс. Вот и весь фокус.
GetSmart
Цитата(singlskv)
Ну дык я и имел в виду для двух измерений: от фронта до спада точность +-1.

А чего поддакивали?
GetSmart
Цитата(=GM=)
1) 100.001 мкс - фронт, 102.999 мкс - спад, измерится как 2 мкс, реальная длина - 3 мкс.

2) 100.999 мкс - фронт, 102.001 мкс - спад, измерится как 2 мкс, реальная длина - 1 мкс.

Как видим, по результату измерения вы НЕ можете сказать, что реальная длина импульса лежит в пределах микросекунды, то есть от 1.5 мкс до 2.5 мкс. Вот и весь фокус.
Если точность +-1 такт проца, то усё в порядке.

Вы бы лучше поведали нам про 0.5-тактовую точность. Может я бы и остался ещё ненадолго тута.
singlskv
Цитата(GetSmart @ Oct 23 2006, 17:45) *
Цитата(singlskv)
Ну дык я и имел в виду для двух измерений: от фронта до спада точность +-1.

А чего поддакивали?


Кажеться мы сейчас все говорим об одном и том же,
просто возникли непонятки в терминах =GM= считает что 2 такта это точность, но
ИМХО это называется как-то по другому, а точность она всегда +-.
singlskv
Цитата(GetSmart @ Oct 23 2006, 18:00) *
Вы бы лучше поведали нам про 0.5-тактовую точность. Может я бы и остался ещё ненадолго тута.

Присоединяюсь.
Ну даже если Вы поняли что эта идея неосуществима, поделитесь хотя бы
в какую сторону были мысли.
Компаратор ? или что еще ...
=GM=
Цитата(singlskv @ Oct 23 2006, 13:15) *
Цитата(GetSmart @ Oct 23 2006, 18:00) *

Вы бы лучше поведали нам про 0.5-тактовую точность. Может я бы и остался ещё ненадолго тута.

Присоединяюсь.
Ну даже если Вы поняли что эта идея неосуществима, поделитесь хотя бы
в какую сторону были мысли.
Компаратор ? или что еще ...

Да всё просто, как правда(:-). На два таймера подаете один и тот же сигнал, но один таймер считает 0-1, а второй 1-0. Сигнал захвата подаете на два ICU. После захвата анализируете содержимое двух ICU и решаете, где произошел захват, в первой половине такта или во второй, только и всего, а вы говорите точность(:-). Пользуйтесь, не жалко. Идея осуществима и удваивает точность по сравнению с обычным подходом.

Про точность. В обиходе, говоря точность одна единица, подразумевают +-1/2 этой самой единицы. Ну или говорят еще так, точность равна половине цены деления. Это все из одной оперы.

Про время. Точность измерения одна микросекунда означает, что вы сузили рамки неопределенности длины сигнала до +-0.5 мкс. Так как-то. У нас же - в два раза больше.

Кстати, точность не обязательно должна быть симметрична, она может быть -0.8..+0.3 или -0.1..+0.9. В пределе может быть 0..2.
singlskv
Цитата(=GM= @ Oct 23 2006, 19:00) *
Да всё просто, как правда(:-). На два таймера подаете один и тот же сигнал, но один таймер считает 0-1, а второй 1-0. Сигнал захвата подаете на два ICU. После захвата анализируете содержимое двух ICU и решаете, где произошел захват, в первой половине такта или во второй, только и всего, а вы говорите точность(:-). Пользуйтесь, не жалко. Идея осуществима и удваивает точность по сравнению с обычным подходом.

ИМХО, захват всегда происходит в одном и том же месте такта, так что определить все таки
не удастся. А если и удастся, то, если я чего не попутал Вам необходимы как минимум
два импульса АБСОЛЮТНО одинаковой длительности.
Вообщем код в студию, и тогда обсудим...
Цитата
Про точность. В обиходе, говоря точность одна единица, подразумевают +-1/2 этой самой единицы. Ну или говорят еще так, точность равна половине цены деления. Это все из одной оперы.

а что тогда используют для рассчета среднеквадратичного отклонения ?
неужели максимальную ошибку(от минимума до максимума) ?
Цитата
Кстати, точность не обязательно должна быть симметрична, она может быть -0.8..+0.3 или -0.1..+0.9. В пределе может быть 0..2.

-0,8..+0.3 понимаю, в таком случае говорят что абсолютная погрешность не более 0,8 .
0..2 для нашего случая не понимаю, в каком пределе ?
=GM=
=GM= Да всё просто, как правда(:-). На два таймера подаете один и тот же сигнал, но один таймер считает 0-1, а второй 1-0. Сигнал захвата подаете на два ICU. После захвата анализируете содержимое двух ICU и решаете, где произошел захват, в первой половине такта или во второй, только и всего

singlskv ИМХО, захват всегда происходит в одном и том же месте такта, так что определить все таки не удастся. А если и удастся, то, если я чего не попутал Вам необходимы как минимум два импульса АБСОЛЮТНО одинаковой длительности.

Вот не хотите думать(:-). Для первой половины такта в счетчике1 будет, скажем, 105, а в счетчике2 будет пока еще 104, для второй половины такта в счетчике1 будет, скажем, 105, а в счетчике2 будет тоже 105...Ощутите разницу(:-).

singlskv а что тогда используют для расчета среднеквадратичного отклонения? неужели максимальную ошибку(от минимума до максимума)?

СКО=КвКОРЕНЬ (СУММА((Xi-Xсреднее)^2)/(N-1))), i =1,2,...,N. По результатам одного измерения СКО не определяется. Число N должно быть большим, 50-100 и выше. Чем больше, тем лучше, зависит от задачи, конечно.

singlskv -0,8..+0.3 понимаю, в таком случае говорят что абсолютная погрешность не более 0,8...2 для нашего случая не понимаю, в каком пределе?

Для нашего случая максимальная погрешность 2 мкс.

Вот еще пример. Вы знаете, что был такой калибр у контролеров ОТК. Например, одна рамка должна пропускать деталь, скажем, поршень двигателя Жигуля, а вторая - нет. Ну и допуск будет такой 84.0-84.05 (вгрубе, не помню точно). Какая будет точность измерения? +-0.025 или все же 0.05?
singlskv
Цитата(=GM= @ Oct 23 2006, 20:40) *
=GM= Да всё просто, как правда(:-). На два таймера подаете один и тот же сигнал, но один таймер считает 0-1, а второй 1-0. Сигнал захвата подаете на два ICU. После захвата анализируете содержимое двух ICU и решаете, где произошел захват, в первой половине такта или во второй, только и всего

singlskv ИМХО, захват всегда происходит в одном и том же месте такта, так что определить все таки не удастся. А если и удастся, то, если я чего не попутал Вам необходимы как минимум два импульса АБСОЛЮТНО одинаковой длительности.

Вот не хотите думать(:-). Для первой половины такта в счетчике1 будет, скажем, 105, а в счетчике2 будет пока еще 104, для второй половины такта в счетчике1 будет, скажем, 105, а в счетчике2 будет тоже 105...Ощутите разницу(:-).

про 104/105 понял, но остались вопросы, приведите код, тогда и обсудим....
Цитата
singlskv а что тогда используют для расчета среднеквадратичного отклонения? неужели максимальную ошибку(от минимума до максимума)?

СКО=КвКОРЕНЬ (СУММА((Xi-Xсреднее)^2)/(N-1))), i =1,2,...,N. По результатам одного измерения СКО не определяется. Число N должно быть большим, 50-100 и выше. Чем больше, тем лучше, зависит от задачи.

Не, ну конечно спасибо за ликбез. но если Вы не заметили, то среднеквадратичное
отклонение зависит только от абсолютного отклонения smile.gif
Цитата
ssinglskv -0,8..+0.3 понимаю, в таком случае говорят что абсолютная погрешность не более 0,8.
0..2 для нашего случая не понимаю, в каком пределе?
Цитата

Для нашего случая максимальная погрешность 2 мкс.


ну давайте назовем это максимальным размахом погрешности smile.gif, тогда да, 2 такта.... biggrin.gif
defunct
Цитата(=GM= @ Oct 23 2006, 19:40) *
Цитата
singlskv ИМХО, захват всегда происходит в одном и том же месте такта, так что определить все таки не удастся. А если и удастся, то, если я чего не попутал Вам необходимы как минимум два импульса АБСОЛЮТНО одинаковой длительности.


Вот не хотите думать(:-). Для первой половины такта в счетчике1 будет, скажем, 105, а в счетчике2 будет пока еще 104, для второй половины такта в счетчике1 будет, скажем, 105, а в счетчике2 будет тоже 105...Ощутите разницу(:-).

Вот именно... не хотите думать...
Говорят же, захват происходит в один и тот же момент времени для обоих таймеров, следовательно оба таймера покажут одинаковый рез-тат.
Хотите "полутакт" определить - поставьте внешний D-триггер, D вход к XTAL2, C вход - к входному сигналу, т.о. в этот триггер защелкнется "полутакт".
Только нафиг оно нужно?! если повысить разрешающую способность во времени можно просто увеличив тактовую, (тем паче запас есть).
=GM=
Цитата(defunct @ Oct 23 2006, 20:38) *
Вот именно... не хотите думать...
Говорят же, захват происходит в один и тот же момент времени для обоих таймеров, следовательно оба таймера покажут одинаковый рез-тат.
Хотите "полутакт" определить - поставьте внешний D-триггер, D вход к XTAL2, C вход - к входному сигналу, т.о. в этот триггер защелкнется "полутакт".
Только нафиг оно нужно?! если повысить разрешающую способность во времени можно просто увеличив тактовую, (тем паче запас есть).

Ну голубчик defunct, ну подумайте сами. Да, захват происходит (и должен происходить!) в один и тот же момент времени для обоих таймеров, но СОДЕРЖИМОЕ таймеров различается, поскольку на оба таймера подается один и тот же сигнал, но первый таймер инкрементируется на переходах 0-1, а второй будет инкрементироваться на переходах 1-0. Ну а раз содержимое различается, захват это должен показать!

Зачем и кому это нужно. Скажем, я хочу получить минимально возможную погрешность. Ставлю максимальную частоту 16 МГц и получаю пресловутые 2 такта погрешности, т.е. 2/16 мкс. А я хочу получить 1/16 мкс. Приведенный мной метод позволяет УДВОИТЬ точность, используя то же самое оборудование, что на мой взгляд выгодно.
GetSmart
Цитата(=GM=)
Ну голубчик defunct, ну подумайте сами. Да, захват происходит (и должен происходить!) в один и тот же момент времени для обоих таймеров, но СОДЕРЖИМОЕ таймеров различается, поскольку на оба таймера подается один и тот же сигнал, но первый таймер инкрементируется на переходах 0-1, а второй будет инкрементироваться на переходах 1-0. Ну а раз содержимое различается, захват это должен показать!
А вот я не догоняю. Наверно мы с defunct оба не догоняем. Если сигнал меняется один раз, то будет только один переход 1-0 (либо 0-1) и сработает только один таймер. второй не изменится. Если второй не изменится, значит точности он не добавит к обычной 1-микросекундной. Что дальше? Где собака зарыта?
=GM=
Цитата(GetSmart @ Oct 24 2006, 10:03) *
А вот я не догоняю. Наверно мы с defunct оба не догоняем. Если сигнал меняется один раз, то будет только один переход 1-0 (либо 0-1) и сработает только один таймер. второй не изменится. Если второй не изменится, значит точности он не добавит к обычной 1-микросекундной. Что дальше? Где собака зарыта?

Ну давайте догонять вместе(:-). Забудьте на время об атмеге. Обсудим идею. У вас есть два 16-битных таймера, на которые подан меандр заполнения частотой 1 МГц. Если оба таймера настроены на перепад 0-1, то таймеры будут инкрементироваться фронтами данного меандра синхронно, согласны?

Пойдем дальше, настроим второй таймер на перепад 1-0, что мы увидим? Мы увидим, что содержимое первого таймера будет обновляться, скажем, в периоды 100.0, 101.0, 102.0 и т.д., а содержимое второго таймера будет обновляться в периоды 100.5, 101.5, 102.5 и т.д., поскольку они реагируют на фронты и спады одного и того же меандра, согласны?

Теперь представьте себе, что у вас есть спецустройство, позволяющее считывать одновременно показания обоих счетчиков. Скажем, устройство сработало в момент времени 101.1. Время таймера1 будет 101, а таймера2 - 100. Если устройство сработало в момент времени 101.7, то время таймера1 будет 101, и таймера2 - 101, согласны? Т.е. два числа 101/100 говорят о том, что захват произошел в первой половине меандра, 101/101 - во второй. Ну или еще проще, младший бит содержимого второго таймера показывает первую (1) или вторую (0) половину меандра.

Обратите внимание, таймеры/счетчики срабатывают от разных перепадов сигнала заполнения, а схемы захвата - от одного типа перепада исследуемого сигнала.

Теперь перенесите все рассуждения на МК, с учетом его дискретного времени. Спецустройство легко сделать на МК, у которого есть два устройства захвата. Надо только подать на них один и тот же исследуемый сигнал.
GetSmart
Ну дык это-то я понял, только внутри МК это неосуществимо. Какого чёрта вы тут мозги пудрите? Вам что, доставляет удовольствие лапшу на уши вешать? Это можно сделать только внешней схемой. Ни один микроконтроллер так извращаться не умеет. Зачем было так долго нагонять туман? Опять одно забалтывание! Когда будет результат? Вы пытаетесь заработать авторитет пустыми фразами, которые не работают. Я не спорю, что Вы пытаетесь думать. Но... Результата нет от Вас уже давно! Одно разочарование.
singlskv
Цитата(=GM= @ Oct 24 2006, 14:13) *
Да, захват происходит (и должен происходить!) в один и тот же момент времени для обоих таймеров, но СОДЕРЖИМОЕ таймеров различается, поскольку на оба таймера подается один и тот же сигнал, но первый таймер инкрементируется на переходах 0-1, а второй будет инкрементироваться на переходах 1-0. Ну а раз содержимое различается, захват это должен показать!

=GM=
Вы просто не понимаете как происходит инкремент таймера и захват.
1. захват на таймерах происходит в один и тот же момент времени такта
2. инкремент таймеров происходит тоже в один и тот же момент вне зависимости
от того что мы ловим фронт или спад.
Когда ловим фронт мк просто сравнивает текущее значение со значением полученным
в прошлом такте и если было 0 а стало 1 то происходит захват, со спадом аналогично.
=GM=
singlskv Вы просто не понимаете как происходит инкремент таймера и захват.
1. захват на таймерах происходит в один и тот же момент времени такта
2. инкремент таймеров происходит тоже в один и тот же момент вне зависимости
от того что мы ловим фронт или спад.
Когда ловим фронт мк просто сравнивает текущее значение со значением полученным
в прошлом такте и если было 0 а стало 1 то происходит захват, со спадом аналогично.


Да понимаю я все прекрасно. Вы описываете все для таймеров, а я собирался их использовать как счетчики, с внешним входом.

Похоже по технике все сказано, по-моему пора прикрывать ветку. С вашего позволения,

ТЕМА ИСЧЕРПАНА, ЗАКРЫТА, ПОД СУКНО ПОЛОЖЕНА(:-).
singlskv
Цитата(=GM= @ Oct 24 2006, 20:32) *
singlskv Вы просто не понимаете как происходит инкремент таймера и захват.
1. захват на таймерах происходит в один и тот же момент времени такта
2. инкремент таймеров происходит тоже в один и тот же момент вне зависимости
от того что мы ловим фронт или спад.
Когда ловим фронт мк просто сравнивает текущее значение со значением полученным
в прошлом такте и если было 0 а стало 1 то происходит захват, со спадом аналогично.


Да понимаю я все прекрасно. Вы описываете все для таймеров, а я собирался их использовать как счетчики, с внешним входом.

Ну тогда прочитайте вот это из datasheet:
If external pin modes are used for the Timer/Countern, transitions on the Tn pin will
clock the counter even if the pin is configured as an output. This feature allows software
control of the counting.


и попробуйте понять, что это означает что инкремент счетчика таймера происходит не
в момент когда произошел переход из 0->1 или 1->0 а в какой-то четко определенный
момент такта во второй его половине.
Почему во второй ? А потому что задержка вывода на пин 1,5 такта.

Так что желаю Вам удачной ловли по пол такта, как поймаете, телеграфируйте
нам, отметим cheers.gif
demaven
Уважаемые, как бы вы не изгалялись, используя кварц на 1 Мгц даже 10 микросекундный импульс нельзя измерить с точностью 1 микросекунда. Измерение ВСЕГДА будет не точнее плюс-минус единица младшего разряда кванта измерения, а это уже больше, чем дозволено. Неужели этому не научили на самых первых лабораторных работах по физике? Проведи хоть тысячу измерений - выше разрешающей способности измерителя не прыгнешь, количество измерений позволяет уменьшить случайную ошибку, а не аппаратную. 30 лет назад нам это усердно вдалбливали и доходчиво объясняли
Коляй
Приветствую, друзья. Кто может рассказать тупо на пальцах как мне посчитать периоды импульсов на авр 2313 с кварцем 8 мгц? А то сил уже нет никаких. Надо считать 100 периодов частоты в диапазоне от 1 до 4 кгц. Я раньше делал через INT0. В этом прерывании запускал таймер 1, отсчитывал 100 прерываний,останавливал таймер, помещал и сдвигал влево на 16 дополнительный виртуальный регистр таймера1 OverfLow, прибавлял текущий таймер1, вычитал ошибку и выводил на ЖКИ. Т.е. с первого прерывания Т1 запускался и крутился до конца измерений, до сотого прерывания, не забывая при переполнении в другом прерывании инкриминировать дополнительный виртуальный регистр OverfLow. Всё в принципе нормально работало, но показания немного плавали. Потом на телесистемах какой то аквариум сказал что интервалы надо мерить через захват, а через INT никто не мерит, потому что точности не будет. ВОт тут то я и уселся. ВОбщем делаю так: после нажатия кнопки измерения, очищаю все переменные, запускаю таймер1, разрешаю прерывания по захвату и ухожу на паузу 0,2мс (на всякий случай). В обработчике прерываний по захвату очищаю таймер1, отсчитываю 101 прерывание. Первое пропускаю, со второго прибавляю каждый раз в переменную. В 101-м очищаю счетчик прерываний, прибавляю захват в переменную, запрещаю прерывание по захвату. После окончания паузы вывожу результат на ЖК. Виртуальный регистр и прерывание по переполнению Т1 вообще не использую, т.к. максимальный интервал 8000 укладывается в таймер1. Флаги тоже никакие не трогаю. Так вот при таком подходе показания вообще скачат чуть ли не на треть. Что делаю неправильно? Коды уж пока не привожу, они уже перелопачены раз 100. Спасибо.
Коляй
Всё, уже не надо. Заработало. Флаг пришлось проверять в прерывании. Спс...
Чего то в верхнем сообщении нет кнопики "Edit", а то отредактировал бы верхнее или вообще удалил.
Коляй
Хм, однако не всё так радужно оказалось. Я измеряю частоту 1 кгц за время около 250 мс, у меня получается число 3008756. Оно плавает от 3004... до 3010.... что как то кривовато. Так ведь не должно быть!? Посмотрите плз код, скорее я где то в коде накосячил или с флагами запутался. Прерываний других нет. Кварц на 12 мгц. Мне хотя бы разрешение 1 мкс надо. Все вычисления округления потом, сначала надо стабильного числа добиться. Спасибо.
Код
void FMeasure (void)  
{
  unsigned int Cnt;

  ClkCount = 0;            // очистить результат измерения периодов
  ImpulsCount = 0;         // очистить счетчик прерываний
  TCNT1 = 0;               // очистить таймер1
  Cnt = 0;                 // очистить счетчик
  TimerStart;              // запустить таймер1
  TIMSK |= (1 << ICIE1);   // Разрешено прерывание по захвату
  
    
    while(Cnt<300)  // цикл 0,25 с кварц 12 мгц
    {
        Cnt++;
        pausa(1000);  // 0,25 с
    }
  
  TimerStop;               // остановить таймер1
  TIMSK &= ~(1 << ICIE1);  // запретить прерывание по захвату
  ................................
  LCD_Goto(0x42);               // вывод на ЖКИ
  bin_bcd(ClkCount);
  ................................
  ................................

#pragma vector=TIMER1_CAPT_vect // Прерывание по захвату
__interrupt void zachvat (void)
{
  if(!(TIFR && ICF1))                   // проверяем флаг захвата
  {
   static unsigned int OldClkCount; //
   unsigned int NewClkCount;        //
                
        if (++ImpulsCount == 1)       // если счетчик прерываний инкриминировался первый раз
            OldClkCount = ICR1;    // сохранение первого захваченного значения
        else
        {
            NewClkCount = ICR1;   // новое захваченное значение
            ClkCount +=(NewClkCount-OldClkCount); //
            OldClkCount = NewClkCount; //
        }
          
  }    

   TIFR |= (1 << ICF1); // очистить флаг захвата
}
akl
Здравствуйте.
Вы, ИМХО, не учитываете предисторию. Ведь входной сигнал во время обработки результата может устанавливать флаг ICF, который при входе в программу измерения не чистится.
Сделал бы так
-запретил работу таймера, очистил его, все счетчики
-разрешил, при остановленном! таймере прерывания по захвату и переполнению
-очистка флагов и глобальное разрешение прерываний
* ждем
-пришел захват, запускается таймер
-проверяется 46 переполнений таймера(~250мсек), если период измерения не закончен-на *, иначе чтение содержимого ICR, запрет счета таймера, прерываний и выход
Коляй
Приветствую Вас. Флаг сбрасывал конечно в начале перед разрешением прерывания по захвату, удалил строчку случайно когда код вставлял. По моему со стеком проблема. Числа то большие а камешек посредственный 2313. Видимо из-за этого и показания разные пару раз правильно покажет, раз криво а то и несколько раз подряд или наоборот. Спасибо.
Во, Мегу приделал вроде хорошо зафурычило. После всех вычислений (измерение и суммирование 255 импульсов с периодом 1мс с последующим делением на 255) получается 4-х значное число с ошибкой единица. Вроде хорошо теперь.
ae_
Цитата(Коляй @ May 29 2010, 04:00) *
... После всех вычислений (измерение и суммирование 255 импульсов с периодом 1мс с последующим делением на 255) получается 4-х значное число с ошибкой единица. Вроде хорошо теперь.

Вместо деления на 255 будет быстрее суммировать 256 значений и отбрасывать младший байт результата summa>>8
Коляй
А там число 255 разное от входной частоты зависит, на 2 кгц оно уже 520 и т.д. так что просто в конце делится на эту переменную. Измерения не непререрывно происходят, а только один раз, если кнопка нажималась.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.