;PROGRAM-26) TMR0 zamanlayıcısının dahili komut frekansı ile saymasının 
;sağlanmasına örnek program. RB0 ve RB1 uçlarına bağlı LED'leri 1’er  
;sn aralıklarla birini yakıp diğerini söndüren ve bu işlemi her 
;kesme oluştuğunda devamlı olarak tekrar eden program. 



;===PROG26.ASM====27/05/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ış
	MOVLW	b'11010111'	; T0CS=0, PSA=0, Fre_Böl=1/256
	MOVWF	OPTION_REG	; W'yi OPTION saklayıcıya yükle
	BANKSEL	PORTB		; BANK0’a geç
	BSF	INTCON,7	; Tüm kesmeler izin ver.
	BSF	INTCON,5	; TMR0 kesmesine izin ver.
	BSF	PORTB,0		; RB0 LED'ini yak
	BCF	PORTB,1		; RB1 LED'ini söndür
DONGU				; Ana program sonsuz dongü içerisinde
	GOTO	DONGU		; devamlı olarak çalışır.
KESME_ALT_PROG
	BCF	INTCON,2	; TMR0 kesmesini sonrakilere hazırla
	MOVLW	h'D9'		; TMR0 ilk sayısı = d’217’
	MOVWF	TMR0		; TMR0 saymaya başlar
	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 ve bekle.
	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'lerini tersle
KESME_SONU
	RETFIE				; ana programa dön.
	END
;-----------------------------------------------------------
