Ccs ile tek buton 4 led

Ayinesi koddur kişinin lafa bakılmaz ;-)

Arduino ile 3 ışık kullanarak yazdım. Görünsün diye de 3 kez tekrarlattım.

C++:
int girisDugmesi = 12;
int kirmiziIsik = 4;
int beyazIsik = 7;
int yesilIsik = 8;

unsigned int sayac = 0;
unsigned int dordeBolumdenKalan = 0;

void birKezBasildi()
{
    // Sadece görünsün diye 3 kere tekrarlattım
    for (int i = 0; i < 3; ++i)
    {
        digitalWrite(kirmiziIsik,HIGH);
        digitalWrite(beyazIsik, HIGH);
        digitalWrite(yesilIsik, HIGH);
        delay(2000);
        digitalWrite(kirmiziIsik,LOW);
        digitalWrite(beyazIsik, LOW);
        digitalWrite(yesilIsik, LOW);
        delay(2000);
    }
}

void ikiKezBasildi()
{
    for (int i = 0; i < 3; ++i)
    {
        digitalWrite(kirmiziIsik,HIGH);
        digitalWrite(yesilIsik, HIGH);
        delay(3000);
        digitalWrite(kirmiziIsik,LOW);
        digitalWrite(yesilIsik, LOW);
        delay(3000);
    }
}

void setup()
{
    Serial.begin(9600);
    pinMode(girisDugmesi, INPUT);
    pinMode(kirmiziIsik, OUTPUT);
    pinMode(beyazIsik, OUTPUT);
    pinMode(yesilIsik, OUTPUT);
}
void loop()
{
    int okunan = digitalRead(girisDugmesi);

    if (okunan)
    {
        ++sayac;
        dordeBolumdenKalan = sayac % 4;

        if (dordeBolumdenKalan == 1)
        {
            birKezBasildi();
        }
        if (dordeBolumdenKalan == 2)
        {
            ikiKezBasildi();
        }
    }
    Serial.println(okunan);
    delay(1);
}

Yani 3 kere basmak istesem, bu kodla 1 ve 2 nolu işlem de yapılmaz mı?
Yapılır ama soruda bunu sorduklarını düşünmüyorum. O zaman açıkça örneğin düğmeye 3 kez üst üste basıldığında 1 ve 2. işlem yapılmayacak diye bir ifade kullanmaları gerekirdi.
 
Bu kodun calismayacagi çok bariz ortada. Basıldı bırakıldı ve timeout olmadan hiçbir kod bu problemi sağlıklı cozemez

Kod:
main()

{



while(1){

sayac=0;



if(input(buton)){

timeout1=4000;





while(timeout1){

    

      timeout2=500;

      while(input(buton) && timeout2-- )

                    {

                    timeout1--;delay(1);

                    }

      sayac++;

      if (!timeout2) goto degerlendir;

    

      timeout2=500;

      while(!input(buton) && timeout2--)

                    {

                    timeout1--;delay(1);

                    }

                  

                  

      if (!timeout2) goto degerlendir;

    

              

                }

              

      }

              

  degerlendir:

 

  if (sayac) yak(sayac);

 

  }

    

}
Ana kod kabataslak böyle olabilir. Denenmedi, ayaküstü cepte yazıldı.
 
Bu kodun calismayacagi çok bariz ortada.

@silvestir kodu denemeden yorum yapıyorsunuz. Ama uygulamanın denenerek gönderildiğini hiç düşünmüyorsunuz.

yeni baslayanlarin yaptığı en büyük düşünsel hata işlemcinin insan gibi yavaş davrandığını ve bazen durduğunu düşünmeleridir.

Herhalde µ denetleyiciyi kast ediyorsunuz.

O zaman biraz teknik konuşalım.

sr_mandal.png

Bu SR diğer bir ifadeyle sıfırla bir yap türünde bir mandal ("latch") Bazılarının zannettiği gibi bir madala saat sinyali eklemek onu iki durumlu ("flip flop") yapmaz.

Konunun teknik detayları burada gayet güzel izah edilmiş.

Mandal ismini de herhalde sırf bu en sondaki ve değil kapılarının görünümü mandala benzediği için vermişler.

Burada sıfırlayı (R) kaldırıp, bir yap (S) yerine tek bir veri girişi (D) olacak şekilde bir düzenleme yapar, R girişine de bu işaretin tersini verirsem D türü bir mandal elde ederim.

dmandal.png

Bu hala bazılarının port diye isimlendirdiği giriş çıkış kapıları için temel bir yapıtaşı oldu mu? Hayır olmadı.

Ama iki tane D türü mandal kullanır ve saat sinyalini ikinciye tersleyerek gönderirsem D türü saat sinyalinin kenarıyla tetiklenen iki durumlu ("flip flop") elde etmiş olurum.

dflipflop.png

Bu iki durumlulardan 8 tane kullanırsam 8 bitlik bir yazmaç elde etmiş olurum. Bunlar dış dünya ile iletişim kuracaksa üç durumlu ("tristate") vs kullanılarak bağlanıyor.

Böylece bazılarının port diye isimlendirdiği giriş çıkış kapısı elde etmiş oluyoruz. Örneğin bu resim PIC16F18875'in kılavuzu 12. bölümde giriş çıkış kapılarının anlatıldığı bölümden alındı.

8bitport.png

Buradaki üçgen işaretin zamana göre değişen bir sinyal (saat sinyali) olduğunu gösteriyor.

@silvestir görüldüğü gibi burada zaten bir zamanlayıcı var. Böyle basit bir uygulama için ek bir zamanlayıcıya ihtiyaç olduğunu düşünmüyorum.

Eğer o zamanlayıcıları anahtar sıçraması için kullanıyorsanız, aslında bunun donanımsal olarak da çözülebileceğini bilmeniz gerekir.

Yukarıda paylaştığım kod örneğine dönecek olursak daha da iyileştirmeler yapılabilir.

Ama bu kısmı soruyu soran öğrenci arkadaşlara bırakıyorum.

Örneğin bir işlem devam ederken tekrar düğmeye basılırsa ilk işlemi bırakıp, ikinci işleme geçmesi isteniyorsa kesme kullanmak düşünülebilir.

Öğrenci arkadaşlara sorunun çözümünü yapıp göndermektense, çözüm yolu göstermenin daha faydalı olduğunu düşünüyorum.
 
Bilgi kirliliği yapmayalim
 
@silvestir senin 'bilgi kirliliği' diye nitelendirdiğin bilgiler üniversitelerde sayısal elektronik derslerinde öğretilen bilgiler.

Tabi anlamadan, kodu denemeden yorum yazmak kolay.

Bilgi sahibi olmadan fikir sahibi olan, bilgisini yazdığı yanıtlarda ya da örneklerde gösteremeyip de 'bilgisi kendinden malum' insanlara yanıt yazmaya çalışıyoruz.
 
Adam ne soruyo sen ne anlatıyorsun arkadaş.
 
Ben onları soruyu soran arkadaşa değil sizin 'yeni başlayan' yorumunuza istinaden yazdım.

Soru şu 4 tane durumumuz var. Düğme 0, 1, 2 ve 3 değerleri alıyor. Düğmeye her basışta düğme bu durumlar arasında geçiş yapacak. Böyle bir örnek için zamanlayıcı kullanmaya gerek var mı?

Kaldı ki benim Arduino üzerinde denediğim örneği, denemeden çalışmaz diyorsunuz.
 
30 yıldır kod yazıyorum, gördüm mü anlarım calisir mi çalışmaz mi. Senin kod ile düğmeye basıldığı gibi sayaç 500 olur. Olayı bilmediğin belli ve hala.uzatiyorsun. cep telefonunda öğrenmek isteyen birine yardımcı oluyoruz burada kod mu calistiracam..
 
30 yıldır kod yazıyorum, gördüm mü anlarım calisir mi çalışmaz mi. Senin kod ile düğmeye basıldığı gibi sayaç 500 olur.

İstersen 50 yıldır kod yaz, ama bu örnek çalışıyor.

Denemesi bedava ;-)

Eğer çalışmıyor diyorsanız nerede hata olduğunu izah etmeniz gerekir.

Zaten yorum yazmak için harcadığınız bunca zamanı basitçe kodu denemek için harcasaydınız, herhalde çalışıp, çalışmadığı ortaya çıkardı.
 
Konu sahibi arkadaş bir şekilde çözüme ulaşsa da tartışma sona erse diyorum. Gerçi tartışma da doğruya ulaşmanın bir yolu. Unutulmamalı ki her sorunun birden çok çözümü olabilir.;)
 

Forum istatistikleri

Konular
128,125
Mesajlar
915,238
Kullanıcılar
449,837
Son üye
betül hüsrevoğlu

Yeni konular

Geri
Üst