A continuación  veremos la primera parte de un gran curso sobre el lenguaje ensamblador, escrito por el técnico en electrónica César Antonio Saldías Caro, de Valparaíso, Chile. Puedes encontrar más información en su blog ingenieropic.wordpress.com.

Este curso incluye una carpeta con el código fuente compilado del programa que analizaremos.

En la primera parte de este curso aprendiste los conceptos básicos sobre microcontroladores. En esta ocasión te enseñaré los conceptos básicos sobre programación en lenguaje Assembler y analizaremos nuestro primer programa… El encendido y apagado de un LED.

El código fuente
El código fuente está constituido por una sujeción de líneas de programa. Cada línea suele estar compuesta por cuatro campos diferentes los cuales están separados por una o más tabulaciones. Estos campos son los siguientes:

- Campo de etiquetas.
- Campo de instrucciones.
- Campo de operandos y datos.
- Campo de comentarios.

A continuación podemos ver un ejemplo:

línea código lenguaje ensamblador

La siguiente tabla nos explica mejor la imagen de arriba para poder entender mejor el asunto:

desmenuzando línea código lenguaje assembler


Etiquetas: Las etiquetas (también denominadas “label”) son expresiones alfanuméricas escogidas por el usuario, su función principal es identificar a una instrucción dentro del programa. Sin embargo, a pesar de que el nombre de las etiquetas lo determina el usuario, estas no pueden llevar el nombre de una instrucción del assembler o de un operando. Por ejemplo sería erróneo ponerle el nombre “bsf” a una etiqueta. Tampoco es admitido que el primer caracter de una etiqueta sea un número o un espacio, siendo incorrecto por ejemplo ponerle “10inicio”.

Las etiquetas suelen utilizase para realizar saltos. Por ejemplo:

saltos lenguaje ensamblador

En este ejemplo, le estamos diciendo al programa (con la instrucción goto) que salte hasta donde se encuentra la etiqueta “inicio”.

Instrucciones: El segundo campo es para las instrucciones, las cuales le indican al microcontrolador la tarea que debe realizar. Suele ser una instrucción del microcontrolador que es directamente traducida a código máquina por el ensamblador.

Operandos y Datos: Esta columna contiene los operandos para las instrucciones. Este campo puede tener uno o más operandos separados por comas. Es importante destacar que algunos operandos no llevan dato.

Comentarios: Los comentarios se escriben generalmente en el último campo, pero solo es por una cuestión de orden y estilo, puesto que pueden ir escritos en cualquier parte (excepto entremedio de una etiqueta, instrucción u operando).

Los comentarios son palabras, frases o textos escritos por el programador, con el fin de explicar o hacer una breve descripción de lo que se está realizando, de manera tal que posteriormente no sea dificultoso entender el programa o modificarlo.

Los comentarios se escriben siempre anteponiendo punto y coma (“;”) y no son traducidos a código máquina por el ensamblador. En otras palabras, los comentarios no son parte del programa propiamente tal.

Importante
Un detalle importante y de interés, es que, no todas las líneas de programa están conformadas por los cuatro campos descritos anteriormente. Por ejemplo, las etiquetas solo se usan de vez en cuando. También hay instrucciones que no llevan operando, y hay operandos que no llevan dato. Pero nunca encontraremos un operando que no lleve instrucción, ni tampoco un dato que no lleve operando.

El repertorio de instrucciones
El PIC 16F628A posee un repertorio de 35 instrucciones que pueden ser agrupadas de la siguiente manera:
- Instrucciones de carga.
- Instrucciones de salto.
- Instrucciones aritméticas.
- Instrucciones para manejar subrutinas.
- Instrucciones lógicas.
- Instrucciones especiales.
- Instrucciones de bit.

Las características principales de este repertorio de instrucciones son:
- Es un juego de instrucciones reducido (RISC) rápido y sencillo.
- La mayoría de las instrucciones se ejecutan en 4 ciclos de reloj.
- Son ortogonales (casi todas pueden usar cualquier operando).
- Todas tienen una longitud de 14 bits, y los datos son de 8 bits.

He aquí el set de instrucciones del PIC 16F628A:

set instrucciones pic 16f628A


