Vous êtes sur la page 1sur 128

DIVISIÓN DE INGENIERÍA MECATRÓNICA

ACADEMIA DE INGENIERÍA MECATRÓNICA

ANTOLOGÍA

Microcontroladores

Lic. Edgar Hernández García

Julio 01, de 2016.


PROPÓSITO DEL CURSO

Una de las disciplinas relevantes en la formación de un Ingeniero Mecatrónico es


aquella que emplea dispositivos microelectrónicos programados, dado que provee
las bases de la automatización de sistemas robotizados. De ahí la importancia que
el estudiante adquiera las competencias necesarias que le permitan la aplicación
de dispositivos microcontroladores en su actividad profesional.

Es así que esta asignatura tiene por objeto estudiar los fundamentos de los
microcontroladores, proponiendo el siguiente contenido:

 En la Unidad 1 adquirir los conceptos introductorios a los


microcontroladores.
 En la Unidad 2 verificar la arquitectura interna de un microcontrolador.
 En la Unidad 3 reconocer las características eléctricas del microcontrolador.
 En la Unidad 4 se investigarán las distintas herramientas de desarrollo de
los microcontroladores.
 La Unidad 5 servirá para observar los distintos modos de uso de los puertos
de entrada y salida de un microcontrolador.
 La Unidad 6 permitirá ejercitar el uso de las interrupciones de un
microcontrolador.
 Se desarrollarán aplicaciones utilitarias en la programación de
microcontroladores en la Unidad 7.
 Los convertidores de ADC y DAC en su uso con CI microcontroladores se
verifican en la unidad 8.
 Diversos protocolos de manejo de puertos de comunicación serial y el uso
de memorias se introducen en la unidad 9.

La materia de Microcontroladores emplea los conocimientos adquiridos de la


materia de Programación Básica con el tema de fundamentos del lenguaje; de la
materia de Electrónica Digital con temas de códigos y sistemas numéricos,
compuertas lógicas y álgebra booleana; de la materia Electrónica Analógica con el
tema de dispositivos semiconductores; de Análisis de Circuitos Eléctricos con
temas de análisis de circuitos de CD y CA.

A su vez esta materia da soporte a las materias de Robótica y Controladores


Lógicos Programables, así como a otras directamente vinculadas con
desempeños profesionales.
Contenido
1. Conceptos introductorios a los microcontroladores ....................................................... 6
1.1. Cronología abreviada ............................................................................................... 6
1.2. Conceptos básicos .................................................................................................... 7
1.3. Características y aplicaciones de los microcontroladores ........................................ 9
1.4. Tipos de microcontroladores y sus fabricantes ...................................................... 11
2. Arquitectura interna del microcontrolador ................................................................... 13
2.1. Estructura interna de un microcontrolador ............................................................ 13
2.2. Tipos y distribución de las memorias internas ....................................................... 16
2.2.1. Memoria de programa .................................................................................... 17
2.2.2. Memoria de Datos .......................................................................................... 19
2.2.3. Registros especiales ........................................................................................ 22
2.2.4. Estado predeterminado de los registros especiales ......................................... 31
2.3. Recursos especiales ................................................................................................ 33
2.4. Palabra de configuración ....................................................................................... 35
2.5. Instrucciones del microcontrolador. ...................................................................... 38
2.5.1. Instrucciones orientadas a bits ........................................................................ 38
2.5.2. Instrucciones orientadas a Registros............................................................... 38
2.5.3. Instrucciones orientadas al control del flujo del proceso ............................... 39
2.6. Ejemplo de uso de instrucciones en Ensamblador ................................................. 40
3. Características eléctricas del microcontrolador ............................................................ 42
3.1. Distribución de terminales ..................................................................................... 42
3.2. Características del reloj del sistema ....................................................................... 43
3.2.1. Modo oscilador XT, LP y HS ......................................................................... 44
3.2.2. Modo oscilador RC......................................................................................... 45
3.2.3. Oscilador externo ............................................................................................ 47
3.3. El Reset y sus fuentes ............................................................................................ 48
3.3.1. Reset a la alimentación ................................................................................... 49
3.3.2. Reset manual .................................................................................................. 51
3.3.3. Origen del reset ............................................................................................... 51
3.4. Características de la fuente de alimentación del MCU .......................................... 51
3.5. Ejemplo de circuitos osciladores empleando un reset ........................................... 53
4. Herramientas de desarrollo de los microcontroladores ................................................ 55
4.1. Lenguajes de bajo y de alto nivel ........................................................................... 55
4.2. Ambiente integrado de desarrollo para microcontroladores .................................. 56
4.2.1. Ensamblador y compilador ............................................................................. 57
4.2.2. Simulador, depurador y emulador .................................................................. 57
4.2.3. Dispositivos programadores de microcontroladores ...................................... 59
4.3. Ejemplos básicos de programación ........................................................................ 61
5. Puertos de entrada y salida ........................................................................................... 70
5.1. Arquitectura de los puertos de entrada y salida ..................................................... 70
5.2. Configuración y características eléctricas de los puertos de E/S ........................... 72
5.3. Uso de los puertos con interfaces para dispositivos periféricos ............................ 72
5.3.1. Displays de 7 segmentos ................................................................................ 73
5.3.2. Teclado matricial ............................................................................................ 78
5.3.3. Sensores de proximidad .................................................................................. 83
5.4. Uso de los puertos para manejo de dispositivos de potencia ................................. 88
6. Interrupciones en un microcontrolador......................................................................... 93
6.1. Manejo de interrupciones ....................................................................................... 93
6.1.1. Vector de interrupción .................................................................................... 93
6.1.2. Rutina de Servicio de Interrupción ................................................................. 94
6.1.3. Las interrupciones y el registro OPTION ....................................................... 95
6.2. Ejemplo de una interrupción externa ..................................................................... 97
6.3. Ejemplo de una interrupción por temporización .................................................... 99
7. Programación del microcontrolador con aplicaciones................................................ 103
7.1. Programación de microcontroladores en PIC C Compiler .................................. 103
7.2. Encendido de un LED con CCS .......................................................................... 103
7.3. Interrupción del TIMER0 en CCS ....................................................................... 105
7.4. Control de un LCD 16×2 ..................................................................................... 107
7.5. Ejercicios sumativos ............................................................................................ 112
8. Convertidores ADC y DAC........................................................................................ 114
8.1. Conceptos básicos de la conversión Analógico-Digital ...................................... 114
8.2. Características técnicas del conversor AD del 16F877A ..................................... 115
8.3. Configuración básica del ADC del 16F877A ...................................................... 116
8.4. Aplicación básica del módulo ADC .................................................................... 117
8.5. Proyecto: Circuito automático de refresco de temperatura .................................. 120
9. Puertos seriales ........................................................................................................... 121
9.1. Comunicación serial en un PIC ........................................................................... 121
9.2. Protocolo USART ................................................................................................ 121
9.3. USART en CCS C ............................................................................................... 122
9.4. Ejemplo de comunicación USART en un PIC16F877A ..................................... 123
9.5. Proyecto: Circuito de refresco a distancia y LCD ............................................... 126
Bibliografía ......................................................................................................................... 127
1. Conceptos introductorios a los microcontroladores
En esta unidad el estudiante:
Cataloga los diferentes tipos y características de los microcontroladores.

1.1. Cronología abreviada


Los microcontroladores fueron la consecuencia del desarrollo de los dispositivos
microprocesadores: 6
 En 1971 Intel fabrica el primer microprocesador de tipo PMOS, el 4004, que podía
direccionar 4096 localidades de memoria de 4 bits, reconocía 45 instrucciones,
ejecutando cada una a la velocidad de 20μs.
 En 1972 Intel lanza el 8008, manejando 16 kB de memoria de 8 bits de longitud
(byte), pero a la misma velocidad que su predecesor.
 En 1973 aparece el primer microprocesador de tecnología NMOS: el 8080 de Intel,
con la capacidad de realizar 500000 operaciones por segundo con un
direccionamiento de memoria de 64kB. Otras compañías también fabricaban sus
propios microprocesadores.
 En 1975 el Z80 de Zilog es uno de los microprocesadores de 8 bits más potentes y
Motorola abarata los costos de sus modelos 6501 y 6502. Fiebre de
microprocesadores y sistemas operativos igual a incompatibilidades entre
dispositivos de distintos fabricantes.
 En 1975 aparecen los primeros microcontroladores (microcomputadoras de un solo
chip): el 8048 de Intel y el 6805R2 de Motorola.

Figura 1.1. Enfoque cronológico de los microprocesadores y los microcontroladores.


 En la década de los 80’s el desarrollo tecnológico enfoca a los microprocesadores
como dispositivos para manejo de grandes volúmenes de información. Los
microcontroladores en cambio se enfocan a la incorporación de una mayor cantidad
de capacidades para interactuar con el medio físico.

Figura 1.2. Aplicabilidad de los dispositivos microcontroladores y microprocesadores.

1.2. Conceptos básicos


Para entender de manera más precisa las diferencias entre un microprocesador y un
microcontrolador debemos observar en primer término la estructura fundamental de una
computadora, esquema que presentamos en la figura 1.3.

Figura 1.3. Estructura fundamental de una computadora.

Una descripción más profunda de la organización de los componentes mostrados en el


diagrama anterior daría lugar a distintos diseños de la Arquitectura de una computadora. La
arquitectura de computadora más usada actualmente se denomina Arquitectura Princeton
o Von Newman y tiene la característica de poseer un único bus para el traslado de
información sin hacer distinción entre datos e instrucciones (figura 1.4).
8

Figura 1.4. Esquema de la arquitectura Von Newman.

La arquitectura Harvard implementa buses separados para datos e instrucciones, por lo


que se gana en velocidad, puesto que puede realizarse una lectura de instrucciones al
tiempo que puede tenerse acceso a la memoria de datos al mismo tiempo (figura 1.5).

Figura 1.5. Esquema de la arquitectura Harvard.

En ambos esquemas es posible observar como elemento rector al CPU (Central Processing
Unit, unidad central de procesamiento) el cual se compone fundamentalmente de:

 Unidad lógica-aritmética (ALU, Arithmetic Logic Unit), elemento encargado de la


realización de operaciones aritméticas y lógica.
 Unidad de control (CU, Control Unit), que se encarga de extraer instrucciones de la
memoria, descifrarlas y ejecutarlas, realizando llamadas a la ALU cuando es
necesario.
Figura 1.6. Esquema de un CPU. 9

Es necesario conocer los conceptos anteriores, si consideramos que:


 El CPU ordena y controla el procesamiento de transferencia de la información en
una computadora. Interpreta las instrucciones y coordina su ejecución.
 Un microprocesador (abreviado como µP) es un CPU de un solo circuito integrado
(chip).
 Una microcomputadora (o simplemente computadora) es un sistema cuyo CPU es
un μP.
 Un microcontrolador (µC) es una microcomputadora de un solo circuito integrado.

Entonces un microcontrolador es una computadora en sí misma, con la diferencia de que


está pensado para aplicaciones específicas y no maneja grandes volúmenes de información.
Mientras las computadoras compatibles PC utilizan una arquitectura Von Newman, los
microcontroladores emplean arquitectura Harvard.

1.3. Características y aplicaciones de los microcontroladores


Dado que son diseñados para disminuir el coste económico y el consumo de energía de un
sistema en particular, el tamaño de la CPU, la cantidad de memoria y los periféricos
incluidos dependerán de la aplicación que se les vaya a dar.

Figura 1.7. Principales características de un microcontrolador.


Por ejemplo, el control de un electrodoméstico sencillo como una batidora, utilizará un
procesador muy pequeño (4 u 8 bit) por que sustituirá a un autómata finito; en cambio un
reproductor de música y/o vídeo digital (mp3 o mp4) requerirá de un procesador de 32 bit o
de 64 bit y de uno o más códecs (de audio y/o vídeo); el control de un sistema de frenos
ABS se basa normalmente en un microcontrolador de 16 bit, al igual que el sistema de
control electrónico del motor.
Entonces entre las características a tomar en cuenta al requerir de un microncontrolador 10
tenemos:
 Procesador. Determina las principales características, tanto a nivel hardware como
software pues se encarga de direccionar la memoria de instrucciones, recibir el
código OP de la instrucción en curso, su decodificación y la ejecución de la
operación que implica la instrucción, así como la búsqueda de los operandos y el
almacenamiento del resultado.
 Memoria. En los microcontroladores la memoria de instrucciones y datos está
integrada en el propio chip. Una parte debe ser no volátil, tipo ROM, y se destina a
contener el programa de instrucciones que gobierna la aplicación. Otra parte de
memoria será tipo RAM, volátil, y se destina a guardar las variables y los datos.
Como el microcontrolador sólo se destina a una tarea en la memoria ROM, sólo hay
que almacenar un único programa de trabajo. La RAM en estos dispositivos es de
poca capacidad pues sólo debe contener las variables y los cambios de información
que se produzcan en el transcurso del programa. Por otra parte, como sólo existe un
programa activo, no se requiere guardar una copia del mismo en la RAM pues se
ejecuta directamente desde la ROM.
 Puertas de Entrada y Salida. Las puertas de Entrada y Salida (E/S) permiten
comunicar al procesador con el mundo exterior, a través de interfaces, o con otros
dispositivos. Estas puertas, también llamadas puertos, son la principal utilidad de las
patas o pines de un microcontrolador. Según los controladores de periféricos que
posea cada modelo, las líneas de E/S se destinan a proporcionar el soporte a las
señales de entrada, salida y control.
 Reloj principal. Todos los microcontroladores disponen de un circuito oscilador
que genera una onda cuadrada de alta frecuencia, que configura los impulsos de
reloj usados en la sincronización de todas las operaciones del sistema. Esta señal del
reloj es el motor del sistema y la que hace que el programa y los contadores
avancen. Generalmente, el circuito de reloj está incorporado en el microcontrolador
y sólo se necesitan unos pocos componentes exteriores para seleccionar y estabilizar
la frecuencia de trabajo. Dichos componentes suelen consistir en un cristal de
cuarzo junto a elementos pasivos o bien un resonador cerámico o una red RC.
Aumentar la frecuencia de reloj supone disminuir el tiempo en que se ejecutan las
instrucciones, pero lleva aparejado un incremento del consumo de energía y de calor
generado.
 Temporizadores o Timers. Se emplean para controlar periodos de tiempo
(temporizadores) y para llevar la cuenta de acontecimientos que suceden en el
exterior (contadores). Para la medida de tiempos se carga un registro con el valor
adecuado y a continuación dicho valor se va incrementando o decrementando al
ritmo de los impulsos de reloj o algún múltiplo hasta que se desborde y llegue a 0,
momento en el que se produce un aviso. Cuando se desean contar acontecimientos
que se materializan por cambios de nivel o flancos en alguna de las patitas del
microcontrolador, el mencionado registro se va incrementando o decrementando al
ritmo de dichos impulsos. 11

Las aplicaciones de los microcontroladores las podemos encontrar en: Periféricos y


dispositivos auxiliares de computadoras; electrodomésticos; equipos portátiles y de bolsillo
(tarjetas, monederos, teléfonos, etc.), máquinas expendedoras y juguetería;
instrumentación; industria de automoción; control industrial y robótica; electromedicina;
sistemas de navegación espacial; sistemas de seguridad y alarma; Domótica.

Figura 1.8. Aplicaciones del microcontrolador.

1.4. Tipos de microcontroladores y sus fabricantes


La clasificación más típica de los microcontroladores hace referencia a la longitud de
palabra que pueden manejar: 4, 8, 16 o 32 bits. Si bien, al variar la arquitectura y la
funcionalidad del procesador, también se pueden clasificar de acuerdo al juego de
instrucciones que el dispositivo emplea para ser programado:

 CISC. Un gran número de procesadores usados en los microcontroladores están


basados en la filosofía CISC (Computadores de Juego de Instrucciones Complejo).
Disponen de más de 80 instrucciones máquina en su repertorio, algunas de las
cuales son muy sofisticadas y potentes, requiriendo muchos ciclos para su
ejecución. Una ventaja de los procesadores CISC es que ofrecen al programador
instrucciones complejas que actúan como macros.
 RISC. Tanto la industria de los computadores comerciales como la de los
microcontroladores están decantándose hacia la filosofía RISC (Computadores de
Juego de Instrucciones Reducido). En estos procesadores el repertorio de
instrucciones máquina es muy reducido y las instrucciones son simples y,
generalmente, se ejecutan en un ciclo. La sencillez y rapidez de las instrucciones
permiten optimizar el hardware y el software del procesador.
 SISC, Computadores de Juego de Instrucciones Específico). En los
microcontroladores destinados a aplicaciones muy concretas, el juego de
instrucciones, además de ser reducido, es "específico", es decir, las instrucciones se 12
adaptan a las necesidades de la aplicación prevista.

En la actualidad existen diversos fabricantes de microcontroladores, que producen los


dispositivos por categorías que discriminan cada componente por la cantidad de bits que se
emplean y por el juego de instrucciones que manejan. La siguiente tabla presenta los
principales fabricantes.

Tabla 1. Principales fabricantes de microcontroladores


Empresa 8 bits 16 bits 32 bits
SAM7
AVR (mega y tiny),89Sxxxx (ARM7TDMI), SAM3
Atmel
familia similar 8051 (ARM Cortex-M3), SAM9
(ARM926), AVR32
Freescale
68HC05, 68HC08,68HC11, HCS08 68HC12, 68HCS12, 68HCSX12,68HC16 683xx, PowerPC, ColdFire
(antes Motorola)
Holtek HT8
MCS-48 (familia 8048)
Intel MCS51 (familia 8051) MCS96, MXS296
8xC251
National
COP8
Semiconductor
Familia 10f2xx Familia 12Cxx
PIC24F, PIC24H y dsPIC30FXX,
Microchip Familia 12Fxx, 16Cxx y 16Fxx PIC32
dsPIC33F con motor dsp integrado
18Cxx y 18Fxx
NXP
Cortex-M3, Cortex-M0,
Semiconductors 80C51 XA
ARM7, ARM9
(antes Philips)
Renesas
RX, V850, SuperH, SH-
(antes Hitachi, 78K, H8 H8S, 78K0R, R8C, R32C/M32C/M16C
Mobile, H8SX
Mitsubishi y NEC)
STMicroelectronics ST 62, ST 7 STM32 (ARM7)
C2000, Cortex-M3 (ARM),
Texas Instruments TMS370 MSP430
TMS570 (ARM)
Zilog Z8, Z86E02
2. Arquitectura interna del microcontrolador
En esta unidad el estudiante:
 Define la arquitectura interna del microncontrolador.

2.1. Estructura interna de un microcontrolador


Revisar la estructura de las diversas marcas y modelos de microcontroladores sería una
labor que saldría de las metas de éste curso, por lo que, a manera de ejemplo, nos 13
concentraremos en una marca, Microchip, y en su modelo PIC16F84A.

El nombre verdadero de este microcontrolador es PICmicro (Peripheral Interface


Controller), conocido bajo el nombre PIC. Su primer antecesor fue creado en 1975 por la
compañía General Instruments. Este chip denominado PIC1650 fue diseñado para
propósitos completamente diferentes. Diez años más tarde, al añadir una memoria
EEPROM, este circuito se convirtió en un verdadero microcontrolador PIC.

Todos los microcontroladores PIC utilizan una arquitectura Harvard, lo que quiere decir
que su memoria de programa está conectada a la CPU por más de 8 líneas. Hay
microcontroladores de 12, 14 y 16 bits, dependiendo de la anchura del bus.

Tabla 2.1. Gamas de microcontroladores PICmicro.

Entre sus ventajas:


 Eficiencia del código, permiten una gran compactación de los programas.
 Rapidez de ejecución, a frecuencia de 20MHz->5 millones de
instrucciones/segundo.
 Seguridad en acceso por la separación de memoria de datos y de programa.
 Juego reducido de instrucciones y de fácil aprendizaje.
 Compatibilidad de pines y código entre dispositivos de la misma familia o sin
reducción de las prestaciones internas (muy versátiles).
 Gran variedad de versiones en distintos encapsulados (desde 8 hasta 84 pines) sin
reducción de las prestaciones internas (muy versátiles).
14
 Posibilidad de protección del código muy fiable.
 Herramientas de desarrollo software y hardware abundantes y de bajo coste.

Hasta hace algunos años el PIC16F84A era más frecuentemente utilizado en el aprendizaje
de estos dispositivos, hoy día es considerado obsoleto, aunque aún existe una amplia
documentación respecto a aplicaciones del mismo.

Figura 2.1. Microcontrolador PIC16F84A

Refiriéndonos a él sus principales características son:

 Memoria flash del programa: 1 kB.


 Memoria de datos RAM: 68 bytes.
 Memoria de datos EEPROM: 64 bytes.
 Pila (STACK): 8 niveles.
 Interrupciones: 4 tipos diferentes (pata externa RB0/INT, exceso del temporizador
TMR0, interrupción al cambio PORTB<7:4> y al completar la escritura del
EEPROM de datos).
 Juego de instrucciones: 35.
 Frecuencia de trabajo: 20 MHz máxima.
 Temporizadores: sólo uno, el TMR0 de 8 bits con preescaler (divisor de frecuencia)
programable de 8 bits. También tiene perro guardián (WDT).
 Líneas de E/S digitales: 13 (5 Puerto A y 8 Puerto B) con control individual de
dirección.
 Voltaje de alimentación: 2 a 6 V DC.
 Registros de hardware de funciones especiales: 15.
 Extensión de instrucciones:14 bits.
 Extensión de datos: 8 bits.
 Modos de acceso: directo, indirecto y relativo.
 Ciclo de instrucción: 2 para saltos y 1 para el resto. 15
 Memoria de programa de 1000 ciclos de escritura/borrado de flash reforzado.
 Memoria de datos EEPROM de 10,000,000 de ciclos de borrado/escritura típica.
 Retención de datos de EEPROM de >40 años.
 Programación en serie dentro del circuito (ICSP = In Circuit Serial Programming)
mediante dos pines.
 Power-On Reset (POR), Power-up Timer (PWRT), Oscillator Start-up Timer
(OST).
 WatchDog Timer (WDT) con su propio oscilador rc incorporado en el chip para un
funcionamiento confiable.
 Protección de códigos.
 Modo SLEEP para economizar consumo.
 Opciones seleccionables de oscilador.
 Tecnología CMOS con flash reforzado y EEPROM.
 Tecnología de baja potencia y alta velocidad.
 Diseño estático completo.
 Rango amplio de tensiones de funcionamiento comercial e industrial: 2.0 Volts a
5.5 Volts.
 Consumo muy bajo:
o Menor a 2 mA típico de corriente a 5 Volts, 4 MHz.
o Menor a 0,5 μA típico de corriente en reposo a 2 Volts.

En la figura 2.2 mostramos la arquitectura básica del 16F84A, en el que veremos diversos
elementos que al momento de la programación resultarán vitales en el funcionamiento
correcto de nuestras aplicaciones.

Otro microcontrolador muy útil en el aprendizaje, pero con más recursos y prestaciones es
el PIC16F877A, que en general es una mejora del 84A, contando con cinco puertos de
entrada y salida optimizadas para comunicación serial, conversiones analógica-digital entre
otras prestaciones. El fabricante en fechas recientes informa que este dispositivo será
descontinuado proponiendo el uso del PIC16887.
16

Figura 2.2. Arquitectura del PIC16F84A.

2.2. Tipos y distribución de las memorias internas


En un microcontrolador PIC de gama media como el PIC16F84A podemos distinguir tres
bloques de memoria:

 Memoria de programa. Posee 8192 posiciones para instrucciones de 14 bits de


longitud y está organizada en páginas de 2,048 posiciones, sin embargo, en el
16F84A sólo se han implementado las primeras 1000. Es memoria de tipo FLASH
no volátil y es en donde se almacenan las instrucciones que gobiernan la aplicación.
 Memoria de datos RAM. Es una memoria volátil que guarda variables y datos. Los
registros que maneja son de 8 bits.
 Memoria de datos EEPROM. Es una memoria de datos de lectura y escritura no
volátil que permite garantizar que determinada información estará siempre
disponible al reinicializarse el programa. Se gestiona de manera distinta a la
memoria de datos RAM.
17

Figura 2.3. Diagrama a bloques del PIC16F84A mostrando las memorias.

2.2.1. Memoria de programa


El microcontrolador está diseñado para que en su memoria de programa se almacenen todas
las instrucciones del programa de control. Como éste siempre es el mismo, debe estar
grabado de forma permanente. Existen algunos tipos de memoria adecuados para soportar
estas funciones, de las cuales se citan las siguientes:

 ROM con máscara, se graba mediante el uso de máscaras. Sólo es recomendable


para series muy grandes debido a su elevado coste.
 EPROM: se graba eléctricamente con un programador controlador por un PC.
Disponen de una ventana en la parte superior para someterla a luz ultravioleta, lo
que permite su borrado. Puede usarse en fase de diseño, aunque su coste unitario es
elevado.
 OTP: su proceso de grabación es similar al anterior, pero éstas no pueden borrarse.
Sus bajos costes las hacen idóneas para productos finales.
 EEPROM: también se graba eléctricamente, pero su borrado es mucho más sencillo,
ya que también es eléctrico. No se pueden conseguir grandes capacidades y su
tiempo de de escritura y su consumo es elevado.
 FLASH: se trata de una memoria no volátil, de bajo consumo, que se puede escribir
y borrar en circuito al igual que las EEPROM, pero que suelen disponer de mayor
capacidad que estas últimas. Son recomendables aplicaciones en las que es
necesario modificar el programa a lo largo de la vida del producto. Por sus mejores
prestaciones, está sustituyendo a la memoria EEPROM para contener instrucciones.
18
Con anterioridad Microchip comercializaba dos microcontroladores prácticamente iguales
que sólo se diferencian en que la memoria de programa de uno de ellos es tipo EEPROM y
la del otro tipo Flash, hablamos trata del PIC16C84 y el PIC16F84, respectivamente.

La memoria de programa almacena todas las


instrucciones de la aplicación en ejecución, la cual
estará grabada de forma permanente. La
información contenida en esta memoria se graba
previamente mediante un equipo físico denominado
programador o grabador (figura 2.4). Esta memoria
es denominada ROM Flash y admite unas 1000
grabaciones durante la vida útil del circuito
integrado.
Todas las instrucciones ocupan una posición de
memoria (figura 2.5).
Figura 2.4. Grabador de PIC K150.

Existen dos posiciones de memoria que son de particular importancia: la dirección 0 que es
la posición de reinicio del microcontrolador (RESET) y a la posición 4 que es una posición
de redirección a la que se apunta tras una interrupción de programa cualquiera.

Figura 2.5. Mapa de la memoria de programa.


A la memoria de programa de los PIC16 se accede mediante un registro de 13 bits que
actúa como puntero de la instrucción que se debe ejecutar en el siguiente ciclo de
instrucción. Este registro de 13 bits se denomina Contador de Programa (Program Counter)
y su acrónimo es PC (ver figura 2.5).

Con este contador de programa de 13 bits se pueden direccionar 8K posiciones de memoria.


Debido a que la codificación de las instrucciones es de 14 bits y para aprovechar las
ventajas de la arquitectura Harvard, cada una de esas 8K posiciones corresponde a una 19
instrucción y por tanto, el contador de programa es capaz de direccionar 8K x 14 posiciones
o 8000 instrucciones. Como cada instrucción ocupa una posición de memoria resulta
mucho más fácil saber si un dispositivo tiene memoria de programa suficiente para una
aplicación.

Los 8K de memoria de programa disponible están


divididos en 4 páginas de 2K cada una (0h–7FFh,
800h-FFFh, 1000h-17FFh y 1800h-1FFFh). Esto es
debido a que las instrucciones de salto y llamada a
subprograma permiten cargar sólo 11 bits en el PC
(desplazamiento en 211 = 2K), tal como se muestra en
la figura 2.6. Si se están ejecutando instrucciones
secuencialmente, el contador de programa pasará de
una página a otra sin necesidad de intervención por
parte del usuario o programador.

Para saltar entre páginas de la memoria de programa


los 2 bits más altos del PC deben modificarse. Esto
se realiza escribiendo en el registro PCLATH
(registro situado en la memoria de datos).

La instrucción CALL y las interrupciones originan la


carga del contenido del PC en el nivel superior de la
pila y con las instrucciones RETURN, RETLW y
RETFIE se saca el contenido del nivel superior de la
misma. Figura 2.6. Paginado de memoria
de programa.

2.2.2. Memoria de Datos


Los microcontroladores PIC funcionan con datos de 8 bits por lo que las posiciones de la
memoria de datos tienen esa longitud. La memoria de datos se organiza en "bancos",
pudiendo existir hasta cuatro en los modelos de mayor capacidad (figura 2.7).
El banco 0 tiene un tamaño de 32 bytes,
mientras que todos los demás sólo disponen de
16. El banco 0 ocupa las 32 primeras posiciones
de la memoria y lo poseen todos los modelos de
PIC16XXX. Las 16 posiciones de menos peso
de los bancos 1, 2 y 3 no son accesibles y
cuando se direcciona desde el valor 00h al 0Fh,
siempre se acude al banco 0. Cuando la
dirección está comprendida entre la 10h y la 20
1Fh, hay que seleccionar a cuál de los cuatro
posibles bancos corresponde con los bits 6 y 5
del registro FSR.

La memoria de datos funciona de forma similar


al "banco de registros" de un procesador por lo
cual sus posiciones implementan registros de
propósito especial y de propósito general. Las
ocho primeras posiciones del banco 0 soportan
registros específicos.

En un PIC16F84A tenemos dos zonas de


memoria de datos:

 RAM estática o SRAM, donde residen


los Registros Específicos (SFR) con 24
posiciones de tamaño byte, aunque dos
de ellas no son operativas y los Registros
de Propósito General (GPR) con 68. La
RAM del PIC16F84A se halla dividida
en dos bancos (banco 0 y banco 1) de
128 bytes cada uno. Figura 2.7. Mapa de memoria de datos.
 EEPROM, de 64 bytes donde,
opcionalmente, se pueden almacenar
datos que no se pierden al desconectar la
alimentación.

En el 16F84A se toman 9 bits para seleccionar


una localidad en la memoria de datos (figura
2.8).

Figura 2.8. Direccionamiento de


memoria.
Existen 2 modos de direccionamiento para acceder a cualquiera de las posiciones de la
memoria de datos:
 Direccionamiento directo: La posición de memoria con la que se trabaja viene
directamente definida en el código de la instrucción.
 Direccionamiento indirecto: La posición de memoria con la que se trabaja viene
definida por el contenido del registro FSR (Posición 04h, 84h, 104h o 184h), es
decir, el registro FSR actúa como puntero de la posición de memoria con la que se
pretende operar.
21

Figura 2.9. Direccionamiento directo e indirecto en un PIC.

Tanto para el direccionamiento directo como el indirecto la dirección completa (9 bits) no


se puede obtener del código de la operación (7 bits) o del registro FSR (8 bits), por lo que:
 Para direccionamiento directo, la dirección a operar se obtiene completando la
dirección incluida en el código de la instrucción con los bits RP1:RP0 del registro
STATUS.
 Para direccionamiento indirecto, la dirección se obtiene completando el contenido
del registro FSR con el bit IRP del registro STATUS.

Tabla 2. Modos de direccionamiento.


Banco accedido Directo (RP1:RP0) Indirecto (IRP)
0 0 0
0
1 0 1
2 1 0
1
3 1 1
2.2.3. Registros especiales
Los registros de propósito general son las áreas de la RAM donde el usuario puede alojar
datos de manera temporal mediante la creación de variables. Los registros especiales en
cambio sirven para evaluar y controlar el funcionamiento del dispositivo, por lo que
merecen especial atención. Estos registros están repartidos en dos bancos, el 0 y el 1, y
situados en las 12 primeras posiciones o registros de cada uno (00h-0Bh, y 80h-8Bh). La
figura 2.10 muestra los registros especiales del 16F84A clasificados por banco.

22

Figura 2.10. Registros especiales en la memoria de datos del 16F84A.

Revisamos ahora la descripción de los registros especiales más comúnmente usados.

 Registro INDF (00h y 80h). El registro INDF (Indirect File) que ocupa la posición
00 no tiene existencia física, por lo que no se podrá acceder a él. En realidad, este
registro sirve únicamente para especificar la utilización del direccionamiento
indirecto junto con el registro FSR.
 Registro TMR0 (01h). El registro TMR0 (Timer 0) almacena el valor del contador
TMR0, que como ya sabemos, está funcionando continuamente e incrementando el
valor que tiene almacenado. Las opciones que controlan este contador residen en el
registro OPTION. El registro TMR0 se incrementa en una unidad con cada impulso
de reloj seleccionado mediante el registro OPTION. Cada vez que llega al valor FF,
vuelve a 00 generando una interrupción, si se ha autorizado, y continúa su ciclo
indefinidamente. El registro TMR0 se puede leer o escribir directamente con
cualquier instrucción, con el fin de conocer su posición actual, o para inicializarlo
en un estado determinado. Es importante saber que después de cualquier escritura
en este registro, es necesario un retardo de dos ciclos de instrucción para que se
retome la incrementación, independientemente de la fuente de reloj usada. Las 23
instrucciones concernidas son MOVF TMR0 o CLRF TMR0. El reloj interno deja
de funcionar en el modo SLEEP, por lo que no se puede contar con sus
interrupciones en este modo ni por consiguiente, que salga de este modo de
funcionamiento por medio de dicha interrupción. Obsérvese que todas las
instrucciones que escriben en el TMR0 ponen a cero al prescaler (divisor), cuando
éste está asignado al temporizador.
 Contador de programa PC (02h y 82h). Este registro, normalmente denominado
PC (Program Counter), es equivalente al de todos los microprocesadores y contiene
la dirección de la próxima instrucción a ejecutar. Se incrementa automáticamente al
ejecutar cada instrucción, de manera que la secuencia natural de ejecución del
programa es lineal, una instrucción después de la otra. Algunas instrucciones (que
llamaremos de control) cambian el contenido del PC alterando la secuencia lineal de
ejecución. Otras instrucciones de control como los saltos condicionales, que
producen un incremento adicional del PC si se cumple una condición específica,
haciendo que el programa salte, sin ejecutar, la instrucción siguiente. El PC está
implementado por dos registros, PCLATH (5 bits) y PCL (8 bits)
o Los 8 bits de menor peso del PC los proporciona el registro PCL (02h) y a
diferencia de la mayoría de los microprocesadores convencionales, es
también un registro accesible al programador como registro de memoria
interna de datos. Es decir que cualquier instrucción común que opere sobre
registros puede ser utilizada para alterar el PCL y desviar la ejecución del
programa.
o Los 5 bits de mayor peso del PC que no pueden leerse ni escribirse
directamente proceden del registro PCLATH en la dirección 0Ah y 8Ah.
En la instrucción de salto relativo, el resultado de las mismas sólo afecta a los 8 bits
de menor peso. Los 5 bits de mayor peso se suministran desde PCLATH (figura
2.11 (a)). En las instrucciones GOTO y CALL se efectúa la misma operación
teniendo presente que el PC se codifica mediante 11 bits y se suministran en la
propia instrucción, desde el código OP. Los dos bits de más peso del PC de cargan
con los bits 4 y 3 del registro PCLATH (figura 2.11 (b)).
Dado que la memoria de programa se organiza en páginas de 2 K, la posición de la
memoria la indican los 11 bits de menor peso del PC y los 2 bits de mayor peso
indican la página. El reset pone a 0 todos los bits de PCL y PCLATH haciendo que
el reinicio comience en la dirección 0000h.

24
(a) (b)
Figura 2.11. Carga del PC: (a) Por salto relativo; (b) Por salto absoluto.

Los ocho registros de pila no están situados en el mismo espacio de memoria que
los demás (figura 2.12). Son registros de trece bits capaces de contener íntegramente
al PC. Su utilización es automática, ya que el PC se introduce en la pila durante la
ejecución de una instrucción CALL o de una interrupción, y se extrae de la pila
durante la ejecución del retorno correspondiente.

Figura 2.12. Posición del STACK o pila, círculo verde.

Cuando los datos contenidos en el PC son almacenados o extraídos de la pila el


registro PCLATH no se ve modificado. Estos registros de pila deben considerarse
como un buffer de memoria circular, lo que significa que, si se introduce más de 8
valores del PC, el noveno valor tomará la posición del primero, y así sucesivamente.
Ningún bit de registro indica que la pila está llena, por lo que debemos tener
cuidado de que no se desborde.
 Registro de Estado (03h y 83h). El registro de Estado (STATUS) contienen varios
bits de estado de la unidad central, el estado aritmético de la ALU, el estado del
reset y un par de bits de selección de página denominados RP1 y RP0. Ocupa la
posición 03h del banco 0 y la 83h del banco 1. Algunos de estos bits los podemos
cambiar manualmente a través del programa. Otros no los activamos nosotros, sino
que los activa automáticamente el PIC cuando se dan ciertos procesos. Estos bits se
llaman flags (banderas). Para hacernos una idea práctica una bandera se levanta (se
pone a 1) cuando ha pasado algo, al igual que ocurre en el fútbol con los linieres. El
registro STATUS está formado por 8 bits (figura 2.13).

Figura 2.13. Organización del registro STATUS.


25
R/W significa que el bit correspondiente se puede leer y escribir, mientras que R
significa que solamente puede ser leído. También se indica el estado que se
establece tras un reset. Dada la importancia del registro, listamos a continuación las
características de cada bit.
o Bit 7, IRP: Selección del banco en direccionamiento indirecto. Este bit
junto con el de más peso del registro FSR sirven para determinar el banco de
la memoria de datos seleccionado. En el PIC16X84 al disponer de dos
bancos no se usa y debe programarse como 0.
o Bit 6 y 5, RP0 y RP1: Register Bank Select. Selección de página o banco
de la memoria con direccionamiento directo. Cada página contiene 128
bytes. Como el PIC16X84 sólo tiene dos bancos únicamente se emplea RP0
de forma que cuando vale 0 se accede al banco 0 y cuando vale 1 se accede
al banco 1. Después de un reset, RP0 se pone automáticamente a 0. RP1
debe mantenerse a 0. El bit RP1 deberá ser puesto a cero, ya que si no nos
saldríamos del rango de memoria.

Figura 2.14. Configuración de bits para selección de bancos.

o Bit 4 (flag), TO: Time Out. Tiempo de término o acabado, es una bandera
o señalador:
 1. Se pone a 1 tras conectar la alimentación o al ejecutar CLRWDT o
SLEEP.
 0. Se pone a 0 por desbordamiento del Perro Guardián WDT.
o Bit 3 (flag), PD: Power Down. Apagado, también es una bandera:
 1. Se pone automáticamente a 1 tras conectar la alimentación VDD o
ejecutar CLRWDT, que resetea el contador WatchDog.
 0. Se pone a 0 al ejecutar la instrucción SLEEP.
o Bit 2 (flag), Z. Bandera indicadora de cero (Zero) aritmético:
 1 = El resultado de una operación aritmética o lógica es 0.
 0 = El resultado es distinto de 0.
o Bit 1 (flag), DC (Digit Carry). Acarreo en el 4º bit de menos peso.
Funciona igual que el bit de Carry descrito a continuación. De interés en
operaciones en BCD.
o Bit 0 (flag), C (Carry). Acarreo en el 8º bit o bit de más peso. Es el bit de
"acarreo" en operaciones de suma AADWF y ADDLW, así como también el 26
bit de "préstamo" en las instrucciones de sustracción SUBWF y SUBLW.
También lo emplean las instrucciones RLF y RRF de rotación de bits.
 Suma:
 1. Se pone a 1 cuando se ha producido acarreo en la suma en
el bit de mayor peso con las operaciones AADWF y
ADDLW.
 0. Se pone a 0 si en la suma no se ha producido acarreo.
 Resta:
 1. Se pone a 1 si en la resta no se ha producido préstamo.
 0. Se pone a 0 cuando se ha producido préstamo en la resta
con las operaciones SUBWF y SUBLW.
 Registro FSR (04h y 84h). El contenido del FSR se utiliza para el
direccionamiento indirecto junto con el registro INDF. Este registro contiene 8 bits.
 Registros PORTA y PORTB (05h y 06h). Estos registros contienen los niveles
lógicos de las patillas de E/S. Cada bit se puede leer o escribir según la patilla
correspondiente se haya configurado como entrada o como salida. Conviene
recordar que cualquier línea puede funcionar como entrada o como salida. Sin
embargo, si actúa como entrada la información que se introduce no se memoriza,
por lo que la información debe ser mantenida hasta que sea leída. Si la línea actúa
como salida, el bit que procede del bus de datos se guarda en la báscula, con lo que
la información que ofrece esta patilla permanece invariable hasta que se reescriba
este bit.

Figura 2.15. Bits de los registros de entrada y salida del 16F84A.

 Registro EEDATA (08h). El registro EEDATA (Datos de EEPROM) guarda el


contenido de una posición de la memoria EEPROM de datos antes de su escritura o
después de su lectura, según leamos o escribamos en ella. Como ya sabemos la
memoria EEPROM es bastante lenta, dato que tendremos en cuenta cuando
accedamos a ella para escribirla, pues tarda unos 10 ms en completar el proceso.
 Registro EEADR (09h). El registro EEADR (Dirección de EEPROM) guarda la
dirección de la posición de memoria EEPROM cuando queramos acceder a ella,
bien para su lectura, o bien para su escritura. El registro EEADR puede direccionar
como máximo 256 bytes de los cuales sólo los 64 primeros están disponibles, con lo
que los dos bits de mayor peso han de tener el valor de '0'.
 Registro PCLATH (0Ah y 8Ah). El registro PCLATH (Contador de Programa 27
Alto) ya lo vimos cuando analizamos el PCL y su relación con el PC.
 Registro INTCON (0Bh y 8Bh). Este registro contiene varios bits de selección de
fuentes de interrupción, el bit de activación global de interrupciones y varios flag
que indican la causa de una interrupción. Sirve para el control global de las
interrupciones y para indicar la procedencia de algunas de ellas, gracias a los bits de
estado.
Se dispone de cuatro potenciales recursos de interrupción:
o Una fuente externa a través del pin RB0/INT.
o El desbordamiento del temporizador 0 (TMR0).
o Un cambio de estado en los pines RB4 a RB7.
o Programación de la EEPROM de datos.
Cada bit del registro INTCON tiene un significado concreto que se muestra en la
figura 2.16.

Figura 2.16. Organización de bits del registro INTCON.

Características de los bits:


o Bit 7, GIE: Habilitación global de interrupciones (Global Interrupt Enable).
 1: Concede el permiso de interrupciones.
 0: Cancela el permiso de las interrupciones.
o Bit 6, EEIE: Habilitación de las Interrupciones de la memoria EEPROM.
 1: Permite que se produzcan interrupciones debidas al fin de escritura
de la EEPROM, etc.
 0: Este tipo de interrupciones estarán inhibidas.
o Bit 5, T0IE: Habilitación de la interrupción del temporizador por
desbordamiento (Timer 0 Interrupt Enable).
 1: Autoriza las interrupciones debidas al desbordamiento del
temporizador.
 0: Interrupción del temporizador deshabilita de manera que cuando
se produzca el flag correspondiente permanecerá inactivo.
o Bit 4, INTE: Habilitación de la entrada de interrupción externa (Interrupt
Enable) por patilla RB0/INT.
 1: Autoriza las interrupciones provocadas RB0/INT del puerto B.
 0: Interrupción externa deshabilita de manera que cuando se
produzca una interrupción externa el flag correspondiente
permanecerá inactivo.
o Bit 3, RBIE: Habilitación de las interrupciones del puerto B (RB Interrupt 28
Enable).
 1: Autoriza las interrupciones provocadas por un cambio de estado
de las líneas RB4 a RB7 del puerto B.
 0: Interrupción del puerto B deshabilitada.
o Bit 2 (flag), T0IF: Bit de interrupción de desbordamiento del TMR0.
 1: El TMR0 ha rebosado. Se borra por software.
 0: El TMR0 no ha rebosado.
o Bit 1 (flag), INTF: Bit de interrupción de la Entrada de Interrupción INT
(patilla RB0/INT).
 1: La entrada de interrupción se ha activado (patilla RBO/INT del
puerto B). Se borra por software.
 0: No hay interrupción externa.
o Bit 0 (flag), RBIF: Bit de interrupción del puerto B.
 1: Cambio de estado en una de las líneas de RB4 a RB7 del puerto B.
Se borra por software.
 0: Ninguna línea de RB4 a RB7 del puerto B ha cambiado.
Cada flag o bandera individual debe ponerse a cero por software.
Solamente hay un vector de interrupción en la memoria de programa (dirección
0004h), por lo que se deben comprobar los bits de INTCON en la subrutina de
interrupción para saber cuál es la fuente de la misma.
Cuando llega una interrupción, el PIC pone el bit GIE a cero, de forma que no se
perturbe el tratamiento de la interrupción en curso, debido a otras interrupciones
eventuales. Este bit se pone automáticamente a uno al terminar la subrutina de
interrupción, con la ejecución de la instrucción RETFIE.
Los indicadores de interrupciones correspondientes permanecen funcionales incluso
cuando no se han autorizado.
En este caso también pueden leerse y escribirse todos los bits que componen este
registro.
 Registro OPTION (81h). El registro OPTION (o registro de opciones) se emplea
para programar las opciones del temporizador TMR0, el tipo de flanco con el que se
detecta una interrupción y la activación de las resistencias de polarización del puerto
B. Ocupa la posición 81h de la página 1 del banco de registros. Debe escribirse
usando la instrucción especial OPTION. Esta instrucción carga el contenido de W
en el registro OPTION.

Figura 2.17. Organización de bits del registro OPTION.


29
Descripción de bits:
o Bit 7, /RBPU (RB Pull Up). Conexión de las resistencias de polarización
del Puerto B. Se conectan todas cuando el puerto B actua como entrada.
 1: Todas las resistencias son desconectadas.
 0: Las resistencias se activan de forma individual.
o Bit 6, INTDEG (INTerrupt EDGe). Selecciona el tipo de flanco para la
interrupción externa. Este bit indica el tipo de flanco de la señal externa que
ha de provocar una interrupción en la patilla RB0/INT.
 1: La interrupción es producida por el flanco ascendente o de subida.
 0: La interrupción es producida por el flanco descendente o de
bajada.
o Bit 5, T0CS (Timer 0 Signal Source). Selección de la fuente de reloj para
el TMR0.
 1: TMR0 se usa en modo contador de los pulsos introducidos a
través de RA4/T0CKI
 0: TMR0 se usa en modo temporizador haciendo uso de los pulsos de
reloj internos (Fosc/4).
o Bit 4, T0SE (Timer 0 Signal Edge). Tipo de flanco activo de T0CKI
(patilla RA4/T0CKI).
 1 = El TMR0 se incrementa con el flanco descendente de la señal
aplicada a RA4/T0CK1.
 0 = El TMR0 se incrementa con el flanco ascendente.
o Bit 3, PSA (PreScaler Assignement). Se usa para la asignación del divisor
de frecuencias o Prescaler.
 1 = El divisor de frecuencia se asigna al WDT.
 0 = El divisor de frecuencia se asigna a TMR0.
o Bits 0, 1 y 2, PS0, PS1 y PS2 (Prescaler Rate Select Bits). Configura la
tasa del valor del divisor de frecuencia o prescaler. Difiere dependiendo que
se haya asignado al TMR0 o al WDT, ver figura 2.18.
30

Figura 2.18. Combinaciones del prescaler.

 Registro TRISA y TRISB (85h y 86h). Estos son registros de idéntica longitud
que PORTA y PORTB, respectivamente, debido a que sirven para configurar si los
bits de cada puerto serán de entrada o de salida:
o 1: La patilla del puerto correspondiente será de entrada
o 0: En este caso la patilla actuará como una salida.
Cuando se produce un reset, todos los bits de los registros TRIS pasan a tener el
valor 1 y todas las líneas de E/S actúan como entrada por evidentes motivos de
seguridad para evitar daños irreparables. Todas las patillas de E/S que no se
empleen deben ser llevadas a +5v, regla de las entradas CMOS, preferiblemente a
través de una resistencia para evitar que si por error se configurasen como salidas
puedan darse problemas si presentan un estado bajo.
 Registro EECON1 (88h). Este registro contiene configuraciones importantes
