|
Измерение временных интервалов, с высокой точностью |
|
|
|
 |
Ответов
|
Oct 9 2006, 13:35
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Забавно. На этой странице всех повело совсем не в ту степь, о которой тема. Это как дайте кому-нить палец, дак он и всю руку оттяпает. Сам AVR пропал куда-то чтобы разъяснить, но в его вопросе нет слов о стабильности кварцев, а значит этот критерий точности не рассматривается. Есть слова о проце AVR и о 16 битном таймере. Если обращать внимание на них, то ответ уже давно дан положительный. Причём в условиях задачи это получается максимально возможная точность устройства, ну как 10-битный АЦП, у которого реальная точность всегда поменьше 10 бит из-за разных причин. То же и здесь. В силу разного времени прихода фронтов на шкале 1 мкс запросто может возникнуть "ошибка" вплоть до 1 мкс, от которой в данной схеме никак не избавиться. А вот всякие разговоры о точности и стабильности кварцев только дискредитируют авторов и вообще на мой взгляд какое-то балоболство.
=GM= Причём тут кратковременная нестабильность в 1Е-9..1Е-12, если долговременная будет в 10000 раз хуже? Автоподстройки здесь нет и кратковременная нестабильность не спасает. А вообще, точность кварца при изготовлении наверно 1Е-4 и все разговоры о температурной и прочей нестабильности - бред какой-то.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 9 2006, 13:59
|

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

|
Цитата(singlskv @ Oct 7 2006, 09:37)  Подправил немного код GetSmart и defunct- добавил сохранение SREG в прерываниях - добавил сброс флага TOV1 в TIFR если делали коррекцию Код .def AL = R24 .def Const0 = R8 .def Const1 = R9 .def _Sreg = R10 .... ldi AL, 1 mov Const1, AL clr Const0 ...
; обработчик Input Capture: TIM1_CAPT: in _Sreg,SREG in R4, ICR1L in R5, ICR1H tst R5 brne _do_not_correct_result in AL, TIFR andi AL, (1 << TOV1) breq _do_not_correct_result out TIFR, AL add R2, Const1 adc R3, Const0 _do_not_correct_result: mov R6, R2 mov R7, R3 out SREG,_Sreg ; <-- 32-х битный результат в четверке регистров R7-R6-R5-R4 (MSB R7) reti
; обработчик Timer Overflow: TIM1_OVF: in _Sreg,SREG add R2, Const1; Инкрементировать старшие 16 бит 32-х битного счетчика adc R3, Const0; учет переноса. out SREG,_Sreg reti Хочу немного покритиковать программу. 1) От возникновения прерывания захвата до команды "in AL,TIFR" может пройти от 12 до 15 МЦ, т.е. достаточно много времени, чтобы произошел перенос от переполнения, следовательно, возможна ошибка в определении времени. 2) Вполне возможно, что если прерывания TIM1_OVF и TIM1_CAPT возникли в течение указанного периода, то прерывание TIM1_OVF выполнится после TIM1_CAPT и ПОВТОРНО скорректирует результат в r3-r2 (не уверен на все 100, надо проверять). 3) Вход в прерывание TIM1_CAPT означает конец интервала измерения и наличие правильного времени в r5-r4 за исключением возможного последнего переноса. Но поскольку перенос из r5-r4 в r7-r6 возможен в одном единственном случае, когда содержимое r5-r4 переходит из состояния 0xFFFF в 0x0000, содержимое регистров r5-r4 надо проверять на 0. В соответствии со сказанным ниже приведена исправленная программа обработки. Код .def temp =r16 .def savreg =r10
; обработчик Input Capture: TIM1_CAPT: in savreg,SREG in R4,ICR1L ;точные два младших in R5,ICR1H ;байта времени movw r6,r2 ;два старших байта времени mov temp,r4 ;с возможным переносом or temp,r5 ;во время захвата brne nocarry ;не было переноса subi r6,-1 ;учтем sbci r7,-1 ;перенос nocarry: out SREG,Sreg reti
; обработчик Timer Overflow: TIM1_OVF: in savreg,SREG subi r2,-1 ; sbci r3,-1 ; out SREG,savreg reti Ну и последнее, в подобных случаях предпочитаю использовать конструкцию Код subi r2,-1 ; sbci r3,-1 ; Вместо эквивалентной Код add R2,сonst1 ; adc R3,сonst0 ; что очевидно лучше, поскольку освобождаются два регистра сonst0 и сonst1.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 9 2006, 16:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 9 2006, 17:59)  Хочу немного покритиковать программу.
1) От возникновения прерывания захвата до команды "in AL,TIFR" может пройти от 12 до 15 МЦ, т.е. достаточно много времени, чтобы произошел перенос от переполнения, следовательно, возможна ошибка в определении времени. Вы не учли вот эту проверку: Код in R5, ICR1H tst R5 brne _do_not_correct_result которая происходит перед "in AL, TIFR" Цитата 2) Вполне возможно, что если прерывания TIM1_OVF и TIM1_CAPT возникли в течение указанного периода, то прерывание TIM1_OVF выполнится после TIM1_CAPT и ПОВТОРНО скорректирует результат в r3-r2 (не уверен на все 100, надо проверять). Вот это помагает избежать данной проблеммы: Код out TIFR, AL Цитата 3) Вход в прерывание TIM1_CAPT означает конец интервала измерения ... или начало .... Ну например если мы хотим измерять длительность единичного импульса на входе. Цитата Ну и последнее, в подобных случаях предпочитаю использовать конструкцию Код subi r2,-1 ; sbci r3,-1 ; Вместо эквивалентной Код add R2,сonst1 ; adc R3,сonst0 ; что очевидно лучше, поскольку освобождаются два регистра сonst0 и сonst1. subi на регистрах R0-R15 ?! ню...ню...
|
|
|
|
|
Oct 9 2006, 20:15
|

Местный
  
Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986

|
Цитата Ну и последнее, в подобных случаях предпочитаю использовать конструкцию Код subi r2,-1 ; sbci r3,-1 ; А не так, случайно: Код subi r16,low(-1) sbci r17,high(-1) Просто повезло, что в -1 младший и старший байты равны. но писать так не следует.
Сообщение отредактировал Леонид Иванович - Oct 9 2006, 20:16
--------------------
|
|
|
|
Сообщений в этой теме
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    =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 GetSmart Цитата(=GM=)Автор топика намеревался измерять длит... Oct 11 2006, 16:25 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 =GM= Цитата(singlskv @ Oct 11 2006, 15:06) Цит... Oct 12 2006, 09:31  defunct Цитата(=GM= @ Oct 12 2006, 12:31) А недав... Oct 15 2006, 02:25   =GM= Цитата(defunct @ Oct 15 2006, 01:25) Что ... Oct 16 2006, 13:06    defunct Цитата(=GM= @ Oct 16 2006, 16:06) Я и не ... Oct 18 2006, 11:44     =GM= Цитата(defunct @ Oct 18 2006, 10:44) Зате... Oct 18 2006, 14:14      defunct Цитата(=GM= @ Oct 18 2006, 17:14) хотя ко... Oct 18 2006, 16:04      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
|
|
|