
;PROGRAM-29) TMR2 zamanlayıcısının kullanılmasına örnek program. 
;Prog26.asm ve prog28.asm’de yapılan programın aynısının TMR2 nasıl 
;yapılacağını ve bu zamanlayıcının temel kullanım özelliklerini gösterir. 
;Programda RB0 ve RB1 uçlarına bağlı LED’ler 1 sn aralıklarla yanarlar.

;===PROG29.ASM====06/06/2005================================
	LIST	P=16F628A
	INCLUDE	"P16F628A.INC"
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;-----------------------------------------------------------
SAY_10mS	EQU	h'20' 	;10 mS'leri sayma değişkeni
	ORG	h'000'		;Reset veya ilk gerilim verildiğinde
	GOTO	BASLA		;Ana program başlangıcına git.
	ORG	h'004'		;Kesme oluştuğunda
	GOTO	KESME_ALT_PROG	;Kesme alt programına dallan
BASLA					;Ana program başlangıcı
	CLRF	PORTB		;PORTB'deki LED'leri tüm söndür	
	BANKSEL	TRISB		;BANK1'e geç 
	CLRF	TRISB		;PORTB'nin tüm uçları çıkış
	BSF	PIE1,1		;TMR2 kesmesine izin ver
	MOVLW	d'39'		; TMR2'nin üst sayma değerini
	MOVWF	PR2			; TMR2'ye yükle
	BANKSEL	PORTB		; BANK0’a geç
	MOVLW	b'01111111'	; TMR2ON=1, Ön fre böl=1/16
	MOVWF	T2CON		; Son fre böl=1/16
	BSF	INTCON,7	; Tüm kesmeler izin ver.
	BSF	INTCON,6	; Çevresel kesmelere izin ver.
	BSF	PORTB,0		; RB0= LED'ini yak
	BCF	PORTB,1		; RB1= LED'ini söndür
DONGU		     ;Ana program bu sonsuz dongü içerisinde
	GOTO	DONGU		; devamlı olarak çalışır.
KESME_ALT_PROG
	BCF	PIR1,1		; TMR2 kesmesini sonrakilere hazırla
	INCF	SAY_10mS,F	; 10 mS'leri tutan sayacı 1 arttır
	MOVLW	d'100'		; W<-- d'100'
	SUBWF	SAY_10mS,W	; W = SAY_10mS - W
	BTFSS	STATUS,Z	; SAY_10mS=100 oldu mu?
	GOTO	KESME_SONU	; Hayır, ana programa git.
	CLRF	SAY_10mS	;Evet,10 mS'leri tutan sayacı sıfırla
	MOVLW	b'00000011'	; Terslenecek bit’leri W'ye yükle
	XORWF	PORTB,F		; RB0 ve RB1'i LED'leri terslendi
KESME_SONU
	RETFIE				; Ana programa dön.
	END
;------------------------------------------------------
