выход с запрещенными прерываниями - красивое решение.
Добавлено after 22 minutes 53 seconds:
извиняюсь, есть там проход через разрешение всех прерываний.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Код: Выделить всё
;==============
; Процедура обработки прерывания по событию захвата таймера 1
tc1capt: in r14, SREG
set ; Установка флага события для основного цикла
add r10, r1 ; Инкремент номера события
adc r11, r0
mov r2, r18 ; Сохранение старого временного штампа
mov r3, r19
mov r4, r20
mov r5, r21
in r18, ICR1L ; Чтение аппараной части временного штампа
in r19, ICR1H
mov r20, r12 ; Чтение программной части временного штампа
mov r21, r13
in r15, TIFR ; Проверка наличия флага переполнения
sbrs r15, TOV1
rjmp tc1capt_1 ; Если установлен, то продолжить
mov r15, r19 ; Проверка старшего бита аппараной части ВШ
sbrc r15, 7
rjmp tc1capt_1 ; Если сброшен, то продолжить
add r20, r1 ; Коррекция программной части ВШ
adc r21, r0
tc1capt_1: out SREG, r14
reti
;==============
; Процедура обработки прерывания по переполнению таймера 1
tc1ovf: in r14, SREG
add r12, r1
adc r13, r0
out SREG, r14
reti
;==============
Я правильно понимаю, что если у МК имеется несколько запланированных прерываний, то выполнятся будет то, которое выше по списку?Аlex писал(а):Этот вариант исключён.B@R5uk писал(а):Вариант Г
1) Событие захвата;
2) Событие переполнения;
3) Обработка события переполнения;
4) Обработка события захвата.
Из-за накладки результат получается неправильный. Программная часть временного штампа на единицу больше, чем надо.
The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request 0
Сегодня голова чего-то не варит, целый день сплю. Есть такое чувство что что-то в коде не так, возможно ложное.B@R5uk писал(а):Z_h_e, я правильно понял вашу идею?
Код: Выделить всё
.def zero=R1
.def Len0=R2
.def Len1=R3
.def Len2=R4
.def Len3=R5
.def Old0=R6
.def Old1=R7
.def CountOVF0=R8
.def CountOVF1=R9
.def store=R14
.def buf=r16Код: Выделить всё
//------------------------------
TIM1_OVF:
in Store,SREG
inc CountOVF0
ADC CountOVF1,zero
out SREG,Store
retiКод: Выделить всё
TIM1_CAPT:
in Store,SREG
push buf
//захваченные данные
in Len0,ICR1L
in Len1,ICR1H
mov Len2,CountOVF0
mov Len3,CountOVF1
BST Len1,7 //если захвачены счетчик больше половины
brTS NetDob
in buf, TIFR //если произошло событие переполнения
andi buf,1<<TOV1
breq NetDob
inc Len2 //добавляем единичку
adc len3,zero
out TIFR,buf //сброс флага переполнения
NetDob:
//вычитаем старое значение
Sub Len0,Old0
SBC Len1,Old1
Sbc Len2,zero
sbc Len3,zero
//новое старое значение
in Old0,ICR1L
in Old1,ICR1H
//сброс счетчика переполнений
clr CountOVF0
clr CountOVF1
set //флаг события захвата длины импульса
pop buf
out SREG,Store
retiДавно не прогал на асме, забывается, а в справочник не смотрел. Да, тут другое решение нужно. Можно как и у ТС, держать единицу в регистре. А если использовать индексный регистра, то еще проще.Starichok51 писал(а):инкремент не устанавливает флаг переноса.
Хотел так, но тогда результат куда-то сохранять надо будет.Starichok51 писал(а):зачем занимать еще 2 регистра?
Код: Выделить всё
TIM1_CAPT:
in Store,SREG
;
;
set //флаг события захвата длины импульса
;
out SREG,Store
retiВ АВР-студии есть автоотступ по типу как в мелкосовтовской визуальной студии. Остальные места — ручками. Табуляции везде, кроме комментариев, очень удобно для выравнивания.НАПАЛМ писал(а):Я имею в виду именно написание в студии.
Вот вы очень внимательны, завидую. Я эту ошибку обнаружил, только когда в железе попробовал, — МК ничего в комп не слал.akl писал(а):Извините, ошибочная конструкция.