Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: arm lpc2132 как замерить время?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
yzhastik
как в программе определить разницу времени между двумя моментами? (порядки около микросекунд)
rezident
Использовать таймер? laughing.gif
yzhastik
Цитата(rezident @ Dec 20 2010, 23:47) *
Использовать таймер? laughing.gif


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

заранее спасибо!
rezident
Я конечно тоже извиняюсь, а самостоятельно найти примеры на сайте производителя (NXP) или на сайте компиляторописателя (Keil) вы не пробовали?
Sample Code Bundle for LPC213x/LPC214x Peripherals using Keil's MDK-ARM
LPC2100 Insider's Guide Example Programs
yzhastik
Цитата(rezident @ Dec 21 2010, 02:20) *
Я конечно тоже извиняюсь, а самостоятельно найти примеры на сайте производителя (NXP) или на сайте компиляторописателя (Keil) вы не пробовали?
Sample Code Bundle for LPC213x/LPC214x Peripherals using Keil's MDK-ARM
LPC2100 Insider's Guide Example Programs


большое спасибо!
я честно и долго искал (на обоих на сайтах в том числе), но ничего подобного не находил, вероятно изза невнимательности...
Danis
Цитата(yzhastik @ Dec 20 2010, 22:16) *
как в программе определить разницу времени между двумя моментами? (порядки около микросекунд)


Если есть 2-х канальный осциллограф, то можно и без таймеров посмотреть. Например, при запуске/прохождении первого и второго «момента» инвертировать некий пин МК.
yzhastik
оказалось что никакой из вышеуказанных хелпов мне не помог...
переформулирую:
мне важно численно знать сколько времени прошло между двумя моментами

то есть если бы я писал прогу в обычном С, я бы сделал так:
Код
time_t t1;
double times;
t1 = time(NULL);
// чтото делаю
times = difftime(time(NULL),t1);
// потом этот times дальше использую


а как мне сделать тоже самое только в этом C?

PS это все мне нужно для лабораторной работы (я студент), так что у меня нет ничего кроме среды mVision
rezident
Для определения длительности временного промежутка достаточно взять разность значений между двумя интересующими событиями. Запустите таймер и считывайте значения его счетчика в интересующие вас моменты времени. Для вычисления промежутка времени достаточно взять беззнаковую разность этих значений, поделив ее на тактовую частоту таймера. (T2-T1)/Fclk. Где T1 это значение счетчика таймера в момент времени t1, а T2 соответствующее значение в момент времени t2 (t2 ≥ t1), Fclk - частота тактирования таймера в Гц. Максимальный промежуток времени при этом ограничивается периодом переполнения счетчика таймера. Для расширения диапазона отсчета временных интервалов можно увеличить разрядность счетчика программно. Для этого нужно разрешить прерывания от переполнения таймера и при возникновении этого прерывания инкрементировать некую переменную (назовем ее, например, TimerOVF). Тогда временные промежутки будут вычисляться как ((TimerOVFT2+T2)-(TimerOVFT1+T1))/Fclk, где TimerOVFT1, T1 и TimerOVFT2, T2 значения переменной и счетчика таймера соответственно в моменты времени t1 и t2.
toweroff
Цитата(rezident @ Dec 21 2010, 19:10) *
Для определения длительности временного промежутка достаточно взять разность значений между двумя интересующими событиями. Запустите таймер и считывайте значения его счетчика в интересующие вас моменты времени. Для вычисления промежутка времени достаточно взять беззнаковую разность этих значений, поделив ее на тактовую частоту таймера. (T2-T1)/Fclk. Где T1 это значение счетчика таймера в момент времени t1, а T2 соответствующее значение в момент времени t2 (t2 ≥ t1), Fclk - частота тактирования таймера в Гц. Максимальный промежуток времени при этом ограничивается периодом переполнения счетчика таймера. Для расширения диапазона отсчета временных интервалов можно увеличить разрядность счетчика программно. Для этого нужно разрешить прерывания от переполнения таймера и при возникновении этого прерывания инкрементировать некую переменную (назовем ее, например, TimerOVF). Тогда временные промежутки будут вычисляться как ((TimerOVFT2+T2)-(TimerOVFT1+T1))/Fclk, где TimerOVFT1, T1 и TimerOVFT2, T2 значения переменной и счетчика таймера соответственно в моменты времени t1 и t2.

а вход-выход в п/п обработки прерывания не внесет еще бОльшие погрешности, чем 1/Fclk ? хотя.. такты входа-выхода можно и посчитать, наверное
rezident
Цитата(toweroff @ Dec 21 2010, 21:19) *
а вход-выход в п/п обработки прерывания не внесет еще бОльшие погрешности, чем 1/Fclk ? хотя.. такты входа-выхода можно и посчитать, наверное
LPC2132 может работать на частоте до 60МГц, а топикстартеру нужно временное разрешение в единицы мкс. Запас по разрешающей способности больше, чем на порядок.
toweroff
Цитата(rezident @ Dec 21 2010, 19:33) *
LPC2132 может работать на частоте до 60МГц, а топикстартеру нужно временное разрешение в единицы мкс. Запас по разрешающей способности больше, чем на порядок.

вот что значит невнимательность sm.gif
я как-то сразу начал думать в сторону порядков CCLK
yzhastik
rezident, спасибо за методику!

но тем не менее как это сделать в программе до сих пор непонятно (как инициализировать, как считывать значения...)
хелпы разбераю, но переправить под себя не могу... может кому нибудь не лень будет написать готовый код за большое спасибо? sm.gif
esaulenka
Цитата(yzhastik @ Dec 21 2010, 18:49) *
я писал прогу в обычном С, я бы сделал так:

Ой-ой. Это у нас теперь "обычный Си"? А господин Керниган в курсе? sm.gif

Цитата(yzhastik @ Dec 21 2010, 21:05) *
кому нибудь не лень будет написать готовый

Лень. И в воспитательно-методических целях вредно sm.gif
Раздел про таймеры юзер мануала придётся всё-таки прочитать. Если догадаться, что match и capture в данном случае не нужны совсем, читать придётся меньше десятка страниц.

Лучше я расскажу методику № 2.

Настраиваем таймер, чтобы он инкрементировался каждую микросекунду. Запускаем.
Перед стартом измеряемой функции запоминаем значение счётчика таймера, а по окончанию - вычитаем запомненное значение из текущего. Готово!

Вариант имеет плюс - прерывание по переполнению не нужно, можно мерять весьма короткие интервалы, и минус - насколько мне известно, поведение арифметических действий при переполнении в стандарте Си не оговорена.
В данном конкретном случае всё хорошо, если счётчик таймера и переменная для сохранения - беззнаковые, одинаковой разрядности (для LPC2132 - unsigned long).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.