Título: Ayuda con un programa de minisumo Publicado por: RAMONDELTEC 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 |