Buton Tetiklemesiyle Çalışan Timer1 Uygulaması

Buton Tetiklemesiyle Çalışan Timer1 Uygulaması
      Ra1 ve Ra4 e bağlı 2 buton üzerinden yapılan tetiklemeler ile D portuna bağlı olan ledleri sırasıyla yakıp söndüren uygulama Ra1 e 5 kere basıldığında D0-D1 portuna Bağlı ledleri 3 er saniye Aralıkla yakıp Söndüren Ra4 e 10 kere basıldığında D2-D3 portuna Bağlı ledleri 1 er saniye Aralıkla yakıp Söndüren uygulama. Timer 1 üzerinden 4 Mhz osilator ile ayarlamalar yapılmıştır Hangi Butonun kaç kere tetikleme yapacağını verdiğim açıklamalar ile ihtiyacınıza göre düzenleyebilir yine aynı şekilde verdiğim açıklamalar ile zaman aralığını da istediğiniz gibi düzenleyebilirsiniz.



							#INCLUDE "P16F877.INC"
SAYAC EQU 0X21
SAYAC2 EQU 0X22
LEDYAK EQU 0X23
LEDYAK2 EQU 0X24
BUTONSAY EQU 0X25
BUTONSAY2 EQU 0X26
ORG 0X00
GOTO MAIN
ORG 0X04
GOTO KESME

MAIN
BANKSEL ADCON1	;A portunu Dijitale çevirmek için adcon ayarı
MOVLW 0X06
MOVWF ADCON1

MOVLW 0XFF		; A portuna Button Bağlamak için giriş aldık
MOVLW TRISA

MOVLW 0X00		;D portuna Led bağlamak için çıkış aldık
MOVWF TRISD

BCF PIR1,0			;Tmr1IF kapalı konumda (açık oldugunda kesmeye gidecektir) 
BANKSEL PIE1		;kesme geldiğinde tmr1 bayrağı (tmr1ıf) set olacaktır ve 0x04 adresıne dallanacaktır
BSF PIE1,0			;Tmr1IE açık konumda (tmr1 kesmesi geldiğinde tmr1ıf bayrağı set olaacktır ve kesmeye girecektir)

BANKSEL PORTA
CLRF LEDYAK
CLRF LEDYAK2
CLRF PORTD
MOVLW 0X3C		;Tmr1 in Değeri 3CB0 alındığında (FFFF-3CB0=50.000) olacaktır
MOVWF TMR1H	;4mhz kristalde 20 döngü alırsak 1.000.000 miroSaniye = 1 saniye ye denk gelecektir
MOVLW 0XB0		;döngü içerisinde verdiğimiz 0x14 = 20 ve 0x3C=60 değerleriyle 1 saniye ve 3 saniye led yanmasını sağlayacağız
MOVWF TMR1L		;bu değerler değiştirip FF alınırsa yaklaşık 13 saniyelik led yanmaları elde edilecektir
CLRF SAYAC
CLRF BUTONSAY		;ilk buton için sayac 5 basmada yanacaktır
CLRF BUTONSAY2	;ikinci buton için sayaç
MOVLW B'11000000'		;genel/yerel kesmeler aktif hale getirildi
MOVWF INTCON

PORT_KONTROL		
	BTFSC PORTA,4		;Ra4 e bastıysam saya gidecektir
	GOTO SAY
	BTFSC PORTA,1		;Ra1 e bastıysam say2 ye gidecektir
	GOTO SAY2
	GOTO PORT_KONTROL		; butona basılıp basılmadığını sureklı kontrol edeceğiz

SAY
	BTFSC PORTA,4			;Ra4 e basıldı ve çekildiyse (Pul-down __ Pull-up)	durumunda butonsay 1 artacak
	GOTO SAY
	INCF BUTONSAY,F
	MOVLW 0X0A			;10 degerini aldık her defasında butonsay artacak 10. basışta Carry biti 1 olacaktır
	SUBWF BUTONSAY,W
	BTFSS STATUS,C			;status carry biti = herhangi bir aritmetik işlem sonucu pozitif oldugunda 1 değerini alır
	GOTO PORT_KONTROL
	GOTO TIMER_AC		;Carry 1 ise ButonSay 10 olmuş demektir (yani butona 10 kere basıldı)