acerca de la escritura y la lectura de la EEPROM de datos. En concreto tiene 5 bits
de control, cuya distribución se presenta en la figura 2.19.

Figura 2.19. Distribución de bits del registro EECON1.

U (Unimplemented). En el registro EECON1, los tres primeros bits no están


implementados por lo que su lectura es '0'.
La descripción de bits es como sigue:
o Bit 4 (flag): EEIF. Bit de interrupción de escritura en la memoria EEPROM
(EEPROM Interrupt Flag).
 1: Este bit se pone a uno al terminar la operación de escritura en la
EEPROM, y debe ponerse a cero por software.
 0: No se ha completado la operación de escritura o no ha empezado.
o Bit 3 (flag), WRERR. Bit de error de escritura (Write Error).
 1: Este bit se pone a 1 si se produce un error de escritura de forma
prematura (Reset o Watchdog). En este caso, los contenidos de
EEADR y EEDATA no varían, de manera que el proceso pueda ser
repetido correctamente.
 0: Se ha completado la operación de escritura.
o Bit 2, WREN. Bit de habilitación de escritura. (Write Enable).
 1: Este bit debe ser habilitado para poder escribir en la EEPROM.
 0: Deshabilita la escritura de datos en la memoria EEPROM. 31
o Bit 1, WR. Bit de control de escritura (Write Data).
 1: Indica que se ha iniciado una operación de escritura. Este bit debe
ponerse a uno para escribir un dato.
 0: Indica que se ha completado una operación de escritura. El PIC lo
pone automáticamente a cero
o Bit 0, RD. Bit de control de lectura (Read Data).
 1: Inicia una lectura de la memoria EEPROM. Este bit debe ponerse
a uno para poder leer un dato.
 0: No se ha iniciado una lectura de la EEPROM. El PIC lo pone
automáticamente a cero
Los bits de control RD y WR inician operaciones de lectura y escritura
respectivamente. Estos bits sólo pueden ser puestos a '1' por software, nunca
a '0'. Son puestos a '0' cuando se completa la operación de lectura o escritura.
Para leer una posición de memoria, se debe escribir la dirección en el
registro EEADR y colocar a '1' el bit de control RD. El dato estará
disponible en un próximo ciclo de instrucción, normalmente en el siguiente,
en el registro EEDATA hasta que se lea otro o se escriba en este registro.
 Registro EECON2 (89h). Este registro no está implementado físicamente, por lo
cual no se puede leer. Tan sólo sirve para un proceso de protección de escritura que
consiste en copiar en él unos datos específicos, con el fin de evitar que un programa
por error pueda programar la EEPROM, manipulando simplemente los bits del
EECON1.

2.2.4. Estado predeterminado de los registros especiales


En la siguiente tabla, se muestran los estados que tienen los registros al alimentar el PIC,
después de un reset y al salir del modo SLEEP.
Leyenda: (u) = no cambia; (x) = desconocido; (-) = no existe, se lee como 0; ( ? ) = depende
de otras condiciones.
Notas:
 Uno o más bits de INTCON pueden quedar afectados a causa de la salida del modo
SLEEP.
 Cuando la salida del modo SLEEP se produce por una interrupción y GIE está
activado, el PC se carga con el vector de interrupción (0004 h).
 Las posibles fuentes de reset afectan de forma diversa a los contenidos de los
diferentes registros de control, de estado o de datos. En la descripción de cada
registro se indica el estado de los bits después de un reset de alimentación. Es
aconsejable examinar esta tabla después de un reset antes de cualquier utilización,
excepto en el caso de que se reinicie por programa cada registro.

Tabla 3. Estados predeterminados de los registros especiales.


Conexión Reset por MLCR Salida del modo SLEEP
Reset por WDT
Registro Direc. de la 32
en modo normal
alimentac. en modo normal en modo SLEEP por WDT por interrupción

PC - 000 h 000 h 000 h 000 h PC + 1 PC + 1

W - xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

INDF 00 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

TMR0 01 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

PCL 02 h 0000 0000 0000 0000 0000 0000 0000 0000 PC+1 PC+12

STATUS 03 h 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu

FSR 04 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

PORT A 05 h ---x xxxx ---u uuuu ---u uuuu ---u uuuu ---u uuuu ---u uuuu

PORT B 06 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

EEDATA 08 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

EEADR 09 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

PCLATCH 0A h ---0 0000 ---0 0000 ---0 0000 ---0 0000 ---u uuuu ---u uuuu

INTCON 0B h 0000 000x 0000 000u 0000 000u 0000 000u uuuu uuuu1 uuuu uuuu1

INDF 80 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

OPTION 81 h 1111 1111 1111 1111 1111 1111 1111 1111 uuuu uuuu uuuu uuuu

PCL 82 h 0000 0000 0000 0000 0000 0000 0000 0000 PC+1 PC+12

STATUS 83 h 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu

FSR 84 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu

TRIS A 85 h ---1 1111 ---1 1111 ---1 1111 ---1 1111 ---u uuuu ---u uuuu

TRIS B 86 h 1111 1111 1111 1111 1111 1111 1111 1111 uuuu uuuu uuuu uuuu

EECON1 88 h ---0 x000 ---0 ?000 ---0 ?000 ---0 ?000 ---u uuuu ---u uuuu

EECON2 89 h ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

PCLATCH 8A h ---0 0000 ---0 0000 ---0 0000 ---0 0000 ---u uuuu ---u uuuu

INTCON 8B h 0000 000x 0000 000u 0000 000u 0000 000u uuuu uuuu1 uuuu uuuu1
2.3. Recursos especiales
Cada fabricante oferta numerosas versiones de una arquitectura básica de microcontrolador.
En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en
otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. La labor del
diseñador es encontrar el modelo mínimo que satisfaga todos los requerimientos de su
aplicación. De esta forma, minimizará el costo, el hardware y el software.
Los principales recursos específicos (algunos ya comentados muy brevemente) que
incorporan los microcontroladores son:
 Temporizadores (Timers). Se emplean para controlar periodos de tiempo 33
(temporizadores) y para llevar la cuenta de acontecimientos que suceden en el
exterior (contadores). Para la medida de tiempos se carga un registro con el valor
adecuado y a continuación dicho valor se va incrementando o decrementando al
ritmo de los impulsos de reloj o algún múltiplo hasta que se desborde y llegue a 0,
momento en el que se produce un aviso. Cuando se desean contar acontecimientos
que se materializan por cambios de nivel o flancos en alguna de las patitas del
microcontrolador, el mencionado registro se va incrementando o decrementando al
ritmo de dichos impulsos.
 Perro guardián (Watchdog). Cuando el computador personal se bloquea por un
fallo del software u otra causa, se pulsa el botón del reset y se reinicializa el sistema.
Pero un microcontrolador funciona sin el control de un supervisor y de forma
continuada las 24 horas del día. El Perro guardián consiste en un temporizador que,
cuando se desborda y pasa por 0, provoca un reset automáticamente en el sistema.
Se debe diseñar el programa de trabajo que controla la tarea de forma que refresque
o inicialice al Perro guardián antes de que provoque el reset. Si falla el programa o
se bloquea, no se refrescará al Perro guardián y, al completar su temporización,
“ladrará y ladrará” hasta provocar el reset.
 Protección ante fallo de alimentación (Brownout). Se trata de un circuito que
resetea al microcontrolador cuando el voltaje de alimentación (VDD) es inferior a un
voltaje mínimo (“brownout”). Mientras el voltaje de alimentación sea inferior al de
brownout el dispositivo se mantiene reseteado, comenzando a funcionar
normalmente cuando sobrepasa dicho valor.
 Estado de reposo o de bajo consumo. Son abundantes las situaciones reales de
trabajo en que el microcontrolador debe esperar, sin hacer nada, a que se produzca
algún acontecimiento externo que le ponga de nuevo en funcionamiento. Para
ahorrar energía, (factor clave en los aparatos portátiles), los microcontroladores
disponen de una instrucción especial (SLEEP en los PIC), que los pasa al estado de
reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos.
En dicho estado se detiene el reloj principal y se “congelan” sus circuitos asociados,
quedando sumido en un profundo “sueño” el microcontrolador. Al activarse una
interrupción ocasionada por el acontecimiento esperado, el microcontrolador se
despierta y reanuda su trabajo.
 Conversor A/D (ADC). Los microcontroladores que incorporan un Conversor A/D
(Analógico/Digital) pueden procesar señales analógicas, tan abundantes en las
aplicaciones. Suelen disponer de un multiplexor que permite aplicar a la entrada del
CAD diversas señales analógicas desde las patitas del circuito integrado.
 Conversor D/A (DAC). Transforma los datos digitales obtenidos del
procesamiento del computador en su correspondiente señal analógica que saca al
exterior por una de las patitas de la cápsula. Existen muchos efectores que trabajan
con señales analógicas.
 Comparador analógico. Algunos modelos de microcontroladores disponen 34
internamente de un Amplificador Operacional que actúa como comparador entre
una señal fija de referencia y otra variable que se aplica por una de las patitas de la
cápsula. La salida del comparador proporciona un nivel lógico 1 ó 0 según una señal
sea mayor o menor que la otra. También hay modelos de microcontroladores con un
módulo de tensión de referencia que proporciona diversas tensiones que se pueden
aplicar en los comparadores
 Modulador de anchura de pulsos (PWM). Son circuitos que proporcionan en su
salida pulsos de anchura variable, que se ofrecen al exterior a través de las patitas
del encapsulado.
 Puertas de E/S digitales. Todos los microcontroladores destinan algunas de sus
patitas a soportar líneas de E/S digitales. Por lo general, estas líneas se agrupan de
ocho en ocho formando Puertas. Las líneas digitales de las Puertas pueden
configurarse como Entrada o como Salida cargando un 1 ó un 0 en el bit
correspondiente de un registro destinado a su configuración.
 Puertas de comunicación. Con objeto de dotar al microcontrolador de la
posibilidad de comunicarse con otros dispositivos externos, otros buses de
microprocesadores, buses de sistemas, buses de redes y poder adaptarlos con otros
elementos bajo otras normas y protocolos. Algunos modelos disponen de recursos
que permiten directamente esta tarea, entre los que destacan:
o UART, adaptador de comunicación serie asíncrona.
o USART, adaptador de comunicación serie síncrona y asíncrona
o Puerta paralela esclava para poder conectarse con los buses de otros
microprocesadores.
o USB (Universal Serial Bus), que es un moderno bus serie para los PC.
o Bus I2C, que es un interfaz serie de dos hilos desarrollado por Philips.
o CAN (Controller Area Network), para permitir la adaptación con redes de
conexionado multiplexado desarrollado conjuntamente por Bosch e Intel
para el cableado de dispositivos en automóviles. En EE.UU. se usa el
J185O.

La figura 2.20 ilustra una comparativa de recursos de los microcontroladores PIC16F84 y el


PIC16F88.
35

Figura 2.20. Comparativa de los recursos de los PICs 16F84 y el 16F88.

2.4. Palabra de configuración


Hay ciertos aspectos del PIC que han de ser activados o desactivados cuando se programa y
no se pueden volver a cambiar hasta que el PIC no se reprograme de nuevo.
El PIC16F84 dispone de 4 elementos programables (los modelos superiores tienen más)
que se encuentran en la llamada palabra de configuración. A estos 4 elementos o bits de
configuración también se les conoce como fuses (fusibles).
La palabra de configuración se encuentra en la dirección de memoria de programa 2007 h.
Esta posición está más allá del espacio de memoria de programa destinada al usuario y
pertenece al espacio de memoria de prueba y configuración (2000h - 3FFFh). Solamente se
puede acceder a este espacio durante la programación del dispositivo.

Figura 2.21. Palabra de configuración del 16F84A.

Los bits en cuestión son:


 CP, bit 4 a 13: Bits de protección de código. Activando este bit tendremos la
garantía de que el código escrito en el PIC no pueda ser leído por otra persona, para
que no se copie, modifique, etc. Esto no impide que el PIC funcione como siempre,
ni que no se pueda sobrescribir su contenido. Lo único que nos impide es leerlo.
o 1: Protección de código deshabilitada.
o 0: Memoria protegida por código.
 PWRTE, bit 3: Bit para habilitar el Power-up Timer o temporizador de encendido.
Si activamos el bit PWRTE, conseguimos que se genere un retardo en la
inicialización del microcontrolador. Esto se utiliza para que la tensión se estabilice,
por lo que se recomienda su uso.
o 1: Power-up timer deshabilitado. 36
o 0: Power-up Timer habilitado.
 WDTE, bit 2: Bit para habilitar el Watchdog timer o temporizador perro guardián.
El "perro guardián" del PIC se configura aquí. Con esto el PIC tiene la capacidad de
autorresetearse. Es útil ante problemas que impidan el funcionamiento del programa
del PIC, como un bucle infinito, el WDT lo sacará de él reseteando al PIC.
Su funcionamiento es sumamente sencillo. Simplemente es un registro que debemos
borrar cada cierto tiempo. Si pasa un tiempo (entre 2.5ms y 2.5 seg) y el registro no
ha sido borrado, el PIC se resetea. La instrucción para borrar el registro es
CLRWDT. Con poner un par de ellos a lo largo de nuestro código es suficiente para
tener una garantía de que nuestro PIC no se quede "colgado".
o 1: WDT habilitado.
o 0: WDT deshabilitado.
 FOSC1, FOSC0, bit 0 y 1: Selección del oscilador. Mediante FOSC1 y FOSC0
controlamos el modo de oscilación que usará el PIC para funcionar. El oscilador se
puede configurar de 4 maneras distintas, dependiendo de la velocidad y del tipo de
circuito oscilador empleado.
o 00: Oscilador LP. (Low Power) Esta modalidad permite un descenso del
consumo en el PIC gracias a que la frecuencia de oscilación es menor que en
la configuración XT. Al igual que con XT y HS, necesitaremos un cristal de
cuarzo (de 32 a 200 KHz) y dos condensadores.
o 01: Oscilador XT. Tendremos que disponer de un cristal de cuarzo y dos
condensadores. Esto permitirá generar los pulsos necesarios para el
microcontrolador con una frecuencia determinada. La exactitud es muy alta,
por lo que se recomienda para casi todas las aplicaciones. El valor del cristal
generalmente será de 4 Mhz (como máximo) y los condensadores serán
cerámicos de entre 15 y 33 nF.
o 10: Oscilador HS. Para cuando necesitemos aplicaciones de alta velocidad,
entre 4 y 20 Mhz. Este montaje se basa también en un cristal de cuarzo,
como el XT.
o 11: Oscilador RC. Este es el sistema más sencillo y económico. Se basa en
un montaje con una resistencia y un condensador. La velocidad a la que
oscile el PIC dependerá de los valores del condensador y de la resistencia.
La máxima frecuencia que podremos emplear con este sistema será de
5.5MHz (con el PIC16F84A-20).

Existen dos maneras de programar la palabra de configuración:


a) Cuando se programa el PIC. En todos los programadores es posible activar o
desactivar estas opciones a nuestra conveniencia. En la figura 2.22 puede verse una
captura del programa IC-Prog en donde se resalta el área donde se realiza la
implementación de la palabra de configuración.
37

Figura 2.22. Vista del software programador IC-Prog. El recuadro rojo muestra la zona
donde se implementa la palabra de configuración.

b) Activación por código. La línea de memoria de configuración es creada por el


programa ensamblador con los valores por defecto. Podemos hacer que estos
valores cambien introduciendo una línea de código en el código. Este código está
contenido en el fichero que incluimos en la cabecera (P16F84A.INC):

_CP_ON EQU H'000F’; Activa code protect


_CP_OFF EQU H'3FFF’; Desactiva code protect
_PWRTE_ON EQU H'3FF7’; Activa power on reset
_PWRTE_OFF EQU H'3FFF’; Desactiva power on reset
_WDT_ON EQU H'3FFF’; Activa Watchdog
_WDT_OFF EQU H'3FFB’; Desactiva Watchdog
_LP_OSC EQU H'3FFC’; Oscilador LP
_XT_OSC EQU H'3FFD’; Oscilador XT
_HS_OSC EQU H'3FFE’; Oscilador HS
_RC_OSC EQU H'3FFF’; Oscilador RC

Como podemos ver los nombres de las etiquetas son bastante intuitivos. Este código
debe situarse al principio del programa, después del tipo de PIC a usar y de la
definición de las etiquetas. La línea de configuración siempre comienza con la
directriz __CONFIG y cada opción debe estar separada de otra con el carácter &.
Por ejemplo: 38

#INCLUDE <P16F84A.INC> ;Fichero de etiquetas del microcontrolador


; Bits de configuración.
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON

En el ejemplo, Code Protect y Watchdog Timer están desactivados, Power on Reset


en cambio está activado, y el cristal usado no supera los 4 MHz.
Cuando carguemos el archivo de programa del PIC en el programador (por ejemplo,
en IC-Prog), estarán marcadas las opciones que hemos configurado en el código.
Aunque lo hayamos hecho así, podemos cambiar estas opciones en la ventana del
programador.

2.5. Instrucciones del microcontrolador.


Los 16F87X cuentan con 35 instrucciones, las cuales están divididas entre instrucciones
orientadas a registros, orientadas a bits y orientadas a control. Por medio de estas, se crea el
programa en lenguaje Ensamblador (assembler) respetando la sintaxis necesaria para cada
una.

2.5.1. Instrucciones orientadas a bits


Este grupo de instrucciones actúa directamente sobre un bit específico de cualquier registro.
Con ellas es posible escribir o leer un bit para luego tomar decisiones de acuerdo al
resultado.

Tabla 4. Instrucciones para el manejo de bits


Sintaxis Descripción Ciclos
BCF f,b Pone en "0" el bit b del registro f 1
BSF f,b Pone en "1" el bit b del registro f 1
BTFSS f,b Lee el bit b del registro f y salta la instrucción siguiente si está en “1” 1 (2 si salta)
BTFSC f,b Lee el bit b del registro f y salta la instrucción siguiente si está en “0” 1 (2 si salta)

2.5.2. Instrucciones orientadas a Registros


Este tipo de instrucciones maneja registros directamente, es decir, con estas instrucciones
vamos a poder asignarle valores a cada registro, operar matemáticamente con ellos, operar
con lógica booleana entre ellos, etc.
Tabla 5. Instrucciones para el manejo de registros
Sintaxis Descripción Ciclos
ADDWF f,d Suma el contenido del registro W con el de f 1
ANDWF f,d Realiza la operación lógica AND entre el contenido del registro W con el de f 1
CLRF f Borra el contenido del registro f 1
CLRW Borra el contenido del registro W 1
COMF f,d Niega el valor del registro f 1
DECF f,d Decrementa en una unidadel contenido del registro f 1
Decrementa en una unidad el contenido del registro f y salta la instrucción siguiente si
DECFSZ f,d 1 (2 si salta)
es cero.
INCF f,d Incrementa en una unidadel contenido del registro f 1 39
Incrementa en una unidad el contenido del registro f y salta la instrucción siguiente si
INCFSZ f,d 1 (2 si salta)
es cero.
IORWF f,d Realiza la operación lógica OR entre el contenido del registro W con el de f 1
MOVF f,d Mueve el contenido del registro f 1
MOVWF f Mueve el contenido del registro W al registro f 1
NOP No realiza ninguna operación 1
RLF f,d Rota el contenido del registro f hacia la izquierda a través del carry bit 1
RRF f,d Rota el contenido del registro f hacia la derecha a través del carry bit 1
SUBWF f,d Resta el contenido del registro W al registro f 1
SWAPF f,d Intercambia los cuatro primeros bits con los cuatro últimos del registro f 1
XORWF f,d Realiza la operación lógica XOR entre el contenido del registro W con el de f 1

Todas las operaciones se guardan en:


 El registro W si d=0
 El registro f si d=1
Para el caso de RLF y RRF el bit opuesto al rotado se pone en 0

2.5.3. Instrucciones orientadas al control del flujo del proceso


Este juego de instrucciones nos permite controlar algunos registros y funciones específicas.
También estas instrucciones se utilizan para guardar algún valor determinado en un registro
o hacer operaciones matemáticas y lógicas entre un registro y un valor cualquiera que no
necesariamente esté guardado en un registro, es decir un valor literal.

Tabla 6.Instrucciones para el control del flujo de proceso


Sintaxis Descripción Ciclos
ADDLW k Suma el valor k al registro W 1
ANDLW k Realiza la operación lógica AND entre el valor k y el registro W 1
CALL k Llamada a la subrutina k 2
CLRWDT Limpia el WD-Timer 1
GOTO k Salto incondicional a la etiqueta k 2
IORLOW k Realiza la operación lógica OR entre el valor k y el registro W 1
MOVLW k Guarda en el registro W el valor k 1
RETFIE Retorno de una interrupción 2
RETLW Retorno de una subrutina con el valor k en el registro W 2
RETURN Retorno de una subrutina 2
SLEEP Se pone el PIC en estado de reposo (dormido) 1
SUBLW k Resta el valor k al registro W 1
XORLW Realiza la operación lógica XOR entre el valor k y el registro W 1
2.6. Ejemplo de uso de instrucciones en Ensamblador
Mostramos a continuación como ejemplo de un programa básico en Ensamblador, cuya
finalidad es en este caso establecer el modo de operación de los puertos.
De la teoría que se ha visto en esta unidad tenemos que los registros importantes en la
configuración de los puertos son:
 STATUS dirección 0x3
 PORTA dirección 0x5
 PORTB dirección 0x6
40
 TRISA dirección 0x5
 TRISB dirección 0x6

Por defecto el PIC tendrá todos los I/O port's (es decir los puertos RA y RB), colocados
como entrada de datos, y si queremos cambiarlos habrá que configurarlos en los registros
correspondientes. Para lograrlo debemos tener en cuenta que:
 Si se asigna un CERO (0) a un pin, éste quedará como salida.
 Si se asigna un UNO (1), quedará como entrada.
Y que ésta asignación se hace en:
 TRISA para los pines del PUERTO A (5 bits), por ejemplo, si TRISA es igual a
11110 todos sus pines serán entradas salvo RA0 que esta como salida.
 TRISB para los pines del PUERTO B (8 bits), por ejemplo, si TRISB es igual a
00000001 todos sus pines serán salidas salvo RB0 que esta como entrada.

Ahora bien, cuando el PIC arranca se encuentra en el BANCO 0, pero TRISA y TRISB
están en el BANCO 1, por lo que deberemos cambiar de banco para hacer el cambio. Esto
se logra a través del Registro STATUS:
 Colocando un CERO (0) en RP0 estaremos en el BANCO 0.
 Colocando un UNO (1) en RP0, estaremos en el BANCO 1.

Ejercicio 2.1. Escribir las instrucciones necesarias para lograr que los tres bits menos
significativos del puerto A funcionen como salidas, y los cuatro bits más significativos del
puerto B deben comportarse como salidas, el resto en ambos puertos deben ser entradas.
Solución: En primer lugar, debemos cambiar de banco:
bsf 0x03,5
Cargamos en el acumulador el valor en binario necesario para configurar el
puerto A:
movlw b'11000'
Trasladamos el dato hacia el registro TRISA:
movwf 0x85
Cargamos el valor binario correspondiente:
movlw b'00001111'
Trasladamos el valor hacia el registro TRISB
movwf 0x86
Finalmente, volvemos al banco 0:
bcf estado,5

Aunque el ejercicio 2.1 ejemplifica como gestionar los registros de la memoria del
microcontrolador para configurar los puertos, no es aún un código ejecutable en el circuito
integrado. El siguiente ejercicio presenta un programa ejecutable por el microcontrolador
que implementa las acciones del ejercicio 2.1.
41
Ejercicio 2.2. En el siguiente código identifique el segmento en el que se han incluido las
instrucciones del ejercicio 2.1. Busque en las hojas de datos o en la bibliografía la
finalidad de las instrucciones que desconozca, o asesórese de su docente.

;-------------------------------------------------------------------
; PROGRAMA DE CONFIGURACIÓN DE PUERTOS
;-------------------------------------------------------------------
#include p16f84a.inc
;--------------------Variables------------------------------------
ESTADO equ 0x03
CONFIGPTOA equ 0x05
CONFIGPTOB equ 0x06
;----------------Configuración de reset------------------------
org 0x00
RESET goto INICIO

;--------------Configuración de puertos-----------------------
org 0x05
INICIO bsf ESTADO,5
movlw b'11000'
movwf CONFIGPTOA
movlw b'00000000'
movwf CONFIGPTOB
bcf ESTADO,5
;-------------------------------------------------------------------
end
;-------------------------------------------------------------------
3. Características eléctricas del microcontrolador
En esta unidad el alumno:
 Analiza las características eléctricas del microcontrolador.

3.1. Distribución de terminales


El 16F84A está fabricado en tecnología CMOS, es de muy bajo consumo de potencia, y es
de memoria estática FLASH. 42
El encapsulado más común para estos microcontroladores es el DIP (Dual In line Pin) de 18
pines, y utiliza un reloj de 4 o de 20 MHz (cristal de cuarzo). Existe también en
encapsulado tipo Surface Mount (montaje superficial) el cual es mucho más pequeño
(figura 3.1).

Figura 3.1. Encapsulados del 16F84A.

La distribución de sus terminales se presenta en la figura 3.2.

Figura 3.2. Distribución de terminales del 16F84A.

La descripción de pines es la que sigue.

Pines 1, 2, 3 17 y 18 – RA0-RA4/TOCKI: Es el PORTA (puerto A). Corresponden a 5


Iíneas bidireccionales de E/S. Es capaz de entregar niveles TTL cuando la tensión de
alimentación aplicada en VDD es de 5V + 5%. El pin RA4 como entrada puede programarse
en funcionamiento normal o como entrada del contador/temporizador TMR0.
Pin 4 - MCLR / Vpp: Es una terminal de múltiples aplicaciones, es la entrada de Reset si
está a nivel bajo y también es la habilitación de la tensión de programación cuando se está
programando el dispositivo. Cuando su tensión es la de VDD el PIC funciona normalmente,
si se manda a masa el PIC reinicia su funcionamiento.

Pines 5 y 14 - VSS y VDD: Son respectivamente las patas de masa y alimentación. La


tensión de alimentación de un PIC está comprendida entre 2V y 6V, aunque se recomienda
no sobrepasar los 5.5V.
43
Pines 6, 7, 8, 9, 10, 11, 12, 13 – RB0-RB7: Es el PORTB (puerto B). Corresponden a ocho
líneas bidireccionales de E/S. Pueden manejar niveles TTL cuando la tensión de
alimentación aplicada en VDD es de 5V ± 5%. RB0 puede programarse además como
entrada de interrupciones externas INT. Los pines RB4 a RB7 pueden programarse para
responder a interrupciones por cambio de estado. Las patas RB6 y RB7 se corresponden
con las líneas de entrada de reloj y entrada de datos respectivamente, cuando está en modo
programación del integrado.

Pines 15 y 16 – OSC1/CLKIN y OSC2/CLKOUT. Corresponden a los pines de la entrada


externa de reloj y salida de oscilador a cristal respectivamente.

3.2. Características del reloj del sistema


Todo microprocesador o microcontrolador requiere de una señal de reloj que sincronice su
funcionamiento. Esta señal se obtiene mediante un oscilador de frecuencia. Existen
microcontroladores que tienen un oscilador interno y no requieren de componentes
externos. El microcontrolador PIC16F84 requiere de un circuito externo de oscilación o
generador de pulsos de reloj.

En el momento de programar el microcontrolador se deberá especificar en los parámetros el


tipo de oscilador que utilizamos en el circuito electrónico. En ese momento, se programan
dos bits de configuración denominados FOSC1 y FOSC2. Por ejemplo, si la frecuencia de
trabajo es de 20 MHz entonces la configuración del microcontrolador deberá estar en "HS";
pero si la frecuencia de trabajo es de 4 MHz entonces la configuración del microcontrolador
deberá estar en "XT".

Existen 4 modos de oscilador para el PIC16F84A. Tres utilizan cristal de cuarzo (LP, XT y
HS) y la cuarta utiliza una resistencia y un condensador (RC).

Relacionados con los modos de oscilador y la frecuencia máxima a la que el PIC podrá
trabajar tenemos 3 versiones del PIC16F84A:

 El PIC16LF84A-04, ideal para aplicaciones de bajo consumo, puede trabajar con


una Vdd de 2 a 5,5 voltios en los modos LP, XT y RC, pero no dispone del modo
HS. Puede utilizarse en el modo LP para frecuencias entre 0 y 200 KHz, en el modo
XT para frecuencias entre 100 KHz y 2 MHz y en el modo RC desde 0 hasta 2
MHz.
 El PIC16F84A-04, para aplicaciones generales, puede trabajar en los cuatro modos.
En el modo LP para frecuencias entre 32 KHz y 200 KHz, en el modo XT para
frecuencias entre 100 KHz y 4 MHz y en el modo RC hasta 4 MHz. Puede trabajar
con una Vdd de 4 a 5,5 voltios en los modos XT, LP y RC, pero el rango se acorta
de 4,5 a 5,5 voltios con el modo HS.
 El PIC16F84A-20 se reservará normalmente para el modo HS y frecuencias entre 4 44
MHz y 20 MHz. Puede trabajar con una Vdd de 4 a 5,5 voltios en los modos XT,
LP y RC, pero el rango se acorta de 4,5 a 5,5 voltios con el modo HS.

3.2.1. Modo oscilador XT, LP y HS


El circuito que implementa este modo se muestra en la figura 3.3. La condición más
importante para que este oscilador funcione es que los condensadores C1 y C2 deberán ser
iguales. En una tabla más adelante están reflejados algunos valores de los condensadores
C1 y C2. Debe utilizarse una resistencia en serie (Rs) para cristales AT de corte en tira,
aunque no es indispensable.

Figura 3.3. Circuito para oscilador a cristal.

La siguiente tabla presenta una selección de capacitores para la configuración de


osciladores a cristal.

Tabla 7. Selección de cristales para osciladores a cristal.


Modo Frecuencia OSC1/C1 OSC2/C2
32 Khz 68 - 100 pF 68 - 100 pF
LP
200 Khz 15 - 33 pF 15 - 33 pF
100 Khz 100 - 150 pF 100 - 150 pF
XT 2 Mhz 15 - 33 pF 15 - 33 pF
4 Mhz 15 - 33 pF 15 - 33 pF
4 Mhz 15 - 33 pF 15 - 33 pF
HS
20 Mhz 15 - 33 pF 15 - 33 pF

Para una VDD > 4,5 V, se recomienda que C1 = C2 = 33 pF.


3.2.2. Modo oscilador RC
Es el más económico por que tan solo se utiliza un condensador no polarizado y una
resistencia. Es adecuado para las aplicaciones donde las temporizaciones no requieran
precisión. La frecuencia depende de:
 La tensión de alimentación
 El valor de la resistencia
 El valor del condensador
 La temperatura de funcionamiento
Además de esto, la frecuencia de oscilación puede variar de un microcontrolador a otro 45
debido a variaciones en algunos parámetros en la fabricación de cada integrado. También
han de tenerse en cuenta la variación debidas a la tolerancia de la resistencia y condensador
utilizados. Incluso las capacidades parasitas que puedan aparecer, como el trazado de las
pistas o con los contactos del zócalo donde va insertado el microcontrolador pueden afectar
a la frecuencia de la oscilación, sobre todo si se utilizan condensadores de pequeño valor.
En general las variaciones de la frecuencia de oscilación son mayores cuanto mayor sea R y
menor sea C.
En la figura 3.4. aparece como debe conectarse el circuito RC al PIC.

Figura 3.4. Circuito oscilador en modo RC.

Los valores de R deben estar comprendidos entre 5 y 100 KΩ, mientras que los valores de
C no deben ser inferiores a 20 pF. Es importante saber que, para valores de resistencia
menor a 5 KΩ, el sistema se hace inestable o se podría detener la oscilación
completamente. Para valores de resistencias mayores a 100 KΩ (por ejemplo 1 MOhmio),
el oscilador se hace muy susceptible al ruido, humedad y a la temperatura por lo tanto se
recomienda que este tipo de oscilador se encuentre en el siguiente rango (5KΩ < R < 100
KΩ. Por otro lado, se recomienda utilizar un condensador no polarizado mayor de 20 pF
para disminuir el ruido y aumentar la estabilidad del sistema. La frecuencia del oscilador,
dividida por 4, está disponible en el terminal OSC2/CLKOUT y puede utilizarse para
comprobar la frecuencia o para sincronizar otros dispositivos.
A continuación, se muestran algunos gráficos que muestran valores de frecuencia de
oscilación según el condensador y la resistencia. También es importante saber que la
tensión de alimentación que tendrá el microcontrolador influye directamente en la
frecuencia final. Las siguientes figuras muestran la frecuencia obtenida en base al voltaje de
alimentación y la configuración de resistencias y condensador.

46

Figura 3.5. Frecuencias obtenidas para varias resistencias y un capacitor de 300pF.

Figura 3.6. Frecuencias obtenidas para varias resistencias y un capacitor de 100 pF.
47

Figura 3.7. Frecuencias obtenidas para varias resistencias y un capacitor de 22 pF

Si nos damos cuenta, para algunos valores del voltaje, el valor de frecuencia se hace
verdadero para la expresión de la frecuencia que da la fórmula: 𝑓 = 𝑅 ∙ 𝐶. Donde C está
expresado en Faradios y R en Ohmios. Por desgracia el punto en el que coincide la
frecuencia y el voltaje no es lineal para todos los valores de V.

3.2.3. Oscilador externo


A continuación, se exponen dos configuraciones que se pueden emplear con tres de los
cuatro modos de funcionamiento: XT, HS ó LS. En ambos casos se utiliza un oscilador
externo.
Conviene recordar que, según la frecuencia de la señal inyectada, debemos usar la opción
LP para frecuencias comprendidas entre 32 y 200 KHz, la opción XT para frecuencias
situadas entre los 100 KHz y los 4 MHz, y la opción HS para frecuencias comprendidas
entre 4 y 20 MHz (dependiendo esta última de la velocidad máxima permitida por el PIC).

Señal de reloj externa: En ciertas ocasiones disponemos una fuente de reloj que proviene
de una fuente externa como puede ser un oscilador TTL o CMOS. La onda generada por
esta fuente externa puede servir para poner en funcionamiento el PIC. En la siguiente figura
tenemos la forma de conexionar la entrada digital a través de un inversor lógico.

Figura 3.8. Conexión de una señal de reloj externa.


Como se puede observar, todos los circuitos oscilatorios que se conectan al PIC a través de
una sola patilla, van conectadas a la entrada OSC1, dejando la entrada OSC2 abierta.

El oscilador TTL es un dispositivo basado en un cristal que contiene toda la circuitería para
generar una onda cuadrada. Al incluir toda la circuitería esto lo convierte en la opción más
costosa; pero permite una precisión óptima en la señal de reloj emitida.

Estos tipos de cristales están diseñados especialmente para tecnologías TTL. Las
frecuencias disponibles para esta versión de cristal son muy amplias y las más usuales son 48
1, 1.8432, 2, 4, 8, 10, 11.059, 12, 14.31818, 16, 20, 25, 32, 33, 40, 50, 80 y 100 MHz. En la
figura 3.9 se muestra como debe conectarse este dispositivo al microcontrolador.

Figura 3.9. Un modelo de oscilador TTL y su conexión al PIC16F84A.

3.3. El Reset y sus fuentes


Un reset puede ser provocado por 3 causas diferentes que dan origen a 5 modos:
 Conexión de la alimentación al PIC POR (Power On Reset).
 Activando la patilla MLCR mientras el PIC está en modo normal.
 Activando la patilla MLCR mientras el PIC está en modo SLEEP.

Cuando se ejecuta un reset, se producen dos acciones importantes.


 El contador de programa se vuelve a colocar en el principio del programa (0000 h).
 Los registros modificados vuelven a su estado por defecto.
 Un desbordamiento del WDT mientras el PIC está en modo normal.
 Un desbordamiento del WDT mientras el PIC está en modo SLEEP.

En todos los casos, salvo en el quinto, el contador de programa PC se pone a 0000 h (vector
de reset), donde debe encontrarse la primera instrucción ejecutable del programa. Además,
todos los registros específicos (SFR) son colocados en estados predeterminados (ver Estado
predeterminado de los registros específicos en Registros del PIC16F84A, sección 2.2.4). 49

En el quinto caso, cuando se produce un desbordamiento del WDT mientras el PIC está en
modo SLEEP, no se produce un reset propiamente dicho, sino que el PIC se sale del modo
SLEEP, se "despierta" mediante el temporizador watchdog y el PC se incrementa en una
unidad para pasar a la instrucción que sigue a la instrucción SLEEP, igual que cuando se
sale de este modo mediante una interrupción, si el bit GIE del registro INTCON está a uno.

3.3.1. Reset a la alimentación


Los distintos modos de provocar un reinicio por alimentación (Power On Reset, POR) de
una bandera son:
 Power-up Timer (PWRT). Es un sistema interno del microcontrolador que lo
mantiene reseteado durante unos 72 ms hasta que se estabilice la tensión de
alimentación. Utiliza un circuito oscilador RC interno y un contador para conseguir
ese tiempo.
El tiempo en que está activo PWRT puede ser distinto entre distintos PIC, según el
valor de Vcc, la temperatura y otras variables.
PWRT puede ser habilitado/deshabilitado mediante el bit de configuración PWRTE,
recomendándose su activación (ver Palabra de configuración, sección 2.4).
 Oscillator Start-up Timer (OST). Es un temporizador interno que proporciona un
retardo de 1024 ciclos del oscilador después de que termine el retardo que
proporciona PWRT. Se utiliza para mantener reseteado al microcontrolador para
asegurarse que la oscilación del cristal de cuarzo o resonador se ha iniciado y se ha
estabilizado. OST actúa solamente si se utilizan los modos XT, LP y HS y cuando
se alimenta al PIC o cuando se despierta desde el modo SLEEP.

Teniendo en cuenta lo que hemos visto sobre POR, PWRT y OST, la secuencia que se
sigue si PWRT y OST están habilitados es:
 PWRT actúa después de que POR termine.
 OST actúa después de que PWRT termine.

El tiempo total variará según el modo del oscilador y la configuración de PWRTE. Por
ejemplo, en el modo RC con PWRT deshabilitado el tiempo de reset será mínimo. Lo
anterior se expresa mejor en la siguiente tabla.
Tabla 8. Secuencias del Reset.
Configuración oscilador Alimentación Despertar desde SLEEP
PWRT habilitado PWRT deshabilitado
XT, HS, LP 72 ms + 1024 TOSC 1024 TOSC 1024 TOSC
RC 72 ms - -

También se puede construir un circuito externo de reset a la alimentación (figura 3.10).

50

Figura 3.10. Circuito para implementar un reset externo:

Este circuito de reset a la alimentación externo es únicamente necesario si la subida de la


tensión de alimentación es muy lenta.

Algunas reglas básicas para realizar este circuito son:


 Es recomendable que R1 sea menor de 40 K para asegurarse que su tensión no
supere los 0,2 voltios cuando MCLR esté a nivel alto (la corriente máxima en la
patilla MCLR es menor de 5 μA). Un voltaje mayor puede degradar el nivle VIH de
la patilla MCLR.
 Se recomienda que R2 esté entre 50 y 100 ohmios.
 El diodo D1 ayuda a provocar una descarga rápida del condensador cuando se
elimina la alimentación.

Nota: Si en MCLR se aplica una tensión por debajo de VSS se pueden inducir corrientes
mayores de 80 mA, que pueden causar problemas. Para solucionar esto se coloca una
resistencia de 50 a 100 ohmios para aplicar un nivel bajo a la patilla MCLR en lugar de
llevar esta patilla directamente a VSS. En nuestro caso esta resistencia es R2.

Para terminar, habría que decir que, en la mayoría de los casos será más que suficiente con
conectar MCLR a la alimentación positiva (VCC) y usar los dispositivos de reset del PIC.
3.3.2. Reset manual
En el caso de que sea necesario se puede aplicar un reset manual a la patilla MCLR
mediante un pulsador y una resistencia. La figura 3.11 muestra una configuración básica
para realizar un reset manual.

51

Figura 3.11. Configuración para un reset manual.

La resistencia de 100 ohmios puede eliminarse del circuito al no existir peligro de que en
MCLR aparezcan tensiones menores de VSS. Pero debería mantenerse si se coloca un
condensador en paralelo al pulsador.

3.3.3. Origen del reset


Es posible distinguir por software el origen del reset, para lo que basta con leer los bits TO
(Timer Out) y PD (Power Down) del registro de estado como se muestra en la tabla
siguiente.

Tabla 9. Determinación de la fuente del Reset.


TO PD ORIGEN DEL RESET
0 0 Desbordamiento WDT en modo SLEEP. Se ha salido del modo SLEEP.
0 1 Desbordamiento WDT en modo normal.
1 0 Activación MCLR en modo SLEEP
Conexión de alimentación (POR)
1 1
Activación MCLR en modo normal

3.4. Características de la fuente de alimentación del MCU


El conexionado básico para las terminales de alimentación del 16F84A se presenta en la
figura 3.12. En ella se pueden apreciar las terminales de alimentación VDD (Voltaje
drenador) y VSS (Voltaje surtidor), la nomenclatura se debe a que el microcontrolador
emplea en su diseño transistores FET. Se incluye además la configuración para
implementar un reset manual.
52

Figura 3.12. Conexión básica de alimentación del 16F84A.

Las características eléctricas máximas del microcontrolador son:


 Temperatura ambiente máxima para funcionamiento de -55°C to +125°C.
 Tensión máxima de VDD respecto a VSS de -0,3 a +7,5V.
 Tensión de cualquier patilla con respecto a VSS (excepto VDD, MCLR, y RA4) de
−0.3V a (VDD + 0.3V).
 Tensión en MCLR con respecto a VSS -0,3 a +14V.
 Tensión en RA4 con respecto a VSS -0,3 a +8,5V.
 Disipación de potencia total de 800 mW.
 Máxima corriente de salida a VSS 150 mA.
 Máxima corriente de salida de VDD 100 mA.
 Máxima corriente del puerto “A” como fuente, 50 mA.
 Máxima corriente del puerto “A” como sumidero, 80 mA.
 Máxima corriente del puerto “B” como fuente, 100 mA.
 Máxima corriente del puerto “B” como sumidero, 150 mA.
 Máxima corriente que puede suministrar una sóla salida como fuente o sumidero, 25
mA.
 Rango de alimentación:
o 16LF84A: De 2 a 5,5 V en configuración de oscilador XT, RC y LP.
o 16F84A: De 4 a 5,5 v en configuración de oscilador XT, RC y LP; y de 4,5 a
5.5 v en configuración de oscilador HS.
 Consumo típico:
o 16LF84A: de 1 a 4 mA en configuración de oscilador RC y XT (FOSC=2
MHz, VDD=5,5V); y de 15 a 45 μA en configuración de oscilador LP
(FOSC=32kHz, VDD=2V, WDT deshabilitado).
o 16F84A: de 1,8 a 4.5 mA en configuración de oscilador RC y XT (FOSC=4
MHz, VDD=5,5V); y de 3 a 10 mA en configuración de oscilador RC y XT
durante la programación de la FLASH (FOSC=4MHz, VDD=5,5V).
o 16F84A-20: de 10 a 20 mA en configuración de oscilador HS (FOSC=20
MHz, VDD=5,5V).
53
3.5. Ejemplo de circuitos osciladores empleando un reset
Como una práctica relativa al empleo de circuitos osciladores ponemos el caso de un
circuito contador síncrono ascendente.
De su curso de Electrónica Digital sabe que un circuito secuencial que pasa por una
secuencia preestablecida de estados después de la aplicación de pulsos se denomina
contador. Los pulsos de entrada, llamados pulsos de cuenta, pueden ser pulsos de un
dispositivo de reloj o pueden ser generados por alguna fuente externa, por lo que pueden
ocurrir a intervalos de tiempo específicos o aleatoriamente.
De las diferentes secuencias que un contador puede seguir, la secuencia binaria natural es la
más simple y la más directa. Un contador que sigue la secuencia binaria se llama contador
binario. A su vez un contador de n bits consiste en n flip-flops y puede contar en binario de
0 hasta 2n - 1. La secuencia de cuenta se repite una vez haya alcanzado el último valor.

Ejercicio 3.1. Retome la teoría del diseño secuencial de su curso de Electrónica Digital
para diseñar un circuito contado ascendente desde 0 hasta 9 que cuente con las siguientes
características:
 Emplear circuitos osciladores 555 para generar la señal de reloj a una frecuencia
adecuada para la visualización de los valores.
 Emplear dispositivos TTL de preferencia y CMOS en su defecto.
 Poseer dos señales de control:
o E (ENABLE). Habilitador de conteo.
 E=0, conteo ascendente, desde el número en retención por pausa.
 E=1, pausa el conteo.
o R (RESET). Reinicio del conteo.
 R=0, conteo normal (ascendente).
 R=1, reinicia el conteo desde 0.
 Visualizar las salidas en un display de 7 segmentos, se permite el uso del CI
decodificador BCD correspondiente.

Debe entregarse el arreglo implementado físicamente donde se evaluará un arreglo de


circuito organizado y limpio en protoboard y la funcionalidad de las características
solicitadas.
Agregue un reporte electrónico donde deberá incluir:
 Hoja de presentación.
 Introducción.
 Planteamiento del problema.
 Desarrollo de la Solución conteniendo: diagramas y tablas de estado; mapas de
Karnaugh y ecuaciones de estado; diagrama del circuito lógico; simulación en
Proteus; listado de material utilizado en la implementación física; evidencias de la
operación óptima de la implementación física (fotografías).
 Conclusiones.
54
4. Herramientas de desarrollo de los microcontroladores
En esta unidad el estudiante:
 Utiliza las herramientas de desarrollo de los microcontroladores.

4.1. Lenguajes de bajo y de alto nivel


Antes de proceder a la realización de proyectos de aplicación primero debemos identificar a
los lenguajes de programación en función de la manera en que son capaces de implementar 55
instrucciones en un dispositivo programable.
Un lenguaje de bajo nivel está formado por instrucciones de bajo nivel de abstracción con
respecto del dispositivo a programar. Tales instrucciones de orden aritmético-lógicas no se
encuentran encapsuladas en funciones, a menos que estén ya contempladas en la
arquitectura del hardware. Las palabras para las instrucciones usan abreviaturas del inglés,
también llamadas palabras nemotécnicas, tales como: ADD, DIV, SUB, etc. Los lenguajes
de este tipo son denominados Ensambladores.
Características:
 Las instrucciones están completamente relacionadas con la arquitectura del
dispositivo a programar.
 Se aprovecha al máximo la potencia de la computadora al estar obligado a realizar
un uso óptimo de las instrucciones disponibles.
 Al tener acceso directo a los recursos del dispositivo se maximiza la velocidad.
 Al depender de la arquitectura del dispositivo la portabilidad de un programa es
mínima.
 El nivel de abstracción es mínimo por depender de la manera en que se ha
implementado el hardware.
 El uso del lenguaje requiere de máxima atención y de estar organizada en base a los
esquemas del dispositivo y del objetivo de la aplicación.
Un lenguaje de alto nivel permite al programador escribir las instrucciones de un
programa utilizando palabras o expresiones sintácticas muy similares al inglés. Por
ejemplo, en C se pueden usar palabras tales como: case, if, for, while, etc. Los lenguajes de
alto nivel buscan la independencia del tipo de máquina y se aproximan al lenguaje natural.
Características:
 Genera un código más sencillo y comprensible.
 El código es válido para diversas máquinas y, posiblemente, para diversos sistemas
operativos.
 Reducción de velocidad al ceder el trabajo de bajo nivel a la máquina.
 Algunos requieren que la máquina cliente posea una determinada plataforma.
El lenguaje natural de los microcontroladores es el Ensamblador, el cual, de acuerdo con lo
descrito, es distinto entre fabricantes, y por lo general, entre los modelos de un mismo
fabricante. Sin embargo, es posible programarlos usando lenguajes de alto nivel
específicamente modificados para este fin.
4.2. Ambiente integrado de desarrollo para microcontroladores
Un entorno de desarrollo integrado o entorno de desarrollo interactivo (en inglés Integrated
Development Environment (IDE)), es una aplicación informática que proporciona servicios
integrales para facilitarle al desarrollador o programador el desarrollo de software.

56

(a) (b)

(c)

(d)
Figura 4.1. Diversos IDE’s para microcontroladores PIC: (a) Proteus VSM Studio; (b) PIC
Simulator IDE; (c) MPLABX; (d) CCSC Compiler
Normalmente, un IDE consiste de un editor de código fuente, herramientas de construcción
automáticas y un depurador. La mayoría de los IDE tienen auto-completado inteligente de
código (IntelliSense) y pueden incluir un compilador. En el caso de los microcontroladores
existen varios IDE que además de las prestaciones comentadas pueden incluir simuladores.
Así podemos citar a Proteus VSM Studio, PIC Simulator IDE, MPLABX IDE, (figura 4.1).

4.2.1. Ensamblador y compilador


El editor de código con el que viene equipado el IDE permite escribir el texto en formato
plano (ASCII) cuya extensión es *.asm (algorithmic state machine) mismo que deberá ser 57
llevado a un compilador para verificar su estructura y sintaxis de tal forma que sea posible
obtener el código objeto ejecutable por el microcontrolador (archivos que tienen por
extensión *.hex, por su contenido en formato hexadecimal).

En los microcontroladores PIC el compilador para el lenguaje ensamblador es el MPASM,


que viene incluido por defecto en la mayoría de los IDE’s.

Por otro lado, al existir la posibilidad de programar PIC’s en versiones modificadas de


lenguajes de alto nivel, entonces ocurre que por lo general en un mismo ambiente de
desarrollo pueden convivan varios compiladores de ese orden, entre los que podemos citar
a:

 PICBASIC PRO™ Compiler 3.0. Es un compilador basado en el lenguaje Basic


producido por microEngineering Labs, Inc. Se promociona como un estándar para
la industria. Mantiene versiones de paga y una versión limitada estudiantil sin costo.
 CCS C Compiler. Es un compilador basado en el lenguaje C producido por Custom
Computer Services, Inc. Declara ser un compilador fácil de usar y de rápido
aprendizaje. Es completamente de pago.
 MPLAB® XC Compiler. Es también un compilador basado en C, desarrollador por
el fabricante de los PIC’s, Microchip. Es de paga y tiene una versión “libre” de uso
por 60 días.

4.2.2. Simulador, depurador y emulador


Distinguimos estos conceptos diciendo que:

 Un simulador es la representación de un dispositivo o arreglo físico en software


que pretende proporcionar una funcionalidad similar, pero sin utilizar ningún
dispositivo de hardware. En el caso de un programa para microcontrolador el código
se ejecuta en el entorno IDE simulando el procesador en software. Un ejemplo muy
claro de la ejecución simulaciones la provee el módulo ISIS de Proteus (figura 4.2).
58

Figura 4.2. Simulación en Proteus ISIS.

 Un depurador (en inglés debugger) es igualmente una especie de simulación que


ofrece un acceso equivalente utilizando el hardware de depuración en el chip con
los procesadores de producción estándar, aunque igualmente puede hacerse por
software. Ofrece la posibilidad de realizar pausas en la ejecución y hacer puntos de
prueba sobre la marcha, así como pruebas por línea en código. La empresa
Microchip oferta dispositivos depuradores en dispositivo (In-Circuit Debugger)
conocidos como MPLAB ICD (figura 4.3).

Figura 4.3. Depurador MPLAB ICD 3.


 Un emulador tradicionalmente imita al procesador mediante el uso de un
procesador de enlace de salida conectado a un zócalo, donde normalmente se coloca
el procesador objetivo. Este procesador de salida tiene muchas señales internas
implementadas para proporcionar información sobre el estado del procesador. Los
sistemas modernos utilizan el procesador objetivo directamente con el acceso JTAG
(interfaz ICSP). Un ejemplo de estos dispositivos se muestra en la figura 4.4.

59

Figura 4.4. Dispositivo de emulación MPLAB REAL ICE.

4.2.3. Dispositivos programadores de microcontroladores


Llamados coloquialmente también quemadores, grabadores, y en inglés, downloaders, los
programadores de microcontroladores son los dispositivos que nos van a permitir “instalar”
nuestra aplicación (archivo *.hex) en el circuito integrado.

El fabricante de los PIC’s oferta grabadores oficiales que tienen completa compatibilidad
con sus diversas familias, a los cuales ha denominado PIC kit (figura 4.5).

Figura 4.5. Grabador PICkit 3


La ventaja fundamental de adquirir el producto oficial radica en que garantiza las
posteriores actualizaciones que pudieran hacerse al controlador del dispositivo, además de
ofrecer compatibilidad con otros accesorios producidos por el fabricante. La desventaja
fundamental consiste en su alto coste, que generalmente se suele cotizar en dólares en el
mercado mexicano.

Existen grabadores fabricados por terceros que tienen una funcionalidad limitada por ser
compatibles sólo con algunos modelos de microcontroladores, o por las continuas
actualizaciones que realiza el fabricante sobre el lenguaje y las directivas de configuración 60
del microcontrolador. Sin embargo, siempre es posible adecuar el código de tal forma que
estos dispositivos sean utilizables, lo que representa una ventaja al considerar su costo.
Ejemplos de estos grabadores, disponibles a la fecha de elaboración de este texto (Junio de
2016) se visualizan en la figura 4.6.

VOLNIA USP 3.0 MicroProg R2

MASTER PROG PIC K150

Figura 4.6. Grabadores de PIC’s fabricados por terceros.


4.3. Ejemplos básicos de programación
Proponemos ahora el desarrollo de una aplicación que nos permita visualizar en lo general
el uso de las herramientas de desarrollo. Para ello debemos considerar algunas
convenciones:
 Los ficheros de código fuente llevarán la extensión *.ASM
 Los ficheros de listado llevarán la extensión *.LST
 Los ficheros de código objeto llevarán la extensión *.OBJ
 Los ficheros de errores llevarán la extensión *.ERR
61
 Los ficheros ejecutables en formato Intel Hex llevarán la extensión *.HEX
 Comentario descriptivo del programa (utilizar una cabecera estandarizada).
 Definir el microcontrolador que se usará dependiendo de la versión del compilador
utilizado (con las directivas LIST e INCLUDE).
 Introducir las opciones de compilación (que serán vistas más adelante) (opcional).
 Establecer las constantes que se usarán (con la directiva EQU).
 Reservar espacios de memoria (directiva RES) (si es necesario).
 Configurar los puertos.
 Desarrollar el programa con comentarios, en lo posible explicando cada línea de
código.
 Los mnemónicos escritos en minúscula y las constantes y variables en mayúscula
hacen que el código escrito sea más visible.
 Colocar las rutinas en el mismo sitio, todas contiguas.
 Dibujar diagramas de flujo o escribir seudocódigo.

La estructura fundamental de un programa se muestra en la figura 4.7.

Figura 4.7. Estructura fundamental de un programa en ensamblador.


También es importante notar la posición de los elementos del código organizado en cuatro
columnas (figura 4.8).

62

Figura 4.8. Organización de los elementos de código.

Una descripción de las columnas sería que


 Las etiquetas:
o Deben situarse en la primera columna.
o Debe contener únicamente caracteres alfanuméricos.
o El máximo de caracteres es de 31.
 En la columna de operación se situarán las instrucciones. El campo del código de
operación es el único que nunca puede estar vacío; éste siempre contiene una
instrucción o una directiva del ensamblador.
 El campo de operandos o de dirección puede contener una dirección o un dato, o
puede estar en blanco. Normalmente contendrá registros o literales con los que se
operará (f, l o k, b y w).
 El campo del comentario o de etiquetas es opcional. Aquí se situará cualquier
comentario personalizado que deseemos. Estos son útiles para saber qué hace un
programa sin tener que descifrar el código entero. El compilador (ensamblador)
ignorará todo texto más allá del carácter punto y coma ";".

Los comentarios generalmente se sitúan en la cuarta columna para describir la acción de


una línea de código, pero pueden situarse en cualquier parte de programa para describir
cualquier otro evento, siempre que estén después del carácter ";" (semicolon en inglés).
Normalmente las columnas son separadas por una tabulación. El espacio mínimo entre dos
columnas es de un carácter, que puede ser un espacio en vez de una tabulación.

En el caso de los delimitadores de campos en la estructura:


 Los campos van separados sólo con espacios y/o tabulaciones. No agregue nunca
otros caracteres (comas, puntos, etc.)
 No utilice espacios extra, particularmente después de comas que separan operandos.
Por ejemplo: movlw 5, w
 No use caracteres delimitadores (espacios y tabulaciones) en nombres o etiquetas.
En cuanto a las etiquetas también es importante advertir que se sitúan a la izquierda de las
instrucciones y sirven para agrupar fragmentos de código. Estos fragmentos pueden ser de
dos tipos:
 El primer tipo no es un fragmento tal cual, si no que es un punto del programa al
que podremos saltar de manera incondicional a través de la instrucción adecuada.
 El segundo tipo es denominado subrutina. Este empieza con una etiqueta y acaba
con la instrucción RETURN o RETLW, que veremos más adelante.
Además:
 La etiqueta es el primer campo en una línea en lenguaje ensamblador y puede no 63
existir.
 Si una etiqueta está presente, el ensamblador la define como el equivalente a la
dirección del primer byte correspondiente a esa instrucción.
 Esta etiqueta puede volver a usarse en otro lugar, pero como operando de una
instrucción. El ensamblador reemplazará ésta etiqueta por el valor asignada a la
línea de instrucción en que fue creada. Se usan frecuentemente en las instrucciones
de salto.
 No puede existir más de una etiqueta en la primera columna o primer campo de
instrucción.
 No pueden usarse como nombres de etiquetas a palabras ya reservadas por el
ensamblador (ORG, EQU, etc.) o nombres de instrucciones (movlw, call, nop, etc.)

Un ejemplo de uso de las etiquetas sería:


DATO EQU 05h

INICIO movlw DATO


goto INICIO

En el ejemplo la instrucción goto INICIO causa que la dirección de la instrucción con la


etiqueta INICIO (movlw) se cargue en el PC (Contador de Programa). Por lo tanto, ésta
instrucción será luego ejecutada.
No se permite el uso de números o caracteres no alfabéticos como primera letra de la
etiqueta. Como regla práctica: usar siempre letras, y en mayúscula, al menos la primera.
Ejemplos:
TABLA2X2 Permitido
+PESO NO permitido!
=>SALIDA NO permitido!
-SALTO NO permitido!
5ALFA NO permitido!
Dato1 Permitido
Dato2 Permitido
Loop_A Permitido
El ensamblador permite elegir con libertad el tipo de elemento a colocar en el campo de
operando o dirección.

En cuanto a los sistemas de numeración, el ensamblador admite distintos formatos, tal


como se muestra en la tabla siguiente.

Tabla 10. Sistemas numéricos en Ensamblador.


Hexadecimal Binario Octal Decimal
0A00h %01001011 @123 D'250' 64
$0A00 B'00100101' 123Q .250
01011010b

Ejemplo:
movlw .100 Significa cargar el número 100 decimal en el registro W.

Los nombres pueden aparecer en el campo de operando; éstos son tratados como el dato
que representan.

Algunos ensambladores permiten el uso de caracteres en ASCII. Por ejemplo:


data "hola 1,2,3" ;cadena de caracteres
data 'N' ;caracter sencillo
CHAR equ 't'
movlw 'R'

El ensamblador permite combinaciones de datos con operandos especiales, aritméticos o


lógicos. Éstos operandos se llaman expresiones.

Por ejemplo:
REG1 EQU 05h
VALOR EQU 20h

movlw VALOR+2
addwf REG1,1
addwf REG1+1,1

El resultado del ejemplo utilizará el resultado de sumar (VALOR+2) o (REG+1) como


operando.

Ejercicio 4.1. Primer programa PIC, encendido y apagado de un LED.


Objetivos:
 Conocer la configuración básica de los registros de control y de propósito general
para aplicaciones PIC.
 Escribir el programa en lenguaje Ensamblador y simularlo.
 Grabar el código en el microcontrolador y probar el programa en un circuito real.

Material y equipo:
 Computadora personal.
 Software PIC Simulator IDE.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
65
 Microcontrolador PIC 16F84A.
 Leds.
 Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
En las sesiones teóricas se han dado los requerimientos teóricos y prácticos para la
programación de los PICs. Se ha descrito el lenguaje ensamblador como la base de
programación de un PIC. Se dieron ejemplos acerca de la configuración de los
registros especiales del microcontrolador, que permiten entre otras cosas definir los
pines que servirán de entrada y salida del PIC, declarar los registros que serán
usados como la RAM del sistema. Como tal entonces se está preparado para tener la
primera experiencia programando PICs, la cual consiste solamente en programar el
puerto B del PIC en su pin 0 para lograr que éste encienda y apague un led en un
ciclo infinito.

Desarrollo
a) Programación. En esta parte seguiremos los siguientes pasos:
i. Abriremos el programa PIC Simulator IDE que nos permitirá tener un
compilador de lenguaje ensamblador y al mismo tiempo un simulador visual
básico de programas PIC. Con la asesoría de su docente reconozca los
componentes básicos del mismo.
ii. Configure el simulador para utilizar el PIC 16f84A.
iii. Una vez conocido el entorno abra el editor de código de ensamblador y
proceda a capturar el código que se muestra en la figura 4.9. Compile y
corrija los posibles errores cometidos.
iv. Abra el simulador de arreglo de leds y confirme que se encuentran
“conectados” al puerto B del microcontrolador y simule el programa. Dibuje
el diagrama de flujo que describa el funcionamiento del programa (figura
4.9).

