Hodinky s PIC

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
stanke
Stály člen
Stály člen
Príspevky: 287
Dátum registrácie: 13 Nov 2007, 00:00
Bydlisko: Bernolákovo
Vek: 32
Kontaktovať používateľa:

Hodinky s PIC

Príspevok od používateľa stanke » 15 Feb 2011, 02:14

objednal som si pic radu 18f s množstvom periférií a rád by som si spravil hodinky na LCD display...len skúsiť to niečo nové sa naučiť.

Otázka na skúsených.
Akým princípom dosiahnem presný časový údaj?
Použijem Timer alebo ak ona to? nerád by som sa pustil zlou cestou predsalen...
Ako nastaviť čas, a delenie na hodiny, minúty a tak zvládnem(google)aj vykreslenie na LCD a nechcem ani program, iba postrčiť tou správnou cestou (na teoretickej úrovni).
Verím že PIC18F242 toho bude mať na hodinky vo výbave viac než dosť :)

Za pomoc ďakujem :)
0
Obrázok

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Príspevok od používateľa mato3000 » 15 Feb 2011, 11:23

zaujímavý prístup k problematike. na hodinky 10MIPS procesor :lol: , ale hlavne že má kopiu periférii a na čo budeš využívať tie periférie ? inak trochu ťa sklamem, takmer každý ma také periférie.

nabudúce sa kukni na datasheet a kúp si nejaký s RTC, alebo si zožeň základnú radu 16F.

teraz k tvojmu problému. presný čas dosiahneš jedine cez modul RTC, ktorý tvoj MCU nemá, takže si ho dokúp alebo zostav.
0

Používateľov profilový obrázok
vama
Ultimate člen
Ultimate člen
Príspevky: 1545
Dátum registrácie: 26 Aug 2008, 00:00
Bydlisko: BA
Vek: 31

Príspevok od používateľa vama » 15 Feb 2011, 13:02

Presne tak,
presny cas dosiahnes iba pomocou RTC. Ak nahodou nevies co to je tak dam strucny popis, je to ext. (moze byt aj interny v MCU) obvod, do ktoreho nastavis cas a on uz sam pracuje. Ked potrebujes vycitat z neho cas (povedzme ze 2x za sekundu), tak jednoducho cez SPI/ I2C/ ... len ho vycitas a zobrazis na display. Presne hodiny nespravis tym ze kupis najmodernejsie MCU, ale tym, ze RTC nastavis na co najpresnejsiu frekvenciu (RTC pouziva ext. krystal).

Dalo by sa to aj bez RTC spravit, ale to mas zbytocnej roboti navyse, pretoze bez RTC by si musel zabezpecit kazdu 1sek rovnaky pocet instrukci (napr. pri f = 4Mhz, 1 MPIS), mozno nie je problem, ale predstav si, ze stlacis tlacidlo a tym sa predlzi o 5-10 instrukci a hned to mas nepresnejsie. Dalej vlastne to RTC aj za teba prepocitava cas a aj datum.
0
"Digitálna technika pozostáva len z 0 a 1, ktoré sú v správny čas na správnom mieste." M. Valášek

Používateľov profilový obrázok
feros
Stály člen
Stály člen
Príspevky: 414
Dátum registrácie: 23 Sep 2010, 00:00
Bydlisko: okres Nitra

Príspevok od používateľa feros » 15 Feb 2011, 17:23

Myslím že to RTC nie je až tak pravda. Dá sa to spraviť aj cez počítanie inštrukcii ale je to veľmi náročné na testovanie, musíš otestovať všetky možnosti a spočítať inštrukcie plus nájsť sposob ako pre rozne možnosti dodržať presný počet inštrukcii a na koniec zistíš že kryštál aj tak nie je presne 4 000 000,000 Hz, alebo použiť PIC s TMR1 a použiť kryštál 32768Hz a cez externý vstup počítať jeho takt, prerušenie ale musí biť spracovane do ďalšieho pulzu z kryštálu, problém s kryštálom ale zostava. Ak máš možnosť napájať to zo siete je presnejšie počítať pulzy zo sieťového napatia. Najpresnejšia možnosť ale je radiové riadenie. Skutočne presné hodiny tak ako presný teplomer doma nespravíš.
0

Používateľov profilový obrázok
eurobastler
Ultimate člen
Ultimate člen
Príspevky: 3903
Dátum registrácie: 19 Apr 2009, 00:00
Bydlisko: BA
Vek: 35

Príspevok od používateľa eurobastler » 15 Feb 2011, 17:30

Skus porozmyslat nad uP PIC18F24J50, stoji okolo 3EUR a obsahuje RTC a ma 22 vyvodov....
0
Obrázok

Používateľov profilový obrázok
vama
Ultimate člen
Ultimate člen
Príspevky: 1545
Dátum registrácie: 26 Aug 2008, 00:00
Bydlisko: BA
Vek: 31

Príspevok od používateľa vama » 15 Feb 2011, 17:35

to feros:
1. o tom testovani a prepocitavani instrukcii, to som uz pisal
2. pocitat impulzy zo siete? To myslis, akoze je presne tych "50 Hz" co kmita zasuvke? Ved to je blbost n-teho stupna, toto sa pouzivalo 30 rokov spat, kedy neboli krystali. Sietova frekvencia teda zdaleka nie je tak presna ako frekvencia krystalu.
3. ano v amaterskych kontrukciach je najlepsie DCF.om synchronizovat hodiny, ale aj tak po synchronizacii musia presne ist, ved rano by si synchronizoval cas DCF-kom a vecer by ti to kludne mohlo urobit 10 sekund.


Zaver:
Pouzi RTC a presne vylad oscilator.
0
"Digitálna technika pozostáva len z 0 a 1, ktoré sú v správny čas na správnom mieste." M. Valášek

Používateľov profilový obrázok
feros
Stály člen
Stály člen
Príspevky: 414
Dátum registrácie: 23 Sep 2010, 00:00
Bydlisko: okres Nitra

Príspevok od používateľa feros » 15 Feb 2011, 17:56

vama.
1:OK
2:Ano pocitat 50hz, a je to presnejsie ako sa zda. Udržiavanie frekvencie siete je dnes ovela lepšie ako v praveku.
3:DCF ak sa nemýlim ide stále takže synchronizovať treba keď sa dá. A doladiť frekvenciu kryštálu je bez prístrojov beh na dlhú trať.
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Príspevok od používateľa mato3000 » 15 Feb 2011, 18:00

FEROS si ma celkom slušne pobavil ....


už si to niekedy tak robil ? tak prezraď aký čas ti to potom ukazovalo po dvoch dňoch.


jasné dá sa to a dá sa ísť z Rače do Petržalky cez Vysoké Tatry :wink:

//Automatické spojenie príspevkov. Pridané po 50 sekundách:

P.S: to mi chceš povedať, že 50Hz v sieti je stabilizované +- ppm ? 8)
0

Používateľov profilový obrázok
vama
Ultimate člen
Ultimate člen
Príspevky: 1545
Dátum registrácie: 26 Aug 2008, 00:00
Bydlisko: BA
Vek: 31

Príspevok od používateľa vama » 15 Feb 2011, 18:31

Tak jasne ze dnesna sustava je stabilnejsia ako kedysik ale ja pochybujem ze presnost je nizsia ako 0,001 Hz a ako povedal mato3000 stabilita krystalu sa udava tak 20 ppm (ppm - Parts per million, miliontina) cize nejake stotiny, tisiciny Hz sa zdaleka nepriblizuju k ppm. :roll:
Ano DCF je nonstop vysielane, ale skusal si cez den chytit DCF? Da sa to ale nerobi sa to, pretoze vsetky el. zariadenia (myslene aj mimo miestosti) tak zarusia ten signal, ze je to dost velky problem chytit. Riesi sa to kompromisom, ze raz za den (zvacsa 3:00 AM) sa zosynchronizuje signal a potom idu hodiny na vlastnom oscilatore.
0
Naposledy upravil/-a vama v 18 Feb 2011, 12:11, upravené celkom 2 krát.
"Digitálna technika pozostáva len z 0 a 1, ktoré sú v správny čas na správnom mieste." M. Valášek

Používateľov profilový obrázok
feros
Stály člen
Stály člen
Príspevky: 414
Dátum registrácie: 23 Sep 2010, 00:00
Bydlisko: okres Nitra

Príspevok od používateľa feros » 15 Feb 2011, 18:35

Nerobil som také hodiny, ale vychádzam s toho že mám klasický radio budík ktorí to robí presne takto(50Hz). Ukazuje len minúty ale tie súhlasia dva aj tri mesiace.

k PPM než to písať račej to opíšem

PPM (z angl. parts per million) je podobne ako percento spôsob, ako vyjadriť zlomok - milióntinu - celým číslom. Napríklad zápis 45 ppm znamená 45 milióntin, t.j. 0,000045, alebo 45 x 10-6, či 0,0045%, prípadne 0,045‰.

teda kryštál 4.0MHz 100ppm +- 400hz teda 0,01%
den ma 24h*60m*60s= 86400 > 0,01%=8.64s
a to je len bežná chyba, pripočítaj teplotnú závislosť, nesprávnu vstupnú kapacitu a odpor, pájkovanie atd.
Výrobca neudáva 4,000MHz, miesta za čiarkou len tak pre srandu.
0

Používateľov profilový obrázok
vama
Ultimate člen
Ultimate člen
Príspevky: 1545
Dátum registrácie: 26 Aug 2008, 00:00
Bydlisko: BA
Vek: 31

Príspevok od používateľa vama » 15 Feb 2011, 18:51

Ako si zistil, ze radio budik je taktovany frekvenciou siete?

Preco udavas az 100 ppm ?
0
"Digitálna technika pozostáva len z 0 a 1, ktoré sú v správny čas na správnom mieste." M. Valášek

Používateľov profilový obrázok
feros
Stály člen
Stály člen
Príspevky: 414
Dátum registrácie: 23 Sep 2010, 00:00
Bydlisko: okres Nitra

Príspevok od používateľa feros » 15 Feb 2011, 18:59

Pardon! Nie, rádio a budík - ale klasika z 90" od PRC.
100ppm bežné kryštály z SOS.
0

Používateľov profilový obrázok
vama
Ultimate člen
Ultimate člen
Príspevky: 1545
Dátum registrácie: 26 Aug 2008, 00:00
Bydlisko: BA
Vek: 31

Príspevok od používateľa vama » 15 Feb 2011, 19:09

OK, tak to moze byt. Nastav ich presne a po nejakom tyzdni zmeraj kolko su nepresne, sam som zvedavy, ale aj tak na krystal tazko maju. :wink:

To 100ppm je trochu moc, bezne su krystali 30, 20 ppm. A to som este povedal, ze treba ten oscilator doladit. Jasne ze po 1. spusteni by boli nepresne aj 5 - 10s / den. Co sa tyka teplotnej stability, to je zanedbatelne pretoze izbova teplota je skoro konstantna.
0
"Digitálna technika pozostáva len z 0 a 1, ktoré sú v správny čas na správnom mieste." M. Valášek

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Príspevok od používateľa mato3000 » 15 Feb 2011, 20:20

srandista :D a teraz si to skús prerátať s hodinovým krištálom na 32,768 kHz a bude ti jasné prečo sa používajú práve tie do RTC... a to ppm, no si ako politik, spočítaš čo sa ti hodíííí :wink:

http://www.tme.eu/html/SK/hodinov__-kry ... pelny.html


ale fakt schálne, to sem vypočítaj ešte raz

//Automatické spojenie príspevkov. Pridané po 12 minútach:

inak ten tvoj výpočet je celý nejaký divný, ty počítaš chybu len + 0,01% , ale šak to je aj - 0.01% , takže ty udávaš iba max. chybu, ale reál kľudne môže byť aj 0,23s / 24h
0

exekutor
Stály člen
Stály člen
Príspevky: 295
Dátum registrácie: 28 Jún 2009, 00:00

Príspevok od používateľa exekutor » 15 Feb 2011, 20:40

TMR1 - vyladeny na prerusenie kazdych 500 ms - prioritne prerusenie externy oscilator.
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Príspevok od používateľa mato3000 » 15 Feb 2011, 20:44

feros:
dalšia blbosť je že to počítaš ako chyu na Hz, udávaš pri 4MHz je chyba 400Hz, teda za jednu sek urobí pri 4/fosc MCU +- 100 krokov ale pri 32,768 a chybe + 0,1% je to 32,768 Hz, teda pri 4/fosc je to +- 8,2 kroku a ak k do tejto rovnice dosadíš správne ppm a nie ten tvoj blud, tak to bude 5x menšia chyba :D

exekutor: asi poriadne nečítaš, lebo ak by to spravil tak ako píšeš, tak tam bude teoreticky chyba cca 8s/24hod
0

RETFIE
Stály člen
Stály člen
Príspevky: 368
Dátum registrácie: 31 Mar 2009, 00:00

Príspevok od používateľa RETFIE » 15 Feb 2011, 20:57

S PICkom som robil digit. hod. asi na 4 sposoby. Pri prvom som sa ucil programovat -bolo to robene oneskorovacimi sluckami - vysledok = sado maso kod, ale islo to vcelku presne - no neodporucam. Neskor som pochopil podstatu prerusenia a vyuzitia casovacov (vysledkom boli dalsie 2 programy) a nokoniec som to pri mojom krmitku prespekuloval takto:

Kód: Vybrať všetko


; ****************************************************************************
; --------- VEKTOR PRERUSENIA ------------------------------------------------
; ****************************************************************************

			ORG		H'04'

			MOVWF	R_M_W				; uloz W register

			SWAPF	STATUS,W			; vobec neovplyvnuje STATUS register
			MOVWF	R_M_STATUS			; uloz so zamenenymi nibblami
										; stavovy register STATUS
			BCF		STATUS,RP0			; az po ulozeni STATUS registra ! nastav na Bank 0 (pretoze prerusenie moze nastat aj v case ked je nastavena Bank 1)
			BCF		STATUS,RP1			; az po ulozeni STATUS registra ! nastav na Bank 0 (pretoze prerusenie moze nastat aj v case ked je nastavena Bank 1)
										; na konci ISR program prepne na povodnu banku
										; instrukciami SWAPF	R_M_STATUS,W a MOVWF	STATUS
										; ktora bola nastavena pred prichodom do ISR
			BTFSS	PIR1,TMR1IF
			GOTO	L_ISR_RET			; vykonaj ISR len ak nastalo prerusenie od TMR1
			BCF		PIR1,TMR1IF

; ----------------------------------------------------------------------------
; --------- RUTINA PRERUSENIA ------------------------------------------------
; ----------------------------------------------------------------------------
; tento kod sa vykona kazdych 65536 us

			INCF	R_50MS,F			; pripocitaj 50 ms

; ----------------------------------------------------------------------------
; --------- PRIPOCITANIE CISLA H'3CB0' = D'15536' DO REGISTROV R_3CB0_BX -----
; ----------------------------------------------------------------------------

			MOVLW	H'B0'				; pripocitaj do registrov 3CB0 cislo 15536 - co je rozdiel TMR0 a 50 ms ( 65 536 - 50 000 = 15 536 = H'3CB0' )
			ADDWF	R_3CB0_B0,F

			MOVLW	H'01'				; priprav cislo 1 pre pripadne inkrementovanie registra R_3CB0_B1
			BTFSC	STATUS,C			; ak pretiekol register R_3CB0_B0, musi sa inkrementovat R_3CB0_B1
			ADDWF	R_3CB0_B1,F			; pripocitaj
			BCF		F_C					; nuluj priznak v registri R_GEN_FLAGS
			BTFSC	STATUS,C			; ak pretiekol register R_3CB0_B1, musi sa inkrementovat R_3CB0_B2
			BSF		F_C					; nastav priznak ze je treba inkrementovat register R_3CB0_B2
			MOVLW	H'3C'
			ADDWF	R_3CB0_B1,F
			BTFSC	STATUS,C			; ak pretiekol register R_3CB0_B1, musi sa inkrementovat R_3CB0_B2
			BSF		F_C					; nastav priznak ze je treba inkrementovat register R_3CB0_B2

			MOVLW	H'01'				; priprav cislo 1 pre pripadne inkrementovanie registra R_3CB0_B2
			BTFSC	F_C					; ak pretiekol register R_3CB0_B1, musi sa inkrementovat R_3CB0_B2
			ADDWF	R_3CB0_B2,F

; ----------------------------------------------------------------------------
; --------- TEST CI OBSAH REGISTROV R_3CB0_X JE VACSI AKO H'C350' = 50000 ----
; ----------------------------------------------------------------------------

			MOVF	R_3CB0_B0,W
			MOVWF	R_SUB_B0
			MOVF	R_3CB0_B1,W
			MOVWF	R_SUB_B1
			MOVF	R_3CB0_B2,W
			MOVWF	R_SUB_B2

			MOVLW	H'50'				; nizsi bajt cisla H'C350'
			SUBWF	R_SUB_B0,F

			MOVLW	H'01'				; priprav cislo 1 pre pripadne odcitovanie od registra R_SUB_B1
			BTFSS	STATUS,C
			SUBWF	R_SUB_B1,F
			BCF		F_C					; nuluj priznak v registri R_GEN_FLAGS
			BTFSS	STATUS,C			; ak pretiekol register R_SUB_B1, musi sa dekrementovat R_SUB_B2
			BSF		F_C					; nastav priznak ze je treba dekrementovat register R_SUB_B2
			MOVLW	H'C3'
			SUBWF	R_SUB_B1,F			; odcitaj cislo H'C3' od registra R_SUB_B1
			BTFSS	STATUS,C			; ak pretiekol register R_SUB_B1, musi sa dekrementovat register R_SUB_B2
			BSF		F_C					; nastav priznak ze je treba dekrementovat register R_SUB_B2

			MOVLW	H'01'				; priprav cislo 1 pre pripadne odcitovanie registra R_SUB_B2
			BTFSC	F_C					; ak pretiekol register R_SUB_B1, musi sa dekrementovat R_SUB_B2
			SUBWF	R_SUB_B2,F

; ----------------------------------------------------------------------------
; --------- KONTROLA F_C PRIZNAKU --------------------------------------------
; ----------------------------------------------------------------------------
; ak je nastaveny F_C priznak, znamena to, ze hodnota v registroch R_3CB0_X je mensia ako 50 000

			BTFSC	F_C					; ak F_C = 0, potom hodnota v registroch R_3CB0_X dosiahla, alebo prekrocila hodnotu 50 000
			GOTO	L_ISR_RET

			MOVF	R_SUB_B0,W			; kedze hodnota v registroch R_3CB0_X je vacsia alebo rovnaka ako 50 000,
			MOVWF	R_3CB0_B0			; vysledok po predchadzajucom odcitavani, ktory sa ukladal do registrov R_SUB_BX,
			MOVF	R_SUB_B1,W			; je treba z registrov R_SUB_BX presunut do registrov R_3CB0_BX
			MOVWF	R_3CB0_B1			; to ale plati vyhradne ked NIE je nastaveny F_C priznak - tzn. ze ked je hodnota v R_3CB0_BX
			MOVF	R_SUB_B2,W			; vacsia alebo rovna 50 000
			MOVWF	R_3CB0_B2

			INCF	R_50MS,F			; pripocitaj 50 ms, pretoze hodnota v registroch R_3CB0_BX je vacsia ako alebo rovna hodnote 50 000

