Está en la página 1de 3

Antonio Sánchez facebook:Programando PICs

EL ASSEMBLER EN LOS PIC16F


Esta serie de artículos no pretende ser un manual extensivo de programación en ensamblador de los
PIC16. Está orientado a los miembros de este grupo, los cuales ya poseen conocimientos de estos
microcontroladores en lenguajes de alto nivel y tienen inquietud por iniciarse en el ASM.

Por ello, obviaré muchas cosas que ya seguramente todos tenemos por sabidas y me ahorraré
prólogos e introducciones innecesarias.

Para programar en ensamblador para los PIC16F realmente necesitamos pocas cosas: Proteus o
MPLAB en cualquiera de sus versiones incluyen el compilador necesario. Yo uso y aconsejo tener
en vuestro ordenador abierto los siguientes elementos:
– El entorno con el que vayáis a programar(MPLAB,Proteus...)
– El archivo .pdf con el datasheet del PIC16F en cuestión (importante)
– El archivo .inc del mismo microcontrolador (si tenéis instalado Notepad++ mejor abrirlo con
el mismo) El archivo .inc lo encontraréis en la carpeta del MPASM.
– La calculadora ;-)
– El manual en pdf de MPASM también puede venir bien.

Sólo unas consideraciones antes de meternos en faena:


– los programas en ensamblador sí dependen mucho del microcontrolador usado. Aunque
siempre se puede cambiar un programa para que funcione con otro PIC, no es tan sencillo
como en un lenguaje de alto nivel.
– las directivas son indicaciones que le damos al compilador y no son lo mismo que las
instrucciones (código máquina) de nuestro PIC. Los PIC16F sólo tienen 49 instrucciones y
los más antiguos sólo 35, pero directivas del MPASM hay más de 60.
– en ensamblador hay que usar goto nos guste o no. No se parece a lenguajes estructurados y
elegantes donde los goto están casi prohibidos. De hecho, por muy bonito que nos quede un
programa en C o PASCAL, con sus llaves o corchetes, una vez compilado estará lleno de
goto por todas partes.
– En MPASM los comentarios (remarks) se inician con punto y coma (;) y acaban al final de
la línea.

La estructura de un archivo en ensamblador no difiere mucho de uno en C, vamos a ver cada uno de
los elementos antes de entrar en detalle a lo largo de los artículos:
1- La lista de opciones (LIST): también se puede traducir como opciones de listado. En esta primera
línea vamos a especificar una serie de opciones para nuestro compilador: microcontrolador que
vamos a usar, base numérica predeterminada (radix), formato del archivo .hex... En muchas
ocasiones esta línea no es necesaria, debido a que la mayoría de las veces ya le indicamos al entorno
de programación mediante menús y otros modos los datos esenciales, y dicho entorno se lo pasa al
compilador a través de la línea de comandos.
2- Los #include: MPASM necesita que le especifiquemos el archivo del cual tomará las constantes
que usaremos en nuestro programa, sobre todo nombres y direcciones de los registros del micro. Si
vamos a usar librerías o módulos externos (en asm también se puede) lo debemos especificar con su
#include correspondiente.
3-El/los __config: los PICs incorporan uno o varios registros donde se almacena la configuración
esencial de nuestro microcontrolador. Esta configuración suele incluir la protección contra lectura
de la memoria(importante), la fuente del reloj del sistema, si el PIC debe reiniciarse por un overflow
en la pila... Además dicha configuración no puede ser modificada mediante firmware y nos puede

El Assembler en los PIC16F 1 Capítulo 1


Antonio Sánchez facebook:Programando PICs

dar algún dolor de cabeza si no la tenemos correctamente ajustada.


4- Las constantes: mediante la directiva #define podemos especificar constantes para que nuestro
código resulte más legible. Por ejemplo #define ZERO STATUS,Z nos permitirá escribir
instrucciones usando la palabra ZERO en lugar de STATUS,Z.
5- Las macros: En MPASM las macros se usan comúnmente para reemplazar varias instrucciones
con una sola línea: a la hora de hacer el preprocesado, se sustituyen(expanden) estas macros por el
conjunto de instrucciones que hayamos definido.
6- Las variables: aquí la cosa empieza a ponerse más compleja en ensamblador que en los lenguajes
de alto nivel. Debemos recordar que los PIC16F son micros de 8 bits, por lo que debemos
“olvidarnos” de variables long,float... Además, para MPASM los nombres de nuestras variables no
son más que constantes que sustituyen una dirección de memoria determinada, por lo que habrá que
indicarle la posición de memoria donde queremos ir ubicando nuestras variables, y aquí empieza lo
bueno: la partición en bancos de la memoria RAM de nuestros PICs no nos da muchas facilidades.
7-El código propiamente dicho: aunque con la directiva ORG podemos ir cambiando la posición de
memoria FLASH donde se va almacenando nuestro código, esto generaría particiones y huecos
vacíos en la memoria que luego sería casi imposible de encontrar. En assembler, lo mejor es
empezar por la posición 0 (llamada vector de Reset),generar un salto hacia el inicio de nuestro
programa (un simple goto Inicio) y en la posición de memoria 4 colocar nuestra rutina de
interrupción.
8-Directiva end: aunque parezca una obviedad, si al final de nuestro código no ponemos end, el
compilador nos dará un error.

Aquí incluyo un trozo de programa en ensamblador con las partes que he comentado.
;Lista de opciones (tipo de procesador, base numérica y mostrar las advertencias y errores)
LIST p=16F1933,r=HEX,w=1

;Este include del microcontrolador es necesario en MPASM, además podemos incluir otros ficheros
#include p16f1933.inc ; Include register definition file

;Configuración del microcontrolador, como este PIC lleva dos registros se especifican por separado
__config _CONFIG1,_FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_ON
& _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__config _CONFIG2,_WRT_OFF & _VCAPEN_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_HI & _LVP_OFF

;Constantes
#define ZERO STATUS,Z
#define CARRY STATUS,C

;Macros
MOVLWF macro literal,file
MOVLW literal
MOVWF file
endm

;Variables (en este caso le indicamos que las variables empiezan el la dirección 32 del banco 0)
cblock 0x20
LINE
endc

;Código (empezamos a compilar en la dirección 0 y saltamos al inicio de nuestro programa)


; Reset Vector
RST code 0x0
goto Start

;Código de nuestras interrupciones (en los PIC16F siempre es la dirección 4)


ISR org 0x04
MOVF PORTC,W
ANDLW 0xF0
BTFSC ZERO
GOTO Rotate
CALL ReadKey
NOP

El Assembler en los PIC16F 2 Capítulo 1


Antonio Sánchez facebook:Programando PICs

Rotate:LSLF LINE,F
BTFSS LINE,4
GOTO $+3
MOVLW .1
MOVWF LINE
MOVF LINE,W
MOVWF PORTC
BCF PIR3,TMR4IF
RETFIE

;Aquí empiezan las primeras instrucciones que se ejecutarán de nuestro programa


PGM code
Start
banksel OSCCON
MOVLWF b'01111011',OSCCON
MOVLWF 0xF0,TRISC

banksel PIE3
CLRF PIE1
CLRF PIE2
MOVLWF 1<<TMR4IE,PIE3

banksel PORTA
CLRF PIR1
CLRF PIR2
CLRF PIR3
MOVLWF (1<<GIE|1<<PEIE),INTCON

banksel T4CON
MOVLWF b'00100110',T4CON

banksel PORTA
MOVLWF .1,LINE


end

En próximos artículos iremos viendo en detalle cada una de las partes, así como las
instrucciones de máquina, las diferentes directivas, ejemplos...

All trademarks are property of their respective owners.


Article for educational purposes only.
No copyright infringement intended

El Assembler en los PIC16F 3 Capítulo 1

También podría gustarte