Las directivas
Para el correcto ensamblado del programa, es necesario escribir directivas. Estas no son parte del programa ya que no son traducidas a lenguaje máquina, por eso se les suele llamar pseudoinstrucciones.

END: Esta directiva indica el fin del programa. Es la única directiva obligatoria, y se utiliza siempre al final del programa para indicar en donde se termina el proceso.

ORG: Esta directiva le indica al programa la dirección desde la que deben ensamblarse las instrucciones escritas. Si las instrucciones del programa son ensambladas sin especificar ORG, el ensamblador toma por defecto ORG 0x0.

__CONFIG: Esta directiva le indica al programa la configuración elegida para la grabación del programa. Se le denomina también “Palabra de Configuración”

Ejemplo:

ejemplo directiva lenguaje assembler

Esta directiva está formada por varios “fusibles” que se utilizan para definir una serie de parámetros que a continuación explicaré.

La forma de escribir estos parámetros es tal como se ve en la imagen de arriba, se coloca un guión bajo entre cada fusible y su configuración, y se separa cada configuración con la letra “&”.

WDT: Watch Dog Timer, o Temporizador Perro Guardián. Este temporizador resetea el PIC cada determinado tiempo para evitar enciclamientos por error en el programa. Preferentemente hay que apagarlo (OFF).

OSC: Define que tipo de oscilador se usara. RC es para Capacitor y resistencia, XT es para cristal de 4Mhz, HS para cristales mayores a 4Mhz.

BODEN: Se emplea para que el PIC se resetee cuando exista una caída de tensión.

CP: Código de Protección de programa, si lo habilitamos (ON) evita que otras personas puedan leer el programa contenido en el PIC.

PWRT: Bit de Permiso para el Timer de conexión de alimentación. Se usa para resetear el PIC cada vez que se conecta la fuente de alimentación de nuestra aplicación.

WRT: Permiso para escritura en Modo FLASH. Se usa cuando en nuestro programa accedemos a la memoria de datos EEPROM.

CPD: Código de Protección de Datos. Se usa para evitar que terceros lean lo que hemos escrito en la memoria EEPROM del PIC.

LVP: Voltaje de programación bajo. Si esta en ON permite programar el PIC con 5V, si esta en OFF programa el PIC con 12V.

Hay un detalle muy importante con respecto al último fusible llamado LVP. Una de las funciones del pin RB4 del PIC16F628A es la de programación en bajo voltaje, y por defecto es la función que viene habilitada de fábrica. Esto significa que si queremos utilizar el pin RB4 como entrada o salida debemos poner el fusible LVP en OFF para desactivar la función que trae de fábrica.

LIST: Esta directiva indica el modelo de microcontrolador que se va a utilizar.

INCLUDE: Esta directiva se utiliza para incluir una librería dentro de nuestro programa.

CBLOCK y ENDC: Este par de directivas cumplen la función de asignar direcciones, generalmente de la memoria RAM de datos. La lista queda enmarcada entremedio de las directivas CBLOCK y ENDC.

#DEFINE: Esta directiva define una cadena de sustitución de texto.

Las subrutinas
Una subrutina es un trozo de código fuente que suele estar apartado del resto del programa para hacer más sencilla la revisión y lectura del programa. Para llamar a una subrutina se utiliza la instrucción call, y para salir de una subrutina se utiliza la instrucción return.

Al llamar a una subrutina, el programa ejecuta las instrucciones que forman parte de ella, y luego retorna una posición más abajo desde donde fue llamada la subrutina. Mira esta representación:

ejemplo subrutina ensamblador

Las subrutinas generalmente se utilizan cuando un mismo trozo de código fuente se debe repetir demasiadas veces, entonces se escribe ese trozo de código a modo de subrutina, y posteriormente se le llama cada vez que se necesite.

La memoria del microcontrolador
Para poder realizar las acciones que ejecuta el microcontrolador, es necesario escribir y leer datos en alguna parte… Para eso está la memoria del PIC, la cuál está dividida en cuatro bancos (del 0 al 3), en cada banco hay una cierta cantidad de registros, y cada registro está dividido en 8 bits (1 byte). Veamos el mapa de memoria del PIC 16F628A:

mapa memoria microcontrolador PIC16F628A

Aquí puedes checar la segunda parte del curso sobre el lenguaje ensamblador.