
' *********** SOFTWARE DE CONTROL DE DISPENSADORA DE ETIQUETAS IP CON PIC 16F877 ******************
' ****************   TRADUCIDO AL ESPAÑOL V 01      21/03/2003	     *******************
' *** Versión IP basado en la versión LA200_2a.bas de 3M   13/05/03  solo cambio carteles  ***

Include	"modedefs.bas"

DEFINE LCD_DREG	PORTD
DEFINE LCD_DBIT	0			'BUS DE DATOS PIN D0,D1,D2,D3
DEFINE LCD_RSREG	PORTC
DEFINE LCD_RSBIT	5			'RS PIN C5
DEFINE LCD_EREG	PORTC			
DEFINE LCD_EBIT	4			'E  PIN C4
DEFINE LCD_BITS	4
DEFINE LCD_LINES	2
DEFINE	OSC 20			'SETEO EL CRISTAL EN 20 Mhz
'DEFINE  I2C_SLOW	1	' SETEO LA VELOCIDAD DEL BUS I2C


'*************************************** INICIALIZACION DE LA EEPROM *******************************
'************ SE GRABA EN EL MOMENTO DE GRABACION DEL PIC NO CADA VEZ QUE ARRANACA EL SOFT *********

EEPROM 1,[1,1,76,0,0,0,7,0,0]		'INICIALIZACION DE PROG1,OFFSET=332,MODO= 0(SINCRONICA), CICLO=0 (DIRECTO), FOTO = 0 (NA)
EEPROM 10,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 20,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 30,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 40,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 50,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 60,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 70,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 80,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 90,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 100,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 110,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 120,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 130,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 140,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 150,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 160,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 170,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 180,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 190,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 210,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 220,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 230,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 240,[0,0,0,0,0,0,0,0,0,0]	
EEPROM 250,[0,0,0,0,0,0]	

'************************************ FIN DE INICIALIZACION DE LA EEPROM ***************************




A		var 	byte		'UNIDAD
B		var 	byte		'DECENA
N		VAR 	BYTE
NUMERO 		VAR	WORD		'VARIABLE EN LA QUE ALMACENA EL NUMERO PRESIONADO
PRODUCT		VAR 	WORD		'VARIABLE DE ALACENAMIENTO DEL RETARDO DE APLICACION DE ETIQUETA
PRODUCTL	VAR	PRODUCT.byte0
PRODUCTH	VAR	PRODUCT.byte1
VAR_PRODUCT_A	VAR	WORD		'VARIABLE USADA PARA CALCULAR EN MM EL RETARDO DE PRODUCTO
CONTADOR	VAR	WORD		'VARIABLE USADA PARA ALMACENAR LA CUENTA DE DISPARO
CONTADORL	VAR	CONTADOR.byte0
CONTADORH	VAR	CONTADOR.byte1
CONTADORB	VAR	WORD		'VARIABLE USADA PARA  LA CUENTA DE DISPARO TEMPORAL

CONTADOR_PRODUCT	VAR	WORD	'VARIABLE PARA CONTAR EL RETARDO DE PRODUCTO
CONTADOR_PRODUCT_B	VAR 	BYTE	'VARIABLE PARA CONTAR EL RETARDO DE PRODUCTO
LABEL_STOP	VAR	WORD		'VARIABLE USADA PARA LA PARADA DE LA ETIQUETA
LABEL_STOPL	VAR	LABEL_STOP.byte0	'BYTE BAJO DE LABEL_STOP
LABEL_STOPH	VAR	LABEL_STOP.byte1	'BYTE ALTO DE LABEL_STOP
VELOCIDAD	VAR	WORD		'VARIABLE USADA PARA ALMACENAR LA VELOCIDAD
VELOCIDADL	VAR	VELOCIDAD.byte0		'BYTE BAJO DE VELOCIDAD
VELOCIDADH	VAR	VELOCIDAD.byte1		'BYTE ALTO DE VELOCIDAD
FUNCION		VAR	BYTE		'VARIABLE EN LA QUE ALMACENA LA FUNCION PRESIONADA
DIGITO		VAR 	BYTE		'CONTADOR PARA NÚMERO DE DIGITO PRESIONADO
USO		VAR	BYTE
DIRECCION	VAR	BYTE		'
PROGRAMA	VAR	BYTE		' VARIABLE DE ALMACENAMIENTO DEL NÚMERO DE PROGRAMA
bogus 		VAR		BYTE	' Used to store intermediate results of the multiply
WRESULT		VAR 	WORD
WW0		VAR 	WORD
WW1		VAR 	WORD
CONT_TAMP	VAR	WORD
CONFIG		VAR	BYTE		'BYTE DE AMACENAMIENTO PARA LA CONFIGURACION DEL EQUIPO POR MEDIO DE LOS BITS SIGUIENTES
MODO    	VAR	CONFIG.0        'MODO DE FUNCIONAMIENTO 0=SINCRONICO 1=TAMP /BLOW
CICLO		VAR	CONFIG.1	'VARIAVLE DE ALAMCENAMIENTO DEL CICLO DE TAMP/BLOW 0=DIRECTO 1=INVERSO
LOGICA_DISPARO 	VAR	CONFIG.2	'MODO DE FUNCIONAMIENTO DE LA FOTO DE DISPARO 0=NO 1=NC
GIRO		VAR	CONFIG.3	'SENTIDO DE GIRO DEL MOTOR 0 = DERECHA  1 = IZQUIERDA 
POLILIDAD_DISPARO VAR	CONFIG.4	'TIPO DE LA ENTRADA DE FOTOCELULA 0=NPN  1=PNP
CLAVE_ACTIVADA	VAR	CONFIG.5	'MARCA PARA RESTRINGIR EL ACCESO DEL USUARIO A EDISION DE PROGRAMAS
TAMP		VAR	BYTE		'VARIABLE DE USO PARA EL TIEMPO DE TAMP
GENERAL		VAR	BYTE		'MARCA PARA INDICAR QUE SE DETECTÓ LA PRMERA CAJA
FILTRO		VAR	BYTE		'
TECLA		VAR 	BYTE		'VARIABLE DE ALMACENAMIENTO DEL LA TECLA PRESIONADA
NIBLEB		VAR	BYTE		'VARIABLE USADA PARA EL NIBLE SUP DEL PUERTO B
ENTRADA		VAR	BYTE		'VARIABLE USADA PARA ALMACENAR LA ENTRADA ANALOGICA
GAP		VAR 	BYTE		'VARIABLE USADA DETERMINAR 
MINIMO		VAR 	BYTE		'VARIABLE USADA PARA ALMACENAR EL VALOR MINIMO DE LA ENTRADA ANALOGICA
MAXIMO		VAR 	BYTE		'VARIABLE USADA PARA ALAMCENAR EL VALOR MAXIMO DE LA ENTRADA ANALOGICA
CONTA_ADC	VAR	BYTE		'
RAMPA		VAR 	BYTE		'
INTER_DELAY	VAR	BYTE		'RETARDO DESDE QUE TERMINA DE DISPENSAR HASTA QUE APLICA
RETORNO_DELAY	VAR	BYTE		'TIEMPO DE RETARDO DESDE QUE SE CUMPLIO EL TIEMPO DE TAMP/BLOW HASTA
					' QUE HABILITA EL CILO SIGUIENTE
L		VAR 	WORD		'LARGO DE LA ETIQUETA
L_L		VAR	L.byte0
L_H		VAR	L.byte1
Z		VAR 	WORD
VAR_LABEL_STOP  VAR 	WORD		'VARIABLE USADA PARA  CONTAR LOS MILIMETROS DE LABEL STOP
TOPE		VAR	WORD		' VARIABLE USADA PARA DETERMINAR EL TOPE NUMERICO DEL INGRESO DE DATOS 
CONTADOR_MS	VAR	WORD		'VARIABLE USADA PARA ALMACENAR LA CUENTA DE MILISEGUNDOS
DIVISOR		VAR	WORD		'VARIABLE USADA PARA REALIZAR UNAS DIVISION DE SHAFT ENCODER
DIVISORL	VAR	DIVISOR.byte0	'BYTE BAJO DE DIVISOR
DIVISORH	VAR	DIVISOR.byte1	'BYTE ALTO DE DIVISOR
OFFSET		VAR 	WORD		'VARIABLE PARA ALMACENAR LA DISTANCIA EN MILIMETROS DESDE EL SENSOR HASTA LA LANZA
OFFSETL		VAR	OFFSET.byte0	'BYTE BAJO DE OFFSET
OFFSETH		VAR	OFFSET.byte1	'BYTE ALTO DE OFFSET
OFFSET_STEPP	VAR 	WORD		'VARIABLE DE CALCULO DE  LA DISTANCIA EN STEPPS DESDE EL SENSOR HASTA LA LANZA
RELACION	VAR	WORD		'VARIABLE USADA PARA CALCULAR LA RELACION DE STEPPS A MILIMETROS
					'MOTOR = 200 STEP * VUELTA
					'DRIVER 1/10 --> 2000 STEP * VUELTA
					'DIAMETRO RODILLO = D = 50 mm  (ahora 30 mm)
					'PERIMETRO = P = PI*D = 157
					'157 mm ------  2000 STEPP
					'1 mm   ------ x = 2000 / 157 = 13 = RELACION  ( ahora 19)
					'
					' VELOCIDAD = VEL mts * min
					' VELOCIDAD = VEL (dmts) * 100 / 60 * mm / seg
					'			
					' VELOCIDAD = VEL (dmts) * (100 / 60) * RELACION pulsos / seg
					'
					'	F = VEL  * (100 / 60) * RELACION pulsos * seg
					'	T = 1 / F = 60 / (VEL*100*RELACION)
					'	T(tmr1) = 1/f(trm1) = 1/(5e6/2)		por prescaler 2
					'	T(trm1) = 1/2.5E6
					'
					'	T = N * T(trm1) => N = T / T(trm1)     N es el numero 
					'	que hay que cargar al  TRM1 para que genere la frecuencia deseada
					'	
					'	N = (60 / (VEL*100*RELACION)) * 2.5E6
					'
					'	
					'
					'

PRESCALER	VAR	WORD		'VARIABLE USADA PARA DAR LA FRECUENCIA DE STEPP CON EL TIMER1
PRESCALERL	VAR 	PRESCALER.byte0
PRESCALERH	VAR 	PRESCALER.byte1
CUENTA_ERROR	VAR	WORD		'VARIABLE MEDIR ERROR POR FALTA DE ETIQUETA

PARADA		VAR 	BIT
PRESENCIA	VAR 	BIT		' MARCA USADA PARA DETERMINAR SI HAY PRESENCIA
REBOBINAR	VAR	BIT		' MARCA PARA INDICAR QUE HAY QUE REBOBINAR
DISPENSADA	VAR 	BIT		' MARCA PARA INDICAR QUE HAY UNA ETIQUETA EN EL TAMP PARA APLICAR
APLICAR		VAR	BIT		' MARCA QUE INDICA QUE HAY QUE APLICAR TAMP
RETARDO		VAR 	BIT		' MARCA QUE INDICA QUE HAY QUE ESPERAR EL RETARDO DE PRODUCTO
ERROR		VAR 	BIT		' MARCA PARA INDICAR QUE HAY UN ERROR DE LA ETIQUETADORA
ENTERO		VAR 	BIT
INCO		VAR 	BIT		'MARCA USADA PARA VALIDAR LA CLAVE
BAJOINSUMO	VAR 	BIT		
LEERTECLADO	VAR	BIT		'MARCA QUE INDICA QUE SE HA PRESIONADO UNA TECLA
DOBLE		VAR 	BIT		'MARCA USADA PARA REALIZAR UNA GRABACION DE 16 BITS
BANDERA		VAR 	BIT		'MARCA USADA PARA DETECTAR EL CAMBIO FLANCO DE DETECCION
INERCIA		VAR 	BIT		'MARCA PARA DAR UN TIEMPO  POR LA INERCIA DE PARA DEL MOTOR
TIMEOUT		VAR 	BIT		'MASCARA USADA PARA DAR UN TIMEOUT DE NO DETECION DE TACO
MARCHA		VAR	BIT		'BANDERA PARA INDICAR QUE ESTA EN MARCHA
COMPENSAR	VAR	BIT		'BANDERA PARA INDICAR QUE HAY QUE COMPENSAR
SALIR		VAR 	BIT		'BANDERA PARA DETERMINAR DETCCION DE CALLE DE ETIQUETA
CONFI 		VAR 	BIT		'BANDERA PARA INDICAR AUTOSETEO DEL GAP Y ETIQUETA
AUTOCALIBRACION	VAR 	BIT		'BANDERA PARA ACTIVAR LA RUTINA DE AUTOCALIBRACION
DETECTA1	VAR	BIT		'BANDERA PARA INDICAR LA PRIMERA VEZ QUE SE DETECTA GAP PARA MEDIR LA ETIQUETA
DETECTA_LABEL	VAR 	BIT		'BANDERA PARA INDICAR CAMBIO DE ETIQUETA A CALLE
PARAR		VAR 	BIT		'BANDERA QUE INDICA QUE HAY QUE VALIDAD EL LABEL STOP
ARRANCA_MOTOR	VAR 	BIT
ACTIVA_TAMP_BLOW	VAR	BIT	'BANDERA PARA INDICAR QUE HAY QUE ACTUAR EL TAMP/BLOW
INV 		VAR 	BIT
DELAY_TAMP	VAR 	BIT		'BANDERA 
DELAY_CICLO	VAR 	BIT		'BANDERA DE RETARDO DE CICLO
ACTIVA_PRESENCIA VAR	BIT		'BANDERA PARA ACTIVAR LA DETECCION DE FOTOCELULA
ENTRADA_FOTO	VAR	BIT		'BIT PARA ALMACENAR EL ESTADO ANTERIOR DE LA ENTRADA DE FOTO
FLANCO		VAR	BIT		'MARCA PAR INDICAR QUE CAMBIO LA ENTRADA DE FOTO

CONSTANTE	CON	10		'CONSTANTE DE CALCULO DEL TIEMPO EN RELACIÓN A LARGOS A VELOCIDA 27 MTS * MIN
TNOREAD		CON	100			'CONSTANTE QUE INDICA UNA CUENTA DE DE 100 * 1000 USEG = 100 MSEG
TTECLADO	CON	254		'CONSTANTE QUE INDICA UNA CUENTA DE 255 * 1000 USEG = 255 MSEG



