3.0 U3. Microprocesadores SR

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 33

UNIDAD 3

CARACTERÍSTICAS ESPECÍFICAS DE MICROPROCESADORES


DE 8 BITS

OBJETIVO
El estudiante conocerá los detalles internos y operativos del microcontrolador
que se utilizará para las prácticas que se indicarán en este libro e identificará el
set de instrucciones del micro para elaborar los primeros programas en
ensamblador; además, reconocerá el método para cargar el programa en el
microcontrolador y probarlo en un circuito externo.

TEMARIO
3.1 ANÁLISIS DE LAS CARACTERÍSTICAS DE UN MICROCONTROLADOR COMERCIAL DE
8 BITS
3.2 ARQUITECTURA DEL MICROCONTROLADOR DE 8 BITS
3.3 MODOS DE DIRECCIONAMIENTO DEL PIC 16F628A
3.4 CONJUNTO DE INSTRUCCIONES DEL MICROCONTROLADOR PIC 16F628A
3.5 PRIMER PROGRAMA EN ENSAMBLADOR

85
MAPA CONCEPTUAL

86
INTRODUCCIÓN

Hasta ahora se han descrito de forma muy general los microprocesadores y


microcontroladores, y aunque se ha mencionado en repetidas ocasiones que se
usará un dispositivo de la familia PIC de Microchip como base para las prácticas
que se realizarán, aún no se ha aterrizado en la arquitectura particular de este
micro, sus bloques internos, la forma de aprovecharlo, su lenguaje de
programación específico, etc.
Precisamente en esta unidad se profundizará en el microcontrolador que
se utilizará de ahora en adelante, el PIC 16F628A de Microchip, un
microcontrolador muy poderoso y flexible, que es relativamente fácil de
conseguir y cuyo costo es muy razonable, lo que significa que cualquier
persona puede adquirirlo y comenzar a experimentar los pros y contras de los
circuitos de proceso digital.

87
3.1 ANÁLISIS DE LAS CARACTERÍSTICAS DE UN MICROCONTROLADOR COMERCIAL DE 8
BITS

Como se ha mencionado a lo largo de este libro, los microcontroladores de la


familia PIC 12-16 de Microchip son dispositivos de proceso digital de 8 bits,
capaces de realizar desde las tareas más sencillas hasta algunas que
realmente sorprenden por su complejidad. Estos dispositivos son capaces de
realizar hasta 5 millones de operaciones por segundo, o bien utilizar un modo
de muy baja energía en el cual apenas consumen unos cuantos microamperios
de corriente (menos de una milésima parte de amperio), lo que los hace ideales
para aplicaciones donde tengan que ser alimentados por baterías. La serie 12-
16 de PIC posee además una amplia variedad de bloques internos, que van
desde circuitos de reset (ya no es necesario colocar un chip especial para esta
función), como generadores de reloj, temporizadores, comparadores
analógicos, convertidores analógico-digital, circuitos de vigilancia internos,
diversos puertos I/O para entrada o salida de datos, tres tipos de memoria
interna: flash para programación, RAM para almacenar datos temporales y
EEPROM para guardar datos que se
deseen conservar incluso cuando se
retira la alimentación del dispositivo,
bloques de transmisión y recepción de
datos, en fin, una muy amplia
diversidad de bloques funcionales que
están disponibles dependiendo del
modelo específico de micro que
Los microprocesadores de 8 bits de la
utilizará.
familia PIC se utilizan ampliamente en
Estos microcontroladores se
aparatos para el hogar y en la industria
pueden adquirir en versiones que van
(Cortesía de Microchip).
desde las 8 a las 40 terminales o más,
para aplicaciones desde muy pequeñas hasta muy sofisticadas; y a todo lo
anterior se debe añadir una muy amplia disponibilidad en el mercado
electrónico, y un precio extremadamente razonable. Todas estas razones hacen

88
de la familia PIC 12-16 la ideal para comenzar con el mundo de los
microcontroladores.
Las características principales del micro PIC16F628A que se usará en
las prácticas, son las siguientes: Se trata de un dispositivo de 8 bits en
arquitectura RISC (computación por set de instrucciones reducido), cuyo
lenguaje ensamblador sólo posee 35 comandos individuales, lo que lo hace
muy fácil de aprender y dominar. El micro posee un oscilador interno
seleccionable entre 4MHz (reloj normal) o 48KHz (para aplicaciones de muy
bajo consumo de potencia), lo que le permite funcionar sin la presencia de una
fuente de reloj externa; pero se le puede aplicar una oscilación de hasta 20MHz
para máxima velocidad de proceso. El dispositivo puede ser alimentado con un
voltaje de 2 hasta 5.5V; se encuentra en un encapsulado de 18 terminales, de
las cuales hasta 16 pueden usarse como entradas o salidas de señal; posee
dos comparadores análogos, que pueden usar ya sea un voltaje de referencia
externo o uno interno para su labor; posee 3 temporizadores, uno de 16 bits y 2
de 8 bits; un bloque PWM para expedir señales análogas simuladas, un bloque
de comunicaciones consistente en un receptor-transmisor universal síncrono-
asíncrono (USART); y muchos bloques más para aplicaciones más
especializadas.
El 16F628A posee 2 kilobytes de
memoria flash para almacenar su programa
interno, además de 224 bytes de RAM para
guardar datos temporales y 128 bytes de
EEPROM para datos semipermanentes. La
ventaja de que la memoria de
programación sea flash es que, en caso de
Aspecto del PIC 16F628A, que se usará como base
que al desarrollar el programa, se
para las prácticas del libro.
cometiera algún error, simplemente se
corrige y se carga nuevamente en el micro.
La memoria flash se puede grabar hasta 100,000 veces antes de que
aparezcan errores, excediendo en mucho la vida útil del dispositivo.

89
Un detalle especial que tiene la memoria, es que en el bloque de flash,
cada celda tiene una extensión de 14 bits, mientras que en la RAM y la
EEPROM sus celdillas son de 8 bits; esto se debe a la arquitectura Harvard de
este dispositivo, que mantiene separados el bus de datos y el bus de programa;
y esto le permite que en una sola orden de 14 bits, se incluya el comando en
cuestión y el dato que se va a utilizar o la dirección a la que se requiere
acceder. Esto se traduce en menor tiempo para ejecutar las órdenes; de forma
típica, un comando utiliza un ciclo de reloj para procesarse, con la excepción de
los saltos, que requieren de dos ciclos. Si se considera que el micro toma la
señal del oscilador y la divide entre 4 para generar su reloj interno, y sabiendo
que la máxima frecuencia del oscilador es de 20MHz, entonces este micro es
capaz de realizar hasta 5 millones de operaciones sencillas por segundo, algo
más que razonable para un dispositivo de este precio.

ACTIVIDAD 3A

Contesta lo siguiente:
1.- ¿Cuál es la empresa que fabrica el microcontrolador que se usará como ejemplo
para las prácticas de este libro?
2.- ¿De cuántos bits es la serie PIC 12-16?
3.- ¿Qué tipo de arquitectura utiliza la familia PIC, Von Neumann o Harvard?
4.- ¿Cuál es la principal diferencia entre ambas arquitecturas?
5.- ¿Cuál es la ventaja de que la memoria de programación sea de tipo flash?
6.- ¿Cuál es la frecuencia máxima que puede manejar este dispositivo?
7.- ¿Es indispensable colocar un reloj externo al PIC 16F628A?
8.- ¿Cuántos temporizadores incluye este dispositivo?
9.- ¿Incluye comparadores analógicos? ¿Cuántos?
10.- ¿Para qué sirve el bloque de memoria EEPROM?

90
3.2 ARQUITECTURA DEL MICROCONTROLADOR DE 8 BITS

Diagrama a bloques del microcontrolador PIC16F628A de Microchip.


(Cortesía de Microchip).

En la figura anexa se muestra el diagrama a bloques interno del


microcontrolador PIC16F628A para tener una idea de su complejidad; se puede
observar la gran cantidad de elementos que trae incorporados, permitiendo así
su aplicación prácticamente inmediata, sin necesidad de rodearse de circuitos
auxiliares externos. Lo realmente sorprendente es imaginar que todo eso se
encuentra en el interior de un circuito integrado de 18 terminales más pequeño
que un clip de oficina, y que normalmente se puede adquirir en menos de 100
pesos, lo que lo pone al alcance de casi cualquier bolsillo.

91
Sin embargo, y a pesar de su complejidad aparente, este dispositivo
mantiene la misma estructura básica que ya se explicó en unidades anteriores;
por ejemplo, se puede observar en la parte media del diagrama la unidad
aritmética lógica (ALU), que se encarga de realizar todas las operaciones dentro
del circuito. Exactamente debajo de ella está el registro de trabajo W, que es
donde se carga uno de los operandos de cualquier operación de dos bytes que
se deseen hacer en la ALU, pudiendo obtener el otro ya sea de la memoria
flash de programa, de la RAM, de la EEPROM o incluso de alguno de sus
puertos de entrada. Encima de la ALU, se observa la presencia de dos registros
especiales: el de estado y el FSR, que sirve para localizar de forma indirecta los
datos contenidos en alguna dirección de memoria. Arriba de estos registros se
encuentra la RAM, y parte de esta memoria también se usa como registros
especializados para el micro, donde se configuran las entradas/salidas de los
puertos, si se van a activar los temporizadores y cómo se configuran, si se van
a usar las interrupciones y cómo, si se van a usar los comparadores analógicos
y cómo, etc. Más adelante, se presentará un mapa detallado de la memoria
RAM de este micro, y se indicará que hay localidades que sólo se tocan durante
la configuración inicial del dispositivo, y no se pueden usar para trabajo normal.
En la parte derecha del diagrama están los dos puertos I/O generales,
cada uno de 8 bits; cada una de las terminales de estos puertos puede
configurarse como entrada o salida, independientemente de las demás, así que
en un momento dado, un puerto puede estar expidiendo órdenes por algunos
pines, y recibiendo instrucciones a través de otros pines del mismo puerto. Esto
da mucha flexibilidad al diseñador, para simplificar en la medida de lo posible
los trazos del circuito impreso donde se montará el micro.
En la parte inferior se encuentran los bloques periféricos adicionales que
incluye el 16F628A, como son los tres temporizadores, el comparador
analógico, el generador de voltaje de referencia, el generador-receptor PWM
(CCP1), el bloque de comunicaciones USART y la EEPROM para datos.
Normalmente todo esto tendría que añadirse al circuito a través de chips

92
externos, pero debido a la integración lograda por los dispositivos digitales,
ahora ya forman parte de la estructura interna de este microcontrolador.
En el bloque que se encuentra a la izquierda de la ALU, se encuentran
una serie de etapas encargadas de garantizar el buen funcionamiento del
dispositivo; por ejemplo, hay un temporizador de inicio, un oscilador de
arranque, el bloque reset, un temporizador watchdog (para vigilar que el
programa se ejecute correctamente), un reset en fr o un bloque de
programación a bajo voltaje; más a la izquierda se ubica el generador de reloj y
el control y decodificador de instrucciones. Finalmente, en la parte superior
(junto a la RAM) se encuentra el registro PC, el Stack y la memoria flash de
programación, con su respectivo registro de instrucciones. Todos estos bloques
están unidos entre sí por una serie de buses internos, casi todos de 8 bits,
excepto el de instrucciones, que es de 14 bits, y algunos otros de funciones
especiales.

93
Arquitectura Von Neumann vs. Arquitectura Harvard

Los microprocesadores convencionales, como los de la serie 80xx de Intel o la 68xx de


Motorola, utilizan una arquitectura tradicional Von Neumann, en la cual tanto los datos
como las instrucciones se guardan en una memoria común, y ambos miden exactamente la
misma cantidad de bits. Esto permite utilizar un bloque de memoria único, lo que simplifica
en cierta medida el direccionamiento del mismo, aunque tiene como inconveniente que
cuando se indica una orden, se tiene que dar por un lado el comando y por otro lado el dato
con que se trabajará, y esto origina que cada comando necesita de varios ciclos de reloj para
poder ser ejecutado.
En la arquitectura Harvard, hay un bloque independiente de memoria para
instrucciones y otro para datos, lo que complica ligeramente el acceso a la memoria, pero
tiene la ventaja de que ambos bloques pueden tener una extensión distinta; por ejemplo, en
los microcontroladores PIC, que usan una arquitectura de este tipo, la memoria flash de
programación usa celdillas de 14 bits cada una, mientras que el bloque de RAM utiliza
celdillas de 8 bits cada una. Con esto, lo que se consigue es que haya muchas instrucciones
en las que se combina la orden y el dato con que se va a trabajar, y por tanto, se pueden
ejecutar en un ciclo de reloj único, lo que acelera considerablemente la velocidad de
proceso.
(Imágenes cortesía de Motorola y Microchip).

Esta es la arquitectura interna del PIC 16F628A; se debe tener presente


para saber qué esperar y qué no esperar de este dispositivo, y sus límites y
alcances al aplicarlo en distintos proyectos.

ACTIVIDAD DE APRENDIZAJE 3B

Contesta lo siguiente:
1.- ¿Qué significa ALU y qué función tiene este bloque dentro del microcontrolador?
2.- ¿Hasta cuántas terminales I/O puede manejar este micro?
3.- ¿Cuántos registros de trabajo posee este dispositivo?
4.- ¿Para qué sirven los registros PC y Stack, y qué profundidad tiene este último en este PIC?
5.- ¿De qué extensión es la palabra en la memoria de programación de la familia PIC 12-16?
6.- ¿Qué significa USART y para qué sirve este bloque?
7.- ¿Cuál es el voltaje de operación normal de este micro?
8.- ¿Cuál es la función del bloque CCP1?
9.- ¿Cuál es la función del watchdog timer?
10.- ¿Para qué se necesita el bloque de memoria RAM dentro del micro? 94
3.3 MODOS DE DIRECCIONAMIENTO DEL PIC 16F628A
Como se mencionó en la unidad anterior, los procesadores lógicos, en su set de
instrucciones, pueden manejar una amplia variedad de modos de
direccionamiento para el acceso de datos hacia los registros de trabajo. Sin
embargo, al considerar que la serie PIC 12-16 sólo maneja 35 instrucciones en
su set básico de comandos, por lo tanto tiene un número muy reducido de
modos de direccionamiento; a continuación se indican cuáles son:

Direccionamiento inmediato: Se carga directamente un registro con una


cantidad predeterminada: MOVLW [literal]. Ejemplo: MOVLW 0x5A;
después de ejecutarse la orden, el valor 5Ah se carga en el registro W.
Direccionamiento directo: Se carga un valor desde una localidad
específica de memoria: MOVF [dirección], [destino], donde [dirección] es
el registro o localidad de memoria desde donde se lee el dato, y [destino]
es hacia dónde se moverá este dato, siendo 0 = W y 1 = el mismo
registro o localidad de memoria. Ejemplo: MOVF REG1, 0; después de
ejecutarse la orden, el contenido de REG1 se carga en W.
Direccionamiento de registro a memoria: Se carga el contenido de un
registro en alguna localidad de memoria o en otro registro: MOVWF
REG1; después de ejecutar la instrucción, el contenido de W se carga en
el registro REG1.
Direccionamiento a registro: Se hace una operación sobre la cantidad
que ya está guardada en algún registro: [COMANDO] [registro], [destino].
Después de la instrucción, el número contenido del registro varía según
la orden, el resultado se guarda en W si el destino es 0 , en el mismo
registro si el destino es 1 . Ejemplo: INCF REG1, 1; despu s de la
orden, el número contenido en REG1 se incrementa en una unidad, y el
resultado se guarda en el mismo REG1.

¡Y eso es todo!, estos son los cuatro modos de direccionamiento que se


pueden invocar en los PIC de la serie 12-16. Obviamente existen más órdenes

95
que utilizan estos modos de direccionamiento, pero se detallarán enseguida,
cuando se describan una por una las órdenes del set de instrucciones de estos
dispositivos.

ACTIVIDAD DE APRENDIZAJE 3C

Contesta lo siguiente:
1.- ¿Cuántas órdenes posee el set de instrucciones de los PIC 12-16?
2.- ¿Cuántos tipos de modos de direccionamiento posee el PIC 16F628A?
3.- Menciona dos de estos modos de direccionamiento.

3.4 CONJUNTO DE INSTRUCCIONES DEL MICROCONTROLADOR PIC 16F628A


Ahora, se estudiará el set de instrucciones del microprocesador 16F628A, para
saber qué es lo que se puede hacer con él, y cómo aprovecharlo para que
realice las tareas que se le asignen a través de su programa. Como ya se ha
mencionado, este set de instrucciones sólo cuenta con 35 comandos básicos,
así que no debería ser difícil aprenderlos todos de memoria (además de que
hay algunos que se utilizan sólo en pocas ocasiones).
A continuación se muestran todas las órdenes del set de instrucciones de
la familia PIC 12-16 con una descripción básica sobre la utilidad de cada una,
esta lista puede servir como referencia rápida como auxiliar de programación,
pero si se desea información detallada sobre qué hace exactamente cada
orden, enseguida se hará una descripción punto por punto de qué es lo que
hace cada comando, y cómo afectan a las distintas banderas de estado. Cabe
aclarar que en la notación de Microchip, cuando nos referimos a una localidad
de memoria espec fica se le identifica como F , as que se denominar de esa
forma de ahora en adelante.

No. Comando Descripción Banderas


Operaciones relacionadas con bytes en registros y localidades de memoria
1 ADDWF Suma el contenido de W y una localidad de memoria F C, DC, Z
2 ANDWF Operación AND entre W y F Z