66

Figura 4.9. Distintas vistas del uso del PIC Simulator IDE.
b. Grabado del PIC y armado del circuito de prueba. Con la asesoría de su docente
realizará lo siguiente:
i. De los archivos generados por la simulación obtendrá el archivo *.hex.
ii. El archivo hex será cargado al grabador de PICs y se hará lo propio,
instalando la tarjeta y el microcontrolador en ella.
iii. Proceda al armado del circuito de la figura 4.10 y disponga en su posición al
microcontrolador.
iv. Encienda la fuente de alimentación y observe el resultado.

67

Figura 4.10. Arreglo de circuito para el encendido de un LED.

c. Agregue un reporte electrónico donde deberá incluir:


 Hoja de presentación.
 Introducción.
 Planteamiento del problema.
 Desarrollo de la práctica contiendo los pasos descritos; listado de material
utilizado en la implementación física; evidencias de la operación óptima de la
implementación física (fotografías).
 Conclusiones.

Ejercicio 4.2. Retardos, desplazamientos de bits, ciclos, saltos condicionales, subrutinas.


Objetivos:
 Conocer y emplear de forma adecuada las distintas instrucciones que posee el
lenguaje Ensamblador para generar retardos de tiempo, desplazamiento de los bits
de un registro, saltos condicionales ysubrutinas.
 Comprender la manera en que se pueden implementar condiciones y ciclos en un
microcontrolador.

Material y equipo:
 Computadora personal.
 Software PIC Simulator IDE.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC 16F84A.
68
 Leds.
 Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard

Introducción
Los lenguajes de programación de alto nivel se distinguen por la facilidad con que
se pueden implementar en ellos bloques de decisión. De la misma manera
establecer una tarea repetitiva resulta sencilla en esos lenguajes. El lenguaje de bajo
nivel en cambio no tiene implementadas instrucciones que nos faciliten esa tarea
porque la lógica que se maneja en él es la de la lógica de registros que supone
manipular directamente direcciones de memoria contenidas en un dispositivo
electrónico. Sin embargo, la lista de instrucciones que poseen los
microcontroladores incluyen algunas que permiten probar la validez de la
comparación de valores booleanos a través operaciones aritméticas, realizando
condicionalmente un salto de las líneas de instrucción dejando sin ejecutar la que
sigue inmediatamente y ejecutando la que sigue una línea después. La utilización
ingeniosa de tales instrucciones nos permitirá realizar saltos entre rutinas y
programar ciclos y/o retardos. El código que se ofrece en ésta práctica ilustra este
hecho, con el objetivo de generar un programa que permita encender
secuencialmente cada uno de los leds conectados al puerto B de nuestro
microcontrolador.

Desarrollo
Realice las siguientes tareas:
i. Capture el siguiente código en el PIC Simulator IDE y simúlelo. Revise el
código y haga un bosquejo de su diagrama de flujo. Resalte las
instrucciones que llaman subrutinas, distinga etiquetas de bloques de
programa, reconozca las instrucciones de salto condicional y diga cuantos
ciclos hay en el programa. Diga cuál es la finalidad de implementar esos
retardos.

69

ii. Al observar la simulación notará que no se encienden en forma secuencial


los 8 leds sino solamente algunos. El objetivo final del código era el de
provocar que se encienda uno a uno los leds que van desde el bit 0 hasta el
bit 7. Revise el código y trate de encontrar el error. Corrija el código y
vuelva a simular.
iii. Finalmente, grabe el archivo *.hex correspondiente en el microcontrolador
y pruébelo en el mismo circuito dado en la práctica 4.1.
iv. Realice un reporte con los mismo esquema de la práctica 4.1.
5. Puertos de entrada y salida
En esta unidad el estudiante:
 Maneja los puertos de entrada y salida.

5.1. Arquitectura de los puertos de entrada y salida


En el caso de microcontrolador 16F84A sólo tenemos dos puertos entrada y salida, los
cuales tienen un uso general (figura 5.1). Algunos pines de los mismos tienen funciones 70
alternativas.

Figura 5.1. Puertos de entrada y salida en el PIC16F84A.

La estructura típica de un puerto de entrada y salida de propósito general se muestra en la


figura 5.2.

Figura 5.2. Estructura interna de un puerto de entrada y salida de propósito general.

En esta arquitectura el valor de RESET de los registros TRIS suele ser un ‘1’, de forma que
por defecto los pines estén configurados como entradas evitando posibles cortocircuitos en
la alimentación que podrían dañar el micro o el resto del sistema.
El registro PORT funciona como un latch para los datos de salida. Cuando el registro
PORT se lee (por ejemplo: movf PORTB,W), el micro lee los niveles presentes en los
pines de I/O (no en los latches).

Cuando una función está multiplexada en un pin de I/O de propósito general, la


funcionalidad de un pin puede cambiar para acomodarse a los requisitos del módulo
periférico. Por ejemplo, si un micro tiene un conversor A/D, los pines asociados a este
módulo están configurados en un RESET como entradas analógicas para evitar un consumo
de corriente excesivo en el buffer de dicho pin si este estuviera configurado como entrada 71
digital y el valor de tensión en el pin estuviera a un nivel intermedio.

El puerto B tiene internamente unas resistencias de pull-up conectadas a sus pines (sirven
para fijar el pin a un nivel de cinco voltios), su uso puede ser habilitado o deshabilitado
bajo control del programa. Todas las resistencias de pull-up se conectan o se desconectan a
la vez, usando el bit llamado RBPU que se encuentra en el registro (posición de memoria
RAM) llamado OPTION. La resistencia de pull-up es desconectada automáticamente en un
pin si este se programa como salida. El pin RB0/INT se puede configurar por software para
que funcione como interrupción externa, para configurarlo se utilizan unos bits de los
registros INTCON y OPTION.

El pin RA4/TOCKI del puerto A puede ser configurado como un pin de entrada/salida o
como entrada del temporizador/contador. Cuando este pin se programa como entrada
digital, funciona como un disparador de Schmitt (Schmitt trigger), puede reconocer señales
un poco distorsionadas y llevarlas a niveles lógicos (cero y cinco voltios). Cuando se usa
como salida digital se comporta como colector abierto, por lo tanto, se debe poner una
resistencia de pull-up (resistencia externa conectada a un nivel de cinco voltios). Como
salida, la lógica es inversa: un "0" escrito al pin del puerto entrega en el pin un "1" lógico.
Además, como salida no puede manejar cargas como fuente, sólo en el modo sumidero.

Como este dispositivo es de tecnología CMOS, todos los pines deben estar conectados a
alguna parte, nunca dejarlos al aire porque se puede dañar el integrado. Los pines que no se
estén usando se deben conectar a la fuente de alimentación de +5V, como se muestra en la
figura 5.3.

Figura 5.3. Terminales de puerto sin usar a voltaje.


5.2. Configuración y características eléctricas de los puertos de E/S
La máxima capacidad de corriente de cada uno de los pines de los puertos en modo
sumidero (sink) es de 25 mA y en modo fuente (source) es de 20 mA (figura 5.4).

72

Figura 5.4. Capacidad de corriente en el microcontrolador.

La máxima capacidad de corriente total de los puertos es:

Tabla 11. Corriente máxima en puertos E/S


Configuración Puerto A Puerto B
Modo sumidero 80 mA 150 mA
Modo fuente 50 mA 100 mA

El consumo de corriente del microcontrolador para su funcionamiento depende del voltaje


de operación, la frecuencia y de las cargas que tengan sus pines. Para un reloj de 4 MHz el
consumo es de aproximadamente 2 mA; aunque este se puede reducir a 40 microamperios
cuando se está en el modo sleep (en este modo el micro se detiene y disminuye el consumo
de potencia). Se sale de ese estado cuando se produce alguna condición especial.

5.3. Uso de los puertos con interfaces para dispositivos periféricos


Las aplicaciones que pueden tener los microcontroladores como elementos manejadores de
dispositivos periféricos es muy variada pudiendo utilizarse para, entre otras cosas controlar
dispositivos que desplieguen información como los displays de 7 segmentos y las pantallas
de cristal líquido, o bien para controlar la introducción de información como pueden ser los
teclados y los mouses. Ofrecemos a continuación dos ejemplos que ilustran lo mencionado.
5.3.1. Displays de 7 segmentos
El displays segmentos, es un componente que se utiliza para la representación de números
en muchos dispositivos electrónicos. Este elemento se ensambla o arma de manera que se
pueda activar cada segmento (diodo LED) por separado logrando de esta manera combinar
los elementos y representar todos los números en el display (del 0 al 9). El display de 7
segmentos más común es el de color, por su facilidad de visualización.

73

Figura 5.5. Esquema de los displays de 7 segmentos.

Cada elemento del display tiene asignado una letra que identifica su posición en el arreglo
del display (ver la figura 5.5):

 Si se activan todos los segmentos: “a,b,c,d,f,g” se forma el número “8”


 Si se activan sólo los segmentos: “a,b,c,d,f,” se forma el número “0”
 Si se activan sólo los segmentos: “a,b,g,e,d,” se forma el número “2”
 Si se activan sólo los segmentos: “b,c,f,g,” se forma el número “4”
 Si se activan sólo los segmentos: “a,b,g,c,d,” se forma el número “3”
 Si se activan sólo los segmentos: “a,f,g,c,d,” se forma el número “5”
 Un punto decimal puede encenderse (opcional) en el esquema etiquetado con
‘dp’.

Existen dos tipos de displays:

 De ánodo común, todos los ánodos de los diodos LED unidos y conectados a la
fuente de alimentación (figura 5.6). En este caso para activar cualquier elemento
hay que poner el cátodo del elemento a tierra a través de una resistencia para
limitar la corriente que pasa por el elemento.
Figura 5.6. Arreglo de leds para el display en ánodo común.

 De cátodo común, tiene todos los ánodos de los diodos LED unidos y
conectados a tierra (figura 5.7). Para activar un segmento de estos hay que poner
el ánodo del segmento a encender a Vcc (tensión de la fuente) a través de una 74
resistencia para limitar el paso de la corriente.

Figura 5.7. Arreglo de leds para el display en cátodo común.

Si consideramos el display de cátodo común, podemos formar palabras de 8 bits para


formar los números del 0 al 9, en el que el bit más significativo siempre es cero tal como se
muestra en la figura 5.8.

Figura 5.8. Codificación para números dígitos en un display de cátodo común

Ejercicio 5.1. Tablas, Timer Interno y display de 7 segmentos de cátodo común. Diseño de
un contador de 0 a 9 de pulsos externos. Los pulsos se generan de modo manual.
Objetivos:
 Conocer cómo se pueden almacenar valores direccionados (arreglos tipo lista)
