C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

Deli_Nedym

#345
1- end for yazınca end tanımsız diyor.
2-  for bitince tekrar main'e dönüyor kodlar ve bir kere daha main işliyor yani for döngüsü bi daha gerçekleşmiş oluyor. Acaba işlemci kodun bitttiğini mi anlamıyor ? Ama öyle olsa her kod bitiminde tekrar main'in başına dönmez mi ? Bu iki kere main okuyup bi daha başa dönmüyor. İlle de en son while(1); diyerek sonsuz döngüye mi sokmam gerek yani ?

int main()
{
     
int m;
 
	GPIOD->ODR= 0x00000000;     // Ledler sonsun
        delay_ms(2000);
	
	for(m=1; m<10; m++)
  {	                               		        
      GPIOD->ODR= 0x0000F000;     // Ledler yansin
      delay_ms(m*100);
      GPIOD->ODR= 0x00000000;     // Ledler sonsun
      delay_ms(m*200);     
                if (GPIOA->IDR & 0x000000001)
			  break;   
}     
                 GPIOD->ODR= 0x00005000;
			delay_ms(1000);
   		GPIOD->ODR= 0x0000A000;
		       delay_ms(1000);
		 GPIOD->ODR= 0x00003000;
		 	delay_ms(1000);
   		GPIOD->ODR= 0x0000C000;
		       delay_ms(1000);
}     



önce ledler iki saniye sönük duruyor. Ardından for'a giriyor. Eğer mavi butona basarsam for'dan çıkıyor. Ardından ledleri değişik şekillerle 1'er saniye yakıyoruz. Normalde main'in sonuna geliyoruz programın bitmesi gerek fakat program en baştan ledleri iki saniye sönük tutup tekrar for'a girip çıkınca yine ledleri değişik şekillerde 1'er saniye yakıyor. Sonra bitiyor program.

mesaj birleştirme:: 10 Ocak 2013, 19:22:06

if (GPIOA->IDR & 0x000000001)   // Mavi butona basınca

AsHeS

#346
Alıntı yapılan: Deli_Nedym - 10 Ocak 2013, 19:18:29
1- end for yazınca end tanımsız diyor.
2-  for bitince tekrar main'e dönüyor kodlar ve bir kere daha main işliyor yani for döngüsü bi daha gerçekleşmiş oluyor. Acaba işlemci kodun bitttiğini mi anlamıyor ? Ama öyle olsa her kod bitiminde tekrar main'in başına dönmez mi ? Bu iki kere main okuyup bi daha başa dönmüyor. İlle de en son while(1); diyerek sonsuz döngüye mi sokmam gerek yani ?

önce ledler iki saniye sönük duruyor. Ardından for'a giriyor. Eğer mavi butona basarsam for'dan çıkıyor. Ardından ledleri değişik şekillerle 1'er saniye yakıyoruz. Normalde main'in sonuna geliyoruz programın bitmesi gerek fakat program en baştan ledleri iki saniye sönük tutup tekrar for'a girip çıkınca yine ledleri değişik şekillerde 1'er saniye yakıyor. Sonra bitiyor program.

mesaj birleştirme:: 10 Ocak 2013, 19:22:06

if (GPIOA->IDR & 0x000000001)   // Mavi butona basınca
1.soru için
Arkadaş orada end for diyerek bir pseudo(okunur yalancı) kodla anlatmaya çalışmış for döngüsünün bittiğini.Yani @Seçkin ALAN ın anlatttığı şey size bildiğiniz dile göre özet geçmiş C'de for döngüsünde bir end komutu yoktur.break ve continue yapıları vardır.
2.soru için  for bitince tekrar main e dönmüyor burada anlaşalım bir kere for bitince programın kontrolden çıkıyor.O yüzden while(1); yazıp programı main içerisinde tutuyorsun.
Ayrıca kardeş senin şu anki ihtiyacın Deitel&Deitel C ve C++,yeni C ye başlıyorsan o kitaptan başla en iyi Türkçe kitaplardan biridir.

Seckin ALAN

Teşekkürler AsHE.

Aslında kod sizin dediğiniz dışında birşey yapmaz. Adım adım gitiğimizi varsayalım.  Mavi butona basınca döngüden çıkıyor. Aslında mavi butona basmasanız bile for döngüsündeki şart sona erdiği vakit döngüden çıkıcak. Sonra kaldığı yerden! yani GPIOD->ODR= 0x00005000; buradan devam edecek. Kod bloğunun sonunda ise programı sonlandıracak. Burada herhangi bir sıkıntı yok. Kod yazdığınıza göre çalışıyor.

Fakat siz led toggle işlemini sürekli yapsın ben butona basana kadar derseniz şöyle bir kod yazmanız gerekiyor

int main()
{
     
int m;
 
    GPIOD->ODR= 0x00000000;     // Ledler sonsun
        delay_ms(2000);
    
 // eski kodunuz   for(m=1; m<10; m++)
 while(1)
  {	                               		        
      GPIOD->ODR= 0x0000F000;     // Ledler yansin
      delay_ms(m*100);
      GPIOD->ODR= 0x00000000;     // Ledler sonsun
      delay_ms(m*200);     
                if (GPIOA->IDR & 0x000000001)
              break;   
}     
                 GPIOD->ODR= 0x00005000;
            delay_ms(1000);
   		GPIOD->ODR= 0x0000A000;
               delay_ms(1000);
         GPIOD->ODR= 0x00003000;
         	delay_ms(1000);
   		GPIOD->ODR= 0x0000C000;
               delay_ms(1000);
}


while içindeki şart sağlandığı sürece dönecek. İçinde 1 var yani true. İçindeki şart sağlanıyor. Bir nevi kısır döngü. Siz enerjiyi kesmediğiniz veya butona basmadığınız sürece koddan çıkmaz.

Butona basıldığında ise şöyle okuma yapmak daha mantıklı gibi;

if (GPIOA->IDR & 0x000000001){
//butona basıldı
delay_ms(100);
    if (GPIOA->IDR & 0x000000000) { // butondan el çekildiği vakit. Son bitin 0 olduğunu düşünüyorum.PDF okumadım
        break; // döngüden çık
    }
}
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

ULAGA

Aşağıdaki kod mantığı, butona basılmadığı sürece daim olarak LED'i yakar ve söndürür.
Butona basıldığı sürece hiçbir şey yapmadan durur.
Butondan el çekildiği anda blink döngüsünden çıkar.


main
{
	bool IS = true;
	while(IS)
	{
		OnLED();
		Delay();
		OffLED();
		Delay();
		while (Button)
			IS = false;
	}
}

Deli_Nedym

Öncelikle teşekkürler herkese.
Alıntı YapAslında kod sizin dediğiniz dışında birşey yapmaz. Adım adım gitiğimizi varsayalım.  Mavi butona basınca döngüden çıkıyor. Aslında mavi butona basmasanız bile for döngüsündeki şart sona erdiği vakit döngüden çıkıcak. Sonra kaldığı yerden! yani GPIOD->ODR= 0x00005000; buradan devam edecek. Kod bloğunun sonunda ise programı sonlandıracak. Burada herhangi bir sıkıntı yok.

İşte tam burada sıkıntı var hocam. Bunları ben de biliyorum ve buraya kadar aynen çalışıyor sıkıntı yok. Fakat sizin de dediğiniz gibi kod bloğunun sonunda program sonlanmıyor işte, main'in başından ititbaren yapmış olduğu ne varsa aynen onları yapıyor. Benim derdim o. Kod bloğu bitmesine rağmen bu program nasıl bi kez daha baştan itibaren bir kez daha çalışır ? ille de sona while(1); diyerek sonsuz döngü mü yapıcaz yani böyle bir şeyin olması mı gerek ? Çok sinir bozucu bi durum dünden beri main sonlanmasına rağmen programın tekrar çalışması beni delirtti  >:(

ULAGA

@Deli_Nedym

Örnek olarak verdiğim kod işine yaramadı mı?

Deli_Nedym

Hocam benim derdim led yak söndür veya flash eden program değil. Örneğin için teşekkürler. Benim derdim kod döngüsü bittikten sonra programın durmaması

ULAGA

Ben zaten kodu LED yak/söndür diye yazmadım.
Senin sorununa bir çare olabilir mi diye yazdım.
Sorununu yanlış anlamış da olabilirim.
Acaba bir kez daha açıklayabilir misin?
Ben de elimden geldiği kadar yardımcı olmaya çalışayım.

Deli_Nedym

Öncelikle senin verdiğin kod keil'de hata verdi hocam.
En basitinden kodumuz şu olsun
int main()
	{
int m;		
 for(m=1;m<10; m++)
  {	                               		        
      GPIOD->ODR= 0x0000F000;     // Ledler yansin
      delay_ms(500);
      GPIOD->ODR= 0x00000000;     // Ledler sonsun
      delay_ms(500);     
  }
}    // Programin sonu


Bu program normalde 9 kez led yak söndür yapmalı ve ardından bitmeli değil mi ? Ancak bizim programımız 18 defa falan yapıyor. Yani main bir kere değil iki defa çalışıyor. Bunu başka kod ekleyerek de test ettiim. Main'e ne yazarsak, kod son bulması gerektiği yerde tekrar main de ne varsa onşları yapıp sonra bitiyor. Acaba keil de veya stm32f4 kitinin options kısmında mi bir sorun var ?

Seckin ALAN

wdt açık kalmasın ?

keilde hata vermesi sıkınt değil illaki açıklama satırı vardır buraya yazarsan bir yolunu bulmaya çalışırız.
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

AsHeS

#355
int main()
	{
int m;		
 for(m=1;m<10; m++)
  {	                               		        
      GPIOD->ODR= 0x0000F000;     // Ledler yansin
      delay_ms(500);
      GPIOD->ODR= 0x00000000;     // Ledler sonsun
      delay_ms(500);     
  }
while(1);//Bunu yazınca çalışıyor mu 9 kez yanıp sönme işlemi.
}    // Programin sonu

Kodda ki eklenti de çalışıyorsa WDT kaynaklı değildir ayrıca WDT olsa sabaha kadar reset yer program 18 değil 118 bile yapar.Koda yapacağın eklentiyi yukarıda verdim.
Ayrıca önce ki mesajımda
Alıntı yapılan: AsHeS35 - 11 Ocak 2013, 04:42:56
2.soru için  for bitince tekrar main e dönmüyor burada anlaşalım bir kere for bitince programın kontrolden çıkıyor.O yüzden while(1); yazıp programı main içerisinde tutuyorsun.
demişim.
Yani demem o ki kod bitmez assembly biliyorsan diyeceğim şu ki PC+1 yaparak yoluna devam eder.

ULAGA

#356
Verdiğim kod sadece taslaktı.
Algoritma açısından örnek olsun diye.
Normalde main içerisinde yazılan kodlar sonsuz döngü [ for( ;;; ), while(1) gibi ] içerisinde değilse, bir kez çalışırlar.
Ancak kullandığın denetleyicinin ayarları ile ilgili bir sorun vardır muhakkak.
Bunun başka bir açıklaması olabileceğini sanmıyorum.
Bir de denetleyiciyi değiştirip, öyle dene.
Hata şüphelerinin sayısını düşürmek her zaman için iyidir.
Zira yazdığım her kod fazladan tekrarlıyor diyorsun.

Kod sonuna while(1) yazarak sorun çözülebilir de.
Bu sorun olmaz senin için. :)

Deli_Nedym

Herkese teşekkürler beyler. En sona while(65); yazıp sonsuz döngüye sokacağım kalsın  orda dallanmasın bir yere. Yoksa tam sonuca ulaşamayacağız gibi keil ve işlemci ayarlarına pek yatkın değilim. Şimdilik sonsuz döngüyle çözelim biz bu sorunu. Herkese emeklerinden ötürü teşekkürler kolay gelsin iyi çalışmalar...

Seckin ALAN

Alıntı yapılan: AsHeS35 - 11 Ocak 2013, 16:11:59
int main()
	{
int m;		
 for(m=1;m<10; m++)
  {	                               		        
      GPIOD->ODR= 0x0000F000;     // Ledler yansin
      delay_ms(500);
      GPIOD->ODR= 0x00000000;     // Ledler sonsun
      delay_ms(500);     
  }
while(1);//Bunu yazınca çalışıyor mu 9 kez yanıp sönme işlemi.
}    // Programin sonu

Kodda ki eklenti de çalışıyorsa WDT kaynaklı değildir ayrıca WDT olsa sabaha kadar reset yer program 18 değil 118 bile yapar.Koda yapacağın eklentiyi yukarıda verdim.
Ayrıca önce ki mesajımda demişim.
Yani demem o ki kod bitmez assembly biliyorsan diyeceğim şu ki PC+1 yaparak yoluna devam eder.
while 1 e gelince kısır döngüye neden girmiyor?
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

Deli_Nedym

kısır döngüye giriyor zaten. Yani program oraya kadar çalışıp sonra sonsuz döngüde kalıyor. Çalışıyor diyebiliriz program böylelikle de