Buton basılma süresine göre çıkış pinini değiştirme

Başlatan kılıckaya, 17 Ocak 2014, 18:11:21

kılıckaya

Ete Hocam,müsadenizle bir konu hakkında daha yardımınızı talep edeceğim.Yapmış olduğum buton kontrollü devrede şimdiye kadar şunu yapıyordum: Örneğin portb.4 butonuna basılı olduğu sürece while wend komutu ile portc.5 pinini lojik 1 yapıyordum. Bununla ilgili kullandığım komut aşağıdadır.

if portb.4=0 then 
PORTC.5=1
WHILE PORTB.4=0:WEND
PORTC.5=0
ENDIF

Ancak şimdi şunu yapmak istiyorum;yanlız bu işlemin while-wend ile yapılıp yapılamayacağı konusunda tereddütüm var.
portb.4 butonuna 2 sn süreyle basılacak olursa portc.5 lojik 1 olacak
portb.4 butonuna 5 sn süreyle basılacak olursa portc.4 lojik 1 olacak
Bu işlem while-wend ile mümkün müdür? Mümkün değilse while-wend kullanmadan nasıl yapılabilir?
(if portb.4=1 than portc.5=1 :pause 100 : portc.5=0 gibi)
Teşekkür ederim.


İlyas KAYA

#1
SAYAC VAR BYTE
BUTON VAR PORTB.4

CLEAR


BASLA:


IF BUTON=0 then                 'BUTON BASILDIĞINDA (PULL UP)
SAYAC=SAYAC+1                  'BİR SAYAC SAYAR
PAUSE 50                             'HER SAYIM 50 MS.

ELSE                                     'BUTON BASIL DEĞİLSE YANİ BIRAKILDIĞINDA

IF SAYAC>100-5 AND SAYAC<100+5  THEN            ' SAYAC 100 İSE VEYA 100'E YAKIN İSE (TOLERANS=250MS)  YANİ 50*100 =5000 MS = 5SN
PORTC.5=0                         ' C.5'İ KAPAT
PORTC.4=1                          'C.4'Ü AÇ
goto IFSON
ENDIF

IF SAYAC >40-5 AND SAYAC<40+5  THEN 'SAYAC 40 İSE YANİ 40*50=2000 = 2 SN YADA 2 SANİYEYE YAKIN İSE (TOLERANS 250MS) 
PORTC.4=0              'C.4'Ü KAPAT
PORTC.5=1              'C.5'İ AÇ
ENDIF

IFSON:

SAYAC=0                 'SAYACI SIFIRLA


ENDIF

GOTO BASLA




IF ler ile bu şekilde yapılabilir.Farklı yöntemlerde uygulanabilir.
Ayrıca BUTTON komutuna da bakınız.

Düzenleme: Mantık hatası vardı sanırım şimdi tamam.


Saygılarımla.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Bende şöyle yapardım;

if portb.4=0 then
WHILE PORTB.4=0
SAYAC=SAYAC+1
pause 1
IF SAYAC=>2000 THEN  PORTC.5=1
IF SAYAC=>5000 THEN PORTC.4=1
WEND
ENDIF

ETE


kılıckaya

Ete Hocam,deneme amaçlı olarak verdiğiniz şekilde komutları düzenledim ama çalışmıyor.Bir yerde hata mı yaptım? Proteus dosyasını ve PBP yazılımını ekledim. Teşekkürler.

ete

Şaka mıdır bu?
Sayac değişkeni 2000 li değerlere ulaşacağına göre byte cinsinden olabilirmi?
Üstelik led leri nereye bağlamışsın ama programda nereyi set etmişsin .
Bir işe kalkışınca biraz kafa yormak gerekir. İp ucunu aldın gerisi çok zor değildi aslında.
Biraz kafayı çalıştırmak yeterli olacak idi ama sen ne hikmetse çalıştırmamayı tercih etmişsin.
Elbette işin doğrusunu söylemeyeceğim. Kendin bulmalısın.
Bak sana iki ip ucu verdim. Kolları sıva bakalım.

Ete

kılıckaya

Ete  Hocam acemiliğime ver. Uyarılarınızı dikkate alarak hatalarımı buldum ve düzelttim.Ancak şimdi şöyle bir sıkıntı var.İlk 2 saniyede porta1 lojik 1 oluyor. 5.saniyede de porta1'i lojik sıfır yapıp porta2 yi lojik 1 yapıyorum. Ama elimi butona basılı tutmaya devem ettiğimde a1 ve a2 deki ledler sürekli olarak yanıp sönmeye başlıyorlar. Oysa benim burada yapmak istediğim 5. saniyede a2 pininin lojik1 olması ve elim butona basılı olduğu sürece lojik1 de kalması idi. Ete Hocam burada eksiğim nerededir?Dosyanın son durumunu da yükledim.

İlyas KAYA

O şekilde yapması normal biraz dikkatli incelerseniz sebebini bulabilirsiniz.
Şuan ki kodlara göre 2 sn 'sonra A1 , 5nci saniyeden sonra A2 yanar.

Sizin istediğiniz 2 saniye basık tutunca A1 ,
5 sn basık tutunca A2 yansın değilmiydi ?

Ben mi yanlış anladım.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Hatan şu satırlarda,
IF SAYAC=>2000 THEN  PORTA=%00000010 
IF SAYAC=>5000 THEN PORTA=%00000100
ilk hatalı satıra birlikte bakalım.
SAYAC değeri 2000 i aşınca PORTA=%00000010 değerini alıyor. Dikkatini çekerim pin'e değer vereceğine PORTA ya değer vermiş oldun. Sonra SAYAC değeri bu sefer 5000'e ulaşıyor ve sen PORTA ya PORTA=%00000100  değerini veriyorsun. Yine Porta değer vermiş oldun. Bir önceki yanmış ledi söndürmüş oldun zira öncekiled PORTA.1 de bağlı idi opini şimdi sıfırladın.
Ama elini tuştan çekmedin dolayısıyla program döngüsü devam ediyor. Sayac değeri 5001 oldu. İlk satırda ne vardı?
Sayac değeri 2000 ve üzeri ise portA=%00000010 olacak idi. 5001 değeri 2000 den büyük o halde PORTA.1 deki led yanacak demektir. Yanıyorda. Ama bir sonraki satır geçiyor program ve orada da;
Sayac değeri 5000 denbüyük ise bu sefer de PortA.1 deki led söndürülüyor ve PortA.2 deki led yakılıyor. Dolayısıyla Sayac değeri 5000 den büyük olduğu müddetçe ledlerin biri yanıyor hemen ardından sönüp diğeri yanıyor.
Umarım sorunu anlamışsındır. Sorun yalnızca pini set etmek yerine bütün porta değer vermiş olman.
IF satırlarını şöyle yapsan sorun olmayacak idi.
IF SAYAC=>2000 THEN  PORTA.1=1
IF SAYAC=>5000 THEN PORTA.2=1

Aslında bir önemli eksik daha var yazdıklarında. Sayac değerini hiç bir yerde sıfırlamamışsın.  Elini butondan çektiğinde Sayac diyelimki 8000 olmuştu. Yeniden aynı döngüye girdiğinde sayac değeri hem 2000'i hemde 5000'i zaten aşmış olduğu için ledlerin ikiside anında yanacaktır. O halde ne yapman lazım while döngüsüne girmeden önce sayac değerini sıfırlaman gerekir.

Buton kontrolünden sonra aşağıda yer alan;
PORTA=%00000000
komutunuda kaldırman gerek çünki bu komut ledleri anında söndürmektedir. Halbuki onunda altına bir başka satır koymuşsun ve diğer tuşa basılınca yananledleri söndürüyor zaten.
Ete

serkan

İyiki okul yıllarımda mantık dersim çok iyiydi ünvde de mantık bölümünü full yapmıştım. Meret, üç beş kod işi değilki tamamen mantık ve bulmaca işi

kılıckaya


onurinci

olduda nasıl oldu ?
forumda açıklama yapman gerekiyorki, başkalarıda faydanabilsin.

kılıckaya

Arkadaşım, en büyük hatalarımdan bir tanesi boşta bir sürü pin varken çıkışı MCLR pininden almaya çalışmışım, üstelik bu pini set etmeden yani çıkış pini olarak tanıtmadan bu işi yapmaya çalışmışım.İkinci hatam ise şuymuş: İlk 2 saniye boyunca 1. ledi yakarken 2. saniyeden sonra 1. ledi söndürmeden 1 ve 2. ledleri aynı anda bağlamaya çalışıyormuşum. Bir başka hatam ise butondan elimi çektiğimde sayacı sıfırlamamammış.Şu an hepsi düzeldi. İsterseniz yazılımın son halini de yükleyebilirim.

kılıckaya

Arkadaşlara faydalı olabilir düşüncesiyle dosyaları son haliyle yüklüyorum.

onurinci

@ kılıckaya

Klavyene sağlık,
bende bunu 12F675'e çeviriyim, 3 voltluk Button pil ile buzdolabı kapısı açık kaldı vızıldağı yapayım.

Powered by EzPortal