Timer interrupt hatası(garip)

Başlatan sessiz_roman, 01 Temmuz 2019, 13:08:59

sessiz_roman

Arkadaslar selam.
Timer interrupt ile ilgili çalışma yaparken garip bir hata aliyorum.

Simdi cubemx de timer ayarlarini yapiyorum projeyi olusturup kodlari duzenliyorum ve ardindan su kodu gerekli yere yaziyorum.

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim14)
{
 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}

Bu kodu yazinca istedigim timer kesme suresinde a portunun 5. Pinini acip kapatiyor burada sorun yok. 

Yine ayni kodu gerekli yere yazdigimda bu sefer toggle komutunu kaldirip icerisine i++ yazdigimda belirledigim her kesme suresinde i degiskenini arttiriyor ve bunu ststudio programindan gozlemleyebiliyorum. 

Buraya kadar her sey normal. 

Ancak 

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim14)
{
 i++;
if(i==10)
{
a++;
i=0;
}}

Seklinde yazarsam kod calismiyor. Yine i istedigim zaman periyodunda artiyor ancak a degiskeni i her 10 oldugunda artmiyior.

Bu kodu sunun icin istiyorum. 

Timer interruptu 1 sn icin ayarlayacagim. Sonra her bir saniyede i degiskenini 1 arttirip 10a kadar saymasini bekleyecegim. İ 10 oldugunda a degiskeni 1 artacak. Ve ben while(1) ana döngusünün icinde a nin degerine gore islem yapacağım. Ancak dedigim gibi i degiskeni artarken a degiskeni artmiyor. 

Hatam nerede acaba

Tagli

Belki derleyici kendince optimizasyon yapıp a'yı değiştirecek kodun bir kısmını yanlışlıkla siliyordur. Derlemede optimizasyonlar açıksa bunları kapatıp deneyebilirsin veya a'yı volatile olarak tanımlamayı dene.
Gökçe Tağlıoğlu

RaMu

i 10 dan 0 a geçiyor mu?
a yı nerede nasıl tanımladın?
a ya başka yerde değer ataması yapıyor musun?
Kodun tamamını paylaşsan daha iyi olur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sessiz_roman

Alıntı yapılan: Tagli - 01 Temmuz 2019, 13:16:09Belki derleyici kendince optimizasyon yapıp a'yı değiştirecek kodun bir kısmını yanlışlıkla siliyordur. Derlemede optimizasyonlar açıksa bunları kapatıp deneyebilirsin veya a'yı volatile olarak tanımlamayı dene.
Kardeşim i ile a yi sayfanin en ustunde #include kodlarinin hemen altinda uint32_t a=0; uint32_t i=0; seklinde tanimladim.
Ben bu dersi youtube da izlerken dersi anlatan kisinin kullandigi derleyici keil idi ben ise atollic kullaniyorum bu durum bu hataya yol açıyor olabilir mi acaba cunku youtube da anlatan kiside hem i hem a artiyordu.

sessiz_roman

Alıntı yapılan: RaMu - 01 Temmuz 2019, 13:36:24i 10 dan 0 a geçiyor mu?
a yı nerede nasıl tanımladın?
a ya başka yerde değer ataması yapıyor musun?
Kodun tamamını paylaşsan daha iyi olur.

Hocam i 10 dan sifira geçmiyor surekli artiyor
A yi en ustte #include tanimlamalarinin hemen altinda uint32_t a=0; diye tanimladim. Ayni sekilde i yide ayni yerde ayni sekilde tanimladim.
A ya baska yerde deger atamasi yapmiyorum cunku while in icinde hic bir kod yazmasa bile i surekli artarken a artmiyor.

Kodun tamamini eve gidince atayim ama zaten kodda yazan her seyi yazdim while dongusunun ici bos, dolu olsa da netice yine ayni değişmiyor.

volkanunal

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim14)
{
 i++;
if(i>=10)
{
a++;
i=0;
}}

Bu şekilde denediniz mi acaba ?

OptimusPrime

kesme icindeki degiskenleri volatile olarak tanimla ki bunlar uzerinde optimizasyon yapilmasin.

Eger a degiskenini bir yerde kullanmiyorsan kim vurduya gitmistir.  :D Derleyicinin bu degisken uzerinde islem yapip yapmadigini anlamin bir kac yolu var.

1. derleyici bu kodu derlerken uyari verdi ise a hicbir yede kullanilmiyor diye, kendide kullanmamistir  :D
2. asm dosyasina bakip bu satirda a ile ne yapmis bakabilirsin
3. map dosyasina a yi eklemismi diye bakabilirsin

 ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

RaMu

Tam @OptimusPrime ın dediği başıma gelmişti,
a yı bir yerde gereksiz kullanıp deneyebilirsin,
misal a==50 ise gpio toggle gibi
bir kod ekleyip dene.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sessiz_roman

Alıntı yapılan: volkanunal - 01 Temmuz 2019, 16:28:07
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim14)
{
 i++;
if(i>=10)
{
a++;
i=0;
}}

Bu şekilde denediniz mi acaba ?

Denedim hocam nalesef o sekilde de a yi arttirmamisti.

volkanunal

Alıntı yapılan: mustafa704250 - 01 Temmuz 2019, 17:27:12Denedim hocam nalesef o sekilde de a yi arttirmamisti.

O zaman yukarıda belirtilen yorumlarda bulunan volatile keywordünü kullanabilirsin. Optimizasyon kaçta çalışıyorsunuz?

sessiz_roman

arkadaşlar hepinize teşekkür ederim.
@OptimusPrime arkadaşın önerisi ile değişkenleri volatile olarak tanımladım ve her şey düzeldi.
şimdi iki değişkende artmakta ve ben bu değişkenleri stmstudio ile gözlemleyebiliyorum.
tekrar teşekkürler, iyi akşamlar.

OptimusPrime

ilk oneren ben degildim.  ;) @Tagli  ::ok
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||