LIST P=16F876A
INCLUDE "p16F876A.INC"
CBLOCK 0x20
CONTA1 ;0x20
CONTA2
CONTA3
VALOR1 ;0x23
VALOR2
VALUZI ;0x25
VALUZD
TEMP ;0x27
ENDC
ORG 0x00
GOTO Configuracion
ORG 0x04
RETURN
Configuracion:
; Inicializacion de puertos
BANKSEL TRISA
MOVLW 0x3
MOVWF TRISA
CLRF TRISC
CLRF TRISB
; Puesta a 0 de los valores
BANKSEL PORTA
CLRF VALUZI
CLRF VALUZD
CLRF PORTA
CLRF PORTC
CLRF INTCON
; 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
Principal:
CALL Conversion
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
; **************************************************************************
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
MOVF ADRESH,W ; guardo el valor de la luz del ldr izquierdo
MOVWF VALUZI ; sacamos el valor de valuzi por los leds para comprobar que este paso esta bien
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 0xCC ; 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 0xCC
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
MOVWF PORTC ; Pongo el valor que me devuelve en PORTC
CALL RETA
RETURN
Tabla_accion:
ANDLW 0x3 ; Me aseguro que no pase del maximo que es 3
ADDWF PCL,F
RETLW 0x03 ; TEMP = 0x00 -> VALUZD y VALUZI mayores a 240 , 0x03 Ambos motores ON
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 0x00 ; TEMP = 0x03 -> VALUZD y VALUZI menores a 240 , 0x00 Ambos motores OFF
;--------------------- RETARDOS----------------------
RETA:
MOVLW D'5'
MOVWF CONTA1
TRES
MOVLW D'80'
MOVWF CONTA2
DOS
MOVLW D'250'
MOVWF CONTA3
UNO
NOP
NOP
DECFSZ CONTA3,1
GOTO UNO
DECFSZ CONTA2
GOTO DOS
DECFSZ CONTA1,1
GOTO TRES
RETURN
END