Autor Tema: zero flag me esta jodiendo  (Leído 3236 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Epsilon_DJ

  • PIC10
  • *
  • Mensajes: 1
zero flag me esta jodiendo
« en: 09 de Mayo de 2004, 21:53:00 »
Buenas Gente.

Paso a explicar mi problema:
He estado todo el día leyendo y buscando en internet alguna forma de hacer el siguiente codigo de C en assembler para el micro:

if (NuevoEstado == 0)
{
// Hacer cosas para el estado 0 del sensor
}
else if (NuevoEstado == ViejoEstado)
{
// NO hacer nada
}
else
{
// El estado ha cambiado, HACER ALGO !!
}

Bueno, como verán en C no es nada difisil, pero tengo que hacerlo en assembler porque es un proyecto para la escuela y para familiarizarme mejor con el lenguaje sin usar los programas de script.

lo que vendría a ser el NuevoEstado del codigo de C está almacenado en W y el ViejoEstado en SensorData

...
movf W,0      ; muevo el registro a si mismo, para
         ; que Z se cargue con 1 si la operación quedó en 0
btfss STATUS, Z      ; salto si Z es 0
  goto SensorEsCero
xorwf SensorData,0   ; si son iguales el resultado será 0 y Z será 1
btfss STATUS, Z            ; salto si Z es 0
  goto finCheckSensores ; no hago nada

; El estado ha cambiado, HACER ALGO !!!
goto finCheckSensores

SensorEsCero
; Hacer cosas para el estado 0 del sensor

finCheckSensores
return


He hecho los 1000 y 1 cambios pero no logro el funcionamiento que quiero, para testear configuré 2 salidas con leds.

por favor diganme en que me equivoco.

gracias


Desconectado Diego_C

  • PIC12
  • **
  • Mensajes: 54
RE: zero flag me esta jodiendo
« Respuesta #1 en: 10 de Mayo de 2004, 08:33:00 »
jojo, recien me doy cuenta, el anterior era yo logueado con otro nombre, (tengo un navegador con un nombre y el otro con el otro).

disculpen.

Desconectado otika

  • PIC10
  • *
  • Mensajes: 3
RE: zero flag me esta jodiendo
« Respuesta #2 en: 10 de Mayo de 2004, 21:06:00 »
Tengo una pequeña pregunta, el codigo es compilado en el MPLAB,
si es asi la linea de codigo:
   movf W,0
no funciona ya que W en el MPLAB es una constante con el valor 0
, este codigo lo que hace es llevar el contenido de la posicion de memoria 0 al registro de trabajo W
para utilizar el registro de trabajo W del pic talvez seria mejor:
 andlw 0x00
la bandera Z es afectada pero tambien el contenido de W!, lo mejor seria utilizar otra variable para manejar el dato.

Escrito originalmente por Epsilon_DJ
Buenas Gente.

Paso a explicar mi problema:
He estado todo el día leyendo y buscando en internet alguna forma de hacer el siguiente codigo de C en assembler para el micro:

if (NuevoEstado == 0)
{
// Hacer cosas para el estado 0 del sensor
}
else if (NuevoEstado == ViejoEstado)
{
// NO hacer nada
}
else
{
// El estado ha cambiado, HACER ALGO !!
}

Bueno, como verán en C no es nada difisil, pero tengo que hacerlo en assembler porque es un proyecto para la escuela y para familiarizarme mejor con el lenguaje sin usar los programas de script.

lo que vendría a ser el NuevoEstado del codigo de C está almacenado en W y el ViejoEstado en SensorData

...
movf W,0      ; muevo el registro a si mismo, para
         ; que Z se cargue con 1 si la operación quedó en 0
btfss STATUS, Z      ; salto si Z es 0
  goto SensorEsCero
xorwf SensorData,0   ; si son iguales el resultado será 0 y Z será 1
btfss STATUS, Z            ; salto si Z es 0
  goto finCheckSensores ; no hago nada

; El estado ha cambiado, HACER ALGO !!!
goto finCheckSensores

SensorEsCero
; Hacer cosas para el estado 0 del sensor

finCheckSensores
return


He hecho los 1000 y 1 cambios pero no logro el funcionamiento que quiero, para testear configuré 2 salidas con leds.

por favor diganme en que me equivoco.

gracias



Desconectado Diego_C

  • PIC12
  • **
  • Mensajes: 54
RE: zero flag me esta jodiendo
« Respuesta #3 en: 10 de Mayo de 2004, 21:12:00 »
finalmente lo solucioné

comprobé que Z es 1 cuando el registro W es 0 con una serie de pruebas, además lo que estaba realmente mal era el segmentito de código con el que cargaba W y el segmentito con el que inicializo SensorData al inicio del programa, asi que aunque quisieran no hiban a saber donde estaba el error mas que en los btfss por btfsc.

movlw 00110000b      ; dato para enmascarar la parte util
andwf PuertoTec,0

btfsc STATUS, Z      ; if Z == 1
  goto SensorEsCero        ; do this, else do next

xorwf SensorData,0   ; si son iguales el resultado será 0 y Z será 1
btfsc STATUS, Z
  goto finCheckSensores

Gracias =.

Desconectado Diego_C

  • PIC12
  • **
  • Mensajes: 54
RE: zero flag me esta jodiendo
« Respuesta #4 en: 10 de Mayo de 2004, 21:24:00 »
gracias, gracias, mientras escribía lo anterior posteaste vos y se nos cruzaron los post :P

puse lo de movf W, 0 para mover el registro W a W, ocea, moverse a si mismo, tan solo para actualizar la bandera Z, otra solución como tu dices era de poner andlw 0ffh (porque si le pongo 0 a la and, la salida siempre será 0 y no me sirve).

mas tarde probé con otras formas de afectar a Z como es
decf (que me decrementa, y para eso tengo que incrementar antes para no afectar el dato, pero si funcionaba, bueh), la cagada es que no funcionó y no sé porque, ya que se supone que decf e incf afectan a Z, pero me cagaban todo, y esto lo comprobé utilizado el led de debug con la Z y colocando la rutina de debug antes y despues del decf, y para mi alegría checkeando con el debug antes de la instrucción decf, es decir, despues de acomodar el dato en el registro, Z funcionaba como yo quería, entonces removí todas las boludeces que había puesto para alterar Z, y como por arte de magia funcionó correctamente, pero no entiendo porqué decf me arruinaba la Z, pero lo sospecho


así que, por fiiiiin, andaaaa !!

Y Muchas gracias por responder


Escrito originalmente por otika
Tengo una pequeña pregunta, el codigo es compilado en el MPLAB,
si es asi la linea de codigo:
   movf W,0
no funciona ya que W en el MPLAB es una constante con el valor 0
, este codigo lo que hace es llevar el contenido de la posicion de memoria 0 al registro de trabajo W
para utilizar el registro de trabajo W del pic talvez seria mejor:
 andlw 0x00
la bandera Z es afectada pero tambien el contenido de W!, lo mejor seria utilizar otra variable para manejar el dato.