переключение по флагу Т
обработка в Т1_OVF
жду реакции


Код: Выделить всё
.equ ms10 = 25535 //0x63BF
Код: Выделить всё
; cli ; обязательно иначе получиш в TCNT1 хз-что
; и запись нового значения в power
; сбросить флаг Т чтобы чтобы цикл начался правильно
; сбросит флаг TOV1 он мог установиться за время вычисления
; а начинать надо точно с началом положительной полуволны!Код: Выделить всё
T1_OVF:
;вкл упр. импульс задержка > 2мкс (2.25мкс)
sbi OutPort, (1<<OutPin)
ldi tmp, 9
delay:
dec tmp
brne del
cbi OutPort,(1<<OutPin)
; проверка флага Т и ветвление
brts t1_001 ;если второй цикл переход
; грузим 10мс
ldi tmp,low(ms10)
ldi tmp1,high(ms10)
out TCNT1H,tmp1
out TCNT1L,tmp
; и меняем флаг Т на 1, для второго прохода
set
rjmp t1_exit
t1_001:
; отключаем T1
ldi tmp,T1_off
out TCCR1B,tmp
; записываем в счетчик Т1 текушего значения power
ldi tmp,low(power0)
ldi tmp1,high(power0)
out TCNT1H,tmp1
out TCNT1L,tmp
; таймер стоит, ничего не считает, в TCNT1 значение power!
; и меняем флаг Т на 0, для нового цикла
clt
; Т1 готов к новому циклу
t1_exit:
reti
Код: Выделить всё
T1_OVF:
in tmp,sreg
push tmp
;вкл упр. импульс задержка > 2мкс (2.25мкс)
sbi OutPort, (1<<OutPin)
ldi tmp, 9
delay:
dec tmp
brne del
cbi OutPort,(1<<OutPin)
; проверка флага Т и ветвление
brts t1_001 ;если второй цикл переход
; грузим 10мс
ldi tmp,low(ms10)
ldi tmp1,high(ms10)
out TCNT1H,tmp1
out TCNT1L,tmp
; и меняем флаг Т на 1, для второго прохода
pop tmp
out sreg,tmp
set
rjmp t1_exit
t1_001:
; отключаем T1
ldi tmp,T1_off
out TCCR1B,tmp
; записываем в счетчик Т1 текушего значения power
ldi tmp,low(power0)
ldi tmp1,high(power0)
out TCNT1H,tmp1
out TCNT1L,tmp
; таймер стоит, ничего не считает, в TCNT1 значение power!
; и меняем флаг Т на 0, для нового цикла
pop tmp
out sreg,tmp
clt
; Т1 готов к новому циклу
t1_exit:
reti
1. почему ;cli запрет прерываний не использовал
2. сбросить флаг Т чтобы чтобы цикл начался
3. сбросить флаг TOV1 он мог установиться за время вычисления
а начинать надо точно с началом положительной полуволны!

next:
nop
nop
sbi OutPort,(1<<OutPin)
; где-то здесь будеш вычислять новое значени power
; собственно вычисление power
; cli ; обязательно иначе получиш в TCNT1 хз-что
; и запись нового значения в power
; сбросить флаг Т чтобы чтобы цикл начался правильно
; сбросит флаг TOV1 он мог установиться за время вычисления
; а начинать надо точно с началом положительной полуволны!
; sei ; не забываем разрешить работу
rjmp next
Код: Выделить всё
int_0:
in tmp,sreg
push tmp
; запускаем Т1
sbi OutPort,(1<<OutPin)
; ldi tmp,T1_on
; out TCCR1B,tmp
pop tmp
out sreg,tmp
reti
Код: Выделить всё
[color=red]delay: [/color]
dec tmp
brne [color=red]del[/color]Код: Выделить всё
ldi tmp,(1<<ISC01)+(1<<ISC00) ; это так для порядка - сначала ст.бит, затем мл.бит
out MCUCR,tmp ;INT0