Hodiny reálneho času

Mám tady požadavek na aplikaci logeru a to pro reálny čas. Dělám s PIC a nemůžu najít jakékoli PIC s reálnym časem. Nerad bych to emuloval pomocí timeru, protože kontrolér bude většinu času spát a probudí jej jenom vnější impuls. Nechci (vzhledem ke spotřebě) toto řešil vitřním oscilátorem a to nemluvím o dostatečné přesnosti. Ta je požadovaná ±1hod/rok. Existuje něco takové, nebo jste to už někdo řešil a jak?

Jestli hledáš PIC s reálným časem, tak hodně štěstí protože takový PIC neznám a asi ani není. :frowning: Osobně jsem to řešil s použitím obvodu DS1302 od firmy Dallas maxim-ic.com/quick_view2.cfm/qv_pk/2685 Komunikuje po třech drátech a jediné externí součástky jsou krystal na 32kHz a baterka pro zálohování pro kterou se dá nastavit i nabíjecí proud. Jestli máš zajem tak ti pošlu zdroják v Asm.

Taky to tak vidím. Už jsem prohrabal možné i nemožné a vyšlo mi to stejně.
Tomu zdrojáku bych byl pochopitelně hrozně rád, vždyť by mi to ulehčilo kopu práce. Jěště jsem s tím nedělal tak mám trošku bobky :wink:.
Předem dík

:arrow_right: administrator: příspěvek byl upraven

Unknown Hero: Myslím, že pokud ten zdroják není nějak nekale získaný :smiling_imp:, tak ho můžeš hodit přímo sem do code. Určitě to bude zajímat i někoho jiného než jen fiama. Samozřejmě tě do toho nenutím - je to pouze na tobě. Chtěl jsem tím jen říci, že má fórum zatím velké rezervy ve velikosti databáze :wink:.

Ještě bych dodal, že nejen Dallas vyrábí hodiny reálného času. Stačí hledat Real Time Clock a člověk zjistí, že existuje spousta výrobců, o kterých nikdy neslyšel :slight_smile:.

To je pravda, ale ten Dallas sa mi zdá nějak lépe popsaný a ta přesnost na výběr. Nemám moc dobré zkušenosti se všelijakými napodobeninami, vždy je tam nějaká záludna odlišnost, drobná, ale komplikuje život. Viz například 555 a co se s nim stalo. Ušetříš 5korun (nebo jen jednu) a zrovna ve tvém zapojení se ta odlišnost projeví. Murphyho zákony platí vždy a všude…
Nejvíce mě štve dostupnost součástek. Ten Dalas, myslím, koupíš kdykoli, co se o jiných obvykle nedá říci. Konkrétně u 555 je problém v distributorech, kteří ti vnutí to, co je z jejich hlediska nejvýhodnější.

Je to jenom návrh co použít, nikomu nic nenutím. Určitě se dá najít spousta obvodů, ale mě se DS1302 zamlouvá hlavně kvůli možnosti nastavení proudu pro nabíjení záložní baterie. Hodně oblíbený je taky PCF8583.

;*****************************************************************
;
;			Podprogramy pro komunikaci s DS1302
;
;*****************************************************************

;**************************************************
; SET_TIME - zapsat čas
; INPUT:
;**************************************************
SET_TIME
	MOVLW	B'10111110'	; zapíše do W hodnotu BEh
	MOVWF	TIME_TX		; přesun z W do registru TIME_TX
	BSF		RST			; do log 1 nastaví pin RST
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
;TIME_WRITE_8
	MOVLW	TIME_TX_ADD	; 
	MOVWF	FSR			;
	MOVLW	D'8'		; do W zapíš dek. 8
	MOVWF	COUNT2		; přesun do registru COUNT2
TW1						; návěstí pro smyčku
	MOVF	INDF,W		; 
	MOVWF	TIME_TX		;
	CALL	TIME_WRITE_1;
	INCF	FSR,F		;
	DECFSZ	COUNT2,F	;
	GOTO	TW1			;
	BCF		RST			;
  RETURN

;***********************************************
; GET_TIME - přečíst čas
; INPUT:NONE
; OUTPUT:
;***********************************************
GET_TIME
	MOVLW	B'10111111'	; zapíše do W hodnotu BFh
	MOVWF	TIME_TX		; W do registru TIME_TX
	BSF		RST			; do log. 1 pin RST
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
;TIME_READ_7
	MOVLW	TIME_RX_ADD	;
	MOVWF	FSR			;
	MOVLW	D'7'		;
	MOVWF	COUNT2		;
TR2						;
	CALL	TIME_READ_1	;
	MOVF	TIME_RX,W	;
	MOVWF	INDF		;
	INCF	FSR,F		;
	DECFSZ	COUNT2,F	;
	GOTO	TR2			;
	BCF		RST			;
  RETURN

;************************************************
; TIME_READ_1 - čte hodnotu z DS1302 SINGLE-BYTE READ
; INPUT: NONE
; OUTPUT:
;************************************************
TIME_READ_1
	BANKSEL	TRISA		; vybere Banku 1
	BSF		TRISA,0 	; I_O je vstup
	BANKSEL 0     		; nastavení Banky 0
	MOVLW	D'8'		; do W zapíš dek. 8
	MOVWF	COUNT1		; přesun do registru COUNT1
TR1						; návěstí pro smyčku
	BCF		SCLK		; do log. 0 pin SCLK
	BCF		STATUS,C	; do log. 0 bit Carry v registru STATUS
	BTFSC	I_O			; testuje jestli pin I_O je v log. 0 ANO přeskočí řádek NE pokračuje na další řádek
	BSF		STATUS,C	; do log. 1 bit Carry v registru STATUS
	RRF		TIME_RX,F	; rotace registru TIME_RX přes Carry bit výsledek zpět do TIME_RX
	BSF		SCLK		; do log. 1 pin SCLK
	DECFSZ	COUNT1,F	; odečte jedničku od obsahu registru COUNT1 a výsledek uloží zpět do registru. Je-li výsledek 0, následující instrukce se neprovede.
	GOTO	TR1			; skok na návěstí TR1
	BANKSEL	TRISA		; vybere Banku 1
	BCF		TRISA,0		; I_O je výstup
	BANKSEL 0			; vybere Banku 0
	BCF		SCLK		; do log. 0 pin SCLK
  RETURN

;************************************************
; TIME_WRITE_1 - zapíše hodnotu do DS1302 SINGLE-BYTE WRITE
; INPUT: TIME_TX
;************************************************
TIME_WRITE_1			; návěstí
	MOVLW	D'8'		; do W zapíš dek. 8
	MOVWF	COUNT1		; přesun do registru COUNT1
TLOP					; návěstí pro smyčku
	BCF		I_O			; do log. 0 pin I_O
	BCF		SCLK		; do log. 0 pin SCLK 
	BTFSC	TIME_TX,0	; testuje bit 0 v registru TIME_TX je v log. 0 ANO přeskočí řádek NE pokračuje na další řádek
	BSF		I_O			; do log. 1 pin I_O
	RRF		TIME_TX,F	; rotace doprava registru TIME_TX
	BSF		SCLK		; do log. 1 pin SCLK
	DECFSZ	COUNT1,F	; odečte 1-čku a testuje jestli registr je 0 jestli ANO přeskočí řádek NE tak skok na návěstí TLOP 
	GOTO	TLOP		; skok na návěstí TLOP
	BCF		SCLK		; do log. 0 pin SCLK
  RETURN

;************************************************
; INIT_DS1320 - provede nastavení registru u DS1302
; INPUT: TIME_TX
;************************************************
INIT_DS1320

	call	CONTROL_BIT_CH

;na adresu 90h zapíše AC nastaví TRICKLE CHARGE REGISTER
	BSF		RST			; začátek zápisu
	MOVLW	90h			; zapíše do W hodnotu 90h ;
	MOVWF	TIME_TX		; přesun z W do registru TIME_TX
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
	MOVLW	B'10100101'	; zapíše do W hodnotu ACh
	MOVWF	TIME_TX		; přesun z W do registru TIME_TX
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
	BCF		RST			; konec zápisu

  RETURN

;************************************************
; CLR_RAM - Smaže registry pro uložení hodnot
;************************************************
CLR_RAM
	CLRF	SEC_W		;SEKUNDY
	CLRF	MIN_W		;MINUTY
	CLRF	HOUR_W		;HODINY
	CLRF	DATE_W		;DNY
	CLRF	MONTH_W		;MESICE
	CLRF	YEAR_W		;ROKY
	CLRF	DATE_WEEK_W	;DEN V TYDNU

  RETURN