; ----------------------------------------------------------------------------
; --------- TEST HODNOTY V R_50MS A PRIPADNE INKREMENTOVANIE CASU ------------
; ----------------------------------------------------------------------------

			MOVLW	D'20'				; 20 * 50 ms = 1000 ms = 1 sekunda
			SUBWF	R_50MS,W			; testuj ci hodnota v R_50MS prekrocila ale je na hodnote D'20'
			BTFSS	STATUS,C			; ak hodnota v R_50MS je vacsia alebo rovna 20, znamena to ze sa musia inkrementovat sekundy
			GOTO	L_ISR_RET			; ak hodnota v R_50MS je mensia ako 20, NEinkrementuj cas lebo este NEpresla 1 sekunda

			BSF		F_OLCD				; povol obnovenie LCD, pretoze ubehla dalsia sekunda
			BCF		F_HOTOVO			; nuluj priznak F_HOTOVO, pretoze nastala dalsia sekunda
			MOVWF	R_50MS				; vysledok po odcitavani uloz do R_50MS
			INCF	R_SEKUNDY,F			; inkrementuj sekundy
			MOVLW	D'60'				; minuta ma 60 sekund
			SUBWF	R_SEKUNDY,W			; test ci uplynulo 60 sekund
			BTFSS	STATUS,C
			GOTO	L_ISR_RET			; ak neuplynulo 60 sekund, nevykonaj ziadnu upravu casu

			CLRF	R_SEKUNDY			; ak uplynulo 60 sekund, musia sa sekundy vynulovat
			INCF	R_MINUTY,F			; ak uplynulo 60 sekund, inkrementuj minuty
			MOVLW	D'60'				; hodina ma 60 minut
			SUBWF	R_MINUTY,W			; test ci uplynulo 60 minut
			BTFSS	STATUS,C
			GOTO	L_ISR_RET			; ak neuplynulo 60 minut, nevykonaj ziadnu upravu hodin

			CLRF	R_MINUTY			; ak uplynulo 60 minut, musia sa minuty vynulovat
			INCF	R_HODINY,F			; ak uplynulo 60 minut, inkrementuj hodiny
			MOVLW	D'24'				; den ma 24 hodin
			SUBWF	R_HODINY,W			; test ci uplynulo 24 hodin
			BTFSS	STATUS,C
			GOTO	L_ISR_RET			; ak neuplynulo 24 hodin, nenuluj hodiny
			CLRF	R_HODINY

			BCF		STATUS,C		; nuluj Carry priznak aby sa pri rolovani nezakomponoval do registra R_DEN
			RLF		R_DEN,F			; zmen den
			MOVF	R_DEN,F			; nulovy test, test, ci R_DEN = H'00', ak ano, znamena to ze R_DEN pretiekol a musi sa do R_DEN vlozit H'02'
			MOVLW	H'02'
			BTFSC	STATUS,Z		; test ci sa ma R_DEN nastavit na POndelok
			MOVWF	R_DEN

; ----------------------------------------------------------------------------
; --------- L_ISR_RET --------------------------------------------------------
; --------- NACITANIE POVODNYCH HODNOT REGISTROV STATUS A W ------------------
; ----------------------------------------------------------------------------

L_ISR_RET	SWAPF	R_M_STATUS,W
			MOVWF	STATUS				; nacitaj povodnu hodnotu registra STATUS

			SWAPF	R_M_W,F				; zamen nibble v registri R_M_W
			SWAPF	R_M_W,W				; zamen nible a uloz do W

			RETFIE

0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Príspevok od používateľa mato3000 » 15 Feb 2011, 21:11

no a aké je reálna presnosť?
0

RETFIE
Stály člen
Stály člen
Príspevky: 368
Dátum registrácie: 31 Mar 2009, 00:00

Príspevok od používateľa RETFIE » 15 Feb 2011, 21:26

Podla ppm krystalu.
Presnost som testoval len jeden den - co je dost kratky cas ale nepohlo sa to ani o sekundu.
0

mato3000
Power user
Power user
Príspevky: 9767
Dátum registrácie: 04 Jan 2009, 00:00
Bydlisko: BA

Príspevok od používateľa mato3000 » 15 Feb 2011, 21:30

to len potvrdzuje to čo som už písal

mato3000 napísal: inak ten tvoj výpočet je celý nejaký divný, ty počítaš chybu len + 0,01% , ale šak to je aj - 0.01% , takže ty udávaš iba max. chybu, ale reál kľudne môže byť aj 0,23s / 24h

ale na meranie času do hodín by som to rozhodne nepoužil, lebo tak po mesiaci by to už bola nejaká tá minúta . okrem toho s RTC to je jednoduchšie stačí vyčítať hodnotu času povedzme každú cca sek a potom zobraziť na LCD a nemusíš sa o nič starať a bude to dostatočne presné
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok