Koşul ve değişken hakkında soru

Başlatan laotzi, 31 Ocak 2017, 16:25:00

laotzi

Arkadaşlar merhaba , CCS C ' de koşul ve değişkeni birleştirerek şu durumu yapmaya çalışıyorum ; a0 pin'ine basıldığında int x değişkenimin 1 artması ve 1 olduğunda b1 pinindeki ledi çalıştırmasını  ikinci kez bastığımda ledi kapatmasını istıyorum . Ancak devreyi isiste çalıştırdığımda b1 pini sürekli flaşör şeklinde çalışıyor koşulu beklemiyor a0 butonuda bir işe yaramıyor .


KOD ;
#include <16F628a.h>
#fuses INTRC_IO,NOWDT,NOPUT //,NOBROWNOUT
#use delay(clock = 4M )
int x = 0 ;
void main()
{
set_tris_b (0b00000000) ;
set_tris_a (0b11111111) ;


   while(TRUE)
   {

if  (input(pin_a0)) ;
{
x ++ ;
}
if ( x == 1 ) ;
{
output_high(pin_b1) ;
}

if ( x == 2 ) ;
{

output_low ( pin_b1) ;
}
 

   

      //TODO: User Code
   }

}

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Cemre.

Kodlarınızı code etiketleri arasına yazsanız daha iyi olurdu. Bir de konu başlıklarının tüm harflerini büyük yazmıyoruz.
Belki Forum Kuralları'nı okumak istersiniz.

Sorunuza gelirsek. Butona bastığınız sürece x değişkeni artacak şekilde bir algoritma oluşturmuşsunuz. Temel problemlerden biri bu. Buton okuma konularını bir araştırın. Debounce olayını bir araştırın bunlar çok temel konular ve birsürü döküman bulacaksınız emin olun. İkincisi ise şu. INT tipi bir değişkenin unsigned (işaretsiz (sadece pozitif değer alabilir)) olduğunu varsayarsak misal 8 bit ve max değeri 255 olacak bir değişken tanımlamışsınız demektir.

Bu durumda evet x == 1 ise yanacak, x == 2 ise sönecek. Peki diğer durumlarda ne olacak? Bu noktada da bir çözüm üretmek zorundasınız. Bu misal tanımladığınız değişkeni butona bastığınızda 1 ise 0, 0 ise 1 yapacak bir kod yazarsınız ve sonra bu değişkenin değerine göre LED'i yakar veya söndürürsünüz. Bu noktada yine sizin algoritma oluşturma becerinize kalıyor iş.

Siz söylediklerim üzerine bir araştırma yapın, biraz düşünün. Sonra tekrar asıl çözümü tartışalım derim. Çünkü bunlar çok temel seviye bilgileri ve düzgün öğrenilmediğinde sonra sıkıntılar doğuruyor.

Kolay gelsin.

vitruvius

If'lerden sonra noktalı virgül koymanın sebebi?

if  (input(pin_a0))
{ 
   x ++ ;
}


Böyle yazarsan bu if şartı doğru olduğu sürece değişkenin artacaktır. Yani sen butona bastığın an bu değişken defalarca artar. Senin basıp çekmen anlık olabilir ama microcontroller için bu süre oldukça uzundur.

Onun yerine kullanıcının parmağını butondan çekmesini beklemen daha doğru olur. Bir de debounce olayını bir araştır.

if  (input(pin_a0))
{
   while ((input(pin_a0)); // Butona basılı olduğu sürece program burada takılı kalır.
   x ++ ;  // Buton bırakıldıktan sonra değişkeni arttır.
}

Teğmen

Merhaba;
Yukarıda diğer arkadaşlar bahsetmiş ama bir de ben tekrarlayayım butonla okuma işlemleri konusuna tam hakim olmazsan ilerde geliştireceğin projelerde daha büyük sıkıntı çekmen muhtemel.
Debounce olayını araştır etraflıca.Kısaca debounce butona basıldığında bir ark oluşur ve denetleyici/işlemci bu arkı tekrar tekrar butona
bastın olarak algılar ve defalarca kez "x" diye atadığın değişkenin değerini artırır.Ve sonraki if,while,for v.b. kontrollerine yanlış olarak aktarılmış olur.Bunu aşmak için butona bastıktan sonra gecikme vermen gerekir.
ya da
while((input(pin_a0))
koduyla butondan elini çekinceye kadar bekletmen gerekir.
Sen burada int x=0; diyerek değişkene başlangıç değeri vermişin gerçi ama tekrar etmekte fayda görüyorum.Eğer başlangıç değerini baştan belirlemez isen denetleyici/işlemci kendi bir değer alır ve bu da
işlemlerin yanlış gitmesine yol açabilir.O yüzden değişkene özel olarak değer vermemen gerekecek yazılımlar haricinde başlangıçta değer ataman faydalı olacaktır.


Kolay Gelsin.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

laotzi

Alıntı yapılan: Cemre. - 31 Ocak 2017, 17:01:05
Kodlarınızı code etiketleri arasına yazsanız daha iyi olurdu. Bir de konu başlıklarının tüm harflerini büyük yazmıyoruz.
Belki Forum Kuralları'nı okumak istersiniz.

Sorunuza gelirsek. Butona bastığınız sürece x değişkeni artacak şekilde bir algoritma oluşturmuşsunuz. Temel problemlerden biri bu. Buton okuma konularını bir araştırın. Debounce olayını bir araştırın bunlar çok temel konular ve birsürü döküman bulacaksınız emin olun. İkincisi ise şu. INT tipi bir değişkenin unsigned (işaretsiz (sadece pozitif değer alabilir)) olduğunu varsayarsak misal 8 bit ve max değeri 255 olacak bir değişken tanımlamışsınız demektir.

Bu durumda evet x == 1 ise yanacak, x == 2 ise sönecek. Peki diğer durumlarda ne olacak? Bu noktada da bir çözüm üretmek zorundasınız. Bu misal tanımladığınız değişkeni butona bastığınızda 1 ise 0, 0 ise 1 yapacak bir kod yazarsınız ve sonra bu değişkenin değerine göre LED'i yakar veya söndürürsünüz. Bu noktada yine sizin algoritma oluşturma becerinize kalıyor iş.

Siz söylediklerim üzerine bir araştırma yapın, biraz düşünün. Sonra tekrar asıl çözümü tartışalım derim. Çünkü bunlar çok temel seviye bilgileri ve düzgün öğrenilmediğinde sonra sıkıntılar doğuruyor.

Kolay gelsin.
Cevabınız için teşekkürler Yukarıda bahsettiğiniz debounce olayını biliyorum . Yazdıklarınızı şurası ;(Bu durumda evet x == 1 ise yanacak, x == 2 ise sönecek. Peki diğer durumlarda ne olacak? Bu noktada da bir çözüm üretmek zorundasınız. ) haricinde tamamen anladım . Burayi bıraz daha açarmısınız . Örnek kodlarınız varsa alabilirim incelemek için .

laotzi


laotzi

Alıntı yapılan: vitruvius - 31 Ocak 2017, 17:02:19
If'lerden sonra noktalı virgül koymanın sebebi?

if  (input(pin_a0))
{ 
   x ++ ;
}


Böyle yazarsan bu if şartı doğru olduğu sürece değişkenin artacaktır. Yani sen butona bastığın an bu değişken defalarca artar. Senin basıp çekmen anlık olabilir ama microcontroller için bu süre oldukça uzundur.

Onun yerine kullanıcının parmağını butondan çekmesini beklemen daha doğru olur. Bir de debounce olayını bir araştır.

if  (input(pin_a0))
{
   while ((input(pin_a0)); // Butona basılı olduğu sürece program burada takılı kalır.
   x ++ ;  // Buton bırakıldıktan sonra değişkeni arttır.
}
Tesekkurler dediğinizi uyguladım ancak sorunu düzeltemedim. Yeni algoritma oluşturma konusunda yardımcı olurmsuunuz .

laotzi

Alıntı yapılan: Teğmen - 31 Ocak 2017, 17:34:41
Merhaba;
Yukarıda diğer arkadaşlar bahsetmiş ama bir de ben tekrarlayayım butonla okuma işlemleri konusuna tam hakim olmazsan ilerde geliştireceğin projelerde daha büyük sıkıntı çekmen muhtemel.
Debounce olayını araştır etraflıca.Kısaca debounce butona basıldığında bir ark oluşur ve denetleyici/işlemci bu arkı tekrar tekrar butona
bastın olarak algılar ve defalarca kez "x" diye atadığın değişkenin değerini artırır.Ve sonraki if,while,for v.b. kontrollerine yanlış olarak aktarılmış olur.Bunu aşmak için butona bastıktan sonra gecikme vermen gerekir.
ya da
while((input(pin_a0))
koduyla butondan elini çekinceye kadar bekletmen gerekir.
Sen burada int x=0; diyerek değişkene başlangıç değeri vermişin gerçi ama tekrar etmekte fayda görüyorum.Eğer başlangıç değerini baştan belirlemez isen denetleyici/işlemci kendi bir değer alır ve bu da
işlemlerin yanlış gitmesine yol açabilir.O yüzden değişkene özel olarak değer vermemen gerekecek yazılımlar haricinde başlangıçta değer ataman faydalı olacaktır.


Kolay Gelsin.
Tesekkürler 3 değerini verdim ancak yine durum aynı tıpkı bir flasör gibi çalışıyor çıkış pini .

Cemre.

#9
Bir de böyle dener misiniz? Olursa basitçe anlatmaya çalışayım.
#include <16F628a.h>
#fuses INTRC_IO,NOWDT,NOPUT //,NOBROWNOUT
#use delay(clock = 4M )
int x = 0 ; 
void main()
{
set_tris_b (0b00000000) ; 
set_tris_a (0b11111111) ; 


while(TRUE)
{
if  (input(pin_a0)){ 
while(input(pin_a0));
x++;
if(x > 1) x = 0;
}

if (x == 1){
output_high(pin_b1) ; 
}

if (x == 0){
output_low ( pin_b1) ;
}
}
}

laotzi

Alıntı yapılan: Cemre. - 31 Ocak 2017, 18:03:13
Bir de böyle dener misiniz? Olursa basitçe anlatmaya çalışayım.
#include <16F628a.h>
#fuses INTRC_IO,NOWDT,NOPUT //,NOBROWNOUT
#use delay(clock = 4M )
int x = 0 ; 
void main()
{
set_tris_b (0b00000000) ; 
set_tris_a (0b11111111) ; 


while(TRUE)
{
if  (input(pin_a0)){ 
while(input(pin_a0));
x++;
if(x > 1) x = 0;
}

if (x == 1){
output_high(pin_b1) ; 
}

if (x == 0){
output_low ( pin_b1) ;
}
}
}

Hayır olmadı  aynı durum, çıkıs flasör seklinde . Bir kisi daha deneyebilimi arkadaslar bu kodu .

Cemre.

Kurduğunuz devrenin şemasını paylaşabilir misiniz?

laotzi

#12
Alıntı yapılan: Cemre. - 31 Ocak 2017, 18:49:00
Kurduğunuz devrenin şemasını paylaşabilir misiniz?
BUYRUN ;
http://i.hizliresim.com/Moro41.png

NOT: Osc'yı kadırıp denemiştim osc kullansamda  olmuyor .

Cemre.

Proteus'ta mı deniyorsunuz yoksa gerçekte mi? Gerçekte ise bu devre çalışamaz. Pull-up Pull-down meselesini araştırınız.



Buton bağlantılarınızda bu duruma dikkat etmek zorundasınız. Çünkü butona basmadığınız durumda MCU pini float durumda. Ne high ne low...

laotzi

Alıntı yapılan: Cemre. - 31 Ocak 2017, 19:12:32
Proteus'ta mı deniyorsunuz yoksa gerçekte mi? Gerçekte ise bu devre çalışamaz. Pull-up Pull-down meselesini araştırınız.

(Resim gizlendi görmek için tıklayın.)

Buton bağlantılarınızda bu duruma dikkat etmek zorundasınız. Çünkü butona basmadığınız durumda MCU pini float durumda. Ne high ne low...
Biliyorum Pull-up ve Pull-down olayını, ancak İSİS ' te  yapıyorum gerçekte denemedim . Diğer devreler çalışıyor bu çalışmıyor sizde çalışıyormu ?