Değişkene bağlı fonksiyonu formule dökme

Başlatan mechanicalengine, 23 Mayıs 2014, 13:10:47

mechanicalengine

Arkadaşlar merhaba;

Aşağıdaki işlemi formule dökmek istiyorum. Daha önce yapan veya yol gösterecek olan olabilir mi?

Örneğin aşağıdaki gibi bir fonksiyonumuz olsun;

int i=0;

if(i == 1) {output_high(pin_b1); delay_ms(1000);}     
if(i == 2) {output_high(pin_b1); delay_ms(1000);}
.
.
.
if(i == n) {output_high(pin_b1); delay_ms(1000);}


Yukarıdaki işlemde i değişkenini değiştirdiğim zaman satırların kendiliğinden oluşmasını istiyorum.

int i=0;

if(i == (i+1)) {output_high(pin_b1); delay_ms(1000);}     
if(i == (i+2)) {output_high(pin_b1); delay_ms(1000);}
.
.
.
if(i == n) {output_high(pin_b1); delay_ms(1000);}


Örneğin i değişkenini i=100 olarak çağrdığım zaman 100 satır yazmaktan kurtulmak istiyorum.

Nasıl yapabilriim?

Teşekkürler.



sseedat

#1
int j=1;
for(i=0;i<n;i++)
{
   
if(i==j){output_high(pin_b1); delay_ms(1000);}
j++;
}

bu şekilde yapılabilinir mi?
Görünmez bir mezarlıktır Zaman...

vitruvius

Yapmak istediğiniz şeyi biraz daha açıklar mısınız? i'nin her değeri için aynı şeyi yaptıracaksanız niye i'nin tüm değerlerini tek tek kontrol etmek istiyorsunuz?

mechanicalengine

#3
Alıntı yapılan: vitruvius - 23 Mayıs 2014, 13:49:27
Yapmak istediğiniz şeyi biraz daha açıklar mısınız? i'nin her değeri için aynı şeyi yaptıracaksanız niye i'nin tüm değerlerini tek tek kontrol etmek istiyorsunuz?

Farzedin alarmlı saat yaptınız ve alarm sayısını değiştirmek istiyorsunuz fakat her alarmda saatin aynı şekilde çalmasını istiyorsunuz. En basit anlatımıyla alarm sayısını değiştirmek için diyebiliriz.

mesaj birleştirme:: 23 Mayıs 2014, 16:32:31

Alıntı yapılan: sseedat - 23 Mayıs 2014, 13:33:26
int j=1;
for(i=0;i<n;i++)
{
   
if(i=j){output_high(pin_b1); delay_ms(1000);}
j++;
}

bu şekilde yapılabilinir mi?

Üstadım çok teşekkürler. Deneyeceğim ve sonuçları burada paylaşmaya çalışacağım.

sseedat

int j=1;
for(i=0;i<n;i++)
{
   
if(i==j){output_high(pin_b1); delay_ms(1000);}
j++;
}

Bu koddaki  output_high(pin_b1); delay_ms(1000);   ifadesi hiçbirzaman çalıştırılmaz.Bu koddaki amaç sadece for işlemiyle tüm durumları nasıl kontrol edeceğini göstermekti .




Görünmez bir mezarlıktır Zaman...

mechanicalengine

Alıntı yapılan: sseedat - 23 Mayıs 2014, 17:29:47
int j=1;
for(i=0;i<n;i++)
{
   
if(i==j){output_high(pin_b1); delay_ms(1000);}
j++;
}

Bu koddaki  output_high(pin_b1); delay_ms(1000);   ifadesi hiçbirzaman çalıştırılmaz.Bu koddaki amaç sadece for işlemiyle tüm durumları nasıl kontrol edeceğini göstermekti .

Çalıştırmak için nasıl bir yöntem izlemek gerekir?

sseedat

Alarm sesi için   pin_b1 pinini high ve low mu yapıyorsun.
eğer öyleyse

for(i=0;i<20;i++)
{
output_high(pin_b1);
delay_ms(1000);
output_low(pin_b1);
delay_ms(1000);
}
bu fonksiyon ile 20 kere ses çıkarırsın
Görünmez bir mezarlıktır Zaman...

interrupter

Alıntı yapılan: sseedat - 23 Mayıs 2014, 19:12:10
Alarm sesi için   pin_b1 pinini high ve low mu yapıyorsun.
eğer öyleyse

for(i=0;i<20;i++)
{
output_high(pin_b1);
delay_ms(1000);
output_low(pin_b1);
delay_ms(1000);
}
bu fonksiyon ile 20 kere ses çıkarırsın
buradaki 20 sayısına bir global değişken atarsanız ve atadığınız değişkenin değerini ne yaparsanız  o kadar kare sinyal elde edersin  ve istediğiniz gibi bu değişkenin değerini değiştirebilirsiniz


for(i=0;i<x;i++)
{
output_high(pin_b1);
delay_ms(1000);
output_low(pin_b1);
delay_ms(1000);
}

mechanicalengine

#8
Alıntı yapılan: interrupter - 23 Mayıs 2014, 19:43:06
  buradaki 20 sayısına bir global değişken atarsanız ve atadığınız değişkenin değerini ne yaparsanız  o kadar kare sinyal elde edersin  ve istediğiniz gibi bu değişkenin değerini değiştirebilirsiniz


for(i=0;i<x;i++)
{
output_high(pin_b1);
delay_ms(1000);
output_low(pin_b1);
delay_ms(1000);
}

Kesme içerisinde yaptığım zaman çalıştıramadım sizce neden olabilir? Aşağıdaki gibi yaptığımda çalışıyor

#int_ext
void kesme(void)
   {
   if (i==1){output_high(pin_b1);delay_ms(1000);output_low(pin_b1);delay_ms(1000);}
   if (i==2){output_high(pin_b1);delay_ms(1000);output_low(pin_b1);delay_ms(1000);}
   if (i==3){output_high(pin_b1);delay_ms(1000);output_low(pin_b1);delay_ms(1000);}
   if (i==4){output_high(pin_b1);delay_ms(1000);output_low(pin_b1);delay_ms(1000);}
   if (i==5){output_high(pin_b1);delay_ms(1000);output_low(pin_b1);delay_ms(1000);}
   i++;
   }


Fakat aşağıdaki gibi yaptığımda çalışmıyor. n değişkenini başka bir yerde 10 olarak tanımlıyorum. Kesme işleminde fonksiyon çalışıyor fakat 5 defa kesme verdikten sonra çalışmaya devam ediyor. 6. kesmede de 7. kesmede de çalışmaya devam ediyor sınırlandıramıyorum.

#int_ext
void kesme(void)
   {

for(i=1;i<(n/2);i++)
{
output_high(pin_b1);
delay_ms(1000);
output_low(pin_b1);
delay_ms(1000);
}



Bir de for döngüsü kullandığım zaman simülasyonda 1 saniye beklemek yerine daha uzun süre bekliyor. Bu konu hakkında da fikriniz varsa ve paylaşabilirseniz çok sevinirim.

Yardımınız için teşekkürler.

sseedat

#9
int i=0;
 int flag=0;

void alarm()
{
int j;
     for(j=0;j<i;j++)
{
       output_high(pin_b1);
       delay_ms(1000);
       output_low(pin_b1);
       delay_ms(1000);
}
flag=0;
}

void main()
{

while(1)
{
 if(flag)alarm();
}

}
#int_ext
void kesme(void)
   {
   flag=1;
   i++;
  if(i>100)i=1;
   }

bu şekilde dene.her gelen kesme sayısına bağlı olarak alarm çalma süresi uzayacak.
Görünmez bir mezarlıktır Zaman...

mechanicalengine

Alıntı yapılan: sseedat - 23 Mayıs 2014, 23:32:06
int i=0;
 int flag=0;

void alarm()
{
int j;
     for(j=0;j<i;j++)
{
       output_high(pin_b1);
       delay_ms(1000);
       output_low(pin_b1);
       delay_ms(1000);
}
flag=0;
}

void main()
{

while(1)
{
 if(flag)alarm();
}

}
#int_ext
void kesme(void)
   {
   flag=1;
   i++;
  if(i>100)i=1;
   }

bu şekilde dene.her gelen kesme sayısına bağlı olarak alarm çalma süresi uzayacak.

Üstadım, yapmaya çalıştığım tam olarak alarm kesme sayısını tanımlamak. Örneğin 4 kesmeden sonra alarmın çalışmasını istemiyorum, fakat her kesmede de bir saniye sussun 1 saniye çalışsın istiyorum. Örneğin alarm çalışmaya b1 ledini yakarak başlasın

1.kesme 1saniye sus daha sonra çalış
2.kesme 1saniye sus daha sonra çalış
......gibi ben kesme verdikçe 1 saniye sus 1 saniye çalış istiyorum.

1.kesme
if (i==1){output_low(pin_b1);delay_ms(1000);output_high(pin_b1);delay_ms(1000);}
2.kesme
if (i==2){output_low(pin_b1);delay_ms(1000);output_high(pin_b1);delay_ms(1000);}
......gibi manuel ayarladığımda çalışıyor.

fakat yukarıdaki işlemi for döngüsü ile yapmaya çalıştığımda çalışmadı. n=10 yani kesmeyi 10 defa ile sınırlamak istediğimde çok garip bir şekilde 1 saniye yerine 5 saniye susup ondan sonra çalışıyor(n/2=5 olduğu için). Yani delay_ms(1000) , delay_ms(5000)oluyor, delay_ms(1000) gözardı ediliyor. Kesme sayısını da sınırlandıramadım.
for(i=1;i<(n/2);i++)
{
output_high(pin_b1);
delay_ms(1000);
output_low(pin_b1);
delay_ms(1000);
}


Yardımınız için teşekkürler.