TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Epsilon_DJ en 09 de Mayo de 2004, 21:53:00

Título: zero flag me esta jodiendo
Publicado por: Epsilon_DJ 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

Título: RE: zero flag me esta jodiendo
Publicado por: Diego_C 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.
Título: RE: zero flag me esta jodiendo
Publicado por: otika 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


Título: RE: zero flag me esta jodiendo
Publicado por: Diego_C 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 =.
Título: RE: zero flag me esta jodiendo
Publicado por: Diego_C 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.