;
;					EJEMPLO 19
;
;				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 y un preescaler 
;de 16. La señal de salida tiene un periodo de 4 mS. La anchura del ciclo "Duty"  es variable
;y, se determina, según el valor binario de los interruptores de Micro'PIC Trainer (RA4-RA0)*8
;siendo la máxima de 3968 uS.
;
;Se puede conectar la señal de Enable del motor de la tarjeta Micro'PIC I/O a la línea
;RC2/CCP1. La velocidad de giro del mismo variará en función del valor binario de RA4-RA0

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Temporal	equ	0x20		;Variable temporal

Periodo		equ	.250		;Periodo de 250*Preescaler de 16 (4mS)

		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'00011111'
		movwf	TRISA		;RA4-RA0 entradas
		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

;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:16 por lo que con una frecuencia de 4MHz evoluciona
;cada 16uS ((4*Tosc)*16)

		movlw	b'00000111'
		movwf	T2CON		;T2 en On

Loop		clrwdt			;Refresca el WDT	
		movf	PORTA,W
		movwf	Temporal	;Carga el valor determinado por RA4-RA0
		bcf	STATUS,C
		rlf	Temporal,F
		rlf	Temporal,f
		rlf	Temporal,W	;Multiplica por 8
		movwf	CCPR1L		;Carga la anchura del pulso (n*8*Prescaler de 16)
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
