; -------------------------------
;| Программа для приемника     |
;| радиоохранной сигнализации 
; ------------------------------| 
;                         

.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\tn2313def.inc"
.cseg
.org 0

rjmp Reset            ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt
rjmp Timer1_compa  ;*** совпадение таймера 1
rjmp Timer1_OVF    ;*** переполнение таймера 1  
rjmp Timer0_OVF    ;*** переполнение таймера 0 *****************************************
rjmp USART0_RX
rjmp USART0_UDRE
rjmp USART0_TX
rjmp ANALOG_COMP
rjmp PCINT
rjmp Timer1_compB
rjmp Timer1_compA
rjmp Timer0_compB
rjmp USI_START
rjmp USI_OVERFLOW
rjmp EE_READY
rjmp WDT_OVERFLOW
nop
nop
nop
nop
nop



nop
reset:
nop
ldi r22,RamEnd       ;инициализация стека
out SPl,r22



ldi r18, 0b11111111
ldi r17, 0b11011111
out ddrD,r17                 ;  настройка порта D, на ввод
out portD,r18                ;  подтягивающие резисторы на +
out ddrB, r18


ldi r27,0b00000010   ;разрешить прерывание таймера 1 по переполнению  Timer1_OVF
out TIMSK,r27

ldi r22,0b00000101  ;тактовый сигнал = CK/1024
out TCCR0,r22


nop
ldi r22,0        ;обнуление таймера
out TCNT0,r22

sei              ;разрешить прерывания
 
                  



;*********************************************

clr r30

ldi r29,15    ;для мигалки  (см. прерывание)
ldi r28,255    ;для мигалки  ----- + ------
rjmp mmm1


INT_0:
 
INT_1:
Timer1_capt:
Timer1_compa:  ;
Timer1_OVF:
;Timer0_OVF: ;***
USART0_RX:
USART0_UDRE:
USART0_TX:
ANALOG_COMP:
PCINT:
Timer1_compB:
Timer0_compA:
Timer0_compB:
USI_START:
USI_OVERFLOW:
EE_READY:
WDT_OVERFLOW:
reti



mmm1:
sei
clr r16 
clr r19
clr r17
clr r18
nop
in r16,pinD                  ;  вывод содержимого порта D, в R16
nop
sbrs r16,5      ; пропустить если бит 5 в регистре R16 установлен ( проверка на 1 в импульсе распознования    1)
rjmp mmm1
rcall decoder
nop
rcall display
nop
rjmp mmm1


;*****************************************************************************************************
;****************************************************
; ОБРАБОТЧИК ПРЕРЫВАНИЯ КОМПАРАТОРА
;****************************************************
;*****************************************************************************************************

Timer0_OVF: ;************************************ прерывание по переполнению 0 таймера (для  мигания)

nop
in r21,sreg
nop
nop
cbi portB,5
nop
nop
dec r28
breq n_s
nop
nop
v1:
nop
nop
dec r29
breq nsm
nop
nop
v2:
nop
nop
sbrs r30,1       ;   пропустить если установлен флажок
rjmp u
nop
nop
qm:
nop;
nop
sbis portb,4    ;   пропустить если установлен
rjmp z1
nop;
nop
sbic portb,4   ;   пропустить если очищен
rjmp p
nop
u:
out sreg,r21
nop
nop
nop
nop;
nop
reti ;**************************************** выход из обработчика ********************************************
z1:
nop
nop
sbi portB,4          ; - зажечь часто
nop
nop           
rjmp u
p:
nop
nop
cbi portB,4          ; - потушить
cbi portB,5
nop
nop
rjmp u
nsm:
nop
sbrs r30,0    ;   пропустить если установлен флажок
rjmp bv
nop
l:
nop
nop
sbi portB,5          ; - зажечь редко
nop
nop
bv:
ldi r29,15          
rjmp v2
n_s:                  ; -нет сигнала
sbr r30,1
nop
nop
sbi portb,6          ; - зажечь portc,0
nop
nop
ldi r28,255
rjmp v1




;                                 ****** П о д п р о г р а м м ы ******
;******************************************************************************************************************

display: ;зажигаем светодиоды!
nop
;ret
;in r21, sreg
cbr r19,1
nop
sbrc r19,5               ; пропустить если бит 5 в регистре R19 очищен
;sbi portB,7
rcall pi44
nop
sbrs r19,5               ; пропустить если бит 5 в регистре R19 установлен
;cbi portB,7 
rcall pi45
nop
sbrc r19,1               ; пропустить если бит 1 в регистре R19 очищен
rcall pi0
nop
sbrc r19,2               ; пропустить если бит 2 в регистре R19 очищен
rcall pi1
nop
sbrc r19,3               ; пропустить если бит 3 в регистре R19 очищен
rcall pi2
nop
sbrc r19,4               ; пропустить если бит 4 в регистре R19 очищен
rcall pi3
nop
;*****
sbi portb,6;  portc,0
nop  
rcall pause_2
rcall pause_2
rcall pause_2
nop
cbi portb,6         ;  потушить  portc,0
nop
nop
ldi r28,255            ;обнуление таймера
nop
ret

pi44:
sbr r30,0b00000001
nop
nop
sbi portb,7 ;  portc,1
nop
nop
;nop
ret
pi45:
cbr r30,0b00000001
nop
nop
cbi portb,7   ;portc,1
nop
nop
;nop
ret
pi0:
ldi r30,2
nop
sbi portB,0
nop
nop
ret
pi1:
ldi r30,2
nop
sbi portB,1
nop
nop
ret
nop
pi2:
ldi r30,2
nop
sbi portB,2
nop
nop
ret
nop
pi3:
ldi r30,2
nop
sbi portB,3
nop
nop
ret

;**************************************************************************************************************
decoder:  ; распознование импульсов
nop
nop
;ret
rcall pause_2 
nop
rcall pause_0
nop
rcall poisk1_2
nop
lsl r19    
rcall pause_2
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 2    
nop
rcall pause_2     
nop
rcall pause_0
nop
rcall poisk1_2               ; 1 или 0
nop
lsl r19      
rcall pause_2  
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 3     
nop
rcall pause_2     
nop
rcall pause_0
nop
rcall poisk1_2               ; 1 или 0
nop
lsl r19 
;cli   ; ********************************
rcall pause_2
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 4     
nop
rcall pause_2   
nop
rcall pause_0
nop
rcall poisk1_2               ; 1 или 0
nop
lsl r19     
rcall pause_2     
nop
rcall pause_0     
nop
rcall poisk1         ; тактовый 5     
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_2               ; 1 или 0
nop
lsl r19     
rcall pause_2     
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 6    
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_2               ; 1 или 0
nop
lsl r19     
rcall pause_2    
nop
rcall pause_0 
;cli
nop
rcall poisk1         ; тактовый 1  ;                          **********2**********
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_3               ; 1 или 0
nop
lsl r18    
rcall pause_2   
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 2    
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_3               ; 1 или 0
nop
lsl r18     
rcall pause_2  
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 3     
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_3               ; 1 или 0
nop
lsl r18    
rcall pause_2
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 4    
nop
rcall pause_2  
nop
rcall pause_0
nop
rcall poisk1_3               ; 1 или 0
nop
lsl r18     
rcall pause_2    
nop
rcall pause_0     
nop
rcall poisk1         ; тактовый 5     
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_3               ; 1 или 0
nop
lsl r18
rcall pause_2     
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 6    
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_3               ; 1 или 0
nop
lsl r18     
rcall pause_2
nop
rcall pause_0
nop
;cli
rcall poisk1         ; тактовый 1 ;                           **********3**********
nop
rcall pause_2  
nop
rcall pause_0
nop
rcall poisk1_4               ; 1 или 0
nop
lsl r17    
nop
rcall pause_2
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 2    
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_4               ; 1 или 0
nop
lsl r17     
nop
rcall pause_2
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 3      
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_4               ; 1 или 0
nop
lsl r17    
rcall pause_2
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 4     
nop
rcall pause_2   
nop
rcall pause_0
nop
rcall poisk1_4               ; 1 или 0
nop
lsl r17      
rcall pause_2     
nop
rcall pause_0     
nop
rcall poisk1         ; тактовый 5      
nop
rcall pause_2    
nop
rcall pause_0
nop
rcall poisk1_4               ; 1 или 0
nop
lsl r17    
rcall pause_2     
nop
rcall pause_0
nop
rcall poisk1         ; тактовый 6    
nop
rcall pause_2     
nop
rcall pause_0
nop
rcall poisk1_4               ; 1 или 0
nop
lsl r17     
rcall pause_2
nop    
cpse r17,r18  ; *************************** сверка 3-х посылок
rjmp mmm1
nop

cpse r18,r19
rjmp mmm1
nop

ret
;***************************************************************************************************************
;                                                    паузы
poisk1:
nop
;in r21, sreg
ldi r25,100
nop
rr6:
nop
in r16,pinD                  ;  вывод содержимого порта D, в R16
nop
dec r25
nop
brne ff6
rjmp mmm1
nop
ff6:
nop
sbrs r16,5     ; пропустить если бит 1 в регистре R16 установлен ( проверка на 1 в импульсе распознования    1)
rjmp rr6
nop
ret
poisk1_2:
nop
;in r21, sreg
ldi r25,25
nop
rr9:
nop
in r16,pinD                  ;  вывод содержимого порта D, в R16
nop
dec r25
nop
brne ff9
rjmp b0  ; если 0
nop
ff9:
nop
sbrs r16,5      ; пропустить если бит 1 в регистре R16 установлен ( проверка на 1 в импульсе распознования    1)
rjmp rr9   ; если 1
nop
cbr r19,1
nop
ret
b0:
nop
sbr r19,1
nop
ret
poisk1_3:
nop
;in r21, sreg
ldi r25,25
nop
rr10:
nop
in r16,pinD                  ;  вывод содержимого порта D, в R16
nop
dec r25
nop
brne ff10
rjmp b00  ; если 0
nop
ff10:
nop
sbrs r16,5      ; пропустить если бит 1 в регистре R16 установлен ( проверка на 1 в импульсе распознования    1)
rjmp rr10   ; если 1
nop
cbr r18,1
nop
ret
b00:
nop
sbr r18,1
nop
ret
poisk1_4:
nop
;in r21, sreg
ldi r25,25
nop
rr11:
nop
in r16,pinD                  ;  вывод содержимого порта D, в R16
nop
dec r25
nop
brne ff11
rjmp b000  ; если 0
ff11:
nop
sbrs r16,5      ; пропустить если бит 1 в регистре R16 установлен ( проверка на 1 в импульсе распознования    1)
rjmp rr11   ; если 1
nop
cbr r17,1
nop
ret
b000:
nop
sbr r17,1
nop
ret
;***************************************************************************************************
pause_0: 
nop
;in r21, sreg                  
          ldi r25,65  ;  задержка 2 (короткая)
          ldi r23,1
          ldi r24,1         
Loop0:    
          nop
          in r16,pinD                  ;  вывод содержимого порта D, в R16
		  nop
          sbrc r16,5      ; пропустить если бит 1 в регистре R16 сброшен ( проверка на 0 в импульсе     p)
		  rjmp mmm1     ; если 1
		  nop
          dec r25
          brne Loop0
          dec r23
          brne Loop0
          dec r24
          brne Loop0
		  ret
;pause_1:
;nop
;in r21, sreg                   
          ;ldi r25,100          ;  задержка
          ;ldi r23,40
          ;ldi r24,1
;Loop1:    ;dec r25
          ;brne Loop1
          ;dec r23
          ;brne Loop1
          ;dec r24
         ; brne Loop1
		 ; ret
pause_2:
nop
;                   
          ldi r25,3         ;  задержка 2 (короткая)
          ldi r23,2
          ldi r24,1
Loop2:    ;nop

          dec r25
          brne Loop2
          dec r23
          brne Loop2
          dec r24
          brne Loop2
		  nop
		  ret

;************************************************

