led yakıp söndürme problem

Başlatan berkay_yalan, 15 Ocak 2009, 00:29:24

berkay_yalan

rb1 de ki butona basınca rb0 da ki led yanar. Yanlız şu problem beni rahatsız ediyor buton basılı değilken led hızlı bir şekilde yanıp sönüyor yani gündüz belli olmaz diyebilirim.

DEFINE BUTTON_PAUSE 50 'ARK SÖNDÜRME GECİKMESİ 50mS FAKAT İŞE YARAMIYOR SANIRIM.

TRISB=%00000010
PORTB=0

BASLA:

GOTO BUTON

BUTON:
 if PORTB.1=1 THEN
   GOTO LEDKONTROL
 ELSE
   GOTO BUTON
LEDKONTROL:
   PORTB.0=1
   PAUSE 50
   PORTB.0=0
 ENDIF
GOTO BASLA

END




dosya isterseniz yükleyebilirim.

ete

Önce gördüğüm hataları belirteyim.
Define komutu BUTTON komutuna ait olup o komutu kullanırsan geçerli olabilir. Olabilir diyorum çünkü hemen hiç kullanmadığım bir komut.
Başla satırından sonra hemen GOTO BUTON diye bir komut vermişsin.
Bu yere düşen birine aman dikkat düşebilirsin demek gibi bir şey. Sen o komutu oraya yazmasan da program  Buton etiketine gidecek zaten. Basic  programları satır takip eder. Satırlarda goto , gosub call gibi dallanma yada atlama komutları olmadığı müddetçe bir sonraki satıra otomatik geçer. Bu nedenle yazdığın Goto Buton satırı lüzumsuz bir komut.

If, bir durum kontrol komutudur. Seninde yaptığın bu zaten Buton'a basılmışmı basılmamışmı onu kontrol ediyorsun. Kontrol komutunun iki konumu vardır. Kontrolun doğru olduğu (butona basılmış) ve yanlış olduğu (Butona Basılmamış) konumlar.
Şimdi senin programda Butona basılmış ise Led_Kontrol'a gidilecek, basılmamış ise yeniden başa dönülüp buton kontrolu yinelenecek. If kontrolünü sonlandıran ise ENDIF komutu olup bunun koyulacağı yerde önem arz eder. Şayet Else komutu kullanılıyor ise Else alternatifini değerlendirecek komutlardan hemen sonra Endif koyulup if komutu sona erdirilmelidir. Aksi taktirde senin başına gelenler meydana gelir.

Bakalım programına;
DEFINE BUTTON_PAUSE 50 'ARK SÖNDÜRME GECİKMESİ 50mS FAKAT İŞE YARAMIYOR SANIRIM.

TRISB=%00000010
PORTB=0

BASLA:

GOTO BUTON

BUTON:
 if PORTB.1=1 THEN
   GOTO LEDKONTROL
 ELSE
   GOTO BUTON
LEDKONTROL:
   PORTB.0=1
   PAUSE 50
   PORTB.0=0
 ENDIF
GOTO BASLA

END


Senin programda if komutu nerede bitmeli bu açıklamalara göre, tabiiki ;
Else
Goto Buton
komutlarından hemen sonra artık if komutu sonlandırılmalıdır.
Bu durumda programın doğru şekli şöyle olmalı;
TRISB=%00000010
PORTB=0

BASLA:

BUTON:
 IF PORTB.1=1 THEN
   GOTO LEDKONTROL
 ELSE
   GOTO BUTON
 ENDIF

GOTO BASLA

LEDKONTROL:
   PORTB.0=1
   PAUSE 100
   PORTB.0=0
GOTO BASLA

END


Ama ben olsam şöyle yazardım;
TRISB=%00000010
PORTB=0

BASLA:

IF PORTB.1=1 THEN LEDKONTROL

GOTO BASLA

LEDKONTROL:
   PORTB.0=1
   PAUSE 100
   PORTB.0=0
GOTO BASLA


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

ilker_32

220R direnç bağlı mı? Eğer 220R direnç değerinde titreme oluyorsa direnç değerini az daha yükselt.

Yada kararlı olması için,

degisken var byte
..
.


basla:
button portb.1,1,254,0,degisken,dongu
goto basla
dongu:


yukarıdaki kodlar gayet kararlı çalışmaktadır.

berkay_yalan

Sağolun o zaman if then ile kararlı çalıştıramıyoruz. Çünkü if then ile yaptığımız tüm led yakıp söndürme kodları doğru düzgün çalışmamakta.

ete

If bir şart komutudur ve mantıksal bir kullanım şekli vardır. Türkçesi "eğer" demektir.  Şartı doğru verirsen programda doğru çalışır.
Alıntı Yap
"if then ile kararlı çalıştıramıyoruz. Çünkü if then ile yaptığımız tüm led yakıp söndürme kodları doğru düzgün çalışmamakta."
Öyle kestirip atıp başkalarınıda yanlış yönlendirmen doğru değil.
Buraya, kendi adına  if Then kullandığım kodları doğru dürüst çalıştıramıyorum demen daha doğru olurdu.

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

berkay_yalan

kusura bakmayın sanırım bir yanlış anlaşılma var demek istediğim if then ile bir butonu kontrol edebiliyoruz devre kararlı çalışıyor ama nedendir anlamadım led hafifce yanıp sönüyor ve kitaptan buton komutu ile ilgili bir örnek calışma yaptım boyle sorun olmadı direnc led icin sart ama bunun direncle ilgisi olmaması gerek değilmi yani sizin kod ile benim kod ayni calisiyor buton basili değilken led hızlı sekilde neden yanip sonüyor?

ete

Berkay,

Üşenmedim devreyi board üzerinde kurdum ve hiç de senin dediğin gibi çalışmadığını görüyorum. Normal çalışıyor. Led de kırpışma falan yok.
Senin devrende bir hata olması gerek. Pic bozuk olabilir.

Üstelik bir deneme daha yaptım. Yukarıda İlker'in verdiği komutu deneyeyim dedim ama baktım hata var. Komut 7 parametreli olması gerek 1 parametre eksik yazılmış Bu hali ile o komutunda çalışması imkansız. Doğrusu şöyle olacak; (ACtion parametresi atlanmış)
button portb.1,1,254,0,degisken,1,dongu
Bu komutlada güzel çalışıyor. Ama aralarında bir fark var.
BU fark kullanana göre iyide olabilir kötüde.
If komutu kullanırsan butona basıldığı sürece led yanıp kalıyor. Butonu bırakınca led sönüyor. Bu zaten istediğimiz şey.

Button komutunu kullanınca butona basılınca led yanıyor ancak basılı tutmaya devam edince yanıp yanıp sönüyor. Bu komutun özelliği nedeni ile  verilen debounce gecikmesinden kaynaklanıyor.

Diğer önemli bir fak da programı derlerken kullanlan word sayısı.
If komutu kullanılır ise 55 word
Button komutu ile 104 word.
Arada bariz bir fark var. Bu ne demektir.  If komutu ile çalışan program daha hızlı çalışıyor demektir. Birisi 104 bayt lık program parçası kullanırken diğeri 55 bytlık kullanmaktadır.

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

berkay_yalan

o zaman donanımı tekrar gozden gecirmem gerekecek yorumlarınız icin sagolun.