Aprenda ASM Desde Cero

30
8/7/2014 Imprimir Página - Aprenda ASM desde cero http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 1/30 uControl Articulos, circuitos, tutoriales y Revista uControl => Tutoriales, guias y cursos en uControl => Mensaje iniciado por: Leon Pic en Octubre 30, 2008, 09:23:22 Título: Aprenda ASM desde cero Publicado por: Leon Pic en Octubre 30, 2008, 09:23:22 Lo primero que hay que saber para este lenguaje, es que cada línea de código, es una instrucción que realiza el CP o un paso que realiza el CP. A diferencia de otros lenguajes, como por ejemplo el C, una línea de instrucción, puede llevar uno o mas pasos que el CP debe realizar. Más adelante entenderán el porqué. A esto último dicho, nos explica el porqué de un programa escrito en ASM (assembler) lleva menos línea de instrucción que el mismo programa realizado en otro lenguaje. Esto se traduce que, cuanto menos líneas de código, menor consumo de la memoria de programa. Nota: Entendemos por el mismo código, al realizar un software para realizar una dicha tarea. Una tarea que debe realizar nuestro microcontrolador, puede ser escrito en diferentes lenguajes, y es el programa que se utilizó quien lo traduce a formato hex (1 y 0). Ahora, ¿Qué es el CP? El CP o PC es el Contador de Programa. Es el encargado de leer cada instrucción y realizar la acción solicitada por el software. Para dar un ejemplo un poco más claro, digamos que el CP, es una persona. Esta persona se le da un papel que tiene diferentes tareas a realizar. Estas tareas, están una debajo de la otra y lee línea por línea y hace lo que le dice esa línea. Cada línea, posee una instrucción que se debe hacer. Cuando terminó de hacer esa instrucción, continua con la línea de abajo. Supongamos que tenemos un papel que dice: Levantar la mano izquierda. Bajar la mano izquierda. Saltar tres veces en el mismo lugar. Levantar la mano derecha. Saltar una vez en el mismo lugar. Bajar la mano derecha. El CP, hará esas tareas sin negarce y lo hará fielmente a lo que está escrito. Por lo que, si hace una tarea mal, es porque le pusimos una o más instrucciones mal. Si bien, el CP hará lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas. Estas cosas, dependerán de cada microcontrolador y que debemos saber para poder programar en forma correcta al PIC. Título: Re: Aprenda ASM desde cero Publicado por: Leon Pic en Octubre 30, 2008, 09:53:46 ¿Cómo es la extructura del lenguaje ASM?

Transcript of Aprenda ASM Desde Cero

Page 1: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 1/30

uControl

Articulos, circuitos, tutoriales y Revista uControl => Tutoriales, guias y cursos en uControl=> Mensaje iniciado por: Leon Pic en Octubre 30, 2008, 09:23:22

Título: Aprenda ASM desde ceroPublicado por: Leon Pic en Octubre 30, 2008, 09:23:22

Lo primero que hay que saber para este lenguaje, es que cada línea de código,es una instrucción que realiza el CP o un paso que realiza el CP. A diferencia deotros lenguajes, como por ejemplo el C, una línea de instrucción, puede llevaruno o mas pasos que el CP debe realizar. Más adelante entenderán el porqué.

A esto último dicho, nos explica el porqué de un programa escrito en ASM(assembler) lleva menos línea de instrucción que el mismo programa realizado enotro lenguaje. Esto se traduce que, cuanto menos líneas de código, menorconsumo de la memoria de programa.

Nota: Entendemos por el mismo código, al realizar un software para realizar unadicha tarea. Una tarea que debe realizar nuestro microcontrolador, puede serescrito en diferentes lenguajes, y es el programa que se utilizó quien lo traducea formato hex (1 y 0).

Ahora, ¿Qué es el CP?

El CP o PC es el Contador de Programa. Es el encargado de leer cada instruccióny realizar la acción solicitada por el software.

Para dar un ejemplo un poco más claro, digamos que el CP, es una persona. Estapersona se le da un papel que tiene diferentes tareas a realizar. Estas tareas,están una debajo de la otra y lee línea por línea y hace lo que le dice esa línea.Cada línea, posee una instrucción que se debe hacer. Cuando terminó de haceresa instrucción, continua con la línea de abajo.

Supongamos que tenemos un papel que dice:

Levantar la mano izquierda.Bajar la mano izquierda.Saltar tres veces en el mismo lugar.Levantar la mano derecha.Saltar una vez en el mismo lugar.Bajar la mano derecha.

El CP, hará esas tareas sin negarce y lo hará fielmente a lo que está escrito. Porlo que, si hace una tarea mal, es porque le pusimos una o más instrucciones mal.

Si bien, el CP hará lo que nosotros le pidamos, el CP nos pide que respetemosalgunas cosas. Estas cosas, dependerán de cada microcontrolador y quedebemos saber para poder programar en forma correcta al PIC.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Octubre 30, 2008, 09:53:46

¿Cómo es la extructura del lenguaje ASM?

Page 2: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 2/30

Es muy fácil, posee 4 columnas bien diferenciadas y que no es problemaacordarce.

* La primer columna se llama ETIQUETA y sirve para darle el nombre a unapocición de la memoria del programa al que se necesita apuntar. Los que no seden cuenta, ya lo haran.

* La segunda columna, se llama INSTRUCCIÓN y lo que justamente hace, esuna instrucción a realizar por el CP.

* La tercera columna, se llama OPERANDO y es el operando de una instrucción,o sea, de la segunda columna. Hay instrucciones que no tienen operando y lasveremos más adelante.

* Y la cuarta columna, se llama OBSERVACIONES y sirve solo para elprogramador, o sea, el usuario que está programando el PIC. En otras palabras,a nosotros. Siempre comienza con ; (punto y coma)

Si no sirve para el PIC, ¿Para qué complicarla más? Todo lo contrario, es paraalludar al programador de que no se olvide que intentó hacer.

Todos los lenguajes, desde los más básicos, hasta los más avanzados, tienenesta características ya que en el, pondremos que es lo que queremos hacer oexplicar el programa.

Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacióncolocarla en esta columna, si no que puede ir al margen de la planilla en dóndeestamos programando. Y es aquí dónde explicaremos la porción de una rutinapara entenderlo más adelante.

Bien, veremos a continuación, como se escriben las columnas:

ETIQUETAS INSTRUCCIÓN OPERANDO ;OBSERVACIONES

O, podemos verlo así:

;OBSERVACIONES;OBSERVACIONES;OBSERVACIONES (y la cantidad que necesitemos)

ETIQUETAS INSTRUCCIÓN OPERANDO ;OBSERVACIONES

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Octubre 30, 2008, 04:39:42

Antes de empezar a ver las intrucciones, debemos concentrarnos en losregistros.

¿Qué son los registros?

Los registros, son pociciones de memoria el cual se utilizan para ir configurandoel pic mientras se corre el programa, cambiar de bancos para acceder a otraspartes de memorias, son banderas que nos van diciendo que está pasando condistintas operaciones, son habilitaciones o desabilitaciones para módulos quetrae el PIC. Por ejemplo, conversor Analógico/Digital, PWM.

Page 3: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 3/30

Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16bit y 32 bit. Excepto la palabra configuración y que la veremos mas adelante. Eltamaño de los registro depende del tipo de microcontrolador.

Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizarpara lo descripto anteriormente (habilitar/desabilitar, etc).

A continuación, veremos una pocición de la RAM y sus 4 bancos. Este, es delPIC16F877

(http://www.ucontrol.com.ar/forosmf/index.php?action=dlattach;topic=137.0;attach=130;image)

Como notarán, en las cuatro columnas, hay nombres. Estos nombres son todoslos registros que posee este PIC. Verán que hay registros que se repiten. Noquiere decir que estan duplicados, triplicados o cuatriplicados, si no que sepuede acceder a ellos no importa en que banco estemos trabajando. (Ya loentenderán, no se preocupen).

Cada vez que se programe el PIC y se necesite trabajar con uno de estosregistros, se debe acceder al banco que esté dicho nombre. Es por eso, queesta tabla es muy importante a la hora de trabajar.

Aprovechando que subí esta tabla del pic, cuando dea ejemplo de programación,será sobre este pic.

Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC.Por lo que si no tienen este datasheet, descargenlo de la página de Microchip(http://www.microchip.com). Cuando empezemos a programar, lo necesitarán.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Octubre 31, 2008, 10:23:31

Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utilizapara mover un dato/valor de un registro a otro, cargar valores en un registro, ycon la ayuda de la ALU puede hacer operaciones matemáticas.

Observen con atención el diagrama de bloque dónde se encuentra W

(http://www.ucontrol.com.ar/forosmf/index.php?action=dlattach;topic=137.0;attach=133;image)

Ahora bien, si W es un registro, ¿dónde está ubicado, ya que en el mapa dememoria no lo encuentro?

El registro W no está implementado en la memoria ram, ni en la posición 0x00 nien otra posición. W es un registro independiente que tiene un bus directo con laALU (un camino privado). La ALU es la única entidad que puede leer o escribireste registro de trabajo.

El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF escompletamente ajeno a W. Un direccionamiento indirecto usa el registro FSRcomo apuntador al contenido de otros registros. Cualquier instrucción que haceuso de INDF (0x00) como dirección invoca un direccionamiento indirecto.

Page 4: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 4/30

Los microcontroladores PIC, poseen tres tipos de memorias.

* Memoria de Programa Es la ubicación física dónde se guarda el firmware que hemos creado,o sea, nuestro programa. Y tiene un ciclo de 100.000 de lectura y/o escriturasantes de estropearce y es del tipo FLASH (pero este es flaco ;D Es un chiste).

* Memoria de datos de uso general Es la memoria RAM del PIC. Recordemos, que los registros estánsobre la memoria RAM y la memoria de uso general, comienza después de losregistros.

* Memoria de datos EEPROM Es la memoria EEPROM que puede almacenar datos mas de 40 añossin energía y 1.000.000 de ciclos de escritura y lectura

El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Byte,o sea que cada pocición de memoria tiene 14 bytes (B'11111111111111', oH'3FFF') Cada línea de instrucción ocupa una pocición en la memoria deprograma, asi que, podemos poner hasta 8.192 instrucciones.

La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8bytes (B'11111111', o H'FF'). Esto quiere decir, que tenemos 368 pociciones paranuestro uso.

La EEPROM trae 256 bytes con un ancho de 8 bytes. Tenemos 256 pocicionespara nuestro uso.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Noviembre 01, 2008, 10:28:54

Ahora, vamos a estudiar el registro STATUS y luego continuaremos con lasinstrucciones.

Registro STATUS

Si entendieron hasta acá, se acordará que los registros poseen un ancho de 8bytes. Cada byte, puede contener un 1 o 0.

Vemos ahora en detalle el registro STATUS:

(http://www.ucontrol.com.ar/forosmf/index.php?action=dlattach;topic=137.0;attach=135;image)

Este registro, tiene 3 Bytes dedicado para las operaciones matemáticas, 3 bytesdedicado al cambio de banco de memoria y 2 bytes dedicado para saber que oquién produjo un Power Up (despertar del micro). Y se puede leer y escribrir enél (cambiar datos).

Los analizamos desde el más significativo (MSB) hasta el menos significativo(LSB).

BIT 7:

Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de

Page 5: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 5/30

memoria.

1 = Banco 2 y 30 = Banco 0 y 1

BIT 6 y BIT 5

Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directopara cambiar de banco de memoria.

00 = Banco 001 = Banco 110 = Banco 211 = banco 3

BIT 4

Se llama TO (neg). Este bit se utiliza para saber quién despertó al PIC.

1 = Después que despierta (power up) o por las instrucciones CLRWDT o SLEEP,se pone a 1 este bit.0 = Se pone a 0 cuando el wachtdog o en castellano perro guardían (WDT)despierta al PIC.

BIT 3

Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.

1 = Después de que despierta (power up) o por la instrucción CLRWDT, se ponea 10 = Se pone a 0 cuando se ejecuta la instrucción SLEEP

BIT 2

Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica elresultado de una operación aritmética y lógica.

1 = La operación aritmética o lógica dió como resultado 00 = La operación aritmética o lógica no dió como resultado 0

BIT 1

Se llama DC. Digit carry/borrow (dígito llevar/prestar). Es afectado por lasinstrucciones ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad esinversa).

1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.

BIT 0

Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectanal bit DC.

1 = Hubo un accareo del bit más significativo (Bit 7) o sea cuando se exede deH'FF'0 = No hubo accareo del bit más significativo

Page 6: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 6/30

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Noviembre 04, 2008, 09:47:14

Breve instroducción de las INSTRUCCIONES

Cada instrucción tiene una ancho de 14 Bits, es por eso que la memoria deprograma tiene el mismo ancho. Justamente para poder alojar cada instrucción.

Las instrucciones, están divididas en tres grupos. Los cuales son:

Byte-Oriented operation (Byte-Orientando a la operación)Bit-Oriented operation (Bit-Orientando a la operación)Literal and Control operation (Control y Literal de la operación)

Primer grupo Byte-Oriented operation

Cada instrucción de este grupo está compuesta por:

OPCODE (Código)DESTINATION (Destino)FILE REGISTER ADDRESS (Dirección del archivo de registro)

El OPCODE o código, es el código de cada instrucción y que es única para cadainstrucción. Está formada por los bit del 13 al 8.

El DESTINATION o el destino, indica en dónde se va a guardar el dato.Porejemplo, si hacemos una suma, tenemos dos opciones dónde guardarlo, unapuede ser el registro W y la otra opción puede ser otro registro cualquiera o unapocición de la RAM. Está formada por el bit 7.

La constante que nos indica esto es la letra d. Si esta letra es 0, la operación seguardará en el registro W. EN cambio si vale 1, la operación se guardará en elregistro o pocición de memoria que estemos trabajando al momento de usar unainstrucción.

Hay instrucciones, como veremos más adelante, que no es necesario indicardónde queremos guardar la operación, ya que se hace en forma automática. Yhay otras instrucciones que si no se indica el destino, nos puede dar un error alcompilar o el compilador lo eligirá el y por ende, nos puede ejecutar mal elprograma.

Y por último, tenemos el FILE REGISTER ADDRESS que se carga con la direccióndel registro a ser guardado. Está formada por los bit 6 al 0. La constante quenos indica esto, es la letra f

Segundo grupo Bit-Oriented operation

Cada instrucción de este grupo está compuesta por:

OPCODE (Código)BIT ADDRESS (Bit de dirección)FILE REGISTER ADDRESS (Dirección del archivo de registro)

OPCODE es igual al primer grupo. Está formado por los bits 13 al 10.

Page 7: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 7/30

El BIT ADDRESS, se utiliza para direccionar la operación. Está formado por losbits 9 al 7. Como pueden observar, se sacrificó bit del opcode para dárcelo al bitaddress. La constante que nos indica esto es la letra b

Y por último tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Estáformado por los bit 6 al 0. Igual que en el primer grupo. la constante que nosindica esto es la letra f.

Tercer grupo Literal and Control

Cada instrucción de este grupo, está compuesta por:

OPCODELITERAL

OPCODE es igual que en el primer grupo. Está compuesta por los bits 13 al 8.Exepto para las instrucciones CALL y GOTO que está compuesta por los bit 13 al11 (prestar mucha atención a esto, cuando veamos estas dos instruccionesentenderán la importancia).

Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, paracargar al registro W, en fin, un número decimal, binario o hexadecimal. O puedeser una valor de dirección a dónde apuntar para las instrucciones CALL y GOTO.

Está compuesta por los bits 7 al 0. Exepto para las instrucciones CALL y GOTOque está compuesta por los bit 10 al 0 (prestar mucha atención a esto, cuandoveamos estas dos instrucciones entenderán la importancia).

A continuación, vemos las 35 instrucciones agrupadas por los tres grupos:

(http://www.ucontrol.com.ar/forosmf/index.php?action=dlattach;topic=137.0;attach=150;image)

Si alcanzan a ver en la imagen, verán que algunas instrucciones afectan alregistro STATUS y otras no.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Noviembre 07, 2008, 02:32:35

Las instrucciones

Les voy a arruinar el momento de alegría. Las instrucciones hay que estudiarlasde memoria. Si, leyeron bien, de memoria. Lo que tienen que saber sobre lasinstrucciones, es como se escriben, que hace cada instrucción y lo másimportante que bit del REGISTRO afecta.

Vamos a ir viéndolo por orden alfabético. Y otra cosita más, como es deesperarce, están en INGLES o son abreviaturas pero en INGLES.

Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es enHexadecimal; B'01111011' es en binario.

ADDLW

Suma un valor designado por el programador al registro W

Page 8: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 8/30

Ejemplo

Código:

ADDLW .128

Si W tenía cargado un valor = .5, después de la instrucción W tiene cargado elvalor .133

Para recordar, ADD es sumar, L es Literal y W es el registro W

Afecta a:

Z Se pone a 1 si la operación es 0DC Se pone a 1 si hubo un acarreo del bti 3 al 4C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ADDWF

Suma el valor del registro W con el valor de un registro cualquiera. El destino deesta suma, lo elige el programador.

Ejemplo:

Código:

ADDWF TEMP,W

Si W tenía guardado .133 y la pocición de la RAM llamada TEMP tenía el valorcargado con .2, W vale .135 y TEMP continúa valiendo .2

Ahora si hubiera puesto así:

Código:

ADDWF TEMP,F

TEMP valdría .135 y W valdría .133

Para recordar, F, es File Register Address.

NOTA: Para indicar la dirección de dónde se guarda, también se puede poner 0 o1 en vez de W o F. 0, corresponder guardarlo en el registro W y 1 en el registroTEMP (para este caso).

Afecta a:

Z Se pone a 1 si la operación es 0DC Se pone a 1 si hubo un acarreo del bti 3 al 4C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ANDWF

Realiza la operación AND entre W y un registro designado por el programador. Eldestino de esta operación lo elije el programador.

Ejemplo:

Código:

ANDWF TEMP,F

Page 9: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 9/30

Si antes de la instrucción W vale B'11100011' y TEMP vale B'00111010' Despuésde la instrucción TEMP vale B'00100010' y W vale B'11100011'

Afecta a:

Z Se pone a 1 si la operación es 0

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Noviembre 09, 2008, 05:28:40

BCF

Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.

Ejemplo:

Código:

BCF TEMP,2

Antes de la instrucción TEMP vale B'11111111'. Después de la instrucción TEMPvale B'11111011'

Para recordar, Bit Clear es borrar File es archivo o registro

No afecta ningún bit del registro Status.

BSF

Pone a 1 el bit de un registro. El bit debe ser indicado por el programador.

Ejemplo:

Código:

BSF TEMP,0

Antes de la instrucción TEMP vale B'01110110'. Después de la instrucción TEMPvale B'01110111'

Para recordar, Bit Set es poner a 1 File Archivo o registro

No afecta a ningún Bit del registro Status.

BTFSC

Salta un línea si el bit de un registro es cero. El bit debe ser indicado por elprogramador.

Ejemplo:

Código:

BTFSC TEMP,5 BCF PORTA,0 BSF PORTB,0

Caso 1:

Page 10: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 10/30

TEMP vale B'00011110'. El CP analizará solo el Bit 5 del registro TEMP, como es0, salta la instrucción BCF PORTA,0 y ejecuta la siguiente línea que es BSF PORTB,0 y continua haciendo la instrucción.

Caso 2:

TEMP vale B'00111000'. El CP analizará solo el Bit 5 del registro TEMP, como es 1no salta la instrucción y hará la instrucción BCF PORTA,0 y luego continua conla instrucción BSF PORTB,0

Para recordar Bit Test es chequear File Skip es salto Clear

No afecta a ningún Bit del registro Status.

BTFSS

Salta una línea si el bit de un registro es 1. EL bit debe ser indicado por elprogramador.

Ejemplo:

Código:

BTFSS TEMP,3 ADDWF PORTC ANDWF NODO

Caso 1:

TEMP vale B'01101100'. El CP analizará solo el Bit 3 del registro TEMP, como es1, salta la instrucción ADD PORTC y ejecuta la siguiente línea que es ANDWFNODO y continua haciendo la instrucción.

Caso 2:

TEMP vale B'11110000'. El CP analizará solo el Bit 3 del registro TEMP, como es 0no salta la instrucción y hará la instrucción ADD PORTC y luego continua con lainstrucción AND NODO.

Para recordar Bit Test es chequear File Skip es salto Set

No afecta a ningún Bit del registro Status.

Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO oCALL pero no la he puesto porque aún no se explicaron estas instrucciones.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Noviembre 15, 2008, 09:35:13

CALL

Se digire a una dirección de la memoria de programa designado por elprogramador. En otras palabras, se utiliza para dirigirce a una rutina o tarea. Suprincipal ventaja es que una vez que finalizó la tarea, vuelve al punto siguientedesde dónde se llamo.

Ejemplo :

Page 11: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 11/30

Código:

CALL ESC_PORTB

Para recordar, CALL es llamada.

No afecta ningún bit del registro Status.

---------------------------------------------------------------------------------------------------------------------------------------------Hacemos una exepción con respecto a ver las instrucciones por orden alfabéticoy veremos la instrucción GOTO.---------------------------------------------------------------------------------------------------------------------------------------------

GOTO

Se digire a una dirección de la memoria de programa designado por elprogramador. En otras palabras, se utiliza para saltar instrucciones que noqueremos que se ejecuten. A diferencia de la instrucción CALL, no hay forma devolver cuando se ejecuta la instrucción.

Ejemplo:

Código:

GOTO INICIO

Para recordar GO TO es ir a.

No afecta a ningún bit del registro Status.

Extendiendo la explicación.

Vamos a hablar del PC para entender bien sobre estas instrucciones. La exelenteexplicación que continua, por desgracia no es mía (ojalá fuera mi explicación),son de las personas Maunix y BrunoF (del foro todopic(http://www.todopic.com.ar/foros))

En la siguiente imagen, vemos el diagrama de bloques del PC o CP.

(http://www.ucontrol.com.ar/forosmf/index.php?action=dlattach;topic=137.0;attach=213;image)

El PC es de 13 bits en este caso(8kwords). 14 son los bits de cada "word" oinstrucción que se graban en cada posición de la FLASH (memeria de programa).El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5restantes en el registro PCLATH.

Los pics al tener un set de instrucciones reducido no puede en una solainstrucción meter todos los bits necesarios para direccionar toda su memoria.

EL program counter son 2 registros, el PChigh y PCLow . Cuando haces un CALLo un GOTO, solo se rellenan 11 bits (los 8 del PClow y 3 del PChigh) y losrestantes 2 los rellenas con el PCLATH (para completar los 13bits).

El STACK (pila) tiene toda la dirección, no solo parcial. Si haces un call desdela pagina 0 a la página 3 y luego un return el código SI volverá a la página 0,

Page 12: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 12/30

pero el PCLATH sigue apuntando a la página 3, entonces si usas otro goto o call,debes tener en cuenta de modificar el PCLATH.

Entónces, dijimos que:

El PC = ProgramCounter o CP = Contador de Programa, tiene 13 bits; del 0 al 12.

Al ejecutar un call o un goto, se copian del 0 al 10, y los otros 2 bits se copiandel registro PCLATH. El pclath solo estará allí para esa situacion.

En un return o retfie la microelectronica del PIC, pega la dirección del PC queestaba guardada.

Lo vemos con un ejemplo

1. STACK = vacío PC = 0x00A0 PCLATH = 0b000011000 Ejecutas un CALL 0x230

2. El STACK tiene en su posición 0 la dirección 0x00A0. PC = 111000110000 3. Se ejecuta la subrutina y en ese punto el PC ya quedó en PC = 111000110111

4. Viene un RETURN. La microelectrónica del PIC copiará el stack tal cual en el program counter + 1 Valor STACK 0x00A0 + 1 --> PC = 0x00A1 5. EL código sigue ejecutandose en la página 0 pero hay que tener en cuentaque el PCLATH apunta a la página 3 por ello si harás otro CALL o GOTO, deberáscambiar de nuevo el PCLATH si la subrutina no está en la página 3.

Para cerrar el tema

Vamos a entrar a todo detalle en el Program Counter(PC) para que se vayantodas las dudas ya que es muy importante. Vayamos al tema tema del PC,computed goto(lo que algunos llaman "tabla"), call, returns y goto.

El Program Counter(PC) está conformado en esta familia de uC(y refiriendonos ala familia 16F, las otras poseen más o menos bits implementados) por 13 bitsrepartidos entre dos registros: PCH y PCL.El PCL es legible/escribible directamente a traves del registro físico PCL(valga laredundancia). En cambio, el PCH no es directamente accesible. No puede serleído, y sólo puede se grabado mediante un buffer que contiene el valortemporalmente(oh! aquí aparece nuestro famoso PCLATH). Entonces, recordar:El PCLATH es sólo un buffer temporal que almacena los 5 bits de mayor peso delPC para ser escritos cuando se ejecute una instrucción que lo requiera.

Ahora, hay dos situaciones posibles en las que el PC debe ser cargado demanera distínta: una es cuando queremos trabajar con tablas y otra cuandorealizamos un call o un goto que no esté en el mísmo banco.

1era situación: Tabla(Comuted Goto)

Page 13: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 13/30

La tabla es una situación de uso del PC en la que se afecta directamente alregistro PCL. Cuando se afecte directamente al PCL mediante una instrucción, esnecesario que el usuario asegure que PCLATH tenga sus 5 bits pre-cargadosadecuadamente.

Hago un ejemplo:

Mal:

org 0x000 movlw 0x01 call tabla

org 0x300tabla addwf PCL,F retlw 0x03 retlw 0x01 retlw 0x0F .....

Bien: org 0x000 movlw 0x03 movwf PCLATH movlw 0x01 call tabla

org 0x300tabla addwf PCL,F retlw 0x03 retlw 0x01 retlw 0x0F .....

Mejor: org 0x000 pageselw tabla movlw 0x01 call tabla

org 0x300tabla addwf PCL,F retlw 0x03 retlw 0x01 retlw 0x0F .....

Pageselw es una instrucción del MPASM que genera dos instrucciones: un movlwliteral y un movwf PCLATH. El valor del literal es automáticamente seleccionadopor el ensamblador según la etiqueta(o posición de memoria) que se le

Page 14: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 14/30

especifique. En el caso anterior pageselw tabla generaría estas dosinstrucciones:

movlw 0x03movwf PCLATH

Si no aseguramos que los 5 bits del PCLATH estén correctamente seteados almomento de afectar al PCL mediante alguna instrucción(generalmente es laaddwf, pero puede usarse subwf y muchas otras) entonces el programa saltaráa una posición indeseada.

2da situación: CALL y GOTO

En esta familia de uC, cada instrucción es codificada en 14 bits. En el caso delas instrucciones CALL y GOTO, su estructura es la siguiente:

F2 F1 F0 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

Donde las F indican cuál instrucción es la que debe ejecutarse(100 para la CALL101 para la GOTO), y las k corresponden a la dirección a la cual queremosllamar(con un CALL) o saltar(con un GOTO).

Aquí se ve claramente un problema. Podemos ver que un CALL o un GOTO sóloalmacena 11 bits de la dirección a la cual debe ir. 11 bits es un máximo 2048posiciones. ¿Qué pasa cuando un uC posee más de 2k de memoria Flashentonces? Por ejemplo, un 16F877A posee 8k de memoria Flash. ¿Cómo haríapara llamar a una subrutina que está más allá de la posición 2047 de la flash?La solución nuevamente se encuentra en el PCLATH(y es nuevamente el usuarioel que tiene el deber de pre-cargar el valor adecuado).

Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta8kwords(una word es en esta familia un conjunto de 14 bits que conforman unainstrucción la cual se aloja en la memoria FLASH del uC). Un CALL o un GOTOsólo contienen los 11 bits de menor peso de la dirección a la cual ir, por lo quelos 2 bits restantes deberán ser pre-cargados en los bits 4 y 3 del registroPCLATH por el usuario programador.

Cuando se ejecuta una instrucción CALL o GOTO, es imprescindible que elregistro PCLATH esté correctamente precargado. La instrucción a la que el uCirá estará conformada por 13 bits y ellos serán:

PCLATH,4 PCLATH,3 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0

Cabe mencionar que el uC carga a PC<10:0> con el valor pasado por los 11 bitsde K, y a PC<12:11> con el valor de los bits PCLATH<4:3>. El registro PCLATHno es modificado de ninguna manera. Sólo se leen esos dos bits.

Por ejemplo, en un uC de 8kWords hay 4 páginas. Una página cada 2048 words.Si se está en una página y se quiere ir a otro es necesario precargar antesdichos bits del PCLATH para poder hacerlo.

El usuario no debe preocuparse por precargar el PCLATH en dos sitaciones: Si el uC no posee más de 2kWords de memoria Flash;O si en el código creado por el usuario, no se utiliza la memoria FLASH más alláde la posición 2047(0x7FF).

Page 15: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 15/30

Si ocurre al menos uno de esos dos casos, es suficiente con asegurar que losbits PCLATH<4:3> se encuentren ambos en cero.

Vamos con un par de ejemplos:

Mal:

org 0x000 ;Esto es página0 call cruzo

org 0x800 ;Esto ya es el página1cruzo retlw 0xFF .....

Bien:

org 0x000 ;Esto es página0 movlw 0x08 movwf PCLATH call cruzo

org 0x800 ;Esto ya es el página1cruzo retlw 0xFF .....

Mejor:

org 0x000 ;Esto es página0 pagesel cruzo ;automaticamente seleccionar banco call cruzo

org 0x800 ;Esto ya es el página1cruzo retlw 0xFF .....

Pagesel es una instrucción del MPASM que genera dos instrucciones: un bcf/bsfPCLATH,3 y un bcf/bsf PCLATH,4. El software ensamblador seleccionaautomáticamente la instrucción bcf o bsf según el banco en el cual se encuentrala etiqueta(o posición de memoria) que se le especifique. En el caso anterior pagesel cruzo generaría estas dos instrucciones:

bsf PCLATH,3bcf PCLATH,4

Ya que la subrutina cruzo se encuentra en la página1.

Finalmente, cuando se ejecuta una instrucción CALL, se carga en el STACK el

Page 16: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 16/30

valor de la posición actual más 1(es decir, se guarda en el STACK el valor PC+1).Se guardan los 13 bits, por lo que durante las instrucciones RETURN,RETLW yRETFIE no es necesario precargar al PCLATH.

Para más información, ver el esquema sección 2.3 del datasheet de losPIC16F87XA que habla de cómo cargar al PC según cada situación.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Noviembre 21, 2008, 09:09:44

CLRF

Borra el contenido de un registro seleccionado por el programador. La forma enque lo hace, pone en 0 los 8 bit del registro. Este registro, puede ser cualquierade la pocición de la RAM.

Ejemplo:

Código:

CLRF PORTB

Antes de la instrucción PORTB vale B'11000111'. Después de la instrucciónPORTB vale B'00000000'

Para recordar CLeaR es limpio File es archivo o registro.

Afecta a:

Z Se pone a 1

CLRW

Borra al registro W. La forma en que lo hace, pone en 0 los 8 bit del registro.

Ejemplo:

Código:

CLRW

Antes de la instrucción W vale B'00000111'. Después de la instrucción W valeB'00000000'.

Para recordar CLeaR es limpiar Work es trabajo.

Afecta a:

Z Se pone a 1

CLRWDT

Borra al WDT. La forma en que lo hace, pone en 0 al mismo.

Ejemplo:

Código:

CLRWDT

Page 17: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 17/30

Antes de la instrucción WDT vale B'11111110'. Después de la instrucción valeB'0000000'.

Para recordar CLeaR es limpiar Watch Dog es perro guardian Timer es contador.

Afecta a:

TO (neg) Se pone a 1PD (neg) Se pone a 1

NOTA: El WDT o el contador perro guardian, sirve para destrabar al PIC. Cadavez que se desborda, o sea, cada vez que pasa de H'FF' a H'00', produce unreset, y como es un reset, se dirige a la pocición 0h de la memoria de programa.La forma de trabajar con el, es ir poniendo en lugares estratégicos la instrucciónya explicada, de esta manera evitamos el desborde del contador. Si el CP setraba en algún bucle o algo similar, al no limpiar el contador, el WDT desbordaráy llevará al CP a la pocición 0h de la memoria de programa.

Muchas veces se evita de usar esta herramienta por no tener que calcular portodo el programa dónde y cuando limpiar al WDT. Es recomendable su uso.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Diciembre 03, 2008, 10:06:28

COMF

Realiza el complemento de un registro.

Código:

COMF TEMP,F

Si TEMP tenía guardado B'00111101' luego de ejecutar la instrucción TEMP valeB'11000010'. Notese, que aquí también podemos elegir el destino y esto nos dejaguardarlo en el registro W si así lo requerimos.

Para recordar COMlement es complemento File es registro.

Afecta a:

Z Se pone a 1 si la operación da 0

DECF

Decrementa en una unidad, o lo que es lo mismo, resta 1 el contenido de unregistro

Código:

DECF DECENA,W

Si antes de la instrucción DECENA vale .255, después de la instrucción W vale.254 y DECENA vale .255 Si por el contrario, hubieramos elegido el destino F,después de la instrucción DECENA vale .254

Para recordar DECrement es decremento File es registro.

Page 18: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 18/30

Afecta a:

Z se pone a 1 si la operación es 0

DECFSZ

Decrementa en uno, o lo que es lo mismo, resta en 1 el contenido de un registroy cuando este vale 0, el CP salta una instrucción

Código:

LOOP DECFSZ TEMP GOTO LOOP BCF PORTB,0

El CP descontará en 1 el registro TEMP y evalúa el valor, si no es cero, ejecutalínea siguiente que es GOTO LOOP, el cual se dirige de nuevo a la línea LOOP DECFSZ TEMP el cual volverá a descontar en 1 y evalua el valor, si es cerosalta la línea GOTO LOOP y ejecuta la instrucción BCF PORTB. Esta última línea,el programador pondrá la instrucción que necesite ejecutar.Este pequeño programa que acabamos de ver, es un temporizador o un retardoque tardará en salir del bucle dependiendo de la frecuencia de reloj y el valorcargado en TEMP.

NOTA: Esta instrucción, también hay que elegirle el destino. En el caso que nose exprese, como en este caso, el MPLAB dará por sentado que el resultado seguardará en el registro F y no en W.

Para recordar DECrement es decremento File es registro Skip es salto Zero quees cero.

No afecta ningún bit del registro STATUS.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Diciembre 05, 2008, 09:52:23

INCF

Incrementa en 1, o suma 1, el contenido de un registro elegido por elprogramador.

Código:

INCF INDF,F

Si antes de la instrucción INDF vale H'29', después de la instrucción INDF valeH'2A'. Notese que también podemos elgeir el destino. Si hubieramos elegido W,después de la instrucción W vale H'2A' y INDF vale H'29'.

Para recordar INCrement es incremento File es registro.

Afecta a:

Z se pone a 1 si el resultado es 0

INCFSZ

Incrementa en 1, o suma en 1, el contenido de un registro elegido por el

Page 19: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 19/30

programador y cuando este es 0, el CP salta una instrucción.

Código:

VOLVER INCFSZ CONTADOR GOTO VOLVER INCF PORTA

El CP incrementará en 1 el registro CONTADOR y evalúa el valor, si no es cero,ejecuta línea siguiente que es GOTO VOLVER, el cual se dirige de nuevo a lalínea VOLVER INCFSZ CONTADOR el cual volverá a incrementar en 1 y evaluael valor, si es cero salta la línea GOTO VOLVER y ejecuta la instrucción INCF PORTA. Esta última línea, el programador pondrá la instrucción que necesiteejecutar.Este pequeño programa que acabamos de ver, es un temporizador o un retardoque tardará en salir del bucle dependiendo de la frecuencia de reloj y el valorcargado en CONTADOR. Normalmente, se utiliza el retardo con DECFSZ pero estetambién es válido.

NOTA: Esta instrucción, también hay que elegirle el destino. En el caso que nose exprese, como en este caso, el MPLAB dará por sentado que el resultado seguardará en el registro F y no en W.

Para recordar INCrement es incremento File es registro Skip es salto Zero escero.

No afecta ningún bit del registro STATUS.

IORLW

Realiza la operación OR entre W y un literal elegido por el programador. Elresultado se guarda en W. La operación es W OR L.

Si antes de la instucción W vale B'01110100' y el literal elegido es B'00011111',después de la instrucción W vale B'01111111'.

Para recordar Inclusive es inclusivo OR es la operación binaria OR Literal esliteral W es el registro trabajo.

Afecta a:

Z se pone a 1 si la operación da 0

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Diciembre 06, 2008, 10:39:20

IORWF

Realiza la operación lógica OR entre el registro W y un registro elegido por elprogramador. La operación es W OR F.

Código:

IORWF PORTC,F

Si antes de la instrucción W vale B'01111111' y PORC vale B'00001111' despuésde la instrucción PORTC vale B'01111111' y W vale B'01111111'. Notese quepodemos elegir el destino y la otra opción, como ya se dieron cuenta por lasinstrucciones pasadas, puede ser W.

Page 20: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 20/30

Para recordar Inclusive es inclusivo OR es la operación binaria OR W es elregistro trabajo y File es registro.

Afecta a:

Z se pone a 1 si el resultado es 0

MOVLW

Carga al registro W con un literal elegido por el programador para luego haceruna operación matemática o moverlo a otro registro como veremos másadelante. Sin duda alguna, una de las instrucciones más usadas en laprogramación ASM.

Código:

MOVLW .255

Si antes de la instrucción W vale .15, después de la instrucción W vale .255.

Para recordar MOVe es mover Literal es literal W es el registro trabajo.

Como es de esperar, no afecta ningún bit del registro STATUS.

MOVF

Mueve el contenido de un registro a otro registro elegido por el usuario.

Código:

MOVF RETARDO,W

Si antes de la instrucción W vale H'2A' y RETARDO vale H'FF', después de lainstrucción W vale H'FF'. Notese que aquí podemos elegir el destino, y tenemosla posivilidad de elegir el destino al propio registro RETARDO. Al principio pareceinnecesario, pero se puede tomar como una verificación, ya que se ve afectadoel registro STATUS bit Z.

Para recordar MOVe es mover y File es registro.

Afecta a:

Z Se pone a 1 si la operación es 0

Anteriormente, habíamos dicho que esta instrucción se la puede tomar comovereficación, para saber si se guardó con el mismo valor que tenía, el bit Z sepone a 1 si el valor es igual al que tenía cargado.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Diciembre 08, 2008, 06:37:16

MOVWF

Mueve el contenido del registro W a un registro cualquiera elegido por elprogramador. Sin duda alguna, esta instrucción, es otra muy usada en laprogramación ASM

Código:

Page 21: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 21/30

MOVWF ADCON0

Si antes de la intrucción W vale B'10000001' y ADCON0 vale 0x0, después de lainstrucción ADCON0 vale 0x81.

Para recordar MOVe es mover W es el registro W y File es registro.

No afecta ningún bit del registro STATUS.

NOP

No realiza ninguna operación. Solo consume un ciclo de instrucción.

Código:

NOP

Para recordar No es no y OPeration es operación.

No afecta ningún bit del registro STATUS.

RETFIE

Carga al CP con el valor de la parte alta de la pila para volver al lugar dónde seencontraba el CP antes de atender la interrupción. Al mismo tiempo, pone a 1 elbit GIE para activar de nuevo las interrupciones.

Código:

RETFIE

Para recordar REturn es retornar From es de la IntErrupt es interrupción.

No afecta ningún bit del registro STATUS.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Diciembre 17, 2008, 01:52:04

RETLW

Carga al CP con el valor de la parte alta de la pila para volver al lugar dónde seencontraba el CP desde dónde se llamó a la subrutina y al retornar, lo hace conun literal cargado en W especificado por el programador. Esta instrucción, seutilizan en las tablas (para más detalle, ver la explicación del GOTO y CALL).

Ejemplo:

Código:

RETLW 'L'

En este ejemplo, el MPLAB, carga en W el código ASCII correspondiente a laletra L

Extendiendo el ejemplo:

Código:

PAGESELW TABLA ;CONFIGURA AL PCLATH PARA VOLVER AL LUGARCORRECTO

Page 22: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 22/30

MOVFW contador ;CARGA A W LA POCICIÓN A LEER EN LA TABLAPOR EJEMPLO 3 CALL TABLA ;LLAMA A LA RUTINA TABLA CALL LCD_DATO ;LLAMA A LA RUTINA PARA MOSTRA AL LCD NOP;;TABLA ADDWF PCL,F ;SUMA AL PCL CON EL CONTENIDO DE W POREJEMPLO 3 RETLW '1' ;RETORNA CON 1 ASCII RETLW '2' ;RETORNA CON 2 ASCII RETLW '3' ;RETORNA CON 3 ASCII RETLW 'T' ;RETORNA CON 4 ASCII

Este es un ejemplo sencillo de como utilizar RETLW. Para interpretar este códigoempezamos desde PAGESELW, supongamos que el CP está en esta instrucción(que está explicado que hace) luego pasa a la instrucción MOVFW contador y suponemos que tiene cargado 3 en decimal, por lo que W pasará a tener 3 endecimal. El CP continua con CALL TABLA, el CP saltará por encima a todas lasdemás instrucciones y se dirige a la etiqueta TABLA y ejecuta la instrucciónADDWF PCL,F En el código hablamos que le suma 3 al PCL, por lo que saltaráal RETLW '3' cargando a W con el código ASCII 3. Retorna justo debajo del CALL TABLA, o sea retorna a CALL LCD_DATO y ejecuta la rutina correspondiente,cuando termina, regresa al NOP (que puede ser cualquier instrucción quenecesite el programador.Si en cambio, contador hubiera tenido cargado 4 en decimal cuando llegue a latabla y le sume al PCL este apuntará a RETLW 'T' cargando en W el códigocorrespondiente ASCII.

Para recordar RETurn es retornar Literal es literal W es el registro de trabajo W

No afecta ningún bit del registro STATUS.

RETURN

Carga al CP con el valor de la parte alta de la pila para volver al lugar dónde seencontraba el CP cuando se llamó a la rutina o subrutina.

La diferencia con RETLW es que RETURN regresa sin cambiar a W. Este se utilizapara terminar una rutina y no se necesite ningún dato. Por ejemplo en la rutinaCALL LCD_DATO no nos sirve que vuelva con ningún valor ya que es una rutinapara enviar datos a un LCD, asi que esta rutina tendrá implementada RETURN

Por ejemplo:

Código:

RETURN

No afecta ningún bit del registro STATUS

Para recordar RETURN es retornar.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Diciembre 21, 2008, 11:31:29

RLF

Rota hacia la izquierda los bit de un registro seleccionado por el programador. Eldestino de la operación se puede elegir. Cada rotación equivale a multiplicar por

Page 23: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 23/30

2 si el bit C del registro STATUS es 0.

Ejemplo:

Código:

RLF PORTC,F

Si antes de la instrucción PORTC vale B'00001000', después de la instrucciónvale B'00010000'. Si se hubiera elegido como destino W, PORTC después de lainstrucción continua valiendo B'00001000' y W vale B'00010000'

Para recordar Rotate es rotar Left es izquierda File es el registro.

Afecta a:

C se pone a 1 si hubo acarreo

RRF

Rota hacia la derecha los bits de un registro seleccionado por el programador. Eldestino de la operación se puede elegir. Cada rotación equivale a dividir por 2 siel bit C del registro STATUS es 0.

Ejemplo

Código:

RRF PORTB,F

Si antes de la instrucción PORTB vale B'10000000' después de la instrucciónPORTB vale B'0100000'. Si se hubiera elegido como destino W, PORTB despuésde la instrucción continua valiendo B'10000000' y W vale B'01000000'

Para recordar Rotate es rotar Right es derecha File es el registro.

Afecta a:

C se pone a 1 si hubo acarreo

Extendiendo la explicación de las instrucciones RRF y RLF

A la hora de utilizar estas dos instrucciones, hay que prestarle atención al bit Cdel registro STATUS. La razón de esto, es porque la rotación se hace atravézdel bit C.

Supongamos que tenemos lo siguiente:

BIT C = 0TEMP = B'00010000'

Ejecutamos la instrucción RRF y TEMP vale B'00001000'. O si ejecutamos lainstrucción RLF TEMP vale B'00100000'

Pero si ahora tenemos:

BIT C = 1TEMP = B'00010000'

Page 24: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 24/30

Ejecutamos la instrucción RRF y TEMP vale B'10001000'. O si ejecutamos lainstrucción RLF TEMP vale B'00100001'

Vemos como rota los bit dependiendo del valor del bit C. Pero anteriormente,avíamos dicho que estas dos instrucciones afectan al bit C. La actualización delbit C, lo hace después de la rotación. Lo vemos con un ejemplo:

Código:

MOVLW B'10001001' MOVWF temp BCF STATUS,C ;PONEMOS A 0 AL BIT C RLF temp,F ;ROTAMOS A LA IZQUIERDA

Al ejecutar este programa, nos dará lo siguientes resultados:

TEMP = B'00010010'BIT C = 1

Y para ver la diferencia vemos lo siguiente:

Código:

MOVLW B'00000001' MOVWF temp BCF STATUS,C ;PONEMOS A 0 AL BIT C RLF temp,F ;ROTAMOS A LA IZQUIERDA

Al ejecutar este programa, nos dará lo siguientes resultados:

TEMP = B'00000010'BIT C = 0

Algo que me había olvidado de mencionar pero que MIGSANTIAGO del foro deTODOPIC (http://www.todopic.com.ar/foros) estuvo atento es que estás dosinstrucciones, nos sirve para enviar datos en forma serial utilizando el bit C quelo veremos más adelante.

Recordemos que, para utilizar estas instrucciones para multiplicar o dividir,debemos asegurarnos de que el bit C, esté en 0.

SLEEP

Pone al microcontrolador en bajo consumo.

Código:

SLEEP

Para recordar SLEEP es dormir.

Afecta a:

TD se pone a 1PD se pone a 1

SUBLW

Resta el contenido de W con un literal de hasta 8 bit (.255). El resultado seguarda en W.

Page 25: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 25/30

Código:

SUBLW .20

Si antes de la instrucción W vale .23 después de la instrucción W vale .3 Parasaber si el resultado es negativo o positivo, hay que chequear el bit C delregistro Status. Si hay acarreo, el resultado es negativo, y por el contrario, si nohay acarreo es positivo.

Para recordar SUBtraction es restar Literal es literal y W es el registro W.

Afecta a:

Z se pone a 1 si el resultado es 0DC se pone a 0 si hay acarreo del bit del 4 al 5 bit del registro(recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 sihubo acarreo).C se pone a 0 si hubo acarreo (recordemos que en la resta, es distinto ala suma, por eso, se pone a 0 si hubo acarreo).

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Enero 09, 2009, 11:21:11

SUBWF

Resta el contenido de un registro seleccionado por el programador con elcontenido del registro W. La fórmula es F - W = d. d es la dirección elegida porel programador en dónde se guardará el resultado que puede ser el registro W oel registro elegido por el programador.

Ejemplo:

Código:

SUBWF MINUENDO,W

Si antes de la instrucción W vale .55 y MINUENDO vale .56, después de lainstrucción, MINUENDO vale .56 y W vale .1

Para recordar SUBtraction es resta W es el registro W y File es el registroelegido.

Afecta a:

Z se pone a 1 si el resultado es 0DC se pone a 0 si hubo un acarreo del 4 bit al 5 bit (recordemos que en laresta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).C se pone a 0 si hubo acarreo del 7 bit. (recordemos que en la resta, esdistinto a la suma, por eso, se pone a 0 si hubo acarreo).

SWAPF

Intercambia los bits de un mismo registro elegido por el programador. Los 4 bitde menor peso, pasan a ser lo 4 bits de mayor peso, y los 4 bits de mayor peso,pasan a ser los 4 bits de menor peso. El destino puede ser seleccionado.

Cabe pensar que puede ser una instrucción de muy poco uso, pero todo lo

Page 26: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 26/30

contrario si se utilizan con las interrupciones. Microchips recomienda suutilización a la hora de salvar el contexto y restaurarlo en una interrupción yaque no modifica el registro STATUS. Cuando trabajemos con la interrupciones, severá que es muy recomendable salvar el registro STATUS y W en la RAM paraluego restaurarlos. Si utilizamos la instrucción MOVF, es afectado el bit Z,perdiendo su estado original en el momento de la interrupción. Esto se soluciona,utilizando la instrucción SWAPF. No se preocupen si no lo entiende por ahora. Loentenderan cuando veamos ejemplo de interrupciones.

Ejemplo:

Citar

SWAPF STATUS,W

Si antes de la instrucción W bale H'55' y el registro STATUS vale B'00100100',después de la instrucción el registro STATUS vale H'24' y el registro W valeB'01000010'

Para recordar SWAP es intercambiar NIBBLE es porción File es el registro.

No afecta ningún bit del registro STATUS.

XORLW

Realiza la operación lógica XOR entre un literal o valor y el registro W. Elresultado queda guardado en el registro W.

Ejemplo:

Código:

XORLW B'11000101'

Si antes de la instrucción W vale B'11111000', después de la instrucción W valeB'00111101'.

Para recordar XOR es la operación lógica XOR Literal es un valor W es el registroW.

Afecta a:

Z se pone a 1 si la operación es 0

XORWF

Realiza la operación XOR entre un registro elegido por el programador y elregistro W. La operación es F XOR W = d. El resultado se puede elegir dóndeserá guardado.

Ejemplo:

Código:

XORWF PORTB,F

Si antes de la instrucción PORTB vale B11111110' y W vale B'00000001', despuésde la instrucción W vale .1 y PORTB vale B'11111111'.

Para recordar XOR es la operación lógica XOR W es el registro W y File es el

Page 27: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 27/30

registro elegido.

Afecta a:

Z se pone a 1 si la operación es 0

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Febrero 08, 2009, 11:14:27

Una vez que vimos todas las instrucciones y asumiendo que ya se la saben dememoria (tiempo tuvieron de sobra) y si no lo han echo, es hora de hacerlo,empezemos a escribir programas muy sencillos. Pero ¿cómo?. Si se están asiendoesta pregunta, es hora de leer desde el primer mensaje. Tienen que acordarcelas pociciones de las cuatro columnas.

Recuerden que vamos a escribir los programas en el MPLAB, por lo que si aún nolo tienen, es hora de descargarlo de la página de Microchip(http://www.microchip.com) en forma gratuita e instalarlo en la PC.Lamentablemente, este programa trabaja solo bajo windows, por los que tienenmac o Linux, no lo prodrán hacer si no es por un emulador de windows y aún así,no se si funcione correctamente.

Empezaremos bien desde el principio y para ello, voy a explicar cosas nuevas.Todo programa tiene un encabezado que se repite en cada programa nuevo yque varía según el PIC a utilizar y las prestaciones del programa a escribir.Muchas de las personas crean plantillas nuevas para ahorrarce el trabajo. Yo soyuna de ellas y aquí les doy una plantilla que pueden utilizar sin problemas ymodificarlas según su necesidad.

He aquí la plantilla que también está adjuntado.

LIST P=16F877A INCLUDE <P16F877A.INC> __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC;;---------------------------------------------------------------;VARIABLES.;---------------------------------------------------------------; CBLOCK H'20'

ENDC;RESET ORG H'00' GOTO INICIO ORG H'04' ;VECTOR INTERRUPCIÓNINTERRUP;INICIO; END

Primera línea:

LIST P=16F877A

Esta línea, sive solo para el MPLAB y le indica que el PIC a utilizar es el 16F877A.

Page 28: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 28/30

Se debe actualizar según sea necesario.

Segunda línea:

INCLUDE <P16F877A.INC>

Esta línea sirve a la hora de compilar ya que dentro de este archivo que vieneincluido dentro del MPLAB, le indica al ensamblador dónde están ubicados cadaregistro y el nombre de cada bits del PIC a utilizar así, nos ahorra de hacerlonosotros mismos. Si desean abrir el archivo, lo pueden hacer con el notepad ocualquier editor de texto. Se debe actualizar según sea necesario.

Tercera línea:

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

Linea muy importante pero se puede omitir. Aquí se configura la palabra deconfiguración del PIC y que está en el datasheet del pic correspondiente.En mi caso, yo la omito y luego lo configuro desde el ICPROG(http://www.icprog.com) a la hora de pasar el archivo .hex al pic. Es por esoque esta línea está incompleta para el pic a utilizar pero completa para el PIC16F84.

Vemos en más detalle esta línea: __CONFIG Directiva para el ensamblador deque debe generar la palabra de configuración correspondiente de acuerdo a:

_CP_OFF la protección de lectura del PIC desabilitado._PWRTE_ON Reset de encendido habilitado_WDT_OFF Perro guardián desabilitado._XT_OSC Oscilador a cristal.

El caracter & sirve para unir una directiva con otra.

Título: Re: Aprenda ASM desde ceroPublicado por: Leon Pic en Febrero 08, 2009, 01:30:36

Cuarta línea:

;;---------------------------------------------------------------;VARIABLES.;---------------------------------------------------------------;

Este no es más que un pequeño encabezado. El ensamblador omitirá estas líneasy solo porque empieza con ";". Recuerden que, toda línea que empieze con ";" escomentario y el ensamblador la omitirá.

Justo por debajo de este encabezado, penemos las variables. ¿a que le llamovariables? a pociciones de memorias o nombre de bit que yo quiera darlepersonalmente.Por ejemplo, dentro del archivo P16F877A.INC a la pocición de memoria 0x05 lellama PORTA pero si yo quero llamarlo PUERTO_A, es quí dónde le indico alensamblador.

¿Cómo se hace?

Page 29: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 29/30

Es muy fácil y con la instrucción "EQU"

PUERTO_A EQU H'05'

Si al Bit RA6 lo quero llamar LED6 lo hacemos así:

LED6 EQU 6

Supongamos que quiero encender el LED 6 que está en el Puerto a bit 6, y estese activa con un 1 lógico, ponemos esta instrucción:

BSF PUERTO_A,LED6

Y el ensamblador lo traducirá así: BSF 0X05,0X06

Quinta línea:

CBLOCK H'20'

ENDC

A estas dos líneas las unifique porque van juntas. Entre ellas van los nombres decada pocición de la RAM que nosotros querramos nombrar, o cada Registro quequerramos renombrar.Recuerden que los registros están implementados en la RAM y que la pocición dela RAM que puede utilizar el usuario para guardar cosas, empieza desde unapocición que está indicada en el datasheet. Para el caso de 16F877 empiezadesde la pocición 0x20 como lo ven en la figura siguiente.

(http://www.ucontrol.com.ar/forosmf/index.php?action=dlattach;topic=137.0;attach=130;image)

La directiva CBLOCK H'20' indica que empezamos a nombrar pociciones dememoria desde la ubicación 0x20. Por ejemplo

CBLOCK H'20'temperaturademora1demora2ENDC

La pocición 0x20 se llama temperatura, la pocición 0x21 se llama demora1 y asísucesivamente. Tambien existe otra forma de nombrar o renombrar pociciones dememoria o registro, y ya lo vimos que es con la directiva EQU. por ejemplo:

temperatura EQU H'20'demora1 EQU H'21'demora2 EQU H'22'

Sexta línea:

RESET ORG H'00' GOTO INICIO ORG H'04' ;VECTOR INTERRUPCIÓNINTERRUP

Page 30: Aprenda ASM Desde Cero

8/7/2014 Imprimir Página - Aprenda ASM desde cero

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/asm-desde-cero/?action=printpage;PHPSESSID=0c9bedc3444ff30390a6d310c59c0f06 30/30

He unificado estas líneas porque por lo general así se escribe en la mayoría denuestros programas. Vemos con más detalles estas líneas.

RESET ORG H'00'

Aquí es en dónde empieza el CP cuando se enciende al PIC. Y estos se debe,porque cuando hay un reset por el pin MCLR o un reset interno producido por,encendido del PIC o, por ejemplo, del perro guardía, el vector reset se ubica enla pocición 0x00 de la memoria de programa.Como pueden apreciar, hemos llamado a la pocición 0x00 con el nombre deRESET, ya que la primer columna es una etiqueta. Las etiquetas sirven paranombrar pociciones de memoria de programa.

ORG H'00' indica que se empieza a escribir desde la pocición 0x00 por lo que lasiguiente instrución, quedará alojada en la pocición 0x00. ORG es una directiva,y solo sirve para el ensamblador. Esta línea, SIEMPRE debe estar y no se puedemodificar, salvo la etiqueta.

Siguiente línea es GOTO INICIO, esta instrucción queda alojada en la pocición0x00 y es un salto a la etiqueta INICIO. Este salto tiene que estar, porque enlas siguientes pociciones de memoria de programa, está la interrupción, externae interna del PIC. Por eso es necesario hacer el salto.

Siguiente línea nos encontramos con ORG H'04', como se dieron cuenta, es unadirectiva. Esta pocición de memoria, indica el vector de interrupción. Cuandoestén habilitadas las interrupciones y una de ella se activa, el CP apuntará aquí,a la pocición 0x04.

Siguiente línea nos encontramos con la etiqueta INTERRUP. Si trabajamos conlas interrupciones, aquí es donde escribiremos lo que necesitamos hacer conellas.

Séptima línea:

;INICIO;

Vemos la etiqueta INICIO. Aquí vendrá el CP cuando alla un reset gracias alGOTO INICIO ubicado en la pocición 0x00 de la memoria de programa. De estamanera, saltamos un montón de instrucciones que no debemos ejecutar antes.Como por ejemplo las interrupciones si hubiese.Por ende, a partir de esta etiqueta, estará nuestro programa principal.Configuraremos los puertos, las insterrupciones y empezaremos a darle trabajo alCP.

Octava línea:

END

Esta es una directiva y solo sirve para el ensamblador indicando que después deesta directiva, se terminó el programa. Instruciones que estén por debajo deesta línea, no serán tenido encuenta. Y esta directiva es obligatoria colocarla.

Powered by SMF 1.1.19 | SMF © 2011, Simple Machines