Hodiny reálneho času

Čidlo které popisuješ je pouze převodník teplota-střída. Pro měření teploty použij raději některé jiné, třeba DS18B20 a podobné. Komunikují po 1-Wire sběrnici a vyčteš rovnou teplotu, jsou kalibrované, mají 64bit romkód, takže jich můžeš zapojit hned několik na jednu sběrnici a volat je postupně romkódem.
Samozřejmě tento návrh můžeš i zcela ignorovat.

Nene, ignorovat ho určitě nebudu, mě se ten návrh líbí, protože to sběrnicové řazení by určitě nebylo na škodu a co jsem se díval do ceníků, tak je to čidlo běžně k mání a za cenu SMT160-30 mám těch DS18B20 hned dva kusy :slight_smile: Našel jsem i popis 1-wire sběrnice na Hw.cz i s kódem pro x51, tak snad to zvládnu nějak překopat na PIC. Zařízení (logger) bude mít zcela konkrétní účel, sledovat teplotu topné vody a venkovní a vnitřní teploty před zateplením a po zateplení domu (ukládat bych ve finále chtěl na SD, případně CF kartu, pokud je nějak ovládnu). Času mám relativně dost, zateplovat se bude až tak za dva roky, tak snad stihnu aspoň jednu zimu měřit :laughing: … Takže dík moc za tip, určitě využiju (a aspoň se zas něco nového přiučím).

PS: už jsme dost OT, měl bych se polepšit :blush:

Zdravím.
Chcel by som poprosiť o pomoc z programon v prílohe.Jeho funkcia spočiva v tom že cez I2C spolupracuje z DS1307 a ešte z DS18B20 vyčítava teplotu a údaje z týchto prvkov sa zobrazujú na LCD displeji.
Problém je v tom že pokiaľ vyčítavam dáta z RTC a je funkčné prerušenie od TMR0,náhodne “preskakujú” na displeji hodnoty ťahané z RTC(dátum,mesiac…)
Ale keď globálne zakážem prerušenia,je po probléme.Lenže potom mi nepôjde meranie teploty,komunikácia z DS18B20 je časovaná pomocou prerušenia od TMR0.Prerušenia sa nemienim vzdať budem ho tu ešte veľmi potrebovať.
Neviem čo by s tým mohlo byť. :frowning: Podozrievam samotnú obsluhu prerušenia ale tú robím podľa datasheetu.
poraďte prosím.
Relatko.
DS1307.asm (26.9 KB)

tak nepouzivat to prerusenie pre komunikaciu s ds18s20.

Alebo zakaz prerusenie kym komunikujes po I2C. z hladiska toho ze DSko potrebuje nejaky cas na prevod teploty caa -500ms-800ms viac data sheet tak mas more casu nacitat I2C aj obsluzit cidlo

Se nediv, když čteš všechno zvlášt. Uprav si čtení s DS tak, že budeš číst všechno najednou.
Používám taky DS, sice DS1337, ale mám 4 přerušení a jede mi to v pohodě.

Máš na mysli vyčítať to z DS-ka “na jedem dúšok”?

Jasně :slight_smile:

Pokud DS18B20 potřebuje 800ms, tak třeba s DS1307 počkáš na vteřinu a zase můžeš měřit.

Zdravím.
Tak som to upravil,no Bohužiaľ,výsledok je ten istý :frowning: .
Akonáhle však presuniem vyčítanie dát z RTC z obsluhy prerušenia do hlavného programu,je po probléme.Nechápem.
Relatko.
DS1307.asm (27.7 KB)

Nečti s DS1307 v přerušení!

Nazdar.
Urobil som tak,ale problém z preskakovaním hodnôt čítaných z RTC stále trvá.Pokiaľ komunikáciu z DS18B20 nechám “v prerušení”,je problém.Ale keď s ním komunikujem v hlavnej slučke,všetko je O.K.Neviem,to prerušenie potrebujem ako soľ.Pripájam zdroják.
Urobil som ešte jeden pokus a nechal som vykonať prerušenie od TMR0 len tak “naprázdno”,a obe DS-ká som obslúžil v maine a všetko bolo O.K.
Mrknite sa mi prosím na obsluhu prerušenia ,lebo inším si to neviem vysvetliť.
Relatko.
DS1307.asm (26.5 KB)

Nějak nechápu z toho ASM princip tvojeho přerušení. :frowning: Čekáš jen na přerušení od TMR0, nebo máš i nějake jiné? Proč tam incrementuješ toto INCF sekunda? Nemám doma čidlo DS18x20 abych to testnul, ale tipl bych, že by to mělo být asi tak, že odstartuješ převod, počkáš cca 800ms a pak vyčteš teplotu. jestli ti to nehapruje na tomhle.

Áno tak ako píšeš.V každom prerušení od TMR0 inkrementujem reg.sekunda a pokiaľ sa ten == .75 tak sa vykoná rutina “SEKUNDA” v ktorej sa vynuluje reg.sekunda,vyčíta sa teplota z čidla,prevedie sa z bin. na dec. hodnotu,rozdelí sa ja jednotky,desiatky,stovky,vykoná sa nový štart merania a nasl.koniec prerušenia.
Iný druh prerušenia nepoužívam.
Relatko.

