Picproje Elektronik Sitesi

DERLEYİCİLER => MikroC - PIC => MikroC ARM => Konuyu başlatan: Karamel - 07 Ağustos 2015, 17:36:09

Başlık: mikroc internal rtc kullanimi
Gönderen: Karamel - 07 Ağustos 2015, 17:36:09
merhaba. bu gun stm32f103vet6 microcontroller im la internal rtc deneyi yapmayi planladim. hazir example lari alip calistirmaktan ziyade. register seviyesinde isi anlayarak yapayim dedim. bunuda kendi kendime degilde. burada yapayim. hem kendim geliseyim. hemde message imi okuyan benim duzeyde ogrenci kisiler icin isik olsun.

daha hicbirsey yapmadim. reference manual i actim. message i yazdiktan sonra okuyup. anlayip. uygulamaya calisacagim. ::)
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: tekosis - 07 Ağustos 2015, 17:48:34
bu araştırmaları yaparken hangi kaynaklardan faydalanıyorsun? sadece datasheet ve reference manual mi? başka kaynaklara da başvuruyor musun?
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 07 Ağustos 2015, 18:10:38
hocam merhaba. suan reference manual i okuyorum. anlamadigim bir yer olursa size soracagim yada internetten arasitirma yapacagim.

18.1 RTC introduction
The real-time clock is an independent timer. The RTC provides a set of continuously running
counters which can be used, with suitable software, to provide a clock-calendar function.
The counter values can be written to set the current time/date of the system.
The RTC core and clock configuration (RCC_BDCR register) are in the Backup domain,
which means that RTC setting and time are kept after reset or wakeup from Standby mode.
After reset, access to the Backup registers and RTC is disabled and the Backup domain
(BKP) is protected against possible parasitic write access. To enable access to the Backup
registers and the RTC, proceed as follows:
• enable the power and backup interface clocks by setting the PWREN and BKPEN bits
in the RCC_APB1ENR register
• set the DBP bit the Power Control Register (PWR_CR) to enable access to the Backup
registers and RTC.

simdi bruada diyor ki. real time clock birimi devamli calisan. zaman degerleri system tarafindan yazilabilen bir birim. en basta RCC_BDCR registerin dan rtc birimimize clock vermemiz lazim. anladigim kadariyla her wake up veya reset ten sonra rtc settings kismi guvenlik icin kilitleniyor. boylece icersindeki degerleri bozma sansimiz olmuyor. bunu BKB biti ile yapiyor. bunu okuyup ne oldugunu anlayacagiz.

daha sonra RCC_APB1ENR registerindaki PWREN ve BKEN bitleri ile systeme power verecegiz.

backup ve rtc registerlarina erismek icin PWR_CR registerindaki DBP bitini set yapacagiz. bunu tam anlamadim ama problem yok. ileride muhakkak anlariz.

mesaj birleştirme:: 07 Ağustos 2015, 18:15:52

18.2 RTC main features
• Programmable prescaler: division factor up to 220
• 32-bit programmable counter for long-term measurement
• Two separate clocks: PCLK1 for the APB1 interface and RTC clock (must be at least
four times slower than the PCLK1 clock)
• The RTC clock source could be any of the following ones:
– HSE clock divided by 128
– LSE oscillator clock
– LSI oscillator clock (refer to Section 7.2.8: RTC clock for details)
• Two separate reset types:
– The APB1 interface is reset by system reset
– The RTC Core (Prescaler, Alarm, Counter and Divider) is reset only by a Backup
domain reset (see Section 7.1.3: Backup domain reset on page 92).
• Three dedicated maskable interrupt lines:
– Alarm interrupt, for generating a software programmable alarm interrupt.
– Seconds interrupt, for generating a periodic interrupt signal with a programmable
period length (up to 1 second).
– Overflow interrupt, to detect when the internal programmable counter rolls over to
zero.


rtc peripheral block un ozellikleri. system frequence i program ile bolunebiliyormus.
uzun sureleri olcmek icin 32 bit counter lari varmis.

sanirim bu onemli birsey. clock source PCLK1 in en az 4 kere den yavas hali olmasi lazimmis.

biz low speed external clock ile bu isi yapacagiz. yani LSE

geri kalani interruptlardan alarmlardan ve birazda onceki bahsettigimiz seyleri anlatiyor.

mesaj birleştirme:: 07 Ağustos 2015, 18:24:19

18.3.4 Configuring RTC registers
To write in the RTC_PRL, RTC_CNT, RTC_ALR registers, the peripheral must enter
Configuration Mode. This is done by setting the CNF bit in the RTC_CRL register.
In addition, writing to any RTC register is only enabled if the previous write operation is
finished. To enable the software to detect this situation, the RTOFF status bit is provided in
the RTC_CR register to indicate that an update of the registers is in progress. A new value
can be written to the RTC registers only when the RTOFF status bit value is '1'.

ara kisimlari okudum. sanirim bu kisim biraz onemli.

yukarida yazan registerlara girince rtc peripheral unit configuration mode a girmis olarak algiliyor. bunuda bitiren sey  RTC_CRL registerinin CNF biti oluyormus. ayrica herhangibir rtc islemi yapmak icin onceki configuration islemininbitmesi beklenmek zorunluymus. RTC_CR registerindaki RTOFF status biti register larin update durumunu bize bildiriyormus. bu bit 1 oldugunda anca yeni bir deger yazilabilirmis.

mesaj birleştirme:: 07 Ağustos 2015, 18:28:05

Configuration procedure:
1. Poll RTOFF, wait until its value goes to '1'
2. Set the CNF bit to enter configuration mode
3. Write to one or more RTC registers
4. Clear the CNF bit to exit configuration mode
5. Poll RTOFF, wait until its value goes to '1' to check the end of the write operation.
The write operation only executes when the CNF bit is cleared; it takes at least three
RTCCLK cycles to complete.

en basta bakacagiz. bu bit logic 1 ise configuration a baslayacagiz. yoksa bu bitin logic 1 olmasini bekleyecegiz yada beklemeyip. daha sonra configure edecegiz.

islemlerin sonunda RTOFF bitinin logic 1 olmasini bekleyin diyor ama ya olmazsa? microcontroller sonsuza dek ayni yerde takilabilir? bu durum CLR hocamin i2c peripheral unit te anlattigi konuya benzeyebilir  :-\

mesaj birleştirme:: 07 Ağustos 2015, 18:29:07

RTC_CRH registerinda alarm ve interrupts var. biz bunlarla ilgilenmeyecegiz.

mesaj birleştirme:: 07 Ağustos 2015, 18:36:41

RTC_PRLL registeri i bizim icin onemli. eger girif clock umuz 32768 khz frequence inda ise buraya 0x7FFF degerini yazmamiz gerekiyormus.

mesaj birleştirme:: 07 Ağustos 2015, 19:40:24

simdi code larimi yazdim.

      RCC_APB1ENR.BKPEN = 1;
      RCC_APB1ENR.PWREN = 1;

      PWR_CR.DBP = 1;       
      RCC_BDCR.RTCSEL0 = 1;
      RCC_BDCR.RTCSEL1 = 0; 
      RCC_BDCR.LSEON   = 1;
      RCC_BDCR.RTCEN   = 1;
      PWR_CR.DBP = 0;     

      while(RCC_BDCR.LSERDY == 0);


LSE clock input um hic bir zaman stable olmuyor. eger LSE yi kapatirsak 6 kez clock geldikten sonra logic 0 oluyormus ama bizimkisi hic logic 1 olmuyor
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 07 Ağustos 2015, 21:35:05
LSI i kullanincada olmuyor. ben birseyleri yanlis yapiyorum.

      RCC_APB1ENR.BKPEN = 1;
      RCC_APB1ENR.PWREN = 1;

      PWR_CR.DBP = 1;       
      RCC_BDCR.RTCSEL0 = 0;
      RCC_BDCR.RTCSEL1 = 1; 
      RCC_BDCR.LSEON   = 1;
      RCC_BDCR.RTCEN   = 1;
      PWR_CR.DBP = 0;     

      while(RCC_BDCR.LSIRDY == 0);


mesaj birleştirme:: 07 Ağustos 2015, 21:35:37

program while da cakili kaliyor. bunun olmamasi gerekli.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: LukeSkywalker - 07 Ağustos 2015, 21:51:15
Şöyle dene:

RCC_CSR.LSION=1;//LSI osilatör aktif.
RCC_CSR.LSIRDY=0;
while(RCC_CSR.LSIRDY==0);//LSI osilatör hazır.

RCC_APB1ENR.PWREN=1;// Power interface clock aktif
RCC_APB1ENR.BKPEN=1;// Backup interface clock aktif
PWR_CR.DBP=1; //Registerlara erişim izni verildi.
RCC_BDCR.B9=1; //Clock seçimi  (LSI 40KHz)
RCC_BDCR.B8=0;
RCC_BDCR.RTCEN=1; //RTC aktif
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 07 Ağustos 2015, 21:58:54
hocam simdi program cakilmadan while i geciyor. tabiki daha rtc yi okumuyorum. artiyormu artmiyormu bilmiyorum ama biz simdi ne yaptik? benim yaptiklarim neden calismadilar?  :-\

mesaj birleştirme:: 07 Ağustos 2015, 23:22:25

hocam sorumu daha sonra cevaplayacaktir. biz konumuza geri donelim.

      RCC_CSR.LSION = 1;                                  //LSE osilatör aktif.
      RCC_CSR.LSIRDY = 0;
      while(RCC_CSR.LSIRDY == 0);                         //LSI osilatör hazır.

      RCC_APB1ENR.PWREN = 1;                              // Power interface clock aktif
      RCC_APB1ENR.BKPEN = 1;                              // Backup interface clock aktif
      PWR_CR.DBP = 1;                                     //Registerlara erişim izni verildi.
      RCC_BDCR.B9 = 1;                                    //Clock seçimi  (LSI 40KHz)
      RCC_BDCR.B8 = 0;
      RCC_BDCR.RTCEN = 1;                                 //RTC aktif


      while (RTC_CRL.RTOFF == 0);                                 // we are waiting in loby of picproje :P
      RTC_CRL.CNF = 1;                                  // Configmode on
      RTC_PRLL = 0x7FFF;                                 // RTC-clock-prescaler 32,768khz
      RTC_CRL.CNF = 0;                                 // Configmode off


yukarida LukeSkyWalker hocamin soyledigi osc settings code u asiliyor. while da takilmiyoruz. bunun nedenini bulmak gerekli. daha sonra code u muza rtc peripheral unit in frequence ini ayarlayan birsey ekledim. daha sonra main icersinde RTC_CNTL ve RTC_CNTH registerlarini okudum. registerlar degismiyor. yani saat saymiyor.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: LukeSkywalker - 08 Ağustos 2015, 09:05:22
Senin verdiğin kodda LSE aktif edilmişti, LSI osilatörü aktif eden bir kod parçası yoktu.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 08 Ağustos 2015, 09:08:31
hocam gunaydin ::) code lari boyle degistirincede LSERDY e takilmiyor. sanirim siralamalari onemliydi?  :-\

RCC_CSR.LSEON=1;//LSI osilatör aktif.
RCC_CSR.LSERDY=0;
while(RCC_CSR.LSERDY==0);//LSI osilatör hazır.

RCC_APB1ENR.PWREN=1;// Power interface clock aktif
RCC_APB1ENR.BKPEN=1;// Backup interface clock aktif
PWR_CR.DBP=1; //Registerlara erişim izni verildi.
RCC_BDCR.B9=0; //Clock seçimi  (LSI 40KHz)
RCC_BDCR.B8=1;
RCC_BDCR.RTCEN=1; //RTC aktif


mesaj birleştirme:: 08 Ağustos 2015, 09:11:02

hocam benim code lari LSE ve LSI yi test ederek denemistim. yani ikisindede while i gecememistik  :-\
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: LukeSkywalker - 08 Ağustos 2015, 09:32:32
Bir de ready baştan sıfırlamamıştın. O da önemli. En mantıklısı osilatörü hazırladıktan sonra hemen test etmek.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 08 Ağustos 2015, 10:51:03
anladim hocam. neyse o konuyu yeniden arastirmak gerekli. konuyu tamamladiktan sonra bu konuyu yeniden reference manual dan okuyayim.

simdi rtc peripheral unit imiz calisiyor. RTC_CNTL registerimiz sayiyor. Oncelikle init code larimizi yeniden iceleyelim.

      // bu kisim LukeSkyWalker hocamizin code lari yukarida gerekli aciklamalari yaptik. yukaridaki aciklamalardan tek farki. LSE clock source unu kullandik.
      RCC_CSR.LSEON = 1;                                  //LSE osilatör aktif.
      RCC_CSR.LSERDY = 0;
      while(RCC_CSR.LSERDY == 0);                         //LSI osilatör hazır.

      RCC_APB1ENR.PWREN = 1;                              // Power interface clock aktif
      RCC_APB1ENR.BKPEN = 1;                              // Backup interface clock aktif
      PWR_CR.DBP = 1;                                     //Registerlara erişim izni verildi.
      RCC_BDCR.B9 = 0;                                    //Clock seçimi  (LSI 40KHz)
      RCC_BDCR.B8 = 1;
      RCC_BDCR.RTCEN = 1;                                 //RTC aktif

      // bu kisimda rtc unit imizi config edecegiz. preload registeri ina 32.768 khz lik degerimizi yukleyecegiz.
      while (RTC_CRL.RTOFF == 0);    //
      RTC_CRL.CNF = 1;             // Configmode on
      RTC_PRLL = 0x7FFF;          // RTC-clock-prescaler
      RTC_CRL.CNF = 0;             // Configmode off
      while (RTC_CRL.RTOFF == 0);


main codelarimiz icersinde while(1) ile code larimizi infinte loop seklinde yapacagiz.

RTC_CNTL ve RTC_CNTH registerlari bizim counter registerlarimiz. anladigim kadariyla tarih high olanindan alinacak? neyse simdilik bunu dusunmeyelim. meseleyi anlamaya calisalim.  RTC_CNTL registeri her 1 sn de bir kere artan bir register. yani icersi 1 sn once atiyorum 0x0001 iken. 1 sn sonra 0x0002 oluyor. durum boylede gidiyor. yanlis hatirlamiyorsam kisin justice for all hocam stm32f407 microcontrollerin rtc uniti ile calisiyordu. hocama yardim edebilmek icin. bende stm32f407 microcontrollerin reference manual ini okumustum. onun rtc unit i hours, minutes, seconds vs degerleri ayri ayri sakliyordu? yada birazcicik daha farkliydi. her 60 sn 60 dk 24 saatte bir registerlar degisiyordu?

stm32f103 microcontrollerinda durum ne yazik ki boyle değil? sadece bir counter registerimiz var. ve bu surekli artiyor. biz buna mod 60 alarak minutes, seconds, hours gibi bilgileri ediniyoruz.


time bizim ranimladigimiz bir unsigned long. once counter value degerini bu variable in icersine aliyoruz.

daha sonra mod 60 yapip. second degerini aliyoruz. hemen ardindan bunu pc ye gonderebilmek icin 2 parcaya ayirip pc ye gonderime hazirliyoruz.

ayni seyleri minutes ve hours icin yapiyoruz. en sonunra uart4 ten saat2 saat1 : dakika2 dakika1 : saniye2 saniye1 (bosluk) (bosluk) ( bosluk) seklinde gonderip. yaklasik 1 sn kadar bkleyip. degerimizi yeniden okuyoruz ve bilgisayara gonderiyoruz.


      while(1)
      {
          time = RTC_CNTL;                  // counterimizin value degerini aliyoruz.

          a = (time % 60);                   // seconds degerini alip asci moduna ceviriyoruz.
         
          sn2 = (a / 10) + 48;
          sn1 = (a % 10) + 48;
         
          a = ((time/60) % 60);          // minutes degerini alip asci moduna ceviriyoruz.
         
          dk2 = (a / 10) + 48;
          dk1 = (a % 10) + 48;
         
          a = ((time/60/60) % 60);   // hours degerini alip asci moduna ceviriyoruz.

          ss2 = (a / 10) + 48;
          ss1 = (a % 10) + 48;
         
          //uart4 ile bu bilgileri pc ye gonder
          UART4_Write(ss2); UART4_Write(ss1); UART4_Write(':');
          UART4_Write(dk2); UART4_Write(dk1); UART4_Write(':');
          UART4_Write(sn2); UART4_Write(sn1); UART4_Write(' '); UART4_Write(' '); UART4_Write(' ');
          Delay_ms(960);
      }




simdi system i calistirmayi basardik. suan anlamadigim iki sorun var.

-tahminimce saniye gercek 1 sn de artmiyor. bunun nedeni prescaler degerlerini tutturamamis olabilirim. simdi bunu arastiriyorum.
-daha onemlisi. vbat pinine CR2032 battery bagladim. energy i kapattip atiyorum 5 dk bekleyip. yeniden energy verdikten sonra saat kaldigi yerden devam ediyor. mesela soyle


00:12:21

...
5 dk gecti
...

00:12:22



halbuki boyle olmasi gerekli.

00:12:21

...
5 dk gecti
...

00:17:22

bu neden oluyor bunu ogrenmek gerekli.

mesaj birleştirme:: 08 Ağustos 2015, 12:44:40

suan birsey daha farkettim.

rtc unit i LSE clock source ile calistirmaya calisinca. while (RTC_CRL.RTOFF == 0); code satirinda program takiliyor. ama onceden LSI ile acip. daha sonra LSE a gecince. takilmiyor. yani geciyormuyuz orasinida tam olarak bilemedim. eger su code lari yukleyip. energy yi kesip. yeniden verince

      RCC_CSR.LSEON = 1;                                  //LSE osilatör aktif.
      RCC_CSR.LSERDY = 0;
      while(RCC_CSR.LSERDY == 0);                         //LSI osilatör hazır.

      RCC_APB1ENR.PWREN = 1;                              // Power interface clock aktif
      RCC_APB1ENR.BKPEN = 1;                              // Backup interface clock aktif
      PWR_CR.DBP = 1;                                     //Registerlara erişim izni verildi.
      RCC_BDCR.B9 = 0;                                    //Clock seçimi  (LSI 40KHz)
      RCC_BDCR.B8 = 1;
      RCC_BDCR.RTCEN = 1;                                 //RTC aktif

      // bu kisimda rtc unit imizi config edecegiz. preload registeri ina 32.768 khz lik degerimizi yukleyecegiz.
      while (RTC_CRL.RTOFF == 0);    //
      RTC_CRL.CNF = 1;             // Configmode on
      RTC_PRLL = 0x7FFF;          // RTC-clock-prescaler
      RTC_CRL.CNF = 0;             // Configmode off
      while (RTC_CRL.RTOFF == 0);

bolt yaptigim yerde takiliyoruz. anladigim kadariyla rtc unit i duzgun calistiramiyoruz.

ama boyle yapinca soun olmuyor. sonradan LSE ye gecip gecemedigimizi de suan anlayamadim.
     

      RCC_CSR.LSION=1;//LSI osilatör aktif.
      RCC_CSR.LSIRDY=0;
      while(RCC_CSR.LSIRDY==0);//LSI osilatör hazır.

      RCC_APB1ENR.PWREN=1;// Power interface clock aktif
      RCC_APB1ENR.BKPEN=1;// Backup interface clock aktif
      PWR_CR.DBP=1; //Registerlara erişim izni verildi.
      RCC_BDCR.B9=1; //Clock seçimi  (LSI 40KHz)
      RCC_BDCR.B8=0;
      RCC_BDCR.RTCEN=1; //RTC aktif

      RCC_CSR.LSION = 0; 
      RCC_CSR.LSEON = 1;                                  //LSE osilatör aktif.
      RCC_CSR.LSERDY = 0;
      while(RCC_CSR.LSERDY == 0);                         //LSI osilatör hazır.

      RCC_APB1ENR.PWREN = 1;                              // Power interface clock aktif
      RCC_APB1ENR.BKPEN = 1;                              // Backup interface clock aktif
      PWR_CR.DBP = 1;                                     //Registerlara erişim izni verildi.
      RCC_BDCR.B9 = 0;                                    //Clock seçimi  (LSI 40KHz)
      RCC_BDCR.B8 = 1;
      RCC_BDCR.RTCEN = 1;                                 //RTC aktif

      // bu kisimda rtc unit imizi config edecegiz. preload registeri ina 32.768 khz lik degerimizi yukleyecegiz.
      while (RTC_CRL.RTOFF == 0);    //
      RTC_CRL.CNF = 1;             // Configmode on
      RTC_PRLL = 0x7FFF;          // RTC-clock-prescaler
      RTC_CRL.CNF = 0;             // Configmode off
      while (RTC_CRL.RTOFF == 0);



bu arada internal low speed osc source unu secip. rtc unit prediv e 40 khz lik degerleri girince 8 dk da 20 sn ileri gitti . yani pc saatine referance alarak deney yaptim. fark 8 dk olmasi gerekirken 8 dk 20 sn oldu. geri kalmadi. hizli gitti.

mesaj birleştirme:: 08 Ağustos 2015, 12:55:56

suan baktimda sanirim en son yaptigim code ile systemi LSE source a geciremiyorum. 32768 hertz ten 40000 hertz e zipladigimizi 20 sn icersinde anlayabiliyorum. saat cok ileri gidiyor. simdi soru isaretimiz su. neden LSE osc source ile baslayamiyoruz?
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 08 Ağustos 2015, 14:15:13
yukarida LSE clock source unu actigimi saniyordum ama registerlari karistirmisim. soyle acmak gerekiyor RCC_BDCR.LSEON   = 1; ama LSE yinede calismiyor.

once LSI ile acip. daha sonra LSE ye cevirdim. yine olmadi. sanirim biraz uyumam gerekli.  :-\
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 08 Ağustos 2015, 19:19:36
yeniden calismalarima basladim. oglen pc14 ve pc15(external low speed osc pins) pinlerinin normal calismada osc input olarak secilmemis olabilecegini. bu yuzden external osc secince systemin calismayabilecegini dusundum. daha sonra burada https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy.st.com%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32%20GPIO%20configuration%20for%20LSE%20crystal&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=2301 (https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy.st.com%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32%20GPIO%20configuration%20for%20LSE%20crystal&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=2301) LSE i active yapinca. osc in ve osc out a donustugunu yazmislar. reference manual da bunun tam bilgisine erisemedim(parca parca okumanin zararlari  :P ) simdilik bunu dogru kabul edersek. internette baska example lari inceledim. mesela surada http://read.pudn.com/downloads129/sourcecode/embed/551224/STM32F103-STK/rtc.c__.htm (http://read.pudn.com/downloads129/sourcecode/embed/551224/STM32F103-STK/rtc.c__.htm) sanirim st libraryleri ile example yapmislar. buradan gorebildigim kadari ile eger benim registerlarda sasma yoksa. calismasi gerektigi yonde ama calismiyor. simdi hardware de de sorun olabilir tabiki. nerede ne oldugunu bilmedigimizden. kisilip kaldik. suan systemimizi LSI clock source ile calistirabiliyoruz. en azindan bir adim atabildik.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 08 Ağustos 2015, 23:42:13
sanirim power i kapatip. bir sure bekleyip. yeniden acinca neden rtc nin kaldigi yerden devam ettigini. icersinde saymaya devam etmedigini buldum. LSI osc source vbat moduna girince calismayi guarantee etmiyormus.

7.2.8 RTC clock
The RTCCLK clock source can be either the HSE/128, LSE or LSI clocks. This is selected
by programming the RTCSEL[1:0] bits in the Backup domain control register (RCC_BDCR).
This selection cannot be modified without resetting the Backup domain.
The LSE clock is in the Backup domain, whereas the HSE and LSI clocks are not.
Consequently:
• If LSE is selected as RTC clock:
– The RTC continues to work even if the VDD supply is switched off, provided the
VBAT supply is maintained.
• If LSI is selected as Auto-Wakeup unit (AWU) clock:
– The AWU state is not guaranteed if the VDD supply is powered off. Refer to
Section 7.2.5: LSI clock on page 96 for more details on LSI calibration.
• If the HSE clock divided by 128 is used as the RTC clock:
– The RTC state is not guaranteed if the VDD supply is powered off or if the internal
voltage regulator is powered off (removing power from the 1.8 V domain).
– The DPB bit (disable backup domain write protection) in the Power controller
register must be set to 1 (refer to Section 5.4.1: Power control register
(PWR_CR)).

mesaj birleştirme:: 09 Ağustos 2015, 00:16:24

pc14 ve pc15 e baglanan 32.768 khz crystall imi degistirdim. sonuc yine degismedi. crystall in uclari pc14 ve pc15 e temas ediyor test yaptim.

LSE osc source unu active diyorum. hata nerede anlayamadim? donup dolasip yine ayni seyleri yapmaya basliyorum.

      RCC_APB1ENR.PWREN = 1;                              // Power interface clock aktif
      RCC_APB1ENR.BKPEN = 1;                              // Backup interface clock aktif
      PWR_CR.DBP = 1;                                     //Registerlara erişim izni verildi.
      RCC_BDCR.F9 = 0; RCC_BDCR.F8 = 1;                   //Clock seçimi  (LSE)
      RCC_BDCR.RTCEN = 1;                                 //RTC aktif
      RCC_BDCR.LSEON   = 1;                               //LSE active
      //RCC_BDCR.LSERDY = 0;
      //while(RCC_BDCR.LSERDY == 0);
      // RTC-Register sycned?
      RTC_CRL.RSF = 0;
      //while (RTC_CRL.RSF == 0);

      // Config RTC
      while (RTC_CRL.RTOFF == 0);
      RTC_CRL.CNF = 1;             // Configmode on
      RTC_PRLL = 0x7FFF;          // RTC-clock-prescaler
      //RTC_DIVL  = 0xFD40;
      RTC_CRL.CNF = 0;             // Configmode off
      //while (RTC_CRL.RTOFF == 0);


mesaj birleştirme:: 09 Ağustos 2015, 00:19:29

LSE osc hic stable olmuyor  :-\ yukarida actiktan sonra stable olup olmadigini test eden kismi // seklinde comment haline cevirdim. orada takilip takilmadigini bakmak icin. orada takiliyor.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 09 Ağustos 2015, 11:26:05
az once stm32f103r8t6 ile deney yaptim. sorun microcontrollerda degil. ya code larda. yada crystall de. ayni yerde ikiside takiliyor.  :-\
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 30 Ağustos 2015, 10:40:29
farkli crystall ile stm32f103r8t6 microcontroller uzerinde yukaridaki codelarimizi calistirabildim. yani sorun bizde degil. hardware da imis. birde syle bir yer okudum. www.mikroe.com/forum/viewtopic.php?f=178&t=50635 (http://www.mikroe.com/forum/viewtopic.php?f=178&t=50635)

22pf olunca. ready suresi 30 sn gibi mertebrelere ulasiyormus. bende suan 10 pf olmadigindan. deneyleri capacitorsuz yaptim. suan clock counter i LSE osc ile calistirabildim. cok mutluyum  ::)

mesaj birleştirme:: 30 Ağustos 2015, 10:41:00

simdi ayni deneyleri stm32f103vet6 microcontroller im ile yapacagim.

mesaj birleştirme:: 30 Ağustos 2015, 10:50:19

5 dk dir. usart tan saati gonderip. pc saati ile test ediyorum. saniye 1sn bile kaymadi :) LSI osc source tan sonra ortaya cikan table muhtesem. ::)

simdi stm32f103vet6 da neler olacak. ona bakacagim.

mesaj birleştirme:: 30 Ağustos 2015, 11:08:49

evet. ayni code lar benim stm32f103vet6 da calismiyor. ayni crystall i kullandim. bacaklarini avo meter ile test ettim. calismasi gerekli. neden boyle oluyor?

ben microcontroller i aliexpress ten almistim. acaba china lilar bir cinlik yapmis olmasin? boyle birsey olabilir mi?  :-\

mesaj birleştirme:: 30 Ağustos 2015, 11:22:58

yok. benim bu stm32f103vet6 microcontroller lse osc source u ready yapmamaya and icmis.

ne yaptiysam olmadi.  :-\

ama sorunun bizde olmadigini deney ve gozlemler ile kanitladik. sorun suan icin cok buyuk olasilikla microcontroller da.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 30 Ağustos 2015, 13:14:10
simdi osc configuration i inceliyorum. sanirim ben burada bir hata yaparak. bu microcontrollerinda osc unit ine zarar verdim.

suan HSE calisiyor gibi gorunuyor ama LSE osc source bozulmus gozukuyor.

asagidaki osc configuration larim dogrumu?

(http://i.hizliresim.com/1kponN.png) (http://hizliresim.com/1kponN)
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: LukeSkywalker - 30 Ağustos 2015, 13:27:00
HSI osilatörü kullanıp RTC'yi HSE /128'den çalıştırmayı denedin mi?
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 30 Ağustos 2015, 13:34:47
hocam denediydim. oda calismiyor. ben kesinlikle ya osc source unu bozmusum deney yaparken. yada microcontroller ilk geldigindede boyleydi.

cok dikkat edilmesi gereken bir usus bu. stm32f103 microcontrollerlarin(diger familia lari bilmiyorum. uzerinde deney yapmadim) max. clock frequance indan yukari cikmamak lazim. eger yukari cikilirsa. osc source zarar goruyor.

benim 2 tane stm32f103vet6 microcontrollerim vardi. birisini overclock edince. HSE unit i bozmustum. mesela oda HSE ile calismiyor. HSI ile calisiyor.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 30 Ağustos 2015, 16:05:01
madem internal rtc unit i calistirdim. olaya birazdaha devam edeyim dedim ama isler cok karisti. buradaki http://www.st.com/web/en/resource/technical/document/application_note/CD00207941.pdf (http://www.st.com/web/en/resource/technical/document/application_note/CD00207941.pdf) documentation ini okudum.

RTC_CNTL adinda. bir tanecik counterimiz var. bununla. saat. dakika. tarih. ay. yil. saniye. herseyi elde ediyoruz ama nasil?

bunu surekli bolup. istedigimiz format a gore mode unu filan aliyoruz. hadi saat. dakika. saniye filan kolay da. tarih cok sIkIntIli.

counter 86399 value ya gelince bir gun oluyormus.  sonra date registerlarini update edip.

bu ay 30 gunmu? yoksa 31 gunmu? subat bu sene kac gun geliyor? bigi ilginc seylere bakiyoruz. niye boyle ugrastirici yapmislar ki? rtc entergrelerini incelemistim. datasheetlerinin ilk sayfalarinda. iste su yila kadar subat in kac oldugu icersinde kayitli. aylarin kac gun tuttu filan kayitli diyorlardi.

kisin stm32f407 microcontrollerin rtc unit ine and_justice_for_all hocam icin baktiydim. o daha iyiydi diye hatirliyorum. bu sadece benim microcontroller a mi ozel yoksa. familia yami ozel bilemiyorum ama bence bunu hic guzel yapmamislar.
Başlık: Ynt: mikroc internal rtc kullanimi
Gönderen: Karamel - 31 Ağustos 2015, 22:20:59
buradaki https://www.picproje.org/index.php/topic,60715.msg471189.html#msg471189 (https://www.picproje.org/index.php/topic,60715.msg471189.html#msg471189) data logging isini beceremedim. neden calismadigini anlayamadim.  :-\

ama deneyimide yaptim. vbat ucuna pil baglayip circuit imi 12 saat kadar acik biraktim. 12 saat sonundainternal rtc unitimiz LSE osc source ile 9 dakika 45 sn kaydi. (geri kaldi)

LSE osc source umuza. sadece 32.768khz crystall bagladim. 10 pf lik capacitorlerim olmadigindan. deneyi capacitorsuz yaptim. bunun deneye etki ettigini dusunuyorum ama imkansizliklar yuzundende deneyi yapmamak istemedim. internal rtc unit i sonunda calistirabildigim icin cok mutluyum ::)

mesaj birleştirme:: 31 Ağustos 2015, 22:25:59

yukarida biraz anlam bozuklugu yaratmisim. circuit imi acik biraktim derken. vbat ucuna battery bagladim ve systemin power energy sini kapadim. rtc unit. battery ile kendi kendisine calisti.