ARRIBA		CON	187 'CONSTANTES QUE IDENTIFICAN LA ECODIFICACION DE LAS TECLAS
ABAJO		CON	189
ENT		CON	190
ESC		CON	183
F1		CON	215
F2		CON	219
F3		CON	221
F4		CON	222	



CONFI_SENSOR	CON	93		'CONSTANTE QUE INDICA TECLA ARRIBA Y ABAJO JUNTA PARA CONFIGURAR
CONT		CON	%10100000		'BYTE DE CONTROL DE LA MEMORIA EEPROM
CUENTA1		CON 	20		'VARIABLE DE CUENTA A LA QUE TIENE QUE LLEGAR EL SAHFT PARA BTENER LA VELOCIDAD


'*****************************************************************************************************************
'*******************************	DEFINICIONES	**********************************************************
'
'

'*****************************************************************************************************************
'*******************************     INICIALIZACIONES   **********************************************************

	FUNCION = 0
	DIGITO = 1
	CONTADOR_MS = 0
       	GENERAL = 0		
	PRESENCIA = 0
	FILTRO = 0
	CONT_TAMP = 0
	PORTA.2 = 0		' SE PONE A UNO START PRINT PARA ACTIVAR LA IMPRESION
	REBOBINAR = 0
	LABEL_STOP= 0
	VAR_LABEL_STOP= 0
	VAR_PRODUCT_A = 0
	CONTADOR_PRODUCT = 0
	CONTADOR_PRODUCT_B = 0
	SALIR= 0 
	A = 0
	B = 0
	APLICAR = 0
	RETARDO = 0
	INERCIA = 0 
	ERROR = 0
	PARAR = 0
	L = 0
	LEERTECLADO = 0	
	TOPE = 255
	ENTERO	= 1
	BAJOINSUMO = 0
	BANDERA = 0
	CONTADOR_MS = 0
	TIMEOUT	= 0
	T1CON.0 = 0		'TIMER1  OFF
	TIMEOUT = 0
	CONFI = 0
	ACTIVA_TAMP_BLOW = 0
	AUTOCALIBRACION	= 0
	DETECTA1 = 0	
	DETECTA_LABEL = 0	
	MARCHA	=0
	CONTA_ADC = 0
	ARRANCA_MOTOR = 0
	INV = 0
	DELAY_TAMP = 0
	DISPENSADA = 0
	DELAY_CICLO = 0
	CONTADORB = 0
	ACTIVA_PRESENCIA = 1
	RELACION = 13	'CALCULO DE CANTIDAD DE STEPP POR MM  PARA DIAMETRO 50
'	RELACION = 16	'CALCULO DE CANTIDAD DE STEPP POR MM
       	GOSUB ACTUALIZAR
	T1CON =  0
	DIVISOR = $FA00
	TMR1H = DIVISORH
	TMR1L = DIVISORL	'$A4
	TMR0 = 	61              '(256 - 195)--> 195 ES :((F/4)/PRESCALER)/FTRM1 --> ((20E6/4)/256)/10000
				' FRECUENCIA DE TIMER0 = 1000HZ = 10 mSEG

	INTCON = %00000000	'SE DESHABILITA LA INTERRUPCIÓN GLOBAL y la  INT
	PIR1 = 0
	PIE1=%00000001
	'	PIE1.0 = 1
	INTCON = %01000000 	'%01100000	se habilita interrupcion de perifericos y TIMER0
	OPTION_REG= %00000111	'PULL-UP HABILITADO EN PORTB,CLOCK interno, INCREMENTA TIMMER0 DE A 1, PRESCALER 256
	T1CON = %00010100	'TIMER1 PRESCALER 1:2, TIMER , CLOCK INTERNO (F/4), STOP TIMER1

	ADCON1 = %00001110		'SE SETEAN PUERTO A COMO A0 ANALOGICA Y EL RESTO DIGITALES
        ADCON0 = %10000001              ' Seteo A/D to RC clock, Channel 0, On
        Pause 1                         ' Wait for channel to setup

	
	TRISA.0 = 1			'ENTRDADA DE SENSOR DE ETIQUETA 1
	TRISA.1 = 1			'ENTRDADA DE SENSOR DE ETIQUETA 2 (OPCIONAL)
	TRISA.2 = 0			'SALIDA DE ASIST 
	TRISA.3 = 0			'SALIDA DE TAMP/BLOW
	TRISA.4 = 1			'ENTRADA PNP DE PRESENCIA
	TRISA.5 = 0			'SALIDA DE PRINT O CODER

	On Interrupt GoTo miint ' Define interrupt handler
	
	TRISE  = %00000000		'CONFIGURO EL PUERTO E COMO O (E0 = ALARMA, RELE ROJA, E1 = RELE AMARILLA, E3 = RELE VERDE)
	TRISB = %11111111		'CONFIGURO EL PUERTO B COMO I/O

	PORTB = 0
	PARADA = 0

	TRISD.4 = 0			'SALIDA DE TECLADO FILA 4			
	TRISD.5 = 0			'SALIDA DE TECLADO FILA 3			
	TRISD.6 = 0			'SALIDA DE TECLADO FILA 2		
	TRISD.7 = 0			'SALIDA DE TECLADO FILA 1			


	TRISC.0 = 1			'ENTRADA DE ENCODER
	TRISC.1 = 0			'SALIDA DE STEPP
	TRISC.2 = 0			'SENTIDO DE GIRO DEL MOTOR
	TRISC.3 = 0			'DISABLE DEL DRIVER
	TRISC.6 = 0			'TX RS232
	TRISC.7 = 1			'RX RS232

       


		
	PAUSE 100
	GOSUB leer_teclado

		IF	LEERTECLADO = 1  THEN

				IF TECLA = 155   THEN	'MODO MANTENIMIENTO

                                        GOSUB LCDMANTENIMIENTO
					PAUSE 600
										


					TECLA = 0

					
					NUMERO = 1
					
					WHILE	TECLA <> ESC
	
						GOSUB	leer_teclado					
				

							PAUSE 300			' NK 200
							IF TECLA = ABAJO	THEN		' SE PRESIONO LA TRECLA DERECHA BAJAR VALOR
								IF NUMERO > 1	 THEN
		
									NUMERO = NUMERO - 1
								ENDIF
								TECLA = 0
							ENDIF
	
							IF TECLA = ARRIBA	THEN		' SE PRESIONO LA TECLA DERECHA SUBE VALOR
		
								IF NUMERO < 12 THEN
									NUMERO = NUMERO + 1
								ELSE
									NUMERO = 12
								ENDIF
								TECLA = 0
							ENDIF
						

							IF NUMERO = 1  THEN



							 '     	Lcdout $fe, 1   ' Clear LCD screen
								GOSUB CLRLCD
				     				Lcdout "VALOR   ETIQUETA"


								IF TECLA = ENT	THEN


								       	INTCON.7 = 1	'SE HABILITA LA INTERRUPCIÓN GLOBAL
	
									T1CON .0 = 1		' HABILITO EL TIMER 0

									WHILE TECLA <> ESC
										GOSUB	leer_teclado	
										'GOSUB LEER_GAP
										GOSUB DELAY_100
									       	Lcdout $fe, 1   ' Clear LCD screen
	     									Lcdout "* VALOR SENSOR *"
										GOSUB LINEFEDD
										Lcdout #ENTRADA
									WEND
								
		
								       	INTCON.7 = 0	'SE HABILITA LA INTERRUPCIÓN GLOBAL
	
									T1CON .0 = 0		' HABILITO EL TIMER 0
									TECLA = 0
								ENDIF
	
							ENDIF

							IF NUMERO = 2 THEN



							  '    	Lcdout $fe, 1   ' Clear LCD screen
								GOSUB CLRLCD
				     				Lcdout "OFFSET DE LANZA "

								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = OFFSET
									TECLA = 0
									TOPE = 1000
									ENTERO = 1
									GOSUB	INGRESO
									OFFSET = NUMERO
									WRITE 2,OFFSETH
									PAUSE 10
									WRITE 3,OFFSETL
                                                                     	TECLA = 0
                                                                        NUMERO = 2
								ENDIF

							ENDIF
							IF NUMERO = 3 THEN
								GOSUB CLRLCD
				     				Lcdout "*CONTADOR PROD.*" 


								IF TECLA = ENT	THEN
                                                                        GOSUB LINEFEDD
                                                                        Lcdout #CONTADOR

									WHILE TECLA <> ESC 
										GOSUB	leer_teclado	
									WEND
									TECLA = 0
                                                                        NUMERO = 3
								ENDIF
	
							ENDIF

							IF NUMERO = 4 THEN
								GOSUB CLRLCD
				     				Lcdout "MODO 0=SIN 1=T/B" 
								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = MODO
									TECLA = 0
									TOPE = 1
									ENTERO = 1
									GOSUB	INGRESO
									MODO = NUMERO
									WRITE 6,CONFIG
									PAUSE 10

                                                                     	TECLA = 0
                                                                        NUMERO = 4
								ENDIF


							ENDIF
						

							IF NUMERO = 5 THEN
								GOSUB CLRLCD
				     				Lcdout "CICLO 0=DI 1=INV" 
								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = CICLO
									TECLA = 0
									TOPE = 1
									ENTERO = 1
									GOSUB	INGRESO
									CICLO = NUMERO
									WRITE 6,CONFIG
									PAUSE 10

                                                                     	TECLA = 0
                                                                        NUMERO = 5
								ENDIF


							ENDIF


							IF NUMERO = 6 THEN	' MENU DE CLAVE
								GOSUB CLRLCD
				     				Lcdout "EDICION PROGRAMA" 
								GOSUB LINEFEDD
				     				Lcdout "       0=NO 1=SI" 

								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND

               								NUMERO = CLAVE_ACTIVADA
									TECLA = 0
									TOPE = 1
									ENTERO = 1
									GOSUB	INGRESO
									CLAVE_ACTIVADA = NUMERO
									WRITE 6,CONFIG
									PAUSE 10
                                                                     	TECLA = 0
                                                                        NUMERO = 6

								ENDIF


							ENDIF



							IF NUMERO = 7 THEN
								GOSUB CLRLCD
				     				Lcdout "RAMPA ACELERAC. " 
								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = RAMPA
									TECLA = 0
									TOPE = 30
									ENTERO = 1
									GOSUB	INGRESO
									RAMPA = NUMERO
									WRITE 7,RAMPA
									PAUSE 10

                                                                     	TECLA = 0
                                                                        NUMERO = 7
								ENDIF


							ENDIF


							IF NUMERO = 8 THEN
								GOSUB CLRLCD
				     				Lcdout "RET. INTER CICLO" 
								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = INTER_DELAY
									TECLA = 0
									TOPE = 255
									ENTERO = 1
									GOSUB	INGRESO
									INTER_DELAY = NUMERO
									WRITE 8,INTER_DELAY
									PAUSE 10
                                                                     	TECLA = 0
                                                                        NUMERO = 8
								ENDIF


							ENDIF

							IF NUMERO = 9 THEN
								GOSUB CLRLCD
				     				Lcdout "RET.  FIN  CICLO" 
								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = RETORNO_DELAY
									TECLA = 0
									TOPE = 255
									ENTERO = 1
									GOSUB	INGRESO
									RETORNO_DELAY = NUMERO
									WRITE 9,RETORNO_DELAY
									PAUSE 10
                                                                     	TECLA = 0
                                                                        NUMERO = 9
								ENDIF


							ENDIF


							IF NUMERO = 10 THEN
								GOSUB CLRLCD
				     				Lcdout "GIRO 0=IZQ 1=DER" 
								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = GIRO
									TECLA = 0
									TOPE = 1
									ENTERO = 1
									GOSUB	INGRESO
									GIRO = NUMERO
									WRITE 6,CONFIG
									PAUSE 10
                                                                     	TECLA = 0
                                                                        NUMERO = 10
								ENDIF


							ENDIF


							IF NUMERO = 11 THEN
								GOSUB CLRLCD
				     				Lcdout "LOGICA DE SENSOR" 
								GOSUB LINEFEDD
				     				Lcdout "       0=NA 1=NC" 

								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = LOGICA_DISPARO
									TECLA = 0
									TOPE = 1
									ENTERO = 1
									GOSUB	INGRESO
									LOGICA_DISPARO = NUMERO
									WRITE 6,CONFIG
									PAUSE 10

                                                                     	TECLA = 0
                                                                        NUMERO = 11
								ENDIF


							ENDIF


							IF NUMERO = 12 THEN
								GOSUB CLRLCD
				     				Lcdout "SENSOR  PRODUCTO" 
								GOSUB LINEFEDD
				     				Lcdout "     0=NPN 1=PNP" 

								IF TECLA = ENT	THEN
                                                                        WHILE  TECLA = ENT
                                                                          	GOSUB	leer_teclado
                                                                        WEND
               								NUMERO = POLILIDAD_DISPARO
									TECLA = 0
									TOPE = 1
									ENTERO = 1
									GOSUB	INGRESO
									LOGICA_DISPARO = NUMERO
									WRITE 6,CONFIG
									PAUSE 10

                                                                     	TECLA = 0
                                                                        NUMERO = 12
								ENDIF


							ENDIF


					WEND
					GOSUB ACTUALIZAR
						
                        		GOSUB LCDPRINCIPAL
				ENDIF
		ENDIF

	PORTC.3 = 1			'HABILITAR EL DRIVER
       	INTCON.7 = 1	'SE HABILITA LA INTERRUPCIÓN GLOBAL
	
	T1CON .0 = 1		' HABILITO EL TIMER 0


	GOSUB LCDPRINCIPAL




		

inicio:
	
	IF PORTB.0 = 0  AND PRESENCIA = 0   AND BANDERA= 0 AND 	ACTIVA_PRESENCIA = 1  THEN		' DETECCION DE LA SEÑAL DE DISPARO
				FILTRO = 0
				FOR N = 1 TO 255	' FILTRADO DE POSIBLES REBOTES
					IF PORTB.0 = 0 THEN
						FILTRO = FILTRO + 1
					ELSE
						FILTRO = 0
					ENDIF
				NEXT
				IF FILTRO >= 200  THEN 	' ACTIVACION DE LA MARCA DE DETECCION DE PRESENCIA
					CONTADOR = CONTADOR + 1
					CONTADORB = CONTADORB + 1
					WRITE 4,CONTADORH
					PRESENCIA = 1
					GOSUB CLRLCD
	     				Lcdout "**   IP100    **"
					GOSUB LINEFEDD
					Lcdout "CONT: ",#CONTADORB

					ACTIVA_PRESENCIA = 0
					FILTRO = 0
					CONTADOR_PRODUCT = 0
					CONTADOR_PRODUCT_B = 0
					BANDERA = 1
					WRITE 5,CONTADORL
					PORTE.0 = 0			'SALIDA ERROR
				ENDIF 

	ELSE

		IF PORTB.0 = 1	AND BANDERA = 1 THEN

			FILTRO = 0
			FOR N = 1 TO 255	' FILTRADO DE POSIBLES REBOTES
				IF PORTB.0 = 1 THEN
					FILTRO = FILTRO + 1
				ELSE
					FILTRO = 0
				ENDIF
			NEXT
			IF FILTRO >= 200	THEN

				BANDERA = 0

			ENDIF

		ENDIF
	ENDIF





	IF	MODO = 1 AND CICLO = 1 AND DISPENSADA = 0  AND DELAY_CICLO = 0 THEN
			ARRANCA_MOTOR = 1
			DIVISOR = $FA00
			TMR1H = DIVISORH
			TMR1L = DIVISORL	'$A4
			CONTA_ADC = 0
			MARCHA = 1
			PARAR = 0
			DETECTA_LABEL = 0
			PORTA.2 = 1		'ACTIVAR EL ASIST
			DISPENSADA = 1
			PRESENCIA = 0
	        	CONTADOR_PRODUCT = 0
			CONTADOR_MS = 0

	ENDIF









	IF	MARCHA = 0	THEN


	'*************** MANEJO DE ERRORES Y ALARMAS ***************



		IF	ERROR = 1 THEN


				GOSUB LCD_INCORRECTO
				GOSUB LINEFEDD
	     			Lcdout "*FALTA ETIQUETA*"	
				ERROR = 0
				PRESENCIA = 0
				BANDERA= 0 
				ACTIVA_PRESENCIA = 0
				PORTE.0 = 1		'ACTIVACION DE LA SALIDA RELE ROJO Y  FLASH ERROR
		ENDIF






	'***********************************************************
	
	'*********************** RUTINA DE ABM *********************

		LEERTECLADO = 0
		IF LEERTECLADO = 0 THEN
			gosub borrar_teclado
			PORTD.4 = 0	' ACTIVO LA COLUMNA 4
			GOSUB leer_digito
		ENDIF
		IF LEERTECLADO = 0 THEN	
			gosub borrar_teclado

			PORTD.5 = 0	' ACTIVO LA COLUMNA 3
			GOSUB leer_digito
		ENDIF
		IF LEERTECLADO = 0 THEN
			gosub borrar_teclado
			PORTD.6 = 0	' ACTIVO LA COLUMNA 2
			GOSUB leer_digito
		ENDIF
		IF LEERTECLADO = 0 THEN
			gosub borrar_teclado
			PORTD.7 = 0	' ACTIVO LA COLUMNA 1
			GOSUB leer_digito
		ENDIF

		 IF	LEERTECLADO = 1  THEN		'



				IF TECLA = F1	THEN		'SELECCION DE MENSAJE

				
					DIRECCION = 1
					GOSUB LEERE			' LEER VALOR DE LA MEMORIA 
					ENTERO = 1

					PROGRAMA = NUMERO

					GOSUB CLRLCD
	     				Lcdout "SELECC. PROGRAMA"
					GOSUB LINEFEDD
					Lcdout #PROGRAMA,"      (1-20)"					
					'DIRECCION = 0
					TOPE = 17

					GOSUB	INGRESO
					PROGRAMA = NUMERO
					WRITE 1,PROGRAMA
					pause 20
					GOSUB ACTUALIZAR


					GOSUB CLRLCD
	     				Lcdout "P",#PROGRAMA
					Lcdout " V:",#VELOCIDAD
					IF MODO = 1 THEN
						Lcdout " TB:",#TAMP
					ENDIF
					GOSUB LINEFEDD
	     				Lcdout "POS:",#LABEL_STOP
	     				Lcdout " RET:",#PRODUCT



				ENDIF


				IF TECLA = F2 	THEN		'EDITAR PROGRAMA
	
					IF CLAVE_ACTIVADA = 1  THEN


					'******* INGRESO DE LA VELOCIDAD *****************

						NUMERO = VELOCIDAD


					 '     	Lcdout $fe, 1   ' Clear LCD screen
						GOSUB CLRLCD
	     					Lcdout "VELOCIDAD  0-300"
						GOSUB LINEFEDD
						Lcdout #VELOCIDAD, "         "					
	
						ENTERO = 1
						TOPE = 300
	
						GOSUB	INGRESO
	
						VELOCIDAD = NUMERO
	
					'***************************************************
 	
					'***** INGRESO DEL TIEMPO DE TAMP/BLOW *************
	
						IF MODO = 1 THEN
							NUMERO = TAMP
							GOSUB CLRLCD
		     					Lcdout "TIEMPO TAMP/BLOW"
							GOSUB LINEFEDD
							Lcdout #TAMP
							ENTERO = 1
							TOPE = 255
							GOSUB	INGRESO
							TAMP = NUMERO
	
						ENDIF

					'***************************************************




					'********* INGRESO DE RETARDO DE PRODUCTO ******
	
						NUMERO = PRODUCT	'NUMEROB
	
						ENTERO = 1
					'       	Lcdout $fe, 1   ' Clear LCD screen
						GOSUB CLRLCD
	     					Lcdout "RET. DE PRODUCTO"
						GOSUB LINEFEDD
						Lcdout #PRODUCT
						NUMERO = PRODUCT	'NUMEROB
						

						TOPE = 1000
						'DOBLE =0
						GOSUB	INGRESO

						PRODUCT = NUMERO 

					'*************************************************



					'* INGRESO DE LA POSICION DE PARADA DE LA ETIQUETA *



						NUMERO = LABEL_STOP
					'  	Lcdout $fe, 1   ' Clear LCD screen
						GOSUB CLRLCD
	     					Lcdout "POS. DE ETIQUETA"
						GOSUB LINEFEDD
						Lcdout "                "					
						Lcdout $fe,$c0,#LABEL_STOP
	
						TOPE = 65000
						'DOBLE =0
						ENTERO = 1
						GOSUB	INGRESO
						LABEL_STOP = NUMERO 

					'****************************************************



						WRITE 1,PROGRAMA
				
	
						DIRECCION = 10 * PROGRAMA
						WRITE DIRECCION,PRODUCTH
						PAUSE 10
	
						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,PRODUCTL
						PAUSE 10
	
						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,LABEL_STOPH
						PAUSE 10
	
						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,LABEL_STOPL
						PAUSE 10

						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,GAP
						PAUSE 10 


						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,VELOCIDADH
						PAUSE 10

						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,VELOCIDADL
						PAUSE 10

						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,TAMP
						PAUSE 10

						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,L_H
						PAUSE 10

						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,L_L
						PAUSE 10
	

						GOSUB ACTUALIZAR

				       '  	Lcdout $fe, 1   ' Clear LCD screen
						GOSUB CLRLCD
					     	Lcdout "* PROGRAMA #",#PROGRAMA," *"
						GOSUB LINEFEDD
						Lcdout "**  GRABADO   **"
						PAUSE 300
		

					ELSE


						GOSUB CLRLCD
		     				Lcdout "** FUNCION NO **"
						GOSUB LINEFEDD
						Lcdout "** DISPONIBLE **"
					ENDIF		
				ENDIF				
		
				IF   TECLA = F3    THEN	' RUTINA DE SETUP GENERAL
				    	IF CLAVE_ACTIVADA = 1	THEN
						INTCON.5 = 0
						PRESCALERH = $FA
	
						PRESCALERL = $90


					'      	Lcdout $fe, 1   ' Clear LCD screen
						GOSUB CLRLCD
	     					Lcdout "** AJUSTANDO  **"
						GOSUB LINEFEDD
						Lcdout "SEN. DE ETIQUETA"					
	
						SALIR = 0
						CONTADOR_MS = 0
						MAXIMO = 0
						MINIMO = 255
						CONFI = 1          
						AUTOCALIBRACION = 1
						DETECTA1 = 0   
						BANDERA = 0
						ACTIVA_PRESENCIA = 1
						PRESENCIA = 0
						CONTADOR_PRODUCT = 0	
						CONTADOR_PRODUCT_B = 0					      
						ARRANCA_MOTOR = 0
						APLICAR = 0
						TIMEOUT = 0
						SALIR = 1
						PARAR = 0
						MARCHA = 0
						DETECTA_LABEL = 0
						PORTA.2 = 0		'DESACTIVAR EL ASIST

						GOSUB ARRANCAR                                   
						WHILE CONTADOR_MS < 5000	' RUTINA DE LECTURA DE CALLE
	

						WEND

						AUTOCALIBRACION = 0

						SALIR = 0

						WHILE	SALIR = 0		' RUTINA DE LECTURA DE CALLE

						WEND


						DIRECCION = 10 * PROGRAMA
	
						DIRECCION = DIRECCION + 2
						WRITE DIRECCION,LABEL_STOPH
						PAUSE 10
	
						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,LABEL_STOPL
						PAUSE 10
	
						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,GAP
						PAUSE 10 

						DIRECCION = DIRECCION + 4
						WRITE DIRECCION,L_H
						PAUSE 10	 

						DIRECCION = DIRECCION + 1
						WRITE DIRECCION,L_L
						PAUSE 10 

					'      	Lcdout $fe, 1   ' Clear LCD screen
						GOSUB CLRLCD
		     				Lcdout "GAP=",#MINIMO, " ETIQ=", #MAXIMO
						GOSUB LINEFEDD
						Lcdout "U= ",#GAP, " L= ",#L					



						GOSUB ACTUALIZAR


						INTCON.5 = 1
					ELSE

						GOSUB CLRLCD
		     				Lcdout "** FUNCION NO **"
						GOSUB LINEFEDD
						Lcdout "** DISPONIBLE **"


					ENDIF
				ENDIF


				IF TECLA = F4	THEN		' TEST


				'      	Lcdout $fe, 1   ' Clear LCD screen
					GOSUB CLRLCD
	     				Lcdout "**   IP100    **"
					GOSUB LINEFEDD
					Lcdout "**   TEST     **"
					ACTIVA_PRESENCIA = 1
					PORTE.0 = 0		'DESACTIVACION DE LA SALIDA RELE ROJO Y FLASH ERROR
					CONTADOR_MS = 0
					CONFI = 0
					SALIR = 0	
					GOSUB ARRANCAR


			
				ENDIF



		'******************** FIN RUTINA DE MANJO DE ABM **********************

		ENDIF
	ENDIF
	GOTO 	inicio



