domingo, 15 de febrero de 2015

TELECOMUNICACIONES

MPASM, el ensamblador de Microchip

Debido a la flexibilidad del IDE de Microchip, MPLAB, tenemos la posibilidad de programar en lenguajes como "C" o "Basic". Pero lo cierto es que con el ensamblador tenemos un codigo puro y compacto. El ensamblador de Microchip que viene con MPLAB es el MPASM.
El paquete MPASM (Microchip MPASM Toolsuite) de MPLAB IDE v6.60 esta formado por:
  • MPASM Assembler (mpasmwin.exe)
  • MPLINK Object Linker (mplink.exe)
  • MPLIB Librtarian (mplib.exe)
MPASM nos permite escribir el codigo y ensamblarlo para producir como salida un fichero .HEX que luego grabaremos en el PIC o que nos servirá para utilizarlo con el simulador que incorpora MPLAB, en otros programas como PROTEUS o por ejemplo en emuladores de PIC.
Con MPASM podemos producir un fichero .HEX a partir de un único archivo ASM con código simple/absoluto o bien podemos generar un archivo .HEX a partir de la unión de distintos codigos objeto y otros módulos ensamblados y/o compilados. En este caso la herramienta de la que dispone MPLAB para "unir" esos módulos se llama MPLINK. También podemos generar módulos objeto para luego ensamblarlos con otros y asi producir un unico archivo .HEX. Otra posibilidad es crear librerías por medio de MPLIB. Las librerias son una coleccion de códigos objeto listos para ser utilizados y que se almacenan todos juntos en un unico archivo con extension .LIB.
Para mas información ver MPASM, MPLINK, MPLIB User's Guide o información actualizada en Microchip.

Generación de código

Como antes hemos avanzado el ensamblador MPASM puede usarse de dos maneras:
  • Para generar código absoluto que puede ser ejecutado directamente por un microcontrolador.
  • Para generar código relocalizable que puede unirse separadamente con otros módulos ensamblados o compilados.

Generando código absoluto

La generación de código absoluto es el modo definido por defecto del ensamblador MPASM. Este proceso se muestra a continuación:

Cuando un archivo fuente se ensambla de esta manera, todas las variables y rutinas utilizadas en el el archivo fuente deben definirse dentro de este, o en archivos explícitamente incluidos por el archivo fuente. Si el ensamblado se realiza sin errores, se generará un archivo hexadecimal .HEX que contiene el código máquina ejecutable para el dispositivo designado. Este archivo puede utilizarse con un simulador para probar la ejecución del código o cargarse en el microcontrolador mediante un programador.

Generando código relocalizable

El ensamblador MPASM también puede generar módulos objeto relocalizables que pueden unirse (linkarse) con otros módulos utilizándo MPLINK para conformar código ejecutable final. Este método es muy útil para crear módulos reutilizables.

Pueden agruparse módulos relacionados y pueden guardarse juntos en una librería mediante MPLIB..

Archivos de entrada/salida

Éstas son las extensiones de archivo predefinidas utilizadas por el ensamblador y su función.
  • Archivos de entrada:
    • Código fuente (.asm): Archivo fuente de entrada al ensamblador.
    • Archivo include (.inc): Archivo de inclusión o cabecera.
  • Archivos de salida:
    • Archivo de listado (.lst): Archivo del listado generado por el ensamblador.
    • Archivo de error (.err): Archivo de errores de ensamblado.
    • Archivo hexadecimal (.hex, .hxl, .hxh): Archivo hexadecimal con código ejecutable.
    • Archivo de referencias cruzadas (.xrf): Archivo para las referencia cruzadas de los archivos ensamblados.
    • Archivo de símbolos y depuración (.cod).
    • Archivo objeto (.o).

Código fuente (.asm)

El ensamblador es un lenguaje de programación para desarrollar código fuente en una aplicación con PIC. El archivo de código fuente puede crearse y editarse con cualquier editor de texto ASCII. Para mas información ver El lenguaje ensamblador del PIC16F84A
El código fuente debe seguir las siguientes pautas básicas:
Cada línea del archivo fuente puede contener cuatro tipos de información:
  • Etiquetas
  • Operación, Mnemónicos (intrucciones), Directivas y Macros
  • Operandos
  • Comentarios

El orden y posición de éstos es importantes. Para facilitar la depuración, se recomienda que la etiqueta se coloque en la primera columna y que los mnemónicos se coloquen una o dos columnas más allá. Los operandos siguen al código mnemotécnico. Los comentarios pueden seguir a los operandos, mnemónicos o etiquetas, y pueden comenzar en cualquier columna. La anchura de columna máxima es de 255 carácteres.
Un espacio en blanco debe separar la etiqueta del código mnemotécnico, y también un espacio en blanco deba separar el código mnemotécnico y los operandos. Los operandos múltiples deben separarse por comas.
Se considera como un espacio en blanco uno o más espacios o tabulaciones. El espacio en blanco se utiliza para separar las partes de una línea del código fuente. El espacio en blanco debe utilizarse para hacer el código más fácil de leer. Cualquier número de espacios en blanco o tabulaciones son exactamente igual que uno.

Etiquetas

Una etiqueta se usa para representar una línea o grupo de código, o un valor constante. Se necesitan para las instrucciones de salto.
Las etiquetas deben empezar en la columna 1. Pueden terminar en "dos puntos" (:), espacio, tabulación o fín de línea. Las etiquetas deben comenzar por un carácter alfabético o por un guión bajo (_) y puede contener carácteres alfanuméricos, guión bajo (_) y el signo de interrogación (?).
Las etiquetas no deben:
  • Comenzar por dos guiones bajos, ejem., __config.
  • Comenzar por un guión bajo y un número, ejem., _2NDLOOP.
  • Ser palabras reservadas del ensamblador (ver Section 3.3 “Reserved Words and Section Names” de MPASM, MPLINK, MPLIB User's Guide).
Las etiquetas pueden tener como mucho 32 carácteres. Por defecto se distinguen mayúsculas y minúsculas, pero esto puede anularse con la opción en línea de comandos (/c). Si se utiliza "dos puntos" (:) al definir una etiqueta, se le trata como un operador de la etiqueta y no como parte de la propia etiqueta.

Mnemónicos, directivas y macros

Los mnemónicos le dicen al ensamblador qué instrucciones de código máquina (códigos de operación) deben utilizarse. Por ejemplo, suma (add), ir a (goto) o movimientos (movwf). A diferencia de las etiquetas que creamos nosotros mismos, los mnemónicos los proporciona el lenguaje ensamblador que se utilice. Los mnemónicos no son en ningún caso sensibles a mayúsculas/minúsculas.
Las directivas son órdenes del ensamblador que aparecen en el código fuente pero que normalmente no son traducidas directamente a códigos de operación. Se utilizan para controlar al ensamblador: sus entradas, salidas y asignación de datos. Las directives no son en ningún caso sensibles a mayúsculas/minúsculas.
Las macros son conjuntos de instrucciones y directivas definidas por el usuario que se insertarán en el código fuente al realizar el ensamblado siempre que la macro se invoque (ver directiva macro).
Los mnemónicos de las instrucciones del ensamblador, las directivas y las llamadas a macros deben colocarse de la segunda columna en adelante. Si hay una etiqueta en la misma línea, las instrucciones deben separarse de esa etiqueta por "dos puntos", o por uno o más espacios o tabulaciones.

Operandos

Los operandos dan información a la instrucción sobre los datos que deben utilizarse y donde se encuentran. Los operandos debe separarse de los mnemónicos por uno o más espacios, o tabulaciones. Los operandos múltiples deben separarse por comas.

Comentarios

Los comentarios son texto que explica el funcionamiento de una línea o líneas de código. El ensamblador MPASM trata lo que esté después de un punto y coma como un comentario. Todos los carácteres que siguen al punto y coma se ignoran hasta el final de la línea. Las constantes del cadena que contienen un punto y coma se permiten y no se confunden con comentarios.

Archivo include (.inc)

Un archivo "include" o cabecera (header) es cualquier archivo que contenga código ensamblador válido. Normalmente, el archivo contiene equivalencias sobre registros específicos del dispositivo a utilizar y asignaciones de bits. Este archivo puede ser “incluido” en el código para que pueda ser reutilizado por muchos programas.
Como ejemplo, para añadir el archivo de cabecera para el dispositivo PIC18F452 en el código ensamblador de nuestro programa, pondremos:
#include p18f452.inc
Este tipo de archivos de cabecera los proporciona Microchip y se encuentran en el directorio de instalación de MPASM o de MPLAB.
Podemos crear nuestros propios archivos de cabecera o utilizar otros desarrollados por terceros.

Archivo de listado (.lst)

El archivo de listado que genera MPASM proporciona la correspondencia entre código fuente y código objeto, como puede verse en este fragmento de archivo .LST:
LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

001C   3A03           00065         XORLW   0x03
001D   1903           00066         BTFSC   STATUS,2
Analicemos la línea:
001C   3A03           00065         XORLW   0x03
La primera columna, 001Ch, 28d, es la dirección de la memoria de programa donde se encuentra el dato 3A03h, 11101000000011b, de la segunda columna. Estas dos columnas conforman el código objeto. La tercera columna indica el número de línea de texto del código fuente , XORLW es el mnemónico de la instrucción y 0x03, 3h, el operando. El dato que se grabará en la memoria de programa, 3A03h, 11101000000011b tiene 14 bits, la longitud de la memoria de programa, el mnemónico XORLW equivale a "111010 kkkkkkkk", donde k es el valor literal sobre el que actuará XORLW, justamente 03h, esto es 00000011b, y nos queda:
111010b (XORLW) +  0x03(00000011b) = 11101000000011b, que es 3A03h.
El archivo de listado también proporciona una lista de símbolos y sus valores, información sobre el uso de la memoria y el número de errores, advertencias y mensajes generados.
Aparece una información del tipo:
Program Memory Words Used:   782
Program Memory Words Free:   242
Que nos indica la cantidad de memoria de programa utilizada y libre, en palabras de 14 bits.
Este archivo puede verse en MPLAB IDE siguiendo estos pasos:
MPASM y MPLINK (y en consecuencia MPLAB) pueden generar archivos de listado. Los archivos de listado generados se encuentran en el mismo directorio que el resto de archivos que se generan (.HEX.ERR, etc), normalmente donde se encuentre el .ASM. Puede abrirse con cualquier editor de texto ASCII.

Archivo de error (.err)

El ensamblador MPASM, por defecto, genera un archivo del error. Este archivo puede ser útil cuando estamos poniendo a punto el código de nuestro programa. MPLAB mostrará la información del error en la ventana Output. El formato de los mensajes en el archivo de error es:
type[number] línea de descripción de archivo
Por ejemplo:
Error[113] C:\PROG.ASM 7 : Symbol not previously defined (start)
El archivo del error puede contener cualquier número de errores, advertencias y mensajes del ensamblador MPASM. Para mas información, ver Chapter 8. “Errors, Warnings, Messages, and Limitations” en MPASM, MPLINK, MPLIB User's Guide

Archivo hexadecimal (.hex, .hxl, .hxh)

El archivo hexadecimal es, por así decirlo, el archivo que contiene el ejecutable para el microcontrolador. La información que contiene se transferirá a PIC cuando se programe. La información que contiene está en formato ASCII, no en binario como podría pensarse, de manera que se representan los valores hexadecimales con carácteres alfanuméricos, 3FFA, 0023, etc.
MPASM y MPLINK son capaces de generar archivos de texto ASCII en hexadecimal en diferentes formatos. Esto es util para transferir el programa a distintos tipos programadores.
Nombre de formatoTipo de formatoExtensión de archivoUso
Intel Hex FormatINHX8M.hexprogramadores para dispositivos de 8 bit
Intel Hex 32 FormatINHX32.hexprogramadores para dispositivos de 16 bit
Intel Split Hex FormatINHX8S.hxl, .hxhotros programadores

Formato INTEL hexadecimal de 8 bits

Nos centraremos en este formato por ser el mas común.
Este formato produce un archivo hexadecimal de 8 bit con la combinación byte bajo / byte alto. De esta manera cada dirección puede contener sólo 8 bits en este formato por lo que todas las direcciones se doblan.
Cada registro de datos (cada línea) comienza con un prefijo de 9 caracteres y acaba con 2 caracteres de checksum.
Cada registro de datos tiene el formato siguiente:
:BBAAAATTHHHH... .HHHCC
donde:
  • BB: dos digitos en hexadecimal que representan el número de bytes de datos que aparecen en la línea.
  • AAAA: cuatro digitos en hexadecimal que representan la dirección de arranque de los datos del registro.
  • TT: dos digitos que siempre serán '00' salvo al final del archivo de datos que serán '01'.
  • HH: dos digitos en hexadecimal, con la información en la forma byte bajo / byte alto.
  • CC: checksum de dos digitos en hexadecimal son el complemento a dos de la suma de todos bytes precedentes en el registro.
Ejemplo:
Parte de e001.lst:

    0000  3007   movlw  0x07   ;Carga primer sumando en W
    0001  3E08   addlw  0x08   ;Suma W con segundo sumando
    0002  0090   movwf  0x10   ;Almacena el resultado

e001.hex completo:

    :020000040000FA
    :060000000730083E9000ED
    :00000001FF

Observemos la 2 línea:

    :060000000730083E9000ED

    :06000000
        06 6 bytes: 07, 30, 08, 3E, 90, 00.
        0000 dirección 0
        00 al no ser el registro final

    730083E9000ED
        07 30 es 3007
        08 3E es 3E08
        90 00 es 0090
        ED es el checksum

Ejecutar MPASM

MPASM permite operar a través de una ventana con el botón Built All de MPLAB (ver MPLAB-IDE v6.60) o a través de línea de comandos, siendo el resultado final el mismo, mediante el programa mpasmwin de Microchip.
La línea de comando se compone de de distintos campos, del tipo:
    MPASMWIN [/[,/....]] []
 indica a MPASM el archivo a ensamblar, y las opciones pueden indicar el tipo de prosesador, si queremos que nos muestre todos los mensajes o solo los de error, el formato de salida del archivo .HEX etc. Estos campos se incluyen automáticamente cuando trabajamos con Built All.
A continuación se muestra como se ejecuta MPASM según aparece en la ventana Output de MPLAB cuando pulsamos Built All:
    mpasmwin.exe /q /p16F84A "jluzpic.asm" /l"jluzpic.lst" /e"jluzpic.err"
También podemos ejecutar el archivo mpasmwin.exe directamente, aparecerá:

Sistemas de numeración

La convención utilizada por MPASM es la siguiente:
Hexadecimal: es la numeración por defecto. Para mayor claridad para el programador se utiliza una letra H al final del número. Por ejemplo: 0100H, 0A0H, 5H, 66h.
Importante: Como ésta es la numeración por defecto hay que tener mucho cuidado al colocar números en decimal. Por ejemplo la instrucción MOVLW 64 no utilizará el número 64 decimal sino el 100 decimal (64 hex = 100 dec)
Binario: Para escribir números en binario utilizar B'xxxxxxxx' (utilizar comillas simples). Por ejemplo: B'10011001' , b'01110000'.
Decimal: podemos utilizar la forma D'120' (también con comillas simples) o la forma corta anteponiendo un punto al número decimal. Esta es la forma utilizada en todos los programas realizados por Microchip. Por ejemplo: D'112' d'10' .200 .100
Tener en cuenta siempre el tamaño de datos con el que se está trabajando. En la mayoría de los casos, se utilizará un número para almacenarlo en el acumulador y éste es de 8 bits. Por lo tanto el número utilizado no debe exeder de 255 decimal o FF hexadecimal.
TipoSintaxisEjemploComentario
Decimal D''D'100'D puede ser minúscula
..100 
Hexadecimal  H''H'64'H puede ser minúscula
0x0x64 
 64Por defecto
OctalO''O'144'O puede ser minúscula
BinarioB''B'01100100'B puede ser minúscula
ASCII A''A'C'A puede ser minúscula
'''C' 

Directivas de MPASM

Las directivas son "indicaciones" para el ensamblador que le dicen cómo hacer algunas cosas, y sirven para ayudarnos en la tarea de programar. MPASM ofrece bastantes directivas, las cuales se escriben dentro del código fuente. Por eso no hay que confundir las directivas con las instrucciones del PIC.
Los tipos de directivas son:
  • Directivas de control.
  • Directivas de datos.
  • Directivas de listado.
  • Directivas de macros.
  • Directivas de ficheros objeto.
Las directivas de control, permiten un ensamblado condicional.
Las directivas de datos, son todas aquellas que permiten la manipulación simbólica y el posicionamiento en memoria.
La directiva de listado permiten todo el control sobre el formato, paginacion y listado del programa.
La directivas de macros, permiten todas las gestiones de las macros.
Las directivas de fichero objeto, solo se utilizan para la creacion de ficheros objeto o reubicables/reusables para luego enlazar con el MPLINK.
Las directivas se vieron en el tema ensamblador.htm explicando algunas. A continuación se muestra un resumen de las directivas mas importantes, ordenadas por tipo. Todas las directivas pueden verse en el tema Directivas de MPASM

Resumen directivas del ensamblador MPASM

Directivas para carga o reserva en la Memoria de Programa
DATAInicializa una o más palabras de la memoria de programa con datos o cadenas de caracteres
DATA 0x012, 0x1345
DATA "Prueba 1,2,3"
DAAlmacena en paquetes de 14 bits dos caracteres ASCIIrepresentados con 7 bits
DA "abcdef"
DBReserva e inicializa bytes en la memoria de programa
DB 'T', 0xF0, 'S'
DWReserva e inicializa palabras en la memoria de programa
DW 0x39, 0x45B
DTGenera una serie de instrucciones RETLW, una por cada expresiónque acompaña a la directiva
DT 1, 2, 3, 5, 7
DEReserva y carga posiciones de la memoria de programa con bytes, en principio estaba pensada para rellenar la EEPROM de datos (empieza en la 0x2100), pero se puede emplear para cualquier posición de memoria de programa
ORG 0x2100
DE "Programa version 1.0"
FILLRellena un número de posiciones de memoria de programa con unmismo contenido (dato o instrucción si va entre paréntesis)
FILL 0x190F, 5
RESReserva un determinado número de posiciones de la memoria deprograma (avanza el puntero de cuenta de posición en la memoria de programa)
RES 64
__CONFIGCarga la palabra de configuración del microcontrolador,previamente se debe haber declarado el microcontrolador
__CONFIG 0x3F43
__IDLOCSSe emplea para cargar las 4 posiciones de identificación delmicrocontrolador. Se debe haber declarado previamente el microcontrolador
__IDLOCS 1234
Directivas de Control
CBLOCK
ENDC
Se emplean para declarar inicio y final de un bloque de constantes. Se asignan valores correlativos
CBLOCK 0x20
A, B, C, D ;A = 0x20, B=0x21, C=0x22, D=0x23
ENDC
CONSTANT
EQU
Las dos se emplean para asignar expresiones a símbolos esos símbolos no pueden luego cambiar de valor (son constantes). Sintaxis distinta, pero igual efecto
CONSTANT longitud=0x10
longitud EQU 0x10
VARIABLE
SET
Las dos se emplean para asignar expresiones a símbolos esos símbolos pueden cambiar de valor (son variables). Sintaxis distinta, pero igual efecto
VARIABLE BUFFER=0x20
BUFFER SET 0x20
#DEFINESe emplea para definir una etiqueta para una cadena decaracteres siempre que aparezca la etiqueta, se sustituye directamente por la cadena
#DEFINE bit_0 STATUS,RP0
#UNDEFINEAnula una asignación previa realizada con #DEFINE
#UNDEFINE bit_0
ORGSitúa el código que se vaya generando después a partir de la posición especificada
ORG 0x100
ENDFinal de código fuente
END
INCLUDESe incluye el fichero especificado, se inserta en la posición yserá ensamblado
INCLUDE "c:\mplab\P16F84A.INC"
INCLUDE
RADIXSe especifica el RADIX que se está usando
RADIX dec ;pueden ser hex ú oct
PROCESSORDefine el tipo de microcontrolador
PROCESSOR 16F84A
Para controlar la generación del fichero de listado (.LST):
TITLETítulo en la cabecera de las páginas
SUBTITLESubtítulo (segunda línea) en cabecera
SPACEInserta líneas en blanco
PAGEInserta salto de página
LISTHabilita listado y opciones del mismo
NOLISTDeshabilita generación en fichero .LST
MESSGSaca mensajes en el fichero .LST
ERRORTambién para sacar mensajes en .LST
ERRORLEVELEspecifica tipos de mensajes que aparecerán en fichero.LST
ERRORLEVEL 0 ;Errores, warnings y mensajes
ERRORLEVEL 1 ;Warnings y errores
ERRORLEVEL 2 ;Errores
Directivas de Ensamblado condicional
IF
ELSE
ENDIF
Grupo de directivas para ensamblar instrucciones si es cierta o no una expresión
IF versión==1
MOVLW 0x0A ;Esto se ensambla si expresión es cierta o distinta de 0
MOVWF PORTB
ENDIF

IF expresión
;Si la expresión es cierta se ensambla este grupo
Grupo 1 de Directivas e Instrucciones
ELSE
;y si es falsa, este otro
Grupo 2 de Directivas e Instrucciones
ENDIF
IFDEFPuede sustituir a la IF. Se ensambla si está definida la etiqueta
#DEFINE DE_B_a_A 1
IFDEF DE_B_a_A
MOVF PORTB,w
MOVWF PORTA
ELSE
MOVF PORTA,W
MOVWF PORTB
ENDIF
IFNDEFPuede sustituir a las dos directivas anteriores IF e IFDEF. Se ensambla si no está definida la etiqueta
WHILE
ENDW
Grupo de instrucciones y directivas que se ensamblan mientras la expresión sea cierta
VARIABLE i
i=0
WHILE i < CONTADOR
RETLW i
i+=1
ENDW
Macros
MACRO
EXITM
ENDM
Una macro es un conjunto de instrucciones que pueden ser insertadas en el código fuente mediante una simple llamada a macro.
Una macro debe ser definida primero antes de poder ser llamada en elcódigo fuente siguiente.
Una macro puede llamar a otra macro o a sí misma de manera recursiva

Definición de una macro:
Etiqueta MACRO argumento1, arguento2, argumento3, ...
Conjunto de Instrucciones
EXITM (salida intermedia opcional)
Más instrucciones
ENDM

Utilización de una macro:

Definiciones:
Banco_0 MACRO
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Banco_1 MACRO
bsf STATUS,RP0
bcf STATUS,RP1
ENDM

Utilización:
movlw 0xF0
Banco_1
movwf TRISB
Banco_0

No hay comentarios:

Publicar un comentario