STM32F10X Çalışmalarım

Başlatan Mucit23, 12 Mart 2012, 11:17:48

Klein

#225
Yıl = ((Gün) - ((Gün/1461)+1) / 365

Not: 1461 4 yıldaki gün sayısı. Buradan o zaman kadar kaç artık yıl olduğunu hesaplıyoruz.


mesaj birleştirme:: 31 Ağustos 2013, 21:35:32

Yılın günü =Gün-  (((yıl +1) *365) + Artık yıl sayısı);

Gerisi basit gün -ay hesaplamaları.

mesaj birleştirme:: 31 Ağustos 2013, 21:40:56

Saati kurarken  önce günü bulacağız.

Gün = ylın günü + ( (yıl * 365)+ artık yıl sayısı)

Counter = (Gün * 86400) + (saat * 3600) + (dakika * 60) + saniye;

Mucit23

Hocam Teşekkürler bayağı bi açıklayıcı oldu.
Bazı parametreleri anlamadım. 
Yılın Günü ve Artık yıl sayısı parametreleri nedir. İçeriği nasil değişiyor?

Aklıma takılan birkaç nokta daha var. Rtc saniye kesmesinde saat 23:59:59 u geçtiği anda counteri sıfırlamaya gerek varmıdır? Bu işlem nasıl olacak?


Klein

artık yıl  sayısı  = ((Gün/1461)+1) / 365;
Bu kadar işlemi , counter'i sıfırlamayalım diye yapıyoruz.

Mucit23

Anladım hocam deneyeyim anlattıklarınızı. Adam akıllı bir rtc kütüphanesi olusturmam lazım

Mucit23

#229
Hocam Bazı sıkıntılar var adım adım gitmem gerekiyor.

Saat, Dakika ve Saniyede sıkıntı yok.

Bulmam gereken Parametreler şunlar.

Ayın Günü (1-31 arası değer alacak)
Haftanın günü (1-7 arası değer alacak. pztesi salı vs..)
Ay(1-12 arası değer alacak)
ve yıl değeri

Counter/86400 yaparak 0-6 arası değer alıyorum. Demekki Bu Haftanın günü oluyor. O halde Ayın gününü nasıl bulacağım? Böyle bir sonuca varınca herşey karıştı açıkçası. Bu işi adım adım yapmam gerekiyor

Counterdeki artış sırası nasıl oluyor bunuda anlamak lazım.

Örneğin saat 23:59:59 u aştığı anda gördüğüm kadarıyla Haftanın günü artıyor. Bundan sonra nasıl bir sıralama var?

Amacım stm32f4 rtc kütüphanesindeki gibi bir yapı oluşturmak

  RTC_DateStructure.RTC_Year = 0x13;
  RTC_DateStructure.RTC_Month = RTC_Month_January;
  RTC_DateStructure.RTC_Date = 0x11;
  RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Saturday;
  RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure);
  
  /* Set the time to 05h 20mn 00s AM */
  RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
  RTC_TimeStructure.RTC_Hours   = 0x05;
  RTC_TimeStructure.RTC_Minutes = 0x20;
  RTC_TimeStructure.RTC_Seconds = 0x00; 
  
  RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); 

Klein

counter/86400 yapınca 0...6 arası değer almazsın. 0...n değer alırsın. bu sana Counter başladığından beri kaç gün geçtiğini verir.
kalan kısmını da yukarıda yazdım zaten. tekrar oku.

Mucit23

Haklısınız Hocam. Orada bir işlem hatası yapmışım. Normalde 0 ile n arası bir değer alıyor. Yani Diyelim günü 31'e set ettiğimde saat 23:59:59 u aştığı anda gün 32 oluyor. Sürekli Artıyor.

verdiğiniz hesapları daha uygulayamadım. Akşam uğraşacağım. Sadece AY hesaplamayı anlayamadım. Biz gün bilgisinden giderekmi ayı hesaplayacağız. En karışık olanı ay herhalde çünkü sürekli aydaki gün sayısı değişiyor. 4 yılda bir şubatın 28 çekmeside var. Bunlar hepsini ayırt edebilirmiyiz?

Birde şöyle bir sorun var. Deney bordunda çalışıyorum stm32  usb den besleniyor. Program açılırken ilk başta saati ayarladığımda saat donuyor. Resetlesem bile saat çalışmaya devam etmiyor. Ancak usb den enerjiyi kesip  tekrar vermemle ayarladığım yeni değerle birlikte saat çalışmaya başlıyor. Sürekli usb yi tak çıkar yaparsam bilgisayarın usb portu bozulacak. Bu neden kaynaklanır?

Klein

STM32 RTC ile hiç uğraşmadım.Sorun hakkında hiç fikrim yok.
Ay hesaplaması üzerine biaz çalışayım.

Mucit23

Hocam ben rtc den biraz soğudum açıkçası. Saat neysede tarih hesaplamanın bu denli karmaşık olduğunu pek sanmıyordum. Ds1307 gibi i2c ile çalışan bir rtc kullanmayı düşünüyorum. Benim için uğraşacaksanız hiç uğraşmayın. Vaktinize Yazık

X-Fi

Hocam M3 core için rtc kullanımını aşağıdaki şekilde yapıyorum, istediğim bir harihin haftanın hangi gününe geldiğini hesaplama fonksiyonuda kodlara dahil belki yardımı dokunur iyi çalışmalar.

const uint8_t  Week_Day_List[12]  = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; 
RTC_TimeTypeDef RTC_TimeStructure;	
RTC_DateTypeDef RTC_DateStructure;	
RTC_AlarmTypeDef  RTC_AlarmStructure;

/****************************************************************************************************/
// timeStamp Oku 
void Date_Load(uint32_t *  reg)
{
	
	
				RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
				RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);  
	
				*reg= RTC_TimeStructure.RTC_Minutes;
				*reg|= RTC_TimeStructure.RTC_Hours<<8;
				*reg|=(((RTC_DateStructure.RTC_Year&0x07)<<5)+RTC_DateStructure.RTC_Date)<<16;
				*reg|=(((RTC_DateStructure.RTC_Year&0xF8)<<1)+RTC_DateStructure.RTC_Month)<<24;		
	
}

/****************************************************************************************************/
uint8_t Week_Day_Search(uint8_t Year, uint8_t Month, uint8_t Day)
{
      if(Month<3)
            Year-=1;
      return (Year + Year/4 - Year/100 + Year/400 + Week_Day_List[Month-1] + Day) % 7;
}

/****************************************************************************************************/
// Rtc kurulumunu yap
void RTC_Config(void)
{

  /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  /* Allow access to RTC */
  PWR_RTCAccessCmd(ENABLE);

  /* Reset RTC Domain */
  RCC_RTCResetCmd(ENABLE);
  RCC_RTCResetCmd(DISABLE);

  /* Enable the LSE OSC */
  RCC_LSEConfig(RCC_LSE_ON);

	Lcd_Str (Alt1,"Waiting  !!! "); 
	Lcd_Str (Alt2,"RTC NOT READY"); 
	
  /* Wait till LSE is ready */  
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }

  /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* Configure the RTC data register and RTC prescaler */
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  RTC_InitStructure.RTC_SynchPrediv  = 0xFF;
  RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
  RTC_Init(&RTC_InitStructure);
	

    /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);
  
  /* Wait for RTC APB registers synchronisation */
  RTC_WaitForSynchro();

}

/****************************************************************************************************/
// alarmı bir sonraki saat geçişine kur
void Rtc_Alarm_Hour(void)
{
	uint8_t kont;
	
  RTC_AlarmCmd(RTC_Alarm_A, DISABLE);  
	(void)RTC->DR;	
 	RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
	
	kont=RTC_TimeStructure.RTC_Hours;

	kont+=1;
	
	if(kont==24)kont=0;
	
  //RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
	RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = kont;
	RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0;
  
	
	 /* Set the Alarm A */
  RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
  RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
  RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; //| 	RTC_AlarmMask_Seconds;

	 /* Configure the RTC Alarm A register */
  RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
	
  /* Enable the alarm  A */
  RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
	
	RTC_ClearFlag(RTC_FLAG_ALRAF);

		
}


// Yeni baglanti için alarmi en erken güne kurar
void Rtc_Alarm_Day(void)
{

      RTC_AlarmCmd(RTC_Alarm_B, DISABLE);  

//  RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
	RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = Alarm_Day_hour;
	RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = Alarm_Day_Min;
	RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0;

	 /* Set the Alarm B */
  RTC_AlarmStructure.RTC_AlarmDateWeekDay = Alarm_Day_WeekDay;
  RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay;
  RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_None; //| 	RTC_AlarmMask_Seconds;

	 /* Configure the RTC Alarm B register */
  RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_B, &RTC_AlarmStructure);
	
   /* Enable the alarm  B */
  RTC_AlarmCmd(RTC_Alarm_B, ENABLE);
	
	RTC_ClearFlag(RTC_FLAG_ALRBF);
	
}
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mistek

stm32 ye ait birkaç döküman inceledim hepsinde RTC biriminin gün, ay, yıl desteklediğini anlatmış ve bunun üzerinden örnekler vermiş. Ancak stm32f10x de RTC sadece saniye sayıyor.

X-Fi hocam stm32f10x std_lib de bu kodlar yok hangi işlemci ile çalışıyorsunuz?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

X-Fi

#236
Alıntı yapılan: mistek - 03 Eylül 2013, 08:20:47

X-Fi hocam stm32f10x std_lib de bu kodlar yok hangi işlemci ile çalışıyorsunuz?

STM32L152 ile çalışıyorum hocam farklılık olabileceğini düşünmemiştim. STM32F4 serisinde donanım desteği varmış sadece STM32F1 serilerinde bulunmuyor galiba.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Mucit23

Arkadaşlar ds1307 yi stm32 ile kullanacağım. Ds1307'nin ana beslemesine 5V verip SCL ve SDA pinlerini 3.3V ile pull-up yapsam iletişimde sıkıntı olurmu? Bildiğim kadarıyla SDA ve SCL Pinleri open collektör durumunda. Dolayısıyla 3.3V ile pull-up yaparsam lojik 1 voltajı 3.3v olur. Yanlışmı düşünüyorum?

mistek

Alıntı yapılan: Mucit23 - 10 Eylül 2013, 15:42:28
Arkadaşlar ds1307 yi stm32 ile kullanacağım. Ds1307'nin ana beslemesine 5V verip SCL ve SDA pinlerini 3.3V ile pull-up yapsam iletişimde sıkıntı olurmu? Bildiğim kadarıyla SDA ve SCL Pinleri open collektör durumunda. Dolayısıyla 3.3V ile pull-up yaparsam lojik 1 voltajı 3.3v olur. Yanlışmı düşünüyorum?

Daha önce 18f452 ve ds1307 ye aynı şekilde kullandım problem yok. Zaten stm32 nin bütün IO pinleri 5v toleranslı isterseniz 5v ile Pull Up yapın.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mucit23

Alıntı yapılan: mistek - 10 Eylül 2013, 15:56:41
Daha önce 18f452 ve ds1307 ye aynı şekilde kullandım problem yok. Zaten stm32 nin bütün IO pinleri 5v toleranslı isterseniz 5v ile Pull Up yapın.

Teşekkür Ederim.