Está en la página 1de 40

Lenguaje

ensamblador
para PIC
desde 0

By: Leon Elec. (http://www.forosdeelectronica.com/f24/lenguaje-ensamblador-pic-desde-0-a16898/)

He comenzado a realiza un tutorial de ASM y lo voy a poner aqu tambin.


A pesar que mucho le escapan a este lenguaje, hay otros que nos sentimos
cmodos con el :-).
-------------------------------------------------------------------------Lo primero que hay que saber para este lenguaje, es que cada lnea de cdigo, es
una instruccin que realiza el CP o un paso que realiza el CP. A diferencia de otros
lenguajes, como por ejemplo el C, una lnea de instruccin, puede llevar uno o mas
pasos que el CP debe realizar. Ms adelante entendern el porqu.
A esto ltimo dicho, nos explica el porqu de un programa escrito en ASM
(assembler) lleva menos lnea de instruccin que el mismo programa realizado en
otro lenguaje. Esto se traduce que, cuanto menos lneas de cdigo, menor consumo
de la memoria de programa.
Nota: Entendemos por el mismo cdigo, al realizar un software para realizar una
dicha tarea. Una tarea que debe realizar nuestro microcontrolador, puede ser
escrito en diferentes lenguajes, y es el programa que se utiliz quien lo traduce a
formato hex (1 y 0).
Ahora, Qu es el CP?
El CP o PC es el Contador de Programa. Es el encargado de leer cada instruccin y
realizar la accin solicitada por el software.
Para dar un ejemplo un poco ms claro, digamos que el CP, es una persona. Esta
persona se le da un papel que tiene diferentes tareas a realizar. Estas tareas, estn
una debajo de la otra y lee lnea por lnea y hace lo que le dice esa lnea. Cada
lnea, posee una instruccin que se debe hacer. Cuando termin de hacer esa
instruccin, continua con la lnea de abajo.
Supongamos que tenemos un papel que dice:
Levantar la mano izquierda.
Bajar la mano izquierda.
Saltar tres veces en el mismo lugar.
Levantar la mano derecha.
Saltar una vez en el mismo lugar.
Bajar la mano derecha.
El CP, har esas tareas sin negarce y lo har fielmente a lo que est escrito. Por lo
que, si hace una tarea mal, es porque le pusimos una o ms instrucciones mal.
Si bien, el CP har lo que nosotros le pidamos, el CP nos pide que respetemos

algunas cosas. Estas cosas, dependern de cada microcontrolador y que debemos


saber para poder programar en forma correcta al PIC.
Cmo es la extructura del lenguaje ASM?
Es muy fcil, posee 4 columnas bien diferenciadas y que no es problema acordarce.
* La primer columna se llama ETIQUETA y sirve para darle el nombre a una
pocicin de la memoria del programa al que se necesita apuntar. Los que no se den
cuenta, ya lo haran.
* La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una
instruccin a realizar por el CP.
* La tercera columna, se llama OPERANDO y es el operando de una instruccin, o
sea, de la segunda columna. Hay instrucciones que no tienen operando y las
veremos ms adelante.
* Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el
programador, o sea, el usuario que est programando el PIC. En otras palabras, a
nosotros. Siempre comienza con ; (punto y coma)
Si no sirve para el PIC, Para qu complicarla ms? Todo lo contrario, es para
alludar al programador de que no se olvide que intent hacer.
Todos los lenguajes, desde los ms bsicos, hasta los ms avanzados, tienen esta
caractersticas ya que en el, pondremos que es lo que queremos hacer o explicar el
programa.
Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacin
colocarla en esta columna, si no que puede ir al margen de la planilla en dnde
estamos programando. Y es aqu dnde explicaremos la porcin de una rutina para
entenderlo ms adelante.
Bien, veremos a continuacin, como se escriben las columnas:
ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES
O, podemos verlo as:
;OBSERVACIONES
;OBSERVACIONES
;OBSERVACIONES (y la cantidad que necesitemos)
ETIQUETAS INSTRUCCIN OPERANDO ;OBSERVACIONES

Antes de empezar a ver las intrucciones, debemos concentrarnos en los registros.


Qu son los registros?
Los registros, son pociciones de memoria el cual se utilizan para ir configurando el

pic mientras se corre el programa, cambiar de bancos para acceder a otras partes
de memorias, son banderas que nos van diciendo que est pasando con distintas
operaciones, son habilitaciones o desabilitaciones para mdulos que trae el PIC. Por
ejemplo, conversor Analgico/Digital, PWM.
Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit
y 32 bit. Excepto la palabra configuracin y que la veremos mas adelante. El
tamao de los registro depende del tipo de microcontrolador.
Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar
para lo descripto anteriormente (habilitar/desabilitar, etc).
A continuacin, ver el archivo adjunto. Es la pocicin de la RAM y sus 4 bancos.
Este, es del PIC16F877
Como notarn, en las cuatro columnas, hay nombres. Estos nombres son todos los
registros que posee este PIC. Vern que hay registros que se repiten. No quiere
decir que estan duplicados, triplicados o cuatriplicados, si no que se puede acceder
a ellos no importa en que banco estemos trabajando. (Ya lo entendern, no se
preocupen).
Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros,
se debe acceder al banco que est dicho nombre. Es por eso, que esta tabla es muy
importante a la hora de trabajar.
Aprovechando que sub esta tabla del pic, cuando dea ejemplo de programacin,
ser sobre este pic.
Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo
que si no tienen este datasheet, descargenlo de la pgina de Microchip. Cuando
empezemos a programar, lo necesitarn.

Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza


para mover un dato/valor de un registro a otro, cargar valores en un registro, y con
la ayuda de la ALU puede hacer operaciones matemticas.
Observen con atencin el diagrama de bloque dnde se encuentra W que est
adjuntado.
Ahora bien, si W es un registro, dnde est ubicado, ya que en el mapa de
memoria no lo encuentro?
El registro W no est implementado en la memoria ram en la posicin 0x00 ni en
otra posicin. W es un registro independiente que tiene un bus directo con la ALU

(un camino privado). La ALU es la nica entidad que puede leer o escribir este
registro de trabajo.
El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF es
completamente ajeno a W. Un direccionamiento indirecto usa el registro FSR como
apuntador al contenido de otros registros. Cualquier instruccin que hace uso de
INDF (0x00) como direccin invoca un direccionamiento indirecto.
Los microcontroladores PIC, poseen tres tipos de memorias.
* Memoria de Programa
Es la ubicacin fsica dnde se guarda el firmware que hemos creado, o sea,
nuestro programa. Y tiene un ciclo de 100.000 de lectura y/o escrituras antes de
estropearce y es del tipo FLASH (pero este es flaco :mrgreen: Es un chiste).
* Memoria de datos de uso general
Es la memoria RAM del PIC. Recordemos, que los registros estn sobre la memoria
RAM y la memoria de uso general, comienza despus de los registros.
* Memoria de datos EEPROM
Es la memoria EEPROM que puede almacenar datos mas de 40 aos sin energa y
1.000.000 de ciclos de escritura y lectura
El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o
sea que cada pocicin de memoria tiene 14 bit (B'11111111111111', o H'3FFF')
Cada lnea de instruccin ocupa una pocicin en la memoria de programa, asi que,
podemos poner hasta 8.192 instrucciones.
La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit
(B'11111111', o H'FF'). Esto quiere decir, que tenemos 368 pociciones para nuestro
uso.
La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 pociciones para
nuestro uso.

Ahora, vamos a estudiar el registro STATUS y luego continuaremos con las


instrucciones.

Registro STATUS
Si entendieron hasta ac, se acordar que los registros poseen un ancho de 8 bit.
Cada bit, puede contener un 1 o 0.
Vemos ahora en detalle el registro STATUS (est adjuntado)

Este registro, tiene 3 Bit dedicado para las operaciones matemticas, 3 bit dedicado
al cambio de banco de memoria y 2 bit dedicado para saber que o quin produjo un
Power Up (despertar del micro). Y se puede leer y escribrir en l (cambiar datos).
Los analizamos desde el ms significativo (MSB) hasta el menos significativo (LSB).
BIT 7:
Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de
memoria.
1 = Banco 2 y 3
0 = Banco 0 y 1
BIT 6 y BIT 5
Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para
cambiar de banco de memoria.
00
01
10
11

=
=
=
=

Banco 0
Banco 1
Banco 2
banco 3

BIT 4
Se llama TO (neg). Este bit se utiliza para saber quin despert al PIC.
1 = Despus que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se
pone a 1 este bit.
0 = Se pone a 0 cuando el wachtdog o en castellano perro guardan (WDT)
despierta al PIC.
BIT 3
Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.
1 = Despus de que despierta (power up) o por la instruccin CLRWDT, se pone a 1
0 = Se pone a 0 cuando se ejecuta la instruccin SLEEP
BIT 2
Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el
resultado de una operacin aritmtica y lgica.
1 = La operacin aritmtica o lgica di como resultado 0
0 = La operacin aritmtica o lgica no di como resultado 0
BIT 1
Se llama DC. Digit carry/borrow (dgito llevar/prestar). Es afectado por las
instrucciones ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la polaridad es

inversa).
1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.
0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.
BIT 0
Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al
bit DC.
1 = Hubo un accareo del bit ms significativo (Bit 7) o sea cuando se exede de
H'FF'
0 = No hubo accareo del bit ms significativo

Breve instroduccin de las INSTRUCCIONES

Cada instruccin tiene una ancho de 14 Bits, es por eso que la memoria de
programa tiene el mismo ancho. Justamente para poder alojar cada instruccin.
Las instrucciones, estn divididas en tres grupos. Los cuales son:

Byte-Oriented operation (Byte-Orientando a la operacin)


Bit-Oriented operation (Bit-Orientando a la operacin)
Literal and Control operation (Control y Literal de la operacin)

Primer grupo Byte-Oriented operation


Cada instruccin de este grupo est compuesta por:

OPCODE (Cdigo)
DESTINATION (Destino)
FILE REGISTER ADDRESS (Direccin del archivo de registro)

El OPCODE o cdigo, es el cdigo de cada instruccin y que es nica para cada


instruccin. Est formada por los bit del 13 al 8.
El DESTINATION o el destino, indica en dnde se va a guardar el dato.Por ejemplo,
si hacemos una suma, tenemos dos opciones dnde guardarlo, una puede ser el
registro W y la otra opcin puede ser otro registro cualquiera o una pocicin de la
RAM. Est formada por el bit 7.
La constante que nos indica esto es la letra d. Si esta letra es 0, la operacin se
guardar en el registro W. EN cambio si vale 1, la operacin se guardar en el
registro o pocicin de memoria que estemos trabajando al momento de usar una
instruccin.
Hay instrucciones, como veremos ms adelante, que no es necesario indicar dnde
queremos guardar la operacin, ya que se hace en forma automtica. Y hay otras
instrucciones que si no se indica el destino, nos puede dar un error al compilar o el
compilador lo eligir el y por ende, nos puede ejecutar mal el programa.
Y por ltimo, tenemos el FILE REGISTER ADDRESS que se carga con la direccin del
registro a ser guardado. Est formada por los bit 6 al 0. La constante que nos
indica esto, es la letra f
Segundo grupo Bit-Oriented operation
Cada instruccin de este grupo est compuesta por:

OPCODE (Cdigo)
BIT ADDRESS (Bit de direccin)
FILE REGISTER ADDRESS (Direccin del archivo de registro)

OPCODE es igual al primer grupo. Est formado por los bits 13 al 10.
El BIT ADDRESS, se utiliza para direccionar la operacin. Est formado por los bits
9 al 7. Como pueden observar, se sacrific bit del opcode para drcelo al bit
address. La constante que nos indica esto es la letra b
Y por ltimo tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Est
formado por los bit 6 al 0. Igual que en el primer grupo. la constante que nos indica
esto es la letra f.
Tercer grupo Literal and Control
Cada instruccin de este grupo, est compuesta por:

OPCODE
LITERAL

OPCODE es igual que en el primer grupo. Est compuesta por los bits 13 al 8.
Exepto para las instrucciones CALL y GOTO que est compuesta por los bit 13 al 11
(prestar mucha atencin a esto, cuando veamos estas dos instrucciones entendern
la importancia).
Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para
cargar al registro W, en fin, un nmero decimal, binario o hexadecimal. O puede
ser una valor de direccin a dnde apuntar para las instrucciones CALL y GOTO.
Est compuesta por los bits 7 al 0. Exepto para las instrucciones CALL y GOTO que
est compuesta por los bit 10 al 0 (prestar mucha atencin a esto, cuando veamos
estas dos instrucciones entendern la importancia).
Est adjuntado las 35 instrucciones agrupadas por los tres grupos
Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro
STATUS y otras no.

Las instrucciones
Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas de
memoria. Si, leyeron bien, de memoria. Lo que tienen que saber sobre las
instrucciones, es como se escriben, que hace cada instruccin y lo ms importante
que bit del REGISTRO afecta.
Vamos a ir vindolo por orden alfabtico. Y otra cosita ms, como es de esperarce,
estn en INGLES o son abreviaturas pero en INGLES.
Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en
Hexadecimal; B'01111011' es en binario.

ADDLW
Suma un valor designado por el programador al registro W
Ejemplo
Cdigo:

ADDLW

.128

Si W tena cargado un valor = .5, despus de la instruccin W tiene cargado el valor


.133
Para recordar, ADD es sumar, L es Literal y W es el registro W
Afecta a:

Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ADDWF
Suma el valor del registro W con el valor de un registro cualquiera. El destino de
esta suma, lo elige el programador.
Ejemplo:
Cdigo:

ADDWF

TEMP,W

Si W tena guardado .133 y la pocicin de la RAM llamada TEMP tena el valor


cargado con .2, W vale .135 y TEMP contina valiendo .2
Ahora si hubiera puesto as:
Cdigo:

ADDWF

TEMP,F

TEMP valdra .135 y W valdra .133


Para recordar, F, es File Register Address.
NOTA: Para indicar la direccin de dnde se guarda, tambin se puede poner 0 o 1
en vez de W o F. 0, corresponder guardarlo en el registro W y 1 en el registro TEMP
(para este caso).
Afecta a:

Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'

ANDWF
Realiza la operacin AND entre W y un registro designado por el programador. El
destino de esta operacin lo elije el programador.
Ejemplo:
Cdigo:

ANDWF

TEMP,F

Si antes de la instruccin W vale B'11100011' y TEMP vale B'00111010' Despus de


la instruccin TEMP vale B'00100010' y W vale B'11100011'
Afecta a:

Z Se pone a 1 si la operacin es 0

BCF
Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.
Ejemplo:
Cdigo:

BCF

TEMP,2

Antes de la instruccin TEMP vale B'11111111'. Despus de la instruccin TEMP


vale B'11111011'
Para recordar, Bit Clear es borrar File es archivo o registro
No afecta ningn bit del registro Status.
BSF
Pone a 1 el bit de un registro. El bit debe ser indicado por el programador.
Ejemplo:
Cdigo:

BSF

TEMP,0

Antes de la instruccin TEMP vale B'01110110'. Despus de la instruccin TEMP


vale B'01110111'
Para recordar, Bit Set es poner a 1 File Archivo o registro
No afecta a ningn Bit del registro Status.
BTFSC
Salta un lnea si el bit de un registro es cero. El bit debe ser indicado por el
programador.
Ejemplo:
Cdigo:

BTFSC
BCF
BSF

TEMP,5
PORTA,0
PORTB,0

Caso 1:
TEMP vale B'00011110'. El CP analizar solo el Bit 5 del registro TEMP, como es 0,
salta la instruccin BCF PORTA,0 y ejecuta la siguiente lnea que es BSF PORTB,0 y
continua haciendo la instruccin.
Caso 2:
TEMP vale B'00111000'. El CP analizar solo el Bit 5 del registro TEMP, como es 1
no salta la instruccin y har la instruccin BCF PORTA,0 y luego continua con la
instruccin BSF PORTB,0
Para recordar Bit Test es chequear File Skip es salto Clear
No afecta a ningn Bit del registro Status.
BTFSS
Salta una lnea si el bit de un registro es 1. EL bit debe ser indicado por el
programador.
Ejemplo:
Cdigo:

BTFSS
ADDWF
ANDWF

TEMP,3
PORTC
NODO

Caso 1:
TEMP vale B'01101100'. El CP analizar solo el Bit 3 del registro TEMP, como es 1,
salta la instruccin ADD PORTC y ejecuta la siguiente lnea que es ANDWF NODO y
continua haciendo la instruccin.
Caso 2:

TEMP vale B'11110000'. El CP analizar solo el Bit 3 del registro TEMP, como es 0
no salta la instruccin y har la instruccin ADD PORTC y luego continua con la
instruccin AND NODO.
Para recordar Bit Test es chequear File Skip es salto Set
No afecta a ningn Bit del registro Status.

Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO o CALL


pero no la he puesto porque an no se explicaron estas instrucciones.

CALL
Se digire a una direccin de la memoria de programa designado por el
programador. En otras palabras, se utiliza para dirigirce a una rutina o tarea. Su
principal ventaja es que una vez que finaliz la tarea, vuelve al punto siguiente
desde dnde se llamo.
Ejemplo :
Cdigo:

CALL

ESC_PORTB

Para recordar, CALL es llamada.


No afecta ningn bit del registro Status.
-------------------------------------------------------------------------------------------------------------------------------------------Hacemos una exepcin con respecto a ver las instrucciones por orden alfabtico y
veremos la instruccin GOTO.
-------------------------------------------------------------------------------------------------------------------------------------------GOTO
Se digire a una direccin de la memoria de programa designado por el
programador. En otras palabras, se utiliza para saltar instrucciones que no
queremos que se ejecuten. A diferencia de la instruccin CALL, no hay forma de
volver cuando se ejecuta la instruccin.
Ejemplo:
Cdigo:

GOTO

INICIO

Para recordar GO TO es ir a.
No afecta a ningn bit del registro Status.
Extendiendo la explicacin.

Vamos a hablar del PC para entender bien sobre estas instrucciones. La excelente
explicacin que continua, por desgracia no es ma (ojal fuera mi explicacin), son
de las personas Maunix y BrunoF (del foro todopic)
En la siguiente imagen, vemos el diagrama de bloques del PC o CP.

El PC es de 13 bits en este caso(8kwords). 14 son los bits de cada "word" o


instruccin que se graban en cada posicin de la FLASH (memeria de programa).
El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5 restantes
en el registro PCLATH.
Los pics al tener un set de instrucciones reducido no puede en una sola instruccin
meter todos los bits necesarios para direccionar toda su memoria.
EL program counter son 2 registros, el PChigh y PCLow . Cuando haces un CALL o
un GOTO, solo se rellenan 11 bits (los 8 del PClow y 3 del PChigh) y los restantes 2
los rellenas con el PCLATH (para completar los 13bits).
El STACK (pila) tiene toda la direccin, no solo parcial. Si haces un call desde la
pagina 0 a la pgina 3 y luego un return el cdigo SI volver a la pgina 0, pero
el PCLATH sigue apuntando a la pgina 3, entonces si usas otro goto o call, debes
tener en cuenta de modificar el PCLATH.
Entnces, dijimos que:
El PC = ProgramCounter o CP = Contador de Programa, tiene 13 bits; del 0 al 12.
Al ejecutar un call o un goto, se copian del 0 al 10, y los otros 2 bits se copian del
registro PCLATH. El pclath solo estar all para esa situacion.
En un return o retfie la microelectronica del PIC, pega la direccin del PC que
estaba guardada.
Lo vemos con un ejemplo

1.
STACK = vaco
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230
2. El STACK tiene en su posicin 0 la direccin 0x00A0.
PC = 111000110000
3. Se ejecuta la subrutina y en ese punto el PC ya qued en
PC = 111000110111
4. Viene un RETURN.

La microelectrnica del PIC copiar el stack tal cual en el program counter + 1


Valor STACK 0x00A0 + 1 --> PC = 0x00A1
5. EL cdigo sigue ejecutandose en la pgina 0 pero hay que tener en cuenta que el
PCLATH apunta a la pgina 3 por ello si hars otro CALL o GOTO, debers cambiar
de nuevo el PCLATH si la subrutina no est en la pgina 3.
Para cerrar el tema
Vamos a entrar a todo detalle en el Program Counter(PC) para que se vayan todas
las dudas ya que es muy importante. Vayamos al tema tema del PC, computed
goto(lo que algunos llaman "tabla"), call, returns y goto.
El Program Counter(PC) est conformado en esta familia de uC(y refiriendonos a la
familia 16F, las otras poseen ms o menos bits implementados) por 13 bits
repartidos entre dos registros: PCH y PCL.
El PCL es legible/escribible directamente a traves del registro fsico PCL(valga la
redundancia). En cambio, el PCH no es directamente accesible. No puede ser ledo,
y slo puede se grabado mediante un buffer que contiene el valor
temporalmente(oh! aqu aparece nuestro famoso PCLATH). Entonces, recordar: El
PCLATH es slo un buffer temporal que almacena los 5 bits de mayor peso del PC
para ser escritos cuando se ejecute una instruccin que lo requiera.
Ahora, hay dos situaciones posibles en las que el PC debe ser cargado de manera
distnta: una es cuando queremos trabajar con tablas y otra cuando realizamos un
call o un goto que no est en el msmo banco.
1era situacin: Tabla(Comuted Goto)
La tabla es una situacin de uso del PC en la que se afecta directamente al registro
PCL. Cuando se afecte directamente al PCL mediante una instruccin, es necesario
que el usuario asegure que PCLATH tenga sus 5 bits pre-cargados adecuadamente.
Hago un ejemplo:
Mal:
org 0x000
movlw 0x01
call tabla

org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....
Bien:
org 0x000
movlw 0x03

movwf PCLATH
movlw 0x01
call tabla

org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....
Mejor:
org 0x000
pageselw tabla
movlw 0x01
call tabla

org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....
Pageselw es una instruccin del MPASM que genera dos instrucciones: un movlw
literal y un movwf PCLATH. El valor del literal es automticamente seleccionado por
el ensamblador segn la etiqueta(o posicin de memoria) que se le especifique. En
el caso anterior pageselw tabla generara estas dos instrucciones:
movlw 0x03
movwf PCLATH
Si no aseguramos que los 5 bits del PCLATH estn correctamente seteados al
momento de afectar al PCL mediante alguna instruccin(generalmente es la addwf,
pero puede usarse subwf y muchas otras) entonces el programa saltar a una
posicin indeseada.

2da situacin: CALL y GOTO


En esta familia de uC, cada instruccin es codificada en 14 bits. En el caso de las
instrucciones CALL y GOTO, su estructura es la siguiente:
F2 F1 F0 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0
Donde las F indican cul instruccin es la que debe ejecutarse(100 para la CALL
101 para la GOTO), y las k corresponden a la direccin a la cual queremos
llamar(con un CALL) o saltar(con un GOTO).

Aqu se ve claramente un problema. Podemos ver que un CALL o un GOTO slo


almacena 11 bits de la direccin a la cual debe ir. 11 bits es un mximo 2048
posiciones. Qu pasa cuando un uC posee ms de 2k de memoria Flash entonces?
Por ejemplo, un 16F877A posee 8k de memoria Flash. Cmo hara para llamar a
una subrutina que est ms all de la posicin 2047 de la flash?
La solucin nuevamente se encuentra en el PCLATH(y es nuevamente el usuario el
que tiene el deber de pre-cargar el valor adecuado).
Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta
8kwords(una word es en esta familia un conjunto de 14 bits que conforman una
instruccin la cual se aloja en la memoria FLASH del uC). Un CALL o un GOTO slo
contienen los 11 bits de menor peso de la direccin a la cual ir, por lo que los 2 bits
restantes debern ser pre-cargados en los bits 4 y 3 del registro PCLATH por el
usuario programador.
Cuando se ejecuta una instruccin CALL o GOTO, es imprescindible que el registro
PCLATH est correctamente precargado. La instruccin a la que el uC ir estar
conformada por 13 bits y ellos sern:
PCLATH,4 PCLATH,3 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0
Cabe mencionar que el uC carga a PC<10:0> con el valor pasado por los 11 bits de
K, y a PC<12:11> con el valor de los bits PCLATH<4:3>. El registro PCLATH no es
modificado de ninguna manera. Slo se leen esos dos bits.
Por ejemplo, en un uC de 8kWords hay 4 pginas. Una pgina cada 2048 words. Si
se est en una pgina y se quiere ir a otro es necesario precargar antes dichos bits
del PCLATH para poder hacerlo.
El usuario no debe preocuparse por precargar el PCLATH en dos sitaciones:
Si el uC no posee ms de 2kWords de memoria Flash;
O si en el cdigo creado por el usuario, no se utiliza la memoria FLASH ms all de
la posicin 2047(0x7FF).
Si ocurre al menos uno de esos dos casos, es suficiente con asegurar que los bits
PCLATH<4:3> se encuentren ambos en cero.
Vamos con un par de ejemplos:
Mal:
org 0x000 ;Esto es pgina0
call cruzo

org 0x800 ;Esto ya es el pgina1


cruzo
retlw 0xFF
.....

Bien:

org 0x000 ;Esto es pgina0


movlw 0x08
movwf PCLATH
call cruzo

org 0x800 ;Esto ya es el pgina1


cruzo
retlw 0xFF
.....

Mejor:
org 0x000 ;Esto es pgina0
pagesel cruzo ;automaticamente seleccionar banco
call cruzo

org 0x800 ;Esto ya es el pgina1


cruzo
retlw 0xFF
.....

Pagesel es una instruccin del MPASM que genera dos instrucciones: un bcf/bsf
PCLATH,3 y un bcf/bsf PCLATH,4. El software ensamblador selecciona
automticamente la instruccin bcf o bsf segn el banco en el cual se encuentra la
etiqueta(o posicin de memoria) que se le especifique. En el caso anterior pagesel
cruzo generara estas dos instrucciones:
bsf PCLATH,3
bcf PCLATH,4
Ya que la subrutina cruzo se encuentra en la pgina1.
Finalmente, cuando se ejecuta una instruccin CALL, se carga en el STACK el valor
de la posicin actual ms 1(es decir, se guarda en el STACK el valor PC+1). Se
guardan los 13 bits, por lo que durante las instrucciones RETURN,RETLW y RETFIE
no es necesario precargar al PCLATH.
Para ms informacin, ver el esquema seccin 2.3 del datasheet de los PIC16F87XA
que habla de cmo cargar al PC segn cada situacin.

CLRF
Borra el contenido de un registro seleccionado por el programador. La forma en que
lo hace, pone en 0 los 8 bit del registro. Este registro, puede ser cualquiera de la
pocicin de la RAM.
Ejemplo:
Cdigo:

CLRF

PORTB

Antes de la instruccin PORTB vale B'11000111'. Despus de la instruccin PORTB


vale B'00000000'
Para recordar CLeaR es limpio File es archivo o registro.
Afecta a:

Z Se pone a 1

CLRW
Borra al registro W. La forma en que lo hace, pone en 0 los 8 bit del registro.
Ejemplo:
Cdigo:

CLRW
Antes de la instruccin W vale B'00000111'. Despus de la instruccin W vale
B'00000000'.
Para recordar CLeaR es limpiar Work es trabajo.
Afecta a:

Z Se pone a 1

CLRWDT
Borra al WDT. La forma en que lo hace, pone en 0 al mismo.
Ejemplo:
Cdigo:

CLRWDT
Antes de la instruccin WDT vale B'11111110'. Despus de la instruccin vale
B'0000000'.
Para recordar CLeaR es limpiar Watch Dog es perro guardian Timer es contador.
Afecta a:

TO (neg) Se pone a 1
PD (neg) Se pone a 1

NOTA: El WDT o el contador perro guardian, sirve para destrabar al PIC. Cada vez
que se desborda, o sea, cada vez que pasa de H'FF' a H'00', produce un reset, y
como es un reset, se dirige a la pocicin 0h de la memoria de programa.
La forma de trabajar con el, es ir poniendo en lugares estratgicos la instruccin ya
explicada, de esta manera evitamos el desborde del contador. Si el CP se traba en
algn bucle o algo similar, al no limpiar el contador, el WDT desbordar y llevar al
CP a la pocicin 0h de la memoria de programa.
Muchas veces se evita de usar esta herramienta por no tener que calcular por todo
el programa dnde y cuando limpiar al WDT. Es recomendable su uso.

COMF
Realiza el complemento de un registro.
Cdigo:

COMF

TEMP,F

Si TEMP tena guardado B'00111101' luego de ejecutar la instruccin TEMP vale


B'11000010'. Notese, que aqu tambin podemos elegir el destino y esto nos deja
guardarlo en el registro W si as lo requerimos.
Para recordar COMlement es complemento File es registro.
Afecta a:

Z Se pone a 1 si la operacin da 0

DECF
Decrementa en una unidad, o lo que es lo mismo, resta 1 el contenido de un
registro
Cdigo:

DECF

DECENA,W

Si antes de la instruccin DECENA vale .255, despus de la instruccin W vale .254


y DECENA vale .255 Si por el contrario, hubieramos elegido el destino F, despus
de la instruccin DECENA vale .254
Para recordar DECrement es decremento File es registro.
Afecta a:

Z se pone a 1 si la operacin es 0

DECFSZ
Decrementa en uno, o lo que es lo mismo, resta en 1 el contenido de un registro y
cuando este vale 0, el CP salta una instruccin
Cdigo:

LOOP

DECFSZ
GOTO
BCF

TEMP
LOOP
PORTB,0

El CP descontar en 1 el registro TEMP y evala el valor, si no es cero, ejecuta lnea


siguiente que es GOTO LOOP, el cual se dirige de nuevo a la lnea LOOP DECFSZ
TEMP el cual volver a descontar en 1 y evalua el valor, si es cero salta la lnea
GOTO LOOP y ejecuta la instruccin BCF PORTB. Esta ltima lnea, el programador
pondr la instruccin que necesite ejecutar.
Este pequeo programa que acabamos de ver, es un temporizador o un retardo que
tardar en salir del bucle dependiendo de la frecuencia de reloj y el valor cargado
en TEMP.

NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se
exprese, como en este caso, el MPLAB dar por sentado que el resultado se
guardar en el registro F y no en W.
Para recordar DECrement es decremento File es registro Skip es salto Zero que es
cero.
No afecta ningn bit del registro STATUS.

INCF
Incrementa en 1, o suma 1, el contenido de un registro elegido por el programador.
Cdigo:

INCF

INDF,F

Si antes de la instruccin INDF vale H'29', despus de la instruccin INDF vale


H'2A'. Notese que tambin podemos elgeir el destino. Si hubieramos elegido W,
despus de la instruccin W vale H'2A' y INDF vale H'29'.
Para recordar INCrement es incremento File es registro.
Afecta a:

Z se pone a 1 si el resultado es 0

INCFSZ
Incrementa en 1, o suma en 1, el contenido de un registro elegido por el
programador y cuando este es 0, el CP salta una instruccin.
Cdigo:

VOLVER

INCFSZ
GOTO
INCF

CONTADOR
VOLVER
PORTA

El CP incrementar en 1 el registro CONTADOR y evala el valor, si no es cero,


ejecuta lnea siguiente que es GOTO VOLVER, el cual se dirige de nuevo a la lnea
VOLVER INCFSZ CONTADOR el cual volver a incrementar en 1 y evalua el valor, si
es cero salta la lnea GOTO VOLVER y ejecuta la instruccin INCF PORTA. Esta
ltima lnea, el programador pondr la instruccin que necesite ejecutar.
Este pequeo programa que acabamos de ver, es un temporizador o un retardo que
tardar en salir del bucle dependiendo de la frecuencia de reloj y el valor cargado
en CONTADOR. Normalmente, se utiliza el retardo con DECFSZ pero este tambin
es vlido.
NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se
exprese, como en este caso, el MPLAB dar por sentado que el resultado se
guardar en el registro F y no en W.

Para recordar INCrement es incremento File es registro Skip es salto Zero es cero.
No afecta ningn bit del registro STATUS.
IORLW
Realiza la operacin OR entre W y un literal elegido por el programador. El
resultado se guarda en W. La operacin es W OR L.
Si antes de la instuccin W vale B'01110100' y el literal elegido es B'00011111',
despus de la instruccin W vale B'01111111'.
Para recordar Inclusive es inclusivo OR es la operacin binaria OR Literal es
literal W es el registro trabajo.
Afecta a:

Z se pone a 1 si la operacin da 0

IORWF
Realiza la operacin lgica OR entre el registro W y un registro elegido por el
programador. La operacin es W OR F.
Cdigo:

IORWF

PORTC,F

Si antes de la instruccin W vale B'01111111' y PORC vale B'00001111' despus de


la instruccin PORTC vale B'01111111' y W vale B'01111111'. Notese que podemos
elegir el destino y la otra opcin, como ya se dieron cuenta por las instrucciones
pasadas, puede ser W.
Para recordar Inclusive es inclusivo OR es la operacin binaria OR W es el registro
trabajo y File es registro.
Afecta a:

Z se pone a 1 si el resultado es 0

MOVLW
Carga al registro W con un literal elegido por el programador para luego hacer una
operacin matemtica o moverlo a otro registro como veremos ms adelante. Sin
duda alguna, una de las instrucciones ms usadas en la programacin ASM.
Cdigo:

MOVLW

.255

Si antes de la instruccin W vale .15, despus de la instruccin W vale .255.


Para recordar MOVe es mover Literal es literal W es el registro trabajo.
Como es de esperar, no afecta ningn bit del registro STATUS.
MOVF
Mueve el contenido de un registro a otro registro elegido por el usuario.
Cdigo:

MOVF

RETARDO,W

Si antes de la instruccin W vale H'2A' y RETARDO vale H'FF', despus de la


instruccin W vale H'FF'. Notese que aqu podemos elegir el destino, y tenemos la
posivilidad de elegir el destino al propio registro RETARDO. Al principio parece
innecesario, pero se puede tomar como una verificacin, ya que se ve afectado el
registro STATUS bit Z.
Para recordar MOVe es mover y File es registro.
Afecta a:

Z Se pone a 1 si la operacin es 0

Anteriormente, habamos dicho que esta instruccin se la puede tomar como


vereficacin, para saber si se guard con el mismo valor que tena, el bit Z se pone
a 1 si el valor es igual al que tena cargado.

MOVWF
Mueve el contenido del registro W a un registro cualquiera elegido por el
programador. Sin duda alguna, esta instruccin, es otra muy usada en la
programacin ASM
Cdigo:

MOVWF

ADCON0

Si antes de la intruccin W vale B'10000001' y ADCON0 vale 0x0, despus de la


instruccin ADCON0 vale 0x81.
Para recordar MOVe es mover W es el registro W y File es registro.
No afecta ningn bit del registro STATUS.
NOP
No realiza ninguna operacin. Solo consume un ciclo de instruccin.
Cdigo:

NOP
Para recordar No es no y OPeration es operacin.
No afecta ningn bit del registro STATUS.
RETFIE
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se
encontraba el CP antes de atender la interrupcin. Al mismo tiempo, pone a 1 el bit
GIE para activar de nuevo las interrupciones.
Cdigo:

RETFIE
Para recordar REturn es retornar From es de la IntErrupt es interrupcin.
No afecta ningn bit del registro STATUS.

Por ahora no. Hay mucho por aprender en la programacin ASM. Como armar un
programa, concejos a la hora de hacerlo.
Utilizacin de las rutinas y como armar libreras, luego como adjuntarlas a nuetro
nuevo programa, etc.

RETLW
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se
encontraba el CP desde dnde se llam a la subrutina y al retornar, lo hace con un
literal cargado en W especificado por el programador. Esta instruccin, se utilizan
en las tablas (para ms detalle, ver la explicacin del GOTO y CALL).
Ejemplo:
Cdigo:

RETLW

'L'

En este ejemplo, el MPLAB, carga en W el cdigo ASCII correspondiente a la letra L


Extendiendo el ejemplo:
Cdigo:

PAGESELW
TABLA
VOLVER AL LUGAR CORRECTO

;CONFIGURA AL PCLATH PARA

MOVFW
contador
LEER EN LA TABLA POR EJEMPLO 3
CALL
TABLA
TABLA
CALL
LCD_DATO
MOSTRA AL LCD
NOP
;
;
TABLA
ADDWF
PCL,F
CONTENIDO DE W POR EJEMPLO 3
RETLW
'1'
RETLW
'2'
RETLW
'3'
RETLW
'T'

;CARGA A W LA POCICIN A
;LLAMA A LA RUTINA
;LLAMA A LA RUTINA PARA

;SUMA AL PCL CON EL


;RETORNA
;RETORNA
;RETORNA
;RETORNA

CON
CON
CON
CON

1
2
3
4

ASCII
ASCII
ASCII
ASCII

Este es un ejemplo sencillo de como utilizar RETLW. Para interpretar este cdigo
empezamos desde PAGESELW, supongamos que el CP est en esta instruccin (que
est explicado que hace) luego pasa a la instruccin MOVFW contador y suponemos
que tiene cargado 3 en decimal, por lo que W pasar a tener 3 en decimal. El CP
continua con CALL TABLA, el CP saltar por encima a todas las dems instrucciones
y se dirige a la etiqueta TABLA y ejecuta la instruccin ADDWF PCL,F En el cdigo
hablamos que le suma 3 al PCL, por lo que saltar al RETLW '3' cargando a W con
el cdigo ASCII 3. Retorna justo debajo del CALL TABLA, o sea retorna a CALL
LCD_DATO y ejecuta la rutina correspondiente, cuando termina, regresa al NOP
(que puede ser cualquier instruccin que necesite el programador.
Si en cambio, contador hubiera tenido cargado 4 en decimal cuando llegue a la
tabla y le sume al PCL este apuntar a RETLW 'T' cargando en W el cdigo
correspondiente ASCII.
Para recordar RETurn es retornar Literal es literal W es el registro de trabajo W
No afecta ningn bit del registro STATUS.
RETURN
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se
encontraba el CP cuando se llam a la rutina o subrutina.
La diferencia con RETLW es que RETURN regresa sin cambiar a W. Este se utiliza
para terminar una rutina y no se necesite ningn dato. Por ejemplo en la rutina
CALL LCD_DATO no nos sirve que vuelva con ningn valor ya que es una rutina
para enviar datos a un LCD, asi que esta rutina tendr implementada RETURN
Por ejemplo:
Cdigo:

RETURN

No afecta ningn bit del registro STATUS


Para recordar RETURN es retornar.

RLF
Rota hacia la izquierda los bit de un registro seleccionado por el programador. El
destino de la operacin se puede elegir. Cada rotacin equivale a multiplicar por 2
si el bit C del registro STATUS es 0.
Ejemplo:
Cdigo:

RLF

PORTC,F

Si antes de la instruccin PORTC vale B'00001000', despus de la instruccin vale


B'00010000'. Si se hubiera elegido como destino W, PORTC despus de la
instruccin continua valiendo B'00001000' y W vale B'00010000'
Para recordar Rotate es rotar Left es izquierda File es el registro.
Afecta a:

C se pone a 1 si hubo acarreo

RRF
Rota hacia la derecha los bits de un registro seleccionado por el programador. El
destino de la operacin se puede elegir. Cada rotacin equivale a dividir por 2 si el
bit C del registro STATUS es 0.
Ejemplo
Cdigo:

RRF

PORTB,F

Si antes de la instruccin PORTB vale B'10000000' despus de la instruccin PORTB


vale B'0100000'. Si se hubiera elegido como destino W, PORTB despus de la
instruccin continua valiendo B'10000000' y W vale B'01000000'
Para recordar Rotate es rotar Right es derecha File es el registro.
Afecta a:

C se pone a 1 si hubo acarreo

Extendiendo la explicacin de las instrucciones RRF y RLF

A la hora de utilizar estas dos instrucciones, hay que prestarle atencin al bit C del
registro STATUS. La razn de esto, es porque la rotacin se hace atravz del bit C.
Supongamos que tenemos lo siguiente:

BIT C = 0
TEMP = B'00010000'

Ejecutamos la instruccin RRF y TEMP vale B'00001000'. O si ejecutamos la


instruccin RLF TEMP vale B'00100000'
Pero si ahora tenemos:

BIT C = 1
TEMP = B'00010000'

Ejecutamos la instruccin RRF y TEMP vale B'10001000'. O si ejecutamos la


instruccin RLF TEMP vale B'00100001'
Vemos como rota los bit dependiendo del valor del bit C. Pero anteriormente,
avamos dicho que estas dos instrucciones afectan al bit C. La actualizacin del bit
C, lo hace despus de la rotacin. Lo vemos con un ejemplo:
Cdigo:

MOVLW B'10001001'
MOVWF temp
BCF
STATUS,C
RLF
temp,F

;PONEMOS A 0 AL BIT C
;ROTAMOS A LA IZQUIERDA

Al ejecutar este programa, nos dar lo siguientes resultados:

TEMP = B'00010010'
BIT C = 1

Y para ver la diferencia vemos lo siguiente:


Cdigo:

MOVLW B'00000001'
MOVWF temp
BCF
STATUS,C
RLF
temp,F

;PONEMOS A 0 AL BIT C
;ROTAMOS A LA IZQUIERDA

Al ejecutar este programa, nos dar lo siguientes resultados:

TEMP = B'00000010'
BIT C = 0

Algo que me haba olvidado de mencionar pero que MIGSANTIAGO del foro
de TODOPIC estuvo atento es que ests dos instrucciones, nos sirve para enviar
datos en forma serial utilizando el bit C que lo veremos ms adelante.
Recordemos que, para utilizar estas instrucciones para multiplicar o dividir,
debemos asegurarnos de que el bit C, est en 0.
SLEEP
Pone al microcontrolador en bajo consumo.
Cdigo:

SLEEP
Para recordar SLEEP es dormir.
Afecta a:

TD se pone a 1
PD se pone a 1

SUBLW
Resta el contenido de W con un literal de hasta 8 bit (.255). El resultado se guarda
en W.
Cdigo:

SUBLW

.20

Si antes de la instruccin W vale .23 despus de la instruccin W vale .3 Para saber


si el resultado es negativo o positivo, hay que chequear el bit C del registro Status.
Si hay acarreo, el resultado es negativo, y por el contrario, si no hay acarreo es
positivo.
Para recordar SUBtraction es restar Literal es literal y W es el registro W.
Afecta a:

Z se pone a 1 si el resultado es 0
DC se pone a si hay acarreo del bit del 4 al 5 bit del registro (recordemos
que en la resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).
C se pone a 0 si hubo acarreo (recordemos que en la resta, es distinto a la
suma, por eso, se pone a 0 si hubo acarreo).

SUBWF
Resta el contenido de un registro seleccionado por el programador con el contenido
del registro W. La frmula es F - W = d. d es la direccin elegida por el
programador en dnde se guardar el resultado que puede ser el registro W o el
registro elegido por el programador.
Ejemplo:
Cdigo:

SUBWF

MINUENDO,W

Si antes de la instruccin W vale .55 y MINUENDO vale .56, despus de la


instruccin, MINUENDO vale .56 y W vale .1
Para recordar SUBtraction es resta W es el registro W y File es el registro elegido.
Afecta a:

Z se pone a 1 si el resultado es 0
DC se pone a 0 si hubo un acarreo del 4 bit al 5 bit (recordemos que en la
resta, es distinto a la suma, por eso, se pone a 0 si hubo acarreo).
C se pone a 0 si hubo acarreo del 7 bit. (recordemos que en la resta, es
distinto a la suma, por eso, se pone a 0 si hubo acarreo).

SWAPF
Intercambia los bits de un mismo registro elegido por el programador. Los 4 bit de
menor peso, pasan a ser lo 4 bits de mayor peso, y los 4 bits de mayor peso, pasan
a ser los 4 bits de menor peso. El destino puede ser seleccionado.
Cabe pensar que puede ser una instruccin de muy poco uso, pero todo lo contrario
si se utilizan con las interrupciones. Microchips recomienda su utilizacin a la hora
de salvar el contexto y restaurarlo en una interrupcin ya que no modifica el
registro STATUS. Cuando trabajemos con la interrupciones, se ver que es muy
recomendable salvar el registro STATUS y W en la RAM para luego restaurarlos. Si
utilizamos la instruccin MOVF, es afectado el bit Z, perdiendo su estado original en
el momento de la interrupcin. Esto se soluciona, utilizando la instruccin SWAPF.
No se preocupen si no lo entiende por ahora. Lo entenderan cuando veamos
ejemplo de interrupciones.
Ejemplo:
SWAPF STATUS,W

Si antes de la instruccin W bale H'55' y el registro STATUS vale B'00100100',


despus de la instruccin el registro STATUS vale H'24' y el registro W vale
B'01000010'
Para recordar SWAP es intercambiar NIBBLE es porcin File es el registro.

No afecta ningn bit del registro STATUS.


XORLW
Realiza la operacin lgica XOR entre un literal o valor y el registro W. El resultado
queda guardado en el registro W.
Ejemplo:
Cdigo:

XORLW

B'11000101'

Si antes de la instruccin W vale B'11111000', despus de la instruccin W vale


B'00111101'.
Para recordar XOR es la operacin lgica XOR Literal es un valor W es el registro
W.
Afecta a:

Z se pone a 1 si la operacin es 0

XORWF
Realiza la operacin XOR entre un registro elegido por el programador y el registro
W. La operacin es F XOR W = d. El resultado se puede elegir dnde ser
guardado.
Ejemplo:
Cdigo:

XORWF

PORTB,F

Si antes de la instruccin PORTB vale B11111110' y W vale B'00000001', despus


de la instruccin W vale .1 y PORTB vale B'11111111'.
Para recordar XOR es la operacin lgica XOR W es el registro W y File es el
registro elegido.
Afecta a:

Z se pone a 1 si la operacin es 0

Una vez que vimos todas las instrucciones y asumiendo que ya se la saben de
memoria (tiempo tuvieron de sobra) y si no lo han echo, es hora de hacerlo,
empezemos a escribir programas muy sencillos. Pero cmo?. Si se estn asiendo

esta pregunta, es hora de leer desde el primer mensaje. Tienen que acordarce las
pociciones de las cuatro columnas.
Recuerden que vamos a escribir los programas en el MPLAB, por lo que si an no lo
tienen, es hora de descargarlo de la pgina de Microchip en forma gratuita e
instalarlo en la PC. Lamentablemente, este programa trabaja solo bajo windows,
por los que tienen mac o Linux, no lo prodrn hacer si no es por un emulador de
windows y an as, no se si funcione correctamente.
Empezaremos bien desde el principio y para ello, voy a explicar cosas nuevas. Todo
programa tiene un encabezado que se repite en cada programa nuevo y que vara
segn el PIC a utilizar y las prestaciones del programa a escribir. Muchas de las
personas crean plantillas nuevas para ahorrarce el trabajo. Yo soy una de ellas y
aqu les doy una plantilla que pueden utilizar sin problemas y modificarlas segn su
necesidad.
He aqu la plantilla que tambin est adjuntado.
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;--------------------------------------------------------------;VARIABLES.
;--------------------------------------------------------------;
CBLOCK H'20'
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIN
INTERRUP
;
INICIO
;
END
Primera lnea:
LIST P=16F877A
Esta lnea, sive solo para el MPLAB y le indica que el PIC a utilizar es el 16F877A.
Se debe actualizar segn sea necesario.
Segunda lnea:
INCLUDE <P16F877A.INC>
Esta lnea sirve a la hora de compilar ya que dentro de este archivo que viene
incluido dentro del MPLAB, le indica al ensamblador dnde estn ubicados cada
registro y el nombre de cada bits del PIC a utilizar as, nos ahorra de hacerlo

nosotros mismos. Si desean abrir el archivo, lo pueden hacer con el notepad o


cualquier editor de texto. Se debe actualizar segn sea necesario.
Tercera lnea:
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
Linea muy importante pero se puede omitir. Aqu se configura la palabra de
configuracin del PIC y que est en el datasheet del pic correspondiente.
En mi caso, yo la omito y luego lo configuro desde el ICPROG a la hora de pasar el
archivo .hex al pic. Es por eso que esta lnea est incompleta para el pic a utilizar
pero completa para el PIC 16F84.
Vemos en ms detalle esta lnea: __CONFIG Directiva para el ensamblador de que
debe generar la palabra de configuracin correspondiente de acuerdo a:
_CP_OFF la proteccin de lectura del PIC desabilitado.
_PWRTE_ON Reset de encendido habilitado
_WDT_OFF Perro guardin desabilitado.
_XT_OSC Oscilador a cristal.
El caracter & sirve para unir una directiva con otra.

Cuarta lnea:
;
;--------------------------------------------------------------;VARIABLES.
;--------------------------------------------------------------;
Este no es ms que un pequeo encabezado. El ensamblador omitir estas lneas y
solo porque empieza con ";". Recuerden que, toda lnea que empieze con ";" es
comentario y el ensamblador la omitir.
Justo por debajo de este encabezado, penemos las variables. a que le llamo
variables? a pociciones de memorias o nombre de bit que yo quiera darle
personalmente.
Por ejemplo, dentro del archivo P16F877A.INC a la pocicin de memoria 0x05 le
llama PORTA pero si yo quero llamarlo PUERTO_A, es qu dnde le indico al
ensamblador.
Cmo se hace?
Es muy fcil y con la instruccin "EQU"
PUERTO_A EQU H'05'
Si al Bit RA6 lo quero llamar LED6 lo hacemos as:
LED6 EQU 6

Supongamos que quiero encender el LED 6 que est en el Puerto a bit 6, y este se
activa con un 1 lgico, ponemos esta instruccin:
BSF PUERTO_A,LED6
Y el ensamblador lo traducir as: BSF 0X05,0X06
Quinta lnea:
CBLOCK H'20'
ENDC
A estas dos lneas las unifique porque van juntas. Entre ellas van los nombres de
cada pocicin de la RAM que nosotros querramos nombrar, o cada Registro que
querramos renombrar.
Recuerden que los registros estn implementados en la RAM y que la pocicin de la
RAM que puede utilizar el usuario para guardar cosas, empieza desde una pocicin
que est indicada en el datasheet. Para el caso de 16F877 empieza desde la
pocicin 0x20 como lo ven en la figura siguiente.
(Ver archivo adjunto)
La directiva CBLOCK H'20' indica que empezamos a nombrar pociciones de
memoria desde la ubicacin 0x20. Por ejemplo
CBLOCK H'20'
temperatura
demora1
demora2
ENDC
La pocicin 0x20 se llama temperatura, la pocicin 0x21 se llama demora1 y as
sucesivamente. Tambien existe otra forma de nombrar o renombrar pociciones de
memoria o registro, y ya lo vimos que es con la directiva EQU. por ejemplo:
temperatura EQU H'20'
demora1 EQU H'21'
demora2 EQU H'22'
Sexta lnea:
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIN
INTERRUP
He unificado estas lneas porque por lo general as se escribe en la mayora de
nuestros programas. Vemos con ms detalles estas lneas.
RESET ORG H'00'
Aqu es en dnde empieza el CP cuando se enciende al PIC. Y estos se debe, porque

cuando hay un reset por el pin MCLR o un reset interno producido por, encendido
del PIC o, por ejemplo, del perro guarda, el vector reset se ubica en la pocicin
0x00 de la memoria de programa.
Como pueden apreciar, hemos llamado a la pocicin 0x00 con el nombre de RESET,
ya que la primer columna es una etiqueta. Las etiquetas sirven para nombrar
pociciones de memoria de programa.
ORG H'00' indica que se empieza a escribir desde la pocicin 0x00 por lo que la
siguiente instrucin, quedar alojada en la pocicin 0x00. ORG es una directiva, y
solo sirve para el ensamblador. Esta lnea, SIEMPRE debe estar y no se puede
modificar, salvo la etiqueta.
Siguiente lnea es GOTO INICIO, esta instruccin queda alojada en la pocicin 0x00
y es un salto a la etiqueta INICIO. Este salto tiene que estar, porque en las
siguientes pociciones de memoria de programa, est la interrupcin, externa e
interna del PIC. Por eso es necesario hacer el salto.
Siguiente lnea nos encontramos con ORG H'04', como se dieron cuenta, es una
directiva. Esta pocicin de memoria, indica el vector de interrupcin. Cuando estn
habilitadas las interrupciones y una de ella se activa, el CP apuntar aqu, a la
pocicin 0x04.
Siguiente lnea nos encontramos con la etiqueta INTERRUP. Si trabajamos con las
interrupciones, aqu es donde escribiremos lo que necesitamos hacer con ellas.
Sptima lnea:
;
INICIO
;
Vemos la etiqueta INICIO. Aqu vendr el CP cuando alla un reset gracias al GOTO
INICIO ubicado en la pocicin 0x00 de la memoria de programa. De esta manera,
saltamos un montn de instrucciones que no debemos ejecutar antes. Como por
ejemplo las interrupciones si hubiese.
Por ende, a partir de esta etiqueta, estar nuestro programa principal.
Configuraremos los puertos, las insterrupciones y empezaremos a darle trabajo al
CP.
Octava lnea:
END
Esta es una directiva y solo sirve para el ensamblador indicando que despus de
esta directiva, se termin el programa. Instruciones que estn por debajo de esta
lnea, no sern tenido encuenta. Y esta directiva es obligatoria colocarla.

Funcion SUBLW

Excelente trabajo!. Me venia cabeceando con mil cosas que no lograba comprender
y con este tutorial se fue aclarando y aclarando.
Hay algo que aun no comprendo.
Con las operaciones de SUBxx y el resultado es negativo comprendo lo del acarreo,
pero el valor que adopta el registro como es?
Lo pongo en un ejemplo
Si W= .10
SUBLW .5

Cuanto vale W luego de la operacion? W=.0 W=.5 W=.250? o como lo calcula?


Perdon por la molestia
No es ninguna molestia.
El .10, no es con coma, si no quiere decir que el valor es decimal, o sea, en la
forma en que nosotros escribimos los nmeros (con base en 10).
Si estubiera expresado como W = 0x10, sera 10 en hexadecimal, y en decimal
corresponde 15
Se entiende?
Hola, si
W=.10 y haces
SUBLW .5
es lo mismo que decir W=5-10 ya que W siempre es el sustraendo, as que el
resultado te da -5 teniendo en cuenta que el acarreo se pone en 0 despus de esta
operacin.
Correcto. Chequeando el bit C, sabes si es negativo o positivo el resultado
obtenido.

(Continuara)

También podría gustarte