You are on page 1of 9

QU ES UN MICROCONTROLADOR?

Es un circuito integrado programable que contiene todos los componentes de un computador.


Se emplea para controlar el funcionamiento de una tarea determinada y, debido a su reducido tamao, suele ir
incorporado en el propio dispositivo al que gobierna.
El microcontrolador es un computador dedicado. En su memoria slo reside un programa destinado a gobernar una
aplicacin determinada; sus lneas de entrada/salida soportan el conexionado de los sensores y actuadores del
dispositivo a controlar, y todos los recursos complementarios disponibles tienen como nica finalidad atender sus
requerimientos. Una vez programado y configurado el microcontrolador solamente sirve para gobernar la tarea asignada.

Un microcontrolador es un computador completo, aunque de limitadas prestaciones, que


contenido en el chip de un circuito integrado y se destina a gobernar una sola tarea.

est

Algunas aplicaciones.
Las comunicaciones y sus sistemas de transferencia de informacin utilizan profusamente estos pequeos computadores
incorporndolos en los grandes automatismos y en los modernos telfonos.
La instrumentacin y la electromedicina son dos campos idneos para la implantacin de estos circuitos integrados. Una
importante industria consumidora de microcontroladores es la de automocin, que los aplica en el control de aspectos tan
populares como la climatizacin, la seguridad y los frenos ABS.

PROGRAMACIN EN LENGUAJE ENSAMBLADOR.


PROGRAMA FUENTE

Programa fuente:
El programa fuente est compuesto por una sucesin de lneas de programa. Cada lnea de programa est
compuesta por 4 campos separados por uno o ms espacios o tabulaciones.
Estos campos son:
[Etiqueta]

Comando

[Operando(s)]

[;Comentario]

La etiqueta es opcional. El comando puede ser un mnemnico del conjunto de instrucciones. El operando est
asociado al comando, si no hay comando no hay operando, e inclusive algunos comandos no llevan operando.
El comentario es opcional para el compilador aunque es buena prctica considerarlo obligatorio para el
programador.
La etiqueta, es el campo que empieza en la primer posicin de la lnea. No se pueden insertar espacios o
tabulaciones antes de la etiqueta sino ser considerado comando. Identifica la lnea de programa haciendo que
el compilador le asigne un valor automticamente. Si se trata de una lnea cuyo comando es una instruccin
de programa del microcontrolador, se le asigna el valor de la direccin de memoria correspondiente a dicha
instruccin (location counter). En otros casos se le asigna un valor de una constante, o la direccin de una
variable, o ser el nombre de una macroinstruccin, etc.
El comando puede ser un cdigo mnemnico de instruccin del microcontrolador, o una directiva o
pseudoinstruccin para el compilador. En el primer caso ser directamente traducido a cdigo de mquina, en
el segundo caso ser interpretado por el compilador y realizara alguna accin en tiempo de compilacin como
ser asignar un valor a una etiqueta, etc.
El campo de operandos puede contener uno o ms parmetros separados por comas. Los parmetros
dependen de la instruccin o directiva. Pueden ser nmeros o literales que representen constantes o
direcciones.
El campo de comentario debe comenzar con un caracter punto y coma. No necesita tener espacios o
tabulaciones separndolo del campo anterior, e incluso puede empezar en la primer posicin de la lnea. El
compilador ignora todo el texto que contenga la lnea despus de un caracter punto y coma. De esta manera
pueden incluirse lneas que contengan solo comentarios, y es muy buena prctica hacer uso y abuso de esta
posibilidad para que los programas resulten autodocumentados.

3.1 CONJUNTO DE INSTRUCCIONES

El PIC16F873 es un C tipo RISC, esta es la razn por la que utiliza 35 instrucciones en la programacin, y
estas instrucciones estn bien optimizadas para tener una mayor velocidad de trabajo, una arquitectura ms
simple y un cdigo ms compacto.
Antes de continuar es necesario definir algunos trminos que se usaran para explicar las instrucciones:
f: cualquier registro del microcontrolador STATUS, PORTB, PORTA, etc
W: registro de trabajo
b: posicin de un bit en el registro 'f' (0-7)
d: destino, puede ser 'f' (d=1) o 'W' (d=0)
etiqueta: grupo de caracteres que marcan el inicio de una parte del programa
[ ]: opcional
Al conjunto de instrucciones las vamos a clasificar en 3 grupos:

Instrucciones orientadas a registros


Instruccin

Sintaxis

Descripcin

[Etiqueta] ADDWF f,d

Suma el contenido del


registro w al contenido del
registro f, y almacena el
resultado en w si d = 0, y en
el registro f si d = 1.

[Etiqueta] ANDWF f,d

Efecta la operacin AND


lgico entre el contenido del
registro w y el contenido del
registro f, y almacena el
resultado en w si d = 0, y
en f si d = 1. Esta instruccin
realiza la operacin AND bit a
bit.

ADDWF
Suma W y f

ANDWF
W AND f

Operacin
w+fd

w AND f d

ANDWF REG,1
Antes de la instruccin:
W=0x17, REG= 0xC2
Despus de la instruccin:
W=0x17, REG= 0x02

CLRF
Borra un
registro

[Etiqueta] CLRF f

Se borra el contenido del


registro f y el flag Z se activa

00hf
1Z

[Etiqueta] CLRW

El registro de trabajo w se
carga con 00h. El flag Z se
pone a 1

00hw
1Z

[Etiqueta] COMF f,d

Hace el complemento del


contenido del registro f bit a
bit. El resultado se almacena
en el registro f si d=1 y en el
registro w si d=0, en este
caso f no vara.

Complemento
de f d

[Etiqueta] DECF f,d

Se decrementa el contenido
del registro f en una unidad.
El resultado se almacena
en f si d=1 y en w si d=0, en
este caso f no vara.

f-1d

CLRW
Borra el
registro de
trabajo W

COMF
Complementa
el registro f

DECF
Decrementa f
en 1

DECFSZ
Decrementa en
1 y salta si el
resultado es 0

[Etiqueta] DECFSZ f,d

INCF

[Etiqueta] INCF f,d

Decrementa el contenido del


registro f en una unidad, el
resultado
se
almacena
en f si d=1 y en w si d=0, en
este caso, f no vara. Si el
resultado es cero, se ignora
la siguiente instruccin y, en
ese caso la instruccin tiene
una duracin de dos ciclos.
Se incrementa en una unidad
el contenido del registro f,

Ejemplo
ADDWF REG,1
Antes de la instruccin:
W=0x03, REG=0x04
Despus de la instruccin:
W=0x03, REG=0x07

CLRF REG
Antes de la instruccin:
REG=0x54
Despus de la instruccin:
REG=0x00, Z=1
CLRW
Antes de la instruccin:
W=0x54
Despus de la instruccin:
W=0x00, Z=1
COMF REG,0
Antes de la instruccin:
REG=0x13
Despus de la instruccin:
REG=0x13, W=0xEC
DEC CONT,1
Antes de la instruccin:
CONT=0x01, Z=0
Despus de la instruccin:
CONT=0x00, Z=1

f - 1 d,
salta si
resultado = 0

f+1d

INCF CONT,1
Antes de la instruccin:

si d=1 el
resultado
se
almacena en f, si d=0 el
resultado se almacena en w,
en este caso el resultado
de f no vara.

Incrementa el
registro f

INCFSZ
Incrementa en
1 y salta si el
resultado es 0

[Etiqueta] INCFSZ f,d

IORWF
[Etiqueta] IORWF f,d
W OR f

MOVF
Mover el
registro f

[Etiqueta] MOVF f,d

Incrementa el contenido del


registro f en una unidad, el
resultado se almacena de
nuevo
en f si d=1,
y
en w sid=0,
en
este
caso, f no
vara.
Si
el
resultado es cero, se ignora
la siguiente instruccin y, en
ese caso la instruccin tiene
una duracin de dos ciclos.
Efecta la operacin lgica
OR entre el contenido del
registro w y el contenido del
registro f, y almacena el
resultado
en f si d=1 y
en w si d=0.
Esta instruccin realiza la
operacin OR bit a bit.
El contenido del registro f se
carga en el registro destino
dependiendo del valor de d.
Si d=0 el destino es el
registro w, si d=1 el destino
es el propio registrof. Esta
instruccin permite verificar
dicho registro ya que el
flag Z queda afectado.

CONT=0xFF, Z=0
Despus de la instruccin:
CONT=0x00, Z=1

f +1 d,
salta si
resultado = 0

w OR f d

fd

MOVWF

MOVF REG,0
Despus de la instruccin:
W=REG

MOVWF REG
Antes de la instruccin:
REG=0x03, W=0xA4
Despus de la instruccin:
REG=0xA4, W=0xA4

[Etiqueta] MOVWF f

Mueve el contenido
registro w al registro f

[Etiqueta] RLF f,d

Rotacin de un bit a la
izquierda del contenido del
registro f, pasando por el bit
de acarreo C, desde los bits
menos significativos a los
ms significativos. El bit D7
pasa al CARRY del registro
STATUS, el contenido del
CARRY pasa al D0, el D0 al
D1, etc. Es como si
multiplicramos por dos el
contenido del registro.
Si d=1 el
resultado
se
almacena
en f,
si d=0 el
resultado se almacena en w.

RLF REG,1
Antes de la instruccin:
REG=b'11100110', C=0
Despus de la instruccin:
REG=b'11001100', C=1

Rota el
registro f a la
derecha

[Etiqueta] RRF f,d

Rotacin de un bit a la
derecha del contenido del
registro f, pasando por el bit
de acarreo C, desde los bits
ms significativos a los
menos significativos. El bit C
del registro STATUS pasa al
D7, el D0 pasa al bit C, el D1
al D0, etc. Es como si
dividiramos por dos el
contenido del registro.
Si d=1 el
resultado
se
almacena
en f,
si d=0 el
resultado se almacena en w

RLF REG,1
Antes de la instruccin:
REG=b'11100110', C=0
Despus de la instruccin:
REG=b'01110011', C=0

SUBWF

[Etiqueta] SUBWF f,d

Resta en complemento a dos

Mover el valor
del registro W
al registro f

RLF
Rota el
registro f a la
izquierda

RRF

del

IORWF REG,0
Antes de la instruccin:
REG=0x13, W=0x91
Despus de la instruccin:
REG=0x13, W=0x93

wf

f-wd

SUBWF REG,1

Resta f - W

SWAPF
Intercambio de
f

[Etiqueta] SWAPF f,d

XORWF
[Etiqueta] XORWF f,d
W XOR f

NOP
[Etiqueta] NOP
No operacin

el
contenido
del
registro f menos el contenido
del registro w almacena el
resultado
en w si d=0 y
en f si d=1.
Los cuatro bits de ms peso
del registro f se intercambian
con los 4 bits de menos peso
del mismo registro. Si d=0 el
resultado se almacena en w,
si
d=1 el
resultado
se
almacena en f.
Realiza la funcin ORExclusiva entre el contenido
del registro w y el contenido
del registro f, y almacena el
resultado
en f si d=1 y
en w si d=0.
Esta instruccin realiza la
operacin EXOR bit a bit.
No realiza operacin alguna,
pero sirve para consumir un
ciclo
de
instruccin,
equivalente a 4 de reloj.

Antes de la instruccin:
REG=0x01, W=0x02
Despus de la instruccin:
REG=0xFF, W=0x02

(f<3:0>)
(d <7:4>)
(f<7:4>)
(d <3:0>)

SWAPF REG,1
Antes de la instruccin:
REG=0x54
Despus de la instruccin:
REG=0x45

w XOR f d

XORWF REG,1
Antes de la instruccin:
REG=0xAF, W=0xB5
Despus de la instruccin:
REG=0x1A, W=0xB5

no operacin

RETARDO NOP
NOP
NOP
RETURN

Instrucciones orientadas a bits


Instruccin
BCF

Sintaxis
[Etiqueta] BCF f,b

Descripcin
Pone
a
cero
el
nmero b del registro f.

bit

Operacin
0 (f<b>)

Borra un bit

BSF

[Etiqueta] BSF f,b

Pone a
registro f

el

bit b del

[Etiqueta] BTFSC f,b

Si el bit nmero b del


registro f es
cero,
la
instruccin que sigue a
sta se ignora y se trata
como un NOP (skip). En
este caso, y slo en este
caso, la instruccin BTFSC
precisa dos ciclos para
ejecutarse.
Si el bit nmero b del
registro f est a 1, la
instruccin que sigue a
sta se ignora y se trata
como un NOP (skip). En
este caso, y slo en este
caso, la instruccin BTFSS
precisa dos ciclos para
ejecutarse.

1 (f<b>)

Activa un bit

BTFSC
Checa un bit y
salta si es 0

BTFSS
Checa un bit y
salta si es 1

[Etiqueta] BTFSS f,b

Salta si (f<b>) =
0

Salta si (f<b>) =
1

Ejemplo
BCF REG,0
Antes de la instruccin:
REG=b'01101101'
Despus de la instruccin:
REG=b'01101100'
BSF REG,2
Antes de la instruccin:
REG=b'01001001'
Despus de la instruccin:
REG=b'01001011'

Instrucciones orientadas a constantes y de control


Instruccin
ANDLW

Sintaxis
[Etiqueta] ANDLW k

W AND literal

CALL

[Etiqueta] CALL k

Llamada
subrutina

CLRWDT
Borra
watchdog
timer

[Etiqueta] CLRWDT
el

GOTO

[Etiqueta] GOTO k

Salto
incondicional

IORLW

[Etiqueta] IORLW k

W OR literal

MOVLW

[Etiqueta] MOVLW k

