;********************************************************************************************************
;  kuber 		12 Ноября 2007г 16.30
;	Программа компилируются ассемблером gavrasm.
;	Параметры компиляции задаются в .BAT файле.
;   	Программатор "TwinPicks"
;
; Программа SKD контроллера совмещённого со считывателем карт/брелков RFID.
; Ко-во карт/брелков 10, добавление карт/брелков через мастер - карту/брелок.
; Кнопка "OPEN" - нормально разомкнутая, програмно защищена от залипания.
; Выход на замок - сильноточный полевой транзистор.
;
; int OSC 9.6 MZh
; BODLEVEL (00)- 4,3V
; Остальные FUSE по умолчанию.	
;
;********************************************************************************************************
;
;
.include "tn13def.inc"
;
;
.def 	temp      	 = R22
;
.def	temp_1	 = R23
.def    	temp_2     = R24
.def   	temp_3     = R25
;
.def	Flag_R	   = R26		; 0 бит, посылка Rfid считана
.def	Flag_RAM   = R27
;
.def	temp_mcusr =R5
;
;
;----------------------------------------------------------------------
;
.equ wait_open_ee		=13	; адрес в EEPROM константы времени открвтия замка.
.equ num_string		=14	; адрес в EEPROM номер следующей позиции  для записи.
.equ ee_adres_rfid_code	=15	; адрес в EEPROM мастер карты-брелка.
;
;----------------------------------------------------------------------
;
.dseg
;
count1:			.byte	1
pulse_led_with:		.byte	1
;
count_prog_off:		.byte	1
.equ	const_count_prog_off =50;	; константа выхода из режима программирования
;
count_master_prog:	.byte	1
.equ	count_master_read    =50	; константа для входа в режим программирования
;
;
.equ	pulse_led_const	     =3	; константа периода мигания светодиода в рабочем режиме
.equ	pulse_prog_led_const =1	; константа периода мигания светодиода в режиме программирования
;
;
.equ	releport 	 	= 1	; номер вывода управления реле (сдвоенный сильноточный полевой транзистор)
;
.EQU	bip_pin		= 3	; номер вывода управления бипером
.SET	bip_port		= PORTB


;
;Здесь находиться код считанной карты
;
ee_paket_byte1:	.byte	1	;
ee_paket_byte2:	.byte	1	;
ee_paket_byte3:  	.byte	1	;
ee_paket_byte4:  	.byte	1	;
;
;
wait_open_ram:	.byte	1 	; переменная -длительность открывания двери
;
;
.equ	knopka_in	= 0	; вывод порта управление кнопкой.
.equ	wait_open_const	= 1
;
;
;-------------------------------------------------------------
; Interrupt service vectors
.cseg
.org 0
;
	rjmp	Reset		; reset
	reti	;INT0addrs	; External Interrupt 0
	reti	;PCI0addrs	; External Interrupt Request 0
	reti	;OVF0addrs	; Timer/Counter0 Overflow
	reti	;ERDYaddrs	; EEPROM Ready
	reti	;ACIaddrs		; Analog Comparator
;
	rjmp	OC0Aaddrs	; Timer/Counter Compare Match A
;
;	rjmp	OC0Baddrs	; Timer/Counter Compare Match B
;	rjmp	WDTaddrs	; Watchdog Time-out
;	rjmp	ADCCaddrs	; ADC Conversion Complete
;
;====================================================================
;
;INT0addrs:
;	reti
;PCI0addrs:
;	reti
;OVF0addrs:
;	reti
;ERDYaddrs:
;	reti
;ACIaddrs:
;	reti
;OC0Aaddrs:
;	reti
;OC0Baddrs:
;	reti
;WDTaddrs:
;	reti
;ADCCaddrs:
;	reti
;
;-----------------------------------------------------------------
;
.include  "decoder_rfid_t13.asm"
.include  "EE_rfid_t13.asm"
;
; 	Start Программы
;
Reset:
;
	ldi temp,low(RAMEND)
	out SPL,temp