en la memoria del PIC y la manera en que se extraen de ella para su proceso en
el programa.
 Emplear el Timer interno del microcontrolador como un receptor de disparos
externos.
 Emplear el compilador MPLAB y el simulador PROTEUS.

Material y equipo:
 Computadora personal.
 Software Microchip MPLAB.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
75
 Microcontrolador PIC 16F84A.
 Display de siete segmentos de cátodo común.
 Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
 Push buttons.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
Una manera de implementar “tablas” es incluyendo posiciones de memoria
debidamente direccionadas. Esto se realiza a través del registro contador de
programa (PCL) que es quien direcciona las posiciones de memoria que almacenan
códigos hexadecimales de instrucción y/o de valores. Entender cómo ocurre este
proceso nos devolverá a las sesiones teóricas donde se explora el Lenguaje de la
Lógica de Registros.
Ahora bien, un microcontrolador puede mantener un ciclo de reloj para la ejecución
de programas basado en el cristal que es implementado en el arreglo del circuito,
por lo que para ejecutar instrucciones en el tiempo divide la frecuencia del cristal
en 4. Así si el cristal es de 4 MHz cada instrucción (exceptuando las de salto
condicional) se ejecuta en un ciclo de 1 MHz o en un tiempo de 1 microsegundo.
Pero también es capaz de tomar un reloj externo como referencia, para lo cual se
puede emplear el pin TOCK del puerto A para conectarlo físicamente y configurar
el registro TMR0 para que lea los flancos desde aquel pin.
En ésta práctica lo que se busca es almacenar los códigos hexadecimales necesarios
para encender un display de 7 segmentos que muestre los números dígitos del
sistema hexadecimal. El cambio de número a número se efectuará manualmente
pulsando valores desde el pin TOCK.

Desarrollo
Con la asesoría de su docente realizará lo siguiente:
i. Abrirá y conocerá el entorno de programación del MPLAB.
ii. Creará un nuevo proyecto en él mediante un asistente interactivo.
iii. Escribirá en código convencional de Ensamblador el programa de la práctica (el
PIC Simulator IDE escribe algunas líneas por nosotros, el MPLAB no). A
continuación, mostramos el código a capturar, denote las partes del código
donde se configura el Timer, donde se declaran los valores de la tabla, y la
manera en que son procesados por el programa principal. Compile el programa
para obtener el archivo *.hex.
76
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
;declaración de variables
TIMER0 EQU 0x01
CONTPROG EQU 0x02
ESTADO EQU 0x03
OPCION EQU 0x81
PUERTOB EQU 0x06
CONFIGPTOB EQU 0x86

;vector de reseteo
ORG 0x00
Reset GOTO INICIO

;rutina de tabla
TABLA movf TIMER0,0
andlw 0x0F
addwf CONTPROG,1
retlw 0x3F
retlw 0x06
retlw 0x5B
retlw 0x4F
retlw 0x66
retlw 0x6D
retlw 0x7D
retlw 0x07
retlw 0x7F
retlw 0x67
retlw 0x77
retlw 0x7C
retlw 0x39
retlw 0x5E
retlw 0x79
retlw 0x71

;entradas y salidas
INICIO bsf ESTADO,5
clrf CONFIGPTOB
bcf ESTADO,5
;configuración del TMR0
bsf ESTADO,5
bsf OPCION,5
bsf OPCION,4
bcf ESTADO,5
clrf TIMER0

;programa principal
PROGRAMA call TABLA
movwf portb
goto PROGRAMA 77

;=================================================
goto $
END

iv. A continuación, abrirá el simulador PROTEUS en su módulo ISIS. En él


realizará el diseño del circuito. Hecho lo anterior dé doble clic sobre el bloque
del microcontrolador y cargue el archivo *.hex generado por el MPLAB.
Simule el circuito, presionando el objeto push button.

Figura 5.9. Circuito para simular el proyecto en Proteus ISIS.

v. Grabe el microcontrolador y arme el circuito mostrado. Realice la prueba del


mismo.
vi. Realice el reporte correspondiente.
5.3.2. Teclado matricial
Un teclado matricial es un simple arreglo de botones conectados en filas y columnas, de
modo que se pueden leer varios botones con el mínimo número de pines requeridos (figura
5.10).

78

Figura 5.10. Un teclado matricial 4×4

El principio de funcionamiento de un teclado matricial es sencillo y es similar a lo que


haríamos para multiplexar leds o dipslays de 7 segmentos.
El programa configura el puerto B del PIC de la siguiente forma: RB4 a RB7 funcionan
como salidas y la otra mitad (RB0-RB3) como entradas. Las filas (horizontal) del teclado
matricial se conectan a los bits más significativos que funcionan como salidas, mientras que
las columnas (vertical) se conectan a los bits menos significativos del puerto que funcionan
como entradas con resistencias pull-down. Cualquier tecla que se oprima en una columna
causará que uno de los bits menos significativos del puerto (RB0 – RB3) cambie de un
estado lógico bajo a un estado alto.
La figura 5.11 muestra las conexiones del teclado al puerto B del microcontrolador. La
imagen muestra el teclado en reposo (sin teclas oprimidas).

Figura 5.11. Arreglo de teclado matricial 4×4.


Cuando se oprime una tecla la corriente puede fluir a través del switch y el voltaje de los
pines conectados a las filas del teclado (5 V o nivel alto) aparece ahora también en alguno
de los pines RB0 a RB3 según la columna en la que se encuentra la tecla oprimida. La
figura 5.12 ilustra lo que sucede al oprimir una tecla: al oprimir el botón 6 provocamos un
cambio en el PIN RB2 que ahora recibe un 1 o estado alto. Sabemos entonces que se ha
pulsado un botón en la segunda columna y se muestra como un nivel lógico alto aparece en
los bits menos significativos del puerto B, específicamente en RB2.

79

Figura 5.12. Presión de una tecla y flujo de corriente.

Con un microcontrolador podríamos saber que se ha oprimido una tecla al detectar un


cambio de nivel en los bits menos significativos identificando por ahora la columna
(dependiendo del bit activo RB3 a RB0). Para resolver en que fila se oprimió una tecla, hay
que realizar un proceso de escaneo del teclado. En este proceso, colocaremos en secuencia
un 1 lógico (estado alto) en los 4 bits más significativos del puerto y leeremos el estado de
los 4 bits menos significativos. En otras palabras, el microcontrolador escanea en forma
sucesiva los pines de salida, mientras lee las entradas en la parte baja del puerto, de manera
que puede detectar que teclas están oprimidas en cada fila.

Ejercicio 5.2. Interfaz de un teclado matricial 4×4


Objetivo:
 Comprender el funcionamiento de un teclado matricial en su interfaz con un
microcontrolador.
 Emplear palabras variables reconocidas por el compilador del MPLABX
 Practicar la portabilidad y los ajustes entre códigos de distintos modelos del
microcontrolador.
Material y equipo:
 Computadora personal.
 Software Microchip MPLAB.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F84A.
 CI Decodificador BCD a 7 segmentos TTL o CMOS. 80
 Display de siete segmentos de cátodo común.
 Resistencias de 330 Ω , 1 kΩ, 10 kΩ.
 Push buttons.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
Un modo simple de detectar la tecla presionada es incrementar una variable con la
cuenta de las teclas revisadas, de este modo al detectaruna pulsación el valor de la
cuenta será el valor de la tecla presionada. Si al final no se presionó ninguna tecla
la variable se pone a cero y la cuenta vuelve a comenzar. El puerto B del
microcontrolador 16f628 (así como en el 16f877) viene preparado especialmente
para el control de un teclado matricial 4x4. Para tener siempre un valor de 1 lógico
en las colúmnas del teclado (parte alta del puerto B del pic) es necesario conectar
resistencias de pull-up, sin embargo, el puerto B cuenta con resistencias de pull-up
integradas, de ese modo es posible trabajar con un teclado matricial sin necesidad
de ningún componente externo.

Las resistencias de pull-up del puerto B se habilitan poniendo en 0 el bit


NOT_RBPU del registro OPTION_REG. Al método aquí expuesto para detectar la
pulsación de una tecla en un teclado matricial se le conoce como muestreo
secuencial. En ésta práctica cada tecla del teclado matricial tiene un valor de 0 a F,
valor que se despliega en un display de 7 segmentos.

Desarrollo
Realizar los siguientes pasos con la asesoría de su docente:
i. Realizar el circuito de la figura 5.13 en ISIS Proteus. Observe el
microcontrolador en uso.
81

Figura 5.13. Circuito para la práctica 5.2, se usa un PIC16F628A

ii. A continuación, utilice el editor y compilador de código ensamblador de


Proteus o el MPLABX para preparar el siguiente código. Realice las
necesarias con asesoría de su docente (esto debido a las actualizaciones del
lenguaje implementadas por Microchip).
82
83

iii. A continuación, realice la simulación del arreglo.


iv. Con asesoría de su docente realizará modificaciones al circuito y al código
para utilizar un PIC16F84A y un decodificador BCD a 7 segmentos
adaptado al puerto A para mostrar los números. Simule el circuito
modificado.
v. Arme el circuito y realice la prueba física. Elabore su reporte
correspondiente.

5.3.3. Sensores de proximidad


Un sensor de proximidad es un transductor que detecta objetos o señales que se encuentran
cerca del elemento sensor. Existen varios tipos de sensores de proximidad según el
principio físico que utilizan, los más comunes son:
 Interruptores de posición. El final de carrera o sensor de contacto (también
conocido como "interruptor de límite") o limit switch, son dispositivos eléctricos,
neumáticos o mecánicos situados al final del recorrido de un elemento móvil, como
por ejemplo una cinta transportadora, con el objetivo de enviar señales que puedan
modificar el estado de un circuito. Internamente pueden contener interruptores
normalmente abiertos (NA), cerrados (NC) o conmutadores (2) dependiendo de la
operación que cumplan al ser accionados los detectores capacitivos, los inductivos y
los fotoeléctricos, como el de infrarrojos.
 Capacitivos. La función del detector capacitivo consiste en señalar un cambio de
estado, basado en la variación del estímulo de un campo eléctrico. Los sensores
capacitivos detectan objetos metálicos, o no metálicos, midiendo el cambio en la
capacitancia, la cual depende de la constante dieléctrica del material a detectar, su
masa, tamaño, y distancia hasta la superficie sensible del detector. Los detectores
capacitivos están construidos sobre la base de un oscilador RC. Debido a la
influencia del objeto a detectar, y del cambio de capacitancia, la amplificación se 84
incrementa haciendo entrar en oscilación el oscilador.
 Inductivos. Los sensores inductivos de proximidad han sido diseñados para trabajar
generando un campo magnético y detectando las pérdidas de corriente de dicho
campo generadas al introducirse en él los objetos de detección férricos y no férricos.
El sensor consiste en una bobina con núcleo de ferrita, un oscilador, un sensor de
nivel de disparo de la señal y un circuito de salida.
 Fotoeléctricos. El receptor de rayos infrarrojos suele ser un fototransistor o un
fotodiodo. El circuito de salida utiliza la señal del receptor para amplificarla y
adaptarla a una salida que el sistema pueda entender. La señal enviada por el emisor
puede ser codificada para distinguirla de otra y así identificar varios sensores a la
vez. Esto es muy utilizado en la robótica en casos en que se necesita tener más de un
emisor infrarrojo y solo se quiera tener un receptor. Existen tres tipos de sensores
fotoeléctricos, los sensores por barrera de luz, reflexión sobre espejo o reflexión
sobre objetos.
 Ultrasónicos. Los sensores de ultrasonidos son detectores de proximidad que
trabajan libres de roces mecánicos y que detectan objetos a distancias de hasta 8m.
El sensor emite impulsos ultrasónicos. Estos reflejan en un objeto, el sensor recibe
el eco producido y lo convierte en señales eléctricas, las cuales son elaboradas en el
aparato de valoración. Estos sensores trabajan solamente en el aire, y pueden
detectar objetos con diferentes formas, superficies y de diferentes materiales. Los
materiales pueden ser sólidos, líquidos o polvorientos, sin embargo, han de ser
deflectores de sonido. Los sensores trabajan según el tiempo de transcurso del eco,
es decir, se valora la distancia temporal entre el impulso de emisión y el impulso del
eco.
 Magnéticos. Los sensores de proximidad magnéticos son caracterizados por la
posibilidad de distancias grandes de la conmutación, disponible de los sensores con
dimensiones pequeñas. Detectan los objetos magnéticos (imanes generalmente
permanentes) que se utilizan para accionar el proceso de la conmutación. Los
campos magnéticos pueden pasar a través de muchos materiales no magnéticos, el
proceso de la conmutación se puede también accionar sin la necesidad de la
exposición directa al objeto.

Ejercicio 5.3. Proyecto de un sensor de proximidad basado en dispositivos de detección de


infrarrojos.
Planteamiento del problema
La figura 5.14 ilustra el diseño de un sensor de proximidad basado en sensores
infrarrojos y el PIC 16F628A descrito por Raúl Rosales Guzmán (Punto Flotante
SA) en la dirección:
http://www.puntoflotante.net/SENSOR1.htm
Nota: Para una mejor imagen, descargar la misma del link que proveen en el mismo
sitio.
85

Figura 5.14. Proyecto de un sensor de proximidad.

El código compartido a continuación, también está disponible en aquella dirección.

;ESEN3C genera una onda cuadrada


;usa oscilador interno y Low Voltage Programming Enable OFF
;tres opciones de funcionamiento mediante jumpers
;
;DETECTOR DE PROXIMIDAD
;PUNTO FLOTANTE S.A.
;Autor: Raul Rosales

processor 16F628
include <p16f628.inc>
__config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF

#DEFINE BANCO0 BCF STATUS,5


#DEFINE BANCO1 BSF STATUS,5

CONT EQU 20H


L EQU 21H
M EQU 22H
P EQU 23H
EVE EQU 24H
PENDON EQU 25H
CUMULO EQU 26H
ESTABLO EQU 27H
PAU EQU 28H

ORG 00H 86
GOTO INICIO
ORG 0X4
CAMBIO CALL MOMENTO
bcf INTCON,1;quitar bandera INTF
BSF INTCON,7 ;habilitacion global GIE
MOVWF CUMULO ;se guarda el acumulador en un registro
MOVF STATUS,W ;el status tambien se va a guardar
BANCO0 ;se asegura que esta en banco cero
MOVWF ESTABLO ;aqui se guarda el estatus
btfss PORTB,4
GOTO FARO ;1a opcion, enciende ~ 1 seg
BTFSS PORTB,5
GOTO VELA ;2a opcion, enciende ~ 10 seg
ALTERNA BCF PENDON,0
MOVLW 0X3 ;3a opcion, enciende o apaga alternado
MOVWF PAU
CLRF PENDON
bsf PENDON,3
GOTO ACABA
FARO CLRF PENDON
MOVLW 0X3
MOVWF PAU
BSF PENDON,1
GOTO ACABA
VELA CLRF PENDON
MOVLW 0X37
MOVWF PAU
BSF PENDON,2
GOTO ACABA
ACABA MOVF ESTABLO,W
MOVWF STATUS
SWAPF CUMULO,F
SWAPF CUMULO,W
RETFIE
INICIO BANCO1
movlw 0xFD ;RB1 salida, RB0,4,5 y 6 entradas
movwf TRISB
bcf OPTION_REG,7 ;para Pull Up en puerto B
bsf PCON,3 ;para OSCF a 4 MHz
movlw 0xFE ;RA0 salida, RA2 entrada
movwf TRISA
BANCO0
MOVLW 0X3
MOVWF PAU
BSF PENDON,3
MOVLW 0X90
MOVWF INTCON
LUZ BSF PORTB,1 ;enciende L.I.R.
call MOMENTO
MOVLW 0X4
MOVWF EVE
TRENES movlw 0X5
movwf CONT
CALL MOMENTO
PULSOS bcf PORTB,1
call PICO
bsf PORTB,1
call PICO
decfsz CONT
goto PULSOS
BTFSS PORTA,4
GOTO PASA 87
BTFSS PENDON,3
GOTO DESACTI
GOTO LUZ
PASA DECFSZ EVE
GOTO TRENES
VIBRA btfsc PENDON,0
GOTO DESACTI
BTFSC PENDON,1
GOTO ACTIVA ;1a opcion
btfsc PENDON,2
GOTO ACTIVA ;2a opcion
BTFSS PENDON,3 ;3a opcion
GOTO APAGA
BTFSC PENDON,4
GOTO APAGA
bsf PENDON,4
BSF PORTA,0
MISMO call PAUSA
goto LUZ
APAGA BCF PENDON,4
BCF PORTA,0
goto MISMO
ACTIVA bsf PORTA,0
call PAUSA
goto LUZ
DESACTI bcf PORTA,0
call MOMENTO
goto LUZ
PICO movlw 0x06
movwf P
PE decfsz P,f
goto PE
return
MOMENTO movlw 0x3
movwf M
MOM movlw 0xFA
movwf L
MOL decfsz L
goto MOL
decfsz M,f
goto MOM
return
PAUSA movfw PAU
movwf L
PAL movlw 0xFF
movwf M
PAM MOVLW 0XFF
MOVWF P
PAN DECFSZ P,F
GOTO PAN
decfsz M,F
goto PAM
decfsz L,f
goto PAL
return
end

Su meta es lograr la implementación física del arreglo usando el 16F84A.


Debe entregar en tiempo y forma:
 El sistema funcionando de manera óptima. 88
 Entregar un reporte que debe incluir:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado
de material utilizado en la implementación física; evidencias de la
operación óptima de la implementación física (fotografías).
o Conclusiones.

5.4. Uso de los puertos para manejo de dispositivos de potencia


Existen distintas maneras de permitir a un microcontrolador manipular dispositivos de
potencia y resultaría complejo mostrar todas ellas, por lo que sólo presentamos algunas
ideas fundamentales.

En la figura 5.15 presentamos un circuito básico implementado con diodos, transistores y


relevadores.

Figura 5.15. Circuito básico de interfaz de potencia.


Una variante del anterior circuito agrega un led y una resistencia en serie con el relevador
para indicar si el relevador está energizado (figura 5.16).

89

Figura 5.16. Circuito básico de interfaz de potencia con indicador de relé polarizado.

En la figura 5.17 tenemos una salida a optoacoplador y relé.

Figura 5.17. Salida a optoacoplador y relé.

Ejercicio 5.4. Aplicación de interfaz de potencia: Inversión del giro de un motor DC.
Objetivo:
 Observar la implementación de interfaces de potencia para el control de
motores de DC.
 Documentarse sobre el funcionamiento de los puentes H.

Material y equipo:
 Computadora personal.
 Software Microchip MPLAB.
 Software Proteus.
