avatar_Adem AYDIN

C Dili İle Nota ve Kara Şimşek (Çalışıyor)

Başlatan Adem AYDIN, 09 Aralık 2016, 00:28:30

Adem AYDIN

Herkese merhaba programın şu şekilde çalışmasını istiyorum ama yapamadım yardımcı olurmusunuz?

While(81)
Portb=1 ve tuş tarama
Portb=2 ve tuş tarama
Portb=4 ve tuş tarama
Portb=8 ve tuş tarama
Portb=16 ve tuş tarama
Portb=32 ve tuş tarama
Portb=64 ve tuş tarama
Portb=128 ve tuş tarama
Portb=64 ve tuş tarama
Portb=32 ve tuş tarama
Portb=16 ve tuş tarama
Portb=8 ve tuş tarama
Portb=4 ve tuş tarama
Portb=2 ve tuş tarama


Tuş taramada da yapılması gereken işlem uzun 8 buton var onlar porta'ya bağlı 628a kullanıyorum butonları keypad (tuş takımı) gibi kullanıyorum.
Yani ilk 4 butonun her bir bacağı birbirine bağlı ve bu porta.0a

Son 4 butonun her bir bacağı birbirine bağlı ve buda porta.1e bağlı.
Butonların diğer uçları ise 2li olarak bağlı bunlardı sırası ile porta.3, porta.4 porta.5 ve porta.6ya bağlı.

Butona basılmadığı zaman ledler kara şimşek yapacak butona basıldığında ilgili led yanacak örneğin 1. Butona basılı ise portb=1 olmalı ve komutla do sesi çıkmalı. 8. butona basılı ise portb=128 gibi elimizi çektiğimizde ise karaşimşek kaldığı yerden devam etsin istiyorum. Bunu nasıl yapabilirim?
Ses olayında sıkıntı yok sadece bu kara şimşekle beraber olmuyor. Bunu yapamadım yardımcı olursanız çok teşekkür ederim.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Adem AYDIN

Yani özetle butona basıldığında hem ilgili led yanacak hem ilgili ses çıkaracak, basılmadıgı durumda ledler kara şimşek yapacak.
8 butonun her birinde farklı ses ve farklı led yanıyor.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

ete

Şema olmadan işin hacmi kafada canlanmıyor. Bir şema eklemen gerekir.
Diğer taraftan bir pin in hem tuş kontrolü için giriş hemde led yakma için çıkış olarak kullanılması gerekir. Bu iş ancak zaman paylaşımı yapılarak sağlanabilir. Ancak tuşların çalışabilmesi için pullup yada pull down dirençleri olması gerekir. Bu dirençler ledlerin çalışmasını etkilememelidir. Bu nedenle nasıl bir şema uygulanıyor görmek gerek.
Geçmişte benzer uygulamalar yaptım merakımdan dolayı. Port pini görsel anlamda öncelikli olarak led çıkışına dayalı çalışması gerekirki led  yakma görüntüsü bozulmasın. Ama bir anlık ilgili pin giriş yapılarak tuşa basılıp basılmadığıda kontrol edilmeli ve gecikme olmadan tuş tekrar çıkış yapılmalıdır. Bu şekilde olabilir ama ne kadar sağlıklı olacağı şemaya bağlı.

Ete

Adem AYDIN

Hocam dosyayı ekleyeyim. Birde butonlara if şartını mı koyayım while mi?
(If ile yazdığında program if içerisinden çıkıyor sanırım?)
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Adem AYDIN

Her iki şartta ses bozuluyor galiba, bekleme süresi koymalıyım sanırım?

Birde ilk çalışmada ledler hızlı olarak geçiş yapıyor sonra yavaşlıyor?

Bu ledlerin birde geri gelmesini istiyorum tek yönde yapmak istemiyorum karaşimşek yapmak istiyorum ama yapamadım yardımcı olurmusunuz?
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

ete

Şemayı görünce anlatılanla yapılan arasında fark olduğunu gördüm. Düşüncem şu, bu sistemin sağlıklı çalışmasını beklemek fazla iyimser düşünmek olur bence. Sebeplerini aşağıda açıklamaya çalışıyorum.
1. Ses süresi 350 ms den kısa değil bu durumda her tuş kontrolü için mutlaka 350 ms geçmesi gerekecek demektir.
    Bu tuş kontrolünün gecikmeli olarak yapılacağı anlamına gelir. Belki tuşa basarken bunu hissetmezsin ama arada bir hissedeceğin kesin bence.

