avatar_kotan04

arduino gosub

Başlatan kotan04, 08 Mart 2017, 09:28:21

kotan04

Merhaba Arkadaşlar ,

arduino ile ufak çalışmalar yapıyorum fakat GOSUB komutuna eşdeğer bir şey bulamadım yardımcı olur musunuz?
arduino web sayfasında bulunan anlatımlardan pek bir şey anlamadım.

gosub var mı acaba ??


void loop

program
program
program
gosub  etiket



void etiket

program
program

return,









mg1980

#1
etiket(); yazdığınızda aynı anlama geliyor. Ancak  fonksiyonu yazdığınız bölüm şu şekilde olmalı:
void etiket(){
......komutlar;
}
İlave: C dili olduğu için GOSUB yok diye biliyorum. return; var ancak fonksiyon sonlarına yazmak gerekmiyor. Herhangi bir bölümünden değer döndürmek istediğinizde o bölüme yazılıyor.Size Fahrettin ERDİNÇ'in "Yeni Başlayanlar İçin Arduino" kitabını önerebilirim.Epeyce bir bölümü C dilini de anlatıyor.

kotan04

ana programdan alt programa yönlendirip tekrar nasıl ana programa dönebilirim ?


bunu anlamadım tekrar anlatır mısın ?

mg1980

void setup(){
..ayarlar;
}
void loop(){        // ana fonksiyon .Bunun içinde while(1) ile sonsuz döngü oluşturup içine yazabilirsiniz.
...;
etiket();
}
void etiket(){
....komutlar;
}
Bu şekilde yazdığınızda ayrıca komuta gerek yok.Kendisi dönüyor.

ete

C dilinde GOSUB yoktur. Onun yerine fonksiyonlar vardır. Fonksiyon bir nevi alt program gibi çalışır.
MG1980 anlatımış şekil olarak ben sadece bir iki şey ekleyeyim.
Diyelimki bir alt prgramın var ve orada bir kaç tuşa bakılıyor ve sonuçta TUS=xx şeklinde bir değer elde ediliyor.
Bunu bir fonksiyon olarak yazıp TUSBAK ismini verirsen  GOSUB TUSBAK ın C dili karşılığı TUSBAK(TUS) olur.
Programın herhangi bir yerine TUSBAK(TUS) yazdığın zaman program gidip tuşlara bakar ve TUS değeri ile geri döner.

Ete

kotan04

Merhbaba;

şöyle bir kod oluşturdum  sanırım çalışacak fakat hız değişkeninin içerisindeki değerin artışını azalışını görmek istiyorum proteusta bunu nasıl yapabilirim ? Watch window özelliğinden faydalanmak istiyorum.


const int buton_1 = 3;  // buton_1  6 nolu pine takılacak
const int buton_2 = 2;  // buton_2  7 nolu pine takılacak
int hiz=5; // 255 maksimum değer
int buton1=1;
int buton2=1;
int led1 = 13;
int led2 = 12;

void setup()

{


pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);
pinMode(buton_1, INPUT);
pinMode(buton_2, INPUT);
delay (800);

}

void loop()

{
  digitalWrite(led1, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(led2, LOW);    // turn the LED on (HIGH is the voltage level)
  delay(hiz);                // wait for a second
  kontrol();
  digitalWrite(led1, LOW);      // turn the LED off by making the voltage LOW
  digitalWrite(led2, HIGH);     // turn the LED off by making the voltage LOW
  delay(hiz);
     
}

void kontrol()

{
     buton1 = digitalRead(buton_1);
     buton2 = digitalRead(buton_2);
     delay(5); // butona basınca oluşan arkı engellemek için
     if (buton1==0) hiz=hiz+1; // buton1 e basılmışsa hızı 1 artacak
     if (buton2==0) hiz=hiz-1; // buton2 ye basılmışsa hızı 1 azalacak
     
     }


mg1980

#6
buton1 ile buton2 değişkenini aynı pine (1) atamışsınız.Proteus tarafını bilmiyorum.Neden proteusla uğraşıyorsunuz.17 TL.ye bir Uno alın devamlı yanınızda usb.ye takıp denersiniz.

kotan04

elbette ama bulunduğum ortamda sadece simülasyon vasıtasıyla işimi yürütebiliyorum.

dediğim gibi değişkenin aldığı değeri   Watch window aracılığı ile görebilirsem süper olur

kotan04

Alıntı yapılan: kotan04 - 08 Mart 2017, 10:43:54
elbette ama bulunduğum ortamda sadece simülasyon vasıtasıyla işimi yürütebiliyorum.

dediğim gibi değişkenin aldığı değeri   Watch window aracılığı ile görebilirsem süper olur

arkadaşlar bu konu hakkında bir fikri olan varvmı ?

kotan04

#9
Merhaba Arkadaşlar;

gosub kısmını çözdüm ama bir türlü programı  çalıştıramadım . acaba nerede hata yapıyorum bakar mısınız  ?
KOD DÜZELTİLDİ
iyi çalışmalar.


const int buton1 = 3; 
const int buton2 = 2;
int hiz=10;// defeul değer
int led1 = 13;
int led2 = 12;

int butonstate1,butonstate2 ;

void setup()

{

pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);

pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);
delay (800);

}

void loop()

