В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера
а как его измерить? частота 16МГц, а таймер занят. а ведь считать то его нужно в единицах таймера получается
я по таймеру 16МГц/256=62500 считал длину импулься и тут же параллельно выдавал, и как бы получается так что все сдвигается и накладывается на входной, вобщем запутало меня все это.
вопрос о фазе не стоит. вот мой код - скажите где трабл :wassat:
//==========START TIMER PROCESS=====================
Timer:
CLI
//заносим и выделяем бит скорости из порта С
IN PortCVal, PINC ;
ANDI PortCVal, 1<<InPortSyg
//выделяем предыдущее состояние бита из порта С
MOV temp1, Flags ;
ANDI temp1, 1<<InSygFlag
//копируем бит из порта С для проверки изменился ли он
MOV temp3, PortCVal
EOR temp3, temp1 ; проверяем изменился ли бит
//если изменился то пытаемся его продлить
BRNE DecDelay ;1x1=0(Z) 0x0=0(Z) 1x0=1 0x1=1
//после задержки инвертируем флаг сигнала
LDI temp3,1<<InSygFlag ;
EOR Flags, temp3
//вычисляем длительность нового импульса DelL_Next DelH_Next
CalNewDel:
MOV dd16uL, CtrL
MOV dd16uH, CtrH
//для упрощения задаем фиксированную задержку
LDI DelL_Next, $10
LDI DelH_Next, $00
//прибавляем к длительности импульса
ADD DelL_Next, CtrL
ADC DelH_Next, CtrH
//начнем подсчет заново
CLR CtrL
CLR CtrH
//ПРОДОЛЖИМ ВЫДАЧУ ИМПУЛЬСА
DecDelay:
DEC DelL_Cur
BRNE FollowCount
TST DelH_Cur
BRNE DecDelayH
//Задержка ЗАКОНЧИЛАСЬ, загружаем НОВУЮ
MOV DelL_Cur, DelL_Next
MOV DelH_Cur, DelH_Next
RJMP ActuateSyg
DecDelayH:
DEC DelH_Cur
RJMP FollowCount
//АКТУАЛИЗАЦИЯ ТОЛЬКО ПОСЛЕ ЗАДЕРЖКИ!!!!!
ActuateSyg:
//выделяем предыдущее состояние OutSyg из флага
MOV PortCVal, Flags
LDI temp3,1<<OutSygFlag ;
AND PortCVal, temp3
EOR PortCVal, temp3 ;
EOR Flags, temp3
//актуализация сигнала (изменение на обратный)
OUT PORTC, PortCVal //выдача импульса
FollowCount:
INC CtrL ; и увеличиваем общий счетчик импульсов
BRNE SetTimer
INC CtrH
BRNE SetTimer
//ограничиваем длину входного импульса
SER CtrL
SER CtrH ;Counter=$FFFF
SetTimer:
//предустановка периода таймера на 1 тик
LDI temp1, $FF ;загружаем старший байт
OUT TCNT1H, temp1 ; Старший байт пошел!
LDI temp1, $FE ;загружаем младший байт
OUT TCNT1L, temp1 ; Младший байт пошел!
RETI