;************************************************
;	PROTECT_BIT_CLR - smaže ochranný bit proti zápisu
;************************************************
PROTECT_BIT_CLR
	BSF		RST			; začátek zápisu
	MOVLW	8Eh			; nastaví CLOCK HALT FLAG do log. 0
	MOVWF	TIME_TX		; přesun z W do registru TIME_TX
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
	MOVLW	B'00000000'	; zapíše do W hodnotu ACh
	MOVWF	TIME_TX		; přesun z W do registru TIME_TX
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
	BCF		RST			; konec zápisu

  RETURN
;************************************************************
; CONTROL_BIT_CH - po resetu se zkontroluje bit CH v registru sekund
; přečte registr sekund -> otestuje bit7 -> 
; ANO je tak ho vynuluje a zapíše zpět do registru sekund
; NE není tak nic mas tam vir 
; na adresu 80h zapíše D0 nastaví CLOCK HALT FLAG do log. 0
;************************************************************
CONTROL_BIT_CH
;adresa registru sekund pro čtení
	MOVLW	81h			; zapíše do W hodnotu 81h
	MOVWF	TIME_TX		; W do registru TIME_TX
	BSF		RST			; do log. 1 pin RST
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
;čtení hodnoty
	CALL	TIME_READ_1	;
	BCF		RST			;
	MOVF	TIME_RX,W	;
;testování bitu CH
	BTFSS	TIME_RX,7	; bude 0 následují instrukce se provede
  RETURN
;adresa registru sekund pro zápis
	MOVLW	80h			; zapíše do W hodnotu 81h
	MOVWF	TIME_TX		; W do registru TIME_TX
	BSF		RST			; do log. 1 pin RST
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
;nulování bitu CH a zapsání
	BCF		TIME_RX,7	; vynuluje bit 7 v registru
	MOVF	TIME_RX,W	;
	MOVWF	TIME_TX		; W do registru TIME_TX
	CALL	TIME_WRITE_1; volá podprogram TIME_WRITE_1
	BCF		RST			;
  RETURN

Hezké. A prý jsou programátoři suchaři… :smiley:
Mockrát děkuji za pomoc. Přehledné a jasné.
V tomto zapojení nebudu záložní baterii používat, protože po výpadku hlavní baterie nemá pokračování funkce RTC smysl. Důležitá je pro mě spotřeba, přesnost a ty proklamované dvě minuty za rok jsou snesitelné, proto volím DALLAS.
Ještě jednou díky.
Peter

Chtel bych poprosit, jestli by nekdo nemel zdrojak pro obsluhu tohoto RTC v Cecku (nejlepe pro AVRko) Moc by se mi to hodilo - usetrilo by mi to cas. Predem diky :wink:

Taky bych chtěl použít tento RTC obvod a chtěl jsem se zeptat na komunikaci,jestli musím cyklicky číst registry z RTC obvodu nebo se např. při změně sekund nastaví nějaký příznakový bit, prosím jak to řešíte Vy?

Zkoušel jsem zatím DS1302 a DS1337 a ani jeden nemá v sobě registr, kde by bylo možné vyčíst info o tom, že vteřiny poskočily kupředu.
U DS1302 cyklicky čtu registr vteřin a když dojde ke změně, přečtu vše. U DS1337 čtu všechno najednou.

Nemáte někdo zkušenost s kombinací DS1302 a 8051 (nebo s nějakým z potomků), mám problémi s programem, nikdy jsem s žádným takovým obvodem nekomunikoval a nevím jak začit. :frowning:

Zkoušel jsi použít google? :wink:

geocities.com/microcontrollers/2051projects/rtcclock/rtc.html

mstar.bloguje.cz/303373-druha-verze-hlavniho-programu-pro-hodiny.php

Mohl by výše ukázaný kód být funkční i pro kombinaci DS1307+PIC16F877A ??

Program od Xreda je na Atmel.

Popis komunikace máš na str. 12 a 13 datasheetu.

Hoši hoďte ten zdroják jsem pro ostatní

Máš ho v 6 příspěvku od Unknown Hero

A co třeba PIC18F46J50 nebo některé PIC24F . . . ???
některé z nich umí i Deep Sleep - odběr okolo 20nA !!!

Co má společného RTC a podpora spánku Deep Sleep v PIC18F46J50 ??

To, že jsou implementovány v jednom kontroleru a pokud budeš někdy dělat aplikaci s reálným časem a bateriovým/solárním napájením, tak je určitě využiješ . . . osobně se mi zdá tento kontroler pro podobné aplikace tím nejlepším, co existuje . . .

Jsem si stáhl datasheet a máš pravdu. :smiley: