stm32f103 rtc unit sorularim

Başlatan Karamel, 01 Eylül 2015, 11:40:47

Karamel

merhaba. surada https://www.picproje.org/index.php/topic,60578.msg471296.html#msg471296 internal rtc unit i calistirinca. birkac adim daha ileriye gitmek istedim.

stm32f103 microcontrollerlarda time ve date i kendimiz hesap ederek buluyoruz. iste day. month. year. day. hour vs gibi registerlar yok. bir tane counter registerimiz 1 sn de bir artiyor. bizde bundan faydalanip. gun saat ay yil vs yi hesaplayarak cikartiyoruz.

simdi su document i http://www.st.com/web/en/resource/technical/document/application_note/CD00167326.pdf
su donucment i http://www.st.com/web/en/resource/technical/document/application_note/CD00207941.pdf
birde refence manual imizin http://www.st.com/web/en/resource/technical/document/reference_manual/CD00171190.pdf rtc kisimlarini okudum.

counter registerimiz 86399 sayisina ulasinca bir gun olustugunu biliyoruz. iste counter bu sayiya ulasinca counter i sifirlayip. day degiskenimizi 1 arttirabiliriz. day degiskenimiz. ilgili ay a gore 28-30-31 i gectiginde. month degikenimizi bir arttirip. day i sifirlayabiliriz. month da 12 yi asinca year a 1 arttiririz filan.

benim anlayamadiklarim sunlar. simdi bu bilgiler backup registerlarinda saklanir diyor document. reference manual dan okudugum kadariyla backup in mesela day diye bir register i yok?

DRx diye registerlari var. (42 tane) ve bu registerlarin icerigi vbat ucuna battery bagli iken kaybolmuyor. acaba tarih bilgilerini bu registerlardan istedigin birisine yaz mi demek istiyor? yani bu 42 register genel amaclarimiz icin kullanalim diyemi yapmislar?

ikinci anlamadigim sey su. eger system yukaridaki gibi ise. rtc nin counter register ini silince backup registerlarda bir degisim olmamasi gerekir? cunku bir ara bu registeri sildigimizde backup register da day diye bir register varsa bunun bir artacagi hakkinda dusuncelere kapildim?

sonuncu sorumda LSE osc source calibration. bunun icin anti_tamp pininden 512 hz bir cikis aliyormusuz? bunu olcup. kayiklik durumunu hesaplayip. rtc calibration registerina bu degeri giriyormusuz? bu kisim i dogru anlamismiyim?

eger dogru anlamissam. bu bana hic mantikli gelmedi. a crystall i x kadar sapar. b crystall i y kadar. hatta iki tane a crystall i arasindada farkliliklar olabilir? eger boyle ise. mesela yapilan her devre icin bunu olcup. hesap etmek. sonrada bunu rtc calibraion registerina program ile update etmek. bana hic mantikli gelmedi?  :-\

Mucit23

Hassas işlerde zaten dahili osilatör kullanılmıyor. Dahili osilatörde öyle kalibrasyon işleriyle uğraşıldığını pek sanmıyorum.

Alıntı YapDRx diye registerlari var. (42 tane) ve bu registerlarin icerigi vbat ucuna battery bagli iken kaybolmuyor. acaba tarih bilgilerini bu registerlardan istedigin birisine yaz mi demek istiyor? yani bu 42 register genel amaclarimiz icin kullanalim diyemi yapmislar?

Evet aynen öyle. Bu registerler genel amaçlı. Pil varsa bilgiler kaybolmaz.

Karamel

Hocam lse osc calibration indan bahsediyor document?  :-\

Ben gecen gun deneyi yaptim. Lse source ile rtc unit 12 saatte. 9 dakika 45 sn kaydi. Tabiki benim 10pf capacitorlerim olmadan ben bu deneyi yapmistim fakat document icersinde 32.768 khz in bir hz bile degismesi. Bir saatte 1-2 sn kadar degisime nedennolur diyor. Yani buradan anlayacagimiz bu calibration isi onemli.  :-\

X-Fi

#3
Karamel merhaba,

F103 işlemcide RTC calendar özelliği yok tek bir saniyelik interrupt üretiyor burada bir register saydırmak ve registerin içeriğini dk,saat,gün,ay,yil olarak modlama işlemini siz yapıyorsunuz.

Backup registerları yeni nesil işlemcilerde aynı zamanda takvim işlemi görevi görüyor, takvim dışında kullanıcıya sunulan saklama alanları bulunuyor. (F103 de takvim yok sadece saklama amaçlı) Bu adreslere yüklenilen veri power on reset yapılmadan kaybolmuyor. Örneğin bir backup registerına 0xDEADBEEF yazıp her açılışta bu registerı kontrol ederek power on reset mi? yoksa NRST pini yoluyla WDT,system v.s. reset mi oluşmuş algılayabilirsin. Buradan power on reset algılamak RTC nin çalışıp çalışmadığını öğrenmek için gerekebiliyor. Çalışmıyorsa baştan kuruluyor çalışıyorsa kurulum atlanıyor. Bunun örneklerine internette karşılaşırsın.

Bir RTC kristali için 10ppm hassasiyetli ise herşey düzgün olsa bile günde +- 0.9sn sapma yapabilir. RTC kalibrasyonu için pin çıkışından bir sinyal almanız gerekli. Bu sinyal frekans bölücüden geçmiş de olabilir geçmemişde. Buna göre hardware kalibrasyon yapman gerekiyor. Sonrasında hassas yük kapasiteleri seçmelisin ve düşük ppm li kristal kullanmalısın Böylece RTC nin doğru çalışmasını sağlayabilirsin.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Mucit23

O kadar kayma yapıyorsa mutlaka kristal yanlış çalışıyordur. Normalde DS1307 gibi entegrelere de 32.768Khz Kristal bağlarız. Aynı şekilde bu sinyal bölünüp 1Hz lik sinyal elde ediliyor.  Bu entegreler de kalibrasyon yapılmıyor. Buna rağmen kabul edilebilir hata sınırları içerisinde çalışıyorlar. Belki STM32F103 içerisindeki RTC donanımı farklıdır.

Eğer gerçekten hassas bir saat yapılmak isteniyorsan kalibrasyon zaten şart olur.

CLR

Karamel,

Stm32'nin rtc'si biraz hassas, mesela 10x serinde 7pf üzeri kapasitör isteyen xtal tavsiye etmiyor ki bizzat denedim sıkıntı çıkarıyor, özellikle RTC start-up'ta.

F103 serisinde herşey saniyeler üzerinden yapılıyor, sadece tarih bilgilerini(gün/ay/yıl) açılışta backup registerlerinden okuyup ram'de tutuyorsun (ilk çalışmada/seferinde backup registerlerine tarihi senin girmen gerekiyor), saat bilgileri ise doğrudan stm32 rtc counter üzerinden hesaplıyorsun. Gün/ay/yıl değişince hem ram'deti saat ve tarihi hemde backup registerlerinini de güncellemen gerekiyor.

Knowledge and Experience are Power

Karamel

#6
Alıntı yapılan: Mucit23 - 01 Eylül 2015, 12:15:47
O kadar kayma yapıyorsa mutlaka kristal yanlış çalışıyordur. Normalde DS1307 gibi entegrelere de 32.768Khz Kristal bağlarız. Aynı şekilde bu sinyal bölünüp 1Hz lik sinyal elde ediliyor.  Bu entegreler de kalibrasyon yapılmıyor. Buna rağmen kabul edilebilir hata sınırları içerisinde çalışıyorlar. Belki STM32F103 içerisindeki RTC donanımı farklıdır.

Eğer gerçekten hassas bir saat yapılmak isteniyorsan kalibrasyon zaten şart olur.

sorunu buldum hocam. http://pdfserv.maximintegrated.com/en/an/AN504.pdf bu document icersinde diyor ki.

The crystal oscillator is one of the most accurate circuits available for providing a fixed frequency. A
32,768Hz crystal is used for most RTCs. By dividing down the output of the oscillator, a 1Hz reference can
be used to update the time and date. The accuracy of the RTC is dependent mainly upon the accuracy of
the crystal. Tuning-fork crystals have a parabolic frequency response across temperature (
Figure 3
). An
error of 23ppm is about 1 minute per month. For further reference, see the
Real-Time Clock Calculator
.
Crystals are tuned to oscillate at the correct frequency under a particular capacitive load. Using a crystal
tuned for a 12.5pF load on an RTC designed to present a 6pF load to the crystal will cause the clock to run
too fast.

capacitorun degisimi frequence i degistiriyormus. ds1307-1302 rtc entegrelerinin capacitorleri iceride. bu yuzden sadece crsytall baglamak yetiyormus. ama benim deney yapabilmem icin elimde 10pf olmadigindan. ben capacitor kullanmadan deneyleri yaptigimdan. bence sorun burada. yani bu denli kaymasinin sebebi bu.

ama! yukarida diyor ki. osc 23 ppm degisirse. 1 ayda 1 dakika system bozulur diyor. yani calibration olursa bence daha guzel olabilir?  :-\

Alıntı yapılan: CLR - 01 Eylül 2015, 12:51:24
Karamel,

Stm32'nin rtc'si biraz hassas, mesela 10x serinde 7pf üzeri kapasitör isteyen xtal tavsiye etmiyor ki bizzat denedim sıkıntı çıkarıyor, özellikle RTC start-up'ta.

F103 serisinde herşey saniyeler üzerinden yapılıyor, sadece tarih bilgilerini(gün/ay/yıl) açılışta backup registerlerinden okuyup ram'de tutuyorsun (ilk çalışmada/seferinde backup registerlerine tarihi senin girmen gerekiyor), saat bilgileri ise doğrudan stm32 rtc counter üzerinden hesaplıyorsun. Gün/ay/yıl değişince hem ram'deti saat ve tarihi hemde backup registerlerinini de güncellemen gerekiyor.



hocam ben stm32f103 un bir board unun schematic ini buldum. st microelectronics in design ettigi bir board. burada 10pf kullanmislar. startup ta ne gibi sorunlar cikiyor hocam?

ben bu capacitorleri 22pf olarak takanlarin LSE osc lerinin ready olma surelerinin 30 sn gibi bir deger oldugunu okumustum. boyle bir sorunmu ki? :-\

mesaj birleştirme:: 01 Eylül 2015, 13:26:41

burada bulmustum hocam.



sanki bir yerdede 5-15 pf arasi crystall e gore secim yapin yaziyordu ama reference manual damiydi. datasheet temiydi hatirlayamadim.

CLR

evet, çok uzun oluyor, clock senkronizasyonunda sıkıntı çıkardığını düşünüyorum. Ben ayrıca rtc alarm kullandığım için onunda etkisi vardı ama ST rtc design pdf'inde direk 7pf olayını yazıyor. Sonrasında 6pf olanlardan kullandım sıkıntı olmadı.
Knowledge and Experience are Power

X-Fi

#8
Kristallerin genelde 50k ya da 100k iç esr değerleri olur bunum yanı sıra 1pf civarında da bir kendi kapasiteleri olur. Bunları üretici kataloğunda bildirir. Kristele paralel direnç bağlanıp esr direnci ile oynayarak yük kapasitesi hesabı yapabilirsiniz. Aşağıdaki linkde hesaplama formülleri verilmiş incelemenizi öneririm.

http://www.st.com/web/en/resource/technical/document/application_note/CD00221665.pdf

Bulabilirsem bilgisayarımda ST nin hazırladığı bir xls hesap tablosu olacaktı onuda yüklemeye çalışırım.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Karamel

#9
Alıntı yapılan: CLR - 01 Eylül 2015, 13:30:08
evet, çok uzun oluyor, clock senkronizasyonunda sıkıntı çıkardığını düşünüyorum. Ben ayrıca rtc alarm kullandığım için onunda etkisi vardı ama ST rtc design pdf'inde direk 7pf olayını yazıyor. Sonrasında 6pf olanlardan kullandım sıkıntı olmadı.