2. Tuşa basınca bırakıncaya kadar bu seferde hem tuş sesi hemde tuşun bırakılma peryodu kara şimşek modununda gecikmeler yaratacaktır.

3. Tuşa basılınca Bileri değişkenine PORTB ye verdiğin değeri vermediğin için ledlerde atlama meydana geliyor. Tuş kontrolünde PORTB=2 diyeceğine Bileri=2 demen bence daha doğru sonuş verir diye düşünüyorum.
Tuş kontrolünde While komutu kullanırsan programı tuşa basılı tuttuğun müddetçe oraya hapsedersin buda ledelrin sağlıklı çalışmasını engeller. Tuş kontrolünden mümkün olduğunca çabuk ayrılman gerek bu nedenle sadece if komutunu kullanman bence daha doğru olur.

4. Diğer bir sorunda ledlerin istenildiği gibi çalışmaması. Ledler portb.0 dan başlayıp PortB.7 ye kadar yanarak gelmeli sonrasında aynı yerden bu seferde geriye doğru gitmeli. Bu durumda YON isimli bir flag (bit değişkeni) kullanman işi çözebilir.
YON=0 iken sistem B0 dan B7 ye doğru ilerler, B7=1 olduğunda YON=1 olur ve bu seferde B7 den B0 a doğru ilerler.
Yukarı giderken Bileri=Bileri*2 , geri gelirken Bileri=biler/2 formülleri kullanılmalıdır.

Birde tuş kontrolünü TMR0 kesmesi ile yaparak denemek lazım. belkide daha iyi sonuç alınabilir. Pek sanmıyorum ama denemekten de zarar gelmez her halde. TMR0 sayacını her 100us de bir kesme yaratacak şekilde kurmak ve tuş kontrolünü tamamen kesme içine almak gerekir.

Ete



Adem AYDIN

Hocam çok teşekkür ederim yazınızın hepsini okudum.
Ben programın şu şekilde çalışmasını istiyorum.

1. Butona basıldığında portb=1 ve do sesi
2. Butona basıldığında portb=2 ve re sesi
3. Butona basıldığında portb=4 ve mi sesi
4. Butona basıldığında portb=8 ve fa sesi
5. Butona basıldığında portb=16 ve sol sesi
6. Butona basıldığında portb=32 ve la sesi
7. Butona basıldığında portb=64 ve si sesi
8. Butona basıldığında portb=128 ve do1 sesi

bunlar butonların yapacağı iş bunlardan hangisine basılırsa onu yapacak.
Yaptığı işlem bitince kara şimşek en son hangi ledi yaktı ise oradan devam edecek. Bunu yapmak istiyorum.

Tuşa basılı olduğu sürece, kara şimşek yapma işlemi duracak. Işlemleri yapınca kaldığı yerden devam etmeli.

İşte bunun için ifmi whilemi kullanmalıyım? Çok soru sordum karıştı sanırım.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Adem AYDIN

#7
Aslında kesme işi ile istediğim gibi çalışır sanırım, ama c dilinde bildiklerim çok az lcd bile bilmiyorum. Kesme yapamam malesef ama yapabilirsem sorunsuz çalışır sanırım.
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

ete

Tuşa basınca ledlerin duraksaması sorun olmayacak ise kesme kullanmaya gerek yok.
Bu durumda direk WHILE TUS1=0 diye komutu kullanabilirsin. Tuşu basılı tuttuğun müddetçe nota sesi tekrarlanır ki onadabir çare bulmak lazım bir kere vermesi yeterli bence o sesi. Tuşu bırakınca normal karasimsek çalışma fonksiyonu devreye girer.

Yazdığın kodlar zaten hangi tusa basılmış ise ona ait PORTB. pinini aktif ediyor ve bırakınca kaldığı yerden devam ediyor. Ben bu görüntüyü sevmedim ama madem öyle istiyorsun kodu öyle bırak zaten istediğin gibi çalışıyor.
Sadece ledlerin geriye akışı eksik onunda nasıl olacağını anlattım zaten.

Ete

Adem AYDIN

Bölme işini şu şekilde mi yapmalıyım?

If(yon==0)
portb=bileri
bileri=bileri*2
delay_ms(200)

If(bileri==128)
yon=1

If(yon==1)
bileri=bileri/2
portb=bileri
delay_ms(200)

If(bileri==0 yada 1) emin değilim
Yon=0
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

ete

Eksiklerin var. Fazlalık da var tabiiki. O 200 ms delay orada ne işine yarıyor sana gecikme sorunu çıkarmaktan başka?
Ledlerin yanma aralığındaki gecikme ise kalabilir değilse sil o gecikmeyi.
Öncelikle sayının 128 e ulaşıp ulaşmadığına bakman gerek. C dilinde değişkenler bildiğim kadarı ile INT8 yada INT16 olarak tanımlanıyor. Değişkenin INT8 ise hiç bir zaman değeri 256 ya ulaşmaz. Sayı 128 den sonra otomatikman değeri sıfır olacaktır.
Bu durumda öncelikle program YON=0 olarak başlamalı.
Programda Bileri=1 ile başlamalı
ana program kısmında;
Önce sıradaki lede yan emrini ver  PORTB=BILERI
ardından Yon değerine bağlı olarak komutları ver.
IF YON=0 THEN
   BILERI=BILERI*2
   IF BILERI=0 THEN
      YON=1:BILERI=128
   ENDIF
ENDIF

IF YON=1 THEN
   BILERI=BILERI/2
   IF BILERI=0 THEN
      YON=0:BILERI=1
   ENDIF
ENDIF

gerekirse bu konuma gecikme koy
tekrar başa yönlendir sen sonsuz döngü ile yönlendiriyorsun.
Matematiksel işlemlerde (Integer matematiği) byte değişkeni değeri 128 iken 2 ile çarpılırsa değeri 256 olamaz çünki 256 9 bitlik bir değerdir ve 16 bitlik sınıfa girer. Bu durumda değer sıfırlanır. Bu senin yön değiştirme ip ucun olacaktır.

Benzer şekilde sayıyı sürekli 2 ye bölersen bir noktadan sonra değeri sıfır olur buda geri gelirken yön değiştirme ip ucun olacaktır. Bu ip uçları yukarıda uygulanmıştır.

Ete


Adem AYDIN

Hocam dediklerinizi yaptım. Programın bir yerinde sorun var sanırım benim pc'de böyle görünüyor hepsi ekle bir bakarmısınız?
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Adem AYDIN

Birde bu sorum var bu ne hatası simülasyonda çalışıyor?
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

ete

Çıkan bir hata değil ikaz dır sözkonusu değişkenler programda hiç kullanılmadı diye seni ikaz ediyor. Demekki gerekli değilmiş sil onları gitsin.

Alıntı YapHocam dediklerinizi yaptım. Programın bir yerinde sorun var sanırım benim pc'de böyle görünüyor hepsi ekle bir bakarmısınız?
dediklerimi yaptığını düşünmiyorum.
Ben sana yol gösteriyorum ama sen bildiğini okuyorsun. Sana izah da ediyorum. 8 bitlik byte değişkeni değeri 128 iken 2 ile çarparsan değeri 128 den büyük olmaz 128 den küçük olur çünki değeri sıfırlanır. Bunedenle ben IF Birileri=0 ise diyorum sen ise if(bileri>=128 şeklinde kullanıyorsun neden?
Programın bir yerinde sorun var diyorsun ama sorunun ne olduğunu açıklamıyorsun.  Ben nasıl bulacağım o sorunu?
Açıklarsan ilgilenirim. Muhtemelen dediklerimi yapmamandan kaynaklanan bir sorundur zaten.

Ete



Adem AYDIN

Hocam programda bileri=128 olduğunda artık 2 ile çarpma işlemine gitmiyor.
Programın bir yerinde sorun mu var derken attığım videoda ilk 2 led yani portb=1 ve çok kısa yanık kalarak portb=2 ve buda çok kısa olarak yanık kalıyor. Ilk çalışmada böyle görünüyor sonraki tekrarda ise normal sürede diğerleri kadar yanıp sönüyor. Ilk başta neden böyle yapıyor, sorun simülasyondan kaynaklımı?
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Powered by EzPortal