;
	ldi	temp,255-16	; Set up PORTB.
	out 	DDRB,temp
	ldi	temp,255-8-4-2	
	out	PORTB,temp
;
;
;-------------------------------
;Timer0 OC0A
;------------------------------
	ldi	temp,0b01000010	
	out	TCCR0A,temp
;
	ldi	temp,0b10000001	
	out	TCCR0B,temp
;
	ldi	temp,0b00000000
	out	TCNT0,temp
;
	ldi	temp,36		
	out	OCR0A,temp
;
	ldi	temp,1<<OCIE0A		
	out	TIMSK0,temp
;
;------------------------------------
;
	sbi	ACSR,7		; comparator disable
;
;------------------------------------
;
	clr	Flag_R
	clr	flag_RAM
;
	sts	(count1),flag_RAM
	sts	(wait_open_ram),flag_RAM
	sts	(count_prog_off),flag_RAM
	sts	(count_master_prog),flag_RAM
;
	ldi	temp,pulse_led_const
	sts	(pulse_led_with),temp
;
;-------------------------
;
	rcall	master_prog
;
	clr	temp
	out	MCUSR,temp
;
;-------------------------
;
.equ	const_del_tmr	=3
;
;

	sei
;
;*******************************
;Основной цыкл программы
;
main:
;
	rcall	detect			; Вызов подпрограммы считывания корточки
;
	sbrs	Flag_R,0			; Проверяем флаг(0-бит) считана ли любая карта
	rjmp	err_ready_ir
;
	rcall	EE_compare_Rfid_paket 	; Вызов подпрограммы сравнение с кодами карт хранящихся в EEPROM
;
err_ready_ir:
;
	sbrc	Flag_R,2	  		; Проверяем флаг(2-бит)  мастер карта
	rcall	master_bip		; Считана мастер-карта
	sbrc	Flag_R,3	   		; Проверяем флаг(3-бит)  карта из базы
	rcall	card_bip	   		; Считана карта-брелок доступа.
;
	rcall	knopka	   		; Вызов подпрограммы обработки нажатой кнопки
;
	sbrc	flag_RAM,4 		; 4 бит-флаг окончания программирования
	rcall	biper_end_prog
;  	
	rjmp	main
;
;*******************************
;
master_bip:
;
	cbr	Flag_R,0b00000100
;
	lds	temp_1,(count_master_prog)
	inc	temp_1
	sts	(count_master_prog),temp_1
	cpi	temp_1,count_master_read
	breq	mas_bip
	ret
mas_bip:
	clr	temp_1
	sts	(count_master_prog),temp_1
;
	rcall	knopka
;
	sbrs	flag_RAM,7
	rjmp	jp1	;добавление карт
	rjmp	jp2	;стирание   карт
;
;----------------------------
;
card_bip:
	cbr	Flag_R,0b00001000
;
	ldi	ZL,wait_open_ee
	rcall	EEprom_read
;
	andi	temp_1,0B00011111	; ограничение времени до 32 секунд
	sts	(wait_open_ram),temp_1
;
bip_rele:
;
	sbi	portb,releport
;
	rcall	biper
;
	ret
;
;----------------------------
;Подпрограмма ввода в память кодов карт.
master_prog:
;
	clr	temp_2
m_p1:
	rcall	knopka
;
	sbrs	flag_RAM,7
	ret
;
	rcall	delay500
	inc	temp_2
	cpi	temp_2,10
	brlo	m_p1
;
	sbr	flag_RAM,0B00001000 	; флаг программирования мастер карт
;
	ldi	temp_1,pulse_prog_led_const
	sts	(pulse_led_with),temp_1
;
	ldi	temp_1,0
	sts	(wait_open_ram),temp_1
;
	rcall	biper
;
	sei
;
	ldi	temp,const_count_prog_off
	sts	(count_prog_off),temp
;
	rcall	jp0
;
	ret