hocam deneyi 10pf ile yaptim. LSE 2 sn gibi bir surede ready oluyor. simdi rtc unit in accuracy testini yapmadim. cunku bu test cok uzun suruyor. 12 saat kadar birsey yapamiyorum. tarih yapmayi deneyecegim simdi. bakalim. basarili olabilcekmiyim.

yalniz benim anlamadigim birsey var. biz while ile LSE osc source un ready olmasini bekliyoruz. diyelim ki kocaman bir system tasarladik. benim mcirocontroller sanirim buyuk isler icin? icersinde butun unit lerden birkac tane var. mesela 4 tane usart unit var. neyse. yine diyelim ki LSE source ta bir sorun var ve hic ready olmayacak? ee tum system bir rtc yunit yuzunden cokecek mi?

ikinci senaryoya bakalim. LSE source un ready olmasini beklemedik. o zaman RTC uniti duzgun baslatamamiz olacagiz?

son senaryo. hadi diyelim while ile ready olmasini beklemeyip. programin en basina 5 sn delay yerlestirdik. ya 5.1 inci sn de lse osc ready olursa?

mesaj birleştirme:: 01 Eylül 2015, 19:36:08

Alıntı yapılan: X-Fi - 01 Eylül 2015, 13:50:50
Kristallerin genelde 50k ya da 100k iç esr değerleri olur bunum yanı sıra 1pf civarında da bir kendi kapasiteleri olur. Bunları üretici kataloğunda bildirir. Kristele paralel direnç bağlanıp esr direnci ile oynayarak yük kapasitesi hesabı yapabilirsiniz. Aşağıdaki linkde hesaplama formülleri verilmiş incelemenizi öneririm.

http://www.st.com/web/en/resource/technical/document/application_note/CD00221665.pdf

Bulabilirsem bilgisayarımda ST nin hazırladığı bir xls hesap tablosu olacaktı onuda yüklemeye çalışırım.

iyi çalışmalar.

hocam link icin tesekkur ederim ::) pdf i bilgisayarima kaydettim. document e baktim ama sanirim bunu tam anlamiyla anlamak icin circuit theory bilmek gerekiyor? equivalent circuit filan cikartilmis. hesaplari filan var ama ben bu hesaplarin nereden geldigini nasil yapildigini anlamadim. formula belli. koy yerine. al cevabi seklinde oluncada egitici olmuyor. o yuzden. bilgisayarima kaydettim. universite 1. siniftan sonra yeniden acip okuyacagim. insallah o zaman anlar duruma gelmis olurum ::)

CLR

Bana göre öyle bir rtc projesi hem kullanılmaz hemde güvenilir olmaz, 5sn'de uzun bir zaman her seferinde max 1-2sn içinde init olmalı.  while içinde timeout kullanabilirsin mesela 3sn içinde(systick ile) while'dan çıkmazsa "RTC init fail" gibi birşey yazdırabilirsin veya ne yapmak istersen.

Bu arada proje notlarıma baktım bir düzeltme yapmalıyım, RTC kapasitörleri CL=7pf derken CL1=CL2=14pf üzerini tavsiye etmiyor, yani 10-12pf kullanılabilir. Bende 12pf'lik kapasitörler kullanmışım(6pf) (CL=CL1*CL2 / CL1+CL2),   
Knowledge and Experience are Power

Karamel

hocam rtc projesi degilde. aklima geldi. mesela bir suru sey yaptiralim. ne yaptigimizin onemi yok ama tum system bir external low speed oscillator yuzunden fail olacaksa. ne anladik bu isten?  :-\ st neden boyle birsey yapmis? yani rtc ve lse unit ler neden bu kadar degisik(kotu demek istemedim)

birde hocam direk backup registerlar uzerinden deneyimi yaptim. gun. ay ve yil yaptirdim. ::)

