Перейти к содержанию
    

Измерение временных интервалов

Затем, что прерывание может произойти именно в момент вычитки значения, и мы можем прочитать недостоверные данные.

 

Если же рез-тат будет храниться в 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 (с возможной коррекцией), т.к. экономятся регистры и быстрее работает. Ну и никаких других прерываний, измерение интервалов само по себе ответственное дело(:-).

 

Учить матчасть :)

Согласен, учить не вредно (хотя конкретно здесь сказано вами не к месту). Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза!

 

Кстати, почему никто не отвечает на вопрос что требуется измерение длины импульса (фронт и спад), а не периода (два фронта или два спада)? Все согласны что ли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как-то вы несистемно подходите к задаче измерения интервалов.
А вы типа полный системщик. Тут вам предложили просто наброски проги с самыми сложными местами. Базару нет - её можно улучшить под конкретную задачу. Похоже только вам здесь хочется её воплотить в железе. Делайте. Напишите и выложите тут свою прогу, а мы её дружно покритикуем. Даже поможем улучшить. А то ведь вы порой бревна в глазу не замечаете. Так что будет интересно и нам и вам. А может даже весело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хотя конкретно здесь сказано вами не к месту

Вам виднее.

 

 

Кстати, почему никто не отвечает на вопрос что требуется измерение длины импульса (фронт и спад), а не периода (два фронта или два спада)? Все согласны что ли?

Потому что это уже косметика.

 

Если вы согласны с этим, то какая разница откуда писать в буфер? Из r7-r6-r5-r4, или из r7-r6-icr1h-icr1l, или из r3-r2-icr1h-icr1l?

Разница огромная.

Я предпочту запретить прерывания и прочитать достоверное значение из защищенного от изменений буфера. После чего, разрешив прерывания, будет выполнено обновление переменной и т.д. Этим я обезопашу себя и вас от дурацких вопросов в будущем - "окуда появилось это значение". Вы же со своей реализацией и вычиткой icr от таких вопросов ничем не застрахованы, если Вам с вашим системным подходом до сих пор не ясна проблема, то я попробую озвучить ее прямым текстом:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

defunct

Любопытная вещь. Это я где-то уже видел и проверил для АВРов. Там есть временный регистер для защёлкивания старших 8 бит при чтении младших. То бишь читая младший, а затем старший регистр гарантированно прочитается цельное значение.

 

=GM=

Читать ICR1L и ICR1H по-любому придётся вначале в регистры. Там же проверка стоит старшего байта. Ну а потом прямо в прерывании можно вычитать все 4 байта из предыдущих 4 байт и сувать куда-нибудь. Например в кольцевой буфер в ОЗУ. R6 и R7 можно будет не использовать. Но вообще, особой выгоды в экономии и нет. Лишь бы правильно работала. Апосля можно переключать полярность защёлкивания и желлательно сразу проверить полярность на входе.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза!

Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца.

 

То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта

процессора, который измеряет этот временной интервал ?

 

Ну поделитесь кодом, что ли. :a14:

 

Если это know-how, и Вы собираетесь на этом заработать, то тогда

скажите как будет выглядеть возвращаемое значение вашего измерения

например для промежутков 50тактов 50,5тактов 51тактов и т.д.....

Мы, как Ваши потенциальные клиенты должны (перед покупкой Вашего алгоритма)

знать какие выходные данные мы получим.

С нетерпением жду Ваших ответов :)

 

P.S. Нельзя ли модернизировать Ваш алгоритм для получения 1/16 такта процессора,

очень надо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как-то вы несистемно подходите к задаче измерения интервалов.
А вы типа полный системщик. Тут вам предложили просто наброски проги с самыми сложными местами. Базару нет - её можно улучшить под конкретную задачу.

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

Похоже только вам здесь хочется её воплотить в железе. Делайте. Напишите и выложите тут свою прогу, а мы её дружно покритикуем. Даже поможем улучшить. А то ведь вы порой бревна в глазу не замечаете. Так что будет интересно и нам и вам. А может даже весело.

Да не хочется мне ее воплощать. Меня интересуют потенциальные возможности аврок. Единственное рациональное зерно, до которого я допер в результате долгой дискуссии - это возможность измерения времени импульса с точностью ПОЛТАКТА процессора, в нашем случае - 0.5 мкс.

Ну а чтобы было веселее, вот моя прога. Критикуйте на здоровье. Улучшайте. Сразу скажу, прога сырая, я ее не проверял, есть два сомнительных места, надеюсь, с помощью коллективного разума разрешим их.

; В регистрах r23-r22-r21-r20 размещается время спада импульса
; В регистрах r19-r18-r17-r16 размещается время фронта импульса
; Регистровая пара X – два старших байта текущего времени
; Регистровая пара Y – текущий указатель в buffer (0х0100-0х01FF)
; Регистровая пара Z – переключатель фрагментов программы захвата

           .dseg                 ;01
buffer:    .org   0x0100         ;02
           .cseg                 ;03
           .org   0x0016         ;04 обработчик захвата1
tim1capt:  ijmp                  ;05 переключатель
           .org   0x001С         ;06 обработчик переполнения1
tim1ovf:   rjmp   overflow1      ;07

;<< фрагмент программы инициализации >>
;. . . . . . . .
           ldi    zl,low(rising) ;10
           ldi    zh,high(rising);11
           ldi    r16,0x00       ;12 захват по спаду
           mov    r15,r16        ;13
           ldi    r16,0x20       ;14 сброс ICF1
           mov    r14,r16        ;15
           ldi    r16,0x40       ;16 захват по фронту
           mov    r13,r16        ;17
;. . . . . . . .
;<< конец фрагмента программы инициализации >>
;
           .org   0x0100         ;22
rising:    in     r16,ICR1L      ;24 обработка фронта
           in     r17,ICR1H      ;24
           out    tccr1b,r15     ;25
           out    tifr,r14       ;26
           movw   r18,r26        ;27 r19-r18-r17-r16
           in     r10,SREG       ;28
           cpi    r17,0x00       ;29
           brne   ris1           ;30
           in     r24,tifr       ;31
           sbrs   r24,tov1       ;32
           rjmp   ris1           ;33
           subi   r16,low(-1)    ;34
           sbci   r17,high(-1)   ;35
ris1:      ldi    zl,low(falling);36 
           out    SREG,r10       ;37
           sei                   ;38
           ret                   ;39
;
falling:   in     r16,ICR1L      ;50 обработка спада
           in     r17,ICR1H      ;51
           out    tccr1b,r15     ;52
           out    tifr,r14       ;53
           movw   r22,r26        ;54
           in     r10,SREG       ;55
           cpi    r17,0x00       ;56
           brne   fal1           ;57
           in     r24,tifr       ;58
           sbrs   r24,tov1       ;59
           rjmp   fal1           ;60
           subi   r21,low(-1)    ;61
           sbci   r22,high(-1)   ;62
fal1:      sub    r20,r16        ;63
           sbc    r21,r17        ;64
           sbc    r22,r18        ;65
           sbc    r23,r19        ;66
           st     y+,r20         ;67
           st     y+,r21         ;68
           st     y+,r22         ;69
           st     y+,r23         ;70
           ldi    yh,high(buffer);71
           ldi    zl,low(rising) ;72
           out    SREG,r10       ;73
           sei                   ;74
           ret                   ;75
;
; обработчик переполнения таймера1
overflow1: in     r10,SREG       ;90
           adiw   r26,1          ;91
           out    SREG,r10       ;92
           reti                  ;93

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза!

Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца.

То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта

процессора, который измеряет этот временной интервал ?

Да, утверждаю. Для нашего случая тактовая частота равна 1 МГц, так что точность будет 0.5 мкс. А в общем случае, полтакта процессора.

 

Ну поделитесь кодом, что ли. :a14:

Если это know-how, и Вы собираетесь на этом заработать, то тогда

скажите как будет выглядеть возвращаемое значение вашего измерения

например для промежутков 50тактов 50,5тактов 51тактов и т.д.....

Мы, как Ваши потенциальные клиенты должны (перед покупкой Вашего алгоритма)

знать какие выходные данные мы получим.

С нетерпением жду Ваших ответов :)

P.S. Нельзя ли модернизировать Ваш алгоритм для получения 1/16 такта процессора,

очень надо...

Кодом поделиться не могу, его просто нет. Есть плодотворная идея как это реализовать на голой атмеге128, и программа, кажется, будет несложной. Зарабатывать на этом я не собираюсь, хотя шут ее знает, может надо(:-)?

Возвращаемое значение будет точно также размещено в 4-х байтах, но одна единица будет соответствовать не длительности 1-го такта, а его половине, т.е. 100, 101, 102, 103 [тактов/2] вместо 50, 50.5, 51 [тактов].

По поводу модернизации. Можно и для 1/16 сделать, только с дополнительными прибамбасами(:-(. Вы лучше скажите, что вы хотите сделать, тогда можно поконкретнее ответить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

........................
........................

Не понял чем Ваш код принципиально отличается от того что мы здесь обсуждали.

Косметика ?

Только Вы умудрились сожрать под прерывания все старшие регистры

кроме R25, да еще и 4 младших.

Интересно, в основной программе Вы планируете для работы с константами

использовать только R25 ? А регистрами X,Y,Z вообще не пользоваться ?

 

Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза!

Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца.

То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта

процессора, который измеряет этот временной интервал ?

Да, утверждаю. Для нашего случая тактовая частота равна 1 МГц, так что точность будет 0.5 мкс. А в общем случае, полтакта процессора.

Вы собираетесь для этих целей использовать Analog Comparator ?

Тогда посмотрите Electrical Characteristic

параметр Analog Comparator Propogation Delay

По поводу модернизации. Можно и для 1/16 сделать, только с дополнительными прибамбасами(:-(. Вы лучше скажите, что вы хотите сделать, тогда можно поконкретнее ответить.

С дополнительными прибамбасами я и сам знаю как, это была просто шутка :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже вам слово системщик, как быку красная тряпка(:-), не обижайтесь.
Зачем обижаться. Почти верно. Только слово системщик у меня ассоциируется с чем-то сложным и за это уважаемым. Кстати, я сам системщик, то бишь системный программист. У вас же в последней проге слишком много ошибок или опечаток. Ну и ничего нового.

 

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

 

Вообще, заинтриговало Ваше заявление про 0.5 такта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

GetSmart У вас же в последней проге слишком много ошибок или опечаток. Ну и ничего нового.

 

Есть опечатки, строки 50, 51, 52 и 56, копи+пейст мой бич. Может и ошибки есть, как же без них(:-). Любая сколь угодно малая программа содержит хотя бы одну ошибку(:-). Кто сказал? Вирт?

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

 

Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?

 

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

 

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

 

GetSmart Вообще, заинтриговало Ваше заявление про 0.5 такта.

 

А меня Ваше про 400 Мбод. У меня максимум на 16-ти мегагерцовой атмеге - 39 Мбод.

Насчет 0.5 такта правда, на фирме посоветовался с электронщиком, вроде проходит.

Интересно, что defunct думает по поводу полтакта, пропал он куда-то...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет 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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

По поводу Меги @ 16 я тоже не смог придумать как поднять скорость выше 43 мбит/сек. А 400 было для самого дешёвого АРМа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А в чем проблемма мерить импульсы длительностью от 1 такта ? :blink:

Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт

другой спад :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотел ответить в одном сообщении, да больно тематика постов разная(:-).

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

А в чем проблема мерить импульсы длительностью от 1 такта ? :blink:

Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт

другой спад :)

 

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...