Buton kontrolü hakkında

Başlatan Proteus, 25 Şubat 2012, 02:28:50

Proteus

A0 PORTUNA BUTON KONTRÖLÜ YAPIYORUM İŞLEV GÖRMÜYOR NEDEN
BUTONA BASILDIGI SÜRECE ANADÖNGÜNÜN TEKRAR ETMESİNİ İSTİYORUM NERDE Bİ HATAM VAR ARKADAŞLAR ?


  TRISB=%00000000
  TRISA=%00001
  PORTB=0
  D VAR Byte
  D=0
  PORTB=0
 
  Button PORTA.0,1,254,0,D,1, mainloop
 
mainloop:
 
                    High PORTB.0;1.enjektör püskürmesi
                    PAUSE 300 ; PÜSKÜRME SÜRESİ  0.3 SN
                    Low PORTB.0
                    PAUSE 500   ;0.5 sn bekle
                    High  PORTB.1  ;2.ENJEKTÖR PÜSKÜRMESİ
                    PAUSE 300 ;2.ENEJTÖR PÜSKÜRME SÜRESİ 0.3 SN
                    Low PORTB.1
                    PAUSE 500
                    High PORTB.2 ; 3.ENJEKTÖR PÜSKÜRMESİ
                    PAUSE 300 ; PÜSKÜRME SÜRESİ 0.3 SN
                    Low PORTB.2
                    PAUSE 500               
                    GoTo mainloop

ete

Buton komutu açıklamasına bak yeniden.
Buton basıldığında alacağı konumu "1" olarak vermişsin. Ama basılmadığı zaman alacağı konumuda "1" vermişsin. Bu bir çelişkidir.
Buton basıldığında hangi lojik seviye buton pinine tatbik ediliyor ise onu ilk "1" rakamı yerine yazman ve basılmadığı zaman hangi lojik seviyede ise onuda ikinci "1" yerine yazman gerekiyor. Bu mantığa göre biri 1 iken diğeri 0 olmalı dır.

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

Proteus

denedim

Button PORTA.0,1,254,0,D,0, mainloop bu şekilde ama hala direk anadöngüye giriyor buton işlev görmüyor

ete

#3
Bu sorunun çözümünü bulmak için devre şemasıda gerekli yada ;
Buton pullup direnci ile +5V tamı bağlı yoksa Pulldown direnci ile GND mi bağlı?
Butona basınca bağlı olduğu pine ne tatbik ediyor LOW mu yoksa HIGH mı ?
Bunları bildirmen gerekiyor?

Öte yandan şayet program direk Mainloop'a atlıyor ise tuşa basılmış gibi işlem görüyordur.
Yani butona basılınca Mainloop'a git diyorsun programa. Oda gidiyorsa buton olması gereken konumda değildir.
Ne anlama geldiğini biraz daha açık anlatayım.
Buton basılmadığı sürece bir konumda beklemesi gerek. Nedir bu ? en sonda yazdığın lojik seviye demektir.
Komuta bir bakar isek,
BUTTON Pin,Down,Delay,Rate,BVar,Action,Label

Action olarak "0" yazmış isen butona basılmadığı zaman port pininde LOW okumalısın. Oraya "1" yazarsan buton pininde HIGH okumalısın.
Down yazan kısımda ise Butona basınca pine buton tarafından ne tatbik edileceği yazılmalıdır. Yani butona basılınca pin LOW olacak ise oraya "0" High olacak ise oraya "1" yazılmalıdır. Tabiiki Action buraya yazılanın tersi olmak zorunda.
Son yazdığın komuta bakar isek, Buton pini LOW da bekliyor (10K ile Pulldown yapılmış yani GND ye bağlanmış) ve butona basılınca buton pinine HIGH uygulanıyor. Doğruluğunu kontrol et.

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

Proteus

http://postimg.cc/image/87mthodxn/

devre bu a0 portuna sinyal uygulandıgında sırasıyla 0 1 2 aralarında 0.5 sn olcak şekilde roleler çekicek sinyal kesildiğinde işlem sonlanıcak. program çalışıyor fakat direk anadöngüden başlıyor a0 portuna bakmıyor herşeyde doğru neden anlamadım ?

ete

İlk verdiğin komuta bakılırsa PortA.0 da buton bağlı olması gerekiyordu. Verdiğin şemada buton falan göremiyorum!!!!!!!!!!!!!.
A portu boşta hiç bir şey bağlı değil. Yoksa ben boşamı konuşuyorum. Buton şöyle bağlı olacak şu olacak bu olacak diyorum ama senin devre şemanda ise alakasız şeyler var. Yanlış şemamı verdin yoksa.

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

Proteus

işte hocam normal olarak bağlamadım ki anadöngüye başlamasın ama yine başlıyor sinyal glince başlaması gerekiyor.

ete

İşte hatanda burada ya. Bir port pini 2 konumda bulunabilir. Ya LOW yada HIGH. Ama pini boşta bırakırsan aklına estiği yere doğru kayar.
PortA.0 pinini 10K dirençle GND ye bağla bakalım o dediğini yapacakmı. Bu normalde o pinin beklemesi gereken durumdur.
Giriş pinleri hiç bir zaman boşta bırakılmazlar. Mutlaka ve mutlaka bir yöne çekilmeleri gerekir. Tabiiki sana lazım olan yöne çekilmesi gerekiyor.
Senin durumunda LOW'a çekilmesi gerekir.

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

Proteus

hocam yine aynı pull up yaptım ben size dosyayı atiyim bi inceleyin hocam

http://www.dosya.tc/server11/5Bt1Zf/devre.rar.html

ete

Ne yapmak istediğini anlamak zor gerçekten.

Button komutunun en sonunda yer alan etiket butona basılmadığı zaman programın atlayacağı etiket oluyor.
Sanırım bunu yanlış algılıyoruz.
Bu durumda şayet butona basılınca  MAINLOOP 'a gidilsin istiyor isen programı şöyle değiştirmen gerekiyor.

@ DEVICE PIC16F84A                      'işlemci 16F628                               
@ DEVICE PIC16F84A, WDT_OFF              	'Watch Dog timer kapalı
@ DEVICE PIC16F84A, PWRT_ON             	'Power on timer açık
@ DEVICE PIC16F84A, PROTECT_OFF          'Kod Koruma kapalı
@ DEVICE PIC16F84A, XT_OSC
Define OSC 4
  PORTA=0
  TRISB=%00000000
  TRISA=%00000001
  PORTB=0
  D VAR Byte
  D=0
  PORTB=0
  pause 500
  D=0
  BASLA:
  Button PORTA.0,1,254,0,D,0,  basla

 mainloop:
 
                    High PORTB.0;1.enjektör püskürmesi
                    PAUSE 300 ; PÜSKÜRME SÜRESİ  0.3 SN
                    Low PORTB.0
                    PAUSE 500   ;0.5 sn bekle
                    High  PORTB.1  ;2.ENJEKTÖR PÜSKÜRMESİ
                    PAUSE 300 ;2.ENEJTÖR PÜSKÜRME SÜRESİ 0.3 SN
                    Low PORTB.1
                    PAUSE 500
                    High PORTB.2 ; 3.ENJEKTÖR PÜSKÜRMESİ
                    PAUSE 300 ; PÜSKÜRME SÜRESİ 0.3 SN
                    Low PORTB.2
                    PAUSE 500               
                    GoTo mainloop


Programa sigorta ayarlarınıda ilave ettim. Ayrıca bir açılış gecikmeside ekledim.
Bu hali ile işini görecektir.

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

Proteus

hocam verdiğiniz program doğru fakat heralde ben ne yapmak istediğimi anlatamıyorum :)
hocam butona basıldıgı sürece mainloopa nasıl dallandırabiliriz tek basıldıgında değil

Proteus

tamamdır protonla sorunu çözdüm