;***********************************************************************
;* f osc = 8 MHz internal RC
;* CKSEL3:0 0100
;* mega8A
;***********************************************************************

;for pcf
;0x100	CONTROL_STATUS_1
;0x101	CONTROL_STATUS_2
;0x102	VL_SECONDS
;0x103	MINUTES
;0x104	HOURS
;0x105	DAYS
;0x106	WEEKDAYS 0..6 Su..Sa
;0x107	CENTURY_MONTHS 1..12
;0x108	YEARS
;0x109	MINUTE_ALARM
;0x10A	HOUR_ALARM
;0x10B	DAY_ALARM
;0x10C	WEEKDAY_ALARM
;0x10D	CLKOUT_CONTROL
;0x10E	TIMER_CONTROL
;0x10F	TIMER

;for ds
; 0x00 CH=0  3x 10sec     4x 1sec
; 0x01  0    3x 10min     4x 1min
; 0x02  0 PMAM=0 2x 10H   4x 1H
; 0x03  0    0   0  0     0  3x day of week
; 0x04  0    0   2x 10D   4x 1D
; 0x05  0    0   0 10M    4x 1M
; 0x06  4x 10Year         4x 1Year
; 0x07 OUT=0 0   0 SQWE=0 0  0 RS1=0 RS0=0
;ch - clock halt
;OUT - level when SQWE=0
;SQWE - Square-Wave Enable
;RS - rate select

;***********************************************************************

.include	"m8def.inc"
.nolist				
;.def		bcd2dec  = R2
.def		timecnt  = R7	;счетчик прерываний
.def		celscnt  = R8	;счетчик прерываний
.def		btnumber = R9	;для DS18B20
.def		iodata   = R10	;для DS18B20
.def		iodataL  = R11	;для DS18B20
.def		resmode	 = R12
.def		msec	 = R13
.def		keycnt	 = R14
.def		delaycnt = R15	;счетчик для задержки
.def		temp     = R16
.def		minutes	 = R17
.def		hours	 = R18
.def		flags    = R19
.equ		f_TERMO  = 0
.equ		f_minus  = 1
.equ		f_TIME	 = 2
.equ		f_I2CErr = 3
.equ		f_Tout	 = 4
.equ		f_less10 = 5
.equ		f_VL	 = 6
.equ		f_Terr	 = 7
.def		flags2	 = R20
.equ		f_correct= 0
.equ		f_PCF	 = 1
.equ		f_PM	 = 2
.equ		f_minut	 = 3

.def		razryad  = R21
.def		setupcnt = R22
.def		seconds	 = R23
.def		buferL   = R24
.def		buferH   = R25
;			XL		 = R26
;			XH		 = R27
;			YL		 = R28
;			YH		 = R29
;			ZL		 = R30
;			ZH		 = R31



;---------- описание портов ----------------
.equ	S_Port	= PORTB			; сегменты
;					76543210
.equ	S_a		= 0b00000100
.equ	S_b		= 0b00000001
.equ	S_c		= 0b01000000
.equ	S_d		= 0b00010000
.equ	S_e		= 0b00100000
.equ	S_f		= 0b00000010
.equ	S_g		= 0b10000000
.equ	S_h		= 0b00001000
.equ	Off		= 0b00000000
.equ	R_Port	= PORTC			; разряды
.equ	modebutt= 2	;PC
.equ	downbutt= 3	;PC
.equ	upbutt  = 0	;PC
.equ	notbutt	= 1	;PC			;off in setup
;.equ	SDA		= 4
;.equ	SCL		= 5
.equ	K_Port	= PORTD			; кнопки
.equ	PortS	= PORTD			; датчики/регистры
.equ	PortFoto= PORTD			; Foto датчик

.equ	DatPin	= 0
.equ	LatchPin= 1
.equ	CLKPin	= 2
.equ	KeyPin	= 3
.equ	FOTOPin	= 4
.equ	TinPin	= 5
.equ	ToutPin	= TinPin
.equ	BuzzPin	= 7


;---------Constants-------
.equ	bspeed=18				;80Hz/18=4,4 такта в сек 
.equ	maxtimecnt=40			;40=125ms/3,125ms time refresh
.equ	maxcelscnt=3			;seconds termometr refresh
.equ	PCF_ADR			= 0xA3	;for WR A2
.equ	DS_ADR			= 0xD1

.equ	CONVERTT    	= 0x44
.equ	READSCRATCHPAD	= 0xBE
.equ	SKIPROM			= 0xCC

;------RAM--------
;* $060-0FF empty
;0x01xx
.equ	RAM_PCF			=0x00
.equ	RAM_Disp		=0x10	;to 0x12 Data to display
.equ	RAM_Segm		=0x14	;to 0x16 Segmented data
.equ	RAM_Hex			=0x18	;to 0x1C Result of hex2dec
.equ	RAM_Sec			=0x1D	;oldsec
.equ	RAM_Cor			=0x1E	;correct sec per week
.equ	RAM_ResF		=0x1F	;Result of filter
.equ	RAM_Filt		=0x20	;to 0x25 tmp data,adres,4 bytes filter
.equ	RAM_Reg			=0x28	;to 0x6F	


.MACRO macroWaitLdStatus
		out		TWCR, temp
		clr		buferL
wait_twint:
		inc		buferL
		breq	PC+5		;--\
		in		temp, TWCR	;	|
		sbrs	temp, TWINT	;   |
		rjmp	wait_twint	;   |
		in		temp, TWSR	;<--/
		andi 	temp,0xF8
.ENDM
;--------Начало главного програмного кода-----------

.cseg						;выбор сегмента програмного кода
.org 0						;установка текущего адреса на 0

;********************************************************************
;*               Векторы прерываний 								*        
;********************************************************************
		rjmp	RESET	;0x000 Pin, Power-on, Brown-out, Watchdog Reset
		reti			;0x001 INT0 External Interrupt Request 0
		reti			;0x002 INT1 External Interrupt Request 1
		reti			;0x003 TIMER2_COMP Timer/Counter2 Compare Match
		reti			;0x004 TIMER2_OVF Timer/Counter2 Overflow
		reti			;0x005 TIMER1_CAPT Timer/Counter1 Capture Event
		rjmp	COMPA	;0x006 TIMER1_COMPA Timer/Counter1 Compare Match A
		rjmp	COMPB	;0x007 TIMER1_COMPB Timer/Counter1 Compare Match B
		reti			;0x008 TIMER1_OVF Timer/Counter1 Overflow
		rjmp	TOVRF	;0x009 TIMER0_OVF Timer/Counter0 Overflow
		reti			;0x00A SPI_STC Serial Transfer Complete
		reti			;0x00B USART_RXC USART, Rx Complete
		reti			;0x00C USART_UDRE USART Data Register Empty
		reti			;0x00D USART_TXC USART, Tx Complete
		reti			;0x00E ADC ADC Conversion Complete
		reti			;0x00F EE_RDY EEPROM Ready
		reti			;0x010 ANA_COMP Analog Comparator
		reti			;0x011 TWI Two-wire Serial Interface
		reti			;0x012 SPM_RDY Store Program Memory Ready

