;PROGRAM-36) CCP biriminin PWM modunda çalıştırılmasına örnek program. 
;Program çalıştırılınca RB3 ucuna bağlı bir LED’in parlaklığı çok küçük 
;kademeli artışlarla artar, daha sonra azalır. Bu durum enerji kesilinceye 
;kadar devam eder.  Programı denemek için gerekli devrede sadece 
;RB3 ucuna bağlı bir LED yeterli olmaktadır. 

;Şekil 15 – 7 : Prog36.asm programını denemek için kurulabilecek farklı devreler.
;İstenirse RB3 ucuna gerilimin etkin değeri değiştirilerek kontrol edilebilecek 
;bir çok uygulama devresi sürülebilir. Örneğin, DC motorun akım ve gerilim 
;değerlerine göre seçilecek bir transistör veya FET ile bir DC motorun hızı 
;değiştirilebilir. Ya da bir opto izolatörlü diyak kullanılarak sürülen triyak 
;ile 220 V luk bir lambanın parlaklığını değiştirme uygulaması yapılabilir.  

;===PROG36.ASM====11/07/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
;-----------------------------------------------------------
SAYAC1	EQU	h'20'
SAYAC2	EQU	h'21'
	ORG	h'00'
	CLRF	PORTB		;PORTB'de LED'leri söndür.
	BANKSEL	PR2		;BANK1'e geç.
	MOVLW	h'FF'		;PWM peryodunu belirlemek_
	MOVWF	PR2		;için PR2=255 atanması.
	CLRF	TRISB		;PORTB'nin tüm uçları çıkış.
	BANKSEL	PORTB		;BANK0'a geç.
	MOVLW	h'0C'	;PWM modu seç=(CCP1M3~CCP1M0='11xx') ve_
	MOVWF	CCP1CON	;doluluk oranı en düşük bitleri = b'00'
	MOVLW	h'01'		;Doluluk oranı yüksek değerlikli_
	MOVWF	CCPR1L		;bitleri = b'00000001'
	BSF	T2CON,2		;TMR2'yi çalışmaya başlat.
ARTIR	;PWM palsinin doluluk süresini süresini artırır.
	INCF	CCPR1L,F		;CCPR1L = CCPR1L + 1
	CALL	GECIKME		;Kısa bir süre aynı PWM'i gönder.
	MOVWF	h'FE'		;W<-- h'FE'
	SUBWF	CCPR1L,W		;W = CCPR1L - W
	BTFSC	STATUS,C		;W<CCPR1L mi? (doğruysa C=0 olur)
	GOTO	AZALT		;Hayır, doluluk süresini azalt.
	GOTO	ARTIR		;Evet, doluluk süresini arttır.
AZALT	;PWM palsinin doluluk süresini süresini azaltır.
	DECF	CCPR1L,F		;CCPR1L = CCPR1L - 1
	CALL	GECIKME		;Kısa bir süre aynı PWM'i gönder.
	MOVLW	h'01'		;W <-- h'01'
	SUBWF	CCPR1L,W 		;W = CCPR1L - W
	BTFSS	STATUS,C 		;W<CCPR1L mi? (doğruysa C=0 olur)
	GOTO	ARTIR		;Hayır, doluluk süresini arttır.
	GOTO	AZALT		;Evet, doluluk süresini azalt.

GECIKME		;Gecikme alt programı
	MOVLW	h'30'
	MOVWF	SAYAC1
DONGU1
	MOVLW	h'60'
	MOVWF	SAYAC2
DONGU2
	DECFSZ	SAYAC2, F
	GOTO	DONGU2
	DECFSZ	SAYAC1, F
	GOTO	DONGU1
	RETURN
	END
;-----------------------------------------------------------
