Una vez solucionados los problemas de los LDR y motores he pasado a incluirle en PORTA,4 un sensor infrarrojo para que detecte obstaculos, unicamente le añado un rutina llamada revision donde con la funcion btfss compruebo que este sensor no este mandado una señal (haya detectado un obstaculo) y asi siga con el programa con normalidad. En caso de que haya obstaculo se paran los motores y se manda un mensaje "OBSTACULO DETECTADO" y hasta que porta,4 no este a 0 no siga , el problema esta en que una vez activo porta,4 a traves de una switch (simulando en poroteus que es el sensor infrarrojo) no sale del bucle de "OBSTACULO DETECTADO" aun habiendo desactivado el switch.
Dejo el url de la imagen donde se ve que el switch ya esta desactivado y aun asi sigue mandando el mensaje "OBSTACULO DETECTADO"
https://drive.google.com/open?id=0B4bkZegp0Iv6ajUtbnFOZVVsZWMel programa completo seria este:
LIST P=16F876A
INCLUDE "p16F876A.INC"
CBLOCK 0x20 ;DEFINIMOS LAS VARIABLES
CONTA1 ;0x20
CONTA2
CONTA3
CONTA01 ;0x23
CONTA02
CONTA03
VALOR1 ;0x26
VALOR2
VALUZI ;0x28
VALUZD
TEMP ;0x29
ENDC
ORG 0x00
GOTO CONFIGURACION
ORG 0x04
RETURN
CONFIGURACION
;------- Configuramos puertos como E/S --------
BANKSEL TRISA
MOVLW b'00010011'
MOVWF TRISA
CLRF TRISC
CLRF TRISB
;------- LIMPIAMOS PUERTOS -------
BANKSEL PORTA
CLRF VALUZI
CLRF VALUZD
CLRF PORTA
CLRF PORTC
CLRF PORTB
CLRF INTCON
;_*_*_*_*_*_* Inicio de la LCD _*_*_*_*_*_*_*_*_*_*_*_
INICIO_LCD
BCF STATUS,5 ; BANCO 0
BCF PORTC,6 ; RS = 0
MOVLW b'00000001' ; LIMPIO LCD
MOVWF PORTB
CALL EJECUTA
MOVLW b'00000110' ; HABILITAMOS EL COMANDO
MOVWF PORTB ; MODO DE ENTRADA DE IZQUIERDA A DERECHA, INCREMENTO.
CALL EJECUTA
MOVLW b'00001111'
MOVWF PORTB ; VISUALIZADOR Y CURSOR ENCENDIDOS.
CALL EJECUTA
MOVLW b'00111111'
MOVWF PORTB ; MODO DE FUNCIONAMIENTO 8 BITS 2 LINEAS 5X10
CALL EJECUTA
BSF PORTC,6
;_*_*_*_*_*_*_*_*_ Configuracion del ADC _*_*_*_*_*_*_*_*_*
MOVLW b'00000100' ; CONFIGURACION ADCON1
MOVWF ADCON1
BANKSEL ADCON0 ; Banco 0
MOVLW b'11000001' ; Se activa el conversor en RA0
MOVWF ADCON0 ; Se activa el conversor
BSF PORTC,4 ;Activamos In A e In B para controlar los motores mas adelante
BSF PORTC,5
PRINCIPAL
CALL Conversion
CALL REVISION
CALL Check_Value
CALL Accion_Motor
GOTO PRINCIPAL
; **************************************************************************
; Conversion : Realiza la conversion ADC (CH0 y CH1 ) y guarda los valores en 2 registros
; Entrada: ----
; Salida: VALUZD , VALUZI
; Registros usados: ADCON0,ADRESH,PORTB
; **************************************************************************
;----REVISAMOS QUE NO HAY OBSTACULOS DELANTE DEL TANQUE---
REVISION
BTFSS PORTA,4
RETURN
CALL MENSAJE5
BCF PORTC,0
BCF PORTC,1
BCF PORTC,2
BCF PORTC,3
CALL RETA
GOTO REVISION
Conversion:
; Canal 0
BCF ADCON0,CHS0
CALL RETA
BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-1
MOVF ADRESH,W ; guardo el valor de la luz del ldr derecho
MOVWF VALUZD
; Canal 1
BSF ADCON0,CHS0
CALL RETA
BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-1 ; saltamos una instrucción atras
MOVF ADRESH,W ; guardo el valor de la luz del ldr izquierdo
MOVWF VALUZI
MOVWF PORTB ; 4 v equivale en dcimnal a 204 que en binario seria 11001100, los leds que deberian de encenderse cuando pongamos este valor en la ldr
RETURN
; **************************************************************************
; Check_Value: Checkea el valor de los 2 registros y activa las flags del registro TEMP segun valores
; Entrada: VALUZD, VALUZI
; Salida: TEMP
; Registros usados: -----
; **************************************************************************
Check_Value:
CLRF TEMP ; Pongo a 0 las flags
MOVLW b'11001100' ; comoparo el valor del ldr derecho si es menor de 204 (4v), si es menor activo motor izquierdo
SUBWF VALUZD,W ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
BTFSS STATUS,C
BSF TEMP,0 ; indicador que derecha es menor que 0xCC
MOVLW b'11001100'
SUBWF VALUZI,W
BTFSS STATUS,C
BSF TEMP,1 ; indicador que izquierda es menor que 0xCC
RETURN
; **************************************************************************
; Accion_Motor: Hace uso de las flags para activar las salidas de motor
; Entrada: TEMP
; Salida: -------
; Registros usados: PORTC
;
; ************************
; Tabla_accion: Tabla para hacer uso de cada combinacion de TEMP, 4 en total
; Entrada: W
; Salida: W
; Registros usados: -------
; **************************************************************************
Accion_Motor:
MOVF TEMP,W ; Llamo a la tabla
CALL Tabla_accion
BTFSS TEMP,0
GOTO COMPIZQ
BTFSS TEMP,1
GOTO DERECHA
GOTO RECTO
Tabla_accion:
ANDLW 0x3 ; Me aseguro que no pase del maximo que es 3
ADDWF PCL,F
RETLW 0x00 ; TEMP = 0x03 -> VALUZD y VALUZI mayores a 240 , 0x03 Ambos motores Off
RETLW 0x01 ; TEMP = 0x01 -> VALUZD > 240 y VALUZI < 240 , 0x01 Motor izquierda NO
RETLW 0x02 ; TEMP = 0x02 -> VALUZD < 240 y VALUZI > 240 , 0x02 Motor derecha ON
RETLW 0x03 ; TEMP = 0x00 -> VALUZD y VALUZI menores a 240 , 0x00 Ambos motores On
COMPIZQ
BTFSS TEMP,1
GOTO PARAR
GOTO IZQUIERDA
RECTO
CALL MENSAJE4
BSF PORTC,0
BCF PORTC,1
BSF PORTC,2
BCF PORTC,3
CALL RETA
GOTO PRINCIPAL
DERECHA
CALL MENSAJE2
BSF PORTC,0
BCF PORTC,1
BCF PORTC,2
BSF PORTC,3
CALL RETA
GOTO PRINCIPAL
IZQUIERDA
CALL MENSAJE3
BCF PORTC,0
BSF PORTC,1
BSF PORTC,2
BCF PORTC,3
CALL RETA
GOTO PRINCIPAL
PARAR
CALL MENSAJE1
BCF PORTC,0
BCF PORTC,1
BCF PORTC,2
BCF PORTC,3
CALL RETA
GOTO PRINCIPAL
MENSAJE1
CALL ENTRADA
MOVLW 'L'
MOVWF PORTB
CALL ENVIA
MOVLW 'U'
MOVWF PORTB
CALL ENVIA
MOVLW 'Z'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'C'
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
CALL NEXT
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'L'
MOVWF PORTB
CALL ENVIA
MOVLW 'U'
MOVWF PORTB
CALL ENVIA
MOVLW 'M'
MOVWF PORTB
CALL ENVIA
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'L'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'K'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
RETURN
MENSAJE2
CALL ENTRADA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'K'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'G'
MOVWF PORTB
CALL ENVIA
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'R'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'11000010' ; 2DA LINEA
MOVWF PORTB
CALL EJECUTA
MOVLW b'01111110'
MOVWF PORTB
CALL ENVIA
MOVLW 'L'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'R'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'C'
MOVWF PORTB
CALL ENVIA
MOVLW 'H'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW b'01111110'
MOVWF PORTB
CALL ENVIA
RETURN
MENSAJE3
CALL ENTRADA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'K'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'G'
MOVWF PORTB
CALL ENVIA
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'R'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'11000001' ; 2DA LINEA
MOVWF PORTB
CALL EJECUTA
MOVLW b'01111111'
MOVWF PORTB
CALL ENVIA
MOVLW 'L'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'Z'
MOVWF PORTB
CALL ENVIA
MOVLW 'Q'
MOVWF PORTB
CALL ENVIA
MOVLW 'U'
MOVWF PORTB
CALL ENVIA
MOVLW 'I'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'R'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW b'01111111'
MOVWF PORTB
CALL ENVIA
RETURN
MENSAJE4
CALL ENTRADA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'K'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'Y'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'N'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
MOVLW ' '
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'11000010' ; 2DA LINEA
MOVWF PORTB
CALL EJECUTA
MOVLW b'00111100'
MOVWF PORTB
CALL ENVIA
MOVLW b'00111100'
MOVWF PORTB
CALL ENVIA
MOVLW b'00111100'
MOVWF PORTB
CALL ENVIA
MOVLW 'R'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'C'
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
MOVLW b'00111110'
MOVWF PORTB
CALL ENVIA
MOVLW b'00111110'
MOVWF PORTB
CALL ENVIA
MOVLW b'00111110'
MOVWF PORTB
CALL ENVIA
RETURN
MENSAJE5
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'00000001' ; LIMPIO LCD
MOVWF PORTB
CALL EJECUTA
MOVLW b'10000011' ; 1RA LINEA POSICION 3 (1º BIT INDICA LINEA SEGUNDO BIT SEGUNDA LINEA LOS BIT D ELA DERECHA INDICAN LA POSICION)
MOVWF PORTB
CALL EJECUTA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
MOVLW 'B'
MOVWF PORTB
CALL ENVIA
MOVLW 'S'
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'C'
MOVWF PORTB
CALL ENVIA
MOVLW 'U'
MOVWF PORTB
CALL ENVIA
MOVLW 'L'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'11000010' ; 2DA LINEA
MOVWF PORTB
CALL EJECUTA
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'11000011' ; 2DA LINEA
MOVWF PORTB
CALL EJECUTA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'E'
MOVWF PORTB
CALL ENVIA
MOVLW 'C'
MOVWF PORTB
CALL ENVIA
MOVLW 'T'
MOVWF PORTB
CALL ENVIA
MOVLW 'A'
MOVWF PORTB
CALL ENVIA
MOVLW 'D'
MOVWF PORTB
CALL ENVIA
MOVLW 'O'
MOVWF PORTB
CALL ENVIA
RETURN
;********* COMANDO LCD EJECUTA **************
EJECUTA
BSF PORTC,7 ; ENABLE = 1
CALL TIMEDIS ; TEMPORIZADOR DEL DISPLAY
BCF PORTC,7 ; RS = 0
CALL TIMEDIS
RETURN
;********* COMANDO LCD ENVIA **************
ENVIA
BSF PORTC,6 ; RS=1
CALL EJECUTA ; DAMOS DE ALTA EL COMANDO
RETURN
;********* COMANDO NEXT LCD **************
NEXT
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'11000000' ; 2DA LINEA
MOVWF PORTB
CALL EJECUTA
RETURN
;*********PRIMERA LINEA LCD ENTRADA **************
ENTRADA
BCF PORTC,6 ;RS=0 MODO INST
MOVLW b'00000001' ; LIMPIO LCD
MOVWF PORTB
CALL EJECUTA
MOVLW b'10000000' ; 1RA LINEA POSICION 3 (1º BIT INDICA LINEA SEGUNDO BIT SEGUNDA LINEA LOS BIT D ELA DERECHA INDICAN LA POSICION)
MOVWF PORTB
CALL EJECUTA
RETURN
;*_*_*_*__*_*_*_*_ RETARDOS_*_*_*_*_*_*_*_*__*
;-----------------TEMPORIZADOR DE 2308.6 uS----------
TIMEDIS
MOVLW b'00000001' ; TEMPORIZADOR DE 2308.6 uS
MOVWF CONTA01
UNOO
MOVLW b'00001111'
MOVWF CONTA02
DOSS
MOVLW b'11111111'
MOVWF CONTA03
TRESS
DECFSZ CONTA03,1 ;DECREMENTO CONTA03 SI ES 0 VUELVE
GOTO TRESS
DECFSZ CONTA02,1 ;DECREMENTO CONTA02 SI ES 0 VUELVE A CARGAR CONTA03
GOTO DOSS
DECFSZ CONTA01,1 ; DECREMNTO CONTA01 SI ES 0 VUELVE A CARGAR CONTA02 Y 03
GOTO UNOO
RETURN
; -----------------Temporizador de medio segundo-----------
RETA
MOVLW b'00001101' ; Temporizador de medio segundo aprox.
MOVWF CONTA1
UNO7 MOVLW b'11111111'
MOVWF CONTA2
DOS7 MOVWF b'11111111'
MOVWF CONTA03
TRES7 DECFSZ CONTA3,1 ;DECREMENTO CONTA03 SI ES 0 VUELVE
GOTO TRES7
DECFSZ CONTA2,1 ;DECREMENTO CONTA02 SI ES 0 VUELVE A CARGAR CONTA03
GOTO DOS7
DECFSZ CONTA1,1 ; DECREMNTO CONTA01 SI ES 0 VUELVE A CARGAR CONTA02
GOTO UNO7 ;Y 03.
RETURN
END