Делаю простенькую сигнализацию для квартиры на ATtiny13a, пишу на ассемблере, частота камня 4.8 МГц, + утсновлен предделитель частоты на 8.
Суть работы сигналки в следующем: при выходе из квартиры человек включает потайной переключатель, который подаёт питание на МК.
Пока дверь открыта (люди выходят), сигналка должна пищать, оповещая о своей работе.
Когда дверь закрылась (все вышли), пищалка выключается, сигалка ждёт открытия двери.
Когда дверь снова открывается (например, вошёл злоумышленник), пищалка включается и пищит без остановки (до выключения питания).
А теперь суть просьбы: напишите, пожалуйста, кусок кода, чтобы реализовать счётчик открывания двери и работу пищалки постоянно.
Всё, что мне удалось написать - это включение пищалки по нажатию кнопки (открытию двери):
.include "tn13Adef.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def zero=R20
.def status=R21
.cseg ;начало программного сегмента
.org 0 ;начальный адрес = 0
;******************
;Векторы прерываний
;******************
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp PCINT0t ; PCINT0 Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TIM0_COMPA ; Timer0 CompareA Handler
rjmp TIM0_COMPB ; Timer0 CompareB Handler
rjmp WATCHDOG ; Watchdog Interrupt Handler
rjmp AnDC ; ADC Conversion Handler
;RESET
EXT_INT0:
PCINT0t:
TIM0_OVF:
EE_RDY:
ANA_COMP:
TIM0_COMPA:
;TIM0_COMPB:
WATCHDOG:
AnDC:
reti
;****************************************************
; ИНИЦИАЛИЗАЦИЯ
;****************************************************
Reset:
ldi Temp,low(RamEnd) ;установка указателя стека
out SPL,Temp
sbi DDRB,4
ldi Temp,(TIMSK0|0b00001000) ;разрешить прерывание компаратора
out TIMSK0,Temp
ldi Temp,(TCCR0B|0b00000010) ;тактовый сигнал = CK/8
out TCCR0B,Temp
ldi Temp,0x01 ;инициализация компаратора
out OCR0B,Temp
sbi PORTB,3 ;подтянуть PB3 к Vcc
ldi Temp,0
ldi Temp2,250
ldi Temp3,5
ldi zero,0
ldi status,0 ; 0 = тишина, 1 = писк
out TCNT0,zero ;обнуление таймер
;****************************************************
; ОСНОВНОЙ ЦИКЛ
;****************************************************
main:
sbis PINB,3
sei
sbic PINB,3
cli
rjmp main ;бесконечный цикл
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************
TIM0_COMPB:
out TCNT0,zero ;обнуление таймера
cpi status,1
breq pisk
;;;;;;;;;;;;;;;;;;;; Тишина ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dec Temp2
brne exit
dec Temp3
brne exit
ldi Temp2,250
ldi Temp3,5
inc status
;;;;;;;;;;;;;;;;;;;;; Писк ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pisk: sbis PINB,4
sbi PORTB,4
sbic PINB,4
cbi PORTB,4
dec Temp2
brne exit
dec Temp3
brne exit
ldi Temp2,250
ldi Temp3,5
dec status
reti
exit: reti ;выход из обработчика