A proč teda potřebuješ to přerušení? Převod na dec nemusíš dělat v přerušení, vyčítaní s čidla taky ne.

Až doteraz som zvykol časovanie cyklicky sa opakujúcich rutín odvádzať od prerušenia TMR0.Inkrementovával som pri každom prerušení napr každých 10ms hodnotu registra a tú som porovnával z pevnou hodnotou,pri zhode sa vykonala potrebná rutina.Napr.kontrola stlačenia tlačítka,riadil som čítanie viacerých DS18B20,až doteraz kým som nepoužil I2C.Vyskúšam ešte použiť emulované I2C rutiny a uvidím ako to pôjde.
Vďaka za snahu pomôcť.
Relatko.

HW I2C by na to mít vliv určitě neměla. Máš asi někde chybu.
Ale jak jsem psal, požívám 4 přerušení a i I2C, RTC a ještě se mi nestalo, teda zatím, že by mi čtení s RTC nějak blblo. A to ještě zaměstnávám přerušení krmením posuvných registrů, což trvá dost dlouho, a taky to nemá na nic vliv. Možná máš asi chybu někde jinde.

Objednal jsem si čidlo DS přímo od výrobce, takže to zkusím, pokud se ho teda dočkám :slight_smile: cca 14 dní :slight_smile:

EDIT: Kde máš nastavení I2C?

Ďakujem,pátram aj ja,použil som pic16F628A z emulovaným I2C a čuduj sa svete problém trvá :frowning: .Pátram ďalej.
Relatko.

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Kde máš nastavení I2C? Něco takového třeba :slight_smile: Nastav krystal, rychlost I2C

[code]; base frequency
XTAL_FREQ EQU 4000000 ; OSC freq in Hz
; used for I2C calculations
#define I2CClock D’100000’ ; define I2C bite rate
#define I2C_ClockValue (((XTAL_FREQ/I2CClock)/4) -1) ;

;**************************************************************************
;I2C init
;**************************************************************************
Init_I2C
; setup MSSP adress register
MOVLW SSPADD ; get adress for synch serial port status reg
MOVWF FSR ; setup fsr
MOVLW I2C_ClockValue ; setup clock rate
MOVWF INDF ; and store it

; setup MSSP status reg
MOVLW SSPSTAT ; get adress for synch serial port status reg
MOVWF FSR ; setup fsr
MOVLW (1<<SMP) ; enable slowrate control
MOVWF INDF ; and store it

; setup MSSP control reg
MOVLW SSPCON ; get adress for synch serial port control reg
MOVWF FSR ; setup fsr
MOVLW ((1<<SSPEN)|(0<<CKP)|(1<<SSPM3)); enable syncronous port, enable clock ,
; I2C master mode clock = OSC/(4*(SSPADD)+1)
MOVWF INDF ; and set it

; ; enable MSSP interrupt
; MOVLW PIE1 ; get adress for periphial irq’s
; MOVWF FSR ; setup fsr
; BSF INDF,SSPIE ; enable MSSP irq
; BSF INTCON,PEIE ; and periphial irq must also be enabled (if not already )

return

[/code]

A jestli ti můžu poradit, necituj předchozí příspěvky pokud jsou hned za sebou :slight_smile:

EDIT: Už vím, v čím je problem. Používáš podprogram HEXDEC a tedy registry Tx jak v přerušení, tak i v loop. TAM SE TI TO HADÁ. PROTO TI TO PŘEBLIKÁVÁ :slight_smile:

Zdravím.
Ďakujem za pomoc,konečne mi to funguje.Nateraz som to vyriešil tým,že v hlavnom programe pred skokom na program hexdec globálne zakážem prerušenia a po návrate z o spomínaného podprogramu a po odoslaní potrebných hodnôt do LCD prerušenia opäť povolím.
Relatko.

Edit:Poriešil som to trochu kultúrnejšie,nezakazujem prerušenie ale zálohujem registre T0,T1…počas prerušenia.
relatko.

Zdravím.
pre prípadných záujemcov pripájam “nateraz” finálny zdroják pre komunikáciu PIC16f877A z DS1307 a DS18B20 .Čas ,dátum a teplota sú zobrazované na 2x16 LCD displeji.
Relatko.
DS1307.asm (26.6 KB)

Ahoj.
Mám dotaz na RTC-éčko PCF8593P. Sběrnice mi jede, tj. zapíšu a zase načtu co jsem zapsal do registrů RTC-éčka. Tím mám ověřeno, že komunikace je OK. Ale zřejmě mi nekmitá krystal. Zkusil jsem vyměnit procák (16F876A), RTC-éčko a vícekrát krystaly. Ty byly různé, jak nové (ale stejný dodavatel), tak vypájené z jiných zařízení. Nic. Záměrně jsem neuvedl zdroják, neboť jsem ho získal pro soukromé účely. Konkrétně je to řídící jednotka topení z AR 4/2009. Hex se stáhnout dá ze stránek AR.
Po komunikaci s autorem (zařízení je funkční ve více exemplářích) se přikláním na krystal. Napadá někoho rada?
Mikop

Tak úspěch. Problém způsobuje paměť 24C04, která je paralelně na sběrnici I2C. Po jejím odpojení ze sběrnice I2C, hodiny jedou jak mají. Byla použitá z jiného zařízení. Problém je taktéž v rozsahu adresace.
Mikop