;
;					EJEMPLO 17
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;Los módulos CCPx. Modo de Comparación. Disparo de eventos
;
;Los módulos CCPx pueden disparar, en el modo de comparación, diferentes eventos al coinci-
;dir el valor del TMR1 con el valor prefijado en los registros CCPRxL y CCPRxH. El módulo 
;CCP1 concretamente, puede provocar un reset del TMR1 poniéndolo a 0. De esta forma, los 
;registros CCPR1L y CCPR1H, actúan como registros de periodo.
;		
;El ejemplo propone el control del Nº de vueltas o pasos que gira el motor DC alojado en la
;tarjeta Micro'PIC I/O. Un encoder proporciona un pulso por cada paso dado. Este se aplica,
;mediante RC0/T1CKI, al TMR1 que los va contando. Cuando se alcanza el valor establecido en
;la constante "Horario", el motor se detiene, se realiza una temporización y se inicia el
;movimiento en sentido contrario tantos pasos como indique la constante antihorario.
;
;Las señales de salida RB0 y RB1 gobiernan el sentido de giro y RB2 el On/Off del motor.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Horario		equ	.500		;Pasos de giro horario
Antihorario	equ	.300		;Pasos de giro antihorario
Delay_Cont	equ	0x20		;Variable de temporización
Giro		equ	0x21		;Flag señalizador de sentido de giro

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		
	
;Programa de tratamiento de la interrupción 

Inter		bcf	PIR1,CCP1IF	;Reponer el flag del módulo CCP1
		clrf	PORTB		;Motor en Off

;Se temporiza 50 ms tantas veces como indique la variable delay. El TMR0 se carga con 195
;que, con un preescaler de 256, rebasa al de 50mS.

Delay		movlw	~.195
		movwf	TMR0
Delay_50	clrwdt			;Refrescar el WDT
		btfss	INTCON,T0IF	;Han pasado 50 mS ??
		goto	Delay_50	;No, esperar
		bcf	INTCON,T0IF	;Reponer el flag del TMR0
		decfsz	Delay_Cont,F	;Se ha repetido tantas veces indique Delay_Cont ??
		goto	Delay		;Todavía no, temporizar otros 50 mS
		movlw	.20
		movwf	Delay_Cont	;Iniciar variable de temporización
		btfsc	Giro,0		;Giro horario ??
		goto	G_Horario	;No, giro horario

G_Anti_horario	incf	Giro,F		;Selecciona próximo giro horario
		movlw	high Antihorario
		movwf	CCPR1H
		movlw	low  Antihorario
		movwf	CCPR1L		;Ajusta Nº de pasos anti-horario
		movlw	b'00000101'
		movwf	PORTB		;Giro anti-horario
		retfie

G_Horario	incf	Giro,F		;Selecciona próximo giro antihorario
		movlw	high Horario
		movwf	CCPR1H
		movlw	low Horario
		movwf	CCPR1L		;Ajusta Nº de pasos horario
		movlw	b'00000110'
		movwf	PORTB		;Giro horario
		retfie

;Programa principal

Inicio	        clrf	PORTB		;Desconecta salidas
		clrf	PORTC
		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'11111111'
		movwf	TRISC		;RC0 entrada
		movlw	b'11000111'
		movwf	OPTION_REG	;Preescaler de 256 asociado al TMR0
		bsf	PIE1,CCP1IE	;Habilita interrupción del módulo CCP1
		bcf	STATUS,RP0	;Selecciona banco 0
	
;El módulo CCP1 actúa en modo de comparación con disparo de eventos. Los registros CCPR1L y
;CCPR1H forman un registro de 16 bits que actúa a modo de registro de periodos, provocando 
;que el TMR1 se reinicie cada vez que alcance el valor prefijado en esos registros.

		movlw	b'00001011'
		movwf	CCP1CON		;CCP1 en modo comparación con disparo de eventos

		movlw	high Horario
		movwf	CCPR1H
		movlw	low Horario
		movwf	CCPR1L		;Carga el Nº de pasos en sentido horario
		clrf	TMR1L
		clrf	TMR1H		;Puesta a 0 del TMR1
		
;El TMR1 actúa en el modo contador de pulsos externos (los que genera el encoder) y con un 
;preescaler de 1:1. 

		movlw	b'00000011'
		movwf	T1CON		;TMR1 en On

		movlw	.20
		movwf	Delay_Cont	;Inicia variable de temporización (1 seg.)
		clrf	Giro		;Inicia flag de giro horario

		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones
		movlw	b'00000110'
		movwf	PORTB		;Motor On, giro horario

Loop		clrwdt			;Refresca el WDT	
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
