avatar_KA

Led yak söndür

Başlatan KA, 09 Nisan 2015, 23:04:03

KA

Merhaba ;

Devrede set tuşuna basılınca led yanıyor reset tusuna basınca sönüyor. Set butonuna basılınca hem led 1 yanmalı hemde led 2 belirli araıklarla yanıp sönmeli ve reset butonuna basılınca 2 led de sönmeli bu nasıl yapılır ?

TrisA=%00000011   
TrisB=0
PORTB=0
CMCON=7

SYMBOL  SET=PORTA.0
SYMBOL  CLR=PORTA.1

SYMBOL  CIKIS=PORTB.0
SYMBOL  ALARM=PORTB.2

PAUSE   50

BASLA:

IF      SET=0   THEN
CIKIS=1
ENDIF

PAUSE   50

IF      CLR=0   THEN
CIKIS=0
ENDIF

GOTO    BASLA

END

onurinci

bende tek butonlu versiyonunu yapmıştım,belki işini görür.
Proton basic

ete

Belliki bu kodları bir yerden almışsın kendine uyarlamaya çalışıyorsun. Peki hiç fikir yürütmek aklına gelmiyormu? Şemaya bir bak birisi Cıkıs diğeri Alarma isimli iki tane led in var devrede .
Birde set ve clr isimli iki butonun var.
Butona basınca ne yapıyor buton.? Elbette diğer ucuna bağlı olan GND yi pic pinine iletiyor. Yani tusa baslınca pin low yada sıfır oluyor. O halde bütün üretmen gereken mantık,
Set tusuna basarsam cıkıs ve alarm set edilsin yani high olsun zaten cıkısı benzer şekilde orada yapmışsın yanına birde alarm=1 yazarsan diğer led de yanar. Clr tusuna basınca sönsün istiyorsan zaten var olan komutun içine birde alarm=0 yazman yeterli olacaktır.
Böylece setbtusu ile iki ledi yakacak clr tusu ile söndüreceksin.
Belirli aralıklarla yansın istiyorsan biraz daha kafanı çalıştırman gerekecek.
Programın dönmesini durduramayacağına göre bir bayrak kullanman gerekecek. Yan isimli bir bit değişkenin olursa setbtuşuna basınca yan=1 olursa ve clr tusu ilede yan=0 olursa işin kolaylaşıyor.
Yan=1 olduğu müddetçe program 100 ms gecikem uygulayıp sonra toggle cıkıs ve toggle alarm
Komutlarını uygular ise ledler yan emrini almış ise belirli aralıklarla yanıp söner.

Ete

KA

"Belliki bu kodları bir yerden almışsın" ne alaka ? Daha öğrenme aşamasıdayım bayrak kullanımı hakkında bir bilgim yoktu

ete

Alaka şu, Yazdığın koddan anlamıyorsan yada yapmak istediğinle yazdığın arasında anlam farkı varsa bir yerlerden alıp oraya koyduğun belli oluyor demek istemiştim.  Asıl alaka şu aslında, iki ledin olmasına rağmen neden yalnızca birisini yakmayı akıl ediyorsunda ikincisinide yakmayı akıl edemiyorsun? İnsan böyle bir durum görünce ister istemez bu vatandaşın yazdılarından haberi yok daha doğrusu yazdıklarının ne iş yaptığını bilmiyor o halde bir yerlerden toparlamış bunlar demek geliyor içinden bende öyle dedim. Bayrak kullanımını bilmiyor olabilirsin ama en azından iki ledi yakıp söndürseydin bu kadar konuşmayı yapmamış olur ve ledlerin yanıp sönmesine odaklanırdık değilmi.

Şimdi diyeceksinki bunları ben yazdım. Peki o zaman bende nasıl bayrak kullanacağını açıklayayım sen açıkladıklarımı programa dönüştür bakalım.

Değişken tanımlama kısmına,
Yan. Var Bit şeklinde bir bayrak değişkeni tanımla.
Ayrıca sayac var byte isimli birde sayac değişkeni tanımla.

Program kısmına,
Set butonuna basılmış ise , her iki ledi 1 yap yan=1 olsun aynı yerde. Bunun anlamı ledler yandı. Burada sayac=0 da yapmalısın.
Sonra şayet clr butonuna basılırsa her iki led sönsün ,Yan=0 olsun
Asıl konuya şimdi geldik,
Şayet yan=1 ise sayac=sayac+1 olsun ve hemen altında şayet sayaç değeri 255 ise
Toggle cıkıs, toggle alarm komutlarını ver. Bu komutlar çalışmaz ise cıkıs=1-cıkıs şeklinde komut da aynı işi yapar. Toggle komutlarından sonra pause xx komutunu ver. Xx yerine bir rakam yaz mesela 10 yazarsan ledler 255x10=2550 ms yani 2,5 sn de bir yanıp söner. En iyisi oraya 1-5 arasında bir rakam yazki yanıp sönme biraz hızlı olsun.
Hepsi bu hadi bakalım şimdi sende kendine "ne alaka" dedirtmeyecek bir kod yaz bakalım.
Ete


KA

#5
TrisA=%00000011   
TrisB=0
PORTB=0
CMCON=7

SYMBOL  SET=PORTA.0
SYMBOL  CLR=PORTA.1

SYMBOL  CIKIS=PORTB.0
SYMBOL  ALARM=PORTB.2

YAN VAR BIT
SAYAC VAR BYTE

PAUSE   50

BASLA:

IF      SET=0   THEN
CIKIS=1
ALARM=1
YAN=1
ENDIF

IF  YAN=1 THEN
SAYAC=SAYAC+1
ENDIF

IF  SAYAC=255 THEN
PAUSE   5
TOGGLE  ALARM
TOGGLE  CIKIS
ENDIF


IF      CLR=0   THEN
CIKIS=0
ALARM=0
YAN=0
ENDIF

GOTO    BASLA

END


Ben zaten başka bir devre üzerinde bu kodları kullanmak istiyorum parça parça tamamlıyorum devremi buda bir kısmı yinede teşekkür ederim

Buda yapmak istediğim ;
TrisA=%00000011   
TrisB=0
PORTB=0
CMCON=7

SYMBOL  SET=PORTA.0
SYMBOL  CLR=PORTA.1

SYMBOL  CIKIS=PORTB.0
SYMBOL  ALARM=PORTB.2

YAN VAR BIT

PAUSE   50

BASLA:

IF      SET=0   THEN
CIKIS=1
ALARM=1
YAN=1
ENDIF

IF  YAN=1 THEN
PAUSE   500
TOGGLE  ALARM
ENDIF

IF      CLR=0   THEN
CIKIS=0
ALARM=0
YAN=0
ENDIF

GOTO    BASLA

END

ete

#6
Bravo sana. Mesajım işe yaradı demekki birden her şeyi kavradın. Umarım devam ettirirsin.

Ete

not: 500 ms programcılıkta çok uzun bir süredir. Hiç kimse programını 500 ms bir yerde bloke edip durdurmak istemez.
Şayet önerime uyup sayac kullansaydın program akarken ledleri yakıp söndürebilirdin. Programın bloke edilmesi önemli değilse bırak kalsın ama her zaman bu kadar basit bir algoritma denk gelmez. Aynı anda başka şeyleride kontrol etmen gerektiği zaman mutlaka sayaç kullanman gerekir. Böylece program bolke edilmeden 500 ms sayar Sayac bu kadar gecikmeye ulaşınca da toggle yaparsın. Sayac kullanımı konusunda ne demek istediğimi anlamadın ise şöyle düşünmeni öneririm.
Oraya Pause 500 yazacağın yerde ;
IF YAN=1 then
  SAYAC=SAYAC+1
  PAUSE 1
  IF SAYAC=500 THEN
     TOGGLE CIKIS
     TOGGLE ALARM
     SAYAC=0
  ENDIF
ENDIF

demen yeterli olurdu.

KA

Peki dediklerinizi anladım değişikliği yazdığım programda yapıcam.

Powered by EzPortal