İki butonlu led animasyon mod geçişleri ???

Başlatan mrt35, 17 Mart 2016, 22:37:29

mrt35

Merhaba
aranıza yeni kaltıldım. Elektrik elektronik mezunu olmama rağmen 10 yıldır hiç elektronikle alakam yoktu taki çalıştığım yerdeki abinin oğlu elektroniğe merak salana kadar :) Başta basit devreler yaptık sonra kendimi birden picbasic içinde buldum.. Elime de bir yerden 3-4 tane 12f675 geçince araştırmaya ufaktan bir şeyler yapmaya başladım. Şimdilik öğrenme aşamasında olduğumdan ledlerle ilgileniyorum ve bir yerde takılıp kaldım. Çok araştırdım ancak hep tek buton ile hem animasyonu başlatma hemde modlar arasında geçişler sorulmuş.Ben çift buton kullanıp 1. buton ile seçili animasyonu başlatmayı 2. buton ile mod değiştirmek istiyorum. Tek butonlu olarak yapabildim ama çift buton konusunda yardıma ihtiyacım var. Yol gösterirseniz sevinirim.

Programı öylesine yazdım örnek olması amaçlı..

@ __config _INTRC_OSC_NOCLKOUT &_WDT_ON &_PWRTE_ON  &_MCLRE_OFF

DEFINE OSC 4
DEFINE OSCCAL_1K 1    

CMCON=%111 
VRCON=0    
CMCON=7
ANSEL=0
TRISIO = %110000
GPIO=0

 
     
symbol LED = GPIO.0
SYMBOL LED2 = GPIO.1
SYMBOL BUTON = GPIO.4
symbol FONK = GPIO.5


SAYI VAR BYTE
I    VAR BYTE
ZAMAN VAR BYTE




BASLA:

'--------------------------------------------
if buton = 1 then 
led=1
pause 300
led=0
pause 300
led2=1               ' mod 1
pause 300
led2=0
pause 300
endif
goto BASLA
'---------------------------------------------

'--------------------------------------------
if buton = 1 then
led2=1
pause 300
led2=0
pause 300
led=1               ' mod 2
pause 300
led=0
pause 300
endif
goto basla
'---------------------------------------------

vitruvius

Merhaba. Eğer doğru anladıysam bayrak kullanarak yapabilirsiniz. Mesela mod adında bir değişken tanımlayın ve ilk değer olarak 0 verin.

İkinci butona her basıldığında bu değişkenin değerini 1 ya da 2 yapın.

Birinci butona basıldığında da bu değişkenin değerini kontrol edip mod = 1 ise birinci animasyonu, mod = 2 ise ikinci animasyonu oynatabilirsiniz.

ete

#2
Bugünlerde aynı konu çokça sorulmaya başlandı bir ödev olsa gerek.
Bu işi yapmak için bir çok yöntem kullanılabilir. Ancak bana göre en akıllıcası aşağıda örneğini vereceğim yöntem.
Bu yöntemde her bir mod'un sıra numarası olacak ve butonun birisi bu numarayı değiştirecek yani mod seçtirecek.
Diğer buton ise animasyona başlama için start görevini üstlenecek ve basılmadığı müddetçe program yalnızca mod değiştirme fonksiyonunu yapacak. Bu nedenle start butonuna basılmadığı müddetçe animasyon değiştimre butonunu kontrol et gibi bir mantık kullanacağız. Programın bütününü yazmadan sadece demek istediklerimi aşağıda yazıyorum.
Buton pinlerini rastgele seçtim. Siz hangisi ile çalışacaksanız değiştirebilirsiniz.


@ __config _INTRC_OSC_NOCLKOUT &_WDT_ON &_PWRTE_ON  &_MCLRE_OFF

DEFINE OSC 4
DEFINE OSCCAL_1K 1   

CMCON=%111
VRCON=0   
CMCON=7
ANSEL=0
TRISIO = %110000
GPIO=0
     
symbol LED  = GPIO.0
SYMBOL LED2 = GPIO.1
SYMBOL BUTON= GPIO.4
symbol FONK = GPIO.5


SAYI   VAR BYTE
I      VAR BYTE
ZAMAN  VAR BYTE 
SIRA   VAR BYTE
MAXMOD VAR BYTE
W      VAR BYTE
DON    VAR BIT

Pause 300
MAXMOD=1

BASLA:

      WHILE fonk=0  'BUTONB LOW OLDUĞU MÜDDETÇE AŞAĞIDAKİLER YAP
        IF BUTON=1 THEN
          SIRA=SIRA+1
          IF SIRA>MAXMOD THEN SIRA=0  'MAXMOD KAÇ ANİMASYON OLDUĞUNU TUTUYOR BU ÖRNEKTE 0-1 OLDUĞU İÇİN 1 OLACAK.
          WHILE BUTON=1:WEND 'BUTON BIRAKILINCAYA KADAR BEKLE
          PAUSE 80
        ENDIF
      WEND
      
      SELECT CASE SIRA
      CASE 0  'İLK MODE
        GOTO ANIMAS_1
      CASE 1  'İKİNCİ MODE
        GOTO ANIMAS_2
        
'VARSA BAŞKA ANİMASYON SEÇENEKLERİ BURAYA İLAVE EDİLİR MESELA CASE 2 İÇİN ÜÇÜNCÜ ANİMASYON OLABİLİR        
      END SELECT
      GOTO BASLA
      
ANIMAS_1:
Led=1
GOSUB BEKLE:IF DON=1 THEN BASLA
led=0
GOSUB BEKLE:IF DON=1 THEN BASLA
led2=1               ' mod 1
GOSUB BEKLE:IF DON=1 THEN BASLA
led2=0
GOSUB BEKLE:IF DON=1 THEN BASLA
endif
GOTO BASLA

ANIMAS_2:
led2=1
GOSUB BEKLE:IF DON=1 THEN BASLA
led2=0
GOSUB BEKLE:IF DON=1 THEN BASLA
led=1               ' mod 2
GOSUB BEKLE:IF DON=1 THEN BASLA
led=0
GOSUB BEKLE:IF DON=1 THEN BASLA
GOTO BASLA

BEKLE:
      DON=0
      for W=0 to 150
        IF BUTON=1 then
           SIRA=SIRA+1
           IF SIRA>MAXMOD THEN SIRA=0 
           WHILE BUTON=1:WEND
           Pause 80
           DON=1
           RETURN
        ENDIF
        PAUSe 2
      NEXT
      RETURN


Bu sistemde her animasyon çalışıp bittikten sonra yeniden Buton_2 ye basılması gerekecektir. Bu konuda başka bir açıklama verilmediği için böyle yaptım.
Anlaşılmayan yer olursa sorarsınız.

Ete

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

mrt35

vitruvius ve ete hocam cevabınız için çok teşekkürler. Belirtmeyi unutmuşum özür dilerim.. Butonlar pulldown olarak bağlı. devrenin baskı devresini çıkarttım bu yüzden değiştirmek zor olacak şimdi.Bilgisayarım elimde olmadığından orjinal devreyi malesef gönderemiyorum bu yüzden yaptığm test devresini ekliyorum.

ete hocam dediğiniz kodlar üzerinde oynayarak istediğimi yapmaya çalıştım ancak başarılı olamadım. Ayrıntılı açıklamak gerekirse GPIO.4 pininde start butonu GPIO.5 pininde fonk. butonu var. Devreye 12v verdiğimizde starta basıldığında direk animasyonu oynatacak. fonk. butonuna basıp tekrar starta basıldığında 2. animasyon 3. animasyon şeklinde devam edecek. Atıyorum 4 animasyon var. 4. animasyon seçili iken tekrar fonk. butonuna basınca 1. animasyona dönecek.


mrt35

#4
ete hocam kodları şu şekilde düzenleyince çalıştı ancak bir hata yanlışlık var mı kontrol edebilir misin ? ( Açıklamaları düzenlemedim )

@ __config _INTRC_OSC_NOCLKOUT &_WDT_ON &_PWRTE_ON  &_MCLRE_OFF

DEFINE OSC 4
DEFINE OSCCAL_1K 1    

CMCON=%111 
VRCON=0    
CMCON=7
ANSEL=0
TRISIO = %110000
GPIO=0

'Bu kısımda register tanımlamaları olması gerek
SIRA       VAR BYTE
MAXMOD VAR BYTE
symbol LED = GPIO.0  'Bu led 1
SYMBOL LED2 = GPIO.1 'Bu led 2
SYMBOL BUTONA=GPIO.5 'BU basılınca mod değiştirecek
SYMBOL BUTONB=GPIO.4 'Bu basılınca hangi mod sırada ise o animasyonu çalıştıracak.
'Butonlar PULLUP lı olarak çalışacak basılınca buton pini LOW olacak.
pause 300
MAXMOD=1
BASLA:
      
      WHILE BUTONB=0  'BUTONB HIGH OLDUĞU MÜDDETÇE AŞAĞIDAKİLER YAP
        IF BUTONA=1 THEN
          SIRA=SIRA+1
          IF SIRA>MAXMOD THEN SIRA=0  'MAXMOD KAÇ ANİMASYON OLDUĞUNU TUTUYOR BU ÖRNEKTE 0-1 OLDUĞU İÇİN 1 OLACAK.
          WHILE BUTONA=1:WEND 'BUTON BIRAKILINCAYA KADAR BEKLE
          PAUSE 80
        ENDIF
      WEND
      
      SELECT CASE SIRA
      CASE 0  'İLK MODE
        GOTO ANIMAS_1
      CASE 1  'İKİNCİ MODE
        GOTO ANIMAS_2
        
'VARSA BAŞKA ANİMASYON SEÇENEKLERİ BURAYA İLAVE EDİLİR MESELA CASE 2 İÇİN ÜÇÜNCÜ ANİMASYON OLABİLİR        
      END SELECT
      GOTO BASLA
      
ANIMAS_1:
led=1
pause 300
led=0
pause 200
led=1
pause 300
led=0
pause 200
GOTO BASLA

ANIMAS_2:
led2=1
pause 300
led2=0
pause 200
led2=1
pause 300
led2=0
pause 200
GOTO BASLA


Edit : Simülasyonda çalışıyor ancak devre üzerinde çalışmıyor. Hiçbir ledi yakmıyor :(

ete

O zaman senin devren çalışmıyordur. Simulasyonda çalışan şeyin gerçekte de çalışması gerekir.
Aşağıdaki linki incelemeni tavsiye ederim.

http://etepic.com/index.php/topic,1670.0.html

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

ipek

ortada Watch Dog Timer'i kullanacak bir durum yok,sigortalarda WDT OFF yapıp denermisin...

mrt35

Ancak yarın deneyebilirim İpek hanım.. Ayrıca bir kaç kendi hatam da varmış onları düzelttim yanlış pine giriş vermişim. çipin 6. pini de çalışmıyormuş 3-4 saat boşuna uğraştım ama deneyim oldu. Yarın sonucu bildiririm.

mrt35

Tekrar merhaba..
Program sorunsuz çalışmaya başladı. Devrede ufak hatalar varmış onları düzelttim programa dokunmadım. Ancak bir isteğim var. Devreyi ilk çalıştırdığımda fonk. butonuna basmadan animasyonu başlatamıyorum. direk enerji verince starta bastığımda animasyonu nasıl başlatabilirim ?

ete

Select Case satırından öncesine bir etiket ismi belirle. Mesela ANIM olsun.
Basla satırından evvel GOTO ANIM yaz istediğin olur.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mrt35

#10
ete hocam teşekkürler ancak olmadı yada ben beceremedim. Kodu ekliyorum yardımcı olur musun ?

@ __config _INTRC_OSC_NOCLKOUT &_WDT_ON &_PWRTE_ON  &_MCLRE_OFF

DEFINE OSC 4
DEFINE OSCCAL_1K 1    

CMCON=%111 
VRCON=0    
CMCON=7
ANSEL=0
TRISIO = %011000
GPIO=0

'Bu kısımda register tanımlamaları olması gerek
SIRA       VAR BYTE
MAXMOD VAR BYTE
symbol LED = GPIO.0  'Bu led 1
SYMBOL LED2 = GPIO.1 'Bu led 2
SYMBOL BUTONA=GPIO.3 'BU basılınca mod değiştirecek
SYMBOL BUTONB=GPIO.4 'Bu basılınca hangi mod sırada ise o animasyonu çalıştıracak.
'Butonlar PULLUP lı olarak çalışacak basılınca buton pini LOW olacak.
pause 300
MAXMOD=4
GOTO ANIM  
BASLA:
      
      WHILE BUTONB=0  'BUTONB HIGH OLDUĞU MÜDDETÇE AŞAĞIDAKİLER YAP
        IF BUTONA=1 THEN
          SIRA=SIRA+1
          IF SIRA>MAXMOD THEN SIRA=0  'MAXMOD KAÇ ANİMASYON OLDUĞUNU TUTUYOR BU ÖRNEKTE 0-1 OLDUĞU İÇİN 1 OLACAK.
          WHILE BUTONA=1:WEND 'BUTON BIRAKILINCAYA KADAR BEKLE
          PAUSE 80
        ENDIF
      WEND
       ANIM:
      SELECT CASE SIRA
      CASE 0  'İLK MODE
        GOTO ANIMAS_1
      CASE 1  'İKİNCİ MODE
        GOTO ANIMAS_2
      CASE 2  'ÜÇÜNCÜ MODE
        GOTO ANIMAS_3

        
'VARSA BAŞKA ANİMASYON SEÇENEKLERİ BURAYA İLAVE EDİLİR MESELA CASE 2 İÇİN ÜÇÜNCÜ ANİMASYON OLABİLİR        
      END SELECT
      
      GOTO BASLA
       
ANIMAS_1:

mrt35

Ete hocam farklı bir şekilde sorunumu çözdüm az önce..
MAXMOD=1 altına SIRA=1 ekledim

IF SIRA>MAXMOD THEN SIRA=0  satırındaki 0 ı 1 yaptım ve animasyonları case1,2,3 şeklinde yazınca sorunum çözülmüş oldu. Yöntem doğru mu bilmiyorum ama amacıma ulaşmış oldum.

mrt35

Uzun zaman önce açmıştım bu konuyu ve sayenizde sorunumu çözmüştüm. Şimdi yine bir sorunum var konu aynı sayılır bu yüzden yeni başlık açmak istemedim.
Daha önceki devremde 1 start butonu(basılı tutulduğu sürece start alıyordu) 1 tanede mod değiştiren buton vardı.
Şimdi yapmaya çalıştığım 1 buton ile hem mod değiştirmek hemde ledleri yakmak.
Örnek vermek gerekirse
butona 1 kez basınca 2 led yanıp sönecek
bir kez daha basınca 4 led yanıp sönecek
bir kez daha basınca kapanacak tekrar basınca başa dönecek.
Butona basarak mod değiştirmeyi yaptım ancak sadece basılı tuttuğum süre boyunca yanıp sönüyorlar.ben bir kez mod seçildi mi diğer mod seçilene kadar yanıp sönmesini istiyorum. Yani sonsuz yanıp sönsün ben basınca mod değişsin 2. modda sonsuz yanıp sönsün. mümkün mü bilmiyorum tabi :) kullandığım kodları ekliyorum yardımcı olursanız sevinirim.

@ __config _INTRC_OSC_NOCLKOUT &_WDT_ON &_PWRTE_ON  &_MCLRE_OFF

DEFINE OSC 4
DEFINE OSCCAL_1K 1    

