;
;					EJEMPLO 2.8
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;Máquina de embasado, eliminación de rebotes mediante una temporización.
;
;Dos relés "M1" (RB0) y "M2" (RB1) gobiernan dos motores que arrastran dos cintas 
;transportadoras. "M1" (RB0) transporta piezas y "M2" (RB1) embalajes. Un sensor "DP" (RA1) 
;detecta el paso de piezas y, otro "DE" (RA2), detecta el correcto posicionamiento de un 
;embase. Al detectarse el paso de 10 piezas, el embase se considera lleno, se activa una 
;señal acústica "A" (RB2) y, la cinta que transporta embalajes, se desplaza hasta situar un 
;nuevo embase vacío. En este momento se desactiva la señal acústica "A"(RB2) y nuevamente 
;avanza la cinta de piezas repitiéndose así el ciclo. Un interruptor "I" (RA0) activa o 
;no a todo el sistema.
	
		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

Conta_pieza	equ	0x0c		;Variable de Nº de piezas
                    
		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

;***************************************************************************************
;Delay_20_ms es una rutina que realiza una temporización de 20 mS con objeto de eliminar
;el "efecto rebote" que poseen los elementos electromecánicos.
;
;Si el PIC trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada uS. Si se desea tempo-
;rizar 20000 uS (20mS) con un preescaler de 128, el TMR0 deberá contar 156 eventos (156 *
;128 = 19968). El valor 156 equivale a 0x9c y, como el TMR0 es ascendente, habrá que car-
;gar su complemento (0x63)

Delay_20_ms:	bcf	INTCON,T0IF	;Desconecta el flag de rebosamiento del TMR0
		movlw	0x63
		movwf	TMR0		;carga el TMR0
Delay_20_ms_1	clrwdt			;Refresco del WDT
		btfss	INTCON,T0IF	;Rebasamiento del TMR0 ??
		goto	Delay_20_ms_1	;Todavía no
		return			;Ahora si

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011111'		
		movwf	TRISA		;Puerta A se configura como entrada
		movlw	b'00000110'
		movwf	OPTION_REG	;Preescaler de 128 para el TMR0
		bcf	STATUS,RP0	;Selecciona banco 0			                                                                         

Loop_0		clrf	PORTB		;Desconecta las salidas					
Loop:		clrwdt			;Refrescar el WDT
		movlw	d'10'
		movwf	Conta_pieza	;Inicia variable con Nº de piezas
		btfss	PORTA,0		;Chequea el estado del interruptor I
		goto	Loop_0		;Está en OFF, sistema parado				

		call	Delay_20_ms	;Elimina rebotes

		bcf	PORTB,0		;Avance de piezas en OFF
		bsf	PORTB,1		;Avance de embases en ON
										
No_embase	clrwdt			;Refresca el WDT
		btfss	PORTA,2		;Embase en posición ??
		goto	No_embase	;No.					

		call	Delay_20_ms	;Elimina rebotes

		bsf	PORTB,0		;Si. Avance de piezas en ON
		bcf	PORTB,1		;Avance de embases en OFF
		bcf	PORTB,2		;Acústico en OFF 
					
;Esta secuencia de instrucciones, espera que una pieza pase por el sensor "DP" en
;su totalidad

Pieza_0		clrwdt			;Refresca el WDT
		btfss	PORTA,1		;Llega la pieza ??
		goto	Pieza_0		;Todavía no

		call	Delay_20_ms	;Elimina rebotes

Pieza_1		clrwdt			;Ahora si. Refresca el WDT
		btfsc	PORTA,1		;Ha pasado la pieza frente al sensor "DP" ??
		goto	Pieza_1		;Todavía no					

		call	Delay_20_ms	;Elimina rebotes

		decfsz	Conta_pieza,F	;Ahora si. Decrementa contador de piezas

		goto	Pieza_0		;Esperar el paso de una nueva pieza					

		bcf	PORTB,0		;Han pasado 10, avance de piezas en OFF
		bsf	PORTB,1		;Avance de embases en ON
		bsf	PORTB,2		;Acústico en ON					

Si_embase	clrwdt			;Refresca el WDT
		btfsc	PORTA,2		;Sigue el mismo embase posicionado ??
		goto	Si_embase	;Todavía si

		call	Delay_20_ms
					
		goto	Loop		;Ahora no

		end			;Fin del programa fuente
