=GM= 0 18 октября, 2006 Опубликовано 18 октября, 2006 · Жалоба Затем, что прерывание может произойти именно в момент вычитки значения, и мы можем прочитать недостоверные данные. Если же рез-тат будет храниться в 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 мкс (полмикросекунды!) Точность удвоена, ура три раза! Кстати, почему никто не отвечает на вопрос что требуется измерение длины импульса (фронт и спад), а не периода (два фронта или два спада)? Все согласны что ли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 18 октября, 2006 Опубликовано 18 октября, 2006 · Жалоба Как-то вы несистемно подходите к задаче измерения интервалов.А вы типа полный системщик. Тут вам предложили просто наброски проги с самыми сложными местами. Базару нет - её можно улучшить под конкретную задачу. Похоже только вам здесь хочется её воплотить в железе. Делайте. Напишите и выложите тут свою прогу, а мы её дружно покритикуем. Даже поможем улучшить. А то ведь вы порой бревна в глазу не замечаете. Так что будет интересно и нам и вам. А может даже весело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 18 октября, 2006 Опубликовано 18 октября, 2006 · Жалоба хотя конкретно здесь сказано вами не к месту Вам виднее. Кстати, почему никто не отвечает на вопрос что требуется измерение длины импульса (фронт и спад), а не периода (два фронта или два спада)? Все согласны что ли? Потому что это уже косметика. Если вы согласны с этим, то какая разница откуда писать в буфер? Из r7-r6-r5-r4, или из r7-r6-icr1h-icr1l, или из r3-r2-icr1h-icr1l? Разница огромная. Я предпочту запретить прерывания и прочитать достоверное значение из защищенного от изменений буфера. После чего, разрешив прерывания, будет выполнено обновление переменной и т.д. Этим я обезопашу себя и вас от дурацких вопросов в будущем - "окуда появилось это значение". Вы же со своей реализацией и вычиткой icr от таких вопросов ничем не застрахованы, если Вам с вашим системным подходом до сих пор не ясна проблема, то я попробую озвучить ее прямым текстом: - пол переменной у вас может быть прочитано из одного семпла, а вторая половина - из второго. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 18 октября, 2006 Опубликовано 18 октября, 2006 (изменено) · Жалоба defunct Любопытная вещь. Это я где-то уже видел и проверил для АВРов. Там есть временный регистер для защёлкивания старших 8 бит при чтении младших. То бишь читая младший, а затем старший регистр гарантированно прочитается цельное значение. =GM= Читать ICR1L и ICR1H по-любому придётся вначале в регистры. Там же проверка стоит старшего байта. Ну а потом прямо в прерывании можно вычитать все 4 байта из предыдущих 4 байт и сувать куда-нибудь. Например в кольцевой буфер в ОЗУ. R6 и R7 можно будет не использовать. Но вообще, особой выгоды в экономии и нет. Лишь бы правильно работала. Апосля можно переключать полярность защёлкивания и желлательно сразу проверить полярность на входе. Изменено 18 октября, 2006 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 18 октября, 2006 Опубликовано 18 октября, 2006 · Жалоба Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза! Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца. То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта процессора, который измеряет этот временной интервал ? Ну поделитесь кодом, что ли. :a14: Если это know-how, и Вы собираетесь на этом заработать, то тогда скажите как будет выглядеть возвращаемое значение вашего измерения например для промежутков 50тактов 50,5тактов 51тактов и т.д..... Мы, как Ваши потенциальные клиенты должны (перед покупкой Вашего алгоритма) знать какие выходные данные мы получим. С нетерпением жду Ваших ответов :) P.S. Нельзя ли модернизировать Ваш алгоритм для получения 1/16 такта процессора, очень надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 19 октября, 2006 Опубликовано 19 октября, 2006 · Жалоба Как-то вы несистемно подходите к задаче измерения интервалов.А вы типа полный системщик. Тут вам предложили просто наброски проги с самыми сложными местами. Базару нет - её можно улучшить под конкретную задачу. Нет конечно, но хотелось бы(:-). Похоже вам слово системщик, как быку красная тряпка(:-), не обижайтесь. Несистемный подход означает решение частной мелкой задачи, вместо того чтобы дать решение общей, пусть и крупными мазками. Вашу позицию понял, но не проникся(:-). Похоже только вам здесь хочется её воплотить в железе. Делайте. Напишите и выложите тут свою прогу, а мы её дружно покритикуем. Даже поможем улучшить. А то ведь вы порой бревна в глазу не замечаете. Так что будет интересно и нам и вам. А может даже весело. Да не хочется мне ее воплощать. Меня интересуют потенциальные возможности аврок. Единственное рациональное зерно, до которого я допер в результате долгой дискуссии - это возможность измерения времени импульса с точностью ПОЛТАКТА процессора, в нашем случае - 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 19 октября, 2006 Опубликовано 19 октября, 2006 · Жалоба Но вот посмотрел еще раз на 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 сделать, только с дополнительными прибамбасами(:-(. Вы лучше скажите, что вы хотите сделать, тогда можно поконкретнее ответить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 19 октября, 2006 Опубликовано 19 октября, 2006 · Жалоба ........................ ........................ Не понял чем Ваш код принципиально отличается от того что мы здесь обсуждали. Косметика ? Только Вы умудрились сожрать под прерывания все старшие регистры кроме R25, да еще и 4 младших. Интересно, в основной программе Вы планируете для работы с константами использовать только R25 ? А регистрами X,Y,Z вообще не пользоваться ? Но вот посмотрел еще раз на 128-ю атмегу и нашел способ измерения интервалов с точностью 0.5 мкс (полмикросекунды!) Точность удвоена, ура три раза! Ну давайте сразу же определимся, в конечном итоге мы измеряли не мкс а такты проца. То есть Вы утверждаете, что Вы можете измерить временной интервал, с точностью 0,5 такта процессора, который измеряет этот временной интервал ? Да, утверждаю. Для нашего случая тактовая частота равна 1 МГц, так что точность будет 0.5 мкс. А в общем случае, полтакта процессора. Вы собираетесь для этих целей использовать Analog Comparator ? Тогда посмотрите Electrical Characteristic параметр Analog Comparator Propogation Delay По поводу модернизации. Можно и для 1/16 сделать, только с дополнительными прибамбасами(:-(. Вы лучше скажите, что вы хотите сделать, тогда можно поконкретнее ответить. С дополнительными прибамбасами я и сам знаю как, это была просто шутка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 20 октября, 2006 Опубликовано 20 октября, 2006 · Жалоба Похоже вам слово системщик, как быку красная тряпка(:-), не обижайтесь.Зачем обижаться. Почти верно. Только слово системщик у меня ассоциируется с чем-то сложным и за это уважаемым. Кстати, я сам системщик, то бишь системный программист. У вас же в последней проге слишком много ошибок или опечаток. Ну и ничего нового. Интересно чем отличается конструкция {sei ; ret} от {iret} ? Если я не ошибаюсь, она только хуже. Вообще, заинтриговало Ваше заявление про 0.5 такта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 20 октября, 2006 Опубликовано 20 октября, 2006 · Жалоба 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 думает по поводу полтакта, пропал он куда-то... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 20 октября, 2006 Опубликовано 20 октября, 2006 · Жалоба Насчет 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 0 21 октября, 2006 Опубликовано 21 октября, 2006 · Жалоба Нового ничего, за исключением того, что прерывание таймера1 по переполнению не сбрасывается в данном прерывании, что есть правильно.Оба варианта примерно одинаковые, иногда один немного лучше, иногда другой. Больше всего мне режет глаз ошибка из-за которой строки 35/35 и 61/62 не совпадают. Но даже обе эти пары строк неправильные. Первая увеличивает почему-то младшие 16 бит результата, а вторая - средние (!) 16 бит. Когда обе должны увеличивать только старшие 16 бит. Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?Для этого Найдите форум полных извращенцев :) По поводу Меги @ 16 я тоже не смог придумать как поднять скорость выше 43 мбит/сек. А 400 было для самого дешёвого АРМа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 22 октября, 2006 Опубликовано 22 октября, 2006 · Жалоба Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?Для этого Найдите форум полных извращенцев :) А в чем проблемма мерить импульсы длительностью от 1 такта ? :blink: Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт другой спад :) Пошел искать форум полных извращенцев ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 23 октября, 2006 Опубликовано 23 октября, 2006 · Жалоба 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= 0 23 октября, 2006 Опубликовано 23 октября, 2006 · Жалоба Хотел ответить в одном сообщении, да больно тематика постов разная(:-). Вопрос в другом, как мерять импульсы и интервалы между ними от 1 мкс и выше? Есть предложения(:-)?Для этого Найдите форум полных извращенцев :) А в чем проблема мерить импульсы длительностью от 1 такта ? :blink: Цепляем сигнал к двум таймерам (Timer1 и Timer3 на Mega128) одновременно, один ловит фронт другой спад :) Пошел искать форум полных извращенцев ... Не надо никуда ходить. Если импульсы идут с периодом в 1 мкс, на втором импульсе ваша система заткнется, не успеет переварить(:-). А вообще, хочу вас, коллеги, огорчить(:-(. Весь сыр-бор разгорелся из-за вопроса, можно ли измерить секундный интервал с точностью 1 мкс, используя 1МГц атмегу. Так вот ответ неутешительный: НЕЛЬЗЯ! Максимальная ошибка равна ПЛЮС-МИНУС ОДНА микросекунда, что в итоге составляет 2 мкс. Правы были товарищи, которые говорили нельзя, а мы не поверили коллективному разуму(:-(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться