Professional Documents
Culture Documents
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.
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.
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:
Sintaxis
Descripcin
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
00hf
1Z
[Etiqueta] CLRW
El registro de trabajo w se
carga con 00h. El flag Z se
pone a 1
00hw
1Z
Complemento
de 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
INCF
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
IORWF
[Etiqueta] IORWF f,d
W OR f
MOVF
Mover el
registro f
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
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
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
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
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
Sintaxis
[Etiqueta] BCF f,b
Descripcin
Pone
a
cero
el
nmero b del registro f.
bit
Operacin
0 (f<b>)
Borra un bit
BSF
Pone a
registro f
el
bit b del
1 (f<b>)
Activa un bit
BTFSC
Checa un bit y
salta si es 0
BTFSS
Checa un bit y
salta si es 1
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'
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>)
TOS PC
Ejemplo
ANDLW 0x5F
Antes de la instruccin:
W=0xA3
Despus de la
instruccin: W=0x03
00hWDT
1 T0#
1 PD#
k PC <10:0>
(PCLATH <4:3>)
(PC <12:11>)
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
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.