butonla 10sn led

Başlatan coco, 16 Nisan 2011, 21:29:41

coco

Selam

PIC16F628A ile tek buton kontrolu ile 2 ayrı pinden 10 saniye yanma süreli LED yakmak istiyorum.

Pic boşta iken ledler sönük durumda .Butona basılı tutuğum sürece Led1.  10 saniye yanık kalıcak.Butonu boşa
bırakınca diğer Led2. 10 saniye yanık kalıcak ve sönücek.Yardımcı olabilirmisiniz?

Basicde yeniyim bir örnekten birşeyler yazdım ama olmadı


@ DEVICE pic16F628A                      'işlemci 16F628A                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_ON             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

TRISA=0                   'A portu çıkış olarak ayarlandı
TRISB=%00000001                'B.0 pini giriş diğerleri çıkış olarak ayarlandı.

SYMBOL TUS=  PORTB.0         ' PortB.0 pinine sembol ismi olarak  TUS adı verildi.
SYMBOL LED1= PORTA.0         ' PortA.0 pinine sembol ismi olarak LED1 adı verildi.
SYMBOL LED2= PORTA.1         ' PortA.1 pinine sembol ismi olarak LED2 adı verildi.


BASLA:

    IF TUS=1 THEN            ' Anahtar kapalı ise   
    HIGH LED1                   ' LED'i yak   
    ENDIF
     
   
    IF TUS=0 THEN                  ' Anahtar açık ise
    HIGH LED2                ' LED'i söndür
    ENDIF                   ' IF sorgulaması sonu
    GOTO BASLA                     ' BASLA isimli etikete git.
    END

ete

İşin içinde tek buton olunca alternatif pozisyonlarıda açıklaman gerekir.
Nedir bunlar,
- Butona 20 sn basılı tutarsam program ne yapacak?
- Butona basıp bırakırsam ne yapacak program.
- 10 sn LED1 yandı ama tusu bırakmadım ne olacak?

Yoksa  bastçe açıklamana göre şöylebir kod yazılabilir,
IF TUS=0 THEN
  HIGH LED1
  PAUSE 10000
ENDIF
IF TUS=1 AND LED1=1 THEN
  LOW LED1
  HIGH LED2
  PAUSE 10000
  LOW LED2
ENDIF

GOTO BASLA

Yada LED1 10 sn sonra söndürülür ama orada POZ=1 şeklinde bir bit değişkeni set edilirki önceden tuşa basıldığı belli olsun.
İkinci led için IF TUS=0 and POZ=1 THEN şeklinde bir karşılaştırma yapılarak şayet 1 led yanıp sönmüşise 2 ci led yakılıp söndürülür değilse bir işlem yapılmaz. Tabiiki 2. led söndükten sonra POZ=0 yapılmalıdır.

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

coco

#2
- Butona 20 sn basılı tutarsam program ne yapacak?
>Program sadece butona basıldığı anda LED1 çalışıcak.20 sn  basılı tutulsa bile butona LED1 10 sn çalışacak
- Butona basıp bırakırsam ne yapacak program.
>LED1 10 sn çalışıcak sönücek sonra LED2 10sn çalışıcak sönücek
- 10 sn LED1 yandı ama tusu bırakmadım ne olacak?
>Bu durumda LED1 sönük kalıcak işlemci  butonun bırakılmasın bekliyecek bırakılırsa LED2 10sn yakıp sonra söndürücek

Sizin yazdığınzı denedim LED1 sönmüyor.

coco

Bir kolay yolu var belki ama ben bulamadım.Bunu yazabilecek veya yardım edecek biri varmı?

ete

Aşağıdaki kodu dene bakalım.

Yalnız tuşa basılma durumunu TUS=0 olarak kabul ettim. Bu nedenle Dahili Pullup ları da açtım.
Böylece PortB.0 da yalnızca buton bağlı olacak ayrıca pullup direnci olmayacaktır.

Ete


@ DEVICE pic16F628A                      'işlemci 16F628A                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_ON             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

TRISA=0                   'A portu çıkış olarak ayarlandı
TRISB=%00000001                'B.0 pini giriş diğerleri çıkış olarak ayarlandı.
OPTION_REG.7=0

SYMBOL TUS=  PORTB.0         ' PortB.0 pinine sembol ismi olarak  TUS adı verildi.
SYMBOL LED1= PORTA.0         ' PortA.0 pinine sembol ismi olarak LED1 adı verildi.
SYMBOL LED2= PORTA.1         ' PortA.1 pinine sembol ismi olarak LED2 adı verildi.
SN  var byte
poz var bit
PORTA=0
poz=0
BASLA:

    IF TUS=0 THEN            ' Anahtar kapalı ise   
      IF led1=0 and led2=0 then HIGH LED1
      poz=1                   ' LED'i yak   
    ENDIF       
   
    IF poz=1 then SN=SN+1
    IF SN=100 then 
       LOW LED1
       HIGH LED2
    ENDIF
    IF SN=200 then 
       LOW LED2
       SN=0
       poz=0
    ENDIF
    PAUSE 100      
    GOTO BASLA                     ' BASLA isimli etikete git.
    END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

coco

#5
tamam yaptım yazacaktım.Siz kod yollamışsınız.Sağol

Ruzgarbey

sorduğunuz soruda bazı eksiklikler mevcut. mesala butona basılı tuttuğunuz sürece program ne yapacak. butona ne kadar basılı tutarsanız tutun led1 10 sn yanıp sönecekmi yoksa basılı olduğu sürece yanıp bırakıldıktan sonra 10 saniye yanıp sönecek ve led2 10 saniyemi yanacaak.
sorunuzu daha açıklamalı bir biçimde yazarsanız daha çabuk cevap alacağınız düşüncesindeyim.saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK