TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: elmasvital en 22 de Marzo de 2008, 04:41:22
-
movfw POS_JOY4
sublw 0x50
si pos_joy4 vale AF, con el cumando sublw 0x50 no deberia darnos 5F¿¿¿¿ que me sale A1 y no lo comprendo... alguna logica? No salta entre medio la interrupción ni nada.
-
Yo lo veo bien, 0x50 - 0xAF = 0xA1
-
.. ok estoy haciendo la cuenta al reves... Por cierto manolo tu tambien estás apurado de tiempo igual que yo hoy? jajaja estas que horas son
-
HOla!
El resultado es correcto , y en realidad te da un numero negativo.
Lo que haces es 50-AF.
Si hicieras AF-50 =5f
Sublw = Literal o inmediato - W , donde L=50 y W = POS_JOY4
L
- W
----------
Saludos!
Atentamente
Akenafab
-
.. ok estoy haciendo la cuenta al reves... Por cierto manolo tu tambien estás apurado de tiempo igual que yo hoy? jajaja estas que horas son
Es mi horario habitual. Ya sabes, el nick tiene su coste.
-
muchas veces el error ocurre por una confusion con el nombre de la instrucción.
sublw pareceria decir Substract Literal from W, pero es precisamente al reves. Substract W from Literal.
Saludos...
-
De hecho la sintaxis que manejan comunmente por "comodidad" en el caso de
movfw POS_JOY4
también es muy propensa a errores.
La sintaxis correcta es:
movf POS_JOY4,W
Ambas sintaxis son correctas. El movfw es un macro del MPASM, nada más.
Tal vez alguno pueda maltipear movwf por movfw pero es lo mismo que mal tipear subwf o sublw, etc...
Tal vez la moraleja sea: En assembly, un maltipeo se paga caro ... muy caro.
-
De hecho la sintaxis que manejan comunmente por "comodidad" en el caso de
movfw POS_JOY4
también es muy propensa a errores.
La sintaxis correcta es:
movf POS_JOY4,W
Ambas sintaxis son correctas. El movfw es un macro del MPASM, nada más.
Tal vez alguno pueda maltipear movwf por movfw pero es lo mismo que mal tipear subwf o sublw, etc...
Tal vez la moraleja sea: En assembly, un maltipeo se paga caro ... muy caro.
Y tan caro Manuix....
Me he llevado en 2 ocasiones mas de 4 horas perdidas por tipear mal una llamada Macro... ya que el ensamblador no te avisa de este error. Escribia GUARDA_CONTEXTO en vez de GUARDO_CONTEXTO.... imaginaos los resultados de este error...
Me parece que mplab como entorno deberia mejorar bastante y facilitar una programacion que ya de por si es bastante exigente, con tantos registros y parámetros.
1 slaudo
-
Pues yo no opino lo mismo Juan Carlos. Está claro que el ASM tiene su dificultad y requiere de un dominio de la técnica de programación en assembler y de un conocimiento exhaustivo de los registros del PIC y sus funciones.
Pero si hay automatismos que el compilador pudiera tener para evitar errores "de bulto", siempre creo que sería una medida positiva.
¿Cuál es la ventaja de no tenerlos?
-
Ah, ok, en ese caso estamos de acuerdo, y a ti también te parecería bien tenerlos.
-
Igual que incluyen el visual inizializer pq no pueden poner este tipo de cosas??? me parece inadmisible q un compilador no te avise de cuando usas una macro que no existe y que si te avise mil veces de warnings estupidos como que este registro no está en el banco 1....
-
y que si te avise mil veces de warnings estupidos como que este registro no está en el banco 1....
Ese warning no es estupido , creo que a mas de uno le ha pasado equivocarse de banco, ahora sobre diferenciar las macros de las etiquetas, deberia ser algo que modifiquen, pero mientras no este modificado....
Saludos
-
Y tan caro Manuix....
Me he llevado en 2 ocasiones mas de 4 horas perdidas por tipear mal una llamada Macro... ya que el ensamblador no te avisa de este error. Escribia GUARDA_CONTEXTO en vez de GUARDO_CONTEXTO.... imaginaos los resultados de este error...
Me llama la atención que el MPLAB no te avise de este error, ya que previamente deberías declararla como por ejemplo:
GUARDO_CONTEXTO EQU H'23'
#DEFINE GUARDO_CONTEXTO BSF PORTA,0 ;Por ejemplo
No se como has utilizado esa intrucción. Si lo citas como GUARDA_CONTEXTO, en el programa, debería darte error.
-
muchas veces el error ocurre por una confusion con el nombre de la instrucción.
sublw pareceria decir Substract Literal from W, pero es precisamente al reves. Substract W from Literal.
Saludos...
debe ser por la gramática english, la forma extraña de escribir algunas frases al revés :?
-
Y tan caro Manuix....
Me he llevado en 2 ocasiones mas de 4 horas perdidas por tipear mal una llamada Macro... ya que el ensamblador no te avisa de este error. Escribia GUARDA_CONTEXTO en vez de GUARDO_CONTEXTO.... imaginaos los resultados de este error...
Me llama la atención que el MPLAB no te avise de este error, ya que previamente deberías declararla como por ejemplo:
GUARDO_CONTEXTO EQU H'23'
#DEFINE GUARDO_CONTEXTO BSF PORTA,0 ;Por ejemplo
No se como has utilizado esa intrucción. Si lo citas como GUARDA_CONTEXTO, en el programa, debería darte error.
Ya pero es que lo que hago no es usar una variable o registro lo que se está llamando es una macro. Prueba a llamar una macro inexistente con mplab veras que no te da error alguno.
1 saludo.
-
Por la macro entiendo que llamas desde una rutina generada anteriormente y citada como por ejemplo
Include <ldc8bit.inc>
Porque si es así, tienes toda la razón. Yo no utilizo macros, los copio y pego en el programa para poder manejarlos mejor a la hora de ubicarlos en el lugar que yo deseo, ya que si se ponen al final del programa, talvez no funcionan. Es por las tablas y una tarea pendiente que deberá solucionar MICROCHIP, con el PC.
-
hola
te cuento como experiencia personal, que cuando comence a usar mplab me sucedieron cosas parecidas como que podia llamar a una rutina o macro que no existiera, ya fuese de un .lib o .inc y no me daba error, me volvi loco intentando saber porqué. pero en sucesivos programas no se si al actualizar la version o simplemente algo que habia tocado. lo solucione haciendo un proyecto nuevo y reordenando los archivos, en el mismo asm, copiar pegar de las .lib .inc
pero llamar a una macro o rutina que no esté en un include o libreria y que no de error, a mi parecer, es por haber tocado algo :mrgreen: por que ahora si me los da
en mi caso para organizar los archivos, el .asm solo contiene los archivos que forman el programa
list P=16f877A
#include <P16F877A.INC>
#include <DEFINITIONS.INC>
#include <MACROS-MIDI.LIB>
#include <BOOTLOADER.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC&_BODEN_ON&_LVP_OFF
end
estos se encuentran en la misma carpeta del .asm asi no es necesario añadirlos en la ventana project excepto el propio .asm
#include <P16F877A.INC>
#include <DEFINITIONS.INC> estos contienen las direcciones y definiciones
#include <MACROS-MIDI.LIB> estas son las macros que uso en mis programas, podria ser de una lcd o IIC,pulsadores.....
#include <BOOTLOADER.INC> y en esta, está el programa principal donde se llaman a las rutinas y las direcciones donde se ubican las macros
copiar y pegar todo en el asm, solo las partes de las macros que vayas a utilizar y ponerlas en las direcciones donde vayan a estar, asi escribir el codigo de corrido tambien respetando las direcciones para las calls, interrupciones... y el programa que las llama, al final es lo mismo solo que al estar escribiendo en un solo archivo ayuda a colocar todo de forma mas grafica o mas sencilla a mi ver. puedes usar la ventana VIEW/PROGRAM MEMORY para ver como te queda ordenado el programa en la memoria
creo que el utilizar las macros y librerias sueltas se llama relocatable y escribir de corrido yo lo llamo asi, normalmente es como lo hacia, pero cuando empiezas a usar las mismas rutinas de un programa para otro ya te cansas de tanto copiar pegar y se recurre a incluirlas en una macro. pero si es para un solo programa copia y pega, como dice Leon Pic, que seguro asi te da los errores. si es para usar el mismo hard una y otra vez, prueba a hacer un nuevo pryecto y copiar pegar el codigo en hojas nuevas para crear, los guardas como asm lib .... y prueba haber si puedes llamar a una macro con el nombre cambiado, debería darte error
un saludo
aps tambien viene explicado en este pdf (http://www.ate.uniovi.es/fernando/Doc2006/Sed_06/Presentaciones/Directivas%20MPASM.pdf) como usar las macros
-
Igual que incluyen el visual inizializer pq no pueden poner este tipo de cosas??? me parece inadmisible q un compilador no te avise de cuando usas una macro que no existe y que si te avise mil veces de warnings estupidos como que este registro no está en el banco 1....
Si lo que mencionas es referente a GUARDO_CONTEXTO , si eso aparece una sola vez en el código, entonces el MPASM lo tomó como un 'label'. No me explico que tipo de error te debiera dar si escribes un label. Si lo escribes dos veces te salta el error.
No me parece que haya una forma 'elegante' de solucionar esto con el assembly, porque sencillamente si lo escribes 2 veces te da error y si lo escribes una vez, te lo toma como label. Entonces, si tuviera que dar un warning cada vez que pongamos un label el listado de warnings sería inacabable.
Otra solución sería que deba avisar si no usamos un macro que hemos definido. En mis códigos tengo una librería de macros (un .inc con muuuchos macros dentro). Dicho .inc lo incluyo en mis códigos y no me gustaría que me avise de todos los macros que definí y no usé.
Ya pero es que lo que hago no es usar una variable o registro lo que se está llamando es una macro. Prueba a llamar una macro inexistente con mplab veras que no te da error alguno.
De seguro no es lo que comento arriba? de que lo llamas una sola vez y por ende te lo toma como un label?
Saludos