{

  digitalWrite(led1, HIGH);   //
  digitalWrite(led2, LOW);    //

  delay(hiz);
  kontrol();

  digitalWrite(led1, LOW);      //
  digitalWrite(led2, HIGH);     //

  delay(hiz); 
  kontrol();
}
void kontrol(){
   
     butonstate1 = digitalRead(buton1);
     butonstate2 = digitalRead(buton2);
     
       if (butonstate1==LOW)  ;
     
       
         hiz=hiz+1; //     
       
 
       if (butonstate2==LOW) ;
     
        hiz=hiz-1;
        delay(100); //
       

}



mg1980

#10
Sayın kotan04;
Hızlıca bakınca bana ters gelen bir iki husus şunlar:
1-Tanımlamalarda buton1,buton2 için 3 ve 2. pin demişsiniz karşılarına 6.ve 7. pine bağlanacak demişsiniz buna göre bağladıysanız yanlış olur.
2-int hiz tanımlamışsınız 5 değeri vermişsiniz.Daha sonra bunu delay değeri olarak kullanmışsınız. 5 mili saniye ile başlıyor ve 1'er 1'er artırıp eksiltiyorsunuz.Bu hız çok yüksek değil mi ? Program çalışıyor belki de göremiyorsunuz.hiz karşısında açıklama olarak 255 yazmışsınız.Eğer int için maksimum değer anlamındaysa doğru değil. Bir de eksilttiğinizde hızla eksi değer alırsınız.Bu değeri ne yapacaksınız. Buralara bir sınırlama kodu yazarsanız iyi olmaz mı ? İlk anda görebildiklerim.Başka dikkatimi çeken olursa yazarım.Kolay gelsin.
İlave;
3- Butonlarda pullup direnci var mı ? Butonlar INPUT_PULLUP olarak yazılırsa dirence gerek kalmaz.
4-delay(100)'ü hiz+1 bölümüne de yazmakta fayda var.

kotan04

Alıntı yapılan: mg1980 - 14 Mart 2017, 15:46:33
Sayın kotan04;
Hızlıca bakınca bana ters gelen bir iki husus şunlar:
1-Tanımlamalarda buton1,buton2 için 3 ve 2. pin demişsiniz karşılarına 6.ve 7. pine bağlanacak demişsiniz buna göre bağladıysanız yanlış olur.
2-int hiz tanımlamışsınız 5 değeri vermişsiniz.Daha sonra bunu delay değeri olarak kullanmışsınız. 5 mili saniye ile başlıyor ve 1'er 1'er artırıp eksiltiyorsunuz.Bu hız çok yüksek değil mi ? Program çalışıyor belki de göremiyorsunuz.hiz karşısında açıklama olarak 255 yazmışsınız.Eğer int için maksimum değer anlamındaysa doğru değil. Bir de eksilttiğinizde hızla eksi değer alırsınız.Bu değeri ne yapacaksınız. Buralara bir sınırlama kodu yazarsanız iyi olmaz mı ? İlk anda görebildiklerim.Başka dikkatimi çeken olursa yazarım.Kolay gelsin.
İlave;
3- Butonlarda pullup direnci var mı ? Butonlar INPUT_PULLUP olarak yazılırsa dirence gerek kalmaz.
4-delay(100)'ü hiz+1 bölümüne de yazmakta fayda var.

Merhaba Mg 1980;

1:tanımlamada yazan buton1-buton2  kısmını düzelttim program o kısımları zaten okumuyor.
2:int hız değeri açılış default değeri simülasyonda gözlemleyebiliyorum. sınırlama için çalıştıktan sonra bakacağım

3 INPUT_PULLUP kısmını düzelttim.

4 düzelteceğim delay hız+1 kısmını .

ve ahala istediğim gibi çalıştıramadım :(

teşekürler ..

iyi çalışmalar.

mg1980

#12
Programın okumadığının farkındayım da bağlantıyı ona göre yapmışsanız çalışmayacağını belirtmek için söyledim.Bence o hızı en az 100 yapın artı-eksilişleri de 10'ar yapın.

kotan04

Merhaba ,

hız arttırma ve eksiltmeyi 10
default değeri 100 yaptım fakat buton yine işlemiyor.

mg1980

#14
Sizin kodlara basit bir iki ilave yaptım.Dener misiniz.Çalışması lazım.Çalışmazsa kart üzerinde kurup deneyeceğim.


const int buton1 = 3; 
const int buton2 = 2;
int hiz=300;// defeul değer
int led1 = 13;
int led2 = 12;

int butonstate1,butonstate2 ;

void setup()

{

pinMode(led1,  OUTPUT);
pinMode(led2,  OUTPUT);

pinMode(buton1, INPUT_PULLUP);
pinMode(buton2, INPUT_PULLUP);
delay (800);

}

void loop()

{
  while(1){
  digitalWrite(led1, HIGH);   //
  digitalWrite(led2, LOW);    //

  delay(hiz);
  kontrol();

  digitalWrite(led1, LOW);      //
  digitalWrite(led2, HIGH);     //

  delay(hiz); 
  kontrol();
}
}
void kontrol(){
   
     butonstate1 = digitalRead(buton1);
     butonstate2 = digitalRead(buton2);
     delay(1000);
     
       if (butonstate1==LOW)  {
     
       
         hiz=hiz+10;
         if(hiz>=2500) hiz=2000;
         delay(200);     
        }
 
       if (butonstate2==LOW) {
     
        hiz=hiz-10;
        if(hiz<=100) hiz=100;
        delay(200);
       }

}



Powered by EzPortal