SAY2
	BTFSC PORTA,1			;Say 2 de aynı şekilde Ra1 tetiklmesini sayacaktır 5 oldugunda timer_ac2 ye yönlenecektir
	GOTO SAY2
	INCF BUTONSAY2,F
	MOVLW 0X05
	SUBWF BUTONSAY2,W
	BTFSS STATUS,C
	GOTO PORT_KONTROL
	GOTO TIMER_AC2

TIMER_AC
	CLRF BUTONSAY
	BANKSEL T1CON		;Tmr1 on biti aktif hale getirilir timer aldığı değerden saymaya başlar (3CB0 değerini almıştı)
	MOVLW B'000001'
	MOVWF T1CON
	GOTO DONGU			;timer1 i açtık şimdi dongu etiketine dallanacağız

TIMER_AC2
	CLRF BUTONSAY2
	BANKSEL T1CON
	MOVLW B'000001'
	MOVWF T1CON

DONGU2
	MOVLW 0X3C		;dongu etiketiyle aynı değerlere sahiptir 
	SUBWF SAYAC2,W	;Ra1 tetiklemesi 5 kere geldiğinde 3 saniye bekle
	BTFSS STATUS,C		;3 saniye sonunda D1 i 3 saniye yak D1 sönsün D2 yi 3 saniye yak
	GOTO DONGU2		;D1 ledi (RD0 a bağlı)		D2 ledi (RD1 e bağlı)
TERS_AL2
	MOVF LEDYAK2,W
	CALL LEDLER2
	MOVWF PORTD
	INCF LEDYAK2,F
	CLRF SAYAC2
	GOTO DONGU2

DONGU
	MOVLW 0X14		;döngünün içine 20.gelişte carry biti 1 olacaktır 
	SUBWF SAYAC,W	;4mhz işlemcide yaklaşık 1 saniye ye denk geliyor
	BTFSS STATUS,C		;0x14 değeri 0x28 yapılırsa 2 saniye kadar yanacaktır
	GOTO DONGU		;10 kere Ra4 tetiklemesi yapıldığında 2 saniye sonra D3 yanar söner 2 saniye sonra D4 yanar söner ledlerde 2şer saniye yanar 
TERS_AL				
	MOVF LEDYAK,W
	CALL LEDLER		;hangi ledin yanacağını belirlemek için look-up table oluşturduk
	MOVWF PORTD
	INCF LEDYAK,F
	CLRF SAYAC
	GOTO DONGU
KESME
	INCF SAYAC,F		;dongu içerisine girdiğimizde oradan çıkamıyoruz ama timer saydığı için 
	INCF SAYAC2,F		;her FFFF den 0000 a döndüğümüzde kesmeye gelecektir
	BANKSEL PIR1		;her kesmeye geldiğinde 50.000 kere saymış olacaktır 	(50 miliSaniye)
	BCF PIR1,0			;her defasında kesme bayrağı kapatılmalı kapanmazsa kesme içinden çıkamayız çünkü bu kesme bayrağı aktif olduğunda kesmeye giriyoruz
	MOVLW 0X3C		;her gelişimizde timer için 3cb0 değerini yükleyerek 50 milisaniye de bir kesmeye gelmesini sağlıyoruz
	MOVWF TMR1H	;her gelişimizde her 50 milisaniye de sayacların değeri bir artacaktır
	MOVLW 0XB0		;ve tekrar döngüye gittiğimizde yaptığımız çıkarma işlemi poizitif olunca statuc carry biti 1 olacaktır
	MOVWF TMR1L		;ve carry bitinin yönlendirmesine göre hangi satıra hangi dallanmaya gideceğimiz belirleyeceğiz
	RETFIE

LEDLER2
	ADDWF PCL,F
	RETLW B'00000001'
	RETLW B'00000010'
LEDLER
	ADDWF PCL,F
	RETLW B'00000100'
	RETLW B'00001000'

END						;~~ WWW.mikroislemcim.COM  ~~
						



Proje kodlarını ve Proteus ISIS Tasarımını İndirmek İçin Aşağıdaki Bağlantıya Tıklayınız
download





Gönderen : Erdoğan CANBAY
978
21-09-2018