'*********************************  FIN PROGRAMA PRINCIPAL **************************************


'**********************************************************************************************
' ***********************************  RUTINA DE INTERRUPCION   *******************************

	Disable  
miint:  






		if PIR1.0 = 1  then

			ADCON0.2 = 1


			IF ARRANCA_MOTOR = 1	THEN
				PORTC.1 = 1
		
				IF DIVISOR < PRESCALER THEN
					DIVISOR = DIVISOR + RAMPA
					TMR1H = DIVISORH
					TMR1L = DIVISORL			
				ELSE
					TMR1H = PRESCALERH   	'VELOCIDADH	'$FE
	
					TMR1L = PRESCALERL	'VELOCIDADL	'$A4

				ENDIF


				CONTADOR_MS = CONTADOR_MS +1
				PIR1.0 = 0
				IF PARAR = 1	THEN
					IF CONTADOR_MS >= LABEL_STOP	THEN	'SE LLEGO AL LABEL STOP HAY QUE PARAR
	
						ARRANCA_MOTOR = 0
						APLICAR = 0
						TIMEOUT = 0
						SALIR = 1
						PARAR = 0
						MARCHA = 0
						DETECTA_LABEL = 0
						PORTA.2 = 0		'DESACTIVAR EL ASIST
						CONTADOR_MS = 0
						IF MODO = 1 AND CICLO = 0	THEN	'SI ESTA EN MODO TAMP/BLOW Y EL MODO ES DIRECTO HAY QUE  APLICAR
							ACTIVA_TAMP_BLOW = 1
							PORTA.3 = 1		'SE ACTIVA EL TAMP
							CONT_TAMP = 0

						ELSE
							ACTIVA_PRESENCIA = 1
						ENDIF 

					ENDIF

				ELSE

					IF CONTADOR_MS >= CUENTA_ERROR AND CONFI = 0	THEN 	'SI NO SE DETECTA CALLE SE DA ERROR Y NO ESTA EN CALIBRACION

						ARRANCA_MOTOR = 0
						APLICAR = 0
						TIMEOUT = 0
						SALIR = 1
						PARAR = 0
						MARCHA = 0
						DETECTA_LABEL = 0
						PORTA.2 = 0		'DESACTIVAR EL ASIST
						ERROR = 1
						CONTADOR_MS = 0
					ENDIF
					

				ENDIF
	



				PORTC.1 = 0
			ELSE
				TMR1H = PRESCALERH   	'VELOCIDADH	' $FE
	
				TMR1L = PRESCALERL	'VELOCIDADL	'$A4
				PIR1.0 = 0

			ENDIF


			IF PRESENCIA = 1 AND CONFI = 0 THEN
				CONTADOR_PRODUCT = CONTADOR_PRODUCT + 1

				IF CONTADOR_PRODUCT >= VAR_PRODUCT_A	THEN
					CONTADOR_PRODUCT = VAR_PRODUCT_A
					IF MODO = 0	OR  (MODO = 1 AND CICLO = 0) THEN	
						ARRANCA_MOTOR = 1
						DIVISOR = $FA00
						TMR1H = DIVISORH
						TMR1L = DIVISORL	'$A4
						CONTA_ADC = 0
						MARCHA = 1
						PARAR = 0
						DETECTA_LABEL = 0
						PRESENCIA = 0
				        	CONTADOR_PRODUCT = 0
						PORTA.2 = 1		'ACTIVAR EL ASIST

					ENDIF

					IF MODO = 1 AND CICLO = 1 AND MARCHA = 0  THEN

						ACTIVA_TAMP_BLOW = 1
		
						DELAY_TAMP = 1
					'	PORTA.3 = 1		'SE ACTIVA EL TAMP	
						CONT_TAMP = 0
						PRESENCIA = 0
				        	CONTADOR_PRODUCT = 0

					ENDIF
				ENDIF
				PIR1.0 = 0
			
			ENDIF

		


	
		'	WHILE ADCON0.2 = 1
		'	WEND
	'*****************************************************************************************************
			IF  	ADCON0.2 = 0	 THEN	' SI SE TERMINO LA CONVERSION
					PEEK	$1E,ENTRADA
				IF PARAR = 0  THEN

					IF CONFI = 1 THEN								

						IF AUTOCALIBRACION = 1	THEN

							'USO = ENTRADA MAX MAXIMO

							IF ENTRADA >= MAXIMO	THEN
								MAXIMO = ENTRADA
							ENDIF

							IF ENTRADA <= MINIMO	THEN
								MINIMO = ENTRADA
							ENDIF

							GAP = MAXIMO - MINIMO 
							USO = GAP / 2
							GAP = MINIMO + USO

						ELSE
							IF ENTRADA <= GAP  THEN
							
								DETECTA_LABEL = 1

							ELSE



								IF DETECTA_LABEL = 1	THEN									
									IF DETECTA1 = 0	THEN
										CONTADOR_MS =0
										DETECTA1 = 1

									ELSE

										L = CONTADOR_MS
										IF L >= OFFSET_STEPP	THEN
											LABEL_STOP = OFFSET_STEPP
										ELSE
											LABEL_STOP = OFFSET_STEPP // L
										ENDIF
									'	LABEL_STOP = LABEL_STOP + 100
										CONFI = 0

									ENDIF

									DETECTA_LABEL = 0

			  
								ENDIF

							ENDIF

						ENDIF

					ELSE
							IF ENTRADA <= GAP  THEN

								DETECTA_LABEL = 1
							ELSE
								IF DETECTA_LABEL = 1	THEN
									PARAR = 1
									CONTADOR_MS = 0
									DETECTA_LABEL = 0

								ENDIF
							ENDIF




					ENDIF
				ENDIF
			ENDIF






		PIR1.0 = 0
		endif


	'**************************** INTERRUPCION POR TIMER 0  ****************************

	IF INTCON.2 = 1	THEN		'INTERRUPCION POR TIMER0
		





	'*****************************************************************************************************












		CONT_TAMP = CONT_TAMP + 1

		IF	ACTIVA_TAMP_BLOW = 1  AND DELAY_TAMP = 1  AND CONT_TAMP >= INTER_DELAY THEN
			PORTA.3 = 1		'SE ACTIVA EL TAMP
			DELAY_TAMP = 0 
			CONT_TAMP = 0

		ENDIF
		IF ACTIVA_TAMP_BLOW = 1 AND CONT_TAMP >= TAMP AND DELAY_TAMP = 0 THEN

			ACTIVA_TAMP_BLOW = 0
			PORTA.3 = 0
	'		DISPENSADA = 0
			DELAY_CICLO = 1
			CONT_TAMP = 0

		ENDIF
		IF 	DELAY_CICLO = 1	AND CONT_TAMP >= RETORNO_DELAY THEN
			DISPENSADA = 0
			CONT_TAMP = 0
			DELAY_CICLO = 0
			ACTIVA_PRESENCIA = 1

		ENDIF
	

		'************ DETECCION DEL DISPARO   ****************

		IF POLILIDAD_DISPARO = 0 	THEN		'SI LA ENTRADA ES NPN

			

		ELSE						'SI LA ENTRADA ES PNP


		ENDIF

		'*****************************************************
		TMR0 = 61       '(256 - 195)--> 195 ES :((F/4)/PRESCALER)/FTRM1 --> ((20E6/4)/256)/1000
				' FRECUENCIA DE TIMER0 = 1000HZ = 1 mSEG
		INTCON.2 = 0
	ENDIF

	'**************************** FIN INTERRUPCION POR TIMER 0  ****************************

	
salida:



        Resume                 ' retorna al programa principal
	

 	Enable

'***************************  FIN DE RUTINA DE INTERRUPCION   ***********************************
'************************************************************************************************
'************************************************************************************************





'*********************************   SUBRUTINAS GENERALES   *************************************

'************************************************************************************************


leer_teclado:
		'*****************	DECODIFICACION DE LAS TECLAS	******************
		'
		'
		'
		'			C1		C2		C3		C4
		'-----------------------------------------------------------------------------
		'	F1	|(ESC)	183	|(^)	187	|(v)	189	|(ENT)	190	|
		'		--------------------------------------------------------------
		'	F2	|(F1)	215	|(F2)	219	|(F3)	221	|(F4)	222	|
		'		--------------------------------------------------------------
		'
		'

		'	ARRIBA		CON	187
		'	ABAJO		CON	189
		'	ENT		CON	190
		'	ESC		CON	183
		'	F1		CON	215
		'	F2		CON	219
		'	F3		CON	221
		'	F4		CON	222	


	LEERTECLADO = 0
	IF LEERTECLADO = 0 THEN
		gosub borrar_teclado
		PORTD.4 = 0	' ACTIVO LA COLUMNA 4
		GOSUB leer_digito
	ENDIF
	IF LEERTECLADO = 0 THEN	
		gosub borrar_teclado
		PORTD.5 = 0	' ACTIVO LA COLUMNA 3
		GOSUB leer_digito
	ENDIF
	IF LEERTECLADO = 0 THEN
		gosub borrar_teclado
		PORTD.6 = 0	' ACTIVO LA COLUMNA 2
		GOSUB leer_digito
	ENDIF
	IF LEERTECLADO = 0 THEN
		gosub borrar_teclado
		PORTD.7 = 0	' ACTIVO LA COLUMNA 1
		GOSUB leer_digito
	ENDIF


		return
'***********************************************************************************

'************************************************************************************************


borrar_teclado:

		PORTD.4 = 1
		PORTD.5 = 1
		PORTD.6 = 1
		PORTD.7 = 1
		
		return
'***************************************************************************************

'***************************************************************************************

leer_digito:

		'PAUSE 5
		TECLA = 0			
		NIBLEB = PORTB & %11110000
		PAUSEUS 500	
		'PAUSE 50
		GENERAL = PORTB & %11110000
		IF NIBLEB = GENERAL   THEN

			IF NIBLEB <> 240 THEN
				TECLA = PORTD & %11110000
				TECLA =  TECLA / 16
				TECLA = TECLA | NIBLEB
				LEERTECLADO = 1
'	        	 	Lcdout $fe, 1   ' Clear LCD screen
'			     	Lcdout "   READ VALUE   "
'				GOSUB LINEFEDD
'		     		Lcdout #TECLA
	
			ENDIF
		ENDIF
		return
'************************************ FIN leer digito  ***********************************

'************************************************************************************
OK:			'if FUNCION = 5  then 

				Lcdout "<-OK"
				'TECLA = 0
			'ENDIF
		RETURN

'************************************ FIN SUB OK  ***********************************



'************************************************************************************
DELAY_100:

		PAUSE 100

		RETURN

'************************************ FIN SUB DELAY_100 *****************************
'************************************************************************************



'*************************************************************************************************
LCD_INCORRECTO:

		         	Lcdout $fe, 1   ' Clear LCD screen
	     			Lcdout "**  ERROR !!! **"

     		
		RETURN
'*******************************************  FIN SUB LCD_INCORRECTO  ****************************