bu arada hocam. bir gun 86399 da olusuyor. document icersinde bu sayiyi asinca rtc counter i sifirlayin diyor ama bence burada hata var. nedenide su.

mesela 2 gun gecti? 2*86399.  ve bizim circuit imiz vbat ile calisti bu surede. hic code islemedi.

simdi eger circuit calissaydi. bu dogruydu. surekli bir test islemi var. eger 86399 rakami asilmissa. tamam bir gun asilmis ama biz circuit kapali vbat ile calisirken. bu testi yapamiyoruz. 2 gun geciyor. sonra circuit aciliyor.

o sadece 1 gun asilmismi diye bakiyor. 2 gun yada daha fazla zaman asilmismi bilmiyor. time testleri yapinca. hop. counter i sifirliyor. hem saati bozuyor hemde tarihi.

ben soyle bir cozum yolu buldum bu is icin.
while(time > 86399){
            time = time - 86399; RTC_CNTL = time & 0x0000FFFF; RTC_CNTH = (time & 0xFFFF0000) >> 16;
            BKP_DR1++;
            Date_Test();
          }


eger bir gunden fazla value olusmussa. bizim counter dan gun cikartip. day registerini 1 arttirip. date test e gonderdim. yani mesela gun 32 ye ulasmissa. gun u 1 yap. ay i 1 arttir. gibi.


bunun deneyini yapmadim. cunku 2 gun circuit i vbat ile calistirip beklemek gerekli ama theory im. tutar gibi gozukuyor?  :-\

CLR

#12
ST'nin notları arasında F10x ile calendar projesi var bu bahsettiklerinin hepsinin çözümü var orada. 86399'dan sonra sıfırlamak zorunda değilsin, istersen counter 32bit olduğundan 130-140 yıla kadar saydırabilirsin herşeyi saniye üzerinden de yapabilirsin.

Ekleme: artık yılları hesaba katarak tabii
Knowledge and Experience are Power

Karamel

Alıntı yapılan: Mucit23 - 01 Eylül 2015, 12:15:47
O kadar kayma yapıyorsa mutlaka kristal yanlış çalışıyordur. Normalde DS1307 gibi entegrelere de 32.768Khz Kristal bağlarız. Aynı şekilde bu sinyal bölünüp 1Hz lik sinyal elde ediliyor.  Bu entegreler de kalibrasyon yapılmıyor. Buna rağmen kabul edilebilir hata sınırları içerisinde çalışıyorlar. Belki STM32F103 içerisindeki RTC donanımı farklıdır.

Eğer gerçekten hassas bir saat yapılmak isteniyorsan kalibrasyon zaten şart olur.

mucit hocam 10 pf capacitor leri de takip. gerekli olcumleri yaptim. 3 saat calistirdim. saniye bile kaymadi. kayma sorununun sebebi ds1307 document te yazdigi gibi. stm32f103 microcontroller ile deney yaptigimdan. bu microcontroller lar icin 10pf iyi bir deger gibi.

Alıntı yapılan: CLR - 01 Eylül 2015, 20:55:22
ST'nin notları arasında F10x ile calendar projesi var bu bahsettiklerinin hepsinin çözümü var orada. 86399'dan sonra sıfırlamak zorunda değilsin, istersen counter 32bit olduğundan 130-140 yıla kadar saydırabilirsin herşeyi saniye üzerinden de yapabilirsin.

Ekleme: artık yılları hesaba katarak tabii

anladim hocam. hocam amacim urun yapmak degil. deney yapmak oldugundan. birde ben st library lerinden anlamadigimdan. refrence manual ve diger document ler uzerinden gitmistim.

sadece anlamadigimiz konu LSE source neden boyle sorunlu bir sekilde ready oluyor. bu tum systemin calismasini etkileyebilir. st neden bunu boyle yapmis? yada biz beceremiyor olabiliriz tabiki? bu konuyu research etmek lazim.

z

Scopla xtal uçlarını gözledinmi? Osilasyon hemen başlıyormu başlamıyormu baktınmı?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com