;
;----------------------------
;
;задержка 
;
del_11ms:
pause:
;
delay100:
	push	temp_1
	push	temp_2
	push	temp_3
;
	ldi	temp_3,100
;
d_Wms:	ldi	temp_1,0x14
d_Wms1:	ldi	temp_2,0x85
d_Wms2:	dec	temp_2
	brne	d_Wms2
	dec	temp_1
	brne	d_Wms1
	dec	temp_3
	brne	d_Wms
;
	pop	temp_3
	pop	temp_2
	pop	temp_1
;
	ret
;
delay500:
	rcall	delay100
delay400:
	rcall	delay100
delay300:	
	rcall	delay100
delay200:
	rcall	delay100
	rcall	delay100
;
	ret
;
;--
;
delay:
	push	temp
	ldi	temp,50
del0:
	dec 	temp
	brne	del0
	pop	temp
;
	ret
;
;------------------------------------------------
;
biper_end_prog:
;
	rcall	biper
	rcall	biper
	rcall	biper
	rcall	biper
	rcall	biper
;
	clr	Flag_R
	cbr	flag_RAM,0B00110000 	; Сбрасываем 5,4 бит-флаги окончания программирования
;
	ret
;
;------------------------------------------------
;
; Подпрграмма бипера (время звучания в (wait_open_ram))
biper:
;
	sbi	bip_port,bip_pin
	rcall	delay100
	cbi	bip_port,bip_pin
	rcall	delay100
;
	lds	temp,(wait_open_ram)
	tst	temp
	brne	biper
;
	ret
;
;
;------------------------------------------------
;Подпрограмма определения нажатия кнопки OPEN
;------------------------------------------------
;
;
knopka:
;
	ldi	temp_1,255-16-1		; Set up PORTB.
	out 	DDRB,temp_1
;
	rcall	delay
;
	sbic	PINB,knopka_in
	rjmp	knopka_off
;--
	rcall	delay
;--
	sbic	PINB,knopka_in
	rjmp	knopka_off
;--
;knopka_on
;
	sbrs	flag_RAM,7
	rcall	rd_var_wait_open
	sbr	flag_RAM,0b10000000 	; 7-флаг факт замыкания/размыкания кнопки
;
	rjmp	pin_restore
;--
knopka_off:
;
	cbr	flag_RAM,0b10000000 	; 7-флаг факт замыкания/размыкания кнопки
;
pin_restore:
;
	ldi	temp_1,255-16		; Set up PORTB.
	out 	DDRB,temp_1
;
	ret
;
;--
;чтение переменной открытия замка
;
rd_var_wait_open:
;
	lds	temp_1,(wait_open_ram)
	tst	temp_1
	breq	rd_var_1
	ret
;
rd_var_1:
;
	ldi	ZL,wait_open_ee
	rcall	EEprom_read
;
	andi	temp_1,0B00011111      	; ограничение времени до 32 секунд
	sts	(wait_open_ram),temp_1
;
	in	temp_1,MCUSR
	sbrs	temp_1,0	   	       	; флаг программирования мастер карт
	rcall	bip_rele
;
	sbr	flag_RAM,0b00000001  	; 0-флаг замыкания кнопки
;
	ret
;
;********************************************************************
;	Обработка прерывания от модуля сравнения OC0A
;
;Timer0 OCA
OC0Aaddrs:
;
	in	S,sreg
	inc	timer_Lo
;
	mov	push_temp,temp	
;	
	inc	inttemp
	brne	TIM0_OVF_exit
;
	inc	inttemp2
	brne	TIM0_OVF_exit
;
	inc	timer_Hi
;
	lds	temp,(pulse_led_with)
;---
	cp	timer_Hi,temp
	brlo	fir_st
;
	ldi	timer_Hi,0
;
	lds	temp,(count_prog_off)
	tst	temp
	breq	no_progrs
	cpi	temp,1
	brne	no_prog_off_bip
;
;
	sbr	flag_RAM,0B00010000 	; 4 бит-флаг окончания программирования