Carga
un
literal en W

RETURN

[Etiqueta] RETURN

Regresa
de
una subrutina

RETLW

[Etiqueta] RETLW k

Regresa
de
una subrutina
y
carga
el
valor K en W

RETFIE
Regresa de la
rutina
de

[Etiqueta] RETFIE

Descripcin
Efecta la operacin AND
lgico entre el contenido del
registro w y el literal k, y
almacena el resultado en w.
Esta instruccin realiza la
operacin AND bit a bit.

Operacin
w AND k w

Salvaguarda la direccin de
vuelta en la Pila y despus
llama a la subrutina situada
en la direccin cargada en
el PC.
El modo de clculo de la
direccin efectiva difiere
segn
la
familia
PIC
utilizada. Tambin hay que
posicionar
el
registro
PCLATCH
antes
de
ejecutarse la instruccin.
Se
borra
tanto
el
registro WDT (watchdog)
como su preescaler. Los bits
T0# y PD# del registro de
estado se ponen a "1".
Salto
incondicional,
normalmente se utiliza para
llamar a la subrutina situada
en la direccin que se carga
en PC.
El modo de clculo de la
instruccin carga desde el
bit 0 al 10 de la constante k
en el PC y los bits 3 y 4 del
registro PCLATH en los 11 y
12 del PC
Se realiza la operacin
lgica OR entre el registro w
y el literal k. El resultado se
almacena en el registro w.
Esta instruccin realiza la
operacin OR bit a bit.
El registro w se carga con el
valor de 8 bits del literal k

PC+1 TOS
k PC <10:0>
PCLATCH (<4:3>)
PC (<12,11>)

Carga el PC con el valor


que se encuentra en la parte
superior
de
la
PILA,
efectuando as un retorno
de subrutina
Carga el registro w con el
literal k, y despus carga el
PC con el valor que se
encuentra en la parte
superior
de
la
PILA,
efectuando as un retorno
de subrutina.
Carga el PC con el valor
que se encuentra en la parte
alta de la Pila, asegurando

TOS PC

Ejemplo
ANDLW 0x5F
Antes de la instruccin:
W=0xA3
Despus de la
instruccin: W=0x03

INICIO CALL DESTINO


Antes de la instruccin:
PC=INICIO
Despus de la
instruccin:
PC=DESTINO

00hWDT
1 T0#
1 PD#
k PC <10:0>
(PCLATH <4:3>)
(PC <12:11>)

INICIO GOTO DESTINO


Antes de la instruccin:
PC=0
Despus de la
instruccin:
PC=DESTINO

w OR k w

IORLW Ox35
Antes de la instruccin:
W=0x9A
Despus de la
instruccin: W=0xBF

kw

MOVLW 0x5A
Despus de la
instruccin: W=0x5A

k w;
TOS PC

TOS PC
1 GIE

RETLW,0x45
Antes de la instruccion:
W=xx
Despues de la
instruccion: W=0x45

servicio

SLEEP
Entra
estado
reposo

[Etiqueta] SLEEP
en
de

XORLW

[Etiqueta] XORLW k

W XOR literal

SUBLW
Resta L - W

[Etiqueta] SUBLW k

as
la
vuelta
de
la
interrupcin. Pone a 1 el
bit GIE, con el fin de
autorizar de nuevo que se
tengan en cuenta las
interrupciones.
Pone al circuito en modo
Sleep (bajo consumo) con
parada del oscilador. Pone a
0 el flag PD# (Power Down)
y el flag TO# (Timer Out) se
pone a 1. Se puede salir de
este estado por:
1. Activacin de MCLR
para provocar un
Reset.
2. Desbordamiento del
watchdog si qued
operativo
en
el
modo reposo.
3. Generacin de una
interrupcin que no
sea TMR0 ya que
sta se desactiva
con la instruccin
SLEEP.
Realiza la funcin ORExclusiva entre el contenido
del
registro w y
la
constante k de 8 bits. El
resultado
se
almacena
en w.
Esta instruccin realiza la
operacin EXOR bit a bit.
Resta en complemento a
dos del contenido del literal
k el
contenido
del
registro w, y almacena el
resultado en w.

00 h WDT
0 WDT
prescaler
1 TO#
0 PD#

w XOR k w

k-ww

XORLW 0xAF
Antes de la
instruccin: W = 0xB5
Despus de la
instruccin: W = 0x1A

Directivas del ensamblador


Las instrucciones que podemos utilizar con un dispositivo son las que proporciona el fabricante para
su producto y que forman parte del llamado "repertorio de instrucciones". Pero al utilizar un programa
ensamblador podemos introducir adems instrucciones o comando que proporciona el propio
ensamblador. Estos comandos generalmente se utilizan para simplificar la tarea de programar, y
reciben el nombre de directivas.
Por lo tanto las directivas no se traducen directamente a instrucciones del lenguaje mquina sino
que asignan al programa ciertas reas de memoria, definen smbolos, designan reas de RAM para
almacenamiento de datos temporales, colocan tablas o datos constantes en memoria y permiten
referencias a otros programas.
Directiva EQU
El nombre viene de la palabra "equal", (igual)". La directiva EQU permite al programador "igualar"
nombres personalizados a datos o direcciones. Los nombres utilizados se refieren generalmente a
direcciones de dispositivos, datos numricos, direcciones de comienzo, direcciones fijas, posiciones
de bits, etc. Un nombre es ms descriptivo que una simple direccin y la tarea de programar se har
mucho ms sencilla. Tambin podemos asignar un nombre a una instruccin que repitamos varias
veces a lo largo de un algoritmo, de manera que sea mucho ms sencilla la programacin. A estos
nombres que asignamos mediante esta directiva se les denomina constantes, ya que el registro al
que apuntan no variar durante el programa
Ejemplos:
temp
equ 12
DATO
EQU 22
PORT_A
EQU 5
START
EQU 0
CARRY
EQU 3
TIEMPO
EQU 5
Bank_1
EQU BSF STATUS,RP0
Directiva ORG
Esta directiva dice al ensamblador a partir de que posicin de memoria de programa se situarn
las siguientes instrucciones. Rutinas de comienzo, subrutinas de interrupcin y otros programas
deben comenzar en locaciones de memoria fijados por la estructura del microcontrolador.
La directiva ORG hace al compilador colocar el cdigo que le sigue en una nueva direccin de
memoria (la salida del compilador no solo coloca los cdigos de operacin sino tambin las
direcciones de cada instruccin del programa). Usualmente se la utiliza para: reset, programas de
servicios de interrupcin, programa principal, subrutinas.
Ejemplos:
1) Inicia el programa en la posicin cero:
ORG
0x00
2) Inicia el programa en la posicin 0000h y luego pasa a la 0005h para no utilizar la posicin del
vector de interrupcin (0004 h)
ORG
0x00 ; El programa comienza en la direccin 0 y
GOTO
inicio ; salta a la direccin 5 para sobrepasar
ORG
0x05 ; el vector de interrupcin, situado en la posicin 4
Inicio xxx...

3) Inicia el programa en la posicin 0000h y luego pasa a la 0005h para no utilizar la posicin del
vector de interrupcin (0004 h). Si se produce una interrupcin se pasa a la posicin interr. Las
subrutinas comienzan a partir de la direccin 0300h.
ORG
00h
;vector de reset
goto
inicializa
ORG
04h
;vector de interrupcin
goto
interr
ORG
05h
inicializa movlw
08h
;aqu comienza el programa
.
.
ORG
300h
;subrutinas
Subrutina1
.
.
return
Subrutina2
.
.
Return
Directiva #INCLUDE
Esta directiva indica que archivos debern tomarse en cuenta a la hora de compilar el cdigo.
Normalmente se usa para incluir el archivo de PIC que el ensamblador tiene entre sus archivos, con
el cual el compilador ser capaz de reconocer todos los registros especiales y sus bits. Su uso nos
recordar al #include del lenguaje C. Esta lnea debe colocarse al principio, y tiene la siguiente
sintaxis:
#INCLUDE ; Lista de etiquetas de microchip
Directiva LIST
Este comando sirve para que el compilador tenga en cuenta sobre qu procesador se est
trabajando. Este comando debe estar en todo proyecto, situado debajo del "include", con la siguiente
sintaxis.
LIST P=PIC16F873
Directiva END
Al igual que las dos anteriores, esta debe ir incluida una sola vez en todo el programa. En
concreto, esta debe situarse al final, para indicar al ensamblador que el programa ha finalizado. Esta
siempre debe estar presente, aunque el flujo de nuestro programa acabe en un bucle.
Directiva #DEFINE
#DEFINE es una directiva muy util. Define se usa para crear pequeas macros. Con estas macros
podremos poner nombres a pequeos fragmentos de cdigo que nos facilitarn la realizacin y
comprensin del algoritmo.
Por ejemplo, podremos poner nombres a bits.
#define CERO STATUS,2
As, en vez de tener que llamar al bit por un numero y un registro, podremos usar directamente la
palabra CERO.
#define CINCO 5
Cada vez que se utilice la palabra CINCO ser reemplazada en el momento de la compilacin por
el nmero 5.

You might also like