• Domingo 29 de Septiembre de 2024, 01:23

Autor Tema:  Problema Con Variable En Mpasm  (Leído 4432 veces)

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Problema Con Variable En Mpasm
« en: Miércoles 28 de Febrero de 2007, 15:14 »
0
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 ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Problema Con Variable En Mpasm
« Respuesta #1 en: Miércoles 28 de Febrero de 2007, 17:04 »
0
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 :)
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #2 en: Miércoles 28 de Febrero de 2007, 23:25 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Problema Con Variable En Mpasm
« Respuesta #3 en: Jueves 1 de Marzo de 2007, 00:26 »
0
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 ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Problema Con Variable En Mpasm
« Respuesta #4 en: Jueves 1 de Marzo de 2007, 03:41 »
0
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
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #5 en: Jueves 1 de Marzo de 2007, 11:06 »
0
Hola compañeros. La verdad es que sigo igual de confuso que antes. Yo estaba buscando una variable de tipo boolean (true/false), pero no las hay, asi que pense en coger una de un byte y usar solamente un bit. Lo que no entiendo es porque me ha de modificar el byte si el simulador no sabe que yo solo quiero usar un bit, es decir, si yo quisiera usar todo el byte, me lo seguiria modificando. Da la casualidad de que me modifica esta pero todas las demas variables tambien las defino como byte ¿podria modificarme otra? ¿Se ha guardado en una posicion de memoria que es utilizada por el simulador o por el micro?

Por otro lado, de esta nueva forma que me dices, la secuencia:
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

me da un error de compilacion, creo que al ser de distinto tipo la operacion no se realiza correctamente.

Muchas gracias y un saludo.

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #6 en: Jueves 1 de Marzo de 2007, 11:29 »
0
Bueno, dado que la secuencia la hago para que salte si ABAJO es 1 o 0, ¿se puede hacer directamente con btfss y btfsc? No se como hacerlo.
Saludos.

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Problema Con Variable En Mpasm
« Respuesta #7 en: Viernes 2 de Marzo de 2007, 02:37 »
0
Cita de: "Pegasux"
Hola compañeros. La verdad es que sigo igual de confuso que antes. Yo estaba buscando una variable de tipo boolean (true/false), pero no las hay, asi que pense en coger una de un byte y usar solamente un bit. Lo que no entiendo es porque me ha de modificar el byte si el simulador no sabe que yo solo quiero usar un bit, es decir, si yo quisiera usar todo el byte, me lo seguiria modificando. Da la casualidad de que me modifica esta pero todas las demas variables tambien las defino como byte ¿podria modificarme otra? ¿Se ha guardado en una posicion de memoria que es utilizada por el simulador o por el micro?

Por otro lado, de esta nueva forma que me dices, la secuencia:
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

me da un error de compilacion, creo que al ser de distinto tipo la operacion no se realiza correctamente.

Muchas gracias y un saludo.
Las variables del tipo bool pueden ser declaradas, pero no con un identificador, sino que tienes que crearlas. Por ejemplo si necesitas la variable ABAJO, FPOS, APOS y alguna otra, solo para utilizarlas como bandera esta mal que las declares como variables de byte. Tendrias que reemplazar esto por una sola variable de 8 bits que se llame por ejemplo BANDERA y en ella declarar los bits que usaras.

Código: Text
  1.  CBLOCK 0x0C&#59; La zona de memoria de usuario
  2.  
  3. BANDERA &#59; Reemplace las 3 variables por BANDERA
  4. SENF
  5. ERRORR&#59; fallo posicion de motor PAP acelerador
  6. PASOA&#59; 0x13 posicion de paso de los motores
  7. PASOF&#59; 0x14
  8. ENDC
  9.  

Luego de reservar el espacio para bandera definis que bits seran utilizados tal como dijo Huguen:
Código: Text
  1.  
  2.  
  3. #DEFINE ABAJO BANDERA,0  &#59; Defino el BIT 0 de BANDERA como bit ABAJO
  4.  
  5. #DEFINE APOS  BANDERA,1  &#59; Defino el BIT 1 de BANDERA como bit APOS
  6.  
  7. #DEFINE FPOS BANDERA,2   &#59; Defino el BIT 2 de BANDERA como bit FPOS
  8.  

Una ves definidos los bits que trabajaran como flag en BANDERA los utilizas.
Estas declaraciones solo pueden tener 2 valores, o "1" o "0", por eso son considerados del tipo BOOL.

Si tienes que ver el estado del bit ABAJO puedes hacerlo simplemente usando las instrucciones btfsc y btfss.

