Programación Específica > Microcontroladores
Problema Con Variable En Mpasm
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.
Pegasux:
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 ©:
--- 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.
--- Fin de la cita ---
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 --- CBLOCK 0x0C; La zona de memoria de usuario BANDERA ; Reemplace las 3 variables por BANDERASENFERRORR; fallo posicion de motor PAP aceleradorPASOA; 0x13 posicion de paso de los motoresPASOF; 0x14ENDC
Luego de reservar el espacio para bandera definis que bits seran utilizados tal como dijo Huguen:
--- Código: Text --- #DEFINE ABAJO BANDERA,0 ; Defino el BIT 0 de BANDERA como bit ABAJO #DEFINE APOS BANDERA,1 ; Defino el BIT 1 de BANDERA como bit APOS #DEFINE FPOS BANDERA,2 ; Defino el BIT 2 de BANDERA como bit FPOS
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 --- btfsc ABAJO ; si ABAJO = 0 -> salta a goto J21 goto J20 ; de lo contrario entra en J20 goto J21
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
Pegasux:
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:
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
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa