BUTON'A SÜRE EKLEME

Başlatan designer.21, 12 Mayıs 2020, 10:13:47

designer.21

Merhabalar; PORTB.0 daki buton'a 2 sefer basınca PORTA.0 daki buton TOGGLE oluyor.

Bu butona bir basılma süresi eklemek istiyorum, Mesela bu TOGGLE işlemi (butona 2 defa basma işlemi) 3 saniye içerisinde basılmışsa gerçekleşsin, eğer 3 saniye içerisinde ikinci basma olmazsa tekrar sıfırlansın.

biraz bakındım ama bu hakkında bir kaynak bulamadım. Yardımcı olursanız çok sevinirim.




@ __config _BODEN_ON & _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT


CMCON=7
OPTION_REG.7=0
        
TRISA=%00000000
TRISB=%00000001
PORTA=0
PORTB=0



SYMBOL BUTON=PORTB.0
SYMBOL LED=PORTA.0

SAY VAR BYTE 56'3 sn için kesme sayacı

pause 200

SAY=0
BASLA:
      SAY=6 '3 SN SAYACI
      TMR1H=$0B:TMR1L=$DC  'timer'a ön yükleme değeri verdik  'her kesme 500ms süre alıyor.
      T1CON=%00110001      'bölme oranı 1/8 ve timer1 aktif edildi
          
            
BASLA_BIR: 
          TMR1H=$0B:TMR1L=$DC: PIR1.0=0  'Kesme bayrağı sıfırlandı TİMER 500 MS İÇİN KURULDU    
          while PIR1.0=0
            IF BUTON=0 AND SAY>0 THEN 'SIFIR IKEN İLK BASMA 2 İKEN İKİNCİ BASMA
                TOGGLE LED:SAY=6 'BASILDI SAY SAYACI 6 YA EŞİTLENİYOR YENİ SAYMA İÇİN
                WHILE BUTON=0:WEND
                PAUSE 50
            ENDIF
'            GOTO BASLA      
          WEND      'BU SATIR AŞILINCA 500 MS GEÇTİ DEMEK
          SAY=SAY-1 'O HALDE SAY DEĞİŞKENİNDENBİR ÇIKARTIYORUZ
          IF SAY>0 THEN BASLA_BIR  '6 ADET * 500=3 SN EDİYOR)  
          LED=0 'SAY=0 OLUNCA 6 SN GEÇTİ DEMEK HER DURUMDA LED SIFIRLANIYOR İŞLEM YENİDEN BAŞLIYOR
          GOTO BASLA

END


ete

BU işin kaynağı mı olur.? Bence olmaz. Ama akıl yürütülerek kolayca halledilebilir.
İki yolu var. Her iki yolun esası zaman tutmaya dayanır. Birincisi BASLA-GOTO BASLA arasının ne kadar zamanda tamamlandığını bir timer kullanarak ölçersin. Bunun için BASLA dan hemen sonra Timer'ı sıfırlarsın. GOTO basla ya geldiğinde Timer değerine bakarsın. O değer sana geçen süreyi verir. Dİyelimki 1 ms de tamamlanıyor.
Bu durumda Butona ilk basıldığında SAYAC=0 dersin ve GOTO BASLA satırına geldğinde SAYAC=SAYAC+1 dersin. Sayac değeri 3000 den küçük ise GOTO Basla dersin. Sayac=3000 olduğunda program bir alt satıra geçer orada ledi söndürürsün olur biter.

