|
|
  |
Измерение временных интервалов, с высокой точностью |
|
|
|
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 от таких вопросов ничем не застрахованы, если Вам с вашим системным подходом до сих пор не ясна проблема, то я попробую озвучить ее прямым текстом: - пол переменной у вас может быть прочитано из одного семпла, а вторая половина - из второго.
|
|
|
|
|
Oct 18 2006, 20:07
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 18 2006, 18:14)  Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза! Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца. То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта процессора, который измеряет этот временной интервал ? Ну поделитесь кодом, что ли. Если это know-how, и Вы собираетесь на этом заработать, то тогда скажите как будет выглядеть возвращаемое значение вашего измерения например для промежутков 50тактов 50,5тактов 51тактов и т.д..... Мы, как Ваши потенциальные клиенты должны (перед покупкой Вашего алгоритма) знать какие выходные данные мы получим. С нетерпением жду Ваших ответов P.S. Нельзя ли модернизировать Ваш алгоритм для получения 1/16 такта процессора, очень надо...
|
|
|
|
|
Oct 19 2006, 14:55
|

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

|
Цитата(GetSmart @ Oct 18 2006, 13:43)  Цитата(=GM=) Как-то вы несистемно подходите к задаче измерения интервалов. А вы типа полный системщик. Тут вам предложили просто наброски проги с самыми сложными местами. Базару нет - её можно улучшить под конкретную задачу. Нет конечно, но хотелось бы(:-). Похоже вам слово системщик, как быку красная тряпка(:-), не обижайтесь. Несистемный подход означает решение частной мелкой задачи, вместо того чтобы дать решение общей, пусть и крупными мазками. Вашу позицию понял, но не проникся(:-). Цитата(GetSmart @ Oct 18 2006, 13:43)  Похоже только вам здесь хочется её воплотить в железе. Делайте. Напишите и выложите тут свою прогу, а мы её дружно покритикуем. Даже поможем улучшить. А то ведь вы порой бревна в глазу не замечаете. Так что будет интересно и нам и вам. А может даже весело. Да не хочется мне ее воплощать. Меня интересуют потенциальные возможности аврок. Единственное рациональное зерно, до которого я допер в результате долгой дискуссии - это возможность измерения времени импульса с точностью ПОЛТАКТА процессора, в нашем случае - 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
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 19 2006, 15:21
|

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

|
Цитата(singlskv @ Oct 18 2006, 19:07)  Цитата(=GM= @ Oct 18 2006, 18:14)  Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза!
Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца. То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта процессора, который измеряет этот временной интервал ? Да, утверждаю. Для нашего случая тактовая частота равна 1 МГц, так что точность будет 0.5 мкс. А в общем случае, полтакта процессора. Цитата(singlskv @ Oct 18 2006, 19:07)  Ну поделитесь кодом, что ли. Если это know-how, и Вы собираетесь на этом заработать, то тогда скажите как будет выглядеть возвращаемое значение вашего измерения например для промежутков 50тактов 50,5тактов 51тактов и т.д..... Мы, как Ваши потенциальные клиенты должны (перед покупкой Вашего алгоритма) знать какие выходные данные мы получим. С нетерпением жду Ваших ответов P.S. Нельзя ли модернизировать Ваш алгоритм для получения 1/16 такта процессора, очень надо... Кодом поделиться не могу, его просто нет. Есть плодотворная идея как это реализовать на голой атмеге128, и программа, кажется, будет несложной. Зарабатывать на этом я не собираюсь, хотя шут ее знает, может надо(:-)? Возвращаемое значение будет точно также размещено в 4-х байтах, но одна единица будет соответствовать не длительности 1-го такта, а его половине, т.е. 100, 101, 102, 103 [тактов/2] вместо 50, 50.5, 51 [тактов]. По поводу модернизации. Можно и для 1/16 сделать, только с дополнительными прибамбасами(:-(. Вы лучше скажите, что вы хотите сделать, тогда можно поконкретнее ответить.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 19 2006, 17:20
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 19 2006, 18:55)  Код ........................ ........................ Не понял чем Ваш код принципиально отличается от того что мы здесь обсуждали. Косметика ? Только Вы умудрились сожрать под прерывания все старшие регистры кроме R25, да еще и 4 младших. Интересно, в основной программе Вы планируете для работы с константами использовать только R25 ? А регистрами X,Y,Z вообще не пользоваться ? Цитата(=GM= @ Oct 19 2006, 19:21)  Цитата(singlskv @ Oct 18 2006, 19:07)  Цитата(=GM= @ Oct 18 2006, 18:14)  Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза!
Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца. То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта процессора, который измеряет этот временной интервал ? Да, утверждаю. Для нашего случая тактовая частота равна 1 МГц, так что точность будет 0.5 мкс. А в общем случае, полтакта процессора. Вы собираетесь для этих целей использовать Analog Comparator ? Тогда посмотрите Electrical Characteristic параметр Analog Comparator Propogation Delay Цитата По поводу модернизации. Можно и для 1/16 сделать, только с дополнительными прибамбасами(:-(. Вы лучше скажите, что вы хотите сделать, тогда можно поконкретнее ответить. С дополнительными прибамбасами я и сам знаю как, это была просто шутка
|
|
|
|
|
Oct 20 2006, 02:23
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(=GM=) Похоже вам слово системщик, как быку красная тряпка(:-), не обижайтесь. Зачем обижаться. Почти верно. Только слово системщик у меня ассоциируется с чем-то сложным и за это уважаемым. Кстати, я сам системщик, то бишь системный программист. У вас же в последней проге слишком много ошибок или опечаток. Ну и ничего нового. Интересно чем отличается конструкция {sei ; ret} от {iret} ? Если я не ошибаюсь, она только хуже. Вообще, заинтриговало Ваше заявление про 0.5 такта.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 20 2006, 10:08
|

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

|
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 думает по поводу полтакта, пропал он куда-то...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 20 2006, 21:01
|

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

|
Цитата(=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).
|
|
|
|
|
Oct 21 2006, 01:45
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(=GM=) Нового ничего, за исключением того, что прерывание таймера1 по переполнению не сбрасывается в данном прерывании, что есть правильно. Оба варианта примерно одинаковые, иногда один немного лучше, иногда другой. Больше всего мне режет глаз ошибка из-за которой строки 35/35 и 61/62 не совпадают. Но даже обе эти пары строк неправильные. Первая увеличивает почему-то младшие 16 бит результата, а вторая - средние (!) 16 бит. Когда обе должны увеличивать только старшие 16 бит. Цитата Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)? Для этого Найдите форум полных извращенцев  По поводу Меги @ 16 я тоже не смог придумать как поднять скорость выше 43 мбит/сек. А 400 было для самого дешёвого АРМа.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 22 2006, 21:16
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(GetSmart @ Oct 21 2006, 05:45)  Цитата Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)? Для этого Найдите форум полных извращенцев  А в чем проблемма мерить импульсы длительностью от 1 такта ? Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт другой спад Пошел искать форум полных извращенцев ...
|
|
|
|
|
Oct 23 2006, 11:05
|

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

|
Цитата(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.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 23 2006, 11:16
|

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

|
Хотел ответить в одном сообщении, да больно тематика постов разная(:-). Цитата(singlskv @ Oct 22 2006, 20:16)  Цитата(GetSmart @ Oct 21 2006, 05:45)  Цитата Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)? Для этого Найдите форум полных извращенцев  А в чем проблема мерить импульсы длительностью от 1 такта ? Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт другой спад Пошел искать форум полных извращенцев ...  Не надо никуда ходить. Если импульсы идут с периодом в 1 мкс, на втором импульсе ваша система заткнется, не успеет переварить(:-). А вообще, хочу вас, коллеги, огорчить(:-(. Весь сыр-бор разгорелся из-за вопроса, можно ли измерить секундный интервал с точностью 1 мкс, используя 1МГц атмегу. Так вот ответ неутешительный: НЕЛЬЗЯ! Максимальная ошибка равна ПЛЮС-МИНУС ОДНА микросекунда, что в итоге составляет 2 мкс. Правы были товарищи, которые говорили нельзя, а мы не поверили коллективному разуму(:-(.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|