TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado 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
-
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.
-
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
-
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 =.
-
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.