TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: ariel25 en 22 de Enero de 2007, 12:50:53

Título: ¿Como hacer un IF en assembler?
Publicado por: ariel25 en 22 de Enero de 2007, 12:50:53
Hola amigos antes que nada quisiera agradecerles por toda la ayuda que brindan y es justamente por eso que acudo a ustedes. Me gustaria saber como hacer un IF en assembler ya que solo conozco dos funciones algo parecidas a un IF que es el btfss y btfsc. Ahhhhh y trabajo con un pic 16f84A, gracias de antemano por la ayuda
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manwenwe en 22 de Enero de 2007, 13:09:29
Hola ariel25 bienvenido al foro!!!

Ejemplo:

C....

if(variable == 5)
        miFuncion();

ASM....

movfw variable
movwf aux
movlw 5
subwf aux
btfss STATUS,Z
call miFuncion

De todas formas, si expones de forma clara el "IF" que quieres hacer te podremos ayudar mejor.

Saludos!
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 14:56:47
Hola ariel25 bienvenido al foro!!!

Ejemplo:

C....

if(variable == 5)
        miFuncion();

ASM....

movfw variable
movwf aux
movlw 5
subwf aux
btfss STATUS,Z
call miFuncion

De todas formas, si expones de forma clara el "IF" que quieres hacer te podremos ayudar mejor.

Saludos!

manwenwe en tu código hay un pequeño bug.  La rutina miFunción no se llamará cuando variable sea igual a 5, sino que por el contrario se llamará cuando no sea igual a 5.

Tal vez esta forma sería más breve.

Código: ASM
  1. movfw variable
  2. sublw .5                   ;
  3. btfsc STATUS,Z
  4. call miFuncion            ; Si variable-5 = 0 -> el bit Z se enciende


Verificando el carry se puede además determinar si la variable fue menor o mayor.
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manwenwe en 22 de Enero de 2007, 15:24:08
Jajaja se me escapó, gracias por corregirme. Realmente hace 2 años que no programo en ASM y se me olvidaron muchos de los pequeños detalles... pero como en su tiempo le dí mucha caña a la algoritmia en sí, aun me atrevo a intentar escribir algo de código de manera espontanea y sobre todo intentar ayudar a los recien llegados al foro :mrgreen:

Prometo que la próxima vez revisaré el código: tampoco es cuestión de que confundir al personal :D

Saludos!
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 15:55:21
Jajaja se me escapó, gracias por corregirme. Realmente hace 2 años que no programo en ASM y se me olvidaron muchos de los pequeños detalles... pero como en su tiempo le dí mucha caña a la algoritmia en sí, aun me atrevo a intentar escribir algo de código de manera espontanea y sobre todo intentar ayudar a los recien llegados al foro :mrgreen:

Prometo que la próxima vez revisaré el código: tampoco es cuestión de que confundir al personal :D

Saludos!

Jeje, no es gran problema, simplemente fue un pequeño bug, nada más. 

Sí el ariel25 captó la idea podría haberlo detectado él mismo. 
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: MGLSOFT en 22 de Enero de 2007, 16:34:48
Tambien hay atajos de Microchip...

Código: [Seleccionar]
movfw variable
sublw .5                   ;
SKPNZ
call miFuncion

SKPNZ  Skip if not Zero (salta si el bit cero no esta en 1)

 :-/ :-/ :-/ :-/
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manwenwe en 22 de Enero de 2007, 16:48:49
Perdona MGLSOFT ¿qué es SKPNZ? ¿un define o una instrucción? (lo de la instruccion lo digo porque no conozco el repertorio de los PIC18, sólo he programado en ASM para PIC16).

Saludos!
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: MGLSOFT en 22 de Enero de 2007, 17:07:22
Perdona MGLSOFT ¿qué es SKPNZ? ¿un define o una instrucción? (lo de la instruccion lo digo porque no conozco el repertorio de los PIC18, sólo he programado en ASM para PIC16).

Saludos!

SKPNZ en una instruccion (entre otras) no documentadas que MICROCHIP tiene para las lineas 14 y 16.

Para la linea 18 te pongo aqui una idea de con que instruccion puedes hacer lo mismo... :mrgreen: :mrgreen: :mrgreen:
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manwenwe en 22 de Enero de 2007, 17:22:15
Citar
SKPNZ en una instruccion (entre otras) no documentadas que MICROCHIP tiene para las lineas 14 y 16.

Que interesante! Primera noticia...

De las instrucciones de salto(skip), sólo conocía: btfss, btfsc, incfsz y decfsz.

Tengo un par de preguntas:

1. ¿Qué quiere decir lo de no documentas? Está claro que en mi libro sobre los PIC16(uno de ANGULO) no están documentadas(no aparecen) jejeje pero ¿por qué?

2. ¿Donde puedo encontrar una lista de estas instrucciones?

Saludos!
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 17:42:15
Un humilde aporte

SKPNZ es un macro, no una instrucción.  El ensamblador hace el reemplazo como cualquier otra macro.

Les paso la lista de macros que recuerdo ahora

SKPNZ -->  BTFSC STATUS,Z

movfw  REGISTRO --> movf   REGISTRO,W

banksel REGISTRO  --> hará un bsf y bcf del STATUS,RP0 y STATUS,RP1   para que apunten a la página donde está definida la variable

bankisel  REGISTRO
--> seteará los bits IRP adecuados para el direccionamiento indirecto de registro del banco en que está ubicado el registro (mediante FSR)

pagesel SUBRUTINA
  --> hará una carga del PCLATH con los bits adecuados de acuerdo a la página donde esté SUBRUTINA

pageselw SUBRUTINA --> guardará en WREG el byte más significativo de la ubicación de SUBRUTINA y lo guardará en PCLATH.



Si hace falta , hago algún ejemplo.

Título: Re: ¿Como hacer un IF en assembler?
Publicado por: MGLSOFT en 22 de Enero de 2007, 17:43:01
Quienes han comprado el programador PisStart 16B de Microchip tienen esa informacion, vere de levantar una imagen y ponerla aqui.
Te aclaro que es muy viejo pero anda correctamente aun... :mrgreen: :mrgreen: :mrgreen:
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: MGLSOFT en 22 de Enero de 2007, 17:46:43
Mas Macros (me reto Maunix) :D :D :D :D

CLRZ  borra el bit Z
CLRW borra el registro W
CLRC corra el bit C

Mil perdones jefe Maunix!!! :mrgreen: :mrgreen: :mrgreen:
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 17:59:57
Mas Macros (me reto Maunix) :D :D :D :D

CLRZ  borra el bit Z
CLRW borra el registro W
CLRC corra el bit C

Mil perdones jefe Maunix!!! :mrgreen: :mrgreen: :mrgreen:

Jeje, no te estoy retando, simplemente llamando a las cosas por su nombre.   :lol: :lol:


La aclaración la hice para evitar la confusión a alguno con algunos añitos en la espalda recordará el SET DE INSTRUCCIONES secreto de los micros Z80 o algunos micros de motorola e intel.

Era de la diversión de unos cuantos ir descubriendo esas instrucciones.  Yo era joven pero recuerdo haber leído muchos artículos de gente buscando ese tipo de cosas.

Esas eran realmente instrucciones no documentadas, según sus fabricantes porque no habían tenido el debido testeo!

 8)
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manwenwe en 22 de Enero de 2007, 18:00:51
Bueno, donde dije digo diog diego.... jejejeje, me expresé mal, dije define cuando la palabra era macro... gracias por vuestras respuestas.

Las macros que puso maunix(bueno "movfw" si la conocía) no las conocía, las de MGLSOFT sí.

¿Donde se pueden definir tus propias macros?

