Сообщение от slavik.ksu
|
к сожаленью я так не понимаю ![Улыбка](images/smilies/icon_smile.gif)
в случае про который Вы говорите: в каждом перидое приходит сигнал , правильно я Вас понимаю? а
сигнал это либо логическая еденица либо логический ноль?
вот я хочу представить как это выглядит, чтобы понять в какие моменты делать две выборки?
|
У вас не сказано, что за сигнал. Но в теме присутствует слово USB. Логично предположить, что сигнал цифровой. Максимальная частота равна 1,5 МГц. Скважность (в случае, если сигнал идёт с максимальной частотой) равна 2. Это значит, что сигнал состоит из пар "половинок". Каждая "половинка" может быть как 0, так и 1. Длительность этих элементарных "половинок" равна 333 нс.
Это означает, что сигнал может менять свой уровень, но не чаще чем через 333 нс. А может и не менять.
Когда делается выборка, в тот самый момент времени оцениваются входные сигналы. Если уровень больше верхнего порога - считается, что на входе 1. Если меньше нижнего порога - считается, что на входе 0. Если уровень между нижним и верхним порогом, то считаться может произвольная величина.
Из этого следует, что если вы делаете выборки каждые 333 нс, вы можете ошибочно считать сигнал, и этот ошибочно считанный сигнал будет выдан на выход с длительностью 333 нс. То есть, произойдёт искажение сигнала.
Если вы будете делать выборки каждые 10 нс, то ошибочный сигнал на выходе может продержаться всего 10 нс.
У вас же сказано, что выходной сигнал должен меняться одновременно. Это означает (но опять-таки нет точных цифр), что ошибочно считанные данные не должны быть выданы на выход.
Программно логики работы такова:
Мы, постоянно следим за сигналом. И вот наступил момент, когда на одном из входов (или на обоих сразу) он изменился.
Чтобы удостовериться, что мы считали правильно, мы ещё раз считываем сигнал. Если его состояние такое же, как и при предыдущем считывании, мы можем со спокойной душой отправлять его на выход.
Если же состояние олично от предыдущего, мы ещё раз считываем сигнал (то есть, предыдущий раз мы его считали в момент изменения). Убеждаемся, что сигнал такой же и его можно выводить на выход.
Чтобы такой алгоритм работал корректно, считывать состояние сигналов мы должны с большей частотой.
Частота выбирается такой, чтобы за интервал 333 нс мы могли считать сигнал, а также ещё два раза считать сигнал повторно. То есть,
более чем в 2 раза больше (интервал
менее 166 нс). Ну и ещё запасик оставить.
К тому же надо позаботиться о сохранении исходной длительности импульса. Для этого надо, чтобы цикл опроса всегда повторялся через один и тот же промежуток времени. А также, чтобы вывод сигнала на выход также осуществлялся через одинаковые промежутки времени. Желательно, чтобы на 333 нс помещалось цело число таких промежутков (исходя из вышесказанного - не менее 3). Лучше - 4. То есть, считывать надо с интервалом 66 нс.
Вот, вроде бы и всё. Ах да. Тут не было ни слова о кнопке и обработке "заморозки" сигнала. Это всё нужно только для того, чтобы правильно передать входной сигнал.