;
no_prog_off_bip:
;
	dec	temp
	sts	(count_prog_off),temp
	rjmp	yes_progrs
;
no_progrs:
	cbr	flag_RAM,0B00101000 	; 5,3 бит-флаг программирования мастер карт сброшен
;
	ldi	temp_1,pulse_led_const
	sts	(pulse_led_with),temp_1
;
yes_progrs:
;
	lds	temp,(wait_open_ram)
	tst	temp
	breq	no_count_wait_open
	dec	temp
	sts	(wait_open_ram),temp
	rjmp	cou1
;
no_count_wait_open:
;
	cbi	portb,releport		; отключение реле
;
;
	lds	temp,(count1)
	cpi	temp,0
	breq	cou1
	ldi	temp,0
	sts	(count1),temp
;
	cbi	portb,2
;
	rjmp	fir_st
;
cou1:
	sbi	portb,2
;
	ldi	temp,1
	sts	(count1),temp
;
fir_st:
;
TIM0_OVF_exit:
	out	sreg,S
;
	mov	temp,push_temp
;
	reti
;
;********************************************************************
;
;Записать мастер карту
;
jp0:
	ldi	temp_1,1
	ldi	ZL,wait_open_ee
	rcall	EEprom_write
;
jp00:
	sbrs	flag_RAM,3 		;ф лаг программирования мастер карт
	ret
;
	rcall	detect
;
	sbrc	Flag_R,0
	rcall	count_master_wait
;
	rjmp	jp00
;
;--------
;
count_master_wait:
;
	ldi	temp_1,1			; Указатель записей в 1 - code card
	ldi	ZL,num_string
	rcall	EEprom_write
;
	ldi	temp_1,0
	rcall	EE_wr_master_4bytes
;
;
	ldi	ZL,wait_open_ee
	rcall	EEprom_read
	inc	temp_1
	rcall	EEprom_write
;
	rcall	biper
;
	ldi	temp,const_count_prog_off
	sts	(count_prog_off),temp
;
	ret
;----------
;
;==
;Запись кодов карт-брелков
;
jp1:
;
	ldi	temp,pulse_prog_led_const
	sts	(pulse_led_with),temp
;
;
	ldi	temp_1,const_count_prog_off
	sts	(count_prog_off),temp_1
;
jp11:
;
	lds	temp,(count_prog_off)
	tst 	temp	
	brne	jp111
;
	ldi	temp,pulse_led_const
	sts	(pulse_led_with),temp
;
	rjmp	biper_end_prog
;
jp111:
	ldi	ZL,num_string
	rcall	EEprom_read
;
	cpi	temp_1,11		; 10 Максимальное кол-во ключей t13(10)
	brsh	ee_key_yes		; больше или равно-память заполнена
;
	rcall	detect
;
	sbrs	Flag_R,0
	rjmp	jp11
;
	rcall	EE_compare_Rfid_paket
;
	sbrc	Flag_R,3
	rjmp	ee_key_yes
;
	sbrc	Flag_R,2
	rjmp	ee_key_yes
;
	rcall	EE_wr_rf_4bytes
;
	ldi	ZL,num_string
	rcall	EEprom_read
	inc	temp_1
	rcall	EEprom_write
;
	rjmp	e_ky			; ключ записан в память
;==
;Стереть все коды карт-брелков
;
jp2:
;
	rcall	EE_erase_all
;
	ldi	temp_1,1			; Указатель записей в начало списка
	ldi	ZL,num_string
	rcall	EEprom_write
;
	sbi	bip_port,bip_pin
	rcall	delay500
	rcall	delay500
	cbi	bip_port,bip_pin
;
	ret
;
;-------------------------------------
ee_key_yes:
;
	rcall	biper
e_ky:
	rcall	biper
;
	ldi	temp_1,const_count_prog_off
	sts	(count_prog_off),temp_1
;
	rjmp	jp11
;
;-------------------------------------
;
