Fórum témák

» Több friss téma
Fórum » DS1307 inicializálása
 
Témaindító: fookos, idő: Jan 29, 2008
Témakörök:
Lapozás: OK   2 / 7
(#) fookos válasza MPi-c hozzászólására (») Feb 1, 2008 /
 
Köszönöm a válaszokat!

Interruptos időolvasás:

A másodpercenkénti 5-szöri kiolvasást is "elegáns"-nak tartom. Mindegy, hogy honnan jön az interrupt.

De ha már itt tartunk, mennyi ideig tarthat a teljes idő kiolvasása I2C-n keresztül? Mennyi ideig akasztja meg a processzort?

100 khz-n 8bit device címzés + 8 bit mem címzés + 7x8 bit adatolvasás (vagy írás) meg vagy 8-9 ack + nack + restart az kb. 82 impulzus. vegyünk mondjuk 100-at mérnöki kerekítéssel Vagyis:

( 1 / 100 000 ) * 100 * 1 ---> 0,001 s

Ennél azér 2-szer 5-szer tovább tarthat az időzítések miatt. Így ha nagyon durván számolom, akkor 0,005 s a teljes idő kiolvasása vagy írása.

Vagyis ha mondjuk 200 Hz-nál nagyobb a 7szegmenses LED kijelzők meghajtása, akkor esetleg érezhetően belekavar.

Talán ezt el lehet úgy kerülni, hogy az interruptból csak egy flag-ot állítok, és a főciklusban olyankor olvasom ki az időt amikor a led-ek világítanak. Így talán kevésbé zavaró.

De ez csak agymenés... mielőtt nekiálnék rendesen leprogramozni. Mit gondoltok?

Írhatatlan memóriabyte a 0x08 helyen

Tovább kisérletezgettem a DS1307-el, és kiderült, hogy a dokumentációval ellentétben a 0x08-as címet nem lehet írni. Ezt már olvastam valamelyik angol nyelvű fórumban is, de nem hittem el, hisz a doksija nem ezt állítja. Mindenesetre tényleg nem tudom írni. 0x09-től kezdődöen már minden ismét OK (ide mentem az ébresztés időpontját).

Ezt ti is tapasztaltátok, vagy egyszerüen vannak a piacon hibás DS1307-ek?

(#) gyengus válasza fookos hozzászólására (») Feb 1, 2008 /
 
Én még nem írtam az idő és dátum értékeken kívül máshova.
Úgy értelmeztem az adatlapot, h magának tartja fenn arra az esetre, ha adatátvitel közben vmi gond lenne, pl elmegy az áram.
Azt mondod, h a fennmaradó helyekre lehet írni? Kicsit furcsállom, h RTCben lehet adatokat tárolni .
Lehet, majd próbálkozok vele én is.
(#) MPi-c válasza gyengus hozzászólására (») Feb 1, 2008 /
 
Idézet:
„Kicsit furcsállom, h RTCben lehet adatokat tárolni”

Pedig nem annyira különleges, már a PCF8583-as RTC-ben is volt 240 byte-nyi felhasználható ram, pedig az sem egy mai darab. Én sem használtam még, úgy hogy nem tudom fookos által írt hiba egyedi-e.
(#) potyo válasza fookos hozzászólására (») Feb 1, 2008 /
 
Én is a hétszegmensű kijelző multiplexeléséhez igazítottam az RTC olvasását. Csak én muszájból, mert amíg a kijelző ki van kapcsolva, az idő alatt olvasom ki az RTC-ből az adatot a szegmensvezetékeken. Nálam a kijelző 2,4kHz-es frekvenciával van multiplexelve, úgy emlékszem minden nyolcadik megszakításnál olvasok ki egy regisztert, tehát másodpercenként kb. 2400/(16*8)=18-szor olvasom ki a pontos időt. Mondjuk ez párhuzamos interfésszel rendelkező RTC (DS12887), tehát egy regiszter olvasása 15 utasításciklust jelent a megszakítási rutinban. Viszont te nem írod, hogy a hardveres I2C-t használod, vagy szoftveresen kezeled. A hardveres nem foglalja le a processzort. A szoftvereset viszont nézd meg szimulátorban, hogy mennyi ideig tart.
(#) gyengus hozzászólása Feb 2, 2008 /
 
Szeretném kipróbálni az rtc négszögjel kimenetét.
Az adatlap azt írja, h tápfeszre kell felhúzni az SQW/OUT lábat egy ellenállással, de értéket nem ír.
Mekkora ellenállás kell hozzá?
(#) fookos válasza gyengus hozzászólására (») Feb 2, 2008 /
 
Szerintem pont akkorával mint az I2C lábakat.

De itt egy projekt amiben az 1HZ-es kimenetet interruptra használják: Alarm Clock

Ebben találsz példát a kérdésedre. Beraktam JPG-ben is a kapcs. rajzot (arra az esetre, ha megszünne a belinkelt oldal).

clock1.jpg
    
(#) gyengus válasza fookos hozzászólására (») Feb 2, 2008 /
 
Köszi, majd kipróbálom.
Első körben csak próbálgatom LEDdel, hangszóróval (sztem a ~32kHznek van hangja), a végleges verzióban valszeg a :-ok fognak 1Hzvel villogni a segítségével.
(#) fookos válasza gyengus hozzászólására (») Feb 2, 2008 /
 
32 kHz-t tutira nem hallod. Az emberi fül kb. 20 Hz - 20 kHz-ig képes hallani gyermekkorban. Az öregedésel párhuzamosan a felső határ szépen lassan beszűkül. Sem hangerőben sem frekvenciában nem hallanak az idősebbek olyan jól mint a gyermekek.

Ha beírod a google-be hogy "hallás 20kHz" akkor egy csomó linket kapsz.

De hogy éreztessem hogy a 32 kHz freki mit jelent: ha vesszük a 440 Hz frekvenciájú normál zenei "A" hangot, akkor a nála egy oktávval magasabb hang frekvenciája az ő frekvenciájának éppen kétszerese, azaz 880 Hz. Ugyanígy, az alaphangtól egy oktávval mélyebben megszólaló hang frekvenciája az adott hang frekvenciájának fele - jelen esetben tehát 220 Hz.
Tehát a zenei művek 80-90%-a 2-3 oktávon belül mozog, ami 220 Hz - 1960 Hz. A 32 Khz a normál zenei A hang 72-szerese.


Konklúzió: Állítsál be 4 Khz-t és egy 4,7 vagy 10 K-s ellenálláson keresztül hajtsál meg egy tranzisztort amiről aztán már hangszóróra köthető jelet is kapsz.

Egyébként ennek az óraprojektnek a melléktermékeként az 1 Hz-s kimenettel egy nagyon pontos 1 Hz-s jelaforrást is kapunk amit aztán frekimérésre illetve esetleg kalibrálásra is lehet használni. Házilag jobbat úgysem igen lehet előállítani.


(#) gyengus válasza fookos hozzászólására (») Feb 2, 2008 1 /
 
Úgy emlékeztem, h 20kHz az alsó küszöb, köszi a javítást.
(#) MPi-c válasza fookos hozzászólására (») Feb 2, 2008 /
 
Idézet:
„Egyébként ennek az óraprojektnek a melléktermékeként az 1 Hz-s kimenettel egy nagyon pontos 1 Hz-s jelaforrást is kapunk...”

... feltéve, hogy az RTC-t meghajtó kvarcod pontos.
(#) fookos válasza MPi-c hozzászólására (») Feb 2, 2008 /
 
Az első órámba 6,5536 Mhz-s kvarcot használtam, mert a TIMER0-val:

belső órajjel:
6 553 600 / 4 => 1 638 400
Prescaller 64-el:
1 638 400 / 64 => 25 600
TIMER0 szabadonfut:
25 600 / 256 => 100

Ezzel pedig ha interruptolok, akkor elméletben 100 leszámolása után már meg is van az 1 Hz.

A baj csak az, hogy az ilyen kvarcal épített órám kb 10-20 másodpercet siet naponta és trimmer kondival sem tudom a kvarcfrekit befolyásolni.

Evvel szemben a DS1307-esre ráraktam egy normál kvarcot, és így naponta kb 0,5-1 másodperc az eltérés.

Ez azért 1 nagyságrenddel jobb.
(#) MPi-c válasza fookos hozzászólására (») Feb 2, 2008 /
 
Jobb, de ajánlom figyelmedbe a DS32kHZ-t.
(#) gyengus válasza fookos hozzászólására (») Feb 3, 2008 /
 
Kipróbáltam a ramját: a 0x08-as címre nekem se sikerült írnom/olvasnom. A 0x09-esre viszont tudtam írni, ill onnan olvasni.
Az adatlap 7. oldalán lévő 2es ábra azt mutatja, hogy a kvarc fém házát földre kell kötni? Jelenleg próbapanelon van, de ha úgy jobb, a végleges nyákon leföldelem.
Néhány napig otthon voltam, addig a ds1307 csak a 3Vos elemről kapta az áramot. Sajnos összeszedett 1-2 másodperc késést. Ez mitől van, lehet javítani? Nemrég újra küldtem neki az időt, most megint jó.
Be kell kötni pluszba 1 DS32kHZ-t?
(#) MPi-c válasza gyengus hozzászólására (») Feb 3, 2008 /
 
Nem pontos a kvarcod, azért késik. Ezen segít a DS32kHZ, de az nem kötelező. Az adatlapban a kcarc körüli fólia ajánlott kialakítása szerepel.
lehet, hogy érdekes, de nemek rendesen írja 0x08-as ram címet. Mindjárt kipróbálom egy másik példánnyal is...
(#) gyengus válasza MPi-c hozzászólására (») Feb 3, 2008 /
 
Hol és mennyiért lehet beszerezni 1 DS32kHZ-t?
A fóliát nem értem. Egyoldalas nyákon lesz az alkatrészoldalon. Ilyenkor nem számít a fólia kialakítása?
(#) MPi-c válasza gyengus hozzászólására (») Feb 3, 2008 /
 
A másik példányban is írható a kérdéses ram cím. :nemtudom:
A fóliát így alakítottam ki:
(#) gyengus válasza MPi-c hozzászólására (») Feb 3, 2008 /
 
Köszi
(#) fookos válasza MPi-c hozzászólására (») Feb 4, 2008 /
 
0x08 h írása / olvasása

Írási müveletnél nem adott hibát nálam se, de mikor a tartalmát kiolvastam nem az volt benne, amit beleírtam. Ha jól emlékszem a tartalma mindig 0x16 volt.

pontos idő beállítása a DS1307-ben

Ha a 0x00 memóriahelyen a másodperceket írom, akkor az RTC a belső számlálóit is kinullázza és a másodpercet miliszekundumok lenullázásával kezdi újra számolni?

Vagyis ha mondjuk a belső számláló (az egyszerűség kedvéért beszéljünk ms-ről) 02,991 -on áll és én beleírok 00-t akkor 00,000 -ról számol tovább vagy 00,991-ről (megint egyszerűség kedvéért az írás 0,000 s-ot vesz igénybe).

Erre sehol nem találtam eddig választ. Sem az adatlapjában, sem pedig a neten (lehet megint levelet írok a maximnak )

Idő beállítási stratégia

Ez a téma kapcsolódik az előző kérdéshez is Szóval, az első körben a beállítási rutinokat úgy írtam meg, hogy bármit állítottam az időből (év/hó/nap óra/perc/másodperc), a beállítási mód befejeztekor az összes adatot kiírtam az RTC-be. Ez oda vezetett, hogy 3-4 állítgatás után a másodpercek 1-3s-el elmásztak.

Most úgy csinálom, hogy egyrészt a másodpercek csak nullázhatóak (így könnyebb szinkronizálni egy másik órához kézzel), másrészt minden adatot külön-külön célzottan írok az RTC-be. Vagyis, ha a csak a perceket állítom, csak a perceket írom ki (1 byte), és minden mást békén hagyok. Így most megoldódni látszik a probléma.

Ti milyen stratégiát használtok? Hogyan írjátok az időt az állításkor az RTC-be.

DS32kHz

Megnéztem a neten egy csomó magyar üzletben, de sehol nem tartják még rendelésre sem. Viszont valamelyik témában MPi azt írta, hogy a RET-nél rendelte meg (Kérlek MPi korrigálj, ha rosszul emlékszem). Majd a napokban odatelefonálok.
(#) gyengus válasza fookos hozzászólására (») Feb 4, 2008 /
 
0x08h írása/olvasása: én csak egy nagyon egyszerű módon teszteltem, beírtam 1 értéket, majd kiolvastam és ellenőríztem, hogy az-e amit beírtam

idő beállítás: az idő értékeket egyben írom, vagyis 1 char tömbbe rakom az értékeket sorban, aztán elküldöm a ds1307nek, dátumnál ugyanígy, nem tapasztaltam elmászást
(#) fookos válasza MPi-c hozzászólására (») Feb 5, 2008 /
 
Nagyon szép a nyákod MPi-c. Profi.

Pár kérdés még a DS32kHz-hez:

1.) Ha ez magában már egy hőkompenzált kristályoszcillátor, akkor a DS1307-mellé minek még egy kristály?

Ha csak nem azért, mert a DS1307-nek van aksija, a DS32kHz-re meg nem raktál aksit. Így ha elmegy az áram, akkor is jár tovább az óra csak nem hőkompenzált pontossággal.

2.) Az adatlapja szerint a DS32kHz is kaphat aksit. Viszont sehol nincsen olyan példa az adatlapjában, ahol az RTC és a DS32kHz ugyan arrol az aksiról megy. Szerintetek eljár 1 aksiról a 2 IC?

(#) potyo válasza MPi-c hozzászólására (») Feb 5, 2008 /
 
Én csak egyet nem értek. Ehhez minek kétoldalas nyák?
(#) fookos válasza fookos hozzászólására (») Feb 5, 2008 /
 
Megjöttek a válaszok a MAXIM-tól:

1.) 0x08 byte írása / olvasása

Kérdés:
According to the docs the bytes 00..07 are registers, 08-3F are memory (non volatile). However if I try to write to byte 08, no error is indicated, but the value is not changed. Is this a bug or a feature? Writing to bytes 09-3F is OK.

Válasz:
The RAM locations are written the same as the clock registers, if you can read and write to the clock registers then the RAM locations should be accessible.

Megjegyzésem:
Pedig az a memória byte akkor sem írható.

2. Másodperc írásakor a másodpercek számolásának módja

Kérdés:
When setting the seconds, are the fractional seconds set to 0? I.e. when setting the seconds, will the next seconds increase be done after 1 sec?

Válasz:
The seconds register will increment from the value entered after 1 seconds if the oscillator is running when set.

If the seconds value is set then the oscillator is turned on then there can be up to a seconds delay. The delay is due to the oscillator startup time, take up to a second to start.

Megjegyzésem:
Itt nincs arra válasz, mi van, ha az oszcillátort egyszerre indítom a másodpercek beírásával.




(#) fookos válasza gyengus hozzászólására (») Feb 5, 2008 /
 
Gyengus válaszára (hogy egy bytesorba írja ki mindig az időt) és a MAXIM válaszára reagálva, azt kell hogy mondjam, hogy mind a 6 byte egyszeri kiírása sajnos pontatlansághoz vezethet.

Hiszen a másodpercek felülírásakor a mögötte lévő számlálósor is nullázódik, ami azt jelenti, hogy hiába csak mondjuk a perceket/órákat/napot/hónapot/évet szeretné valaki állítani, a másodpercek is újra fognak íródni. Lehet, hogy 9,9999s -kor ír az ember 9s -t a DS1307-be (ami 9,00000)-nak felel meg. Ha ezt valaki gyakran teszi, gyorsan összejöhet 5-10 másodperces késés (amit tapasztaltam is).
(#) gyengus válasza fookos hozzászólására (») Feb 5, 2008 /
 
Félreértettél:
nem a 6bájtot írom egyszerre. Vagy az idő bájtjait v a dátuméit állítom. Az időt meg gépről kapja, nem lehet manuálisan állítani.
(#) MPi-c válasza fookos hozzászólására (») Feb 6, 2008 /
 
Sziasztok!
A DS32-öt rákötöttem az RTC elemére, így az is kap táplálást "vész" esetén. Vagy teszel mellé kvarcot, vagy nem, ahogy az adatlapjában van.

Idézet:
„Megjegyzésem:
Itt nincs arra válasz, mi van, ha az oszcillátort egyszerre indítom a másodpercek beírásával.”


Hogy, hogy mi van? Kezdelek nem érteni... Miért kellene az oszcillátort elindítani, vagy megállítani.
A regiszterek írása-olvasása egy pufferen keresztül történik. Sehol nem írnak olyat, hogy beállításhoz az oszcillátort meg kell állítani.

Idézet:
„Hiszen a másodpercek felülírásakor a mögötte lévő számlálósor is nullázódik, ami azt jelenti, hogy hiába csak mondjuk a perceket/órákat/napot/hónapot/évet szeretné valaki állítani, a másodpercek is újra fognak íródni.”

Hát ezt honnan vetted? Mint ahogy írod a másodperc regiszter írása reszeteli a számláló láncot. De csak az! Miért kellene az összes regiszter végig írni, ha változtani akarsz. Megcímzed a kiválaszott regisztert és beírod, ettől még a másodperc (és az az "utáni" - elérhetetlen - rész) nem nullázódik. Az adatlap szerint egy kitétel van, ne legyen egy másodpercnél hosszabb az idő és dátum regiszterek beírása.
(#) MPi-c válasza potyo hozzászólására (») Feb 6, 2008 / 1
 
Köszönöm potyo a kérdésedet, de elég nagy vagyok már ahhoz, hogy eldöntsem, a kapacsolásomat egy vagy két oldalas NYÁK-ra építem-e meg. Persze, azt is megkérdezhetted volna, hogy minek ez az óra? ... Tényleg, minek?... Szép napot mindenkinek!
(#) fookos válasza MPi-c hozzászólására (») Feb 6, 2008 /
 
Az "oszcillátort egyszerre indítom a másodpercek beírásával" csak mint elméleti esetet vetettem fel. Gykorlati jelentősége nincs. (Csak ha már ennyire kiveséztük ezt a szerencsétlen DS1307-et, akkor legyen ez is megemlítve).

Pontosabban arra gondoltam, hogy friss indításkor az oszcillátor ugye nem megy, mert a 0x00-n nagy valószinűséggel ez áll: b'1xxxxxxx'. Vagyis ?? másdoperc, és az oszci nem megy. Most beleírsz egy értéket (valószinűleg b'00000000'-t). Ekkor egyszerre nulláztad a számlálóláncot és indítottad az oszcillátort.

De mint mondtam ennek az esetnek tényleg semmi de semmi gyakorlati jelentősége.

(#) fookos válasza MPi-c hozzászólására (») Feb 6, 2008 /
 
Találtam egy német oldalt a kvarcok pontosságáról és a kalibrálásukról (Messtechnik: Frequenz)

Itt van egy táblázat a kvarcok pontosságáról, amit ppm-ben mérnek (A part per million /milliomod rész/ angol rövidítése Kis mennyiségű összetevők mértékegységeként használják).

Itt a táblázat magyarítva:

Típus / Hiba (25°C) / Megfelel / Hiba (20Mhz-nál) / Hőhiba / Öregedés évente
Grundtton Standardkvarc / 30 ppm / 16 Perc/év / 600 Hz / 30 ppm (-10..70°C) / 5 ppm
Oberton Standardkvarc / 50 ppm / 26 Perc/év / 1 kH / 50 ppm (-40..85°C) / 5 ppm
Kvarcoszillátor Typ A / 25 ppm / 13 Perc/év 500 Hz / - / 5 ppm
Kvarcoszillátor Typ C / 100 ppm / 53 Perc/év / 2 kH - / 5 ppm
Órakvarc (32,768 kHz) / 20 ppm / 10 Perc/év / 400 Hz / -0,034ppm/°C2 / 3 ppm
Műszerkvarc / 3 ppm / 1,5 Perc/év / 60 Hz / -0,034ppm/°C2 5 ppm

Valahol egyébként láttam is 10 ppm-es órakvarcot 30 Ft-os áron a ChipCad-nál a Ricoh termékek között. Avval 5 perc/év érhető el.
(#) MPi-c válasza fookos hozzászólására (») Feb 6, 2008 /
 
Idézet:
„Pontosabban arra gondoltam, hogy friss indításkor az oszcillátor ugye nem megy...”


Szerintem meg megy. Nem kell semmit beírni az induláshoz, ráadom a tápfeszt és azonnal kezdi a számlálást. Minden regiszter alapról indul: s:00, m:00, h:00, day: 1, date: 1, month : 1, year: 00 . Ezért nem értem, miért kérdés ez.
(#) fookos válasza fookos hozzászólására (») Feb 6, 2008 /
 
Másik lehetőség a pontosság javítására, ha magasabb frekvenciájú kvarcot használunk.

32,768 kHz kvarcal ami 10 PPM-es 1 Hz-nél a hiba (mind a frekit, mind a hibát osztjuk 32768-al) 0.000305175781250 PPM.

Ha 4,194304 MHz-s kvarcot használunk ami mondjuk kommersz 30 PPM-es és ebből állítjuk elő az 1 Hz-t, akkor ( a hibát is 4194304-al osztva) 0.0000071525573730468750 PPM-etkapunk.

A két hibaérték hányadosa: 42,66

Vagyis 42,66-szor pontosabblesz az óránk egy 4,194304MHz/30PPM-es kvarcal mint egy 32,768kHz/10PPM-es kvarcal.

Már csak az a kérdés, hogy egy ilyen oszcillátort hogyan kössek az RTC-hez, hogy az áram kimaradása esetén az a saját 32,768 kHz-s kvarcáról járjon tovább.
Következő: »»   2 / 7
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem