Tek tuşla fonksiyon seçimi

Başlatan veli_k, 21 Ocak 2016, 11:39:40

veli_k

Merhaba arkadaşlar ben tek tuşla fonksiyon değiştiren bir program istiyorum örneğin butona bastığımda ledi 1 saniye yakıp söndürecek birkez daha bastığımda 2 kere yakıp söndürecek 3. de 5 kere gibi daha sonra başa dönecek çok uğraştım yapamadım program yazma konusunda çok bilgim yok ufak tefek yapabiliyorum yardımcı olursanız çok mutlu olurum...

erpay

Algoritmasını çıkarmaya çalış yardımcı olalım.

garezza

#2
Bir değişken ve bir bayrak tanımla butona her bastığında değişkeni arttır ve bayrağı temizle. Daha sonra bayrak set ise switch / case yapısını kullanarak istediğin işlemi yaptırabilirsin. işlem başarıyla gerçekleştiğinde bayrağı set et ve yeniden butona basılmasını bekle. Bu arada pic basicde
switch / case varmı bilmiyorum yoksa if else ile yaparsın.

Maxim

bu tip bir istege ete usta cevap vermişti diye hatılıyorum
picbasic bolumu altında bakarak eskilere dogru gidin

dursuncemal

yazdigin programi paylasirsan daha rahat yardimci olabiliriz.
:=

veli_k

yazdığım program bu arkadaşlar mod2 ya nasıl geçecek yada 3 veya 4 e bi türlü yapamadım

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF


TRISIO=%000100

CMCON=7  'komutu comparatörü iptal eder.
ANSEL=0  'komutu ise analog girişleri digital yapar.

GPIO=0
SYMBOL LED=GPIO.0                         
SYMBOL fonk=GPIO.2

SAYI VAR BYTE
SAYI=0

BASLA:
IF FONK=1 THEN
SAYI=SAYI+1
ELSE
GOTO BASLA
IF SAYI=1 THEN GOTO MOD1
IF SAYI=2 THEN GOTO MOD2
ENDIF

MOD1:
HIGH LED
pause 1000
low led
PAUSE 1000
GOTO BASLA

MOD2:
HIGH LED
PAUSE 500
LOW LED
PAUSE 500
HIGH LED
PAUSE 500
LOW LED
PAUSE 500
SAYI=0
GOTO BASLA
END

Maxim

öyle olmaz bence, zaten o kod hatalı

şöyle bir şey canlandırdım kafamda
butona bastığın anda arkada bir sayma işlemi başlayacak, diyelim 5saniyelik bir sayıcı
ayrıca, butona her basmada artan bir rakam olacak

butona bastıktan sonra 5 saniyemiz var işlemin başlaması için
bastık, tık tık tık (3 kere) (arkadaki sayıcıda saymaya başladı)
rakam 3 oldu
arkada sayıcı devam ediyor, 2sn, 4sn, 5 saniye oldumu başka bir yere atlayacak

orada şöyle birşey var basit
1 ise şunu yap
2 ise bunu yap
3 ise şunu yap
iş bitimi herşeyi sıfırla başa dön ve butonu bekle


ete

#7
Bu işi yapmanın yolu her tuşa basıldığında değeri artan bir değişken (Mesela SAYI) kullanıp sonra programı değişken değerine bağlı olarak ilgili mod etiketine yönlendirmekten geçer. Ancak açıklanmamış bazı konular var. Örneğin. Sayı değişkenin değeri SAYI=1 iken program sürekli MOD1 etiketindeki işleri yapmalı diye düşünürüm. Ancak sen öyle bir şey yapmışsınki sanki bu işi bir defa yapsın çıksın yada istediğini yapamadığın için öyle gözüktü belkide.
Bu işin diğer bir püf noktası da ledlerin yanıp sönme aralıklarında ki uzun gecikme değerleri. Bu gecikmeler senin mod değiştirme isteğini engeller. Bu nedenle gecikme işini döngü içine alıp orada aynı zamanda tuş kontrolü de yapmak lazımki bekleme esnasında tuşa basılmış ise program bekleme işini bırakıp mod değiştirme işine bakmalı.

Bu açıklamalarıma uygun örnek kod aşağıda. Daha fazla Mod ilave etmek istersen yapman gereken şey Case 3 , case 4 satırlarını ilave etmek ve oralarda da benzer mantık kullanarak işi toplarlamak olmalıdır.
Tabiiki mod ilave ettikçe Tuş basıldığında artan SAYI değişken değerinin sınır değerini yeniden belirlemen ve ona uygun bir rakam yerleştirmen gerekiyor.

Ete

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

TRISIO=%00000100

CMCON=7  'komutu comparatörü iptal eder.
ANSEL=0  'komutu ise analog girişleri digital yapar.

GPIO=0
SYMBOL LED=GPIO.0                         
SYMBOL FONK=GPIO.2

SAYI VAR BYTE
I    VAR BYTE
ZAMAN VAR BYTE
SAYI=0
pause 300
 
BASLA:

GOSUB TUSBAK

select case SAYI

CASE 1
GOTO MOD1

CASE 2
GOTO MOD2

END SELECT 
GOTO BASLA

TUSBAK:
       IF FONK=1 THEN
         SAYI=SAYI+1
         IF SAYI=3 THEN SAYI=0
         WHILE FONK=1:WEND
         PAUSE 50
       ENDIF
       RETURN
       
DELAY:
      for I=0 TO ZAMAN
        PAUSE 10
        IF FONK=1 THEN TUSBAK
      NEXT
      RETURN           

MOD1:
ZAMAN=100
HIGH LED
GOSUB DELAY:IF SAYI!=1 THEN BASLA
low led
GOSUB DELAY:IF SAYI!=1 THEN BASLA
GOTO MOD1

MOD2:
ZAMAN=50
HIGH LED
GOSUB DELAY:IF SAYI!=2 THEN BASLA
LOW LED
GOSUB DELAY:IF SAYI!=2 THEN BASLA
HIGH LED
GOSUB DELAY:IF SAYI!=2 THEN BASLA
LOW LED
GOSUB DELAY:IF SAYI!=2 THEN BASLA
GOTO mod2
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

veli_k

Arkadaşlar hepinize çok teşekkür ederim

ETE hocam sanada ayrıca teşekkür ederim senin videolarınla ve derslerinle hiç bilmediğim program yazmayı öğreniyorum seninde dediğin gibi açıklanmamış konular var SAYI 1 iken bir kez mod1 i çalıştıracak SAYI 2 iken bir kez mod2 yi çalıştıracak fakat harici bir porttan gelen tetikle yani iki buton olacak birisi mod seçimi biriside şecilmiş moddaki programı bir kez aktif edecek.Fonksiyon tuşuna basılmaz ise diğer butondan gelen tetikle aynı modu bir kez tekrar edecek ben uğraştım malesef beceremedim nasıl yapabilirim? :-[