tek buton iki işlem için nasıl kullanılır?

Başlatan fishbones, 11 Ağustos 2004, 00:31:48

fishbones

Herkese merhaba pic programlama konusunda yeniyim ve picbasic kullanarak bu işe başladım. Tek buton kullanarak birden fazla işlem yapamıyorum, bu konuda bana yardımcı olabilirmisiniz.

Projenin içeriği şu: 1 buton,2 sınır anahtarı, 1 DC motor ve 2 role
yapmak istediğim butona basıldığında role çekecek ve motoru ileri doğru ileride sınır anahtarına kadar enerjilendirecek, tekrar basıldığında motor geri hareket edecek ve geride sınır anahtarına kadar motoru geri enerjilendirecek.

Bu kısımda bir sorun yok yaptığım program düzgün çalışıyor fakat motor hareket ederken sınır anahtarını görmeden butona tekrar basıldığında motor duracak, butona ikinci kez basıldığında ise bir önceki hareketin tersini yapacak. Bu işlem için kurdğum döngülerin içine butona tekrar  basıldığını dorguladığımda pic sapıtıyor. Örneğin roleyi çekmiyor her zaman bu hatayla karşılaşmıyorum mesela devreyi 8-10 kez resetlediğimde böyle bir sorun çıkıyor.

Kodlar aşağıdadır yardımlarınızı bekliyorum, dediğim gibi yeni başladım bu sorunla karşılaşınca internette bu forum'u buldum ve hemen üye oldum. Sizin projeler yanında çok basit kalıyor ama  :D ileride daha ciddi projelerle görüşürüz inşaAlah...

Program kodları:

Symbol Bt_ackapa  = PORTA.0   'start-stop butonu
Symbol Swc_acik    = PORTA.1   'kapi acik swici
Symbol Swc_kapali = PORTA.2   'kapi kapali swici

Symbol Role_kapali   = PORTB.2     'kapatma yon rölesi
Symbol Role_acik   = PORTB.3     'acma yon rolesi

Basla:
If Swc_acik=0 and Swc_kapali=1 Then Goto Kapat
If Swc_acik=1 and Swc_kapali=0 Then Goto Ac
If Swc_acik=1 and Swc_kapali=1 Then Goto Ac
If Swc_acik=0 and Swc_kapali=0 Then Goto Ariza
Goto Basla

Ac:
  If Bt_ackapa=0 Then Goto Ac_basildi
  Goto Ac
 
Ac_basildi:
  If Bt_ackapa=1 Then  
         High Role_acik
         Goto Ac_birakildi
  Endif
  Goto Ac_basildi
      
Ac_birakildi:
 If Bt_ackapa=0 Then
    Low Role_acik
   Goto Kapat
Endif
If Swc_acik=0 Then
    Low Role_acik
    Goto Kapat         
Endif
Goto Ac_birakildi

Kapat:
  If Bt_ackapa=0 Then Goto Kapat_basildi
  Goto Kapat
     
Kapat_basildi:
 If Bt_ackapa=1 Then
     High Role_kapali
     Goto Kapat_birakildi
 Endif
 Goto Kapat_basildi

Kapat_birakildi:
  If Bt_ackapa=0 Then
      Low Role_kapali
      goto Ac
  Endif
  If Swc_kapali=0 Then
     Low portb
     Goto Ac
  Endif
  Goto Kapat_birakildi                            
Acaba bir mantık hatasımı yapıyorum. Bir buton ile bunu yapabilmem mümkün mü? örnek kod yada bu konuda bilgi alabileceğim link biliyor musunuz?

Şimdiden teşekkür ederim. Hepinize projelerinizde başarılar

mmengi

Alıntı yapılan: "fishbones"Örneğin roleyi çekmiyor her zaman bu hatayla karşılaşmıyorum mesela devreyi 8-10 kez resetlediğimde böyle bir sorun çıkıyor.

Dostum dediklerinden ben senin programında değilde hardware kısmında hata yaptığın kanatindeyim.programını incelemedim ama pic eğer sapıtıyorsa sorun bu röle yada kontaktör üzerinden yayılan parazitler yüzündendir. Pic in sürdüğü röle üzerine ters bir diod ve rölenin güç kontaklarınada uygun bir kapasitör ile bir dene ve pic in beslemesi motor çalıştığında oluşan parazitlerden etkilenmeyecek şekilde olmalı. Bu konu daha önce incelenmişti sitede bir arama yaptır.

