Autor Tema: PROBLEMA COCHE SEGUIDOR DE LUZ  (Leído 2477 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado javig.16

  • PIC10
  • *
  • Mensajes: 11
PROBLEMA COCHE SEGUIDOR DE LUZ
« en: 28 de Diciembre de 2015, 06:36:19 »
Buenas soy nuevo en este foro y necesito ayuda, estoy realizando un programa en lenguaje ensamblador con el pic 16f876A, el funcionamiento del programa es el de un seguidor de luz formado por dos resistencias y dos motores, el programa lo estoy empezando y lo que adjunto seria solo una parte del proyecto final. El problema es que solo me funciona bien una de las LDR en proteus que cuando recibe menos de 4v el pic en el puerto RA0 funciona el motor contrario a cada ldr. He revisado el programa y no se donde esta el problema  en un inicio pensé que en el conversor pero para ello instale unos leds en el puerto B para que me sacara el registro adresh y eso funciona bien luego ahi no esta. Les agradezco su atención muchas gracias.
 
PROGRAMA:



   LIST P=16F876A
   INCLUDE "p16F876A.INC"
   CONTA1 EQU 0X20
   CONTA2 EQU 0X21
   CONTA3 EQU 0X22
   VALOR1 EQU 0X23
   VALOR2 EQU 0X25
   VALUZI EQU 0X26
   VALUZD EQU 0X27
   
   ORG H'0000'
   GOTO INICIO
   ORG H'0005'   


   


INICIO

   BCF STATUS,5
   CLRF VALUZI
   CLRF VALUZD
   CLRF PORTA
   CLRF PORTC
   CLRF INTCON

   BSF STATUS,5
   BSF TRISA,0
   BSF TRISA,1
   CLRF TRISC
   CLRF TRISB
   
   
   MOVLW b'00000100' ; CONFIGURACION ADCON1
   MOVWF ADCON1
START

   BCF STATUS,5
   MOVLW   b'11000001'   ; Se activa el conversor en RA0
   MOVWF   ADCON0      ; Se activa el conversor
   BSF   ADCON0,2
   
CONVERSOR1         ; pregunto si ha terminado la conversion
   BTFSC    ADCON0,2
   GOTO   CONVERSOR1
   CALL   RETA
   MOVF   ADRESH,0   ; guardo el valor de la luz del ldr derecho
   MOVWF   VALUZD

   MOVLW   b'11001001'   ; Se activa el conversor en RA1
   MOVWF   ADCON0      ; Se activa el conversor
   BSF   ADCON0,2
   
CONVERSOR2         ; pregunto si ha terminado la conversion
   BTFSC    ADCON0,2
   GOTO   CONVERSOR2
   CALL   RETA
   MOVF   ADRESH,0   ; 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


PRINCIPAL
   
   MOVLW b'11001100'   ; comoparo el valor del ldr derecho si es menor de 204 (4v), si es menor activo motor izquierdo
   SUBWF VALUZD,0      ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
   BTFSS STATUS,0
   GOTO GIRAR
   BTFSS STATUS,2
   GOTO COMPIZQ
   GOTO GIRAR

VOLVER            ; paramos el coche
   BCF PORTC,0
   BCF PORTC,1
   CALL RETA
   BSF ADCON0,2 ; SE INICIA NUEVA CONVERSION
   GOTO START

COMPIZQ            ; vemos si el coche va a la izquierda o se para

   MOVLW b'1101100'
   SUBWF VALUZI,0
   BTFSS STATUS,0
   GOTO IZQUIERDA
   BTFSS STATUS,2
   GOTO VOLVER
   GOTO IZQUIERDA

GIRAR            ;vemos si el coche va recto o a la derecha
   
   MOVLW b'11001100'
   SUBWF VALUZI,0
   BTFSS STATUS,0
   GOTO RECTO
   BTFSS STATUS,2
   GOTO DERECHA
   GOTO RECTO
   

RECTO   
   BSF PORTC,1
   BSF PORTC,0
   CALL RETA
   BSF ADCON0,2 ; SE INICIA NUEVA CONVERSION
   GOTO START

DERECHA   
   BCF PORTC,1
   BSF PORTC,0
   CALL RETA
   BSF ADCON0,2 ; SE INICIA NUEVA CONVERSION
   GOTO START
   
IZQUIERDA   

   BSF PORTC,1
   BCF PORTC,0
   CALL RETA
   BSF ADCON0,2 ; SE INICIA NUEVA CONVERSION
   GOTO START







;--------------------- 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







Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #1 en: 28 de Diciembre de 2015, 15:05:02 »
Perimero que nada bienvenido al foro
Voy a decir varias cosas que tal ves te solucionen el problema o solo sean simples correcciones o mejoras, vos tomaras cada una a tu propia decision

Un par de cosas para que sea mas facil entenderle y para que no estes buscando cual es cual


Código: ASM
  1. BSF   ADCON0,2
  2. MOVF   ADRESH,0
  3. SUBWF VALUZD,0
  4. BTFSS STATUS,2
  5. BTFSS STATUS,0

por:

Código: ASM
  1. BSF   ADCON0,GO   ; o GO_DONE , o NOT_DONE, o GO_NOT_DONE, todos especificados en el .inc que incluiste.
  2. MOVF   ADRESH,W
  3. SUBWF VALUZD,W
  4. BTFSS STATUS,Z
  5. BTFSS STATUS,C



Ahora unas cosas que vi.
Cuando cambias de canal ( a pesar que lo podes hacer con un simple BSF/BCF ADCON0,CHS0 ) apenas cambias de canal tenes que hacer una demora, o no se si este lo permite ajustar el tiempo de muestreo de la señal,  la demora no va despues de la conversion, sino ANTES de iniciar la conversion y DESPUES de cambiar el canal, obviamente esto es si cambias de canal.. Esto por que el "capacitor" interno del ADC debe cargarse al nuevo voltaje antes de comenzar la conversion Y mas grande sera el retardo si es que existe mayor resistencia de entrada. Pongo un codigo de lo que me refiero

Tuyo:

Código: ASM
  1. MOVLW   b'11001001'   ; Se activa el conversor en RA1
  2.    MOVWF   ADCON0      ; Se activa el conversor
  3.    BSF   ADCON0,2
  4.    
  5. CONVERSOR2         ; pregunto si ha terminado la conversion
  6.    BTFSC    ADCON0,2
  7.    GOTO   CONVERSOR2
  8.    CALL   RETA

Lo que te digo:

Código: ASM
  1. MOVLW   b'11001001'   ; Se activa el conversor en RA1
  2.    MOVWF   ADCON0      ; Se activa el conversor
  3.    CALL   RETA
  4.    BSF   ADCON0,2
  5.    
  6. CONVERSOR2         ; pregunto si ha terminado la conversion
  7.    BTFSC    ADCON0,2
  8.    GOTO   CONVERSOR2



Otras cositas a mejorar:

Código: ASM
  1. MOVLW b'11001100'   ; comoparo el valor del ldr derecho si es menor de 204 (4v), si es menor activo motor izquierdo
  2.    SUBWF VALUZD,W      ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
  3.    BTFSS STATUS,C
  4.    GOTO GIRAR
  5.    BTFSS STATUS,Z
  6.    GOTO COMPIZQ
  7.    GOTO GIRAR

Parece que estas comprobando primero si es menor a 204 y luego si es igual a 204.. que  tal si hacemos lo mismo pero con 205 y solo menor?

Código: ASM
  1. MOVLW b'11001101'   ; comoparo el valor del ldr derecho si es menor de 205, es decir 204 o menos (4v), si es menor activo motor izquierdo
  2.    SUBWF VALUZD,W      ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
  3.    BTFSS STATUS,C
  4.    GOTO GIRAR
  5.    GOTO COMPIZQ

Por lo visto esto tambien se aplica a COMPIZQ y GIRAR



¿ Por que comparar 2 veces ?
En principal ya comparas por que LDR <= 204, y luego dentro de COMPIZ y GIRAR ambos la misma comprobacion de LDR <=204 ???? es decir que tus COMPIZ y GIRAR realmente lo unico que hace es:

Código: ASM
  1. COMPIZQ            ; vemos si el coche va a la izquierda o se para
  2.    GOTO VOLVER
  3.  
  4. GIRAR            ;vemos si el coche va recto o a la derecha
  5.    GOTO RECTO

Me explico... Principal separa LDR <= 204 va a COMPIZQ , mayor a GIRAR
Entra a COMPIZQ (por que era menor o igual a 204) segun el codigo se vuelve a comparar y si da que es menor o igual a 204 entonces va a VOLVER
Si Entra a GIRAR, significa que es mayor de 204, se comprueba de vuelta y va a RECTO si o si. son 2 funciones sin sentido...



Siguiendo el camnio del progrma llegamos a las funciones RECTO/DERECHA /IZQUIERDA

Los cuales todos comienzan la conversion del ADC. y luego hace un salto para cambiar el canal del ADC e inciiar la conversion de vuelta... Eso no se como funcionaria. Inicias la conversion, y voy a suponer que pasa el tiempo necesario para que se samplee la muestra lo cual es el canal 1, se inicia la conversion y cambias al canal0, resumen simepre estarias midiendo el canal1.
Ahora si no llega a completarse el sampleo en esas instrucciones que tenes va a haber problemas, por que estas cambiando el canal a la mitad del tiempo, dando un mal resultado.
Resumen, quita la instruccion de iniciar una nueva conversion total en START, ya seproduce nuevamente el cambio de canal e inicio de conversion.



Procura programar con un loop principal que sea facil de entender.

Código: ASM
  1. PRINICPAL
  2.       CALL  LECTURA_ADC   ; Aca leo el ADC y guardo en los registros
  3.       CALL  TEST_ADC           ; Aca compruebo que esta dentro de los rangos que preveo y activo banderas (bits de algun registro) para que ACCION_MOTORES actue segun elvalor dado aca
  4.       CALL  ACCION_MOTORES  ; Aca actuo segun los bits anteriores
  5.       GOTO PRINCIPAL
« Última modificación: 28 de Diciembre de 2015, 15:14:58 por KILLERJC »

Desconectado javig.16

  • PIC10
  • *
  • Mensajes: 11
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #2 en: 28 de Diciembre de 2015, 15:46:56 »
En primer lugar muchas gracias por haber contestado y por las correcciones. Llevo muy pocO tiempo programando y mis errores son evidentes.
Ya he modificado el programa como me indicas en los consejos del principio de tu respuesta.
En el caso de compizq y girar no es que compare dos veces el  valor "VALUZD" sino que primero compara ese dato correspondiente al ldr derecho, y luego compara el valor del ldr izquierdo "VALUZI" para en función de eso activar un motor u otro, o los dos. Como ya he dicho he modificado el programa tal como dijiste poniendo el retardo antes activar el adcon y no despues, tambien he cambiado el comparador de tal forma que solo comparo si es menor con el flag C de status y sigue ocurriendo lo mismo, solo funciona correctamente el LDR derecho con su correspondiente motor (izquierdo). Modifiqué tambien la parte de " RECTO " "IZQUIERDA" "DERECHA" Y "VUELVE"  suprimiendo la parte donde iniciaba nueva conversion. Probé  a cambiar lo de "START" y mandarlo directamente a inicio pero el motor iba a tirones, no creo que esté ahi el problema. Espero su respuesta, muchas gracias y un saludo.

Desconectado javig.16

  • PIC10
  • *
  • Mensajes: 11
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #3 en: 28 de Diciembre de 2015, 15:47:40 »
Así quedaría el nuevo programa:


   LIST P=16F876A
   INCLUDE "p16F876A.INC"
   CONTA1 EQU 0X20
   CONTA2 EQU 0X21
   CONTA3 EQU 0X22
   VALOR1 EQU 0X23
   VALOR2 EQU 0X25
   VALUZI EQU 0X26
   VALUZD EQU 0X27
   
   ORG H'0000'
   GOTO INICIO
   ORG H'0005'   


   


INICIO

   BCF STATUS,5
   CLRF VALUZI
   CLRF VALUZD
   CLRF PORTA
   CLRF PORTC
   CLRF INTCON

   BSF STATUS,5
   BSF TRISA,0
   BSF TRISA,1
   CLRF TRISC
   CLRF TRISB
   
   
   MOVLW b'00000100' ; CONFIGURACION ADCON1
   MOVWF ADCON1
START

   BCF STATUS,5
   MOVLW   b'11000001'   ; Se activa el conversor en RA0
   MOVWF   ADCON0      ; Se activa el conversor
   CALL   RETA
   BSF   ADCON0,GO
   
CONVERSOR1         ; pregunto si ha terminado la conversion
   BTFSC    ADCON0,GO
   GOTO   CONVERSOR1
   
   MOVF   ADRESH,W   ; guardo el valor de la luz del ldr derecho
   MOVWF   VALUZD
   CLRW
   MOVLW   b'11001001'   ; Se activa el conversor en RA1
   MOVWF   ADCON0      
   CALL   RETA
   BSF   ADCON0,GO
   
CONVERSOR2         ; pregunto si ha terminado la conversion
   BTFSC    ADCON0,GO
   GOTO   CONVERSOR2
   CALL   RETA
   MOVF   ADRESH,W   ; guardo el valor de la luz del ldr izquierdo
   MOVWF   VALUZI
   MOVWF   PORTB
   CLRW

PRINCIPAL
   CLRW
   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
   GOTO GIRAR
   GOTO COMPIZQ
   

VOLVER            ; paramos el coche
   BCF PORTC,0
   BCF PORTC,1
   CALL RETA
   
   GOTO START

COMPIZQ            ; vemos si el coche va a la izquierda o se para

   MOVLW b'1101100'
   SUBWF VALUZI,0
   BTFSS STATUS,C
   GOTO IZQUIERDA
   GOTO VOLVER
   

GIRAR            ;vemos si el coche va recto o a la derecha
   CLRW
   MOVLW b'11001100'
   SUBWF VALUZI,0
   BTFSS STATUS,C
   GOTO RECTO
   GOTO DERECHA
   
   

RECTO   
   BSF PORTC,1
   BSF PORTC,0
   CALL RETA
   
   
   GOTO START

DERECHA   
   BCF PORTC,1
   BSF PORTC,0
   CALL RETA
   
   
   GOTO START
   
IZQUIERDA   

   BSF PORTC,1
   BCF PORTC,0
   CALL RETA
   
   GOTO START







;--------------------- 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







Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #4 en: 29 de Diciembre de 2015, 11:40:18 »
Perdon no vi lo de VALUZD y VALUZI. Y realmente no veo otra cosa.

El funcionamiento actual es:

(derecho < 240)? Si -> (Izquierdo <240)? Si-> Recto
                            |                                       No-> Izquierda
                            |
                            No-> (izquierdo <240)? Si -> Volver
                                                                   No -> Derecha

Es correcto esto ?

Desconectado javig.16

  • PIC10
  • *
  • Mensajes: 11
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #5 en: 29 de Diciembre de 2015, 12:02:13 »
El funcionamiento sería el siguiente:
(LDR derecho < 240)? Si -> (LDR Izquierdo <240)? Si-> Recto (LOS DOS MOTORES ON)
                            |                                       No-> derecha (MOTOR izquierda ON MOTOR derecha OFF, el coche va a la derecha)
                            |
                            No-> (izquierdo <240)? Si -> izquierda (MOTOR DERECHA ON MOTOR IZQUIERDA OFF, el coche va a hacia la izquierda)
                                                                   No -> vuelve (los motores se paran)

El funcionamiento como dije es de un coche seguidor de luz, con lo cual el LDR deechho esta ligado al motor izquierdo y el LDR izquierdo esta ligado al motor derecho, esta intercambiados de tal forma que si le llega la luz al LDR derecho se activa el motor contrario (izquierdo) para que el coche vaya hacia a la derecha, de la misma forma para el otro LDR.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #6 en: 29 de Diciembre de 2015, 16:32:01 »
Bueno te voy a comentar lo que hice. vos veras si te sirve o no.

LDR derecho < 240 y LDR izquierdo > 240 = Motor izq ON
LDR derecho > 240 y LDR izquierdo < 240 = Motor der ON
LDR derecho < 240 y LDR izquierdo < 240 = Ambos OFF
LDR derecho > 240 y LDR izquierdo > 240 = Ambos ON

Hice 2 codigos, y te voy a explicar el por que los hice. Este primero es para que sea mas entendible realmente. Luego el otro es mas una "mejora".


Código: ASM
  1. LIST P=16F876A
  2.    INCLUDE "p16F876A.INC"
  3.  
  4.    CBLOCK 0x20
  5.    CONTA1 ;0x20
  6.    CONTA2
  7.    CONTA3
  8.  
  9.    VALOR1 ;0x23
  10.    VALOR2
  11.  
  12.    VALUZI ;0x25
  13.    VALUZD
  14.  
  15.    TEMP   ;0x27
  16.    ENDC
  17.  
  18.    ORG 0x00
  19.    GOTO Configuracion
  20.    ORG 0x04
  21.    RETURN
  22.  
  23. Configuracion:
  24.  
  25.    ; Inicializacion de puertos
  26.  
  27.    BANKSEL  TRISA
  28.    MOVLW    0x3
  29.    MOVWF    TRISA
  30.    CLRF     TRISC
  31.    CLRF     TRISB
  32.  
  33.    ; Puesta a 0 de los valores
  34.  
  35.    BANKSEL  PORTA
  36.    CLRF     VALUZI
  37.    CLRF     VALUZD
  38.    CLRF     PORTA
  39.    CLRF     PORTC
  40.    CLRF     INTCON
  41.  
  42.    ; Configuracion del ADC
  43.  
  44.    MOVLW    b'00000100'     ; CONFIGURACION ADCON1
  45.    MOVWF    ADCON1
  46.  
  47.    BANKSEL  ADCON0          ; Banco 0
  48.    MOVLW    b'11000001'     ; Se activa el conversor en RA0
  49.    MOVWF    ADCON0          ; Se activa el conversor
  50.  
  51.  
  52. Principal:
  53.    CALL     Conversion
  54.    CALL     Check_Value
  55.    CALL     Accion_Motor
  56.    GOTO     Principal
  57.  
  58. ;  **************************************************************************
  59. ;   Conversion : Realiza la conversion ADC (CH0 y CH1 ) y guarda los valores en 2 registros
  60. ;   Entrada: ----
  61. ;   Salida: VALUZD , VALUZI
  62. ;   Registros usados: ADCON0,ADRESH,PORTB
  63. ;  **************************************************************************
  64.  
  65. Conversion:
  66.  
  67.    ; Canal 0
  68.    BCF      ADCON0,CHS0
  69.    CALL     RETA
  70.    BSF      ADCON0,GO
  71.    BTFSC    ADCON0,GO
  72.    GOTO     $-1
  73.    MOVF     ADRESH,W        ; guardo el valor de la luz del ldr derecho
  74.    MOVWF    VALUZD
  75.  
  76.    ; Canal 1
  77.    BSF      ADCON0,CHS0
  78.    CALL     RETA
  79.    BSF      ADCON0,GO
  80.    BTFSC    ADCON0,GO
  81.    GOTO     $-1
  82.    MOVF     ADRESH,W        ; guardo el valor de la luz del ldr izquierdo
  83.    MOVWF    VALUZI          ; sacamos el valor de valuzi por los leds para comprobar que este paso esta bien
  84.    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
  85.    RETURN
  86.  
  87. ;  **************************************************************************
  88. ;   Check_Value: Checkea el valor de los 2 registros y activa las flags del registro TEMP segun valores
  89. ;   Entrada: VALUZD, VALUZI
  90. ;   Salida: TEMP
  91. ;   Registros usados: -----
  92. ;  **************************************************************************
  93.  
  94. Check_Value:
  95.  
  96.    CLRF     TEMP            ; Pongo a 0 las flags
  97.    MOVLW    0xCC            ; comoparo el valor del ldr derecho si es menor de 204 (4v), si es menor activo motor izquierdo
  98.    SUBWF    VALUZD,W        ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
  99.    BTFSS    STATUS,C
  100.    BSF      TEMP,0          ; indicador que derecha es menor que 0xCC
  101.    MOVLW    0xCC
  102.    SUBWF    VALUZI,W
  103.    BTFSS    STATUS,C
  104.    BSF      TEMP,1          ; indicador que izquierda es menor que 0xCC
  105.    RETURN
  106.  
  107. ;  **************************************************************************
  108. ;   Accion_Motor: Hace uso de las flags para activar las salidas de motor
  109. ;   Entrada: TEMP
  110. ;   Salida: -------
  111. ;   Registros usados: PORTC
  112. ;
  113. ;   ************************
  114. ;   Tabla_accion: Tabla para hacer uso de cada combinacion de TEMP, 4 en total
  115. ;   Entrada: W
  116. ;   Salida: W
  117. ;   Registros usados: -------
  118. ;  **************************************************************************
  119.  
  120. Accion_Motor:
  121.     MOVF    TEMP,W          ; Llamo a la tabla
  122.     CALL    Tabla_accion
  123.     MOVWF   PORTC           ; Pongo el valor que me devuelve en PORTC
  124.     CALL    RETA
  125.     RETURN
  126.  
  127. Tabla_accion:
  128.     ANDLW   0x3             ; Me aseguro que no pase del maximo que es 3
  129.     ADDWF   PCL,F
  130.     RETLW   0x03            ; TEMP = 0x00 -> VALUZD y VALUZI mayores a 240 , 0x03 Ambos motores ON
  131.     RETLW   0x01            ; TEMP = 0x01 -> VALUZD > 240 y VALUZI < 240   , 0x01 Motor izquierda NO
  132.     RETLW   0x02            ; TEMP = 0x02 -> VALUZD < 240 y VALUZI > 240   , 0x02 Motor derecha ON
  133.     RETLW   0x00            ; TEMP = 0x03 -> VALUZD y VALUZI menores a 240 , 0x00 Ambos motores OFF
  134.  
  135. ;--------------------- RETARDOS----------------------
  136. RETA:
  137.    MOVLW D'5'
  138.    MOVWF CONTA1
  139. TRES
  140.    MOVLW D'80'
  141.    MOVWF CONTA2
  142. DOS
  143.    MOVLW D'250'
  144.    MOVWF CONTA3
  145. UNO
  146.    NOP
  147.    NOP
  148.    DECFSZ CONTA3,1
  149.    GOTO UNO
  150.    DECFSZ CONTA2
  151.    GOTO DOS
  152.    DECFSZ CONTA1,1
  153.    GOTO TRES
  154.    RETURN
  155.  
  156.    END

El por que esta realizado asi (Veras ahora la funcion principal) es por que es mas facil probarlo en simulacion en el MPLAB,  lo mas complejo es probar el ADC, entonces con esto lo puedo omitir, simplemente hago:

Código: ASM
  1. Principal:
  2.    ;CALL     Conversion
  3.    MOVLW    0xCE
  4.    MOVWF    VALUZD
  5.    MOVLW    0x10
  6.    MOVWF    VALUZI
  7.    CALL     Check_Value
  8.    CALL     Accion_Motor
  9.    GOTO     Principal

Y reemplaze la parte del ADC por valores que yo le doy, y puedo probar todo lo demas sin necesidad de tener que simular el ADC. Este codigo podria hacerlo un poco mas compacto especialmente en la parte de activar los motores


Código: ASM
  1. LIST P=16F876A
  2.    INCLUDE "p16F876A.INC"
  3.  
  4.    CBLOCK 0x20
  5.    CONTA1 ;0x20
  6.    CONTA2
  7.    CONTA3
  8.  
  9.    VALOR1 ;0x23
  10.    VALOR2
  11.  
  12.    VALUZI ;0x25
  13.    VALUZD
  14.  
  15.    TEMP   ;0x27
  16.    ENDC
  17.  
  18.    ORG 0x00
  19.    GOTO Configuracion
  20.    ORG 0x04
  21.    RETURN
  22.  
  23. Configuracion:
  24.  
  25.    ; Inicializacion de puertos
  26.  
  27.    BANKSEL  TRISA
  28.    MOVLW    0x3
  29.    MOVWF    TRISA
  30.    CLRF     TRISC
  31.    CLRF     TRISB
  32.  
  33.    ; Puesta a 0 de los valores
  34.  
  35.    BANKSEL  PORTA
  36.    CLRF     VALUZI
  37.    CLRF     VALUZD
  38.    CLRF     PORTA
  39.    CLRF     PORTC
  40.    CLRF     INTCON
  41.  
  42.    ; Configuracion del ADC
  43.  
  44.    MOVLW    b'00000100'     ; CONFIGURACION ADCON1
  45.    MOVWF    ADCON1
  46.  
  47.    BANKSEL  ADCON0          ; Banco 0
  48.    MOVLW    b'11000001'     ; Se activa el conversor en RA0
  49.    MOVWF    ADCON0          ; Se activa el conversor
  50.  
  51.  
  52. Principal:
  53.    CALL     Conversion
  54.    CALL     Check_Value
  55.    GOTO     Principal
  56.  
  57. ;  **************************************************************************
  58. ;   Conversion : Realiza la conversion ADC (CH0 y CH1 ) y guarda los valores en 2 registros
  59. ;   Entrada: ----
  60. ;   Salida: VALUZD , VALUZI
  61. ;   Registros usados: ADCON0,ADRESH,PORTB
  62. ;  **************************************************************************
  63.  
  64. Conversion:
  65.  
  66.    ; Canal 0
  67.    BCF      ADCON0,CHS0
  68.    CALL     RETA
  69.    BSF      ADCON0,GO
  70.    BTFSC    ADCON0,GO
  71.    GOTO     $-1
  72.    MOVF     ADRESH,W        ; guardo el valor de la luz del ldr derecho
  73.    MOVWF    VALUZD
  74.  
  75.    ; Canal 1
  76.    BSF      ADCON0,CHS0
  77.    CALL     RETA
  78.    BSF      ADCON0,GO
  79.    BTFSC    ADCON0,GO
  80.    GOTO     $-1
  81.    MOVF     ADRESH,W        ; guardo el valor de la luz del ldr izquierdo
  82.    MOVWF    VALUZI          ; sacamos el valor de valuzi por los leds para comprobar que este paso esta bien
  83.    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
  84.    RETURN
  85.  
  86. ;  **************************************************************************
  87. ;   Check_Value: Checkea el valor de los 2 registros y activa las flags del registro TEMP segun valores
  88. ;   Tambien acciona los motores segun los valores
  89. ;   Entrada: VALUZD, VALUZI
  90. ;   Salida: ----
  91. ;   Registros usados: PORTC
  92. ;  **************************************************************************
  93.  
  94. Check_Value:
  95.  
  96.    CLRF     TEMP            ; Pongo a 0 las flags
  97.    MOVLW    0xCC            ; comoparo el valor del ldr derecho si es menor de 204 (4v), si es menor activo motor izquierdo
  98.    SUBWF    VALUZD,W        ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
  99.    BTFSS    STATUS,C
  100.    BSF      TEMP,1          ; indicador que derecha es menor que 0xCC
  101.    MOVLW    0xCC
  102.    SUBWF    VALUZI,W
  103.    BTFSS    STATUS,C
  104.    BSF      TEMP,0          ; indicador que izquierda es menor que 0xCC
  105.    COMF     TEMP,W          ; Lo invierto para que el 00 sea un 11 para los motores
  106.    ANDLW    0x03            ; Limito a 3
  107.    MOVWF    PORTC
  108.    CALL     RETA
  109.    RETURN
  110.  
  111. ;--------------------- RETARDOS----------------------
  112. RETA:
  113.    MOVLW D'5'
  114.    MOVWF CONTA1
  115. TRES
  116.    MOVLW D'80'
  117.    MOVWF CONTA2
  118. DOS
  119.    MOVLW D'250'
  120.    MOVWF CONTA3
  121. UNO
  122.    NOP
  123.    NOP
  124.    DECFSZ CONTA3,1
  125.    GOTO UNO
  126.    DECFSZ CONTA2
  127.    GOTO DOS
  128.    DECFSZ CONTA1,1
  129.    GOTO TRES
  130.    RETURN
  131.  
  132.    END

Solo observar que cambie los bits 0 e 1 de TEMP, para que cuando invierta sea igual que el ejemplo anterior. Esto va a depender de como esten los motores en tu PIC, es decir cual es el izquierdo y el derecho.

Lo del ADC no lo probe pero deberia funcionar...

Respecto al codigo agregue un par de cosas mas, como vector de interrupcion, utilice un CBLOCK en ves de muchos EQU, primero configuro los TRISx antes de los PORTx, utilizo BANKSEL asi solo el compilador me genera el codigo para cambiar al banco de ese registro, etc.

BANKSEL, CBLOCK no es una instruccion del micro, sino del compilador. es como LIST, INCLUDE, entre otros

------------

EDIT:

Si no queres invertir los bits podes hacerlo asi:

Código: ASM
  1. Check_Value:
  2.  
  3.    CLRF     TEMP            ; Pongo a 0 las flags
  4.    MOVLW    0xCC            ; comoparo el valor del ldr derecho si es menor de 204 (4v), si es menor activo motor izquierdo
  5.    SUBWF    VALUZD,W        ; si no es menor vemos el valor del ldr izquierdo, para ver si estraa parado o solo va hacia la derecha
  6.    BTFSC    STATUS,C
  7.    BSF      TEMP,1          ; indicador que derecha es mayor que 0xCC, PORTC,1 salida motor izquierda, sino cambiar el numero de bit
  8.    MOVLW    0xCC
  9.    SUBWF    VALUZI,W
  10.    BTFSC    STATUS,C
  11.    BSF      TEMP,0          ; indicador que izquierda es mayor que 0xCC , PORTC,0 salida motor derecha
  12.    MOVF     TEMP,W
  13.    MOVWF    PORTC
  14.    CALL     RETA
  15.    RETURN
« Última modificación: 29 de Diciembre de 2015, 16:46:58 por KILLERJC »

Desconectado javig.16

  • PIC10
  • *
  • Mensajes: 11
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #7 en: 29 de Diciembre de 2015, 20:10:16 »
Me funciona correctamente, muchisimas gracias por la ayuda de verdad.

Un saludo, y Feliz Año nuevo.

Desconectado javig.16

  • PIC10
  • *
  • Mensajes: 11
Re:PROBLEMA COCHE SEGUIDOR DE LUZ
« Respuesta #8 en: 02 de Enero de 2016, 08:38:37 »
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=0B4bkZegp0Iv6ajUtbnFOZVVsZWM

el 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