CMCON=%111 
VRCON=0    
CMCON=7
ANSEL=0
TRISIO = %010100
GPIO=0

symbol LED = GPIO.0  
SYMBOL LED2 = GPIO.1 
SYMBOL FONK=GPIO.3 'BU basılınca mod değiştirecek

SIRA   VAR BYTE

SIRA=0
BASLA:

IF fonk=0  THEN 
SIRA=SIRA+1
IF SIRA>4 then SIRA=0
WHILE fonk=0:WEND
pause 10
ENDIF
      
     
          
SELECT CASE SIRA
 CASE 1  'İLK MODE
  GOTO ANIMAS_1
 CASE 2 'İKİNCİ MODE
  GOTO ANIMAS_2  
 CASE 3  'İKİNCİ MODE
  GOTO ANIMAS_3
 CASE 4  'ÜÇÜNCÜ MODE
 GOTO ANIMAS_4

END SELECT
      

       
ANIMAS_1:
led=1
led2=1
pause 10
goto basla

ANIMAS_2:
LED=1
LED2=1
PAUSE 100
LED=0
LED2=0
PAUSE 50
LED=1
LED2=1
PAUSE 40
LED=0
LED2=0
goto basla

ANIMAS_3:
LED=1
pause 50
led=0
pause 50


led2=1
pause 50
led2=0
pause 50

LED=1
pause 50
led=0
pause 50

led2=1
pause 50
led2=0
pause 50

LED=1
pause 50
led=0
pause 50

led2=1
pause 50
led2=0
pause 50
GOTO BASLA

ANIMAS_4:
LED=1 
pause 100
LED=0
pause 100

LED=1
pause 100
LED=0
pause 100

LED=1
pause 100
LED=0
pause 100
 
led2=1
pause 100
led2=0
pause 100

led2=1
pause 100
led2=0
pause 100

led2=1
pause 100
led2=0
pause 100
GOTO BASLA
end     

ete

SIRA isimli değişken senin buton basmalardan sonra gidilecek yeri belirliyor.
Dikkat edersen 4 adet gidilicek animasyon yerin var ama SIRA değişkenin önce Sıfırdan başlaıyor ve değeri 5 olunca (4 den büyük ise) tekrar değeri sıfırlanıyor. Bu durumda SIRA isimli değişkenin 4 değer değil sıfır dahil 5 değer almaktadır.
Ama Select Case altında SIRA=0 iken bir dallanma olmadığı için program Select Case komutunu aşmakta ve ilk sıradaki Animas_1 etiketine gelmektedir. Amacın nedir tam olarak bilmiyorum. Şayet sıra değişkeninin sıfır konumunu kullanmak istemiyor isen değişkeni sıfırdan değil 1 den başlat. Ancak işin doğrusu 0-3 aralığında çalışması bence.
Yani Animas_1 seçeneği default seçim olmalı ve herhangi bir tuşa basmadığın müddetçe program 1 nolu animasyonu sürekli olarak icra etmeli. Her ne şekilde olursa olsun END SELECT komutundan sonra ;
GOTO BASLA şeklinde bir komut koymalısınki program en başa yönelip SIRA değerine bağlı olarak yeniden ilgili yerlere dallanabilsin.
Dediğimi yaparsan sıkıntı kalmayacaktır. Yani, SIra değişkeni 0 dan başlasınve değeri 4 olunca değer yeniden sıfıra eşitlensin.
Select Case seçeneklerini de , Case 0, Case 1, Case 2 , Case 3 olarak değiştir. End select den sonra GOTO BASLA yaz olsun bitsin.

Bu programın bir kötü tarafı animasyon çalışırken tuş kontrolünün yapılamayacak olmasıdır. Bu nedenle tuşa elini bastırıp biraz basılı tutman lazımki program BASLA etiketine gittikten sonra Tuşa basıldığını görebilsin. Belkide tuşa basarsam çalışıyor demendeki sebep budur.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com