return değeri düzenli dönmüyor

Başlatan papsukkal, 17 Ocak 2024, 23:52:05

papsukkal

Adım adım öğreniyorum. Şu anda çok sağlıklı bir şekilde ADC üzerinden tuş okumalarını yapabiliyorum. Yaşadığım problem ise aslında @JKramer hocamın anlattığına benzer bir durum.

@flowchartx hocam sizin anlatmaya çalıştığınızı sonunda anladım ama biraz uzun sürdü. Tam teşhis koymuşsun.

Bir fonksiyondan Return ile değer istediğimizde eğer ki mantık hatası yapıp fonksiyonun boş değer döndürmesine sebep olursak fonksiyon enterasan bir şekilde kafasına göre bir değeri döndürüyor.

Benim yazdığım kodda tam da bu sebepten (aslında kodlar doğru çalışmasına rağmen) okuduğum adc değerini (dma ile okuduğum için sürekli güncel olanı) döndürüyormuş. Aslında değer gelmemesi gerekirken sürekli güncel değer geldiği için şartlar oluşmamasına rağmen if bloğuna girdiğini düşünüp yanlış yerde hata arıyormuşum.

Fonksiyonun son hali bu şekilde.

int tus_oku()
{
	int y;
	if(tus_bayrak == 0)
	{
		if(adc_deger[2] <= 4000)
		{
			for(int i = 0; i < 10; ++i)
			{
				x = adc_deger[2];
			}

			for(int i = 0; i < 10; ++i)
			{
				x = x + adc_deger[2];
			}

			tus_bayrak = 1;
			x = x/11;
		}
	}

	if((adc_deger[2] >= 4000) && (adc_deger[2] <= 4095))
	{
		tus_bayrak = 0;
		x = 4096;
		y = bos;
	}

	if((x >= tus_mod_alt) &&(x <= tus_mod_ust)){
		y = mod;
	}
	if((x >= tus_arti_alt) && (x <= tus_arti_ust)){
		y = arti;
	}
	if((x >= tus_eksi_alt) && (x <= tus_eksi_ust)){
		y = eksi;
	}
	if((x >= tus_res_alt) && (x <= tus_res_ust)){
		y = res;
	}

	return y;
}

implict declaration uyarılarına henüz tam bir çözüm bulamadım. Properties üzerinden path and symbols altında includes yollarını yeniden apply ediyorum uyarılar kayboluyor, koddaki ilk değişiklikte geri geliyorlar yeniden path apply etmem gerekiyor. Şimdilik bana bir zararları yok. Beraber yaşamaya alışacağız anlaşılan.

Yardım için yorumda bulunan herkese teşekkür ederim.

Yeni önerilieriniz olursa değerlendirmek isterim.

JOKERAS

if(adc_deger[2] <= 4000)
{
  for(int i = 0; i < 10; ++i)
  {
    x = adc_deger[2];
  }
  for(int i = 0; i < 10; ++i)
  {
    x = x + adc_deger[2];
  }
  tus_bayrak = 1;
    x = x/11;
}

@papsukkal , Yine analamdığım noktalar var.

Şimdi yukarıda iki tane döngü kurmuşsunuz. Birinci for ne işe yarıyor?

Sizin yerinizde olsam İkinci for'da 2 nin katlarına denk gelen bir döngü limiti
koyar bölme yerine Sağa shift yapardım.Bölme Zamandan ve alandan yer.

for(i = 0; i < 16; ++i) {

   x = x + adc_deger[2];

}
x = x >> 4;//x 16'ya bölündü.

Bu daha hızlı çalışır.

Ayrıca ....
if()
if()
if()
.
.
.

Zamandan yer, çünkü her if e bakmak zorunda.


if
else if
      else if
      .
      .

Bu şekilde olursa alanı yer.Ama Zamanı if lere göre daha hızlıdır.
Çünkü koşul sağlandığı anda diğer if lerin hükmü kalmaz.

Naçizane önerim budur.

papsukkal

Hocam oradaki for dönüşü ile tuşa ilk bastığım anda analog değer gerçek değerine ulaşana kadar ilk 10 okumayı değerlendirmemek için koydum. Tuş takımı kumandalardaki gibi karbon boyalı tuş.

Kaydırma önerini değerlendireceğim. Benim aklıma gelmedi. Tecrübesizliğime verin :)

Elseleri koyamadığımın farkında değilim. Kod çalışınca heyecandan atlamışım.
 


flowchartx

C'de implicit uyarısı (bana kalırsa) çok tehlikeli olabilir. Sorunun sebenini bulup değerlendirmekte fayda var. Aklınızda bulunsun

papsukkal

Alıntı yapılan: flowchartx - 04 Şubat 2024, 21:32:05C'de implicit uyarısı (bana kalırsa) çok tehlikeli olabilir. Sorunun sebenini bulup değerlendirmekte fayda var. Aklınızda bulunsun

Nette baktım önerilerin hepsini de denedim ama sonuç alamadım. Kodlar biraz şişip karmaşıklaşınca başımı ağrıtacak. Hissedebiliyorum. Tahminim başka dosyadaki fonksiyonu cağırdığımda oluyor ama emin de değilim. Workspace tabanlı derleyicide daha önce çalışmadım. Böyle böyle uğraşarak STM i öğreniyorum.

Mesela .c ve .h dosyaları oluşturuyorum, bazıları sorunsuz oluyor, aynı şekilde yenisini oluşturuyorum hata veriyor. Neden kabul ediyor neden itiraz ediyor henüz çözemedim.

Bir de size bir soru sorayım. Yazdığım kodun 3 senaryosu var. Birisinde çalışırken diğer ikisi ile hiç bağlantısı (ortak kullanılan birkaç fonksiyon hariç) olmayacak. Kod çalışmaya başlayınca 1. Senaryonun main fonksiyonda while(1) içinde koşacak. 2. senaryoya geçmesi gerektiğinde bu senaryonun main fonksiyonunda while(1) içinde koşacak. Ve 3. için de aynısı olacak. Geçişler taşlardan gelen bilgi ile olacak. Anlaşılırlığı yüksek tutmak için her birini ayrı dosyada tutmak istiyorum.

Bu şekilde oluşturmak mantıklı olur mu ya da nasıl bir algoritma yaparsam daha sağlıklı olur?