96
3 CLRF Borra el contenido de F Z
4 CLRW Borra el contenido de W Z
5 COMF Operación complemento a F Z
6 DECF Decrementa el contenido de F Z
7 DECFSZ Decrementa F, salta una posición si llega a cero
8 INCF Incrementa el contenido de F Z
9 INCFSZ Incrementa F, salta una posición si llega a cero
10 IORWF Operación OR entre W y F Z
11 MOVF Mueve F Z
12 MOVWF Mueve el contenido de W a F
13 NOP No operación
14 RLF Rotar F a la izquierda a través de carry C
15 RRF Rotar F a la derecha a través de carry C
16 SUBWF Resta entre W y F C, DC, Z
17 SWAPF Intercambia los nibbles de F
18 XORWF Operación XOR entre W y F Z
Operaciones relacionadas con bits dentro de registros o localidades de memoria
19 BCF Borra un bit dentro de F
20 BSF Activa un bit dentro de F
21 BTFSC Prueba un bit dentro de F, salta una posición si es cero
22 BTFSS Prueba un bit dentro de F, salta una posición si es uno
Operaciones con literales y de control
23 ADDLW Suma el contenido de W con una literal C, DC, Z
24 ANDLW Operación AND entre W y una literal Z
25 CALL Llama a una subrutina TO PD
26 CLRWDT Borra el temporizador watchdog
27 GOTO Salto incondicional a una dirección
28 IORLW Operación OR entre W y una literal Z
29 MOVLW Mueve una literal a W
30 RETFIE Regreso de una interrupción
31 RETLW Regresa de una subrutina con una literal en W
32 RETURN Regreso de una subrutina
33 SLEEP Entrar en modo de espera y bajo consumo TO, PD

97
34 SUBLW Substrae W de una literal C, DC, Z
35 XORLW Operación XOR entre W y una literal Z

Estas son todas las órdenes que se pueden indicar a un microcontrolador


PIC de la familia 12-16 (8 bits); ahora se detallará qué significa cada una y
cómo se lleva a cabo. Se hará esta descripción en estricto orden alfabético,
para localizar fácilmente la explicación de cualquier comando.

ADDLW k ADDWF
Se suma el valor de W con una literal k, Se suma el valor de W con el contenido
donde k = de 0 a 255, el resultado se en la localidad de memoria F; el
guarda en W. resultado se guarda en F si el bit de
Ejemplo: ADDLW 0x15 opción es 1, y en W si es 0.
Si W era igual a 0x10, después de la Ejemplo: ADDWF REG1, 1
instrucción, W = 0x25 En este caso, se suman W y REG1, y el
Si el resultado rebasa los 8 bits, se resultado se guarda en REG1.
activa el bit CARRY. Si el resultado rebasa los 8 bits, se
activa el bit CARRY.
ANDLW ANDWF
Operación AND entre W y una literal k, Operación AND entre W y el contenido
donde k = de 0 a 255, el resultado se de una localidad de memoria F; el
guarda en W. resultado se guarda en F si el bit de
Ejemplo: ANDLW 0x5F opción es 1, y en W si es 0.
Si W era igual a 0xA3, después de la Ejemplo: ANDWF REG1, 0
instrucción, W = 0x03 En este caso, se hace una AND entre W
y REG1, y el resultado se guarda en W.
BCF BSF
Borra un bit dentro de una localidad de Activa un bit dentro de una localidad de
memoria F. memoria F.
Ejemplo: BCF REG1, 7 Ejemplo: BSF REG1, 3
Se borra el bit 7 de REG1; si REG1 era Se activa el bit 3 de REG1, si REG1 era
0xF1, después de la orden será 0x71 0x51, después de la orden será 0x55
BTFSC BTFSS

98
Prueba un bit dentro de una localidad F, Prueba un bit dentro de una localidad F,
y el PC salta una unidad si es cero. y el PC salta una unidad si es uno.
Ejemplo: BTFSC REG1, 5 Ejemplo: BTFSS REG1, 5
Si el bit 5 de REG1 es 1, el PC sigue Si el bit 5 de REG1 es 0, el PC sigue
con su cuenta normal, pero si es 0, salta con su cuenta normal, pero si es 1, salta
una unidad. una unidad.

CALL CLRF
Se llama al contenido de una subrutina. Borra el contenido de una localidad de
Ejemplo: CALL 1SEG memoria F.
El contenido del PC se guarda en el Ejemplo: CLRF REG1
Stack, y cambia a la dirección de la Sin importar qué número estuviera
subrutina. Cuando se regresa de ella, se guardado en REG1, después de la
recupera el número del Stack hacia el orden se tendrá un 0x00
PC, y sigue con su cuenta normal.
CLRW CLRWDT
Borra el contenido de una localidad de Borra el temporizador Watchdog de
memoria F. vigilancia.
Ejemplo: CLRW Ejemplo: CLRWDT
Sin importar qué número estuviera Se reinicializa el contador interno del
guardado en W, después de la orden se WDT.
tendrá 0x00
COMF DECF
Operación complemento en el contenido Se decrementa en una unidad el
de la localidad de memoria F. Si el bit de contenido de F. Si el bit de opción es 0,
opción es 0, el resultado se guarda en el resultado se guarda en W, y en REG1
W, y en REG1 si el bit es 1. si el bit es 1.
Ejemplo: COMF REG1, 0 Ejemplo: DECF REG1, 1
Si REG1 era 0x13, luego de la Si REG1 era 0x24, después de la
operación REG1 = 0x13 y W = 0xEC instrucción REG1 = 0x23

DECFSZ GOTO
Se decrementa en una unidad el valor Salto incondicional hacia cualquier

99
de F, y cuando llega a cero, el PC hace dirección válida de memoria
un salto de una unidad en su cuenta. Ejemplo: GOTO RUTINAX
Ejemplo: DECFSZ REG1 Sin importar dónde estuviera el PC,
Si REG1 no es cero, el PC sigue con su luego de la orden irá a la dirección de la
cuenta normal, pero si llega a cero, el rutina-X
PC hace un salto de una unidad.
INCF INCFSZ
Se incrementa en una unidad el valor Se incrementa el valor de F, y si llega a
dentro de F. Si el bit de opción es 1, el cero, el PC hace un salto de una unidad.
valor se guarda dentro de F, y si es 0, se Si el bit de opción es 1, el valor se
guarda en W. guarda dentro de F, y si es 0, se guarda
Ejemplo: INCF REG1, 1 en W.
Si REG1 era 0x24, después de la orden Ejemplo: INCFSZ REG1, 1
REG1 = 0x25 Si REG1 tiene cualquier valor distinto a
cero, el PC sigue su cuenta normal, pero
si llega a cero, el PC hace un salto de
una unidad.
IORLW IORWF
Se hace una operación OR entre W y Se hace una operación OR entre W y el
una literal k, donde k = de 0 a 255; el contenido de F; si el bit de opción es 1,
resultado se guarda en W. el valor se guarda dentro de F, y si es 0,
Ejemplo: IORLW 0x35 se guarda en W.
Si W era 0x9A, luego de la instrucción Ejemplo: IORWF REG1, 0
W = 0xBF Si W = 0x91 y REG1 = 0x13, luego de la
instrucción W = 0x93
MOVLW MOVF
Carga una literal k en el registro W, El contenido de la dirección de memoria
donde k = de 0 a 255. F se mueve a W si el bit de opción es 0,
Ejemplo: MOVLW 0x3A y se queda en F si el bit de opción es 1.
Sin importar qué hubiera en W Ejemplo: MOVF REG1, 0
anteriormente, después de la orden El valor de REG1 se pasará a W
W = 0x3A después de la orden.
MOVWF NOP
El contenido del registro W se graba en Ninguna operación; se utiliza para

100
la localidad de memoria F. introducir un retardo de un ciclo de reloj,
Ejemplo: MOVWF REG1 cuando se quiere llevar un tiempo muy
Si W = 0xA1, después de la orden este preciso.
valor se cargará en REG1. Ejemplo: NOP
RETFIE RETLW
Regresa desde una interrupción: cuando Regresa de una subrutina con una literal
se recibe una interrupción, el PC hace cargada en W. Cuando termina una
un salto incondicional a una cierta subrutina y se desea regresar al
localidad de memoria, pero guarda su programa normal, pero con un dato
valor anterior en el Stack; cuando se específico en W, esta orden permite
termina de ejecutar la rutina que se hacerlo en un solo comando.
invoca por la interrupción, una orden Ejemplo: RETLW, 0xA3
RETFIE regresa al PC a la localidad de Al regresar de la subrutina, el registro W
memoria donde estaba anteriormente. tendrá en su interior un valor de 0xA3.
Ejemplo: RETFIE
RETURN RLF
Regreso desde una subrutina. Cuando Rota los bits del registro F hacia la
se termine de ejecutar una subrutina y izquierda, pasando por el bit CARRY
se desee regresar al programa normal,
una orden RETURN hace que el PC
recupere el valor guardado en el Stack,
y retome su cuenta normal.
Ejemplo: RETURN Ejemplo: RLF REG1

RRF SLEEP
Rota los bits del registro F hacia la Esta orden coloca al micro en un modo
derecha, pasando por el bit CARRY. de mínima energía, mientras espera
nuevas órdenes.
Ejemplo: SLEEP

Ejemplo: RRF REG1


SUBLW SUBWF

101
Substrae el valor de W de una literal k, Substrae el valor de W del contenido de
donde k = de 0 a 255. El resultado se F. El resultado se guarda en W si el bit
guarda en W. de opción es 0, y en F si es 1.
Ejemplo: SUBLW 0x28 Ejemplo: SUBWF REG1, 1
Si W = 0x03, luego de la orden, Dependiendo si W es mayor, menor o
W = 0x25. Dependiendo si W es mayor, igual a la literal, se activan los bits C, Z y
menor o igual a la literal, se activan los DC
bits C, Z y DC
SWAPF XORLW
Intercambia los nibbles (grupos de 4 Operación XOR entre el contenido de W
bits) del contenido de F. El resultado se y una literal k, donde k = de 0 a 255. El
guarda en W si el bit de opción es 0, y resultado se guarda en W.
en F si es 1. Ejemplo: XORLW 0xAF
Ejemplo: SWAPF REG1, 1 Si W era 0xB5, después de la orden
Si REG1 = 0x9A, después de la orden W = 0x1A
REG1 = 0xA9
XORWF
Operación XOR entre W y el contenido
de F. El resultado se guarda en W si el
bit de opción es 0, y en F si es 1.
Ejemplo: XORWF REG1, 0
Si W = 0xB5 y REG1 = 0xAF, luego de
la orden W = 0x1A

De este modo, se puede tener una idea más clara de para qué sirve cada
una de las órdenes incluidas en el set de instrucciones de los
microcontroladores PIC serie 12-16. Una gran ventaja que tienen estos
dispositivos es que su set de comandos casi no ha cambiado desde que
comenzaron a fabricarlos, así que un programa que se diseñe en este momento
puede funcionar prácticamente sin modificaciones en otros micros más antiguos
o en dispositivos que aún están en la mesa de diseño; de ahí la conveniencia
de realizar los programas en forma de bloques funcionales, para que cuando

102
llegue algún proyecto con una etapa que ya se había diseñado para un circuito
anterior, se pueda retomar haciéndole sólo modificaciones mínimas.
Antes de pasar a las prácticas de programación, se debe describir un
aspecto importante de la operación de este microcontrolador: los registros
especiales donde se activan las banderas de estado; y esto implica echar un
vistazo al mapa de memoria del dispositivo.
A continuación se encuentra el mapa de memoria de un microcontrolador
PIC 16F628A; se puede observar que varias de las localidades de memoria que
posee el micro ya están ocupadas por una gran cantidad de registros, cada uno
con una función específica dentro de la estructura del micro. Se describirán los
más importantes, y se dejaran algunos para cuando se estudien ciertos temas
específicos sobre este controlador.
Se iniciará por orden numérico: en la localidad 01h se encuentra el
registro correspondiente al temporizador No. 0; por el momento no se indicará
para qué sirve, ya que este bloque sólo se utiliza para ciertas funciones
avanzadas del micro.
El registro PCL corresponde a los 8 bits inferiores del registro PC o
contador de programa; dado que el 16F628A posee 2kB de memoria de
programa, pero con 8 bits sólo se pueden direccionar 256 bits, esto implica que
necesita por lo menos 3 bits adicionales para direccionar a toda su memoria,
entonces, en PCL se guardan los 8 bits inferiores, y en PCLATH los adicionales.
El registro STATE o de estado guarda algunos de los bits más usuales
durante la programación del dispositivo, como las banderas C (carry), Z (cero) y
DC (decrement carry), además del IRP, RP0 y RP1 (elección del banco de
memoria usado), TO (Time out) y PD (Power down). En programas sencillos
sólo se usarán los bits C, Z y DC, pero en programas más complejos se llegan a
utilizar todos los demás, especialmente los tres primeros, ya que se activan o
desactivan dependiendo de en qué bloque de memoria se alojen las
instrucciones del programa.
El registro OPTION_REG controla aspectos de las interrupciones y los
temporizadores, pero hay un bit especial RBPU, que habilita o desactiva unas

103
resistencias de pull-up en las terminales de salida del micro. Si se activan esas
resistencias (poniendo este bit en 0 ), se podrá conectar un LED directamente
a las terminales del chip, sin necesidad de resistencia limitadora, lo que reduce
aún más la cantidad de componentes necesarios para los proyectos.

(Cortesía de Microchip).

104
El registro INTCON sirve para configurar las interrupciones y cómo se
utilizarán (en caso de que el programa lo requiera). Los registros PIE y PIR1
sirven para manejar las interrupciones a través de bloques periféricos como los
temporizadores, el USART, los comparadores, etc.
El registro PCON posee un bit importante para el diseño usando este
PIC: OSCF o frecuencia del oscilador interno; si se coloca en 1 , la frecuencia
ser de 4MH , en 0 ser de 48kH . Los bits POR BOR se usan para
monitorear si se ha aplicado un reset al equipo.
Los registros TRISA y TRISB sirven para determinar si las terminales de
los puertos A y B se utilizarán como entrada o como salida de señal. Para
hacerlo, se coloca un número binario en este registro, y las posiciones con un
1 quedar n como entradas, mientras las que tengan un 0 ser n salidas. Esto
se puede cambiar durante la ejecución del programa, pero normalmente se
determina desde el principio de la programación cómo se usarán las terminales,
y se configuran al inicio del programa.
Para leer o escribir algún dato a las terminales de los puertos, se tienen
los registros PORTA y PORTB; lo que significa que si se desea poner en un
ni el alto alguna terminal de un puerto, bastar con que se escriba un 1 en la
posición correspondiente de este puerto, y eso se reflejará de inmediato en la
salida del dispositivo. Lo mismo se puede decir de la entrada; si se desea saber
si en una cierta terminal ha un 1 o un 0 , simplemente se lee el bit
correspondiente del PORTA o PORTB, y con eso se sabrá qué está llegando a
esa terminal.
Todos los registros posteriores son de aplicación específica para los
bloques periféricos internos del micro; así hay registros para los temporizadores
1 y 2, para los comparadores, para el transmisor USART, etc. Estos registros
sólo se utilizarán cuando sea necesario aprovechar estos bloques funcionales,
lo cual normalmente sólo se requiere en aplicaciones complejas.
Finalmente, existe un registro muy importante, el de configuración inicial,
en el cual se fijan las condiciones operativas del dispositivo. Por ejemplo, aquí
se indica si se activará el watchdog timer, si se protegerá el código grabado en

105
el micro, qué tipo de reloj usará el dispositivo (interno, externo, RC, cristal, etc.)
y otros aspectos fundamentales para la correcta operación del controlador. Este
registro se debe configurar al inicio del programa.
Estos son los registros especiales que posee este micro. Se deben tener
siempre presentes, ya que se utilizarán constantemente durante el desarrollo
del código interno del procesador.

ACTIVIDAD DE APRENDIZAJE 3D

Contesta lo siguiente:

1.- ¿Cómo se dividen los comandos del set de instrucciones de los PIC?

2.- Menciona dos comandos relacionados con los bits dentro de los registros.

3.- Menciona tres comandos que sirvan para hacer operaciones con dos registros.

4.- ¿Cuáles son los comandos para llamar una subrutina y para volver de ella?

5.- ¿En cuántos bloques está dividida la memoria del 16F628A?

6.- ¿Dónde se encuentran los bits C, DC y Z?

7.- ¿Para qué sirven los registros TRISA y TRISB?

8.- ¿Cómo se configura en estos registros si una terminal servirá como entrada o
salida?

9.- ¿En qué registro se coloca la información que va o viene del puerto A?

10.- ¿Para qué sirve el registro de configuración inicial?

3.5 PRIMER PROGRAMA EN ENSAMBLADOR


Ahora, se comenzará con el desarrollo del primer programa para un
microcontrolador PIC 16F628A, y se iniciará con un programa muy simple: que
sólo encienda o apague algunos LED para simular la operación de un semáforo
que controla dos calles.
Antes de iniciar, es conveniente que visitar la página de Microchip
(www.microchip-com) y descargar la herramienta de programación que esta

106
empresa ofrece a sus consumidores: el programa MPLAB; se debe instalar en
la computadora, para tenerlo siempre a la mano, ya que en él se basarán las
explicaciones posteriores. Esto no es estrictamente necesario, ya que el
programa en sí se puede hacer en cualquier editor ASCII, como el Notepad que
incluye Windows; sin embargo, el paso final de pasar el programa de lenguaje
ensamblador a lenguaje de unos ceros del micro s se tiene que hacer con
esta herramienta, así que es mejor tenerla disponible.

Página principal de Microchip; abajo a la izquierda está el enlace para descargar el


programa MPLAB. (Cortesía de Microchip).
Existen otras opciones. Si ya se dominan lenguajes de programación de
alto nivel, como Basic o C, existen versiones de éstos dedicadas
exclusivamente para el PIC, algunos incluso con versiones de prueba gratuitas,
aunque la mayoría de las empresas productoras suele obsequiar una versión
limitada, y sólo libera todas sus funciones al adquirir la licencia correspondiente.
Por el momento, como lo que se desea es saber cómo se programa en

107
ensamblador, las explicaciones se concentrarán estrictamente en el programa
MPLAB.
A continuación, se creará en el Notepad un archivo que llevará por
nombre SEMAFORO.ASM; donde se escribirá el código del semáforo que se
desea implementar con el PIC 16F628A. En seguida se muestra este código ya
depurado:

; En primer lugar, hay que fijar el microprocesador empleado y


; llamar a la librería que nombra sus registros y puertos.

LIST P=16F628A
#INCLUDE <P16F628A.INC>

; Este archivo está en el mismo directorio del MPLAB IDE, y ahí se


; fija la posición de los registros, para que en lugar de tener que
; poner "escribe en el registro XXX", se pueda poner "escribe en
; el registro STATUS"; simplificando la programación. También se
; nombran los puertos y sus terminales individuales. Trata de abrir
; con el notepad este archivo P16F628.INC, para que veas su
; contenido.

; Se utilizará el generador de reloj interno, dejando todas las


; terminales como salidas.

__CONFIG _CP_OFF & DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF &


_WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT

; Se definen las variables necesarias para el programa:

TIEMPO EQU 20H


CONT1 EQU 21H
CONT2 EQU 22H
CONT3 EQU 23H

; Esta línea fija la dirección 0000H como el punto de inicio del


; programa.

ORG 0000H

; Teóricamente, a continuación tendríamos que poner un salto, ya que


; la dirección por default que busca el micro cuando recibe una

108
; interrupción es la 0004H, pero como en este proyecto no se usan
; las interrupciones, podemos seguir con el programa.

; Se ponen todas las terminales del puerto B como salidas, y se


; colocan en ceros. Nota que dado que el registro TRISB está en el
; banco de memoria 1, hay que configurar el bit RP0 del registro
; STATUS para que pueda ser modificado.

MOVLW b'00000000'
BSF STATUS, RP0
MOVWF TRISB
BCF STATUS, RP0
MOVWF PORTB

; Ahora vamos a implementar la subrutina de espera SEG; para ello


; vamos a colocar tres contadores anidados uno dentro de otro, dos
; de 255 a cero y uno de 15 a cero; con esto se consigue un retraso ; de poco
más de 1 segundo.

SEG MOVLW b'11111111'


MOVWF CONT1
MOVWF CONT2
MOVLW b'00001111'
MOVWF CONT3
SEGA DECFSZ CONT1, 1
GOTO SEGA
DECFSZ CONT2, 1
GOTO SEGA
DECFSZ CONT3, 1
GOTO SEGA
RETURN

; Se enciende Verde1 y Rojo2, se coloca un indicador en este punto

PUNTO1 MOVLW b 00100001


MOVWF PORTB

; Se carga la cantidad de tiempo en el registro respectivo

MOVLW b'00101000'
MOVWF TIEMPO

; Se llama a la subrutina de retraso de SEG. Se coloca un marcador


; en este punto. Comienza a decrementarse el registro TIEMPO, cuando

109
; llegue a cero, se hace un salto.

PUNTO2 CALL SEG


DECFSZ TIEMPO, 1

; Si aún no se llega a cero, se regresa al PUNTO2

GOTO PUNTO2

; Cuando se llega a cero, inicia el parpadeo de Verde1

MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100001'
MOVWF PORTB
CALL SEG
MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100001'
MOVWF PORTB
CALL SEG
MOVLW b'00100000'
MOVWF PORTB
CALL SEG
MOVLW b'00100001'
MOVWF PORTB
CALL SEG
MOVLW b'00100000'
MOVWF PORTB
CALL SEG

; Después de los tres parpadeos, se enciende Amarillo1 por 3


; segundos

MOVLW b'00100010'
MOVWF PORTB
CALL SEG
CALL SEG
CALL SEG

; Se apaga amarillo1 y rojo 2, se encienden verde2 y rojo1

110
MOVLW b'00001100'
MOVWF PORTB

; Se repite todo el proceso anterior, pero ahora manteniendo


; encendido rojo1

MOVLW b'00101000'
MOVWF TIEMPO

; Se llama a la subrutina de retraso de SEG. Se coloca un marcador


; en este punto. Comienza a decrementarse el registro TIEMPO, cuando
; llegue a cero, se hace un salto.

PUNTO3 CALL SEG


DECFSZ TIEMPO, 1

; Si aún no se llega a cero, se regresa al PUNTO3

GOTO PUNTO3

; Cuando se llega a cero, inicia el parpadeo de Verde2

MOVLW b'00000100'
MOVWF PORTB
CALL SEG
MOVLW b'00001100'
MOVWF PORTB
CALL SEG
MOVLW b'00000100'
MOVWF PORTB
CALL SEG
MOVLW b'00001100'
MOVWF PORTB
CALL SEG
MOVLW b'00000100'
MOVWF PORTB
CALL SEG
MOVLW b'00001100'
MOVWF PORTB
CALL SEG
MOVLW b'00000100'
MOVWF PORTB
CALL SEG

111
; Después de los tres parpadeos, se enciende Amarillo2 por 3
; segundos

MOVLW b'00010100'
MOVWF PORTB
CALL SEG
CALL SEG
CALL SEG

; Se regresa al inicio para encender verde1 y rojo2 y repetir el ciclo.

GOTO PUNTO1

; Fin del programa

END

Se debe observar que durante todo el programa, se fueron colocando


abundantes notas para saber a cada paso exactamente qué se estaba
haciendo. Esto es conveniente para reaprovechar códigos en proyectos futuros,
y así ahorrar trabajo al realizar nuevos programas.
Ya con el código correctamente escrito, se debe llevar al programa
MPLAB-IDE; para ello, en el menú PROJECT se activa el Project Wizard; se
obtendrá lo que se observa en la figura.

112
(Cortesía de Microchip).
Se deberán pasar varias opciones, como elegir el PIC que se utilizará,
elegir el ambiente de trabajo, cargar el archivo con el programa (aquí hay que
elegir el recién creado SEMAFORO.ASM), etc. Al terminar, en el directorio
elegido aparece un archivo SEMAFORO.MCP y otro SEMAFORO.MCW, que es
el proyecto creado por el MPLAB.
Una vez creado el proyecto, hay que revisar si todo está correcto; para
ello, en la barra de tareas del programa deberá estar activada la opción
DEBUG, y luego accionar la opción MAKE a la derecha del círculo azul con una
i ; si el programa no tiene errores, aparecer un mensaje como el que se e en
la figura siguiente. Si aparece el mensaje BUILD SUCCEDED, eso significa que
el código no tiene errores, si existiera alguno, aparecerá un mensaje BUILD
FAILED, lo que significa que hay que depurar el código.
Para facilitar esta tarea, el programa crea un archivo de error, donde se
puede encontrar algo como lo siguiente:

Error[128] D:\TRABAJOS\SEMAFORO.ASM 13 : Missing argument(s)


Error[128] D:\TRABAJOS\SEMAFORO.ASM 13 : Missing argument(s)
Message[302] D:\TRABAJOS\SEMAFORO.ASM 37 : Register in operand not in
bank 0. Ensure that bank bits are correct.

113
Esto indica que hay un error en la línea 13, y que se debe verificar la
condición indicada en la línea 37. Un error impedirá que el proyecto se compile,
un mensaje o una advertencia no.

Una vez depurado el código, y que no existan errores, en el directorio de


trabajo se creará un archivo SEMAFORO.HEX, que es precisamente lo que se
cargará en el microcontrolador. También aparece un archivo SEMAFORO.MAP,
donde se detalla el uso de la memoria que hace el programa (en la figura hay
un fragmento de este archivo, donde claramente indica que apenas se usaron
85 de las 2182 localidades de memoria disponibles), lo que es un indicador más
de la sencillez de este proyecto.
Cuando ya se tiene el archivo
HEX, se debe cargar en el
microcontrolador; para ello, se puede
adquirir alguno de los programadores y
emuladores que ofrece la misma
empresa Microchip, aunque suelen ser
Programador JDM casero; requiere de un puerto serial algo costosos; sin embargo, circulan por
para funcionar.
Internet una gran cantidad de proyectos

114
con los cuales se puede construir un programador muy económico. Uno de los
más populares es el JDM, que se muestra en la foto (armado por el autor), que
tiene la ventaja de que no necesita de fuente adicional, ya que se alimenta
directamente del puerto serial de la computadora. Si la computadora no posee
puertos seriales, entonces lo mejor será adquirir un programador vía USB como
el que se muestra, aunque esto sí implica una inversión un poco más elevada.
Para la carga del programa hacia
el PIC, en el caso del programador JDM,
es necesario utilizar algún programa
capaz de comunicarse con él, los más
populares son el IC-Prog o el Pony-Prog.
En el caso del programador USB,
seguramente está acompañado con su
programa de carga exclusivo, así que ese Programador de PICs USB.

es el que se debe utilizar.

Circuito para probar el proyecto del semáforo con un PIC 16F628A.

115
Cuando el programa se haya cargado en la memoria flash del PIC, se
deberá probar. En este caso, hay que conectar el micro como se muestra en la
figura anexa; se observa que se han conectado los LED de colores a las salidas
del puerto B, verdes para RB0 y RB3, amarillos para RB1 y RB4, y rojos para
RB2 y RB5; RB6 y RB7 no tienen conexión, lo mismo que las terminales del
puerto A. Lo único adicional es la entrada de voltaje y tierra, que alimentan al
dispositivo.
Si todo se realizó de forma correcta, al momento de aplicar un voltaje de
5Vdc a la tablilla de pruebas, los LED comienzan a encenderse con la
secuencia de un par de semáforos; ¡y todo esto se consiguió con un chip y unas
cuantas líneas de código!

ACTIVIDAD DE APRENDIZAJE 3E

Contesta lo siguiente:

1.- ¿En dónde se puede conseguir el programa MPLAB?

2.- ¿Es necesario programar un PIC en ensamblador?

3.- ¿Se puede elaborar un programa en ensamblador sin contar con el MPLAB?

4.- ¿Por qué se coloca la instrucción INCLUDE al principio del programa?

5.- ¿Por qué conviene fijar las variables al principio del código?

6.- ¿Qué precaución se debe tener al configurar los registros TRISA y TRISB?

7.- ¿Por qué hay que colocar marcadores a lo largo del programa?

8.- ¿Qué hay que hacer si al ejecutar un debug en el programa, aparecen errores?

9.- ¿Para qué sirve el archivo HEX que genera el MPLAB?

10.- ¿Cómo se carga el programa en el dispositivo?

116
AUTOEVALUACIÓN

1. Describe cuál es la principal diferencia entre un microcontrolador de


arquitectura Von Neumann y uno de arquitectura Harvard.

2. Describe los bloques periféricos incorporados dentro del PIC16F628A,


con una breve explicación de la utilidad de cada uno.

3. Al considerar que este dispositivo sólo utiliza 35 comandos en su set de


instrucciones, ¿es de tecnología CISC o RISC?

4. ¿De cuántos bits es la instrucción típica de un microcontrolador de la


familia PIC 12-16? ¿Qué ventaja tiene esto?

5. Menciona las órdenes que se deben indicar para modificar un bit


individual dentro de un registro.

6. ¿Qué precaución hay que tomar cuando se configuran los registros


TRISA y TRISB? ¿Por qué?

7. En operaciones con uno o dos bytes, ¿qué significa el modificador final?

8. ¿Por qué es tan importante el registro W?

9. ¿Cuál es el archivo más importante que se genera con el MPLAB?

10. Menciona dos programas que se usan normalmente para cargar el


código de un PIC usando el programador JDM.

117

También podría gustarte