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...
Algoritmasını çıkarmaya çalış yardımcı olalım.
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.
bu tip bir istege ete usta cevap vermişti diye hatılıyorum
picbasic bolumu altında bakarak eskilere dogru gidin
yazdigin programi paylasirsan daha rahat yardimci olabiliriz.
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
ö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
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
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? :-[