SIMV:
;they will be ON (255-... inverse)
;   -a-
;  f   b
;  |-g-|  
;  e   c
;   -d-
	.db	255-(S_a|S_b|S_c|S_d|S_e|S_f)		,255-(S_b|S_c)				  ;0,1
	.db	255-(S_a|S_b|S_d|S_e|S_g)			,255-(S_a|S_b|S_c|S_d|S_g)	  ;2,3
	.db	255-(S_b|S_c|S_f|S_g)				,255-(S_a|S_c|S_d|S_f|S_g)	  ;4,5
	.db	255-(S_a|S_c|S_d|S_e|S_f|S_g)		,255-(S_a|S_b|S_c)			  ;6,7
	.db	255-(S_a|S_b|S_c|S_d|S_e|S_f|S_g)	,255-(S_a|S_b|S_c|S_d|S_f|S_g);8,9
	.db	255-(S_a|S_d|S_e|S_f|S_g)			,255-(S_e|S_g)				  ;E,r
	.db	255-(S_g)							,255-(S_a|S_f|S_e|S_d)		  ;-,C
	.db	255-(S_d)							,255-Off					  ;_,space
SEGM:	;4*11 +FF
;0 1 2 3 4 5 6 7 8 9 0 1		col2
	.db	0b11110111,0b00111000	;D11,D10
	.db	0b01001000,0b00000000	;D09,D08
	.db	0b00101001,0b10001000
	.db	0b00010100,0b10001110
	.db	0b00010001,0b01001011
	.db	0b01100000,		0b11111111
;- - - - - - - - - - 1 1		col1
	.db	0b11111111,0b00111110
	.db	0b01111111,0b11111111
	.db	0b11111111,0b11111111
	.db	0b11111111,0b11111111
	.db	0b11111111,0b11111111
	.db	0b11111111,		0b11111111
;2 3 4 5 6 7 8 9 0 1 2 3		col4
	.db	0b11110010,0b00001001
	.db	0b00011100,0b11100001
	.db	0b00000001,0b00000000
	.db	0b10100110,0b00100000
	.db	0b01010110,0b00100100
	.db	0b10000101,		0b11111111
;1 1 1 1 1 1 1 1 2 2 2 2		col3
	.db	0b11111100,0b10001001
	.db	0b00010010,0b00100100
	.db	0b01111001,0b11110011
	.db	0b11100111,0b11001111
	.db	0b10011110,0b01111100
	.db	0b11111001,		0b11111111
;0 5 0 5 0 5 0 5 0 5 0 5 		col6
	.db	0b11110110,0b01000000
	.db	0b01001001,0b00000001
	.db	0b00000101,0b01000000
	.db	0b00010100,0b01000000
	.db	0b01010000,0b00010101
	.db	0b00000000,		0b11111111
;    1 1 2 2 3 3 4 4 5 5 		col5
	.db	0b11111110,0b01000100
	.db	0b10001100,0b01011000
	.db	0b10001001,0b00010010
	.db	0b10001001,0b00010011
	.db	0b10011110,0b01111111
	.db	0b11111111,		0b11111111
;--------------------------------------------------------
conversion:		;Disp->temp->Segm
		ldi		ZH,1
		ldi		ZL,RAM_Disp
CONV_LOOP:
		ld		temp,Z+
		push	ZH
		push	ZL
		ldi		ZH,High(2*SIMV)
		ldi		ZL,Low (2*SIMV)
		cbr		temp,$F0							;ограничить символы 0-F
		add		ZL,temp
		lpm		temp,Z
		pop		ZL
		pop		ZH

		cpi		ZL,RAM_Disp+2						;point
		brne	nopoint
		tst		setupcnt
		brne	nopoint
		sbrs	flags,f_less10
		cbr		temp,S_h
nopoint:
		std		Z+(RAM_Segm-RAM_Disp-1),temp		;сохранить в новой области памяти
		cpi		ZL,(RAM_Disp+3)
		brne	CONV_LOOP
		ret
;----------------------------------------------
hex2dec:		;in buferH,buferL out RAM_Hex 5 byte (used temp) 
		ldi		ZH,$01
		ldi		ZL,RAM_Hex
		clr		temp
five:
		subi	buferL,LOW(10000)	
		sbci	buferH,HIGH(10000)
		inc		temp
		brcc	five
		subi	temp,(-$2F)
		st		Z+,temp
		subi	buferL,LOW(-10000)	
		sbci	buferH,HIGH(-10000)
		clr		temp
four:
		subi	buferL,LOW(1000)	
		sbci	buferH,HIGH(1000)
		inc		temp
		brcc	four
		subi	temp,(-$2F)
		st		Z+,temp
		subi	buferL,LOW(-1000)	
		sbci	buferH,HIGH(-1000)
		clr		temp
tres:
		subi	buferL,LOW(100)	
		sbci	buferH,HIGH(100)
		inc		temp
		brcc	tres
		subi	temp,(-$2F)
		st		Z+,temp
		subi	buferL,LOW(-100)	
		clr		temp
dous:
		subi	buferL,10
		inc		temp
		brcc	dous
		subi	temp,(-$2F)
		st		Z+,temp
		subi	buferL,-$3A
		st		Z+,buferL
		ret

I2C_SETADRES:
		cbr		flags,(1<<f_I2CERR)
;send start 
		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTA)
		macroWaitLdStatus
		cpi 	temp,0x08
		brne	SETADRESERROR
;start transmission of address
		ldi		temp, PCF_ADR			;const PCF adres
		sbrs	flags2,f_PCF
		ldi		temp, DS_ADR			;DS adres to read
		cbr		temp,(1<<0)				;to write
		out		TWDR, temp
		ldi		temp,(1<<TWINT)|(1<<TWEN)
		macroWaitLdStatus
		cpi 	temp,0x18
		brne	SETADRESERROR
;set $00 addres
		ldi		temp, $00
		out		TWDR, temp
		ldi		temp,(1<<TWINT)|(1<<TWEN)
		macroWaitLdStatus
		cpi 	temp,0x28
		brne	SETADRESERROR
		ret							;Adres has been writen
SETADRESERROR:
;		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
;		out		TWCR, temp
		sbr		flags,(1<<f_I2CERR)
		ret							;Adres error

I2C_READ:
		sbrc	flags,f_I2CERR
		rjmp	I2C_ERROR
;Send ReStart
		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTA)
		macroWaitLdStatus
		cpi 	temp,0x10
		breq	PC+2
		rjmp	I2C_ERROR
;Send Slave Adres
		ldi		temp, PCF_ADR			;PCF adres to read
		sbrs	flags2,f_PCF
		ldi		temp, DS_ADR			;DS adres to read
		out		TWDR, temp
		ldi		temp,(1<<TWINT)|(1<<TWEN)
		macroWaitLdStatus
		cpi 	temp,0x40
		brne	I2C_ERROR
;ReadDATA to Y=0x100 for time
		ldi		YH,0x01
		ldi		YL,RAM_PCF
READ_LOOP:
		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)
		macroWaitLdStatus
		cpi 	temp,0x50
		brne	I2C_ERROR
		in		temp,TWDR
		st		Y+,temp
		cpi		YL,RAM_PCF+0x0F
		sbrs	flags2,f_PCF
		cpi		YL,RAM_PCF+0x07
		brcs	READ_LOOP
;last byte noACK
		ldi		temp,(1<<TWINT)|(1<<TWEN)
		macroWaitLdStatus
		in		temp,TWDR
		st		Y+,temp
;Send STOP
		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
		out		TWCR, temp
		ret
I2C_ERROR:
		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
		out		TWCR, temp
		sbr		flags,(1<<f_I2CERR)
		ret

I2C_WRITE:
		ldi		YH,1
		ldi		YL,RAM_PCF
WRITE_LOOP:
		ld		temp,Y+
		out		TWDR,temp
		ldi		temp,(1<<TWINT)|(1<<TWEN)
		out		TWCR, temp			;start transmission of address
		clr		buferL				;anticrash counter
waitackN:
		inc		buferL
		breq	PC+5				;escape from loop
		in		temp,TWCR
		sbrs	temp,TWINT			;ACK has been received
		rjmp	waitackN
		in		temp,TWSR
		andi	temp,0xF8
		cpi		temp,0x28			;Data Transmitted, ACK has been received
		brne	I2C_ERROR
		cpi		YL,RAM_PCF+16
		brne	WRITE_LOOP
		ldi		temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
		out		TWCR, temp
		ret

;******************************************************************
;*		            DS18B20 TERMOMETR	@8MHz				  	  *
;******************************************************************
;------------------------------------------------------------------
IN_BYTE:
		cbi		PORTS,TinPin		;0 на DataPin
		cbi		PORTS,ToutPin		;0 на DataPin
		ldi		temp, 8
		mov		btnumber, temp
IN_BIT:
		cli							;Global Interrupt Disable
;---- Momentary low for 2,5us ----
		sbrc	flags,f_Tout
		sbi		PORTS-1,ToutPin
		sbrs	flags,f_Tout
		sbi		PORTS-1,TinPin		;настраиваем DataPin на вывод
		nop							;	\
		nop							;	 nop
		nop							;	/
		ldi		temp,1
		rcall	delay
		sbrc	flags,f_Tout
		cbi		PORTS-1,ToutPin
		sbrs	flags,f_Tout
		cbi		PORTS-1,TinPin		;настраиваем DataPin на ввод
;---------------------------------
		ldi		temp,9				;10 MCS delay
		rcall	delay

		in		temp,PORTS-2
		sbrc	flags,f_Tout
		bst		temp,ToutPin
		sbrs	flags,f_Tout
		bst		temp,TinPin			;Tflag stored

		sec 						;Set Carry
		brts	PC+2				;skip if T Set 
		clc 						;Clear Carry
		ror		iodata
		ldi		temp,53				;54 MCS delay
		rcall	delay
		sei							;Global Interrupt Enable
		dec		btnumber	
		brne	IN_BIT
		ret
;
;------------------------------------------------------------------
OUT_BYTE:   						;outs byte from iodata
		cbi		PORTS,TinPin		;0 на DataPin
		ldi		temp,8
		mov		btnumber,temp
OUT_BIT:
		cli							;Global Interrupt Disable
		ror		iodata
		brcc	OUT_0
;out1
		sbrc	flags,f_Tout		;\
		sbi		PORTS-1,ToutPin		; \
		sbrs	flags,f_Tout		;  \
		sbi		PORTS-1,TinPin		;   настраиваем DataPin на вывод
		nop							;\
		nop							; nop
		nop							;/
		ldi		temp,1
		rcall	delay

		sbrc	flags,f_Tout		;\
		cbi		PORTS-1,ToutPin		; \
		sbrs	flags,f_Tout		;  \
		cbi		PORTS-1,TinPin		;   настраиваем DataPin на ввод

		ldi		temp, 79			;80 MCS delay
		rcall	delay
		rjmp	OUT_0_END		
OUT_0:
		sbrc	flags,f_Tout		;\
		sbi		PORTS-1,ToutPin		; \
		sbrs	flags,f_Tout		;  \
		sbi		PORTS-1,TinPin		;   настраиваем DataPin на вывод

		ldi		temp, 79			;80 MCS delay
		rcall	delay

		sbrc	flags,f_Tout		;\
		cbi		PORTS-1,ToutPin		; \
		sbrs	flags,f_Tout		;  \
		cbi		PORTS-1,TinPin		;   настраиваем DataPin на ввод

		nop							;\
		nop							; nop
		nop							;/
		ldi		temp,1
		rcall	delay
OUT_0_END:
		sei							;Global Interrupt Enable
		dec		btnumber
		brne	OUT_BIT
		ret


INITIALIZING:
		sbr		flags,(1<<f_I2CERR)	; error by default
;настраиваем DataPin на вывод
		sbrc	flags,f_Tout
		sbi		PORTS-1,ToutPin
		sbrs	flags,f_Tout
		sbi		PORTS-1,TinPin
;500 MCS delay
		ldi		temp,249
		rcall	delay
		ldi		temp,249
		rcall	delay
;Global Interrupt Disable
		cli
;настраиваем DataPin на ввод
		sbrc	flags,f_Tout
		cbi		PORTS-1,ToutPin
		sbrs	flags,f_Tout
		cbi		PORTS-1,TinPin		
;52 MCS delay
		ldi		temp, 51			
		rcall	delay
;Global Interrupt Enable
		sei
;Test LowLevel
		in		temp,PORTS-2
		sbrc	flags,f_Tout
		bst		temp,ToutPin
		sbrs	flags,f_Tout
		bst		temp,TinPin			;Tflag stored
		brtc	PC+2				;skip if T Clr 
		ret
;500 MCS delay
		ldi		temp,249
		rcall	delay
		ldi		temp,249
		rcall	delay
;Test HighLevel
		in		temp,PORTS-2
		sbrc	flags,f_Tout
		bst		temp,ToutPin
		sbrs	flags,f_Tout
		bst		temp,TinPin			;Tflag stored
		brts	PC+2				;skip if T Set 
		ret
		cbr		flags,(1<<f_I2CERR)	;noError
		ret
REFRESH:
		ldi		temp,SKIPROM
		mov		iodata,temp
		rcall	OUT_BYTE
		ldi		temp,CONVERTT
		mov		iodata,temp
		rcall	OUT_BYTE
		ret
READDATA:
		ldi		temp,SKIPROM
		mov		iodata,temp
		rcall	OUT_BYTE
		ldi		temp,READSCRATCHPAD
		mov		iodata,temp
		rcall	OUT_BYTE
		rcall	IN_BYTE
		mov		iodataL,iodata				
		rcall	IN_BYTE				;iodata:iodataL xxxSTTTT TTTTDDDD
TEMP2DEC:
		cbr		flags,(1<<f_minus)
		bst		iodata,4			;4bit = minus (Store Bit to T Flag)
;------- преобразование ----------
		brtc	noninverting
		sbrc	flags,f_Tout
		sbr		flags,(1<<f_minus)	;Tin не имеет минуса
		com		iodata
		com		iodataL
		ldi		temp,1
		add		iodataL,temp
		ldi		temp,0			;ldi not change SREG
		adc		iodata,temp
noninverting:
		ldi		temp,160
		mul		temp,iodataL
		mov		iodataL,R1
		mul		temp,iodata
		clr		temp
		add		R0,iodataL
		adc		R1,temp
;for hex2dec
		mov		buferL,R0
		mov		buferH,R1
		rcall	hex2dec
		ret
;-------------------------------------------------------------------
BCD2dec: 
;convert seconds BCD to dec 
;buferL=0x59 -> buferL=60 uses temp,R2
		push	R0
		push	R1
		ldi		temp,6
		mov		R2,temp
		mov		temp,buferL
		swap	temp
		andi	temp,0x07			;most of second 7F max
		mul		temp,R2
		sub		buferL,R0			;dec = BCD-high(bcd)*6
		pop		R1
		pop		R0
		ret
;----------------- delay temp+1 uS ------------
;		ldi		temp,1				;1
delay:						;rcall 	 3
		push	temp				;2
		pop		temp				;2
		nop							;1
		dec		temp				;1
		brne	delay				;2
		ret							;4
;----------------------------------------------
clrreg:
		ldi		temp,84
clrall:		
		cbi		PortS,ClkPin		;Clock
		sbi		PortS,DatPin		;Data
		dec		temp
		sbi		PortS,ClkPin		;Clock
		brne	clrall
		cbi		PortS,ClkPin		;Clock
		cbi		PortS,DatPin		;Data
		ret
;-------------------------------------------------------------------
;**********************************************************************
;*       НАЧАЛО ПРОГРАММЫ											  *
;**********************************************************************
RESET:
		cli							;запретить все прерывания
		clr		temp
		out		EECR, temp			;обнулить EEPROM Control Register
		out		GICR, temp			;interrupt vectors at start of FlashMEM
		out		MCUCR,temp			;Sleep Disable ;Sleep Mode = Idle
									;Interrupt Sense Control = Low level of INT1(0)
;		out		WDTCR, R30			;Watchdog Disable
		ldi		temp,0x18
		out		WDTCR,temp
		ldi		temp,0x0E			;Watchdog Enable 1sec
		out		WDTCR,temp
;--------Очистка SRAM-------------------------------
		ldi		YL, LOW(RAMEND-0x60)
		ldi		YH, HIGH(RAMEND-0x60)
		ldi		XL, 0x60			;X=0x0060
CLEAR_SRAM:
		st		X+, R30				;R30=0 adress 060..45F
		sbiw	YL, 1				;3FF..0
		brne	CLEAR_SRAM			;branch if not zero

;--------Инициализация стека------------------------
		ldi		temp, LOW(RAMEND)	;выбор адреса вершины стека
		out		SPL, temp			;запись его в регистр стека
		ldi		temp, HIGH(RAMEND)	;выбор адреса вершины стека
		out		SPH, temp			;запись его в регистр стека

;--------Инициализация портов-----------------------
		ldi		temp, 0b11111111	
		out		S_Port-1,temp		;DDR 1=out сегменты
		out		R_Port-1,temp		;DDR 1=out разряды
		ldi		temp, 0b00000000	
		out		PortS-1, temp		;DDR 0=in датчики

		ldi		temp, 0b11111111	
		out		R_Port,temp			;Razryad off
		out		S_Port,temp			;Segment off
		ldi		temp, 0b00000000	
		out		PortS,temp			;0=no pull-up

		cbi		K_Port-1,KeyPin		;buttons in
		cbi		K_Port,KeyPin		;buttons no pullup
		cbi		PortFoto-1,FOTOPin	;Светодиод in
		cbi		PortS-1,TinPin		;термометр in
		cbi		PortS-1,ToutPin		;термометр in
		sbi		PortS-1,DatPin		;registers out
		sbi		PortS-1,LatchPin	;registers out
		sbi		PortS-1,ClkPin		;registers out
		sbi		PortS-1,BuzzPin		;Динамик out
;-------- Инициализация таймера TMR0 -----------------
;		ldi		temp,0b00000001		;WGM=normal CLK/1
;		out		TCCR0,temp
;		ldi		temp,(1<<TOIE0)
		clr		temp	
		out		TIMSK,temp			;off
;  CS02 01  00 и CS12 11  10
;	0	0	0	no
;	0	0	1	Clk/1
;	0	1	0	Clk/8
;	0	1	1	Clk/64
;	1	0	0	Clk/256
;	1	0	1	Clk/1024
;-------- Инициализация таймера TMR1 -----------------
		ldi		temp,0b00000000
		out		TCCR1A,temp
		ldi		temp,0b00001001		;WGM=CTC CLKio/1
		out		TCCR1B,temp

		ldi		temp,high(25000)	;80Hz=12,5ms/4=3125us 
		out		OCR1AH,temp
		ldi		temp,low(25000)		;25000=3125*8MHz
		out		OCR1AL,temp

		ldi		temp,high(25001)	;>A max light
		out		OCR1BH,temp
		ldi		temp,low(25001)		;half brigtness
		out		OCR1BL,temp

		in		temp,TIMSK
		ori		temp,(1<<OCIE1A)|(1<<OCIE1B)
		out		TIMSK,temp			;compa,b
;-------- Инициализация АЦП --------------------------
;		ldi		temp,0b10001110 	;ADC=On Prescaler=64 (125kHz @ 8MHz)
;		out		ADCSRA,temp			;	Int Enable
;		ldi		temp,0b00000110		;Multiplexer to ADC6 right adjusted
;		out		ADMUX,temp
;-------- Инициализация TWI ----------------------------
;SCL freq = Clk/(16+2*TWBR*Prescaller)
		ldi		temp, 32			;8000k/(16+2*32)=100k
		out		TWBR, temp			;bitrate	
		ldi		temp, (1<<TWEN)
		out		TWCR, temp			;Enable TWI
		ldi		temp, (1<<TWEN)
		out		TWSR, temp			;status
;-------- Read EEPROM mega8 ----------------------------
		ldi		YH,1
		ldi		YL,RAM_Cor
		ldi		temp,0				;EEPROM adress
		out		eearh,temp			
		out		eearl,temp			
		sbi		eecr,eere			;Read Enable
		in		buferL,eedr			;read data
		sbrc	buferL,7
		sbr		buferL,0b01100000	; все числа до 31 и знак
		sbrs	buferL,7
		cbr		buferL,0b01100000	; все числа до 31 и знак
		st		Y+,buferL			;corrector
;-------- Установка начальных значений -----------------
		ldi		XL,Ram_Filt
		ldi		XH,1
		ldi		temp,0
		st		X+,temp				;temp data
		ldi		temp,Ram_Filt+2
		st		X,temp				;pos of filter = begin of filter
		ldi		temp,80
		ldi		XL,RAM_ResF
		st		X,temp

		ldi		seconds,60
		ldi		minutes,60
		ldi		hours,24
		ldi		setupcnt,0
		ldi		temp,bspeed
		mov		keycnt,temp
		ldi		temp,60
		mov		msec,temp
		clr		flags

		ldi		temp,maxtimecnt
		mov		timecnt,temp
		ldi		temp,5				;1s
		mov		celscnt,temp
;clrscr
		ldi		YH,0x01
		ldi		YL,RAM_Disp
		ldi		temp,0x0A			;E
		st		Y+,temp
		ldi		temp,0x0B			;r
		st		Y+,temp
		st		Y+,temp
		rcall	conversion
		ldi		temp,0b11111110
		mov		razryad,temp


;---------load12hoursegment
		ldi		YH,1
		ldi		YL,RAM_Reg
		ldi		ZH,High(2*SEGM)
		ldi		ZL,Low (2*SEGM)
LOAD_LOOP:
		lpm		temp,Z+
		st		Y+,temp			;сохранить в новой области памяти
		cpi		YL,(RAM_Reg+72)
		brne	LOAD_LOOP
;---------
		sei							;enable all interrupt
;------------------------------------------------------------
;refresh temperature
		sbr		flags,(1<<f_Tout)
		rcall	INITIALIZING
		rcall	REFRESH
		clr		resmode				;сбросить watchdog режима настройки
;--------- Основной цикл -----------------------------
;
;___HHHHH__HHHHHH___HH____HHHHH__HHHHHH___
;__HH________HH____H__H___HH__HH___HH_____
;__HH________HH___HH__HH__HH__HH___HH_____
;___HHHH_____HH___HH__HH__HHHHH____HH_____
;______HH____HH___HHHHHH__HHHH_____HH_____
;______HH____HH___HH__HH__HH_HH____HH_____
;__HHHHH_____HH___HH__HH__HH__HH___HH_____
;
START:
		WDR
		sbrc	flags, f_TERMO
		rjmp	DS18B20Read
		sbrc	flags, f_TIME
		rjmp	TIMERead
		rjmp	START


DS18B20Read:
		sbr		flags,(1<<f_Tout)
		cbr		flags,(1<<f_TERMO)
		cbr		flags2,(1<<f_minut)				;clr 0,5,10...55

		tst		setupcnt
;rem to test lighness
;		breq	PC+2
		rjmp	RefreshT						;no data to screen in setup















		rcall	INITIALIZING
		rcall	READDATA
		ldi		YH,0x01		
		ldi		YL,RAM_Disp						;старший разряд
		sbrc	flags,f_I2CERR
		rjmp	Terror
		cbr		flags,(1<<f_less10)
		ldd		temp,Y+(RAM_Hex-RAM_Disp+2)		;3-я цифра
		andi	temp,0x0F						;символ -> цифра
		cpi		temp,0
		brne	notzero
		ldi		temp,0x0F			;' '		;незначащий ноль
		sbrc	flags,f_minus
		ldi		temp,0x0C			;'-'
		cbr		flags,(1<<f_minus)				;больше минус не ставить
notzero:
		sbrs	flags,f_minus
		rjmp	notless10
		sbr		flags,(1<<f_less10)
		ldi		temp,0x0C			;'-'
		st		Y+,temp							;старший разряд
		ldd		temp,Y+(RAM_Hex-RAM_Disp+1)		;3-я цифра опять
		st		Y+,temp							;средний разряд
		ldd		temp,Y+(RAM_Hex-RAM_Disp+1)		;2-я цифра
		st		Y+,temp							;последний разряд
		rcall	conversion						;первой нет
		rjmp	RefreshT
notless10:
		st		Y+,temp							;старший разряд
		ldd		temp,Y+(RAM_Hex-RAM_Disp+2)		;2-я цифра
		st		Y+,temp							;средний разряд
		ldd		temp,Y+(RAM_Hex-RAM_Disp+2)		;1-я цифра
		st		Y+,temp							;последний разряд
		rcall	conversion
		rjmp	RefreshT
Terror:
		ldi		temp,0x0A		;'E'
		st		Y+,temp							;старший разряд
		ldi		temp,0x0B		;'r'
		st		Y+,temp							;средний разряд
		st		Y+,temp							;последний разряд
		rcall	conversion
RefreshT:
		rcall	INITIALIZING
		rcall	REFRESH
		rjmp	START
;---------------------------------------------------------------
TIMERead:
		cbr		flags,(1<<f_TIME)


;lightness calculation
		ldi		YL,RAM_Filt+2		;set position to begin
		ser		buferH				;FF
		ser		buferL				;FF
calcsum:
		ld		temp,Y+
		sub		buferL,temp
		ldi		temp,0
		sbc		buferH,temp
		cpi		YL,RAM_Filt+6
		brne	calcsum
		lsr		buferH
		ror		buferL
		lsr		buferH
		ror		buferL

		ldi		YL,RAM_ResF
		st		Y,buferL

;write result of calc light sum to Disp
		clr		buferH
		rcall	hex2dec
		ldi		YL,RAM_Disp
		ldd		temp,Y+(RAM_Hex+2-RAM_Disp)		;3-я цифра
		st		Y+,temp
		ldd		temp,Y+(RAM_Hex+2-RAM_Disp)		;2-я цифра
		st		Y+,temp
		ldd		temp,Y+(RAM_Hex+2-RAM_Disp)		;1-я цифра
		st		Y+,temp
		rcall	conversion
;end of write






; test in setup mode
		tst		setupcnt
		breq	PC+2
		rjmp	timegood

		sbr		flags2,(1<<f_PCF)
		rcall	I2C_SETADRES
		rcall	I2C_READ
		sbrs	flags,f_I2CERR
		rjmp	timegood
		cbr		flags2,(1<<f_PCF)
		rcall	I2C_SETADRES
		rcall	I2C_READ
		ldi		YH,1		
		sbrs	flags,f_I2CERR
		rjmp	DS2PCF
;if I2C error display all or nothing
		ldi		buferL,61
		mov		msec,buferL
		mov		seconds,buferL
		mov		minutes,buferL
		mov		hours,buferL
		cbr		flags2,(1<<f_PM)
		rjmp	START
DS2PCF:
		ldi		YL,RAM_PCF+5
		ld		temp,-Y							;day
		std		Y+1,temp
		ld		temp,-Y							;dow
		std		Y+3,temp
		ld		temp,-Y							;hour
		std		Y+2,temp
		ld		temp,-Y							;min
		std		Y+2,temp
		ld		temp,-Y							;sec
		std		Y+2,temp
timegood:
		ldi		YL,RAM_PCF+2
		ld		buferL,Y+						;sec
		ldd		buferH,Y+(RAM_Sec-RAM_PCF-3)	;oldsec
		cp		buferH,buferL

		brne	nightmode
		rjmp	PCF2Minutes						;sec not changed
nightmode:
;from 22 to 6 no msec moving
		ldd		buferH,Y+1						;hour
		andi	buferH,0x3F
		cpi		buferH,0x22
		brpl	endmove
		cpi		buferH,0x06
		brmi	endmove
;if error no msec move
		sbrs	buferL,7						
		clr		msec							;sec changed
endmove:
		std		Y+(RAM_Sec-RAM_PCF-3),buferL	;newsec
PCF2Minutes:
		ld		buferL,Y+						;min
		andi	buferL,0x7F
		rcall	BCD2DEC
		mov		minutes,buferL
;PCF2Hours
		ld		buferL,Y+						;hour
		andi	buferL,0x3F
		rcall	BCD2DEC
;12hour format
		subi	buferL,12						;0..23
		brmi	AM
PM:
		sbr		flags2,(1<<f_PM)				;12..23
		rjmp	end12h
AM:
		subi	buferL,-12						;get back
		cbr		flags2,(1<<f_PM)				;0..11
end12h:
		lsl		buferL							;*2
		cpi		minutes,30
		brmi	PC+2
		inc		buferL							;+0,5 hour
		mov		hours,buferL

		tst		setupcnt
		brne	SETUP


;for correction will be later !!!!!!!!!!!!!!!!!!!!!
		rjmp	endofcorrect


		ldi		YL,RAM_Cor
		ld		temp,Y				;corrector
		cpi		temp,0
		breq	endofcorrect
		sbrs	temp,7
		rjmp	positive
		com		temp
		inc		temp
positive:
		ldi		YL,RAM_PCF+$04
		ld		buferH,Y			;hr
		andi	buferH,0x3F
		cpi		temp,8
		brmi	less8
		cpi		temp,15
		brmi	less15
		cpi		temp,22
		brmi	less22


		cpi		buferH,0x05
		breq	check59
		subi	temp,7
less22:
		cpi		buferH,0x17
		breq	check59
		subi	temp,7
less15:
		cpi		buferH,0x11
		breq	check59
		subi	temp,7
less8:
		ldi		YL,RAM_PCF+$06
		ld		buferL,Y			;dow
		cp		buferL,temp
		brpl	endofcorrect		;dow>correctinweek goto end
		cpi		buferH,0x23
		breq	check59
		rjmp	endofcorrect
check59:
		ldi		YL,RAM_PCF+$03		
		ld		buferL,Y			;min
		andi	buferL,0x7F
		cpi		buferL,0x59
		brne	endofcorrect
		ldi		YL,RAM_Cor
		ld		temp,Y				;corrector
		ldi		YL,RAM_PCF+$02		
		ld		buferL,Y			;sec
		andi	buferL,0x7F
		cpi		buferL,0x04
		brne	check6
		sbr		flags2,(1<<f_correct)
check6:
		sbrs	flags2,f_correct
		rjmp	endofcorrect
		cpi		buferL,0x06
		brne	endofcorrect
		cbr		flags2,(1<<f_correct)
		sbrs	temp,7
		inc		buferL
		sbrc	temp,7
		dec		buferL
		st		Y,buferL			;sec
		rcall	I2C_SETADRES
		rcall	I2C_WRITE
endofcorrect:		
		rjmp	START


SETUP:
;разместить в байтах data to display полубайты из:
;в режиме
;1			0x103 m
;2			0x104 h
;3			0x106 day of week
;4			I2C_write

;clear all
		ldi		YH,1
		ldi		YL,RAM_Disp
		ldi		buferL,0x0F			;' '
		st		Y+,buferL			;десятки
		st		Y+,buferL			;еденицы
		st		Y+,buferL			;десятые
	
		cpi		setupcnt,1
		brne	cpimode2	
		ldi		YL,RAM_PCF+$03		;min		
		ld		buferL,Y+
		andi	buferL,0x7F
		rjmp	mode12
cpimode2:
		cpi		setupcnt,2
		brne	cpimode3
		ldi		YL,RAM_PCF+$04		;hour
		ld		buferL,Y
		andi	buferL,0x3F
mode12:
		mov		buferH,buferL
		andi	buferL,0x0F
		swap	buferH
		andi	buferH,0x07
		std		Y+(RAM_Disp+2-RAM_PCF-4),buferL	;еденицы
		std		Y+(RAM_Disp+1-RAM_PCF-4),buferH	;десятки
		rcall	conversion
		rjmp	endsetup
cpimode3:	
		cpi		setupcnt,3
		brne	cpimode4
		ldi		YL,RAM_Cor
		ld		buferL,Y			;correct sec per week
		ldi		YL,RAM_Disp
		ldi		temp,0x0F			;' '
		sbrs	buferL,7
		rjmp	corrnotminus
		com		buferL
		inc		buferL
		ldi		temp,0x0C			;'-'
corrnotminus:
		st		Y+,temp

		andi	buferL,0x1F			;no sign
		clr		buferH
convHEX2DEC:
		inc		buferH
		subi	buferL,10
		brcc	convHEX2DEC
		dec		buferH
		subi	buferL,-10
				
		st		Y+,buferH
		st		Y+,buferL	
		rcall	conversion
		rjmp	endsetup
cpimode4:
		cpi		setupcnt,4
		brne	endsetup
;mode4 
;clear all
		ldi		YH,1
		ldi		YL,RAM_Disp
		ldi		buferL,0x0F			;' '
		st		Y+,buferL			;десятки
		st		Y+,buferL			;еденицы
		st		Y+,buferL			;десятые
		rcall	conversion

		ldi		temp,0				;EEPROM adress
		ldi		YL,RAM_Cor			;corrector
;writeEEPROM
		ld		buferL,Y+		
		out		eedr,buferL
		out		eearl,temp
		cli							;disable all interrupt
		sbi		eecr,eemwe			;Master Write Enable
		sbi		eecr,eewe			;Write Enable
		sei							;enable all interrupt
WaitWriteComplite:
		sbic	eecr,eewe			;WaitWriteComplite
		rjmp	WaitWriteComplite
;сбросить секунды
		ldi		seconds,0
		ldi		YL,RAM_Sec
		ldi		temp,0x59
		st		Y+,temp
		ldi		temp,60
		mov		msec,temp

		ldi		YL,RAM_PCF
		ldi		temp,0
		st		Y+,temp
		st		Y+,temp
		st		Y+,temp					;sec=00
		ldi		YL,RAM_PCF+0x05
		ldi		temp,1					;day
		st		Y+,temp
		ld		temp,Y					;dow
		andi	temp,0x07
		st		Y+,temp
		ldi		temp,1
		st		Y+,temp					;month
		st		Y+,temp					;year
		ldi		YL,RAM_PCF+0x0D
		ldi		temp,0x80				;CLKOUT=32768
		st		Y+,temp
;correct pcf\ds
		sbrc	flags2,f_PCF
		rjmp	endpcf2ds

		ldi		YL,RAM_PCF
		ldd		temp,Y+2					;sec
		st		Y+,temp
		ldd		temp,Y+2					;min
		st		Y+,temp
		ldd		temp,Y+2					;hour
		st		Y+,temp
		ldd		temp,Y+3					;dow
		st		Y+,temp
		ldd		temp,Y+1					;day
		st		Y+,temp
endpcf2ds:		
		rcall	I2C_SETADRES
		rcall	I2C_WRITE
		sbrs	flags,f_I2CERR
		clr		setupcnt
		ldi		temp, 1
		mov		celscnt,temp
		rjmp	TIMERead
endsetup:
		rjmp	Start

;*****************************************************
;*--------- Прерывание ------------------------------*
;*****************************************************
COMPA:								;every 3,125ms
		push	temp
		in		temp,SREG
		push	temp
		push	buferL
		push	buferH

; сменить разряды
		sec		
		rol		razryad					;<--
		sbrc	razryad,4
		rjmp	notlast
		ldi		razryad,0b11111110
		ldi		temp,60
		cp		msec,temp
		brne	incmsec
		ldi		XL,RAM_Sec					;oldsec
		ld		buferL,X
		rcall	BCD2DEC
		subi	buferL,-1
		cpi		buferL,60
		brne	PC+2
		clr		buferL
		mov		seconds,buferL				;newsec
		rjmp	notlast
incmsec:
		inc		msec					;for seconds rotate
notlast:



;convert secminhour to reg bufer
		sbrc	razryad,0
		rjmp	Trazr1
;11 bytes of minutes
		mov		buferL,minutes
		neg		buferL				;buferL=-buferL
		subi	buferL,-59			;buferL(59..0)=59-buferL(0..59)
		mov		buferH,hours
		neg		buferH				;buferH=-buferH
		subi	buferH,-24			;buferH(24..1)=23-buferH(0..23)
;blinking
		sbrs	celscnt,1
		rjmp	endblinking			;2,5Hz blink
		ldi		temp,bspeed
		cp		temp,keycnt			;if key pressed no blink
		brne	endblinking
		cpi		setupcnt,1
		brne	PC+2
		ldi		buferL,61			;blink min		
		cpi		setupcnt,2
		brne	PC+2
		ldi		buferH,25			;blink hour
endblinking:

		ldi		temp,12				;takts number
loop12takts:
;7bit
		subi	buferL,1			;59 min
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brpl	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;6bit
		subi	buferL,1			;58 min
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brpl	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;5bit
		subi	buferL,1			;57 min
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brpl	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;4bit
		subi	buferH,1			;11,5 hour
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;3bit
		subi	buferL,1			;56 min
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brpl	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;2bit
		subi	buferL,1			;55 min
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brpl	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;1bit
		subi	buferH,1			;11 hour
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register

		dec		temp
		brne	loop12takts
		rjmp	latchimp

Trazr1:
		sbrc	razryad,1
		rjmp	Trazr2
;11 bytes of seconds
		mov		buferH,msec
		cpi		buferH,60
		brne	PC+2
		ldi		buferH,-62			;out of reach after 60 msec takts
		add		buferH,seconds
		sbrc	seconds,7
		ldi		buferH,-62			;out of reach if error in data

		neg		buferH				;buferH=-buferH
		subi	buferH,-60			;buferH(60..1)=60-buferH(0..59)

		mov		buferL,seconds
		neg		buferL				;buferL=-buferL
		subi	buferL,-60			;buferL(60..1)=60-buferL(0..59)

		ldi		temp,12				;takts number
loop12taktssec:
;7bit
		subi	buferL,1			;59 sec
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		subi	buferH,1			;59 msec
		brpl	PC+2
		subi	buferH,-60	
		cpi		buferH,3
		brpl	PC+4
		cpi		buferH,0
		brmi	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;6bit
		subi	buferL,1			;58 sec
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		subi	buferH,1			;58 msec
		brpl	PC+2
		subi	buferH,-60	
		cpi		buferH,3
		brpl	PC+4
		cpi		buferH,0
		brmi	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;5bit
		subi	buferL,1			;57 sec
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		subi	buferH,1			;57 msec
		brpl	PC+2
		subi	buferH,-60	
		cpi		buferH,3
		brpl	PC+4
		cpi		buferH,0
		brmi	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;4bit
		nop
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;3bit
		subi	buferL,1			;56 sec
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		subi	buferH,1			;56 msec
		brpl	PC+2
		subi	buferH,-60	
		cpi		buferH,3
		brpl	PC+4
		cpi		buferH,0
		brmi	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;2bit
		subi	buferL,1			;55 sec
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		brne	PC+2
		cbi		PortS,DatPin
		subi	buferH,1			;55 msec
		brpl	PC+2
		subi	buferH,-60	
		cpi		buferH,3
		brpl	PC+4
		cpi		buferH,0
		brmi	PC+2
		cbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register
;1bit
		nop
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		nop
		sbi		PortS,ClkPin		;Clock shift register

		dec		temp
		breq	PC+2
		rjmp	loop12taktssec
		rjmp	latchimp
Trazr2:
		ldi		XL,RAM_Reg			;ed
		sbrc	flags2,f_PM
		ldi		XL,RAM_Reg+24		;ed PM

		sbrc	flags2,f_minut
		ldi		XL,RAM_Reg+48		;ed min

		sbrc	razryad,2
		subi	XL,-12				;des



sendhoursegment:
		ldi		temp,11
loop11bytes:
		ld		buferH,X+
		ldi		buferL,8
loop8bit:
		cbi		PortS,ClkPin
		sbi		PortS,DatPin
		sbrs	buferH,7
		cbi		PortS,DatPin
		lsl		buferH
		dec		buferL
		sbi		PortS,ClkPin		;Clock shift register
		brne	loop8bit
		dec		temp
		brne	loop11bytes

latchimp:
		cbi		PortS,ClkPin
		cbi		PortS,DatPin

		ser		temp					;-- hide segments
		out		S_PORT,temp				;/
		sbi		R_PORT,0				;\
		sbi		R_PORT,1				; \
		sbi		R_PORT,2				;  }hide razr
		sbi		R_PORT,3				; /

		sbi		PortS,LatchPin
		nop
		ldi		XH,1
		nop
		cbi		PortS,LatchPin			; new sec min hour


		sbrc	razryad,0
		rjmp	sbrrazr1
		cbi		R_PORT,0
		ldi		XL,RAM_Segm
		rjmp	newsegments
sbrrazr1:
		sbrc	razryad,1
		rjmp	sbrrazr2
		cpi		setupcnt,0
		brne	sbrrazrend
		cbi		R_PORT,1
		rjmp	sbrrazrend
sbrrazr2:
		sbrc	razryad,2
		rjmp	sbrrazr3
		cbi		R_PORT,2
		ldi		XL,RAM_Segm+1
		rjmp	newsegments
sbrrazr3:
		sbrc	razryad,3
		rjmp	sbrrazrend
		cbi		R_PORT,3
		ldi		XL,RAM_Segm+2
newsegments:
		ld		temp,X
		out		S_PORT,temp
sbrrazrend:
;lightness
		ldi		XL,RAM_ResF
		ld		buferH,X
;max input light 255 - 001 min
		cpi		buferH,110
		brlo	PC+2
		ldi		buferH,110			;max
		subi	buferH,20
		brpl	PC+2
		clr		buferH				;min
		subi	buferH,-26			;116..26

		sbrc	razryad,1			;for seconds double lightness
		lsr		buferH				;58..13

		clr		buferL
		out		OCR1BH,buferH		;14800..3330 (30000..6600)
		out		OCR1BL,buferL	

;foto measure
		ldi		XH,1
		ldi		XL,RAM_Filt
		ld		buferL,X+				;get tmp data
		subi	buferL,-1				;+1
		brne	fotoin					;if =0 then max
		ldi		buferL,255				;max		
		rjmp	writeit
fotoin:
		sbis	PortFoto-2,FOTOPin
		rjmp	writeit
		st		-X,buferL				;not discharged - save tmp data		
		rjmp	dectimecnt
writeit:
		sbi		PortFoto,FOTOPin		;Charge LED
		sbi		PortFoto-1,FOTOPin		;Pin Out

		ld		temp,X					;get last adres
		subi	temp,-1
		cpi		temp,RAM_Filt+0x06
		brlo	PC+2
		ldi		temp,RAM_Filt+2
		st		X,temp					;save new adres

		mov		XL,temp					;set new adres
		st		X,buferL				;save data to filter

		ldi		XL,RAM_Filt
		clr		buferL
		st		X,buferL				;clr temp

		cbi		PortFoto-1,FOTOPin		;Светодиод in
		cbi		PortFoto,FOTOPin		;No pullup

dectimecnt:
; refresh time counter
		dec		timecnt
		brne	cntend
		ldi		temp, maxtimecnt
		mov		timecnt,temp
		sbr		flags,(1<<f_TIME)		;0,125s
		dec		celscnt
		brne	resmodecnt
		ldi		temp, (maxcelscnt*8)
		mov		celscnt,temp
		sbr		flags,(1<<f_TERMO)		;refresh temperature

resmodecnt:
		cpi		setupcnt,0
		breq	cntend
		ldi		temp,240				;240*0,125=30 sec timeout
		inc		resmode
		cp		resmode,temp
		brne	cntend
		clr		setupcnt
		clr		resmode
cntend:

;----- проверка кнопок -------------------
		sbrs	razryad,notbutt
		rjmp	RAZR_NO
		sbis	K_Port-2,keypin		;по кнопкам бежит 1
		rjmp 	endbutton 
		ldi 	temp,bspeed 
		cp 		keycnt,temp
		brne	PC+2 
		dec		keycnt 				;первый запуск
		subi	temp,2
		cpse	keycnt,temp
		rjmp	endbutton
;button is pressed 

;RAZR_MODE:
		sbrc	razryad,modebutt	;по razryad бежит 0
		rjmp	RAZR2
;setup button 
		clr		resmode				;сбросить watchdog режима настройки
		sbr		flags,(1<<f_time)
		inc		setupcnt
		ldi		temp,5				;when setupcnt=4 do rcall I2Cwrite & setupcnt+1
		cp		setupcnt,temp
		brne	PC+2
		clr		setupcnt 
		rjmp	endbutton
RAZR2:
		sbrc	razryad,upbutt		;UP button 
		rjmp	RAZR3
		ldi		XH,1
		ldi		buferH,6
		mov		buferL,setupcnt 

		cpi		buferL ,0
		brne	compare1
		sbr		flags2,(1<<f_minut)
		rjmp	endbutton
compare1:
		cpi		buferL ,1
		brne	compare2
		ldi		XL,RAM_PCF+3		;min
		ldi		temp,0		;<-
		push	temp		;  |
		ldi		temp,0x59	;_/
		rjmp	UP_
compare2:
		cpi		buferL ,2
		brne	compare3
		ldi		XL,RAM_PCF+4		;hour
		ldi		temp,0		;<-
		push	temp		;  |
		ldi		temp,0x23	;_/
		rjmp	UP_
compare3:
		cpi		buferL ,3
		brne	compare3x
		ldi		XL,RAM_Cor			;correct
		clr		resmode				;сбросить watchdog режима настройки
		ld		buferL,X
		sbrc	buferL,7
		sbr		buferL,0b01100000	; все числа до 31 и знак
		sbrs	buferL,7
		cbr		buferL,0b01100000	; все числа до 31 и знак

		inc		buferL
		cpi		buferL,29	;_
		brlt	PC+2		; \
		ldi		buferL,28	;<-
		rjmp	compend
compare3x:
		cpi		buferL ,5
		brne	compare4
		ldi		XL,RAM_PCF+6		;weekdays
		ldi		temp,1		;<-
		push	temp		;  |
		ldi		temp,0x7	;_/
		rjmp	UP_
compare4:
		cpi		buferL ,6
		breq	PC+2
		rjmp	endbutton 
		ldi		XL,RAM_PCF+5		;days
		ldi		temp,1		;<-
		push	temp		;  |
		ldi		temp,0x31	;_/
;		rjmp	UP_
;compare5:
;		cpi		buferL ,7
;		brne	compare6
;		ldi		XL,RAM_PCF+7		;months
;		ldi		temp,1		;<-
;		push	temp		;  | century bit=0 is 20xx
;		ldi		temp,0x12	;_/
;		rjmp	UP_
;compare6:
;		cpi		buferL ,8
;		breq	PC+2
;		rjmp	endbutton 
;		ldi		XL,8		;year
;		ldi		temp,0x10	;<-
;		push	temp		;  |
;		ldi		temp,0x79	;_/
UP_:	
		clr		resmode		;сбросить watchdog режима настройки
		ld		buferL,X
		cbr		buferL,(1<<7)		; все числа до 79 BCD
		inc		buferL
		add		buferL,buferH 		;+6
		brhs	PC+2
		sub 	buferL,buferH		;небыло переноса полубайта
		cp		temp,buferL
		pop		temp
		brsh	compend
		mov		buferL,temp
		rjmp	compend
RAZR3:
		sbrc	razryad,downbutt	;DOWN button 
		rjmp	endbutton
		ldi		XH,1
		mov		buferL,setupcnt 
		cpi		buferL ,1
		brne	compare7
		ldi		XL,RAM_PCF+3		;min
		ldi		temp,0x59	;<-
		push	temp		;  |
		ldi		temp,0x00	;_/
		rjmp	DOWN_
compare7:
		cpi		buferL ,2
		brne	compare8
		ldi		XL,RAM_PCF+4		;hour
		ldi		temp,0x23	;<-
		push	temp		;  |
		ldi		temp,0x00	;_/
		rjmp	DOWN_
compare8:
		cpi		buferL ,3
		brne	compare8x
		ldi		XL,RAM_Cor			;correct
		clr		resmode				;сбросить watchdog режима настройки
		ld		buferL,X
		sbrc	buferL,7
		sbr		buferL,0b01100000	;все числа до 31 и знак
		sbrs	buferL,7
		cbr		buferL,0b01100000	;все числа до 31 и знак

		dec		buferL
		cpi		buferL,-28	;_
		brge	PC+2		; \
		ldi		buferL,-28	;<-
		rjmp	compend
compare8x:
		cpi		buferL ,5
		brne	endbutton
		ldi		XL,RAM_PCF+5		;day
		ldi		temp,0x31	;<-
		push	temp		;  |
		ldi		temp,0x01	;_/
;		rjmp	DOWN_
;compare9:
;		cpi		buferL ,6
;		brne	compare10
;		ldi		XL,RAM_PCF+7		;month
;		ldi		temp,0x12	;<-
;		push	temp		;  |
;		ldi		temp,0x01	;_/
;		rjmp	DOWN_
;compare10:
;		cpi		buferL ,7
;		brne	endbutton
;		ldi		XL,RAM_PCF+8		;year
;		ldi		temp,0x79	;<-
;		push	temp		;  |
;		ldi		temp,0x10	;_/
DOWN_:
		clr		resmode				;сбросить watchdog режима настройки
		ld		buferL,X
		cbr		buferL,(1<<7)		; все числа до 79BCD
		subi	buferL,1
		brhc	PC+2
		subi	buferL,6
		cp		buferL,temp
		pop		temp
		brpl	compend
		mov		buferL,temp
compend:
		st		X,buferL 
		sbr		flags,(1<<f_time)
		rjmp	endbutton
RAZR_NO:
		ldi		temp,bspeed
		cp		temp,keycnt
		breq	endbutton
		dec		keycnt
		brne	endbutton
		mov		keycnt,temp
endbutton:
;----- проверка кнопок end -------------------

;endcompa
		pop		buferH
		pop		buferL
		pop		temp
		out		SREG,temp
		pop		temp
		reti							;закончить прерывание
;----------------------------------------------------
;   Очистка
;----------------------------------------------------
COMPB:
		sbi		R_PORT,3				; Razr1
		sbi		R_PORT,2				; Razr2
		sbi		R_PORT,1				; seconds
		sbi		R_PORT,0				; minutes
		reti							;закончить прерывание

;		clr		temp
;		out		TCNT0,temp				;start

TOVRF:
;		push	temp
;		in		temp,SREG
;		push	temp

;		in		temp,TIMSK
;		cbr		temp,(1<<TOIE0)
;		out		TIMSK,temp				;Timer0 off

;		pop		temp
;		out		SREG,temp
;		pop		temp
;		reti							;закончить прерывание