90
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F84A.
 CI Decodificador BCD a 7 segmentos TTL o CMOS.
 Display de siete segmentos de cátodo común.
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Transistores, cuatro BC548 (usar TIP41 si se usan motores de más potencia.
 Motor DC pequeño.
 Push buttons.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
Un Puente en H es un circuito electrónico que permite a un motor eléctrico DC
girar en ambos sentidos, avance y retroceso. Son ampliamente usados en robótica y
como convertidores de potencia. Los puentes H están disponibles como circuitos
integrados, pero también pueden construirse a partir de componentes discretos.
El término "puente H" proviene de la típica representación gráfica del circuito
(figura 5.18).

Figura 5.18. Esquema de un puente H.


Un puente H se construye con 4 interruptores (mecánicos o mediante transistores).
Cuando los interruptores S1 y S4 (figura 5.19, izquierda) están cerrados (y S2 y S3
abiertos) se aplica una tensión positiva en el motor, haciéndolo girar en un sentido.
Abriendo los interruptores S1 y S4 (y cerrando S2 y S3), el voltaje se invierte,
permitiendo el giro en sentido inverso del motor (figura 5.19, derecha).

91

Figura 5.19. Estados en el motor por el accionamiento del puente H.

Con la nomenclatura que estamos usando, los interruptores S1 y S2 nunca podrán


estar cerrados al mismo tiempo, porque esto cortocircuitaría la fuente de tensión.
Lo mismo sucede con S3 y S4.

Desarrollo:
En robótica se emplea mucho el control de motores DC para hacer la inversión de
giro. Como sabemos un motor de corriente continua tiene 2 polos: positivo y
negativo. Para lograr la inversión del giro del motor solo tenemos que invertir la
polaridad de la fuente. Una solución con la implementación de un microcontrolador
se muestra en la figura 5.20.

Figura 5.20. Circuito para el control del giro de un motor de DC.


i. Implementar el arreglo presentado en la figura 5.20.
ii. Codifique y actualice de ser necesario el código mostrado a continación

; Programa para inversion de giro de motor DC


#include <p16F84A.inc> ; declaramos el pic que usaremos

; Declaracion de registros a usar


puertob equ 0x06

; Reset 92
org 0x00
Reset goto inicio

; Configuración de puertos
org 0x05
inicio bsf status,5
movlw b'0000001'
movwf trisb
bcf status,5

; Programa principal
Principal btfsc puertob,0
goto izquierda
goto derecha
izquierda bsf puertob,1
bcf puertob,2
goto inicio
derecha bcf puertob,1
bsf puertob,2
goto inicio
end

iii. Realice la simulación y haga las correcciones pertinentes.


iv. Arme el circuito físico y realice las pruebas correspondientes.
v. Realice el reporte de la práctica.
6. Interrupciones en un microcontrolador
En esta unidad el estudiante:
 Programa y aplica las interrupciones en un microcontrolador

6.1. Manejo de interrupciones


Una interrupción es fundamentalmente, un aviso interrumpirá la tarea que se esté haciendo
en ese momento y pasaremos a ejecutar una rutina de servicio o gestión de la interrupción. 93
Es importante familiarizarse con el manejo de interrupciones, ya que nos evita poder
manejar muchos tipos de eventos sin estar pendientes de ello. Existen dos tipos de
interrupciones posibles, una es mediante una acción externa (es decir por la activación de
uno de sus pines), la otra es interna (por ejemplo, cuando ocurre el desbordamiento de uno
de sus registros).
En el PIC 16f84 hay 4 fuentes de interrupciones:
 Por el pin RB0/INT, que regresa al PIC del modo SLEEP (interrupción externa).
 Por los pines RB4 a RB7, configurados como entrada y en caso de que alguno de
ellos cambie de estado (interrupción externa).
 Por desbordamiento del registro TMR0, cuando este registro pasa de 255 a 0 en
decimal ó 0×FF a 0×00 en hexadecimal (interrupción interna).
 Al completar la escritura de la EEPROM de datos (interrupción interna).

6.1.1. Vector de interrupción


El vector de interrupción es el o los registros que almacenan los distintos bits de bandera
(Flags) que indican si debe atenderse un evento que detiene el proceso normal del
programa. Es el registro INTCON el que contiene la mayoría de las distintas banderas de
interrupción, tal como se especifica en la siguiente tabla.

Tabla 12. Bits del registro de interrupciones.


REGISTRO INTCON
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF

Los detalles de cada bit los listamos a continuación.

Tabla 13. Detalles del registro INTCON.


BIT's LóE Reset Descripción
Bit 7: GIE. 1 = Todas las Interrupciones activadas.
L/E 0
Habilitación General. 0 = Todas las Interrupciones desactivadas
Bit 6: EEIE, Int. de Periféricos L/E 0 1 = Activada, 0 = Desactivada
Bit 5: T0IE, Int. del TMR0 L/E 0 1 = Activada, 0 = Desactivada
Bit 4: INTE, Int. Externa L/E 0 1 = Activada, 0 = Desactivada
Bit 3: RBIE, Int. por PORTB L/E 0 1 = Activada,0 = Desactivada
Bit 2: T0IF, Bandera del TMR0. L/E 0 1 = TMR0 desbordado. 0 = No se ha desbordado
Bit 1: INTF. 1 = Ocurrió una interrupción externa.
L/E 0
Bandera - RB0/INT 0 = No ha ocurrido interrupción externa
Bit 0: RBIF. 1 = Al menos un pin cambio de estado.
L/E x
Bandera - RB4:RB7 0 = Ningún pin ha cambiado de estado.
En la tabla anterior, los valores de L o E indican si el bit es de lectura o escritura. Los
valores de Reset son los valores predeterminados de cada Bit después de producirse un
reset o cuando se inicia el micro.
Si bien cada flag cambia o se pone a 1 al producirse una interrupción, es tarea del
programador borrarlo o ponerlo a cero nuevamente, ya que de no hacerlo el micro estará
siempre interrumpido o lo que es lo mismo, creerá que la interrupción se está produciendo
continuamente.

6.1.2. Rutina de Servicio de Interrupción 94


Cuando una interrupción se produce, sea cual fuere la fuente, el micro deja todo y salta a la
dirección 0x04, ésta es la ubicación del vector de interrupción, en aquí donde escribiremos
la rutina que dé servicio a todas las interrupciones, o bien haremos un salto a donde se
encuentre ese trozo de código, el cual se conoce como ISR (Rutina de Servicio de
Interrupción)
El Tiempo de Procesamiento de la ISR debe ser lo más breve posible, para dar lugar a que
se ejecuten las otras interrupciones, ya que puedes haber habilitado más de una de ellas.
Lo más crítico de una interrupción es tener que guardar todos los registros importantes con
sus respectivos valores, para luego restaurarlos, y así el micro pueda continuar con la tarea
que estaba realizando cuando fue interrumpido.
La tarea de guardar todos los registros importantes puede ser más o menos complicada si el
programa que se está realizando es demasiado extenso, o principalmente cuando en la ISR
modificas alguno de los valores de esos registros, en algunos casos no es necesario ya que
por lo general se trata de no modificarlos utilizando registros alternativos.
Una rutina de servicio de interrupción primero debe guardar el contenido del registro W,
sin embargo, el hecho de mover W a otro registro haciendo uso de MOVF corrompe la
bandera Z, modificando el registro de Estado. Según la hoja de datos otorgada por
Microchip, en uno de sus apartados recomienda una secuencia de código que permita
guardar y restaurar los registros sin modificarlos.

Como ejemplo suponga que W=0x0A y ESTADO=0xAF en el momento que ocurre una
interrupción. Entonces, la forma de guardarlos y recuperar estos registros sería la que se
muestra en el siguiente código.

; ======== Inicio - Rutina de Servicio de Interrupción =========


; ========== Guardando W y el Registro de Estado ==========

MOVWF Reg_W ; Guardamos W en Reg_W (Reg_W=0x0A)


SWAPF ESTADO,W ; invertimos los nibbles del registro ESTADO
; y lo pasamos a W (ESTADO=0xAF), (W=0xFA)
MOVWF Reg_S ; Guardamos el contenido de ESTADO (Reg_S=0xFA)
. .
. . ; Atendemos la interrupción
. .

; ======== Fin - Rutina de Servicio de Interrupción ===========


; ======== Restaurando W y el Registro de Estado ===========
SWAPF Reg_S,W ; invertimos los nibbles de Reg_S
; y lo pasamos a W (Reg_S=0xFA), (W=0xAF)
MOVWF ESTADO ; Restauramos ESTADO (ESTADO=0xAF)
SWAPF Reg_W,f ; invertimos los nibbles de Reg_W (Reg_W=0xA0)
SWAPF Reg_W,W ; y lo pasamos a w invirtiéndoles nuevamente
; Ahora W=0x0A
RETFIE

En el código anterior Reg_W y Reg_S son registros alternativos para guardar los valores
del registro W y del registro de estado respectivamente. 95

Algunas aclaraciones pertinentes son:


 La instrucción SWAPF invierte los nibbles del registro, por ejemplo, si el registro
tenia 0xAF luego de SWAPF quedará 0xFA. La ventaja de utilizar la instrucción
SWAPF en lugar de MOVF es que no afecta la bandera Z del registro de ESTADO,
y aunque los nibbles se invierten, al restaurarlos los vuelves a invertir nuevamente
para dejarlos como estaban.
 Si se ha producido una interrupción, obviamente una de las banderas del registro
INTCON cambiará de estado y el micro irá a la dirección 0x04 como si se hubiera
producido un CALL (una llamada) a esa dirección para ejecutar la ISR, por lo tanto,
la pila o STACK se carga una posición más, y el mecanismo de las interrupciones se
deshabilita (es decir GIE=0) para dar lugar a la ISR. Ahora bien, se deben recuperar
los registros importantes, averiguar la fuente de interrupción, atender la
interrupción, luego restaurar aquellos registros importantes, reponer el estado de las
banderas del registro INTCON (aquellas que fueron modificadas por la
interrupción) y regresar, pero no con un RETURN, ya que no se está regresando de
una rutina cualquiera, sino de una interrupción, la cual está deshabilitada, y para
habilitarla nuevamente es recomendable utilizar la instrucción RETFIE. Al usar ésta
instrucción las interrupciones estarán habilitadas nuevamente, es decir GIE=1

6.1.3. Las interrupciones y el registro OPTION


Este es otro de los registros que tienen mucho que ver con las interrupciones, ya que
algunos de sus bits deben ser modificados, según la aplicación que se esté realizando.
Por ejemplo, el pin RB0/INT devuelve al PIC al estado activo desde el modo SLEEP, lo
cual podría hacerse mediante un pulsador. Suponga que el pulsador está al polo positivo
(VCC) y a través de una resistencia a GND (figura 6.1), de tal modo que la interrupción se
produzca al enviar un 1 (presionando el pulsador), aunque también podría hacerse enviando
un 0 (liberando al pulsador). Entonces la pregunta es, ¿la interrupción debe ser sensible al
cambio de nivel, de 0 a 1, o de 1 a 0? Por supuesto estamos ante un caso de lectura de
flancos, lo cual puede configurarse en el bit 6 (INTDEG) del registro OPTION, con un 1
será sensible al flanco ascendente, y en el momento que envíes un 1 por el pulsador se
producirá la interrupción; si se pone ese bit a 0 será sensible al flanco descendente y la
interrupción se producirá cuando libere el pulsador, es decir, cuando se detecte el flanco
descendente.

96

Figura 6.1. Circuito para una interrupción por pulso externo en RBO/INT.

Como ya se vio el registro OPTION tiene los siguientes bits.

Tabla 14. Bits del registro OPTION


REGISTRO OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0

Y la descripción de cada bit.

Tabla 15. Descripción de bits del registro OPTION


Bit LóE Reset Descripción
Bit 7: RBPU L/E 1 1 = Cargas Pull-Up Desconectadas
Pull-up p' PORTB 0 = Cargas Pull-Up Conectadas
Bit 6: INTEDG L/E 1 1 = RB0/INT será sensible a flanco ascendente
Flanco/Interrup. 0 = RB0/INT será sensible a flanco descendente
Bit 5: T0CS L/E 1 1 = Pulsos por el pin RA4/T0CKI (contador)
Fte./Reloj TMR0 0 = Pulsos igual Fosc/4 (temporizador)
Bit 4: T0SE L/E 1 1 = Incremento TMR0 en flanco descendente
Flanco/T0CKI 0 = Incremento en flanco ascendente
Bit 3: PSA L/E 1 1 = Divisor asignado al WDT
Divisor/Frecuencia 0 = Divisor asignado al TMR0
En la tabla anterior se han omitido los bits que van del 0 al 1 (PS2, PS1, PS0) que se usan
para configura el pre-escalador de frecuencias del temporizador.

6.2. Ejemplo de una interrupción externa


Realizaremos un ejercicio donde usaremos el circuito de la figura 6.1 para provocar que
una vez se alimente al microcontrolador éste entre en su modo pasivo (SLEEP). Luego se
provocará que pase a su modo activo momentáneamente (la interrupción) mediante un
pulsador que al ser soltado encenderá un led para volver a su modo pasivo. Si se vuelve a
accionar el pulsador, vuelve a su estado activo momentáneo después de soltarlo y apagará 97
el led. El proceso se repite de manera sucesiva.

Ejercicio 6.1. Implementación básica de un servicio de interrupción de pulsos externos.


Objetivo:
 Implementar un servicio de interrupción externa.

Materiales y Equipo:
 Computadora personal.
 Software Microchip MPLAB.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F84A.
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
Fundamentalmente estudiamos y ponemos en práctica la configuración del
microcontrolador para aceptar y controlar las interrupciones externas durante la
ejecución de un programa. En particular se busca configurar la lectura de flancos
descendentes por el pin RB0. Así que se trabajaremos con el registro OPTION y el
INTCON.

Desarrollo
Los pasos a seguir son:
i. Implementar en Proteus ISIS el circuito de la figura 6.1.
ii. Generar el código mostrado a continuación ya sea en MPLABX o en el
editor ASM de Proteus VSM. Corregir lo necesario y generar el
hexadecimal correspondiente.

;---------------------------------------------------
; Programa ejemplo de interrupciones externas
;---------------------------------------------------
#include p16f84a.inc

;---------------- PUERTOS ------------------------ 98


OPT_REG equ 0x081
;---------------- VECTOR DE RESET ------------------
org 0x00
RESET goto INICIO

;--------- VECTOR DE INTERRUPCIÓN ------------------


org 0x04
INTRP goto ISR

;--------- CONFIGURACIÓN DE PUERTOS ----------------


org 0x05
INICIO bsf STATUS,RP0 ; configurando puertos
movlw 0x01 ; carga w con 0000 0001
movwf TRISB ; RB0/INT es entrada
bcf OPT_REG,6 ; seleccionamos flanco descendente
bcf STATUS,RP0

;-------Habilitación de interrupciones-------
bsf INTCON,GIE ; habilitamos todas las interrupciones
bsf INTCON,INTE ; que sean interrupciones externas
clrf PORTB ; limpia el puerto B
DORMIR sleep
goto DORMIR ; modo pasivo

;-------------Rutina de servicio de interrupciones-------------


ISR btfsc PORTB,0 ; verificamos que se suelte el pulsador
goto ISR

btfsc PORTB,1 ; si el led está a 1


goto off_led ; ir a off_led para apagarlo
bsf PORTB,1 ; si no, enciende el LED
bcf INTCON,INTF ; se borra bandera de interrupción
retfie

off_led bcf PORTB,1 ; se apaga el LED


bcf INTCON,INTF ; se borra bandera de interrupción
retfie
;----------------------------------------------------------------
end
;----------------------------------------------------------------

iii. Arme el circuito físico y realice las pruebas correspondientes.


iv. Realice el reporte de la práctica.
6.3. Ejemplo de una interrupción por temporización
Ahora mostramos la manera de implementar una interrupción por sobrecarga del
temporizador TMR0. Para provocar el sobrecupo del valor accionaremos un pulsador en el
pin RA4/T0CKI.

Ejercicio 6.2. Interrupción del timer interno.


Objetivo:
 Verificar la configuración de interrupciones en el timer TMR0 del 16F84A.
99
Material y equipo:
 Computadora personal.
 Software Microchip MPLAB.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F84A.
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
En la siguiente práctica se muestra el funcionamiento de la interrupción del Timer
interno. Dicha interrupción se presenta cuando se sobrepasa el limite del valor
máximo que se puede contener en el registro TMR0.
Observe el proceso que se sigue para implementar las interrupciones del Timer para
que cumpla los objetivos solicitados.
Pasos:
I. Configurar el hardware del contador. Se configurará el registro
OPTION_REG y en concreto los bits siguientes:
 El bit 4, llamado TOSE, nos da la elección de elegir el tipo de flanco:
ascendente o descendente. Un 1= flanco descendente y un 0= flanco
ascendente.
 El bit 5, llamado TOCS, nos da la opción de elegir el tipo de reloj: un 1
significan pulsos introducidos por el pin nº 3 (T0KI) y un 0 significan
pulsos de reloj interno de frecuencia a un cuarto de la frecuencia del
cristal usado. En este caso será pulso exterior.
II. Configurar el software: Se configura el registro INTCON.
o El bit 7 (GIE) se pone a 1 para habilitar el permiso general de
interrupciones.
o El bit 5 (T0IE) se carga con 1 para habilitar el permiso particular de
la interrupción por desbordamiento del contador.
¿Cómo se sabe si se ha producido una interrupción debido al desbordamiento del
contador?
Dicha interrupción tiene asociada una bandera o flag, el bit 2 (T0IF) del registro
INTCON. Esta bandera hay que borrarla por software para liberar el desborde. 100

Desarrollo:
i. Realice el siguiente circuito en Proteus ISIS.

Figura 6.2. Circuito para el ejercicio 6.2.

ii. Capture, compile y corrija el siguiente código para obtener el hexadecimal. Simule
en Proteus ISIS. Observe que se usa el PIC16F877A

#include p16f877a.inc ; Include register definition file

;====================================================================
;ASIGNANDO REGISTROS
;------------------------------
TEMPINT equ 0x01 ;TEMPINT=TMR0 Registro Temporizador interno
ESTADO equ 0x03
OPCION equ 0x81 ;OPCION=OPTION Registro de config de estado
CONFIGDIGA equ 0x9F
PUERTOB equ 0x06
CONFIGPTOB equ 0x86
INTCONFIG equ 0x0B ;INTCONFIG=INTCON
;------------------------------
;RESET
;------------------------------
org 0x00
RESET goto INICIO
;------------------------------
;INTERRUPCION (CONTROL DE)
101
;------------------------------
org 0x04
goto ISR
;------------------------------
;INICIO
;------------------------------
org 0x05
INICIO
;-----------------------------------------------------
;CONFIGURACIÓN DE PUERTOS
;-----------------------------------------------------
movlw 0x07
movwf CMCON
clrf ESTADO
bsf ESTADO,5
movlw 0x00
movwf CONFIGPTOB
bcf ESTADO,5
;------------------------------------------------------
;Configurar el contador TMR0
;------------------------------------------------------
;TMR0 = contador de flanco descendente cargado con el dato ffh.
;Registro OPTION_REG
;Contador= bit5=T0CS= 1= pulsos exteriores.
;Flanco Descendente= bit4=T0SE= 1
movlw 0xFF
movwf TEMPINT
clrf PUERTOB
bsf ESTADO,5
bsf OPCION,4 ;Se configura lectura flanco de bajada
bsf OPCION,5 ;Se configura lectura por pin T0CKI
;---------------------------------------------
;Preparar interrupciones.
;---------------------------------------------
bcf INTCONFIG,2
bsf INTCONFIG,5 ;Habilitar interrupción por desborde del TMR0.
bsf INTCONFIG,7 ;Habilitar interrupción global
;Espera hasta rebosar el TMR0.
ESPERA btfss INTCONFIG,2 ;salta si es 1. Al dar el flanco
;el contador se desborda al
;pasar de ffh a 00h. La bandera
;se pone a 1 y salto a la interrup-
;ción y luego al programa principal.
;El puerto B se encenderá y apagará
;en un bucle indefinido.
goto ESPERA
bcf ESTADO,5
;-----------------------------------
;PROGRAMA PRINCIPAL
;-----------------------------------
PRINC clrf PUERTOB ;apaga el puerto B
call RETARDO
movlw 0xFF ;enciende el puerto B
movwf PUERTOB
call RETARDO
102
goto PRINC
;-------------------------------------------
;INTERRUPCION DEL TMR0
;-------------------------------------------
ISR bcf INTCONFIG,2 ;Poner a cero el flag
retfie ;retorno subrutina de interrupción
;------------------------------------------------------------------
;Retardos: Explicación de tiempos
;------------------------------------------------------------------
;c1h=193 goto=2 useg. decfsz=1 useg.( salta si es 0 ), 1005723 useg.
RETARDO movlw 0xC1
movwf 0x20
movwf 0x21
movlw 0x01
movwf 0x22
salto1
decfsz 0x20,1
goto salto1
decfsz 0x21,1
goto salto1
decfsz 0x22,1
goto salto1
retlw 0x00
;-----------------------------------------------------
end

iii. Con asesoría de su docente realice la adaptación del código para el 16F84A, a
continuación, implemente físicamente el circuito y realice las pruebas pertinentes.
iv. Realice el reporte correspondiente.
7. Programación del microcontrolador con aplicaciones
En esta unidad el estudiante:
 Resuelve problemas mediante la programación en alto nivel de microcontroladores.
 Conecta y controla motores con microcontroladores.

7.1. Programación de microcontroladores en PIC C Compiler


PIC C Compiler es uno de tantos entornos de programación basados en el estándar del 103
lenguaje C producido por Custom Computer Services, Inc. Se ha optimizado con la
incorporación de funciones agrupadas en bibliotecas que facilitan el acceso a los registros
del PIC.
El compilador CCS C que acompaña a este software es propietario por lo que requiere
licencia para su uso, sin embargo, una versión de prueba, con sus consecuentes limitantes,
se puede descargar de la dirección:
http://www.ccsinfo.com/ccsfreedemo.php

Hablar de las distintas técnicas de programación aplicables a este software saldría de los
fines que persigue este texto, por lo que remitimos al estudiante a documentarse con la
variada información existente en libros y en internet sobre este tópico.
En cambio, dado que el estudiante ha tenido un curso de Programación Básica,
fundamentada precisamente en el lenguaje C, creemos factible proponer una serie de
ejemplos que ilustrarán a grandes rasgos la manera de usar el código.

7.2. Encendido de un LED con CCS


Reproducimos a continuación una versión en CCS del ejercicio 4.1. Se irá comentando
dentro del código las acciones realizadas con cada sentencia esperando que su docente haga
los comentarios pertinentes para buscar la equivalencia entre el Ensamblador y este
lenguaje C orientado a microcontroladores.

Ejercicio 7.1. Nociones básicas de programación CCS C.


Objetivo:
 Relacionar la programación en Ensamblador con el lenguaje CCS C.

Material y equipo:
 Computadora personal.
 Software IDE PIC C Compiler.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F84A.
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.
104
Introducción
Repetiremos el ejercicio 4.1 para verificar la eficiencia de la codificación en CCS C
y encontrar los puntos de equivalencia con el Ensamblador. Será importante tomar
nota de los aspectos más relevantes y de hacer las preguntas que se crean
pertinentes a su docente.
El proceso que seguiremos será en primer lugar generar el código en PIC C
Compiler. Luego obtendremos los archivos *.hex y *.cof , que serán utilizados en el
simulador de Proteus, sobretodo el segundo que permite hacer depuración del
código.

Desarrollo:
i. En primer lugar, con la guía de su docente conocerá el entorno gráfico
ofrecido por el software.
ii. A continuación, deberá capturar el código mostrado a continuación. Se
aconseja que el estudiante agregue comentarios sobre el código para su
posterior estudio.
105

iii. Compile y obtenga los archivos hex y cof. Luego vuelva a rehacer en
Proteus ISIS el circuito de la figura 4.10 y cargue el archivo cof. Rehalice la
simulación.
iv. Compruebe físicamente su archivo hex y realice las pruebas pertinentes.
v. Realice el reporte correspondiente.

7.3. Interrupción del TIMER0 en CCS


Repetimos el ejercicio 6.2 considerando de nuevo PIC16F877A. Con la guía de su docente
conocerá algunas de las utilidades que facilitan la escritura de código.

Ejercicio 7.2. Configurando interrupciones en TMR0 por pulsos externos.


Objetivo:
 Verificar el manejo de interrupciones en CCS C.

Materiales y equipo:
 Computadora personal.
 Software IDE PIC C Compiler.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F84A.
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 4 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.
Introducción
De nuevo provocaremos en el PIC un desborde en el registro TMR0 para provocar
una interrupción. Tendremos ligeras modificaciones sobre el circuito que se ilustran
en la figura 7.1. Se ha incluido en vez de un pulsador un inyector de secuencias para
simular los pulsos externos. Un osciloscopio permite verificar el tiempo con el que
oscila entre encendido y apagado el LED.

106

Figura 7.1. Circuito para el ejercicio 7.2.

Desarrollo:
i. Realice el diseño de circuito en Proteus.
ii. Capture el código en PIC C Compiler. Aunque ofrecemos el código al
completo, advertimos al estudiante que es importante que prepare el código
con asesoría de su docente, quien debe hacer diversas consideraciones sobre
la manera de implementar recursos del software que facilitarán la tarea de
programar.

#include <16F877A.h>
#fuses XT,NOWDT
#use delay(clock=4000000)

#bit RB7=0X6.7 //RB7 es asignado al pint 7 del puerto B


#int_TIMER0 //Se incluye función de timer0

void TIMER0_isr(void) //Función de interrupción para el timer0


{
if (RB7==0)
{
RB7=1;
set_TIMER0(0X9C); //Inicializa timer0
}
else
{
RB7=0;
set_TIMER0(0X9C); //Inicializa timer0
}
} 107
void main()
{
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

set_tris_b(0b01111111); //RB7 como salida, el resto entrada


RB7=0;

set_TIMER0(0X9C); //Se inicializa el timer0


//Se crea un ciclo infinito para que el micro no entre en modo sleep
//lo cual desactivaría la interrupción del timer0
while(true);
}

iii. Realice la compilación y la depuración en Proteus ISIS.


iv. Como ejercicio realice la adaptación del código para el PIC16F84A e
implemente físicamente el circuito. Realice las pruebas correspondientes
v. Realice el reporte correspondiente.

7.4. Control de un LCD 16×2


El LCD (Liquid Crystal Display) o pantalla de cristal líquido es un dispositivo empleado
para la visualización de contenidos, mediante carácteres, símbolos o pequeños dibujos
dependiendo del modelo (AprendiendoElectrónica, 2016).

Figura 7.2. Pantalla de cristal líquido 16×2


En este caso vamos a emplear un LCD de 16x2, esto quiere decir que dispone de 2 filas de
16 caracteres cada una. Los píxeles de cada símbolo o carácter, varían en función de cada
modelo.
La estructura de terminales se muestra en la figura 7.3 con ayuda del software Proteus.

108

Figura 7.3. Terminales en una pantalla de cristal líquido LM016L

Los pines de alimentación:


 Vss: Gnd.
 Vdd: +5 voltios.
 Vee: corresponde al pin de contraste, lo regularemos con un potenciómetro de
10KΩ.
Pines de control:
 RS: Corresponde al pin de selección de registro de control de datos (0) o registro de
datos (1). Es decir, el pin RS funciona paralelamente a los pines del bus de datos.
Cuando RS es 0 el dato presente en el bus pertenece a un registro de
control/instrucción. y cuando RS es 1 el dato presente en el bus de datos pertenece a
un registro de datos o un carácter.
 RW: Corresponde al pin de Escritura (0) o de Lectura (1). Nos permite escribir un
dato en la pantalla o leer un dato desde la pantalla.
 E: Corresponde al pin Enable o de habilitación. Si E (0) esto quiere decir que el
LCD no está activado para recibir datos, pero si E (1) se encuentra activo y
podemos escribir o leer desde el LCD.

Pines de Bus de datos: El Bus de datos bidireccional comprende desde los pines D0 a D7.
Para realizar la comunicación con el LCD podemos hacerlo utilizando los 8 bits del bus de
datos (D0 a D7) o empleando los 4 bits más significativos del bus de datos (D4 a D7).
Tabla 16. Especificación de terminales del LCD
Pin Símbolo Descripción
1 VSS Voltaje de masa
2 VDD Alimentación CD +5 Volts
3 VO Ajuste del contraste: 0 a 5 Volts
4 RS Control de datos. RS=0 direcciona Control, RS=1 direcciona Datos
5 R/W Lectura/Escritura en LCD: R/W=0 escritura; R/W=1 lectura.
6 E Habilitación
7 D0
8 D1 109
9 D2 Bus de datos para el LCD.
10 D3 Aquí:
11 D4 D0 es el bit menos significativo.
12 D5 D1 es el bit más significativo.
13 D6
14 D7
15 A Alimentación de backlight (+3.5 a +5 Volts, según fabricante)
16 K Masa del backligth

Ejercicio 7.3. Control de un LCD 16×2 con CCS C.


Objetivo:
 Verificar el control de una pantalla de cristal líquido por CCS C, resaltando las
facilidades que ofrece el trabajar en un lenguaje de alto nivel.
 Manejar bibliotecas de CCS C.

Materiales y equipo:
 Computadora personal.
 Software IDE PIC C Compiler.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F877A.
 Pantalla de cristal líquido compatible con el modelo LM016L
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 20 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
El lenguaje CCS C incluye una librería para controlar el funcionamiento de una
pantalla de cristal líquido denominada lcd.c.
Ésta librería viene predefinida para conectar el LCD a través del puerto D y E de un
microcontrolador que incluyan dichos puertos (en nuestro caso el 16F877A). Esto
se realiza en el código de la misma como:

#define LCD_ENABLE_PIN PIN_E0


#define LCD_RS_PIN PIN_E1
#define LCD_RW_PIN PIN_E2
#define LCD_DATA4 PIN_D4
110
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

Sin embargo, se puede hacer que se redirijan éstas señales hacia otros puertos, por
ejemplo, para el puerto D:

#define LCD_ENABLE_PIN PIN_D0


#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

O bien se puede abreviar redirigiendo aquellas terminales que sean necesarias:

#define LCD_DATA_PORT getenv("SFR:PORTD")


#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2

Las funciones implementadas en la librería son:


lcd_init() Inicializa el LCD
lcd_gotoxy(x,y) Establece la posición de escritura en el LCD.
lcd_putc(char s) Muestra un dato en la siguiente posición del LCD. Incluye
algunas secuencias de escape:
\f Limpia el lcd
\n Posiciona al inicio de la segunda línea.
\b El cursor retrocede una posición.
lcd_getc(x,y) Lee el carácter de la posición (x,y).
printf(lcd_putc, cadena, variable) Imprime una cadena de caracteres y/o variables en la posición
indicada por lcd_putc.
Se puede asignar un formato específico a la cadena o variable
agregando:
%nt
Donde:
% implica la asignación de formato
n es opcional y puede ser: 1-9 para especificar la cantidad
de caracteres; 01-09 para indicar la cantidad de ceros a la
izquierda; 1.1-9.9 para indicar coma flotante.
t puede indicar:
c carácter
s cadena o carácter
u entero sin signo
d entero con signo
Lu entero largo sin signo
Ld entero largo con signo
X|x entero hexadecimal (mayusc|minusc)
Lx|LX entero largo hexadecimal (mayusc|minusc)
111
f flotante con truncamiento
g flotante redondeado
e flotante en formato exponencial
w entero sin signo con decimales insertados.
La 1ª cifra indica el total, la 2ª el número de
decimales.

Ejemplo:
printf(lcd_putc,"\n %2.2f la temperatura es: ",temp); //temp es una variable

Desarrollo:
i. Realizar en Proteus el circuito de la figura 7.4.

Figura 7.4. Circuito para el ejercicio 7.3.

ii. Con la asesoría de su docente capture, compile y simule el código que se presenta a
continuación. Realizar las correcciones pertinentes.
#include <16f877a.h>
#fuses hs,nowdt
#use delay(clock=20M)

#define lcd_rs_pin pin_b0


#define lcd_rw_pin pin_b1
#define lcd_enable_pin pin_b2
#define lcd_data4 pin_b4
#define lcd_data5 pin_b5 112
#define lcd_data6 pin_b6
#define lcd_data7 pin_b7
#include <lcd.c>

void main()
{
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
printf(lcd_putc," HOLA ITSZ ");
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc," BIENVENIDOS ");
delay_ms(1000);
lcd_gotoxy(1,1);
}
}

iii. Realice la implementación física del ejercicio.


iv. Realice su reporte correspondiente.

7.5. Ejercicios sumativos


Sugerimos al estudiante realizar sin ayuda del docente, y a manera de evaluación:

Ejercicio 7.4. Considere la realización en CCS C del ejercicio 6.1. Deberá documentarse y
plantear la solución. Demuestre el cumplimiento de la actividad entregando:
 Circuito físico funcionando.
 Reporte incluyendo:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado de
material utilizado en la implementación física; evidencias de la operación
óptima de la implementación física (fotografías).
o Conclusiones.
Ejercicio 7.5. Repita el ejercicio 5.4 con lenguaje CCS C. Entregar:
 Circuito físico funcionando.
 Reporte incluyendo:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado de
material utilizado en la implementación física; evidencias de la operación
óptima de la implementación física (fotografías). 113
o Conclusiones
8. Convertidores ADC y DAC
En esta unidad el estudiante:
 Utiliza el convertidor ADC para fines de control.

8.1. Conceptos básicos de la conversión Analógico-Digital


Como recordará de su curso de electrónica digital, el conversor analógico-digital es un
dispositivo que recibe una señal de entrada Vent y la transforma en una palabra digital Pd con 114
una precisión y resolución dadas mediante una comparación con una tensión de referencia
Vreq.
En un convertidor A/D ideal la palabra digital está relacionada con la señal de entrada por
la expresión.

  i  J  0,1
Vent Ji
Pd 
Vref i 1 2

Este cociente se realiza en binario. El resultado exacto sería un número infinito de bits, por
lo que se comete un error de cuantificación al tomar solamente una cantidad finita de ellos.
Si llamamos n a la cantidad real de bits, del conversor se tendrá 2n niveles posibles y el
error máximo cometido es de la mitad de la distancia entre dos niveles, o sea:

𝑉𝑘 𝑁 1 𝑉𝑟𝑒𝑓
= 𝐾, o bien, 𝐸𝑚á𝑥 = 2
𝑉𝑟𝑒𝑓 2𝑛

Los conversores A/D, admiten señales analógicas de entrada, pudiendo ser de corriente o
tensión, de una única polaridad o bipolar.
El proceso de conversión digital-analógica, (D/A) es el proceso de tener el valor expresado
en código binario (digital), y convertirlo en un voltaje o corriente equivalente. La
transformación se realiza mediante una correspondencia entre las 2n combinaciones binarias
posibles a la entrada y las 2n valores de tensión (o corriente) obtenidas a partir de una
tensión de referencia (Vref)
El proceso consiste en hacer una ponderación de cada bit y sumar el resultado de todas las
ponderaciones multiplicadas por el valor del bit correspondiente

𝑉𝑠𝑎𝑙 = ∑ 𝑉𝑝𝑜𝑛𝑑 𝛿𝑛 , donde 𝛿𝑛 = {0 , 1}

Las señales digitales, b0, b1, b2, …, derivan generalmente del registro de salida de un
sistema digital.
La resolución de una conversión D/A se define como la menor variación que puede ocurrir
en la salida analógica menor resultado de un cambio en la entrada digital, lo cual se puede
cuantificar en corriente o voltaje, sin embargo, es más útil medirlo en porcentaje:
1 𝛥𝑉
𝑅[%] = 100 𝑛

2 𝑉𝑟𝑒𝑓
Por supuesto, la resolución porcentual se hace menor cuando el número de bits de entrada
se incrementa.
En un microcontrolador es posible encontrar modelos que incorporan la conversión
analógico-digital en su arquitectura, mientras que la conversión digital-analógica requeriría
de dispositivos externos que realizaran la interpretación de las palabras digitales que el
microcontrolador puede entregar por sus puertos. Nosotros ilustraremos con una práctica
básica como realizar una conversión analógica-digital utilizando lenguaje de alto nivel. 115
Dejamos al estudiante el investigar la incorporación de un microcontrolador en un sistema
de decodificación digital-analógica.

8.2. Características técnicas del conversor AD del 16F877A


El PIC16F877A incluye en su puerto A (figura 8.1) un conversor analógico digital por
aproximaciones sucesivas de 10 bits de resolución y de 8 canales.

Figura 8.1. Terminales del ADC interno en un 16F877A

Un convertidor por aproximaciones sucesivas se basa en la realización de comparaciones


sucesivas de forma ascendente o descendente hasta encontrar un valor digital que iguale la
tensión entregada por el conversor D/A y la tensión de entrada.
Al decir que tenemos una resolución de 10 bits estamos diciendo que tenemos 210=1024
pasos de aproximación en el intervalo de valores analógicos a convertir. Por ejemplo, para
un espacio de voltajes de 0 a 5 V analógicos tenemos que
5𝑉
𝑅𝑒𝑠𝑜𝑙𝑢𝑐𝑖ó𝑛 = 2𝑛−1 = 4.89𝑚𝑉.
Al decir que tenemos 8 canales decimos conectar 8 señales de voltaje análogas.
Posee una tensión de referencia configurable (pines RA2=Vref-, voltaje de referencia
inferior; RA3=Vref+, voltaje de referencia superior):
 Absoluto, de 0 a Vref+. 116
 En un intervalo cualquiera, por ejemplo, con Vref- negativo a Vref+ positivo.
Otras características a tomar en cuenta son:
 Tad, tiempo de conversión que demora el ADC en realizar la conversión.
 Error de conversión, bits erróneos generados por una mala conversión, la cual se
origina por una alta velocidad o una mala configuración del módulo.

8.3. Configuración básica del ADC del 16F877A


Por su arquitectura ADC del 16F877A está asociado con los registros:
 Para la configuración de puertos: TRISA, TRISE, PORTA, PORTE.
 Para el manejo de interrupciones: INTCON, PIE1, PIR1.
 Para el control: ADCON0, ADCON1, ADRESH, ADRESL.
Por las limitaciones en la longitud del presente texto y con la experiencia adquirida a lo
largo de este curso, remitimos al estudiante la revisión de las hojas de datos del
microcontrolador para verificar los usos que tienen los registros desconocidos en el listado
anterior.
Una de las primeras tareas de configuración al utilizar el módulo ADC
(AprendiendoElectrónica, 2016) es establecer el elegir una fuente de reloj adecuada en
ADCON0 para obtener un tiempo de conversión óptima, lo cual se puede consultar en la
figura 8.2.

Figura 8.2. Selección de fuentes de reloj.

En la figura 8.2:
(1) El reloj RC tiene un valor tipico de Tad = 4us
(2) Estos valores violan el mínimo tiempo requerido (1.6us) de Tad
(3) Para conversiones más rápidas se recomienda otro tipo de reloj
(4) Cuando se usa osciladores mayores de 1MHz, el modo RC es recomendable
cuando se está en el modo SLEEP
La figura 8.3 presenta un esquema de configuración para los canales, lo cual se realiza en el
registro ADCON1.

117

Figura 8.3. Configuración de canales para el ADC del 16F877A,

8.4. Aplicación básica del módulo ADC


Presentamos una aplicación práctica del uso del módulo ADC del PIC consistente en leer
un intervalo de voltajes de 0 a VDD. Este circuito básico puede sin embargo servir de base
para acoplar algún tipo de sensor analógico al sistema y darle una aplicación más
específica.

Ejercicio 8.1. Lectura de voltaje continuo a través de un módulo ADC de


microncontrolador.
Objetivo:
 Implementar la lectura analógica en el módulo ADC del PIC16F877A.

Material y Equipo:
 Computadora personal.
 Software IDE PIC C Compiler.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F877A.
 Pantalla de cristal líquido compatible con el modelo LM016L
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Potenciómetro de 5 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 20 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro. 118
 Protoboard.

Introducción
Para manipular el módulo analógico digital en CCS C tenemos las siguientes
instrucciones.
 Para configurar el puerto: setup_adc_ports(valor)

Figura 8.4. Esquema de configuración para el puerto con módulo ADC

 Para seleccionar modo de fuente de reloj: setup_adc(modo)


Figura 8.5. Modos de selección de reloj.
119
 Para la especificación del canal: set_adc_channel(canal)

Figura 8.6. Selección de canal del módulo ADC

 Para la lectura del valor y su almacenamiento mediante una variable entera que
depende de la directiva “#DEVICE ADC=” empleada: valor=read_adc().

Desarrollo:
i. Considere el mismo circuito de la figura 7.4.
ii. Con asesoría de su docente compile y simule el siguiente código.

#include <16f877a.h>
#device adc=10
#fuses hs,nowdt
#use delay(clock=20M)
#define lcd_data_port getenv("sfr:portb")
#define lcd_rs_pin pin_b0
#define lcd_rw_pin pin_b1
#define lcd_enable_pin pin_b2
#include <lcd.c>

void main()
{
int16 q;
float p;
setup_adc_ports(an0);
setup_adc(adc_clock_internal);
lcd_init();
while(true)
{
set_adc_channel(0);
delay_us(20);
lcd_gotoxy(1,1);
q=read_adc();
p=(5.0*q)/1024.0;
printf(lcd_putc," ADC = %4Ld",q);
printf(lcd_putc,"\n voltaje = %1.2f",p);
}
}

iii. Realice la implementación física del circuito y a continuación verifique su


funcionamiento.
iv. Realice el reporte correspondiente.
120

8.5. Proyecto: Circuito automático de refresco de temperatura


Proponemos como evaluación de ésta unidad la siguiente actividad.

Ejercicio 8.2. Suponga un dispositivo que tiende a elevar su temperatura (como el


microprocesador de una computadora), pero que para un funcionamiento óptimo requiere
trabajar por debajo de una temperatura de referencia por lo que se requiere un sistema de
enfriamiento a base de un ventilador simple. Utilice el arreglo del ejercicio 8.1 y en base a
una investigación documental sobre sensores de temperatura implemente una solución del
problema usando el microcontrolador 16F877A.
Demuestre el cumplimiento de la actividad entregando:
 Circuito físico funcionando.
 Reporte incluyendo:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado de
material utilizado en la implementación física; evidencias de la operación
óptima de la implementación física (fotografías).
o Conclusiones.
9. Puertos seriales
En esta unidad el estudiante:
 Comunica dispositivos usando puertos seriales.

9.1. Comunicación serial en un PIC


La figura 9.1 ilustra los dos maneras que manejan los microcontroladores para comunicarse
de forma serial (AprendiendoElectrónica, 2016). 121

Figura 9.1. Comunicación serial en un PIC.

Enfocaremos nuestro estudio en el protocolo USART.

9.2. Protocolo USART


Una visión breve de lo que es este protocolo es que recibe y envía datos en formato serie
usando:

Transmisión Síncrona: Los datos se transfieren de forma continua, no existe límite de


tamaño (figura 9.2).

Figura 9.2. Transmisión síncrona.


Características:
o Modo semi-duplex
o La comunicación serie se transmite en una sola línea, en ambos sentidos.
o No se pueden enviar información en ambos sentidos de forma simultánea
o La transmisión puede ser maestro o esclavo

Transmisión Asíncrona. En este modo se emplean relojes tanto en el emisor como el


receptor.
122

Figura 9.3. Transmisión asíncrona.

Características:
o La frecuencia del reloj se acuerda antes de la transmisión
o La sincronización se realiza durante la transmisión
o Transmisión es full-duplex (se utilizan dos lineas, una de transmisión (Tx) y otra de
recepción (Rx).
o Cada trama de datos tiene un tamaño fijo y posee un bit de arranque(inicio) y un bit
de parada(final).

Al ser un protocolo de comunicación la información disponible es bastante más amplia, por


lo que sugerimos al estudiante interesado a buscar documentación más amplia.

9.3. USART en CCS C


Ofrecemos una visión general de las funciones CCS C para el manejo de módulos USART
 Para configurar las características del módulo USART: #USE RS232(opciones)

Figura 9.4. Configuración del módulo USART:

Ejemplo:
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,bits=8)
 Para la transmisión de datos:
o putc(data) y putchar(data), data es un carácter de 8 bits.
o puts(string), string es una cadena de caracteres constante o una matriz de
caracteres terminada con un cero.
o printf(fname,cstring,values); name, función a utilizar para escribir la
cadena indicada, por defecto se utiliza putc(); cstring, cadena de caracteres
o matriz de caracteres terminada en 0; values, valores a indicar en la cadena,
se debe indicar %nt.
 Para la recepción de datos: 123
o value=getc(); value=getch(); value=getchar(); value es un carácter de 8
bits. Espera recibir un carácter por la línea RS232 y devuelve su valor.
o valor=kbhit(); valor=0 (false) si getc() debe esperar a que llegue un
carácter; valor=1 (true) si ya hay un carácter para ser leído por getc().

9.4. Ejemplo de comunicación USART en un PIC16F877A


Mostramos un sencillo ejemplo de la comunicación serial mediante dos microcontroladores
16F877A. Un microcontrolador será el emisor de datos implementado mediante
interruptores manuales. Un segundo microcontrolador recibe los datos y enciende un led en
función del pulsador en el transmisor.

Ejercicio 9.1. Implementación de la comunicación serial en PIC16F877A y lenguaje CCS


C.
Objetivo:
 Comprender la programación de un microcontrolador como emisor de datos en
protocolo USART.
 Comprender la programación de un microcontrolador como receptor de datos en
protocolo USART.
 Verificar la comunicación serial.

Material y Equipo:
 Computadora personal.
 Software IDE PIC C Compiler.
 Software Proteus.
 Tarjeta grabadora de PICs.
 Software de grabación de PIC.
 Microcontrolador PIC16F877A.
 Pantalla de cristal líquido compatible con el modelo LM016L
 Resistencias de 330 Ω, 1 kΩ, 10 kΩ.
 Potenciómetro de 5 kΩ.
 Push button.
 Capacitores de 22 pF.
 Cristal de 20 MHz.
 Cable UTP y caimanes.
 Fuente de voltaje.
 Multímetro.
 Protoboard.

Introducción
En base a la teoría vista en la sección 9.3 y al objetivo de éste ejercicio proponemos
124
un arreglo como el mostrado en la figura 9.5.

Figura 9.5. Circuito para el ejercicio 9.1.

Dado que la meta es lograr la comunicación entre dos microcontroladores debemos


crear dos códigos, uno para el emisor y otra para el receptor. Dos proyectos
distintos en PIC C Compiler.

Desarrollo
i. Realice el circuito de la figura 9.5 en Proteus.
ii. Con asesoría de su docente capture, compile y depure los códigos correspondientes
a emisor y receptor de datos según se muestra a continuación.

//Código de Transmisor=Tx 125


#include <16f877a.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=20M)
#USE RS232(baud=9600,xmit=pin_c6,bits=8,parity=N)
#use standard_io(c)

void main()
{
set_tris_b(0b11111111);
while(true)
{
if(input(pin_b0)==0)
{
putc('1');
while(input(pin_b0)==0);
}
if(input(pin_b1)==0)
{
putc('2');
while(input(pin_b1)==0);
}
if(input(pin_b2)==0)
{
putc('3');
while(input(pin_b2)==0);
}
if(input(pin_b3)==0)
{
putc('4');
while(input(pin_b3)==0);
}
}
}
//Código de Receptor=Rx.c
#include <16f877a.h>
#fuses hs,nowdt,noprotect,noput
#use delay (clock=20M)
#USE RS232(baud=9600,rcv=pin_c7,bits=8,parity=N)
#use standard_io(c)
void main()
{
char valor;
set_tris_b(0b00000000);
output_b(0b00000000);
while(true)
{
valor=getc();
switch(valor) 126
{
case '1': output_toggle(pin_b0);break;
case '2': output_toggle(pin_b1);break;
case '3': output_toggle(pin_b2);break;
case '4': output_toggle(pin_b3);break;
}
}
}

iii. Implemente el arreglo físico. Considere realizar una investigación documental que
garantice la comunicación óptima de los dispositivos.
iv. Realice su reporte correspondiente.

9.5. Proyecto: Circuito de refresco a distancia y LCD


Proponemos como evaluación de ésta unidad la siguiente actividad.
Ejercicio 9.2. Suponga que en el ejercicio 8.2 el dispositivo sensor de temperatura se
encuentra en un sitio remoto (por ejemplo, en un invernadero) y que el sistema que
controla la refrigeración se encuentra en una habitación. De tal forma que el sistema en el
invernadero sólo envía la información de temperatura y que el sistema en la habitación
recibe esa información en formato binario por protocolo serial, y que en función de ella es
la que visualiza en una pantalla LCD el valor de esa temperatura y activa al dispositivo de
refresco. Diseñe una solución para el problema.
Demuestre el cumplimiento de la actividad entregando:
• Circuito físico funcionando.
• Reporte incluyendo:
o Hoja de presentación.
o Introducción.
o Planteamiento del problema.
o Desarrollo de la solución, contiendo: sustento documental; listado de material
utilizado en la implementación física; evidencias de la operación óptima de la
implementación física (fotografías).
o Conclusiones.
Bibliografía
 Morris Mano, M. Lógica Digital y Diseňo De Computadores. Ed. Prentice Hall,
1982.
 Angulo, José M., Microcontroladores PIC. Diseño práctico de aplicaciones.
Segunda edición, Mc. Graw Hill, México, 2005.
 Palacios, Enrique. Microcontrolador PIC16F84. Desarrollo de proyectos. Segunda
edición. Alfaomega. México, 2006.
127
 AprendiendoElectrónica. (2016). CCS Compiler (PIC C Compiler) - Conversor
Analógico Digital (ADC). Obtenido de AprendiendoElectrónica Blogger:
http://aprendiendoelectronicafacil.blogspot.mx/2015/08/pic-c-compiler-conversor-
analogico.html
 AprendiendoElectrónica. (2016). CCS Compiler (PIC C Compiler) - Manejo de
LCD 16x2. Obtenido de AprendiendoElectrónica Blogger:
http://aprendiendoelectronicafacil.blogspot.mx/2015/04/pic-c-compiler-manejo-de-
lcd-16x2.html
 AprendiendoElectrónica. (2016). CCS Compiler (PIC C Compiler)-Comunicación
Serial. Obtenido de AprendiendoElectrónica Blogger:
http://aprendiendoelectronicafacil.blogspot.mx/2015/08/pic-c-compiler-
comunicacion-serial.html
 Arquitectura de computadores. (28 de Marzo de 2012). Características y usos de los
microcontroladores. Obtenido de Blogger:
http://faltatesci.blogspot.mx/2012/03/caracteristicas-y-usos-de-los.html
 biblioman. (2016). Uso del TMR0 como temporizador. Obtenido de
AquíHayApuntes.com: http://www.aquihayapuntes.com/indice-practicas-pic-en-
c/uso-del-tmr0-como-temporizador.html
 CCS Inc. (2016). Code Optimizing C Compilers. Obtenido de Custom Computer
Services: http://www.ccsinfo.com/content.php?page=compilers
 Circuitos Electrónicos. (2011). Teclado Matricial 4x4. Obtenido de Blogger:
http://www.circuitoselectronicos.org/2011/03/teclado-matricial-4x4.html
 Dispositivos lógicos programables. (2013 de Enero de 2013). Dispositivos
microprogramables. Obtenido de Dispositivos lógicos programables Versión 3.2:
http://perso.wanadoo.es/pictob/indicemicroprg.htm
 Electrónica Unicrom. (2016). Display de 7 segmentos. Obtenido de Electrónica
Unicrom. Electrónica para el aficionado y el experto: http://unicrom.com/display-
de-7-segmentos/
 Electrónica Unicrom. (2016). Memoria de datos y de programa en PIC. Obtenido
de Electrónica Unicrom Electrónica para el aficionado:
http://unicrom.com/memoria-de-datos-y-de-programa-en-pic/
 Ferizzola Montagut, Y. J. (2016). CONVERSOR A/D INTERNO DEL
PIC16F877A. Antioquía, Colombia.
 Mario. (28 de Diciembre de 2010). Inversión de giro: Motor DC. Obtenido de
Proyectos electrónicos con PICs. Blogger:
http://proyectoselectronicos1.blogspot.mx/2010/12/inversion-de-giro-de-motor-
dc.html#!/tcmbck
 ME Labs, Inc. (2013). PICBASIC PRO Compiler. Obtenido de microEngineering
Labs, Inc: http://store.melabs.com/cat/PBP.html
 Microchip. (2016). MPLAB® XC Compilers. Obtenido de Microchip Technology
Inc: http://www.microchip.com/mplab/compilers
 Rubén. (26 de Julio de 2013). Teclado Matricial con PIC. Obtenido de 128
GeekFactory: http://www.geekfactory.mx/tutoriales/tutoriales-pic/teclado-matricial-
con-pic/
 Rueda, L. (2013). Tutorial de Microcontroladores PIC. Obtenido de Ero-Pic:
http://perso.wanadoo.es/luis_ju/
 Sánchez, S. (02 de Diciembre de 2012). Microcontroladores. Obtenido de
WordPress.com:
https://microcontroladoressesv.wordpress.com/microcontroladores-pic-y-sus-
variedades/
 Wikipedia. (25 de Junio de 2015). Puente H (electrónica). Obtenido de Wikipedia
La encicpledia libre: https://es.wikipedia.org/wiki/Puente_H_(electr%C3%B3nica)
 Wikipedia. (01 de Junio de 2016). Sensor de proximidad. Obtenido de Wikipedia La
enciclopedia libre: https://es.wikipedia.org/wiki/Sensor_de_proximidad

Vous aimerez peut-être aussi