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í. 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 .
Předem dík
administrator: příspěvek byl upraven
Unknown Hero: Myslím, že pokud ten zdroják není nějak nekale získaný , 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 .
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 .
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…
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
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.
Zkoušel jsi použít google?
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.