Этот форум работает только в режиме просмотра и поиска.
Действующий форум переведен на новый движок и
находится по адресу
Синхронизация импульсов???
Автор: Роман (62.118.147.---)
Дата: 14/04/2004 18:33
Подскажите пожалуйста, как лучше сделать синхронизвцию.
Пишу программу для 16с54 на вход поступають импульсы с частотой в 50гц.
Высокий уровень 50ms, затем низкий 50ms. Так вод надо с началом импульсов выдавать
сигнал,
как лучше это сделать. Частота работы процессора 1Мгц, фронт спада наростания
импульса около 500um
Я сделал набросок программы, но как-то не очень хорошо это работает,
наблюдаеться дрожание выходного импульса, такое впечатление что где-то идёт
рассинхронизация сигнала.
Во кусочек программы:
START:
loopHI: btfsc PORTB, 4 ; определение импульма наростания
goto loopHI
movlw .XX ; Задержка в 500us
call Delay
btfss PORTB, 4
goto loopHI
; вывод данных
XXXXXX
XXXXXX
; определение импульса спада
loopLO: btfss PORTB, 4 ; определение импульма наростания
goto loopLO
movlw .XX ; Задержка в 500us
call Delay
btfsc PORTB, 4
goto loopLO
; вывод данных
XXXXXX
XXXXXX
goto START
Как можно это сделать получше или красивее, и почкму наблюбаеться дрожание вых.
сигнала,
мне кажеться что определение фронтов иногда запаздывает или наобород раньше
срабатывает.
на память не уверен, но помоему надо на тр. шмиттовый вход подавать сигнал. у меня дрожание было
на f876 когда на PORTB с оптрона 50гц подавал. а потом кинул на RA4 сразу полегчало.
Re: Синхронизация импульсов???
Автор: Роман (62.118.143.---)
Дата: 14/04/2004 19:53
Всё дело в том что я пишу программу под устройство которое уже работает и плата
разведена, какбы свою программу для готового устройства на замену.
что то не уверен - если фронт не точно ловится то все равно дрожать будет. тут при таком
раскладе я бы сделал таймер с автоподстройкой частоты по приходящим фронтам. дрожать тогда не
будет, но привязка будет менее точной. А что здесь важнее - вам решать. А вот например этот
алгоритм проверить можно если ногу отрезать и впаять в разрыв триггер шмитта, тогда понятней
будет.
Re: почему дрожит?
Автор: Роман (62.118.142.---)
Дата: 14/04/2004 20:58
Я тоже пришёл к выводу что дрожание происходит из-за задержки, но фронт
спада/нарастания импульса большой окло 500us впринципе это я взял с запасом, так он
немного меньше, то-есть за это время будет чёткий 0 или 1. А как ещё можно поймать
переход фронта. Чтобы вывести импульсы пока он держиться в 0 или 1.
подскажите попутно-мне дали на один день пик16с54а с одной милой прошивкой(ломает
платные кабельные каналы),попросили выяснить можно-ли переписать..-вставляю в
программатор для 16ф84-считываются все байты фффф..документацию скачать не удалось-
говорят страница отсутствует..-может мне ножки какие перекинуть чтобы её
прочитать?..
Но порыться можно в инете(eng). Я как то раз нашел как пик сломать. Этот бит конфигурации по
защите кода. Но тут есть проблема - чтобы попытаться, надо несколько пиков пробовать -
некоторые горят, а некоторые открываются... :( Что то там надо вроде 12В кудато подать...
короче я не стал пробовать. А вот например инженеры в КБ по разработке пиков наверняка знают -
ты им взятку предложи... ;) Но если что - я ничего не говорил... ;))).
мне както раз надо было привязатся к началу импульса. ловился он откровенно плохо. и я сделал
таймер, который синхронизировался по дрожащим точкам, период таймера задавался каждый проход,но
усредненно по времени, поетому он крутился с привязкой к фронтам и не дрожал. А данные я
передавал по конкретному значению таймера, соответственно я мог ловить любую точку периода. это
называется математическое ожидание. А зачем вообще если не секрет так точно ловить начало 50Гц
фронта? Но принцип здесь имхо только один - усреднять полученные значения времени - частота то
не меняется.
можно сделать программный триггер. типа если в течении 100 мкс 10 раз на входе 1, значит считается, что
на входе 1 установлена постоянно. ну типа как обычная защита от дребезга контактов.
Мне не нужно ломать-возможно в ней бит защиты и не стоит(с битом считываются нули-а
у меня ffff)-может кто знает в чём особенности читания и прошивки этого камня-и
почему он не читается на месте pic16c84-если ноги совпадают?..
извиняюсь что влез-хотел попутно спросить чтобы новую тему не открывать-раз уж речь
зашла..
жаль что способ программирования иной-если я пользуюсь ic-prog проблема его
сконфигурировать(там вроде последовательный протокол,хотя в списке этот чип
есть)..,да и программатор нужно новый паять-а какой?..
на счёт прошивки-выложил-бы-но я не из России-у нас свой способ-платные фильмы
транслируются без синхронизации и на экране всё мелькает-а если уплатить-посылается
какой-то код в кабель -моя коробку-приёмник распознаёт это, синхронизация
примешивается к видео(судя по всему)-картинка стабилизируется..
видимо пик как-то высчитывает синхроимпульсы из общего сигнала и добавляет его к
видео..
Роман может Вам "смотреть на PORTB, 4 " не 250000/3 ~ 80 тыс.раз в сек, а через
каждые,
например 130 мкс.
Кстате :
loopHI: btfsc PORTB, 4 ; определение импульма наростания
goto loopHI
или у меня глюки (или непонял Вашего вопроса и условий роботы ПИКа) или тут не
правильно.
Это похоже на "если на PORTB, 4 лог "1" перейти на метку loopHI, иначе дальше".
Т.е. в момент старта программы на PORTB, 4 уже лог "1" и ВЫ ловите спад импульса
(на сколько Я понял из начального вопроса надо ловить передний фронт импульса).
>START:
>
>loopHI: btfsc PORTB, 4 ; если на PORTB, 4 лог "1" то перейти на метку
loopHI, иначе дальше
> goto loopHI
> movlw .XX ; Задержка в 500us
> call Delay
> btfss PORTB, 4 ; а тут если на PORTB, 4 лог "0" то перейти на
метку loopHI
> goto loopHI
> ; вывод данных
> XXXXXX
> XXXXXX
> ; определение импульса спада
>loopLO: btfss PORTB, 4 ; определение импульма наростания
> goto loopLO
> movlw .XX ; Задержка в 500us
> call Delay
> btfsc PORTB, 4
> goto loopLO
> ; вывод данных
> XXXXXX
> XXXXXX
> goto START
Т.е. замкнутый круг.
Словили спад импульса, подождали, опаять ждем спад импульса.
Вобщем посмотрите алгоритм и его реализацию...