Código: Text
  1.  
  2.   btfsc    ABAJO       &#59; si ABAJO = 0 -&#62; salta a goto J21
  3.   goto     J20  &#59; de lo contrario entra en J20
  4.         goto            J21
  5.  
  6.  

Talves se torne confuso, pero espero consultas. Voy a mirar mas detenidamente el codigo para ver si el problema radica ahi o es otra cosa que se nos esta escapando.

Saludos Cordiales
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #8 en: Viernes 2 de Marzo de 2007, 07:57 »
0
Muchas gracias por la aclaracion. En realidad son sena, senb y abajo las boleanas, las demas han de ser por lo menos de 4 bits. Voy a modificar el codigo tal y como me has explicado para que quede mas correcto.
Otra cosilla. He visto por ahi que puedo declarar de la misma forma un bit del puerto C por ejemplo que es de entrada (sena y senb) y comprobar directamente si esta a 0 o a 1 sin tener que hacer la operacion and con W para seleccionar ese bit del puerto C. También voy a intentar implementarlo, y me pregunto si he de poner RP0 a 0 para seleccionar el banco antes de leer SENA y SENF (ahora declarados como bits) o si se encarga el compilador solo de gestionarlo.
Saludos.

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Problema Con Variable En Mpasm
« Respuesta #9 en: Viernes 2 de Marzo de 2007, 08:25 »
0
Hola!
Bueno,vamos por partes, dijo Jack...
Si vas a usar solo 4 bits de una variable, la declaras como byte, y cada ves antes de usarla la filtras, por ejemplo

ANDLW 0x0F

Entonces, en este caso, eliminas el nibble alto de la variable (lo dejas en 0). Con esto evitas problemas por cualquier "basura" que pueda meterse...

Puedes trabajar con cualquier bit de cualquier byte usando las instrucciones de manejo de bits, incluso leer o (des)activar un pin de un puerto...

En asembler hay que prestar bastante atencion con el manejo de los bancos, ya que no se realiza automaticamente. Microchip tiene unas macros para la seleccion de los bancos, pero es lo mismo, ya que si no la escribimos nosotros mismos, no cambia de banco. Cuando seleccionas un banco, siempre se apunta a los registros de ese banco hasta que se vuelva a cambiar, no es necesario estar seleccionando el banco a cada momento; creo que en tu programa lo haces con frecuencia... Ojo!, no esta mal, pero puedes ahorrarte algo de memoria.
Un tip: si usas interrupciones, es bueno trabajar con las variables en un mismo banco, por ejemplo el 0. Entonces al entrar a la interrupcion, resguardas el registro STATUS, seleccionas el banco 0, y al salir restauras STATUS, volviendo automaticamente al banco en el que se estaba ;) Es mas, si no haces esto, tendras problemas...

Espero haber aclarado algo... ahora sigo con mi trabajo, jeje!!

Saludos

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #10 en: Viernes 2 de Marzo de 2007, 08:33 »
0
Gracias Huguen, queda claro, voy a dejar el cambio de bancos como lo tenia:

                CBLOCK   0x0C      ; La zona de memoria
   APOS            ; dirección de memoria
   FPOS            ; Posición 0x0D de RAM.
   ERRORR   ; 0x0E
   PASOA      ; 0x0F posicion de paso de los motores
   PASOF      ; 0x10
   DIRECCION   ; 0x11
   ENDC

#DEFINE ABAJO DIRECCION,0   ; abajo es el bit 0 del byte "direccion"
#DEFINE SENA   PORTC,0   ; sena es el bit 0 del puerto C
#DEFINE SENB   PORTC,1   

y mas abajo...

   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
;   clrw            ; W = 0
;   subwf      SENF,0   ; W = SENF - 0
   btfsc      SENF   ; SENF = 1 -> esta abajo
   goto       FRENADO      ; el pedal de freno esta pisado, va a frenar


Tienes razon con lo de ahorrar memoria, como hice un cortar y pegar ni me di cuenta, ya lo he cambiado.
Saludos.

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #11 en: Viernes 2 de Marzo de 2007, 09:34 »
0
Algo esta fallando, en el siguiente codigo, tanto si senf esta a 0 como si esta a 1, se salta la linea del goto.

   btfss      SENF      ; SENF = 1 -> esta abajo, evita goto
   goto       FRENADO      ; el pedal de freno esta

Las lineas del puerto C cambian correctamente con los estimulos. ¿Hay que hacer algo para que la variable SENF se actualice al valor de su correspondiente bit del puerto C cuando cambio un estimulo?

Estoy pasando el antivirus por si acaso, a ver si encuentra algo.

Saludos.

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Problema Con Variable En Mpasm
« Respuesta #12 en: Viernes 2 de Marzo de 2007, 11:37 »
0
Hola! en tu programa veo que declaras SENF como byte, y usas una instruccion de manejo de bits.
Deberia ser:

btfss SENF.x

donde x es el bit que quieres verificar

saludos

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #13 en: Viernes 2 de Marzo de 2007, 13:33 »
0
Cita de: "Huguen_aus_Tirol"
Hola! en tu programa veo que declaras SENF como byte, y usas una instruccion de manejo de bits.
Deberia ser:

btfss SENF.x

donde x es el bit que quieres verificar

saludos
Hola de nuevo. SENF al principio lo declaraba como byte, pero ahora esta como me ha dicho Jonathan: #DEFINE SENF   PORTC,1   por eso utilizo btfss.

Me pasa otra cosa, con las siguientes instrucciones:
               
                movlw      b'01100000'   
   movwf      PASOF      
   
el valor de PASOF deberia ser 60 (96 en decimal), pero se me pone a 20!! (32'd)
El contenido del W es 60, y si cambio PASOF por PASOA funciona bien.
¿Alguien sabe el porque?

Saludos.

P.D: No habia virus!!

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Problema Con Variable En Mpasm
« Respuesta #14 en: Viernes 2 de Marzo de 2007, 18:40 »
0
Hola!
Estás simulando con el MPLAB y usas estímulos? No se que aconsejarte, ya que nunca use estímulos en la simulación; pero recuerdo que una vez leí algo de que no era muy conveniente &lt;_&lt;
Qué versión usas? Quizá te convenga actualizar a la última...
Eso que pasa es muy extraño, la verdad que no se que podría ser. Tal vez podrías adjuntar el programa, así lo revisamos (aprovecha que tengo algo de tiempo, jeje!!)

La verdad que es extraño...

Saludos

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #15 en: Sábado 3 de Marzo de 2007, 07:37 »
0
Hola de nuevo. Si, uso estimulos, no se otra forma de meter valores en los pines. Tenia la version 7.2 y he actualizado a la 7.5, pero sigue pasando lo mismo o peor, he seguido simulando a pesar de que funciona mal esa zona de codigo, y el codigo restante tambien funciona mal, hace lo que le da la gana cuando le da la gana. El paso de valores de W a registros y eso funciona bien, pero en cuanto se usan las variables se descontrola. ¿Empiezo a pensar en otro simulador?
He colgado el codigo tal y como lo tengo ahora:

http://www.alumnos.unican.es/uc12909/func1.asm

Saludos.

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Problema Con Variable En Mpasm
« Respuesta #16 en: Sábado 3 de Marzo de 2007, 09:23 »
0
Hola!
No me había dado cuenta, pensé que usabas el 16F84!!! :whistling:
Para el 84 puedes definir tus variables a partir de la dirección 0x0C; pero para el 876 tienes que empezar desde la dirección 0x20...
Si te fijas, estas escribiendo en registros como p.e. T1CON... Veamos el caso del misterioso PASOF &lt;_&lt;  Lo declaras en la dirección 0x10, pero 0x10 corresponde a T1CON, y en este registro los bits 6 y 7 no están implementados, es decir al leer el registro estos bits están a 0 :rolleyes:
Otra cosa, las interrupciones se vectorizan a la dirección 0x04 (org 0x04)

Bueno, creo que ya está solucionado! Perdón por no haberme fijado antes que micro usabas

Saludos :hola:

Pegasux

  • Miembro MUY activo
  • ***
  • Mensajes: 130
    • Ver Perfil
Re: Problema Con Variable En Mpasm
« Respuesta #17 en: Sábado 3 de Marzo de 2007, 11:46 »
0
Ejejejje, que buena!! Muchas gracias!!  Ahora ya he visto que te refieres a los registros de proposito general del banco 0.
Yujuuuuuuu!!!!!! Ahroa si que funciona, tenia mal puestas unas cosillas pa que funcionase bien, pero ya está solucionado.
Muchas gracias y saludos!!

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Problema Con Variable En Mpasm
« Respuesta #18 en: Domingo 4 de Marzo de 2007, 06:15 »
0
Cita de: "Pegasux"
Ejejejje, que buena!! Muchas gracias!!  Ahora ya he visto que te refieres a los registros de proposito general del banco 0.
Yujuuuuuuu!!!!!! Ahroa si que funciona, tenia mal puestas unas cosillas pa que funcionase bien, pero ya está solucionado.
Muchas gracias y saludos!!
jajajaja cuanto me alegrooooo!!!.. que grande HUGUEN!.. en mi pais necesitamos gente como vos, no queres venirte??? :D :D :D :D. Un abrazo !
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»