Saludos!
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 18:11:15
¿Donde se pueden definir tus propias macros?

En cualquier lugar del código!

Lo aconsejable es que tus macros las coloques todas en un archivo .inc y lo incluyas en tu proyecto o archivo .asm

De esa forma, los puedes llamar siempre.


Ejemplo.


macro mymacro a,b
       movf  a,w
       addwf  b,w
endm


Luego lo llamas así

Código: ASM
  1. mymacro MYVAR1,MYVAR2

que se compilará así

Código: ASM
  1. movf MYVAR1,w
  2.       addwf MYVAR2,w


y la suma de ambas quedará en WREG.
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manwenwe en 22 de Enero de 2007, 18:28:00
Ummm algo más para guardar en la cabeza!!! Maunix, lo que no entiendo es donde están declaradas las macros de las que habeis hablado antes... he mirado en los .INC de los micros y no he encontrado nada.... ¿ o estas simplemente las incorpora MPLAB de por si?
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: toc-toc en 22 de Enero de 2007, 18:35:28
 Hola! Un saludo a todo el foro.

 Disculpad la pregunta. He estado leyendo los post y me llama la atención, los atajos o
como se llamen que habéis puesto mas abajo en una ilustración, me parece que hace
falta un pequeño detalle, que suele acompañar estas tablas, me refiero a la n que
muestra en la primera columna, deben ser los operandos, igual es una pregunta que se
responde así misma, pero en estos momentos estoy hecho un lio.

 Gracias por la aclaración
 
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: manuelroin24 en 22 de Enero de 2007, 18:52:26
Bueno lo que yo hacia era crear un archivo en un block de notas y definir mis propias macros y les pones cualquier nombre simplemente con la extension *****.inc nada mas despues este archivo lo incluyes en tu proyecto y simplemente usas tus infinitas macros que esten dentro de tu archivo con extension INC llamando a tus macros por el nombre y parametros que estableciste para dicha macro
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 21:07:10
Ummm algo más para guardar en la cabeza!!! Maunix, lo que no entiendo es donde están declaradas las macros de las que habeis hablado antes... he mirado en los .INC de los micros y no he encontrado nada.... ¿ o estas simplemente las incorpora MPLAB de por si?

Pensé que hablabas de los macros en general, no de exclusivamente estos.

Fíjate en el MPLAB, en la sección de ayuda para el MPASM.  Busca por ejemplo "banksel" y verás el desarrollo de la explicación.

Otras, realmente las he visto en el foro de microchip o en códigos por aquí o por allá, pero es probable que estén documentadas.
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: maunix en 22 de Enero de 2007, 21:08:28
Hola! Un saludo a todo el foro.

 Disculpad la pregunta. He estado leyendo los post y me llama la atención, los atajos o
como se llamen que habéis puesto mas abajo en una ilustración, me parece que hace
falta un pequeño detalle, que suele acompañar estas tablas, me refiero a la n que
muestra en la primera columna, deben ser los operandos, igual es una pregunta que se
responde así misma, pero en estos momentos estoy hecho un lio.

 Gracias por la aclaración
 

toc-toc los que mencionamos son macros, no instrucciones.  Son 'atajos' para las instrucciones que están mencionadas a la derecha.

Por eso no verás como en el datasheet, una explicación exhaustiva de los parámetros como sí se hace con las instrucciones del PIC.

Espero haber aclarado el punto.
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: ariel25 en 23 de Enero de 2007, 19:10:36
Bueno amigos desde ya muy agradecido por las sugerencias y opiniones, que me han dado ahora voy a tratar de asimilar todo. Saludos desde Paraguay :D :D :D :D
Título: Re: ¿Como hacer un IF en assembler?
Publicado por: toc-toc en 21 de Febrero de 2007, 19:12:05
 Amigo Manolo (maunix), gracias por la aclaración.


 Saludos a todos de Vicente.