12F675 buton ile led yakma sorunu.

Başlatan Orxan1234, 14 Ağustos 2013, 18:50:59

metaltrrocker

Hocam basic bilmem ama genel olarak program basla etiketinin içini sürekli çalıştırdığı için anlık olarak seçilen port high mı yoksa low diye tarar.eğer butona basıldığında ledin durumunu logic olarak terslerseniz istediğiniz gibi olur. porta.0=1-porta.0 şeklinde bir yazımı vardı galiba basicde yanlışım varsa düzeltin.

ete

İşlemcinin ne kadar hızlı çalıştığını henüz kafanda canlandıramıyorsun.
Tusa basınca high şed komutu ledi yakıyor. Hemen yeni bir tarama başlayıp tusu bıraktığını görüyor ve bu seferde ;
Else
Low led
Satırları çalışıp yanan ledi söndürüyor.
Dediğin gibi çalışması için
If tus=1 then
Toggle led
While tus=1:wend
Endif
Şeklinde kullanman gerek.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Orxan1234

Çok teşekkür ederim Hocam. Bu arada Pic Basice yazdığımız her kod cümlesi pic belleginde verimi kapliyor?

ete

Elbette kaplıyor. Bu programın derlenmesi esnasında üretilen hex dosyasının boyutu ile belirleniyor. Kısa program küçük kilobyte , uzun program  büyük kilobyte anlamına geliyor. Sonuçta işin bu yanınıda gözeterek işlemci seçimine dikkat ediyoruz. Bazen yazıp yazıp sonlara geldiğinizde hafızanın dolduğunu derleyici size ikaz vererek bildirir. Yapılacak iş bir büyük kapasiteye geçmek olur.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Orxan1234

Çok teşekkür ederim  :) ALLAH razı olsun bilgi için

Kendi kafamdan bir program hazırladım.


NSEL = 0                       'portlar çýkýþ
TRISIO=%00001             '0. BIT GIRIS DÝÐERLERÝ ÇIKIÞ
CMCON=7                       'Komparator kapalý
GPIO.0=0
GPIO.1=0
'GPIO.5=0
sayi var byte


SYMBOL TUS= GPIO.0     'GPIO.0 pinine sembol ismi olarak TUS adý verildi.
SYMBOL LED= GPIO.1     ' GPIO.1 pinine sembol ismi olarak LED adý verildi.
symbol led1 = GPIO.2  
sayi = 0
basla:

pause 30
If tus =1 then 

sayi=sayi +1

endif 
pause 30
If sayi=1 then
High led 
endif

pause 60
if sayi= 2 then
sayi = 2
high led1

endif
pause 60
if sayi= 3 then
sayi = 0
low led
low led1

endif
goto basla



Sayın Hocam şimdi burada yazdığım kodda Sayi 1 olursa Led yansın 2 olursa 2ci led yansın gibi.

Şimdi butona surekli basılı tutularak bırakıldığında düzensiz çalışıyor.

Bazen  iki kez tıklandığında yanıyor bazende ikisi aynı anda yanıyor.

Acaba diyorum saat frekansına bağlı olarak.

0.0001 başlayarakmı bir değerin alıyor?

Bunu yapmanın daha iyi bir yöntemi varmıdır?

Bu arada nasıl Hocam irelileyiş varmı?  :D

ete

#20
İşlemciler tuş kontrollerinde farkı algılar. Tuş bağlanmış bir pin daima voltajın bir tarafına dirençle çekilmelidir. Çekilme yönü pozitif olacak ise tuş pini 10 k lık direnç ile +5V ta bağlanır. Bu işlem tuş pininin daima High da beklemesini sağlar. Fark oluşturmak için  tuşun bir ucu Gnd ye bağlanır ve tuşa basılınca high da bekleyen tuş pini low olarak fark oluşturur. İşlemcide bunu hemen anlar.
Bu işlemin tersi de mümkün. Tuş pini bir direç ile gnd ye bağlanır ve tus pini low da bekler tuşun diğer ucu +5V ta bağlanarak lowda bekleyen pine high verilip fark oluşturulur . Sende eksik olan budur. Senin tuş float denilen konumda olup aklına eserse low olur aklına eserse high olur. Bu nedenle sağlıklı çalışmaz.

Pic 5v ile çalışır ve led yakmak için 5v voltaj çıkartır hiç bir led direk 5v ile yanmaz. Seri, akım sınırlama direnci bağlanması gerekir ki 5 v için genellikle 220-470 ohm arası direnç kullanılır. Bunlarda eksik devrende.

Tuşa basıp bıraktığın anda sistem o kadar hızlı tarama yapar ki şaşarsın. Dolayısıyla tuş titremesi dediğimiz ve kısaca tuşun basılma anında yüzlerce kez basılıp bırakılması işlemi olarak açıklanır ve senin programının yine yanlış çalışmasına sebep olur. Üstelik sen bunu göremezsin çünki gözlerin okadar hızı algılayamaz. Bu nedenle bas bırak sistemlerde genelde tusun bırakıldığı algılanıncaya kadar program bekletilir ve tuş titremesini ortadan kaldıracak bir gecikme süresi programa eklenir. Yada tus kontaklarına 100 nf kondansatör bağlanır.
Bu nedenle doğru tuş kontrolü şöyle olmalı;
If tus=1 then
Sayi=sayi+1
if sayi=3 then sayi=0
While tus=1:wend
Pause 100
Endif
İf sayi=1 then
  Led=1
  Led1=0
Endif

İf sayi=2 then
  Led=0
  Led1=1
Endif
Goto basla


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Orxan1234

Çok Teşekkür ederim. Hocam önemli bilgiler için ALLAH razı olsun.  :)

newlife

Alıntı yapılan: Orxan1234 - 17 Ağustos 2013, 00:11:41
Evet Çok teşekkür ederim bu konu anlaşıldı.

Fakat ben yine bu İf Then komutunu tam anlamadım.

Peki neden boyle yazdigimizda

İf Tus=1 Then
High Led
Else
Low led
Endif

Tusa basarken yanir elimize cektigimizde sonuyor?
Yani neden ikinci kez tikliyarak sonduremiyoruz.

Mantigini anlayamiyorum bir turlu.

Kusura bakmayin sizide yordum.

if komutu eğer demektir.
yani yazdığın programı söyle yorumlayalım

Eğer tus değişkeni 1 olursa
led yak
değil ise
led söndür
eğer son