.include "output\tn13def.inc"
;================================================================================================================

; äëß ïðîâåðêè ðàáîòû âñåãî ýòîãî áåñïðåäåëà âðåìåííî óìåíüøèì äëèòåëüíîñòü ñóòîê äî 10 ìèíóò, à â Ž‡“
; çàïèøåì âðåìß âêë 00:00, âðåìß âûêë - 00:01. ‚ ðåçóëüòàòå íà 3-é íîãå (�‚4) äîëæåí ïîßâèòñß ñèãíàë âûñ. óð. íà 1 ìèíóòó, 
; çàòåì ñèãíàë íèçêîãî óðîâíß, ïîêà öèêë íå ïðîéäÞò ïî êðóãó.




;								Š�€’ŠŽ… Ž�ˆ‘€�ˆ… “‘’�Ž‰‘’‚€

;äàííîå óñòðîéñòâî ïðåäñòàâëßåò ñîáîé öèêëè÷åñêèé ñóòî÷íûé òàéìåð äëß óïðàâëåíèß 1é íàãðóçêîé (âêë/âûêë)
;áåç îòîáðàæåíèß âðåìåíè
;íàñòðîéêà ïðîèçâîäèòñß â ïåðâîì ïîñëå ïóñêà öèêëå (24 ÷àñà) ñëåäóþùèì îáðàçîì:
;ïîñëå ïóñêà òàéìåðà íàæèìàåì êíîïêó ‚Š‹, ïðîèñõîäèò çàïèñü âðåìåíè íàæàòèß (ðåãèñòðû 23 è 24) â Ž‡“
;â êàæäîì ðàáî÷åì öèêëå ïðîèñõîäèò ïðîâåðêà íà ñîâïàäåíèå òåêóùåãî âðåìåíè ñ çàïèñàííûì â ïàìßòü
;åñëè âðåìß ñîâïàëî, ŒŠ âêëþ÷àåò íóæíûé ïèí ïîðòà
;àíàëîãè÷íî óñòàíàâëèâàåòñß âðåìß âûêëþ÷åíèß

;‡àäà÷è													ñòàòóñ âûïîëíåíèß

; Žòñ÷åò ñåêóíäíûõ èíòåðâàëîâ								*	+
; —òåíèå êíîïîê												*	+
; ‡àïèñü âðåìåíè â Ž‡“										*	-
; �ðîâåðêà ñîâïàäåíèß çàäàííîãî âðåìåíè ñ òåêóùèì			*	+
; óñòàíîâêà íåîáõîäèìîãî ñîñòîßíèß ïîðòà					*	+
; èíäèêàöèß ðàáîòû òàéìåðà									*	+

;									�åäîñòàòêè
;		1. �åîáõîäèìîñòü àâàðèéíîãî ïèòàíèß, ò.ê. îòñ÷åò âðåìåíè íóæíî âåñòè ïîñòîßííî, è EEPROM òóò íå ñïàñÞò

;							��ˆŒ…—€�ˆŸ
; 1 - �ðèíöèï èíäèêàöèè ðàáîòû òàéìåðà  (�‚3) - âî âðåìß ïðåðûâàíèß ïðîèñõîäèò ñáðîñ �‚3, à â îñíîâíîì
;	öûêëå ïðîãðàììû åãî óñòàíîâêà. ’àêèì îáðàçîì èíäèêàòîð ðàáîòàåò ñ ÷àñòîòîé 18 750 ƒö
; 2 - óïðàâëåíèå ïîðòîì ïðîèçâîäèòñß ïðèíóäèòåëüíîé óñòàíîâêîé/ñáðîñîì ðàçðßäîâ �‚‚


; !!!!!!!!!!!!!!!!			íå çàáûòü âåðíóòü ìàêñèìàëüíûå çíà÷åíèß ’‚ 		  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

;==================================================================================================

;*******************************		îáçûâàåì ïåðåìåííûå		****************************

.def   	Temp=R16  	 	;
.def   	Temp1=R17   	;  
.def   	Temp2=R18   	;âñïîìîãàòåëüíûå ðåãèñòðû
.def   	Flag=R19		;ôëàã ñîâïàäåíèß âðåìåíè			|	�å èñïîëüçóåòñß
.def   	Mach=R20  	 	;äëß ñðàâíåíèß óñòàíîâêè âðåìåíè 
.def   	LTemp=R21   	;äîïîëíèòåëüíûé ñ÷åòíûé ðåãèñòð  	|	ò.ê. ñ÷åò÷èê 8-ìè ðîçðßäíûé, à íàì ýòîãî ìàëî :)
.def   	Second=R22 		;ñ÷åò ñåêóíä (0-60)
.def	Min=R23   		;ñ÷åò ìèíóò (0-60)
.def  	Hour=R24   		;ñ÷åò ÷àñîâ (0-24)
.def	Port=R25		;äëß çàãðóçêè çíà÷åíèé ïðî÷èòàíûõ èç PortB
.def	pvm=R26			;äëß èçìåíåíèß âðåìåíè ñâå÷åíèß èíäèêàòîðà ðàáîòû òàéìåðà

.dseg

;********************************		âûïðàøèâàåì ó êîìïèëßòîðà ÷óòîê Ž‡“		**********************************
;********************************			äëß õðàíåíèß "ëè÷íûõ äàííûõ"		**********************************

Time_ON:	.byte 2		;âðåìß âêëþ÷åíèß
Time_OFF:	.byte 2		;âðåìß âûêëþ÷åíèß

.cseg
.org 0


;*************************** ‚åêòîðà ïðåðûâàíèé ************************
   rjmp RESET   
;rjmp INT0  						 ;INT0_vect   ‚íåøíåå ïðåðûâàíèå 0
;rjmp PCINT0  						 ;PCINT0_vect   �ðåðûâàíèå 0 ïî èçìåíåíèþ ñîñòîßíèß âûâîäà
.org 3



;********************** îáðàáîò÷èê ïðåðûâàíèß ïåðåïîëíåíèß òàéìåðà *********************
;**********************               TIMER0_OVF                   *********************


TIMER0_OVF:		IN   R15,SREG   	;ñîõðàíèòü SREG â íåèñïîëüçóåìûé R15
				ldi Temp,6 			;
				out TCNT0,Temp		;‡àãðóæàåì â ñ÷åòíûé ðåãèñòð íà÷àëüíîå çíà÷åíèå ñ÷åòà

				
				dec pvm
				
				inc LTemp			;+1 â ðàçðßäå íàøåãî ñ÷åò÷èêà
				cpi LTemp,75		;ñ÷èòàåì äî 75
				brne Exit			;åñëè íå äîñ÷èòàëè, âûõîäèì èç ïðåðûâàíèß
						
				ldi LTemp,0			;èíà÷å îáíóëßåì ñ÷åò÷èê
				
	;+++++++++++++++++       ïðîöåäóðà ñ÷åòà âðåìåíè        +++++++++++++++++++

				inc Second			;+1 ñåêóíäà
				cpi Second,60		;ìèíóòà ïðîøëà?
				brne Exit			;íåò - âûõîäèì èç ïðåðûâàíèß
				
				ldi Second,0		;îáíóëßåì ñåêóíäû
				
				inc Min				;+1 Œèíóòà
				cpi Min,10			;÷àñ ïðîøåë?
				brne Exit			;íåò - âûõîäèì èç ïðåðûâàíèß
				
				ldi Min,0			;îáíóëßåì ìèíóòû
				
				inc Hour			;+1 ÷àñ
				cpi Hour,0			;ñóòêè êîí÷èëèñü?
				brne Exit			;íåò - âûõîäèì èç ïðåðûâàíèß
				
				ldi Hour,0			;îáíóëßåì ÷àñû

Exit:   reti

; TIMER0COMPA:
; reti
   
RESET:
   ldi Temp,0b11111100 				;íàñòðîéêà ïîðòîâ
   out DDRB,Temp

;********************** îáíóëßåì âñå ðåãèñòðû ************************

ldi Temp,0
mov Mach,Temp
mov LTemp,Temp
mov Second,Temp
mov Min,Temp
mov Hour,Temp
mov Temp1,Temp
mov pvm,Temp
;********************** â Ž‡“ ïèøåì çíà÷åíèß âðåìåíè, ñîâïàäåíèå êîòîðûõ íå âîçìîæíî ************************
;********************** 				íàïðèìåð 33 ÷àñà 33 ìèíóòû 					 ************************
ldi Temp,0

sts Time_ON+1,Temp
sts Time_ON,Temp

sts Time_OFF+1,Temp
ldi Temp,1
sts Time_OFF,Temp


;***********************	èíèöèàëèçàöèß ŒŠ	**********************
;ðàáî÷àß ÷àñòîòà 								4,8 Œƒö 
;ñ ïðåääåëèòåëåì ‘Š/256 	 					18 750 ƒ–,
;ïåðåïîëíåíèå òàéìåðà êàæäûå ïðîèñõîäèò 		18750 / (255-5) = 75 ðàç â ñåêóíäó
;ñáðîñ òàéìåðà ïðîèñõîäèò â ñëåä òàêòå			250-1
;ïîýòîìó â ñ÷åòíûé ðåãèñòð	TCNT0 ãðóçèì		250-5-1=6

ldi Temp,6 
out TCNT0,Temp			;ñ÷èòàåì Ž’ 6 äî 255 (ïåðåïîëíåíèå êàæäûå 249 òàêòîâ)

ldi Temp,0b00000010 	;ðàçðåøèòü ïðåðûâàíèå ïî ïåðåïîëíåíèþ òàéìåðà/ñ÷åò÷èêà 0
out TIMSK0,Temp

ldi Temp,0b00000010 	;”ëàã íàñòóïëåíèß ïðåðûâàíèß ïî ïåðåïîëíåíèþ
out TIFR0,Temp

ldi Temp,0b00000100 	;òàêòîâûé ñèãíàë = CK/256 (4,8Œƒö/256=18 750ƒö)
out TCCR0B,Temp

ldi Temp,0b00000000 	;
out TCCR0A,Temp

ldi Temp,250			;ðåãèñòð ñðàâíåíèß 
out OCR0A,Temp

ldi Temp1,0b00000000
sei

;****************************									****************************
;****************************     Žñíîâíîé öèêë ïðîãðàììû  		****************************
;****************************									****************************

main:   		rcall time_mach		;ïîäïðîãðàììà ïðîâåðêè ñîâïàäåíèß âðåìåíè
				rcall Press_key		;ïîäïðîãðàììà ÷òåíèß íàæàòèß êíîïîê
				sbi PortB,3			;âêëþ÷àåì èíäèêàòîð ðàáîòû ŒŠ.
				rcall Dealay		;
			rjmp main
			
Dealay:		mov Temp2,pvm
			dec Temp2
			cpi Temp2,0
			brne Dealay
			cbi PortB,3			;âûêëþ÷àåì èíäèêàòîð ðàáîòû òàéìåðà
			ret

			
;************************************		�ðîâåðêà ñîâïàäåíèß ’‚ ñ çàäàííûìè çíà÷åíèßìè		**************
;								��ˆŒ…—€�ˆ…			
;„àáû íå çàíèìàòü ïðîöåñîðíîå âðåìß ãëóïîñòßìè, èñïîëüçóåì äëß ïðîâåðêè òåêóùåãî
;ñîñòîßíèß íàãðóçêè ôëàã ’
;…ñëè ’=1 - íàãðóçêà âêëþ÷åíà, ïåðåõîäèì íà ïðîâåðêó âðåìåíè âûêëþ÷åíèß
;…ñëè ’=0 - �àãðóçêà âûêëþ÷åíà, ïåðåõîäèì íà ïðîâåðêó âðåìåíè âêëþ÷åíèß

time_mach:		brts mach_OFF		;T=1
				brtc mach_ON		;T=0
			

mach_On: 		lds Mach,Time_ON	;çàãðóæàåì ìèíóòû âêëþ÷åíèß èç Ž‡“
				cp Min,Mach			;ñðàâíèâàåì ñ ’‚
				brne ExitTimeMach	;åñëè íå ðàâíî, äàëüíåéøàß ïðîâåðêà íå èìååò ñìûñëà, ïîýòîìó âûõîäèì
				
				lds Mach,Time_ON+1	;—àñû ïðîâåðßåì àíàëîãè÷íî
				cp Hour,Mach
				brne ExitTimeMach
				
				set					;åñëè âñå ñîâïàëî, óñòàíàâëèâàåì ôëàã ’=1
				sbi PortB,4			;è óñòàíàâëèâàåì �‚4 â 1 ñîñòîßíèå
			
mach_OFF:		lds Mach,Time_OFF	;çàãðóæàåì ìèíóòû âûêëþ÷åíèß èç Ž‡“
				cp Min,Mach			;ñðàâíèâàåì ñ ’‚
				brne ExitTimeMach	;åñëè íå ðàâíî, äàëüíåéøàß ïðîâåðêà íå èìååò ñìûñëà, ïîýòîìó âûõîäèì
				
				lds Mach,Time_OFF+1	;—àñû ïðîâåðßåì àíàëîãè÷íî
				cp Hour,Mach
				brne ExitTimeMach
				
				clt					;åñëè âñå ñîâïàëî, ñáðàñûâàåì ôëàã ’=0
				cbi PortB,4			;è ñáðàñûâàåì �‚4 â 0 ñîñòîßíèå
				
ExitTimeMach:
				ret					;ïðîñòî âûõîäèì èç ïîäïðîãðàììû

				

;*********************************************		îáðàáîòêà íàæàòèß êíîïîê  ***********************
;									��ˆŒ…—€�ˆ…
;	’àê êàê òî÷íîñòü óñòàíîâêè âðåìåíè ‚êë/‚ûêë íàãðóçêè - 1 ìèíóòà, òî ïèñàòü çàùèòó îò äðåáåçãà
;	ß ñìûñëà íå âèæó. …ñëè êíîïêà ñ÷èòàåòñß õîòü îäèí ðàç, òî äî êîíöà òåêóùåé ìèíóòû ïîâòîðíîå 
;	åå ñ÷èòûâàíèå ðåçóëüòàò íå èçìåíèò.
;

Press_key:		in Port,PortB			;÷èòàåì ñîñòîßíèå ïîðòà (áèòû 0,1 óñòàíîâëåíû íà âõîä)
										;â íîðìàëüíîì ðåæèìå íà íèõ ïîäâåäÞí "-", ïðè íàæàòèè äîëæåí ÷èòàòñß "+"
				andi Port,0b11111100	;ðåçàåì ïî ìàñêå,
				cpi Port,0b11111100		;åñëè íè÷åãî íå íàæàòî, âûõîäèì
				breq ExitKey
				
				cpi Port,0b11111110		;åñëè â 1ì ðàçðßäå ñ÷èòàëñß +
				breq Key1				;ïåðåõîäèì íà îáðàáîòêó 1é êíîïêè (‚ûêë)
										;åñëè íåò - ïðîâåðßåì âòîðóþ êíîïêó
				cpi Port,0b11111101		
				breq Key2
				rjmp ExitKey			;òàê êàê íåêîòîðûå ýêñïåðåìåíòàòîðû ìîãóò íàæàòü îáå êíîïêè ñðàçó
										;â ðåçóëüòàòå ÷åãî ïîëó÷èì 		0ü11111111
										;íà âñßêè ñëó÷àé ïðèíóäèòåëüíî âûõîäèì èç ïîäïðîãðàììû
		;*******************
Key1:			sts Time_OFF,Min		;âûêëþ÷àåì
				sts Time_OFF+1,Hour
				rjmp ExitKey
		;*******************
Key2:			sts Time_ON,Min			;âêëþ÷àåì
				sts Time_ON+1,Hour
				rjmp ExitKey
ExitKey:
			ret

















