Programación Específica > Microcontroladores
Problema Con Variable En Mpasm
Pegasux:
Muy buenas de nuevo. He declarado una variable "ABAJO" cuyo valor puede ser '0' o '1', para indicarle a la rutina de giro de un motor que gire en un sentido o en el otro. La curiosidad, es que a partir de una posicion del programa, en cada paso que doy en el simulador, esta variable se me incrementa inexplicablemete, lo que hace que el programa funcione mal. Las demas estan bien, es solamente esta la que se incrementa. ¿Es cosa del MPASM?¿virus?¿cachondeo?
Saludos.
© Jonathan ©:
Colga el codigo y vemos.. pasa lo mismo con el programa en el chip una ves grabado? o el problema es solo usando el simulador?. Saludos :)
Pegasux:
El codigo todavia no esta grabado, lo estoy simulando para depurarlo porque hay algunas cosillas que modificar, el problema es que no puedo simularlo bien si me hace estas cosas raras. Ahi va el codigo que hay por ahora, me recortado muchos comentarios para que no haya lineas sueltas.
LIST P=16F876
INCLUDE <P16F876.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C ; La zona de memoria de usuario
APOS ; dirección de memoria
FPOS ; Posición 0x0D de RAM.
ABAJO ; Posición 0x0E de RAM. SENA
SENF
ERRORR ; fallo posicion de motor PAP acelerador
PASOA ; 0x13 posicion de paso de los motores
PASOF ; 0x14
ENDC
MAXA equ b'00001111'
MAXF equ b'00001111'
org 0x00 ;Vector de reset
goto Inicio
; org 0x05 ;Salvar el vector de interrupción
; goto ServicioInterrupcion ; Por desbordamiento del WDT
;--------------------------------------------------------------------------------------------
Inicio
clrf PORTA ; limpia salidas
clrf PORTB
clrf PORTC
clrf PASOA
clrf PASOF
clrf SENA
clrf SENF
clrf ERRORR
clrf ABAJO
clrf APOS
clrf FPOS
bsf STATUS,RP0
movlw b'00001101' movwf OPTION_REG
movlw b'10001000' movwf INTCON
bcf STATUS,RP0
movlw b'00000110' movwf PASOA
movlw b'01100000'
movwf PASOF
clrw ; Puerto B
bsf STATUS, RP0 ; banco 1 para
movwf TRISB
movlw b'11111111' ;
movwf TRISC
J10: ; comprueba freno pisado
bcf STATUS,RP0 ; portc esta en el banco 0
movlw b'00000010' ; mira SENF (frenado) que andwf PORTC,0 ; nos quedamos el bit 1 en W
movwf SENF ; guardamos en senB 1 o 0
movlw b'00000000' ; W = 0
subwf SENF,0 ; W = SENF - W
btfss STATUS,Z ; si Z=0, SENF = 1 -> esta abajo
goto J9 ; comprueba acelerador
; el freno esta pisado, hay que soltarlo para ponerlo a 0
movlw b'00000001' ; pone ABAJO a '1'
movwf ABAJO
call FMOVER
goto J10 ; vuelve a comprobar el
J9: ; comprueba acelerador pisado
bcf STATUS,RP0 ; portc esta en el banco 0
movlw b'00000001' ; mira SENA (acelerado)
andwf PORTC,0 ; nos quedamos el bit 0 en W
movwf SENA ; guardamos en senA 1 o 0
clrw ; W = 0
subwf SENA,0
btfss STATUS,Z ; si Z=0, SENA = 1 -> esta abajo
goto principal ; sigue con la inicializacion
; el acelerador esta pisado, hay que soltarlo
movlw b'00000001' ; pone ABAJO a '1'
movwf ABAJO
call AMOVER
goto J9 ; vuelve a comprobar el
;--------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
;
; PROGRAMA PRINCIPAL:
;
principal:
; mira si hay error y reinicia el sistema
clrf W ; W = 0
subwf ERRORR,0 ; W = ERRORR - W
btfsc STATUS,Z ; si Z=0, ERROR > 0 -> hay error
goto Inicio ; comprueba acelerador pisado
; si no hay error continua
movlw b'00000101' ;
movwf ADCON1
bcf STATUS,RP0 ; portc esta en el banco 0
movlw b'00000010' ; mira SENF (frenado) que andwf PORTC,0 ; nos quedamos el bit 1 en W
movwf SENF ; guardamos en senF 1 o 0
movlw b'00000000' ; W = 0
subwf SENF,0
btfsc STATUS,Z ; si Z=0, SENF = 1 -> esta abajo
goto FRENADO ; el pedal de freno esta
; no esta frenando -> lee valor acelerador -> acelerado
bcf STATUS,RP0 ; portc esta en el banco 0
movlw b'00000001' ; mira SENA (acelerado) andwf PORTC,0 ; nos quedamos el bit 0 en W
movwf SENA ; guardamos en senA 1 o 0
movlw b'00000000' ; W = 0
subwf SENA,0 ; si senA=0 -> Z=1 ->salta linea btfss STATUS,Z ; si Z=0, SENA = 1 ->siguiente linea goto principal ; como no hay nada pisado va a
; acelerador pisado
bcf STATUS,RP0 ;
movlw b'10000001' ; movwf ADCON0
bsf ADCON0,GO ;
; tiempo de conversion de los 10 bits 64us?
btfsc ADCON0,GO ; mira si ha
goto $ - 1
; cuando termina la conversion sigue en acelerado
;--------------------------------------------------------------------------------------------
;
; ACELERADO: decide la posicion del acelerador.
;
; llega aqui si el freno no esta pisado y el acelerador si
; empieza a acelerar
J5:
bcf STATUS,RP0 ; adresh esta en el banco 0
movf ADRESH,0 ; mete en W el valor de la conversion.
subwf APOS,0 ; W = APOS - W
btfss STATUS,C ; miro el carry, si esta a 1 mira bit Z
goto J7 ; carry a 0 -> acelerar mas
btfss STATUS,Z ; si esta a 1 son iguales
goto principal ; son iguales, no hacer nada y volver
goto J8 ; si esta a 0 el bit Z
J7: ; acelerar mas
movlw b'00000000' ; pone ABAJO a '0' para
movwf ABAJO
call AMOVER
incf APOS, 1 ; incrementar APOS
goto principal ; vuelve a mirar todo
J8: ; acelerar menos
movlw b'00000001' ; pone ABAJO a '1' para
movwf ABAJO
call AMOVER
decf APOS, 1 ; decrementar APOS
goto principal ; vuelve a mirar todo
;
; FRENADO: mueve el motor del freno arriba o abajo.
;
FRENADO: ; llega aqui porque el freno esta pisado
bcf STATUS,RP0 ; movlw b'10000011' ; movwf ADCON0
bsf ADCON0,GO ;
; tiempo de conversion de los 10 bits 64us?
btfsc ADCON0,GO ; mira si ha
goto $ - 1
; comprueba acelerador pisado
J2:
bcf STATUS,RP0 ; portc esta en el banco 0
movlw b'00000001' ; mira SENA (acelerado)
andwf PORTC,0 ; nos quedamos el bit 0 en W
movwf SENA ; guardamos en senA 1 o 0
movlw b'00000000' ; W = 0
subwf SENA,0 ; si SENA=0 -> acelerador pisado -> btfss STATUS,Z ; si Z=0, SENA = 1 -> acelerador no goto J1 ; empieza a frenar
; el acelerador esta pisado, hay que soltarlo
movlw b'00000001' ; pone ABAJO a '1'
movwf ABAJO
call AMOVER
goto J2 ; vuelve a comprobar el
J1: ; empieza a frenar
bcf STATUS,RP0 ; adresh esta en el banco 0
movf ADRESH,0 ; mete en W el valor de la conversion.
subwf FPOS,0 ; W = FPOS - W
btfss STATUS,C ; miro el carry, si esta a 1 mira bit Z
goto J3 ; carry a 0 -> frenar mas
btfss STATUS,Z ; si esta a 1 son iguales
goto principal ; son iguales, no hacer nada y volver
goto J4 ; si esta a 0 el bit Z frenar
J3: ; frenar mas
movlw b'00000000' ; pone ABAJO a '0' para movwf ABAJO
call FMOVER
incf FPOS, 1 ; incrementa fpos
goto principal ; vuelve a mirar todo
J4: ; frenar menos
movlw b'00000001' ; pone ABAJO a '1' para movwf ABAJO
call FMOVER
decf FPOS, 1 ; decrementa fpos
goto principal ; vuelve a mirar todo
AMOVER:
movlw b'00000000' ; W = 0
subwf ABAJO,0 ; W = ABAJO - W
btfsc STATUS,Z ; si Z=0, ABAJO = 1 -> bajar
goto J12 ; Z=1, ABAJO = 0
; Bajar amotor
; si la posicion es 0110, damos un paso atras a 0101
movlw b'00000110'
subwf PASOA,0 ; W = PASOA - 0110
btfsc STATUS,Z ; si Z=0, estamos en 0110 -> paso a goto J111 ; no es 0110, mira el
movlw b'00000101'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 0101, damos un paso atras a 1001
J111:
movlw b'00000101'
subwf PASOA,0 ; W = PASOA - 0101
btfsc STATUS,Z ; si Z=0, estamos en 0101 -> paso a
goto J112 ; no es 0101, mira el
movlw b'00001001'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1001, damos un paso atras a 1010
J112:
movlw b'00001001'
subwf PASOA,0 ; W = PASOA - 1001
btfsc STATUS,Z ; si Z=0, estamos en 1001 -> paso a
goto J113 ; no es 1001, mira el
movlw b'00001010'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1010, damos un paso atras a 0110
J113:
movlw b'00001010'
subwf PASOA,0 ; W = PASOA - 1010
btfsc STATUS,Z ; si Z=0, estamos en 1010 -> paso a
goto J114 ; no es ninguno -> ERROR
movlw b'00000110'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
J114: ; ponemos una variable de error a 1
movlw b'00000001'
movwf ERRORR
return
J12: ; subir amotor
; si la posicion es 0110, damos un paso alante a 1010
movlw b'00000110'
subwf PASOA,0 ; W = PASOA - 0110
btfsc STATUS,Z ; si Z=0, estamos en 0110 -> paso a
goto J121 ; no es 0110, mira el
movlw b'00001010'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 0101, damos un paso alante a 0110
J121:
movlw b'00000101'
subwf PASOA,0 ; W = PASOA - 0101
btfsc STATUS,Z ; si Z=0, estamos en 0101 -> paso a
goto J122 ; no es 0101, mira el
movlw b'00000110'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1001, damos un paso alante a 0101
J122:
movlw b'00001001'
subwf PASOA,0 ; W = PASOA - 1001
btfsc STATUS,Z ; si Z=0, estamos en 1001 -> paso a
goto J123 ; no es 1001, mira el
movlw b'00000101'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1010, damos un paso alante a 1001
J123:
movlw b'00001010'
subwf PASOA,0 ; W = PASOA - 1010
btfsc STATUS,Z ; si Z=0, estamos en 1010 -> paso a
goto J124 ; no es ninguno -> ERROR
movlw b'00001001'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOA ; nueva posicion del motor
movwf PORTB
return
J124:
movlw b'00000010'
movwf ERRORR
return
;--------------------------------------------------------------------------------------------
;
; FMOVER: mueve el motor del freno arriba o abajo.
FMOVER:
movlw b'00000000' ; W = 0
subwf ABAJO,0 ; W = ABAJO - W
btfsc STATUS,Z ; si Z=0, ABAJO = 1 -> bajar
goto J20 ; Z=1, ABAJO = 0 -> subir
; Bajar fmotor
; si la posicion es 0110, damos un paso atras a 0101
movlw b'01100000'
subwf PASOF,0 ; W = PASOF - 0110
btfss STATUS,Z ; si Z=0, estamos en 0110 -> paso a
goto J210 ; no es 0110, mira el
movlw b'01010000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
; bsf STATUS,RP0 ; banco 1 para portb?
movwf PORTB
return
; si la posicion es 0101, damos un paso atras a 1001
J210:
movlw b'01010000'
subwf PASOF,0 ; W = PASOA - 0101
btfss STATUS,Z ; si Z=0, estamos en 0101 -> paso a
goto J220 ; no es 0101, mira el
movlw b'10010000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1001, damos un paso atras a 1010
J220:
movlw b'10010000'
subwf PASOF,0 ; W = PASOA - 1001
btfss STATUS,Z ; si Z=0, estamos en 1001 -> paso a
goto J230 ; no es 1001, mira el
movlw b'10100000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1010, damos un paso atras a 0110
J230:
movlw b'10100000'
subwf PASOF,0 ; W = PASOA - 1010
btfss STATUS,Z ; si Z=0, estamos en 1010 -> paso a
goto J240 ; no es ninguno -> ERROR
movlw b'01100000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
J240: ; ponemos una variable de error a 1
movlw b'00000100'
movwf ERRORR
return
J20: ; subir fmotor
; si la posicion es 0110, damos un paso alante a 1010
movlw b'01100000'
subwf PASOF,0 ; W = PASOA - 0110
btfsc STATUS,Z ; si Z=0, estamos en 0110 -> paso a
goto J250 ; no es 0110, mira el
movlw b'10100000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 0101, damos un paso alante a 0110
J250:
movlw b'01010000'
subwf PASOF,0 ; W = PASOA - 0101
btfsc STATUS,Z ; si Z=0, estamos en 0101 -> paso a
goto J260 ; no es 0101, mira el
movlw b'01100000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1001, damos un paso alante a 0101
J260:
movlw b'10010000'
subwf PASOF,0 ; W = PASOA - 1001
btfsc STATUS,Z ; si Z=0, estamos en 1001 -> paso a
goto J270 ; no es 1001, mira el
movlw b'01010000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
; si la posicion es 1010, damos un paso alante a 1001
J270:
movlw b'10100000'
subwf PASOF,0 ; W = PASOA - 1010
btfsc STATUS,Z ; si Z=0, estamos en 1010 -> paso a
goto J280 ; no es ninguno -> ERROR
movlw b'10010000'
bcf STATUS,RP0 ; PORTB esta en el banco 0
movwf PASOF ; nueva posicion del motor
movwf PORTB
return
J280:
movlw b'00001000'
movwf ERRORR
return
END
Huguen_aus_Tirol:
Hola Pegasux! No leí todo tu programa, pero veo que defines ABAJO como byte, es decir que puede tomar cualquier valor entre 0 y 255.
Prueba lo siguiente:
en lugar de ABAJO declara, por ejemplo, DIRECCION
luego, más abajo:
#DEFINE ABAJO DIRECCION,0
Luego maneja la variable ABAJO como bit, es decir con las instrucciones bsf, bcf, etc...
Prueba y nos cuentas... si me da el tiempo reviso más detenidamente el programa!
Saludos
PD si doy clic derecho sobre lo subrayado en rojo, me da opciones de corrección... Me perdí el funeral de "F7"????
Invitemos a los de MS al foro :P
Saludos :hola:
© Jonathan ©:
Exactamente, a simple vista todo el problema parece ser eso, que modificas las variables declaradas e indirectamente afectas los bits de las demas variables, proba con lo que dice Huguen que estoy seguro que dio en el clavo :D .
Saludos cordiales
Navegación
[#] Página Siguiente
Ir a la versión completa