|
|
  |
Сревнение двух частот |
|
|
|
May 14 2012, 21:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Семин @ May 14 2012, 21:25)  Если разница большая, то засечь её можно быстро. А если маленькая, то ждать придётся относительно долго. Там время есть, в разумных пределах. Цитата Обязательно нужно засечь разницу или нет? Зачем вообще всё это надо? Полностью долго рассказывать, а если кратко - есть две системы, тактируемые от своих генераторов. С одной системы данные поступают пачками на другую, через процессор, в котором некоторая обработка и FIFO. В начале каждой пачки есть почти секунда на тестирование сигналов, ну а дальше - допустимая длина пачки зависит от размера FIFO (и макс. возможной разности частот). Сейчас в начале пачки заполняется половина FIFO, а его размер выбран так, чтобы при максимальной разности частот не происходило переполнения. Т.е. начальная разница между указателями равна половине буфера, при Fread>Fwrite указатель чтения будет догонять указатель записи, Fread<Fwrite - отставать. Идея состоит в том, что если заранее знать условие, например Fread>Fwrite, то дождавшись полного заполнения буфера, можно указатель чтения ставить на на пол буфера позже указателя записи, а сразу пере ним. Если Fr<Fw, то указатель чтения сразу после указателя записи. Таким образом, начальная разница указателей будет равна не половине размера буфера а целому, и при то-же влеличине буфера мжоно длину пачки увеличить почти вдвое, или наоборот - почти вдвое уменьшить величину буфера при неизменной пачке. Разумеется, при условии что за время пакета разность частот не меняет знак. (если это и произойдет, то не страшно, если оно будет детектировано - пакет будет отброшен).
|
|
|
|
|
May 15 2012, 20:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Семин @ May 15 2012, 19:33)  Для чего это нужно, всё равно не понятно, "Секретная информация", ну да ладно, дело хозяйское. Я вроде обьяснил для чего. Цитата Похоже тока что разница нужна обязательно. Тогда если она маленькая, может понадобиться много времени. А если в течении разумного предела, разница так и не будет определена? Тогда как и раньше - на середину буфера, если разница маленькая, проблем не будет.
|
|
|
|
|
May 20 2012, 09:48
|

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

|
1) Читаю я всегда внимательно, скажу больше, даже внимательнее, чем вы пишете. 2) Кольцевой буфер не так работает, как вы описываете. 3) Постановка вами задачи и ваши комментарии, мягко говоря, вызывают сомнения в том, что вы в теме. 4) [Чтобы развеять ваши встречные сомнения, скажу, что ваши 28МГц я могу измерить с погрешностью порядка 200 Гц за ОДНУ миллисекунду]
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
May 20 2012, 15:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(=GM= @ May 20 2012, 11:48)  1) Читаю я всегда внимательно, скажу больше, даже внимательнее, чем вы пишете. Очень рад. Тогда вы несомненно можете дать массу полезных советов. Цитата 2) Кольцевой буфер не так работает, как вы описываете. В моем представлении, есть буфер, есть два указателя - один на запись, другой на чтение, после каждого чтения идет инкремент указателя чтения, по каждой записи - инкремент указателя записи. (В моем случае это происходит по прерываниям, но это неважно). Инкременты разумеется, по модулю размера буфера (поскольку он кольцевой). В чем я не прав? Цитата 3) Постановка вами задачи и ваши комментарии, мягко говоря, вызывают сомнения в том, что вы в теме. 4) [Чтобы развеять ваши встречные сомнения, скажу, что ваши 28МГц я могу измерить с погрешностью порядка 200 Гц за ОДНУ миллисекунду] Я и спрашивал совета как лучше это сделать. За 1мс пройдет 28000 импульсов одного генератора. Чтобы засечь минимальную разницу, надо чтобы со второго пришло или 27999 или 28001 импульс. Итого разница составит 1кГц. Если вы знаете секрет как поймать за 1мс 200гц имеющимися в распоряжении средствами - расскажите, думаю всем начинающим будет интересно.
|
|
|
|
|
May 20 2012, 16:10
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Allregia @ May 20 2012, 19:41)  В моем представлении, есть буфер, есть два указателя - один на запись, другой на чтение, после каждого чтения идет инкремент указателя чтения, по каждой записи - инкремент указателя записи. (В моем случае это происходит по прерываниям, но это неважно). Инкременты разумеется, по модулю размера буфера (поскольку он кольцевой). В чем я не прав? Чисто формально, прежде чем выполнять инкремент указателя записи, необходимо убедиться в том, что буфер не полон и прежде, чем выполнять инкремент указателя чтения, необходимо убедиться в том, что буфер не пуст.
|
|
|
|
|
May 20 2012, 16:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(blackfin @ May 20 2012, 18:10)  Чисто формально, прежде чем выполнять инкремент указателя записи, необходимо убедиться в том, что буфер не полон и прежде, чем выполнять инкремент указателя чтения, необходимо убедиться в том, что буфер не пуст. Это понятно. Тут другое - поскольку частота записи и частота чтения чуть-чуть отличаются, через некоторое количество "оборотов" кольцевого буфера один указатель догонит другой. Повторю еще раз: Сейчас начальные условия - чтение начинается после заполнения половины буфера, расстояние между указателями и равно этой половине. Зная макс. допустимую разность частот и размер буфера можно посчитать через склько оборотов произойдет "наезд" и таким образом посчитать максимульную длину передачи без переполнения. Идея состоит в том, что если знать в какую сторону побежит указатель чтения относительно указателя записи - будет догонять или отставать (т.е. от знака разности частот), можно действовать по другому: - если частота чтения ниже частоты записи, то не надо ждать заполнения буфера, ставим указатель чтения сразу за указателем записи. - если частота чтения выше, то дожидаемся заполнения всего буфера, и ставим указатель чтения перед указателем записи. Таким образом, по сравнению с имеющимся вариантом, виртуальный размер буфера как бы вдвое увеличится, при том-же его физическом размере, поскольку начальная разница между указателями будет равна не половине буфера а целому. Т.е. можно или увеличить вдвое длину передачи, или при той-де длине уменьшить вдвое буфер. Не знаю, может я как-то сумбурно обьясняю, но вроде должно быть понятно. Если я в чем-то не прав - обьясните пожалуйста. К тому же, мне крайне любопытно как за 1мс поймать разность частот, меньшую одного импульса, как утверждалось выше.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|