;=====================================================================
;	Programot készítette: 	Nagy Tamás	
;	Projekt létrehozása:  	2011.09.17
;	Projekt utolsó módosítása:	
;	projekt verzió:		v0.0
;	
;Projekt leírás:	Egy DS12B877 IC alapú valós idejű óra kezelésének
;		elsajátítása
;=====================================================================
	LIST	p=16f877a
	#include	<P16F877A.INC>
	errorlevel-302
;=====================================================================
;		          ## Valtozok ##
;=====================================================================	
	cblock	20
		tmp
		rtc_sec
		rtc_min
		rtc_hour
		rtc_day
		rtc_mont
		rtc_year
		rtc_data
		rtc_addr
		battery_level	; ha a 7. bit 0 akkor minden jo    
				; ha a 7. bit 1 akkor merul a belso elem
	endc
;=====================================================================
;	            ## Konstansok es szimbolumok ##
;=====================================================================	
	#define	SQW	PORTD,0	; IC altal kibocsatott negyszogjel bemenet
	#define	IRQ	PORTD,1	; IC megszakitas keres kimenet
	#define	DS	PORTD,2	; adat elfogadas
	#define	AS	PORTD,4	; cim elfogadas
	#define	RW	PORTD,3	; olvasas iras kivalasztas
	#define	CS	PORTD,5	; csip kivalasztas
				; AD0..AD7	PORTD0..PORTD7		
;=====================================================================
;		       ## Kod szegmens ##
;=====================================================================
	org	0x00
	goto	inic
;=====================================================================
;		        ## Alprogramok ##
;=====================================================================		
rtc_write	bcf	AS		; adatok beirasa az RTC regisztereibe
	bsf	DS
	bsf	RW
	bcf	CS
	nop
	bsf	AS
	movf	rtc_addr,w	; a kivant cimet beirjuk az AD0..AD7 labakra
	movwf	PORTC
	bcf	AS
	nop
	bcf	RW
	movf	rtc_data,w	; a kivant cimre beirjuk az adatot 
	movwf	PORTC
	nop
	bsf	RW
	bsf	CS
	return
	
rtc_read	bcf	AS		; adatok kiolvasasa az RTC regiszterbol
	bsf	DS
	bsf	RW
	bcf	CS
	nop
	bsf	AS
	movf	rtc_addr,w	; RTC regiszter kivalasztas>>> 0-tol  13-ig
	movwf	PORTC		; cim beirasa az AD0..AD7 labakra
	nop			; varakozas
	bcf	AS		
	nop			
	banksel	TRISC		; PORTD bemenetre allitasa
	movlw	b'11111111'	
	movwf	TRISC
	banksel	PORTC		; visszalepunk a BANK0-ba
	bcf	DS
	nop
	movf	PORTC,w		; a beolvasott adatot az
	movwf	rtc_data		; rtc_data nevu valtozoba masoljuk
	bsf	DS
	nop
	bsf	CS
	banksel	TRISC		; a PORTD-t kimenetre allitjuk
	clrf	TRISC		; ez az alap allapota a PORTD-nek
	banksel	PORTC
	return
	
rtc_battery_check			; elem ellenorzese
	movlw	b'00001101'
	movwf	rtc_addr
	call	rtc_read
	movf	rtc_data,w
	movwf	battery_level
	return
	
RTC_init	bsf	AS		; RTC inicilaizalasa
	bsf	DS
	bsf	RW
	bsf	CS		
	movlw	b'00101111'	; SQW kimeneten 2Hz-es jel jelenik meg
	movwf	rtc_data		; DV1=1 >> oszcillator bekapcsolasa
	movlw	b'00001010'	; A regiszter cimere (0x0A) beirjuk az adatot
	movwf	rtc_addr		
	call	rtc_write		; adat beirasa
	movlw	b'00010111'	; 24 oras mod kivalasztasa
	movwf	rtc_data		; automatikus ido atallas nyarirol telire
	movlw	b'00001011'	; adat mod BCD
	movwf	rtc_addr		; adat beiras a B (0x0B) regiszterbe
	call	rtc_write
	movlw	b'00001100'	; C (0x0C) regiszter olvasasa
	movwf	rtc_addr
	call	rtc_read
	movf	rtc_data,w
	movwf	tmp
	return
;=====================================================================
;		       ## Inicializacio ##
;=====================================================================	
inic     
	banksel	TRISC
	clrf	TRISC
	movlw	b'11000011'
	movwf	TRISD
	banksel	PORTC
	clrf	PORTC
	clrf	PORTD
;=====================================================================
;		         ## Foprogram ##
;=====================================================================
main
	call	RTC_init
	call	rtc_battery_check
	btfss	battery_level,7
	sleep
seconds
	movlw	b'00000000'
	movwf	rtc_addr
	call	rtc_read
	movf	rtc_data,w
	movwf	rtc_sec
	movlw	b'00000011'
	movwf	rtc_addr
	call	rtc_read
	movf	rtc_data,w
	movwf	rtc_min
	goto	seconds
	end
;=====================================================================
;		         ## Foprogram vege ##
;=====================================================================