stm32f407 timer2 bazen kendiliğinden kapanıyor

Başlatan tekosis, 01 Nisan 2014, 10:14:54

tekosis

selamün aleyküm arkadaşlar. yazdığım bir programda timer2 ve timer7 kullanıyorum. bazen timer2 kendini kapatıyor.cihaza enerjiyi veriyorum ve butonlarda yaptığım işlem aynı olmasına rağmen bazen devre dışı kalıyor bazen normal çalışmasına devam ediyor. sizce bu hata neden olabilir. kullandığım program microc pro for arm. kod çok uzun ondan paylaşamıyorum ayrıca aynı kod ile çalışan sistem bazen bu hatayı veriyor ilginç! bu arada beklemeye devam edersem yaklaşık 1-2 dk sonra devreye giriyor. Şimdiden teşekkür ederim arkadaşlar.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

X-Fi

Yazılımda bu gibi durumlara BUG deniyor.

Çözümü ise DEBUG.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

tekosis

evet hocam çok güzel söylemişsiniz ben de ona çalışıyorum. bu debug işlemini nasıl yaparım diye uğraşıyorum bakayım ne çıkacak.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

#4
hocam programlayıcım henüz gelmedi de debug yapamıyorum. acaba bu timer2 ye program nasıl bir şekilde müdahale ediyorda bir süre sonra kendiliğinden açılıyor olabilir. demek istediğim tim2 yi devre dışı bırakan bir donanım var mı? çünkü program while dönüsünde iken timer2 bir süre sonra kendiliğinden açılıyor.

ekleme: şimdi timer2 yerine timer5 kullandım (ikiside apb1 veri yoluda ve 32 bit) timer5 te aynı şekilde kapandı.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

muhittin_kaplan

bukadar bilgiyle yapabileceğimiz fazla birşey yok.

z

Karşılaştığın sorunu öyle kelimelerle yazmalısınki okuduğumuzda kafamızda bir şeyler şekillensin.

Timer 2 kendiliğinden kapanıyor cümlesini ele alalım.

1) Acaba Timer ile ilişkilendirilmiş çıkış pinleri var da bu pinlerden çıkan sinyaller mi kesiliyor da timer kapanıyor deniyor?
2) Acaba Timer int rutini var da bu rutin tıkır tıkır işlerken bir süre sonra bu rutine girilmemeye mi başlanıyor?

Olası durumlardan ilk akla gelenler;

Timer Clk seçimini sağlayan registere bir rutin yükleme yapıp "timer clk"u kapatıyordur.
Timerla ilişkili pinlerin bağlı olduğu port registerleri bir başka rutinde yeniden yapılandırılıyordur.
Bir rutin stackta şişmeye neden oluyordur.
Bir rutin "NVIC"a müdahale ediyor ve timer interruptı yasaklıyordur.
Bir rutin timer registerlerini yeniden yapılandırıp işlemez hale getiriyordur.

Tabiki daha başka olaylar da olabilir. Ama soruda hiç ipucu yok.

Öncelikle kendini ifade edebilmeyi öğrenmelisin.

Normalde böyle soruya cevap bile vermeyip soruyu forumdan silip atmak gerekir.  Çünkü hiç ama hiç özenilmemiş. Sen özen göstermezsen baskaları cevap için hiç özen göstermez.

Eleştirimi dikkate almanı umarım.  Sadece elektronik-yazılım alanında değil tüm yaşantında, günlük olaylarda dahi bu konuya önem vermelisin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tekosis

#7
     

      Z hocam cevaplarınız için teşekkür ederim. haklısınız sorum üstü kapalı ve anlaşılması zor olmuş. Kesinlikle forum içinde yazdıklarıma dikkat ederim ama sorumun çok açık olmaması konu hakkında zaten bilgisiz oluşumdan kaynaklanıyor. şu an cevabınızda anlattığınız ihtimalleri değerlendiriyorum, anlayışınız için teşekkür ederim.
     Şimdi tekrar soruma gelecek olursam dediğiniz gibi programda timer2 kesmesinin içinde bir adet ledi sürekli set ediyorum ve başka bir pini toggle edip frekansmetreden kontrol ediyorum. kesmenin içine girip girmediğini bu şekilde algılıyorum. normal çalışma sırasında hem led yanıyor, hemde frekans metreden istediğim frekanstaki sinyali alıyorum yani timer2 rutinine giriyor. aynı zamanda ana programın içindeki kontrol döngüsünde bu ledi sürekli söndürüyorum ki kesme bir şekilde pasif olursa led yanık kalmasın, timer2 rutinine giremediğini anlayayım. işte bu şekilde kontrol ettiğimde program bazen timer2 rutinine girmiyor. en azından led ve frekansmetre bana bunu söylüyor.

aynı zamanda timer7 kesmesini de başka bir iş için kullanıyorum ama bu kesmenin çalışmasında herhangi bir sıkıntı yok her zaman normal çalışmasına devam ediyor.
void Timer2_interrupt() iv IVT_INT_TIM2 {
  TIM2_SR.UIF = 0;
  led=1;
  GPIOD_ODR.B12=~GPIOD_ODR.B12; 
}

void arr_ayarla()
{
	TIM2_PSC = 0;
	switch(istenen_frenans)
	{
	case 1:  TIM2_ARR =500 ; break;
	case 2:  TIM2_ARR =1000 ; break;
	case 3:  TIM2_ARR =1500 ; break;
	case 4:  TIM2_ARR =2000 ; break;
	case 5:  TIM2_ARR =2500 ; break;
	case 6:  TIM2_ARR =3000 ; break;
	case 7:  TIM2_ARR =3500 ; break;
	case 8:  TIM2_ARR =4000 ; break;
	case 9:  TIM2_ARR =5000 ; break;
	case 10: TIM2_ARR =10000 ; break;
	}
}

void InitTimer2(){
  RCC_APB1ENR.TIM2EN = 1;
  TIM2_CR1.CEN = 0;
     arr_ayarla(); //burada alt fonksiyondan istenen frekansa uygun olan arr değeri çağrılıyor.
  NVIC_IntEnable(IVT_INT_TIM2);
  TIM2_DIER.UIE = 1;
  TIM2_CR1.CEN  = 1;
}



main()
{
     while1()//kontrol döngüsü
     {
     led=0;//bu led döngüde söndürülse de kesme frekansı çok yüksek olduğundan tim2 normal çalıştığı sürecele  sürekli yanık olarak                          //görünüyor.
          //bu döngü içinde çeşitli buton kontrolleri ve tft ekrana görsel basmak üzere kullanılan tft_ext_image() komutu kullanılıyor.
         //  program burada normal çalışıyor
   .......................
   .......................
   .......................
   .......................
     }
}


işte bu noktada sorun başlıyor. kontrol döngüsünde kullanıcı bir önceki menüye gitmek isterse cihaza önce tft_ext_image komutu ile resim basılıyor(ki bu komut normalde sorun çıkarmıyor), bir önceki menüye gidiliyor sonra kullanıcı menüde istediği frekansı seçiyor, onay tuşuna basınca timer2 tekrardan init ediliyor ve program yine kontrol döngüsüne geliyor. işte bu anda timer2 bazen normal çalışıyor bazen de yaklaşık bir dakika sonra devreye giriyor. hocalarım ben kod istemiyorum, işleyiş olarak timer2 nin bu şekilde davranmasına hangi donanım yada yazılım hataları sebep olabilir bunun peşindeyim. ne sebepten dolayı timer 2 çalışmayı keser? aklıma gelen apb1 veri yolunun beslemesinin kesilmesi oluyor ama o durumda timer7 de çalışmaması lazım ama çalışıyor. ben bu problemde özellikle tft_ext_image komutundan şüpheleniyorum ama müdahale edemiyorum. umarım açıklayıcı olabilmişimdir.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

Sorunun anlatımını aşağıdaki şekilde basitleştirebilirmiyiz?

Timerı kuruyorum, timer ınt içinde bir pin sorunsuz şekilde toggle edilebiliyor.

Timer çalışırken timer ayarlarını değiştirmeye kalkarsam timer int rutinine girilmiyor timer sapıtıyor.

Eğer böyle ise;

Timerı durdurmayı ardından ARR registerine vs yazmayı daha sonra da timerı yeniden aktif edip çalıştırmayı deneyebilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tekosis

evet hocam zaten InitTimer2() fonksiyonunun içinde aşağıdaki kod parçasında da görüldüğü üzere arr ayarlanmadan önce timer2 durduruluyor. ayrıca timer2 yi hiç kapatmadan, init fonkisiyonuna da girmeden sadece arr değerini değiştirerek te denedim sonuç aynı. kafamı karışıtıran problemin sürekli olmaması. rasgele olduğunu düşündürecek şekilde timer2 yi kapatıyor.
TIM2_CR1.CEN = 0;
arr_ayarla();


İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

Timer Init i 1 kez çağırıyorsun ARR ayarla rutin içinde timerı durdurup sonra değeri değiştirip sonrasında da timerı harekete geçir demek istemiştim.

Bir de hangi çipi kullanıyorsun?

STM32F407 için örneğimiz burdaydı

https://www.picproje.org/index.php/topic,35896.msg256761.html#msg256761

Timer int içinde doğru flağı sıfırladığından eminmisin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com