'****************************************************************************************************

INGRESO:
			'TECLA = 0
			WHILE	TECLA <> ENT AND TECLA <> ESC
				GOSUB	leer_teclado					

				IF TECLA = ABAJO	THEN		' SE PRESIONO LA TRECLA DERECHA BAJAR VALOR
					IF NUMERO > 0	 THEN

						NUMERO = NUMERO - 1
					ELSE
						 NUMERO =0
					ENDIF
					TECLA = 0
				ENDIF

				IF TECLA = ARRIBA	THEN		' SE PRESIONO LA TECLA DERECHA SUBE VALOR

					IF NUMERO < TOPE THEN
						NUMERO = NUMERO + 1
					ELSE
						NUMERO = TOPE
					ENDIF
					TECLA = 0
				ENDIF

				GOSUB LINEFEDD
				Lcdout "      "
				GOSUB LINEFEDD
				IF ENTERO = 1  THEN
					Lcdout	#NUMERO
				ELSE

					IF ENTERO = 2   THEN

						GOSUB MOSTRAR_TIEMPO2
					ELSE		
						GOSUB MOSTRAR_TIEMPO
					ENDIF
				ENDIF
				IF TECLA = ENT	THEN		' SE PRESIONO LA TECLA DERECHA SUBE VALOR

					LEERTECLADO = 0
					GOSUB DELAY_100
					GOSUB OK
				ENDIF

				GOSUB DELAY_100			' PAUSA DE 100 MSEG
			WEND

			TECLA = 0 				' RESET DEL ESTADO DE LA VARIABLE
		RETURN
'****************************************************************************************************

'****************************************************************************************************



'*****************************************************************************************************

LEERE:

		READ DIRECCION,NUMERO


		RETURN

'***************************************** FIN LEERE  *******************************************






'****************************************************************************************************
'****************************************************************************************************
ACTUALIZAR:
		INTCON.7 = 0	'SE DEHABILITA LA INTERRUPCIÓN GLOBAL

	'	READ 0,GIRO
	'	pause 10

		READ 1,PROGRAMA
		pause 10
		
		READ 2,OFFSETH
		pause 10

		READ 3,OFFSETL
		pause 10

		READ 4,CONTADORH
		pause 10

		READ 5,CONTADORL
		pause 10


		READ 6,CONFIG
		pause 10

		READ 7,RAMPA
		pause 10


		READ 8,INTER_DELAY
		pause 10

		READ 9,RETORNO_DELAY
		pause 10

		DIRECCION = 10 * PROGRAMA
		READ DIRECCION,PRODUCTH
		PAUSE 10

		DIRECCION = DIRECCION + 1

		READ DIRECCION,PRODUCTL
		PAUSE 10		

		DIRECCION = DIRECCION + 1

		READ DIRECCION,LABEL_STOPH
		PAUSE 10			

		DIRECCION = DIRECCION + 1

		READ DIRECCION,LABEL_STOPL
		PAUSE 10			


		DIRECCION = DIRECCION + 1
		READ DIRECCION,GAP
		PAUSE 10 


		DIRECCION = DIRECCION + 1
		READ DIRECCION,VELOCIDADH
		PAUSE 10			

		DIRECCION = DIRECCION + 1
		READ DIRECCION,VELOCIDADL
		PAUSE 10			

		DIRECCION = DIRECCION + 1
		READ DIRECCION,TAMP
		PAUSE 10			

		DIRECCION = DIRECCION + 1
		READ DIRECCION,L_H
		PAUSE 10			

		DIRECCION = DIRECCION + 1
		READ DIRECCION,L_L
		PAUSE 10			


		
		OFFSET_STEPP = OFFSET *	RELACION		'CALCULO DE LOS STEPPS  SEGUN LOS MILIMETROS INGRESADOS
		VAR_PRODUCT_A = PRODUCT * RELACION
	'	PRESCALER = (((RELACION * 10)/6)* VELOCIDAD)

		WW0 = 17500	'19635
		WW1 = 6
		bogus = WW0 * WW1		' Multiply to load internal registers with 32-bit value
		WRESULT = Div32 VELOCIDAD		' Divide 32-bit value by byte and store in word	
		PRESCALER =  65535 - WRESULT		   'calculo para diametro 50

	 '     	Lcdout $fe, 1   ' Clear LCD screen
	 '   	Lcdout "WRESULT: ",#WRESULT




	'	PRESCALER =  65535 -((47124 / VELOCIDAD) * 2)	'calculo para diametro 40
		CUENTA_ERROR = 4 * L				' = N * (LARGO DE ETIQUETA) = 4 CUENTA A LA QUE DEBE
								' LLEGAR PARA DAR ERROR DE ETIQUETA

		IF GIRO = 0 THEN				'SENTIDO DE GIRO DEL MOTOR
			PORTC.2 = 0				'1 ES DISPENSADORA DERECHA

		ELSE
			PORTC.2 = 1				'0 ES DISPENSADORA IZQUIERDA

		ENDIF
		INTCON.7 = 1	'SE HABILITA LA INTERRUPCIÓN GLOBAL
		RETURN

'***************************************** FIN ACTUALIZAR  *******************************************



'*****************************************************************************************************

MOSTRAR_TIEMPO:


		A = NUMERO // 100

		B = NUMERO/ 100
		Lcdout #B,".", #A





		RETURN

'******************************************************************************************************


MOSTRAR_TIEMPO2:


		A = NUMERO // 10

		B = NUMERO/ 10
		Lcdout #B,".", #A





		RETURN

'******************************************************************************************************






'***************************************************************************************************

CLRLCD:
         	Lcdout $fe, 1   ' Clear LCD screen

	RETURN

'***************************************************************************************************

'***************************************************************************************************
LINEFEDD:
                 Lcdout $fe,$c0   'SALTAR A 2 LINEA DE DISPLAY
		
        RETURN
'***************************************************************************************************

'***************************************************************************************************



'***************************************************************************************************
LCDMANTENIMIENTO:

					GOSUB CLRLCD
	     				Lcdout "*** MENU  DE ***"
					GOSUB LINEFEDD
					Lcdout "*CONFIGURACION *"
                 RETURN

'***************************************************************************************************

'***************************************************************************************************
LCDPRINCIPAL:
		GOSUB CLRLCD
	     	Lcdout "**   IP100    **"
                GOSUB LINEFEDD
		Lcdout "***** I&P ******"

                RETURN

'***************************************************************************************************

'***************************************************************************************************
ARRANCAR:

					ARRANCA_MOTOR = 1
					DIVISOR = $FA00
					TMR1H = DIVISORH
					TMR1L = DIVISORL	'$A4
					CONTA_ADC = 0
					MARCHA = 1
					DETECTA_LABEL = 0

	RETURN
'***************************************************************************************************

'***************************************************************************************************


LEER_GAP:			



					ADCON0 = %10000101              ' Start conversion
			        	Pause 1                         ' Wait for conversion

					PEEK	$1E,ENTRADA
					IF ENTRADA >= GAP  THEN
						SALIR = 1
					ENDIF
									
				       	Lcdout $fe, 1   ' Clear LCD screen
	     				Lcdout "ENTRADA SENSOR 1"
					GOSUB LINEFEDD
					Lcdout #ENTRADA

	RETURN


'****************************************************************************************************
