Ensamblador - Ayuda con programa de minisumo

 
Vista:

Ayuda con programa de minisumo

Publicado por RAMON (1 intervención) el 16/12/2021 01:11:18
Hola, buenas tardes, tengo dias tratando de resolver este problema pero no me ha funcionado y es que en la parte de DistanciaMayor no me entra a ninguna rutina. si alguien es capaz de ayudarme se lo agradezco.


----------------------------------------COIDGO SUMO----------------------------------------------------------

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder