pic basicde tek buton start stop

Başlatan antiteror, 24 Kasım 2009, 01:19:05

antiteror

arkadaşlar pic basicde 1 butona basınca, bırakasıya kadar 1 tane led yanacak ve aynı butona ardarda 2 defa basınca diğer led yanacak bırakınca sönecek. BU şekilde çalışan bi program yazmak istiyorum uzun zamandır pic programlamakla ilgilenmiyorum mantığını kuramadım yardımcı olursanız sevinirim. ufak bişeyler yazmaya çalıştım
TRISA=255
TRISB=0
PORTA=0
PORTB=0
I VAR BYTE
Y VAR BYTE
I=0
DONGU:
FOR Y=0 TO 100
IF I>2 THEN I=2
IF PORTA=0 THEN I=I+1
WHILE PORTA=0
WEND
PAUSE 10
NEXT Y
IF (porta=0) and (I=1) THEN 
HIGH PORTB.0
ELSE
LOW PORTB.0
ENDIF
IF (porta=0) and (I=2) THEN 
HIGH PORTB.1
ELSE
LOW PORTB.1
ENDIF
GOTO DONGU
END

ete

Bir tane işaret biti kullanarak bu istediğin olur. Tabiiki istediğini tam olarak anladı isem.
Önce tanımlamayı yapmakta yarar var. Bir tane buton tanımalayalım.

POZ var BIT   'poz işaret biti
Symbol BUTON=PORTA.0  (Buton PortA.0 pininde bağlı)
symbol LED1= PORTB.0  '1. led PortB.0 da
Symbol LED2=PORTB.1   '2. led portB.1 de bağlı

İlk defa butona basılınca ( IF BUTON=0 and POZ=0 THEN)
LED yansın ve butonu bırakıncaya kadar yanık kalsın
LED1=1
POZ=1   işarte bitini set ettik.
while buton=0:wend  butonbırakılıncaya kadar bekle
LED1=0
ENDIF
Ikinci defa butona basılmış ise
IF BUTON=0 and POZ=1 Then
 LED2=1
POZ=0  'işaret bitini siliyoruz
while BUTON=0:wend   butonbırakılıncaya kadar bekliyoruz.
LED2=0  buton bırakılınca program buraya gelecek ve led2 söndülülecek.
endif

Hepsi bu kadar sanırım. Bunu programolarak verirsek aşağıdaki şekilde olacaktır.

Kolay Gelsin
ETE

PORTA=0:TRISA=%00000001
PORTB=0:TRISB=0

SYMBOL BUTON=PORTA.0
SYMBOL LED1=PORTB.0
SYMBOL LED2=PORTB.1
POZ  VAR  BIT

PAUSE 200

BASLA:
          IF BUTON=0 AND POZ=0 THEN
            LED1=1
            POZ=1
          WHILE BUTON=0:WEND
           LED1=0
          ENDIF

         IF BUTON=0 and POZ=1 THEN
             LED2=1
             POZ=0
           WHILE BUTON=0:WEND
            LED2=0
         ENDIF
         PAUSE 50
        GOTO BASLA
  
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

antiteror

istediğim tam bu değil butona 1 defa basarsak 1. led. 2 defa basarsak 2. led yanacak. bunun sırası önemli değil. mesela ilk önce 2 defa art arda bastık 2. led yanacak butonu bırakınca sönecek. bir birinden bağımsız olarak çalışacak.  belli bi zaman gecikmesi başta butona kaç defa basıldığını algılamak için kullanılacak sanırsam.

ete

Butona bir defa basmak demek basıp bırakmak demektir. Bunun başka izahı olamaz. Her halukarda basıp bırakmanız gerekir. Bu bir kere basma anlamına gelir ve bu durumda 1. ci ledin mutlaka yanması gerekir. İkincide aynı işi yaparsanzı ikinci led yanması gerekir.
Süreye bağlı basma algılaması olmaz. O zaman adına başka bir şey demek gerekir.

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

POWER

Bu zor görünüyor bu mantıkla.bir butona bir kez basılırsa 1. led yanacak,aynı butona iki kez basılırsa 2.led yanacak.Buraya kadar her şey normalde.ikinci ledi yakmak için 2 kez basmak lazım.örnek: merdiven basamaklarından ikinci basamağa ulaşmak için birinci basamağada basmak gerekiyor.önce birinci basamak sonra ikinci basamak.birinci basamakta birinci led yanmış olacak.direk ikinci led nasıl yakılacak birinci led yanmadan?
TB6BKG

Maxim

bence bu yapılabilir ama komut sonrasında bir gecikmenin olması şart .

butona basıldığı anda bir zaman sayacı start alacak ,
bu süremiz 3 saniye olsun diyelim .

A-
butona 1 kere bastık süre saymaya başladı ,
elimizi çektik , buton değeri 1 oldu
süre sonuna gelindiğinde 1. led yanacak + süremiz sıfırlanacak .

B-
butona 1 kere bastık süre saymaya başladı ,
elimizi çektik ,tekrar bastık ve elimizi tekrar çektik, buton değeri 2 oldu .
süre sonuna gelindiğinde 2. led yanacak + süremiz sıfırlanacak .

Ruzgarbey

bunu işlemcinin timer sayacını kullanarak yapabilirsin.
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
INTCON = %10100000       'timer0 ksmesi aktif
OPTION_REG=%00010101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.

SYMBOL GIE  =INTCON.7
symbol buton=porta.0  'butonun porta 0 bitini bağlı olduğunu varsayalım
symbol LED1=portb.1
symbol LED2=portb.2
bas var byte
sayac var byte
clear
gosub kesmeof
basla:
if buton=0 then 'butona basılmısken
while buton=0 :wend  'butonun bırakılmasını bekle
gosub kesmeon
bas= bas +1 'butona basılma sayısı
endif
if bas=1 and sayac >180 then '1 defa basılıp 3 saniye içinde tekrar basılmazssa 
high led1
low led2
bas=0
gosub kesmeof
endif
if bas=2 then
low led1
high led2
bas=0
gosub kesmeof
endif

goto basla



kesmeon:
INTCON = %10100000
gie=1
tmr0=0
sayac=0
return

kesmeof:
INTCON = %00000000
gie=0
tmr0=0
sayac=0
return

disable
KESME:
sayac=sayac +1 'sayac 60 olduğunda 1 saniye
if sayac=254 then sayac=0
INTCON.2 = 0
resume
enable
end


kodları istediğin şekilde düzenleyebilirsin.ne yapmak istediğini tam olarak anlayamadığım için en basit mantıkla bu şekilde kod yazmaya çalıştım.umarım işine yarar.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK