Programación Específica > Microcontroladores

 Problema Con Variable En Mpasm

(1/4) > >>

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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa