; 16-канальный приемник DO
; кодируется длиной промежутка.
; 1 МГц ATTiny2313A
; создатель: DANYK 
; http://danyk.cz

.NOLIST ;Выключить генерацию листинга  
.INCLUDE "tn2313Adef.inc";Вложить другой файл  
.LIST ;Включить генерацию листинга    

;DEF Назначить регистру символическое имя
.DEF REG=R16		;рабочий регистр
.DEF REG2=R17		;рабочий регистр 2
.DEF STAV=R18		;регистр состояния входа
.DEF VYST=R19		;выходной регистр
.DEF VYST_2=R20		;предыдущий выходной регистр
.DEF PRODLEVA=R21	;отложить до дальнейшей реакции
.DEF BITY=R22		;битовый счетчик
.DEF COUNT=R23      ;регистр задержек

;EQU Установить постоянное выражение
.EQU SMER=DDRB		;управление направлением  
.EQU PORT=PORTB		;порт  

.EQU SMER2=DDRD		;управление направлением  
.EQU PORT2=PORTD	;порт  

.EQU SMER3=DDRA		;управление направлением  
.EQU PORT3=PORTA	;порт  
.EQU PINY3=PINA		;входы

;CSEG Программный сегмент                    
.CSEG				;сегмент кода   

;ORG  Установить положение в сегменте
;RJMP Относительный переход
.ORG 0
RJMP START

.ORG OC0Aaddr
RJMP CAS_VYPRSEL

.ORG PCIAaddr
RJMP SIGNAL
	

START:

LDI REG,LOW(RAMEND)
OUT SPL,REG

;установить порт B
LDI REG,0b11111111
OUT SMER,REG
LDI REG,0b00000000
OUT PORT,REG

;установить порт D
LDI REG,0b01111111
OUT SMER2,REG
LDI REG,0b00000000
OUT PORT2,REG

;установить порт A
LDI REG,0b00000001
OUT SMER3,REG
LDI REG,0b00000010
OUT PORT3,REG

; НАСТРОЙКИ ТАЙМЕРА
LDI	REG,0b00000010 	; установить счетчик на ноль при настройке на сравнение ...
OUT	TCCR0A,REG    	; ... значения (так называемый CTC), OC0 не используется
LDI	REG,0b00000011 	; делитель 64
OUT	TCCR0B,REG    	; 
LDI	REG,213      	; устанавливает сравниваемое значение
OUT	OCR0A,REG     	; 

LDI	REG,0b00000001	; разрешить прерывание OCIE0A
OUT	TIMSK,REG    	; 



LDI	REG,0b00001000	; разрешить прерывание PCINT1
OUT	GIMSK,REG    	;

LDI	REG,0b00000010	; разрешить прерывание PCINT на PA1 (PCINT9)
OUT	PCMSK1,REG    	;

LDI	REG,0b00110000	;включить спящий режим и установить режим отключения питания
OUT	MCUCR,REG

;выключает аналог. компаратор - никогда не использовался (экономия энергии) 
LDI	REG,0b10000000	
OUT	ACSR,REG  

SEI

SMYCKA:
SLEEP
RJMP SMYCKA


SIGNAL:
IN STAV,PINY3
COM STAV	;инвертирует входной сигнал (приемник в состоянии покоя log1)

;Низкий уровень
SBRC STAV,1
RJMP NE_10

LDI REG,0
OUT TCNT0,REG

NE_10:

;Верхний уровень
SBRS STAV,1
RJMP NE_01

IN REG,TCNT0

CPI REG,3		;Порог колебания / длинного (короткого) импульса
BRLO ZAKMIT

CPI REG,53		;Длинный промежуток / пороговый промежуток
BRLO NE_KONEC_SNIMKU

RCALL KONTROLA

MOV VYST_2,VYST

NE_KONEC_SNIMKU:

LSL VYST
INC BITY
IN REG,TCNT0
CPI REG,13		;Порог короткого / длинного промежутка
BRLO KRATKA_M
INC VYST
KRATKA_M:

ZAKMIT:
NE_01:

LDI	REG,0b00100000	;включить спящий режим и установить режим ожидания
OUT	MCUCR,REG
RETI



CAS_VYPRSEL:

RCALL KONTROLA

CLR VYST
SER VYST_2

CLR PRODLEVA

LDI REG,0
OUT TCNT0,REG

LDI	REG,0b00110000	;включить спящий режим и установить режим отключения питания
OUT	MCUCR,REG
RETI



;проверьте правильность передачи
KONTROLA:
CPI BITY,9		;если количество бит не влезает, отбросьте код
BRNE SPATNE_BITY
CP VYST_2,VYST	;если 2 последовательных кода не совпадают, он не отвечает
BRNE RUZNE_KODY
RCALL PRIJEM
RUZNE_KODY:
CLR BITY
RET
SPATNE_BITY:
CLR VYST
CLR BITY
RET



PRIJEM:

CPI PRODLEVA,0
BREQ PRODLEVA_JE_0
RJMP KONEC_TL
PRODLEVA_JE_0:

MOV REG,VYST
SWAP REG
ANDI REG,0b00001111

MOV REG2,VYST
COM REG2
ANDI REG2,0b00001111

CP REG,REG2
BREQ SHODA
RJMP KONEC_TL
SHODA:

CLR REG2
LDI ZL,LOW(SKOK)
LDI ZH,HIGH(SKOK)
ADD ZL,REG
ADC ZH,REG2
IJMP

SKOK:
RJMP TL0
RJMP TL1
RJMP TL2
RJMP TL3
RJMP TL4
RJMP TL5
RJMP TL6
RJMP TL7
RJMP TL8
RJMP TL9
RJMP TL10
RJMP TL11
RJMP TL12
RJMP TL13
RJMP TL14
RJMP TL15


TL0:
IN REG,PORT
SBI PORT,2
RCALL DELAY
CBI PORT,2
RJMP KONEC_TL

TL1:
IN REG,PORT
SBI PORT,4
RCALL DELAY
CBI PORT,4
RJMP KONEC_TL

TL2:
IN REG,PORT2
SBI PORT2,3
RCALL DELAY
CBI PORT2,3
RJMP KONEC_TL

TL3:
IN REG,PORT2
SBI PORT2,2
RCALL DELAY
CBI PORT2,2
RJMP KONEC_TL

TL4:
IN REG,PORT
SBI PORT,3
RCALL DELAY
CBI PORT,3
RJMP KONEC_TL

TL5:
IN REG,PORT
SBI PORT,5
RCALL DELAY
CBI PORT,5
RJMP KONEC_TL

TL6:
IN REG,PORT
SBI PORT,6
RCALL DELAY
CBI PORT,6
RJMP KONEC_TL

TL7:
IN REG,PORT
SBI PORT,7
RCALL DELAY
CBI PORT,7
RJMP KONEC_TL

TL8:
IN REG,PORT2
SBI PORT2,1
RCALL DELAY
CBI PORT2,1
RJMP KONEC_TL

TL9:
IN REG,PORT
SBI PORT,0
RCALL DELAY
CBI PORT,0
RJMP KONEC_TL

TL10:
IN REG,PORT2
SBI PORT2,4
RCALL DELAY
CBI PORT2,4
RJMP KONEC_TL

TL11:
IN REG,PORT3
SBI PORT3,0
RCALL DELAY
CBI PORT3,0
RJMP KONEC_TL

TL12:
IN REG,PORT
SBI PORT,1
RCALL DELAY
CBI PORT,1
RJMP KONEC_TL

TL13:
IN REG,PORT2
SBI PORT2,6
RCALL DELAY
CBI PORT2,6
RJMP KONEC_TL

TL14:
IN REG,PORT2
SBI PORT2,5
RCALL DELAY
CBI PORT2,5
RJMP KONEC_TL

TL15:
IN REG,PORT2
SBI PORT2,0
RCALL DELAY
CBI PORT2,0
RJMP KONEC_TL

KONEC_TL:
DELAY:
LDI COUNT, 0xFF ;значение от 0x01 до 0xFF определяет длительность задержки
LABEL:
DEC COUNT
BRNE LABEL
RET
LDI PRODLEVA,1
RET

