Pic Kontrolörlü Gömülü Sistemde, Buton Okumaları İçin, Tavsiye İstiyorum.

picmanya

Üye
Katılım
14 Haziran 2024
Mesajlar
32
Pic kontrolör kullanarak, pcb üzerindeki; 6 adet tact buton ve 4 digit seven segment display ile, bir menü programı yapmam gerekiyor.

Programda çeşitli değişkenlerin içeriğini (10 adet int tipinde değişken var.), butonlarla displayden görerek, değiştirmem-ayarlamam gerekiyor.

4 digit displeyi, timeri ayarlayarak, timer kesmesi aracılığıyla, tarama şeklinde digit-digit sürekli sürmeyi planlıyorum.

Butonları 2 şekilde okuyabilirim;

1-) main() içindeki while() döngüsü içerisinde, normal port girişleri olarak algılayıp-okumak. (kesmesiz olarak butonları okuma.)
2-) CN Giriş Pin Interrupt-Kesmesi ile; Giriş pinlerini bir kesme ile, main() dışında bir kesme fonksiyonunu içinde okuyup işlemleri, kesme içinde yapmak. (kesme içinde butonları işlemek.)

Buton girişlerini okumak için, hangisini kullanmalıyım. Bu türden bir işte hangi yöntemi kullanmak gerekir. Kısaca butonlar kesme ilemi, yoksa normal olarak mı okunup-değerlendirilse iyi oluyor.
 
Bu ik türlü de yapılabilir. Debounce denen tuş basma anında oluşan mekanik zıplamanın sebep olduğu yanlış tuş okumalarını filtrelemeyi biliyorsundur. Bunu devre üzerinde filtrelemek ya da yazılımsal olarak filtrelemek mümkün.

Debounce metoduna karar verdikten sonra, tuş okumasını timer kesmesiyle, pin change kesmesiyle veya kesme kullanmadan yapmak, sistemden beklenen tuş tepki performansıyla ve kodda bir döngünün tamamlanma süresiyle alakalı.

Döngü içinde tuş inputlarının kaçırılmasına sebep olacak kadar uzun zaman alan işlemlerin yapıldığı oluyorsa tuşların okunmasını kesmelerle yapmak daha mantıklı.

Bir de eğer zamanında yakalanması çok önemli, hızlı tepki verilmesi çok önemli olaylar varsa, bu olaylara tepki performansını düşürmemek için tuşların okunmasını döngü içinde yapmak ve bu kritik olayları kesmelerle yönetmek daha avantajlı olur...
 
Debonce olayı deneme yaparken, ilk karşılaştığım problem oldu. Tuşların okunmasının önüne 1-2 msn. gecikme vererek aşabildim. Butonların çıkışına kondansatör bağlamakda iş görüyor.

Sistemde butonlara basıldığında yalnızca buton girişleri ve 4 digit seven segment display sürmede faydalanılan timer kesmesi devrede oluyor.
Yalnızca butonlar ve diplay birlikde çalışacak diyebiliriz, butonlara basıldığında, geri kalan işlemci fonksiyonları geçici olarak bir süre durudurulacak.

Butonlara tek tıklamanın sağlıklı algılanmasında kesme girişlerinden okumak iyi gibi duruyor. Butondan parmak çekmeden ve tekrar basmadan diğer okuma işlemine geçilmiyor. Her ayrı tıklama için iyi netice alınabiliyor. Yalnız butonlara uzun süreli basılması durumunuda algılamak gerekiyor.

Bunlardan sonra ne söylenebilir? Yöntem nasıl olmalı?
 
Debonce olayı deneme yaparken, ilk karşılaştığım problem oldu. Tuşların okunmasının önüne 1-2 msn. gecikme vererek aşabildim. Butonların çıkışına kondansatör bağlamakda iş görüyor.

Sistemde butonlara basıldığında yalnızca buton girişleri ve 4 digit seven segment display sürmede faydalanılan timer kesmesi devrede oluyor.
Yalnızca butonlar ve diplay birlikde çalışacak diyebiliriz, butonlara basıldığında, geri kalan işlemci fonksiyonları geçici olarak bir süre durudurulacak.

Butonlara tek tıklamanın sağlıklı algılanmasında kesme girişlerinden okumak iyi gibi duruyor. Butondan parmak çekmeden ve tekrar basmadan diğer okuma işlemine geçilmiyor. Her ayrı tıklama için iyi netice alınabiliyor. Yalnız butonlara uzun süreli basılması durumunuda algılamak gerekiyor.

Bunlardan sonra ne söylenebilir? Yöntem nasıl olmalı?
Tam olarak burada yapmaya çalıştığını içeren bir projem var. Tamamlanmadığından tüm kodu yayınlamadım. Ben tuş okurken, tuş durumlaru için olaylar tanımladım ve bu olayları tespit edecek şekilde kodu yazdım. Bunlar, tuşa basılması, tuşun bırakılması, uzun basılması olayları idi.

Tuş yönetimini arduino'da çalışacak şekilde ayrıca paylaşmıştım. İncelemek istersen bağlantıyı paylaşıyorum.


Çok anlaşılabilir olmayabilir. Bunun kesme kullanan veya kullanmayan, timer kullanan veya kullanmayan benzer uygulamalarına denk geldim. Daha spesifik sorup kod da paylaşırsan iyi olur. Pseudo kod bile olur.
 
Butonlar için Timer kullanmadım. Ana while() döngüsü içerisinde butonlarla ilgili hiç bir şey yapmadım.

Buton programını yalnızca, CN Interrupt (Buton Giriş Kesmesi) içerisinde hallettim. İsteğimi tek bir özellik hariç karşılıyor.

Bu haliyle butonlarla değiştirmem gereken değişkenin değerini, butona sürekli basıp çekerek, yalnızca birer-birer arttırıp azaltabiliyorum.

Doğal olarak butonlara sürekli basılı tutmak iş görmüyor. Butona her bir basıp çekmede kesmeden çıkılmış oluyor. Butona sürekli basmak kesme içinde kalmayı sağlamıyor.

Şöyle bir şey mümkünmüdür?
Bu haliyle ilgili butonları sürekli basılı tuttuğumda (bu süre 2-3 saniye kadar düşünülebilir.Timer kurulabilir.) değişken değerleri birer birer değilde, 10 ar 10 ar artsın gibi bir şeyi, buton giriş kesmesi içerisinde yapmak mümkünmüdür? Buton giriş kesmesi buna müsade edebiliyormu? Bir yöntemi varmı? Bir metod tavsiyesi lazım.
Kısaca; buton giriş kesmesi içinde butana sürekli basılı tutulduğunda, değişken içeriği daha hızlı-fazla arttırılıp azaltılabilirmi?
 
Cn interrupt picte pin değişimi kesmesi için sanırım. Öyleyse bununla tuşa basma ve tuşu bırakma olayları takip edilebiliyor ve iş de görüyor. Basılı tutma durumunu yönetmek için bir timer kesmesi ayarlanabilir. Veya serbest çalışan bir timer tuş basıldığında sıfırlanarak sonra ana döngü içinde değeri kontrol edilebilir. Belirlenmiş değeri aştığında uzun basma olayı olarak değerlendirilebilir. Uzun basma olayı cn kesmesinde tuşun bırakıldığı durumda sonlandırılabilir.

Hatta uzun basma olayı için timer sayacını iki farklı değere göre kontrol edip, mesela ilk değer aşıldığında 5'er 5'er arttırırken ikinci değer aşıldığında 50'şer 50'şer arttırır... Burada ana döngüdeki tmer kontrolünün düzgün çalışması için tuş kontrol kesmesinde bir veya daha fazla bayrak değişken kullanılabilir.
 
Fikirleriniz çok iyi.

"Cn interrupt picte pin değişimi kesmesi için sanırım."
evet bu % de % doğru bir bilgi.
tek bir kesme içinde kullanılan tüm CN İnterrupt pinlerin durumu değerlendirilebiliyor.

"Öyleyse bununla tuşa basma ve tuşu bırakma olayları takip edilebiliyor ve iş de görüyor."
bu bilgiden tam emin olmamakla birlikte, sanıyorum böyle bir şey mümkün olamıyor.

Eğer bu mümkün olsaydı süper olurdu.

Çok düşük sayıda bulunan; Input Capture ve External Interrupt pin girişlerinde belki bu tarz birşey yapılabiliyor olabilir.
Tuşa basıldığı veya çekildiğini algılama, uzun basıldığını hissetme açısından.
Yalnız ben ben bunları kullanmadım. 7 butonada yetmezlerdi. Kullanılmaya çalışılsalardı, mux. - ilave devre elemanı
falan girip devre karmaşıklaşırdı belkide.

CN giriş kesmeleri ile uzun basma algılama bir şekilde yapılamazmı acaba. Bunun için, illa tuşdan baskınin kaldırıldığını anlamakmı gerekir.?
Yokmudur bir yöntemi?
 
Bu haliyle butonlarla değiştirmem gereken değişkenin değerini, butona sürekli basıp çekerek, yalnızca birer-birer arttırıp azaltabiliyorum.
Buradan debounce sorununu çözüp butonun temel işlevlerini kullandığını varsayıyorum. Bunun üzerinden devam edilebilir.

Butona basma eyleminde yönetilmesi gereken evreleri tanımlayalım. (İyice hoca havalarına girdim, artık faydalı-faydasız katlanmaktan başka seçeneğin yok).

Başlangıç butona basılması, sonra butonun zıplamasının bitip stabil hale gelmesine kadar olan süre, butonun basılı kalma süresi, butonun bırakılması. Yazılacak kodun bunu iyi yönetmesi gerekiyor. Bunun için de ölçebilmesi gerekiyor. Zıplama/bounce sorununu çözdüğüne göre geriye tuşun basılı kalma süresini ölçmek kalıyor. Bunun için de timer kullanman lazım.

Butona uzun basma durumunu yönetmek istediğinde yukarıdaki evreler değişiyor, artık butona basmak, zıplama süresi, uzun basma kabul edilecek süre, sonra da uzun basma durumunda yenileme süresi. En son da butonun bırakılması.

Buradaki evreler arasında geçişler için bayrak değişken kullanmak lazım . Buton okumasıyla yorumlanmasının yapıldığı yerlerin farklı olması da lazım, çünkü yerine göre farklı işlevleri olacak, uzun basma bir yerde sürekli arttırma komutu olabilirken, başka bir yerde iptal etmek için kullanılabilmeli, veya kayıt etmek/ onaylamak.

Örnek kodları kullanmak istemiyorsun anladığım kadarıyla.
 
En iyisi buton durumunu her 10 milisaniyede kontrol eden bir timer kesmesi ile yönet bu işi. O zaman external, pin change vs girişleri kullanmaya gerek kalmaz, her i/o buton girişi olabilir.
 
Mesela 10ms bir timer içerisinde tuş okuması yapıyor isen, 1 saniye basılı tutmada ayrı bir iş yapılsın istiyor isen, bir tuş sayacı (int) tanımla.

Kesme fonksiyonu içerisinde tuş high ise sayacı arttır. Tuş low ise sayacı sıfırla. Yine kesme içerisinde sayaç 100 e ulaştı ise uzun basma kodunu çalıştır...
 
semih_s,
Fikir değiştirip duramam, şu anda çalışmasından çok memnun olduğum, harika bir yapı var elimde.
Harici debounce buton kondansatörleri ve pull-up dirençleri gerektirmeyen bir devre yapısında,
3 adet CN girişi üzerinden, tek bir CN interrupt-kesmesi ile, 7 adet butonu bağlayıp kullandım.

Dediğim gibi sadece; butona belirli bir süre basılı tutulduğunu algılayıp değişken içeriğinin hızlı artışını ilave etmem yeterli olacak.

Mesela 10ms bir timer içerisinde tuş okuması yapıyor isen, 1 saniye basılı tutmada ayrı bir iş yapılsın istiyor isen, bir tuş sayacı (int) tanımla.
Kesme fonksiyonu içerisinde tuş high ise sayacı arttır. Tuş low ise sayacı sıfırla. Yine kesme içerisinde sayaç 100 e ulaştı ise uzun basma kodunu çalıştır...

Endorfin35+,
"Kesme fonksiyonu içerisinde tuş high ise sayacı arttır. Tuş low ise sayacı sıfırla."
CN kesmesi içinde bir while() döngüsü kullanmamımı tavsiye ediyorsunuz? Sonucda tuş bırakılmazsa CN kesmesini terketme ve bir zaman sayacını tetkle demek istediniz galiba.

şimdi ben buton okumalarını CN kesmesi ile algılayıp işliyorum, bir timer kesmesi ilede seven segment displeyleri sürüyorum.
seven segment diplayde, butonların durumuna göre, menünün durumu ve değişken içerikleri, otomatik olarak gösteriliyor-okunuyor.

tam bu noktada:
CN kesmesi içinde tuşun high ve low süresini algılamak ve burada şartlı bir while tarzı döngü kurmak gördüğüm kadarı ile mümkün olmuyor gibi duruyor.
Butonlardan birisine veya istenilen ikisine yada üçüne birden basıldığında, Cn kesmesi içinde hızlıca gerekli işlemler oluyor ve program CN kesmesini terkedip çıkıyor.
Yada displeyleri süren timer kesmesi zaten CN kesmesininden vakti geldiğinde programı çıkartıyor. display tarayan timer kesmesini durdursam display bilgi gösterimi sıkıntıya giriyor.
CN kesmesi içinde butona basılı tutulmaya devam edilirse, bu butonla CN kesmesi tekrar oluşmuyor. Zaten CN kesmeside kendiliğinden sonlanmış oluyor. Butonu mecburen bırakmak gerekiyorki, bir daha basılsın ve CN kesmesi oluşabilsin.
Hani bu butona basılı tutulduğunu, CN kesmesinden tetik alıp, main() içindeki while () döngüsünde algılayıp, ayrı bir timer ile zamanı tetiklesemde faydası olmaz gibi.
Çünkü buton bırakılıp tekrar basılmalıki CN kesmesine girilip gerekli işlemler yapılabilsin. Yoksa main () while() döngüsünede buton programı yazmak gerekir gibi duruyor. Ama benim program şu anda yalnızca CN kesmesinde bulunuyor. Çalışmasıda güzeldi.

Uzun basma zamanının ilave etsem yeterli olacaktı.

nasıl yapsak, ne uygulasak. CN kesmesi içinde oyalanmanın ve butonu bırakmadığının algılanmasının bir yöntemi yokmudur?
 
Endorfin35+,
Siz ne öneriyorsunuz? Tam anlayamadım.
CN buton giriş kesmesi içerisinde döngü olmazsa, timeri nasıl kullanacağım o zaman?
timer işlemleri CN butonların giriş pin kesmesi içinde işlem yapacak sonucda öyle değilmi? Yanlışmıyım?
Kesme içinde döngü kullanılabilirse (bunu henüz kullanamadım/denemeler yapmam gerekecek. acemilik işte, ilk kez kullandığım bir yapı bu.),
butona basılı olduğu sürece döngü ve timer birlikte çalışır ve buton bırakılmadığı sürece,
döngü içinde değişkenin değeri, timerden gelen zaman verisi ile kıyaslanarak, oransal olarak arttırılabilir.
burda timer kesmesi pasif olarak kullanılıp timer zaman değerinin artış oranından istifade edilecektir.
timeri kesmeli kullanırsak, bunun kesmesi işi bozar herhalde.
sonucda timer ksemesi işlemini CN kesmesi dışında kendi interrupt fonksiyonunda yapacak ve sanıyorum CN kesmesine tekrar geri dönmeyecektir.
Yada dönülebiliyormuki? Bu mantıkda ilerlesem nasıl olur? Bir önceki mesajınızı okuyunca, böyle bir sonuç çıkarmıştım ben.
Farklı önerilere açığım. Yöntem metod tavsiyesi yeterli olacaktır. Değerli ustalar bir el atıverin şu işe lütfen.
 
İşlemci kargocu gibidir. Elinde teslimat görevleri var, bunları sıralamış ve teslimat yapacak. Cn kesmesi, external interrupt telefonla kuryeyi arayan müşteridir. Her halükarda bu telefon görüşmesi işleyişinde yavaşlamaya sebep olur. Elinde odaklandığı işi bırakıp telefonu açması da zaman alır, görüşmesi de.

Eğer cn kesmesinde kalıp uzun basma denetimi yapmak kuryeyi arayıp "nerdesin, ben oraya gelip kargoyu alayım." Diyorsun. Kuryeyi orda bekletmek olmaz, şirket buna müsade etmez, müsade ederse daha az kargo dağıtılır. Düşük performanslı bir şirket olur.

Kuryenin aranmasına müsade etmemek de interrupt olmaması gibidir. Teslimatlar çok daha hızlı yapılır ama aciliyatı olan insanlar göz ardı edilmiş olur.

Orta yolu bulmak lazım. Kuryenin aranmasına izin verelim, ama kurye bekletilmesin, müşteri kuryeye nereye ne zaman gideceğini sorsun, kurye teslimat yaparken aciliyatı olan müşterinin işini görsün. Hem işler aksamasın, hem acil teslimatlar yapılsın.

Bu nedenle cn kesmesinde sadece bayrak kullanmak ve timer yönetmek mantıklı. Bırak işlemci displayleri sürsün. Sürerken de fırsat buldukça cn kesmesinde set edilen bayrağa ve timera baksın, gerekli şarlar oluşursa da işlemi yapsın...
 
Butona uzun basıldığını, nerede nasıl algılayıp ne yapmam gerekir, işlemler sırasını açıkça anlatacak birisi varmı?
Mevcuttaki haliyle; butonların basıldığının algılanmasının ve tüm kontrollerinin, yalnızca CN kesmesi içinde olduğunuda bilinmesi gerekir.
Şu anda tüm buton işlemleri, yalnızca CN kesmesi içinde bulunuyor. Butona uzun basıldığını nasıl-nerede algılamalıyım? Tane tane anlatılabilirse,
anlatılanları aynen uygulayabilirim.
 
Kod paylaşmıyorsun. Örnek kodu kullanmıyorsun, örnek koddan da sormuyorsun, ben anlamadım bu işi.

Bayrak kullanımını anlatayım yine.

Usta birliğinde atış eğitimi için poligona gidilir. Poligonda silahları subay hazırlar, taşimatları verir. 5-6 asker poligonda ateş edecektir, ama sadece ateş edecektir, silahla oynamayacaktır, atışları tamamladığında veya silahta bir sorun olduğunda asker sadece bayrak kaldıracak ve bekleyecektir.

Subay bayrağı kalmış olan askerle ilgilenir ve bayrak iner. Sonra kalkmış başka bayrak varsa ilgilenir ve indirir.

Bazı askerler olayı yanlış anlar, bayrağı kaldırıp indirir ve bekler. Ama o zaman, subay bayrağın havada olduğu anda başka bir şeyle ilgileniyorsa görmez.

Subay sonsuz döngüde çalışır görevleri halleder. Askerler de butonlardır. Şakın asker bozuk buton. Poligondaki peronlar da buton kontrolü yada onun gbi bir şey.

Kodunu paylaşmazsan benden bu kadar, bunun bir çeşit turing testi olduğundan şüphelenmeye başladım, bot değilsen atış eğitimi ile tuş kontrolü arasındaki ilişkiyi anlamışsındır.
 
semih_s,
Hocam, Siz darılmayın ve üzelmeyin, durduk yere birde sizi kaybetmeyeyim şimdi.
Yardımsever yazışabileceğim değerli insanları kaybetmemeliyim. Çok sevdim sizin tarzınızı ben.

Allah' ın, sizin ve diğer üyelerin yardımıyla sıkıntımı çözdüm ben. Baya yardırdım ama, işi de fıstık gibi, harika bir şekilde, tek buton için bitirdim.
1-2 saatdir deniyorum problem yok. Diğer butonlarada, bir genel fonksiyon ayarlayıp nasipse yarın kopyalarım artık.
Acemilik çok kötü birşey, birşeyi ilk kez kullanmak ve bu arada tırmalamak kadar vahim bir durum yok.
Ama istenilenler elde edilince alınan haz süper oluyor. Bu sıkıntıyıda aşdık çok Şükür.

Hoşçakalın.
 

Forum istatistikleri

Konular
6,182
Mesajlar
105,460
Üyeler
2,567
Son üye
GaziBey

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top