fishbones

Cevap için teşekkürler "mmengi" haklı olabilirsiniz ancak picin çıkışı optokuplör ile yalıtıldı, röle ve transistörlerde ters diotlar var besleme girişlerinde 100nf kondansatörler. Devre olabildiğince yalıtılmış durumda.

Ama demiş olduğunuz gibi donanımsal bir problem olsaydı aşağıda tekrar bahsettiğim sorgudan önce neden son derece kararlı çalışıyor? ve yaptığım program düzgün çalışıyor fakat motor hareket ederken sınır anahtarını görmeden butona tekrar basıldığında motor duracak, butona ikinci kez basıldığında ise bir önceki hareketin tersini yapacak. Bu işlem için kurdğum döngülerin içine butona tekrar basıldığını sorguladığımda pic sapıtıyor.

Devreyi rolesiz sadece led ile kullandığınızdada aynı problem devam ediyor. Sınır anahtarlarına göre çalışmada hiç bir problem yok. Sorun role cekili durumdayken (yada led yanıyorken) butonu tekrar kontrol etmeye çalıştığımda problem çıkıyor. Rica etsem kodları bi kontrol edip mantıksal bir hatam var mı ona bi bakabilirmisiniz?

Benzer kod örneği yada linki varsa gönderirseniz bi incelemek isterim

Teşekkür ederim kolay gelsin

ods

Butonun durumunu kontrol ettiğiniz satırlardan sonra bir miktar gecikme koyun. Butona basılırken veya bırakırken oluşan parazitler sebebiyle, programınız, butona bir kez bastığınızda dahi birkaç kez basılmış gibi algılayacaktır. Bir miktar gecikme bu sorunu çözecektir.

fsan

merhaba fishbones,

hangi PIC kullaniyorsun?  WDT yi OFF yaptinmi? programi picbasic plus ilemi yazdin?

birde TRIS registerlerini unutmussun galiba?


Symbol Bt_ackapa = PORTA.0 'start-stop butonu
Symbol Swc_acik = PORTA.1 'kapi acik swici
Symbol Swc_kapali = PORTA.2 'kapi kapali swici

Symbol Role_kapali = PORTB.2 'kapatma yon rölesi
Symbol Role_acik = PORTB.3 'acma yon rolesi

' *****************************************
 TRISA = %11111111 'porta.0-7 inputs
 PORTA = 0
 TRISB = %11110011 'portb.2-3 outputs
 PORTB = 0
' *******************************************

Basla:

fishbones

cevaplar için teşekkürler

belirtmediğim için özür dilerim, proton plus derleyici ve 16F84 kullanıyorum

sayın ods
çok haklısınız bunun için 50-250 ms gecikmeleri denedim tutarsız çalışmaya devam ediyordu yani dediğiniz gibi basıldığını algılayıp ilgili yere dallanıyor ve ikinci kez basılmış gibi algılıyordu. Bende butona basıldığını ve bırakıldığını algılatarak kısmen çözdüğümü sanıyordum, buton bırakılırken de parazit (ark) oluşur mu?

bunun için yeterli bir zaman var mı? örneğin 200 ms'den az olmamalı yoksa denemeler sonucunda uygun zamanı kendim mi bulmalıyım.

sayın fsan

WDT,wacth dog timer,sanırım programdaki herhangibir aksaklığı saptayıp, nerde ilk hata oluştuysa oradan programa tekrar dönmeyi sağlıyor(yanlışım varsa düzeltin), ben wdt'yi nasıl, nerede ve ne için kullanmalıyım?

programlayıcı olarak picup veya icprog105c kullanıyorum(siz ne tavsiye edersiniz) oradan mı iptal edebilirim yoksa tanımlama esnasında kod mu yazmam gerekir. Bu konuyu biraz ayrıntılı anlatabilir misiniz?

Tris komutlarına gelince bildiğim kadarıyla hangi portun giriş hangisinin çıkış olduğunu belirtmek için kullanılıyor. Daha önceki programlarımda bazen kullandım ama genelde kullanmadım, kullanmanın yada kullanmamanın ne gibi yararları-zararları var?

Yani program yazarken nelere dikkat etmem gerekiyor. Bunu iyice çözersem artı mantık hatası yapmaz isem proje (hepinizin yardımlarıyla)düzgün çalışacak sanırım..

(bu arada forumu geçmişten bugüne okuyorum ama ilk başlayanlar için çok fazla bir şey yok, zaten yapılmak istenenleri okuyunca moralim bozuluyor, sizler cep telefonunu kontrol etmeye çalışırken ben bi butonla iki işlem yapamıyorum :oops: ,

Hepinize teşekkürler gelişmelerden haberdar olacaksınız,

ods

Elbette butona basılırken de bırakılırken de ark oluşabilir. Gecikme süresi sizin de tahmin ettiğiniz gibi denemeyle bulunabilir. Kullandığınız butonun tipi, kontak yapısı ve açma kapama zamanına göre kullanacağınız gecikme süresi değişecektir.

ete

Merhaba Fishbones,

Yazdığın kodda ufak bir hata buldum ve düzelttim. Isiste devreyi simule ettim çalışıyor. Bir de sen dene bakalım. Doğru kod aşağıdadır;
TRISA = %11111111 'porta.0-7 inputs 
PORTA = 0 
TRISB = %11110011 'portb.2-3 outputs 
PORTB = 0 
Symbol Bt_ackapa = PORTA.0 'start-stop butonu 
Symbol Swc_acik = PORTA.1 'kapi acik swici 
Symbol Swc_kapali = PORTA.2 'kapi kapali swici 

Symbol Role_kapali = PORTB.2 'kapatma yon rölesi 
Symbol Role_acik = PORTB.3 'acma yon rolesi 

Basla: 
If Swc_acik=0 and Swc_kapali=1 Then Goto Kapat 
If Swc_acik=1 and Swc_kapali=0 Then Goto Ac 
If Swc_acik=1 and Swc_kapali=1 Then Goto Ac 
If Swc_acik=0 and Swc_kapali=0 Then Goto Ariza 
Goto Basla 

Ac: 
If Bt_ackapa=0 Then Goto Ac_basildi 
Goto Ac 

Ac_basildi: 
If Bt_ackapa=1 Then 
High Role_acik 
Goto Ac_birakildi 
Endif 
Goto Ac_basildi 

Ac_birakildi: 
If Bt_ackapa=0 Then 
Low Role_acik 
Goto Kapat 
Endif 
If Swc_acik=0 Then 
Low Role_acik 
Goto Kapat 
Endif 
Goto Ac_birakildi 

Kapat: 
If Bt_ackapa=0 Then Goto Kapat_basildi 
Goto Kapat 

Kapat_basildi: 
If Bt_ackapa=1 Then 
High Role_kapali 
Goto Kapat_birakildi 
Endif 
Goto Kapat_basildi 

Kapat_birakildi: 
If Bt_ackapa=0 Then 
Low Role_kapali 
goto Ac 
Endif 
If Swc_kapali=0 Then 
PORTB=0 'burası değişti, daha önce LOW PORTB var idi ve hata burada idi.
Goto Ac 
Endif 
Goto Kapat_birakildi 
Ariza:
end

Neticeyi lütfen bildir.
Kolay Gelsin,

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

kesmez

bende bir buton uygulaması yapmıştım...
buton durumlarını algıladıktan sonra internal eeproma yazdırmıştım ve
bu yazdırdığım eeprom üzerinden okumuştum..
bir problem çıkmamıkştı üstelik elektrik kesilmelerinde buton konumu değişmiyordu...
"İnned dine indallahil İslam" (2-19)

ete

Fishbones kardeş,

Sorun hala devam ediyor ise birde aşağıdaki kodu dene istersen.
Sırf meraktan işi nasıl halledebilirim diye bu kodu yazdım.

Kolay Gelsin

ETE

TRISA = %11111111 'porta.0-7 inputs 
PORTA = 0 
TRISB = %11110011 'portb.2-3 outputs 
PORTB = 0 
TUS   VAR PORTA.0
SWSOL VAR PORTA.1
SWSAG VAR PORTA.2
ILERI VAR PORTB.3
GERI  VAR PORTB.2
YON   VAR BIT  '0=SOLA , 1=SAGA
MOTOR VAR BIT  '0=OFF  , 1=ON
Z     var bit

YON=1
MOTOR=0   
BASLA: IF TUS=0 THEN
          if z=1 then basla
             z=1
             if motor=0 then
                if (SWSAG=0) AND (SWSOL=1) THEN
                   high geri:motor=1:yon=0:pause 100:goto basla
                endif
                if (SWSAG=1) AND (SWSOL=0) THEN
                   high ileri:motor=1:yon=1:pause 100:goto basla
                endif
                if (SWSAG=1) AND (SWSOL=1) THEN
                  IF YON=1 THEN
                     high geri:motor=1:yon=0:pause 100:goto basla
                  ENDIF
                  IF YON=0 THEN
                     HIGH ILERI:MOTOR=1:YON=1:PAUSE 100:GOTO BASLA
                  ENDIF
                endif
             endif
             
          IF MOTOR=1 THEN
            if (SWSAG=1) AND (SWSOL=1) THEN
                portb=0:pause 100:MOTOR=0:goto basla
            endif
          endif
       ENDIF  
       
       if motor=1 then 
            if (SWSAG=0) AND (SWSOL=1)and (yon=1) THEN
              portb=0:motor=0:endif
            if (SWSAG=1) AND (SWSOL=0)and (yon=0) THEN
              portb=0:motor=0:endif
         endif        
         z=0
         GOTO BASLA  
         end
    'program PBP de yazılmıştır.      
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

Fishbones,

Senden ses kesildi bizde devam ediyor. Yazdığın ilk açıklamalara bakınca bir noktayı eksik yaptığımı fark ettim. Zira her iki anahtar açık iken butona basınca motorun önce durmasını istemişsin. Bu nedenle önceden verdiğim kodu değiştirdim. Hala almadı isen yenisini alabilirsin. Aldı isen yeniden almanı tavsiye ederim.

Gelelim senin koda belirttiğim yanlışlık (LOW PORTB) dışında birde tuş kontrol hataları var. Kodu aşağıdaki şekilde değiştirirsen ancak biraz doğru çalışıyor. Ancak yinede kesin doğru çalışır anlamında anlama. Zira tuşa basan kişinin insafına kalmış. Biraz uzun basarsan başka bir konuma program atlıyor. Çünki kod öyle yazılmış. Bence değiştirmek çok zor.Bu nedenle benim yazdığım kodu kullan bana kalırsa tuş konusu güvenli. Her basışta bir işlem yapıyor.
Kolay gelsin
ETE
Ac_basildi: PAUSE 300
            If Bt_ackapa=1 Then 
               High Role_acik :PAUSE 300
               Goto Ac_birakildi 
            Endif 
            Goto Ac_basildi 

Ac_birakildi: 
              If Bt_ackapa=0 Then 
                  Low Role_acik :PAUSE 300
                  Goto Kapat 
              Endif 
              If Swc_acik=0 Then 
                  Low Role_acik :PAUSE 300
                  Goto Kapat 
              Endif 
              Goto Ac_birakildi 

Kapat: 
If Bt_ackapa=0 Then Goto Kapat_basildi 
Goto Kapat 

Kapat_basildi: PAUSE 300
               If Bt_ackapa=1 Then 
                   High Role_kapali:PAUSE 300 
                   Goto Kapat_birakildi 
               Endif 
               Goto Kapat_basildi 

Kapat_birakildi: 
                 If Bt_ackapa=0 Then 
                     Low Role_kapali:PAUSE 300 
                     goto Ac 
                 Endif 
                 If Swc_kapali=0 Then 
                     PORTB=0 'burası değişti, daha önce LOW PORTB var idi ve hata burada idi.
                 Goto Ac 
                 Endif 
Goto Kapat_birakildi 
Ariza:
end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fishbones

Merhaba arkadaşlar

Alakanıza teşekkür ediyorum. Program buton kontrollerine gecikme koyduğumda çözüldü.

Ancak yaptığım denemelerde gördüğüm kadarıyla;tek buton ile kontrol işlemlerinde, butona basıldığını algılatmak yerine, butona basıldı ve bırakıldığını algılatmak çok daha kararlı çalışıyor.

Hepinize ilgi ve yardımlarınızdan dolayı, ayrı ayrı teşekkür ederim.

Bilginin paylaşıldıkça çoğaldığı ve sorulan soruların cevapsız bırakılmadığı bir ortamda bulunmak gerçekten güzel bir duygu. Bir sonraki pic projesinde görüşmek üzere... ;)  

Diğer konularda da sizlere danışabileceğim ve cevap alacağımı bilmenin vermiş olduğu rahatlıkla düşünebildiğim kadarıyla sizlerle birlikte yeni projeler geliştirmeye (önce kendi başıma) ve bu ortamda paylaşmaya devam edeceğim.

hepinize kolay gelsin :D