İkinci metod da ise BASLA - GOTO BASLA arasını Timer-1 sayacının döngüsüne alırsın. Döngüyüde kesme bayrağı ile kontrol edersin. Sayacı da 500 ms için kurarsın. 6 defa döngü geçtiğinde hala tuşa basılmamış ise 3 sn dolmuş olur ve ledi söndürürsün.
Çok fazla detay vermiyorum istiyorumki söylediklerimden ilham alıp kendiniz başarın bu işi.
Timer-1 sayacı kesme bayrağı PIR1.0 biti ile kontrol edilir. Saymaya başlamadan bu bit sıfırlanır. Sayac 500 ms için kurulur ve PIR1.0=1 oluncaya kadar Basla-Goto Basla arasında gidip gelir program. Barak set edilince ikinci sayac (0-5 sayacı) bir artırılıp aynı yere yeniden gönderilir. sonunda ikinci sayac=6 olduğunda 3 sn dolmuş olur.
Kesme bayrağı ile iş yapmak sık rastlanan bir olaydır. İllaki Global kesmeleri aktive etmeniz gerekmiyor. Sayac saymaya başladığı zaman overflow yani 65535 i aştığı andan PIR1.0=1 olur. Bundan yararlanıyorz.

Ete

designer.21

kaynak derken daha önce yazılmış örneklerini kastetmiştim :)
teşekkürler hocam cevabınız üzerine çalışayım biraz

designer.21

Ete Hocam yapamadım bi türlü. rica etsem konu ile ilgili biraz daha aydınlatabilir misiniz acaba.

ete

Yukarıda verdiğin programı yeniden düzenledim. Oraya bak ne yapmışım ve kodu oradan alıver .
ALgoritma şöyle;
Sayacı aktif et zaman sayacı olan SAY değişkenine 3 sn değeri olan 6 yı ver.
Sayacı 500 ms için kur sayac kesme bayrağını sıfırla.
Sayac kesme bayrağı sıfır olduğu müddetçe butona basılmışmı bak.Ama basmak için SAY değerinin sıfırdan büyük olmasına dikkat et.
Butona basılmış ise hem TOGGLE led yap hemde SAY=6 vererek sayacı yeniden başlat.
500 ms dolunca SAY=SAY-1 yap ve henüz SAY=0 olmamış ise işlemi tekrarla.
SAY=0 olunca her konumda LED=0 yap. ve programı başa yönlendir.

Bu algoritma ile bir kere butona basılınca led yanacak ve ardından 3 sn içinde yeniden basılmaz ise led sönecektir. Basılırsa led yine sönecek sayac baştan saymaya başlayacaktır.

Ete

designer.21

zahmetler verdim Hocam, çok teşekkürler. artık bu kodu da kendi istediğim çalışma mantığına çevirebilirim herhalde :)

designer.21

Hocam verdiğiniz kodlarda aşağıdaki gibi ufak bi kaç değişiklik yaparak; 3 saniye içinde gerçekleşen 2 buton tıklamasıyla LED TOGGLE oluyor.

Breadboard'da devresini de yaptım genelde çalışıyor Fakat arada bazen 2 tıklamayla değilde bazen 3 tıklama sonunda oluyor, nadir de olsa bazen hiç tepki vermiyor.

@ __config _BODEN_ON & _BOREN_ON & _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

CMCON=7
OPTION_REG.7=0
        
TRISA=%00000000
TRISB=%00000001
PORTA=0
PORTB=0
SYMBOL BUTON=PORTB.0
SYMBOL LED=PORTA.0

SAY VAR BYTE 56'3 sn için kesme sayaci

PAUSE 200
SAY=0
BASLA:
      SAY=0 '3 SN SAYACI
      TMR1H=$0B:TMR1L=$DC  'timer'a ön yükleme degeri verdik  'her kesme 500ms süre aliyor.
      T1CON=%00110001      'bölme orani 1/8 ve timer1 aktif edildi
                      
BASLA_BIR: 
          TMR1H=$0B:TMR1L=$DC: PIR1.0=0  'Kesme bayragi sifirlandi TIMER 500 MS IÇIN KURULDU    
          WHILE PIR1.0=0
            IF BUTON=0 THEN 
            SAY=SAY+1
            IF SAY=2 THEN TOGGLE LED
              
            WHILE BUTON=0:WEND
            PAUSE 50
            ENDIF    
          WEND      'BU SATIR ASILINCA 500 MS GEÇTI DEMEK
          SAY=SAY+1
          IF SAY=6 THEN BASLA_BIR  '6 ADET * 500=3 SN EDIYOR)  
          GOTO BASLA
END


Powered by EzPortal