elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Ayuda con un programa de minisumo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con un programa de minisumo  (Leído 1,855 veces)
RAMONDELTEC

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda con un programa de minisumo
« en: 16 Diciembre 2021, 01:05 am »

Tengo un problema y es que en la parte de DistanciaMayor no hace ninguna subrutina.
Ya trate de resolverlo pero no encuentro la manera, si fueran muy amables de ayudarme se los agradeceria.


   LIST      P=16F84A
   INCLUDE      <P16F84A.INC>
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   CBLOCK  0x0C
   Distancia                  ; Se expresará en centímetros.
   ENDC
#DEFINE SensorDerecha   PORTA,0      ; Sensor óptico Derecho.
#DEFINE SensorIzquierda   PORTA,1      ; Sensor óptico Izquierdo.
#DEFINE  Eco      PORTA,2         ; Pulso cuya anchura hay que medir.
#DEFINE  Disparo   PORTA,3         ; Disparo para iniciar la medida.
   
MIN_DISTANCIA      EQU   .3
MAX_DISTANCIA      EQU   .250
TMR0_Carga60micros   EQU d'256'-d'27'; Valor obtenido experimentalmente con la

    ORG    0
   goto   INICIO
   ORG   4
   goto   ServicioInterrupcion
INICIO
  BSF STATUS,RP0
  MOVLW b'11111111'
  MOVWF PORTA
  MOVLW b'11110000'
  MOVWF PORTB

   bcf      Disparo
   bsf      Eco
   movlw   b'00000000'            ; Prescaler de 2 para el TMR0.
   movwf   OPTION_REG
   bcf      STATUS,RP0
   bcf      Disparo               ; Inicializa línea de disparo en bajo.
 
PRINCIPAL
   clrf   Distancia            ; Inicializa el registro.
   bsf      Disparo               ; Comienza el pulso de disparo.
   call   Retardo_20micros      ; Duración del pulso.
   bcf      Disparo               ; Final del pulso de disparo.
Espera_Eco_1
   btfss   Eco                  ; Si ECO=0, espera el flanco de subida de la señal
   goto   Espera_Eco_1         ; de salida del sensor.
   movlw   TMR0_Carga60micros      ; Ya se ha producido el flanco de subida.
   movwf   TMR0               ; Carga el Timer 0.
   movlw   b'10100000'            ; Autoriza interrupción del TMR0 (T0IE).
   movwf   INTCON
Espera_Eco_0
   btfsc   Eco                  ; Espera flanco de bajada de la señal de la salida
   goto   Espera_Eco_0         ; del SRF04.
   clrf   INTCON               ; Se ha producido el flanco de bajada. Prohíbe interrup.
   call ServicioInterrupcion
   call   Visualiza            ; Visualiza la distancia.
   call   Retardo_2s            ; Espera un tiempo hasta la próxima medida.
Fin   goto   PRINCIPAL

   

DistanciaMayor
   
   movlw    b'00001110'            ; Para girar a la derecha.
   btfss   SensorDerecha         ; ¿Ha salido por la derecha?, ¿detecta blanco?
   goto   ActivaSalida         ; No, el detector derecho está encima de la línea                  ; negra, gira a la derecha.
   movlw   b'00000111'            ; Para girar a la izquierda.
   btfss   SensorIzquierda         ; ¿Ha salido también por la izquierda?
   goto   ActivaSalida
   movlw   b'00001010'            ; No, está en el borde derecho. Sigue recto.
   goto   ActivaSalida   
   goto PRINCIPAL
DistanciaMenor
   
   movlw   b'00001010'   
   goto   ActivaSalida
   goto PRINCIPAL
DistanciaFiable
   
   movlw   b'00001010'   
   
   goto   ActivaSalida
   goto PRINCIPAL
   
ActivaSalida
   
   movwf   PORTB
   goto PRINCIPAL
   
ServicioInterrupcion
     movlw   TMR0_Carga60micros      ; Carga el Timer 0.
   movwf   TMR0
   movlw   .1                  ; Se utiliza instrucción "addwf", en lugar de "incf"
   addwf   Distancia,F            ; para posicionar flag de Carry.
   movlw   MAX_DISTANCIA         ; En caso de desbordamiento carga su máximo valor.
   btfsc   STATUS,C
   movwf   Distancia
   bcf      INTCON,T0IF
   return
   retfie   
   
Visualiza
   movlw   MIN_DISTANCIA         ; Va a comprobar si es menor del mínimo admisible.
   subwf   Distancia,W            ; (W) = (Distancia) - MIN_DISTANCIA
   btfss   STATUS,C            ; ¿C=1?, ¿(W) positivo?, ¿(Distancia) >= MIN_DISTANCIA?
   goto   DistanciaMenor         ; No ha resultado menor, y salta al mensaje de error.
   movf   Distancia,W            ; Va a comprobar si es mayor del máximo admisible.
   sublw   MAX_DISTANCIA         ; (W)=MAX_DISTANCIA-(Distancia)
   goto   DistanciaMayor         ; No ha resultado menor, y salta al mensaje de error.
   btfsc   STATUS,C            ; ¿C=0?, ¿(W) negativo?, ¿MAX_DISTANCIA < (Distancia)?
   goto   DistanciaFiable         ; No, la medida de la distancia entra dentro del rango.   
    INCLUDE  <RETARDOS.INC>
 END



En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines