;
;					EJEMPLO 18
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;Los módulos CCPx. Modo PWM. Modulación de anchura de pulsos.
;
;Consiste en generar una señal de onda cuadrada por la línea RCx/CCPx cuyo periodo puede
;ser modificado así como la anchura del pulso (Duty Cycle). El periodo se determina según la 
;fórmula T=(PR2+1)*4*Tosc*TMR2 preescaler. La duración del pulso o "Duty Cycle" (d) se deter-
;mina según d=(CCPR1L:CCPCON1<5:4>)*Tosc*TMR2 preescaler.
;
;El ejemplo emplea al módulo CCP1 con salida de señal por la línea RC2/CCP1. La señal de 
;salida tiene un periodo determinado pora la constante "Periodo" y una anchura "Duty" 
;determinada por la constante "Duty". Un osciloscopio conectado en RC2/CCP1 puede ayudar
;a realiza las oportunas medidas.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Periodo		equ	.100		;Periodo de 100 uS
Duty		equ	.25		;Anchura 25 uS

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

;Programa principal

Inicio	        clrf	PORTA
		clrf	PORTB
		clrf	PORTC		;Borra salidas
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A E/S digitales
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'11111011'
		movwf	TRISC		;RC2 salida
		movlw	b'11101111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		movlw	Periodo-1
		movwf	PR2		;Carga el registro de periodos
		bcf	STATUS,RP0	;Selecciona banco 0

		movlw	Duty
		movwf	CCPR1L		;Carga la anchura del pulso

;El módulo CCP1 actúa en el modo PWM con salida de señal por RC2/CCP1

		movlw	b'00001100'
		movwf	CCP1CON

;El TMR2 trabaja con un preescaler 1:1 por lo que con una frecuencia de 4MHz evoluciona
;cada uS (4*Tosc)

		movlw	b'00000100'
		movwf	T2CON		;T2 en On

Loop		clrwdt			;Refresca el WDT	
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
