You are on page 1of 184

Microcontroladores

2
CARRERAS PROFESIONALES CIBERTEC

















MI CROCONTROLADORES 3
CIBERTEC CARRERAS PROFESIONALES
NDICE


Presentacin 5
Red de contenidos 6
Unidad de aprendizaje 1: El PIC16F84
1.1 Tema1 : El microprocesador 9
1.1.1
1.1.2
1.2 Tema2
1.2.1
1.2.2
1.2.3
1.3 Tema3
1.3.1
1.3.2
1.3.3
1.4 Tema4
1.4.1
1.4.2
1.4.3
1.5 Tema5
1.5.1
1.5.2
1.5.3
1.6 Tema6
1.6.1
1.6.2
1.6.3
1.7 Tema7
1.7.1
1.7.2
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
Arquitectura de Von Newman
Sistema basado en Microprocesador
El PIC16F84
Caractersticas
Puesta en marcha
Arquitectura interna
Organizacin de la memoria
Mapeo de la memoria Flash
Memoria RAM
Registros y funciones
Juego de Instrucciones
Orientadas al Byte
Orientadas al bit
Algunos comandos en C
Gestin de puertos
Configuracin
Lectura y escritura
Programas aplicativos
Gestin de RAM
Acceso directo
Acceso indirecto
Programa aplicativo
Gestin de Temporizacin
Modos de operacin
Programas aplicativos
9
10
13
13
14
16
21
21
21
22
30
30
31
32
32
32
34
35
44
44
45
46
47
48
50
Unidad de aprendizaje 2 : El PIC16F877
2.1 Tema8
2.1.1
2.1.2
2.1.3
:
:
:
:
Introduccin al PIC16F877
Caractersticas
Puesta en marcha
Arquitectura interna
56
56
57
58
4
CARRERAS PROFESIONALES CIBERTEC
2.1.4 : Memorias 59
2.2 Tema9
2.2.1
2.2.2
2.3 Tema10
2.3.1
2.3.2
2.3.3
2.3.4
2.4 Tema11
2.4.1
2.4.2
2.4.3
2.4.4
2.5 Tema12
2.5.1
2.5.2
2.5.3
2.6 Tema13
2.6.1
2.6.2
2.6.3
2.6.4
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
Registros y funciones
Registros
Funciones
Gestin de Puertos y RAM
Juego de instrucciones
Acceso a los puertos
Acceso a RAM
Programas aplicativos
Gestin de Temporizacin
Timer0
Timer1
Timer2
Programas aplicativos
Gestin de Comunicacin y ADC
Comunicacin serie
Conversin ADC
Programas aplicativos
Gestin de Interrupciones
Tratamiento de una interrupcin
Registros asociados
Secuencia de configuracin
Programas aplicativos
65
65
67
82
82
83
85
87
95
95
97
100
102
108
108
114
117
123
123
124
127
128

Unidad de aprendizaje 3 : PICs de 16 y 32 bits
3.1 Tema14
3.1.1
3.1.2
3.1.3
3.1.4
3.1.5
3.1.6
3.2 Tema15
3.2.1
3.2.2
3.2.3
3.2.4
3.2.5
:
:
:
:
:
:
:
:
:
:
:
:
:
El PIC24FJ64GA006
Caractersticas
Puesta en marcha
Arquitectura interna
Memoria RAM
Juego de Instrucciones
Programa aplicativo
El PIC32MX300F032H
Caractersticas
Puesta en marcha
Arquitectura interna
Organizacin de la memoria
Juego de Instrucciones
141
141
143
145
146
160
164
173
173
175
177
178
179
MI CROCONTROLADORES 5
CIBERTEC CARRERAS PROFESIONALES


PRESENTACIN




Microcontroladores pertenece a la lnea de tecnologa y se dicta en la carrera
de Electrnica. El curso brinda un conjunto de conocimientos y mtodos
tcnicos que permiten a los alumnos concebir el funcionamiento de los
microcontroladores, distinguir sus potencialidades y utilizarlos apropiadamente
como herramientas aplicativas en sus proyectos personales y profesionales.

El manual del curso ha sido estructurado en unidades de aprendizaje, las que
se desarrollan por semanas. En cada una de ellas, encontrar los alcances que
se deben lograr, los temas a tratar y los contenidos que se deben examinar.
Por ltimo, encontrar las actividades que se deben desarrollar en cada sesin,
que le permitirn reforzar lo aprendido en la clase.

El curso es terico prctico. Para ello, se cuenta con un taller donde se llevan
a cabo las prcticas de laboratorio. Primero, se iniciar con la comprensin,
programacin y montaje de circuitos con el microcontrolador PIC16F84, que es
un microcontrolador de 8 bits de mediana complejidad, se prosigue con el
microcontrolador PIC16F877 que es uno de mayores capacidades y se culmina
con el PIC24FJ64GA006 y PIC32MX300F032H que son microcontroladores de
16 y 32 bits respectivamente.



6
CARRERAS PROFESIONALES CIBERTEC

RED DE CONTENIDOS













Microcontroladores
PIC24FJ64GA006
PIC32MX300FO32H
PIC16F84
PIC16F877
Arquitectura
y
Puesta en marcha
Memorias
y
Registros
Programacin de los PICs
Juego de instrucciones
y Configuracin
Acceso a los Puertos
y a memoria RAM
Temporizacin,
Comunicacin serial
e Interrupciones
Arquitectura
y
Puesta en marcha
Memorias
y
Registros
MI CROCONTROLADORES 7
CIBERTEC CARRERAS PROFESIONALES
8
CARRERAS PROFESIONALES CIBERTEC




EL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad bsica utilizando el Microcontrolador PIC16F84. Los
circuitos sern implementados en protoboards y deber asegurarse que las
conexiones realizadas de polarizacin, reinicio, oscilacin y puertos sean 100%
correctas. Por otro lado, los programas que activan el funcionamiento de los circuitos
se desarrollarn empleando el entorno de trabajo MPLAB pero utilizando comandos de
lenguaje C. Estos debern garantizar la perfecta configuracin de los puertos A y B del
Microcontrolador y el funcionamiento mnimo del 80% de las tareas propuestas.


TEMARIO
El Microprocesador
Introduccin al PIC16F84

ACTIVIDADES PROPUESTAS
Los alumnos describen la funcin de un sistema basado en Microprocesador.

Los alumnos describen las caractersticas y estructura del PIC16F84.

Los alumnos distinguen las unidades internas del PIC16F84.

UNIDAD DE
APRENDIZAJE
1
MI CROCONTROLADORES 9
CIBERTEC CARRERAS PROFESIONALES
1.1 EL MICROPROCESADOR

Desde la invencin del primer microprocesador (4004), estos
CHIPs han sido perfeccionados ao tras ao, convirtindose
actualmente en los ICs ms potentes y complejos
tecnolgicamente. Los microprocesadores de hoy son capaces de
procesar muchsima ms informacin y a muchsima mayor
velocidad que el legendario 4004.

El microprocesador, tambin conocido como CPU (unidad central de proceso), es un
circuito integrado semiconductor formado por la integracin de millones de
transistores, interrelacionados entre s para formar el circuito ms complejo que la
electrnica haya realizado. Sin embargo, su funcin es lgica, simple y repetitiva,
procesa toda la informacin de cualquier sistema electrnico a travs de la lectura,
interpretacin y ejecucin de instrucciones. Esta forma de operar madur y se aplic
gracias al aporte de Jhon Von Newman.

1.1.1 ARQUITECTURA DE VON NEWMAN
Fue un matemtico hngaro nacionalizado estadounidense que concibi la
arquitectura de los procesadores modernos y se bas en los siguientes conceptos:
- Programa almacenado; y
- Ruptura de la secuencia de programa mediante la toma de decisiones.

El siguiente esquema refleja esta concepcin:















Cada elemento de esta arquitectura tiene su funcin:

1.1.1.1 Memoria
Es el dispositivo que almacena el programa a ejecutar en forma de secuencia de
instrucciones.

1.1.1.2 Unidad de Control
Es la unidad encargada de enviar consecutivamente las instrucciones del programa,
desde la memoria hasta la unidad de proceso.

1.1.1.3 Unidad de Proceso
Es la unidad encargada de interpretar y ejecutar las instrucciones. La ejecucin causa
alguna accin sobre la memoria o sobre las unidades de entrada o salida.

1.1.1.4 Unidad de E/S
10
CARRERAS PROFESIONALES CIBERTEC
Es la unidad encargada de enlazar la comunicacin con el mundo exterior, es decir,
con el ser humano. Recibe y representa los datos y resultados de forma asequible
para este.

1.1.1.5 Reloj
Es el dispositivo encargado de poner en marcha y sincronizar todo el sistema.

Si se une la unidad de proceso y la unidad de control se crea el microprocesador, as,
el esquema mejorado sera el siguiente:
















Con ello, podemos afirmar que el microprocesador gobierna el funcionamiento de las
unidades de E/S, segn sea el programa (instrucciones) almacenado en la memoria y
al ritmo de los pulsos de la seal de reloj.


1.1.2 SISTEMA BASADO EN MICROPROCESADOR

La arquitectura de Von Newman ech muchas luces al desarrollo de los procesadores
y, sobre la base de su concepcin, todos los sistemas basados en microprocesador
necesitan de memorias y unidades de entrada/salida. Las memorias son necesarias
porque en estas se depositan los datos e instrucciones que gobiernan el
funcionamiento del sistema. Y las unidades de entrada/salida son las que permiten
interactuar al microprocesador con el mundo exterior o si se quiere, permiten que el
mundo exterior acceda a los servicios del microprocesador.

1.1.2.1 Sistema mnimo
Un sistema mnimo estara formado por el microprocesador, una memoria ROM, una
memoria RAM, una interfase de entrada y otra de salida. Todos estos elementos
deben interactuar con el microprocesador y para ello se hace necesaria la
comunicacin, la cual se realiza a travs de los llamados buses de comunicacin.










MI CROCONTROLADORES 11
CIBERTEC CARRERAS PROFESIONALES
1.1.2.1.1 Buses de comunicacin
Los buses de comunicacin estn formados por los buses de datos, de direccin y de
control. Su importancia radica en facilitar, ordenar y sincronizar la comunicacin entre
los elementos del sistema.

1.1.2.1.2 Bus de datos
Este bus es el canal de transporte por donde viaja la informacin (instrucciones y
datos), entre el microprocesador y los elementos externos (memorias e I/O). El tamao
de este bus determina la cantidad de informacin que se puede transferir en un
instante de reloj. El primer microprocesador tena 4 bits de datos; uno actual posee 64
bits.

1.1.2.1.3 Bus de direccin
Este bus es el seleccionador de la comunicacin. A travs de este, el microprocesador
elige a uno de los elementos externos (memorias e i/o) que se comunicar con l; los
dems elementos externos no intervienen en la comunicacin seleccionada. El tamao
de su bus determina la capacidad de habilitacin del microprocesador; a mayor bus
mayor capacidad y cantidad de elementos externos que puede seleccionar. El 4004
tena 13 bits de direccin; los procesadores actuales sobrepasan los 40 bits.

1.1.2.1.4 Bus de control
Este bus es el que establece con qu tipo de elemento externo se realizar la
comunicacin y adems define en qu sentido se realizar. Es decir, el
microprocesador debe saber si se comunicar con memorias o unidades de
entrada/salida y si la informacin se transmitir sobre estas o se recibir de estas. Si la
informacin va a salir del microprocesador, este activar la escritura de informacin,
pero si la informacin va entrar al microprocesador, este activar la lectura de
informacin.












1.1.2.2 Secuencia funcional
Luego de energizado el microprocesador, debe recibir un impulso llamado RESET que
le permita inicializar todo su sistema interno. Luego de esta inicializacin, el
Microprocesador buscar su primera instruccin, la cual debe estar en la primera celda
de la memoria ROM. Para ello, debe realizar la siguiente secuencia operativa:

1- La direccin de la primera celda de ROM se coloca en el bus de direccin.
2- Se activa el bus de datos dejando listo este canal para la transferencia.
3- Se indica en el bus de control que se trabajar con memoria y adems se
activa la lectura de informacin.
En este instante, la primera instruccin sale de la memoria ROM y viaja por el
bus de datos hacia el interior del microprocesador.
4- Se desactivan los buses de comunicacin.
5- Internamente se decodifica la instruccin recibida.
Despus de la decodificacin, el microprocesador sabe qu elementos internos
12
CARRERAS PROFESIONALES CIBERTEC
o externos intervendrn y en qu orden lo harn para ejecutar esta instruccin.
6- Se ejecuta la instruccin segn lo decodificado.

La ejecucin de una instruccin siempre culmina con la transferencia de informacin.
Esta informacin puede realizar lo siguiente:

a) Escribirse sobre alguna celda de memoria RAM
b) Escribirse sobre alguna unidad de salida OUT
c) Leerse de alguna celda de memoria RAM
d) Leerse de alguna unidad de entrada IN
e) O simplemente quedarse en el interior (registro) del microprocesador

1.1.2.3 Escritura sobre RAM
El microprocesador realizara la siguiente secuencia:
1- Se coloca en el bus de direccin la direccin de la celda de RAM que recibir el
dato.
2- Se activa el bus de datos y se coloca en este el dato a transferir.
3- Se indica en el bus de control que se trabajar con memoria y adems se
activa la escritura de informacin.

En este instante, el dato colocado en el bus de datos es transferido desde el
interior del microprocesador hacia la celda de memoria RAM direccionada.

4- Se desactivan los buses de comunicacin.

1.1.2.4 Lectura de una unidad de entrada
El microprocesador realizara la siguiente secuencia:
1- Se coloca en el bus de direccin la direccin de la unidad de entrada de donde
provendr el dato.
2- Se activa el bus de datos dejando listo este canal para la transferencia.
3- Se indica en el bus de control que se trabajar con una unidad de entrada y
adems se activa la lectura de informacin.

En este instante, el dato viaja desde la unidad de entrada seleccionada hacia el
interior del microprocesador.

4- Se desactivan los buses de comunicacin.


1.1.2.5 Funcin simple y repetitiva
Las instrucciones se encuentran almacenadas en la memoria y ordenadas una detrs
de la otra para su ejecucin secuencial. Culminada la ejecucin de la primera
instruccin, el microprocesador procede con la siguiente instruccin, para lo cual,
repite los pasos de la secuencia funcional
(pasos 1 al 6), pero teniendo en cuenta la
direccin de la celda de memoria que
contiene la segunda instruccin.
Culminada la ejecucin de esta, se repiten
otra vez los pasos, pero con la direccin
de la celda que contiene la tercera
instruccin. Este procedimiento se repite
una y otra vez con el conjunto de
instrucciones de la memoria que forman el
programa.

MI CROCONTROLADORES 13
CIBERTEC CARRERAS PROFESIONALES
1.2 INTRODUCCIN AL PIC16F84

Un microcontrolador es un integrado que contiene todos los elementos electrnicos
que se utilizaban para hacer funcionar un sistema basado en microprocesador; es
decir, contiene en un solo integrado la Unidad de
Proceso (Microprocesador), la memoria RAM,
memoria ROM, puertos de entrada, de salidas y
otros perifricos, facilitando de este modo la
implementacin fsica de cualquier aplicacin o
proyecto electrnico. En la actualidad, existen
varios fabricantes de Microcontroladores, entre los
que destacan Atmel, Intel, Microchip y Motorola -
Frees Cale. Nosotros trabajaremos con los
Microcontroladores de Microchip por dos razones
bsicamente: por la facilidad de acceso a su
informacin referente a sus Microcontroladores y
porque, en nuestro medio, es fcil y econmico
adquirir estos PICs.

El PIC16F84 es uno de los tantos tipos de Microcontroladores que fabrica Microchip.
Los hay desde los ms simples hasta los ms complejos, clasificados en tres grupos:
gama baja, media y alta. El PIC16F84 pertenece a la gama media, es decir, es un
Microcontrolador de mediana complejidad, ideal para adentrarnos en el mundo de
estos chips.

1.2.1 CARACTERSTICAS

1.2.1.1 CONTACTOS DEL PIC16F84

La figura muestra la disposicin de pines de este PIC. VDD y VSS son los pines de
polarizacin, +5V y GND, respectivamente. OSC1 y OSC2 son los pines para el reloj.
En estos se conectar el cristal.
MCLR es el pin de programacin o
reset. Durante la programacin, esta
patilla se conecta al voltaje de
programacin (13,2V), mientras que,
en funcionamiento, este debe
conectarse a un arreglo RC para
recibir el pulso de inicializacin. Los
pines RAx y RBx son los pines de los
puertos A y B, respectivamente. A
travs de estas patillas, el
microcontrolador se conectar con el circuito a controlar.

1.2.1.2 Descripcin de la CPU
Este Microcontrolador posee, en su interior, un Microprocesador de 8 bits que opera a
una frecuencia mxima de 20Mhz, soporta un total de 35 instrucciones las que ejecuta
en un ciclo de mquina, excepto las de salto que ejecuta en dos ciclos. Un ciclo de
mquina equivale a 4 periodos de reloj (f/4), donde f es la frecuencia del cristal
utilizado para proveer la seal de reloj.

1.2.1.3 Descripcin de las memorias
El PIC16F84 posee tres tipos de memorias: FLASH, EEPROM y RAM.
14
CARRERAS PROFESIONALES CIBERTEC
1.2.1.3.1 Memoria FLASH
La memoria flash es la memoria de programas destinada para almacenar las
instrucciones. Tiene una capacidad de 1024 celdas de 14 bits (1K word), es decir, se
pueden introducir en esta memoria hasta 1024 instrucciones. Esta memoria es la que
recibir desde el computador los programas desarrollados durante los laboratorios.
Esta memoria puede ser borrada y programada 10 mil veces. Las instrucciones
depositadas en esta no se perdern ni modificarn aun si se quita la energa de
polarizacin.

1.2.1.3.2 Memoria EEPROM
La memoria EEPROM es una memoria destinada para el almacenamiento de datos y
variables. Este tipo de memoria, al igual que la FLASH, no pierde su informacin aun
si se pierde la energa que lo polariza. Su capacidad es de slo 64 celdas de 8 bits, es
decir, 64 bytes. Esta memoria puede ser regrabada 10 millones de veces.

1.2.1.3.3 Memoria RAM
La memoria ram es una memoria destinada al almacenamiento de datos, pero a su
vez, en esta, se encuentran todos los registros de configuracin de todas las funciones
del PIC. Su capacidad es de tan slo 68 celdas de 8 bits, es decir, 68bytes.

1.2.1.4 Descripcin de las unidades de entrada y salida
El PIC16F84 dispone de dos puertos denominados PORTA y PORTB. El puerto A est
formado por 5 pines, mientras que el puerto B por 8 pines. Es decir, 13 patillas a travs
de los cuales el Microcontrolador se conectar con las aplicaciones.

Adems, posee un dispositivo de temporizacin denominado TIMER0, el cual servir
para las aplicaciones que requieran controlar el tiempo.

El TIMER0 y el PORTB pueden funcionar bajo la modalidad de interrupcin, es decir,
el microprocesador slo los atender cuando estos lo necesiten. Las posibles
interrupciones se pueden generar por un pulso bajo en el pin RB0 del PORTB, el
desbordamiento del TIMER0, la variacin del estado de los pines RB4 a RB7 del
PORTB o por la culminacin de la escritura de un dato sobre la memoria EEPROM.

1.2.2 PUESTA EN MARCHA

Poner en funcionamiento al Microcontrolador significa polarizarlo, proveerle la seal de
reloj y asegurar el impulso de inicializacin bsico para que pueda funcionar.

1.2.2.1 Polarizacin
Este PIC necesita ser energizado con +5V y GND, ya sea
durante la programacin de su memoria FLASH o durante su
funcionamiento. Las patillas utilizadas para esto son VDD y VSS,
tal como se muestra en la figura de la derecha. Algunas
versiones de estos PICs disponen de 20 patillas, aadiendo dos
patillas ms de polarizacin. Segn sea conveniente, se utilizar
una u otra patilla de polarizacin. No es necesario conectar las
dos patillas VDD a +5V ni tampoco conectar las dos patillas VSS
a GND, basta con adaptar una de las dos.

MI CROCONTROLADORES 15
CIBERTEC CARRERAS PROFESIONALES
1.2.2.2 Inicio y reinicio
Todos los Microcontroladores necesitan recibir un impulso apenas se energizan. Esto
es fundamental para inicializar sus unidades y registros. De no presentarse este
impulso, el Microcontrolador probablemente quedara bloqueado ejecutando algn
grupo de instrucciones que nada tienen que ver con la ejecucin
del programa preparado, ya que, la PC (contador de programa)
podra estar apuntando a cualquier parte de la memoria de
programa flash. Este impulso, entre otras cosas, asegura que el
registro PC apunte a la primera celda de la memoria FLASH, es
decir, el Microcontrolador queda listo para leer, interpretar y
ejecutar su primera instruccin. Este impulso se logra realizando
un arreglo RC sobre la patilla MCLR, tal como se muestra en la
figura de la izquierda. Valores comunes seran 1K ohmios para la
resistencia y 10 uF para el condensador. Si durante el
funcionamiento del Microcontrolador ocurriera algn evento no
deseado y este quedase bloqueado o simplemente se requiere
reiniciar la ejecucin del programa desde el principio, es
necesario inyectar un nuevo impulso sobre MCLR. Esto se logra
presionando un pulsador, tal como se muestra en la figura.

1.2.2.3 Reloj
La funcin de reloj, tambin conocida como sistema de oscilacin,
es fundamental para que el Microcontrolador se ponga en marcha.
Sin esta seal, los Microcontroladores no podran realizar la ms
mnima labor. Estos necesitan los pulsos repetitivos de la seal de
reloj para leer, interpretar y ejecutar las instrucciones
almacenadas en su memoria flash. Los pines destinados para esta
funcin son OSC1 y OSC2. A estas se le tendrn que adaptar un
cristal, un arreglo RC o una fuente externa de reloj. Las instrucciones comunes se
ejecutan en un ciclo de mquina (f/4) y las complejas en dos (2f/4 = f/2).

1.2.2.3.1 Modos de oscilacin
El PIC16F84 puede trabajar hasta en cuatro modos de oscilacin: LP, XT, HS y RC.

1.2.2.3.1.1 Modo LP
Este sistema est diseado para que el microcontrolador opere a
frecuencias bajas comprendidas entre los 32Khz y 200Khz. Es
posible adaptar un oscilador cermico o un oscilador de cristal de
cuarzo. Este debe ser acompaado por dos condensadores cuyos
valores dependen de la frecuencia de trabajo. Los fabricantes
facilitan esta informacin en tablas de la hoja de datos del PIC.

1.2.2.3.1.2 Modo XT
Este sistema est diseado para que el microcontrolador opere a
frecuencias comprendidas entre los 100Khz y 4Mhz. Es posible
adaptar un oscilador cermico o un oscilador de cristal de cuarzo.
Este debe ser acompaado por dos condensadores cuyos valores
tpicos estn entre los 15pF y 33pF.

16
CARRERAS PROFESIONALES CIBERTEC
1.2.2.3.1.3 Modo HS
Este sistema est diseado para que el microcontrolador opere a
frecuencias comprendidas entre los 4Mhz y 20Mhz. Es posible
adaptar un oscilador cermico o un oscilador de cristal de cuarzo.
Este debe ser acompaado por dos condensadores y una
resistencia cuyos valores dependen de la frecuencia de trabajo.
Los fabricantes facilitan esta informacin en tablas de la hoja de
datos del PIC.

1.2.2.3.1.4 Modo RC
Este es un sistema poco preciso pero econmico y se realiza
utilizando una resistencia y un condensador. Los valores
recomendados por los fabricantes para este tipo de oscilador son
5K ohmios < R <100K ohmios y C > 20pF.


1.2.3 ARQUITECTURA INTERNA

El PIC16F84, al igual que los dems Microcontroladores PIC, se caracterizan por tener
lo siguiente:

Una arquitectura Harvard
Un procesamiento segmentado (pipeline)
Un procesador tipo RISC
Un formato ortogonal

1.2.3.1 Arquitectura Harvard
Esta arquitectura, a diferencia de la arquitectura de Von Newman, trabaja con dos
memorias independientes de datos y de instrucciones, a las que se conecta a travs
de dos grupos de buses separados. Ambos buses son totalmente independientes y de
diferentes anchos. Esto permite que el microprocesador pueda acceder
simultneamente a la memoria de datos y a la de instrucciones. Tal diferencia permite
que las instrucciones se ejecuten en tiempos mucho ms cortos.


1.2.3.2 Procesamiento segmentado o Pipeline
Este procesamiento puede procesar dos instrucciones al mismo tiempo, aunque en
diferente fase cada una. Es decir, mientras se est ejecutando una instruccin, se est
realizando la lectura de la siguiente instruccin. De esta manera, se puede ejecutar
cada instruccin en un ciclo de mquina.
Para los PICs, un ciclo de mquina equivale a cuatro ciclos de reloj. Todas sus
instrucciones se ejecutan en este periodo a excepcin de las instrucciones de salto
que toman dos ciclos de mquina.

1.2.3.3. Procesador RISC (reduced instruction set computer)
Los procesadores PIC se caracterizan por tener un juego reducido de instrucciones.
Esto permite que las instrucciones sean simples y se ejecuten en un solo ciclo de
mquina. Este PIC soporta 35 instrucciones, las cuales estn organizadas por su
orientacin al byte, al bit y a las constantes.


MI CROCONTROLADORES 17
CIBERTEC CARRERAS PROFESIONALES
1.2.3.4 Formato ortogonal
El formato ortogonal se refiere a las fuentes y destinos en
el procesamiento de una instruccin. En el caso de los
PICs, cualquier elemento interno puede funcionar como
fuente o destino, evitando las limitaciones de
procesadores antiguos. En la figura de la derecha,
observamos esta caracterstica donde la ALU (unidad
aritmtica lgica) tiene como fuentes al registro de
trabajo W y los registros o celdas de la memoria de datos,
y como destino podemos observar que puede ser
cualquiera de estos elementos indicados.

Observando el esquema siguiente:

Notamos la arquitectura Harvard del PIC16F84: la memoria de programas FLASH (que
almacena las instrucciones) tiene un bus conectado directamente sobre el registro de
instrucciones y este, a su vez, se conecta con el decodificador de instrucciones, con el
multiplexor de direcciones o al multiplexor de entrada para las operaciones aritmtico
lgicas. En cambio, la memoria RAM y la memoria EEPROM (que almacenan los
datos) comparten otro camino, otro bus, el cual se conecta al registro FSR de
direccionamiento indirecto de memoria RAM, a los PUERTOS, al TIMER0, al registro
de trabajo W o al multiplexor de entrada para las operaciones aritmtico lgicas.

Tambin, podemos observar el formato de trabajo ortogonal. La ALU (unidad
aritmtica lgica) recibe por una de sus entradas la informacin proveniente del bus de
la memoria FLASH o del bus de las memorias RAM o EEPROM y por su otra entrada
18
CARRERAS PROFESIONALES CIBERTEC
recibe la informacin proveniente del registro de trabajo W. El resultado de las
operaciones es devuelto sobre el registro de trabajo W, sobre los puertos, sobre el
TMR0, sobre las memorias RAM o EEPROM y sobre algunos registros especiales
como el FSR, EEDATA, EEADR, STATUS y PC.




MI CROCONTROLADORES 19
CIBERTEC CARRERAS PROFESIONALES

Resumen


El Microprocesador es el chip ms avanzado integrado por millones de
transistores. El primer Microprocesador fue el 4004 y lo desarroll Intel.

Un sistema basado en Microprocesador est constituido por memorias, unidades
de entrada/salida y el Microprocesador.

Los buses de comunicacin son tres: el bus de datos, de direccin y de control.
Estos sirven para establecer el orden y sincronizacin de comunicacin de un
sistema basado en Microprocesador.

Tras la energizacin del Microprocesador, este empieza a realizar su funcin
simple y repetitiva de leer, interpretar y ejecutar las instrucciones de la memoria.

El Microcontrolador es un microcomputador en un solo chip. En este, se incluyen
todos los dispositivos y funciones especficas que reducen el tamao de las
aplicaciones.

Existe una gran variedad de Microcontroladores desde los ms simples hasta los
ms potentes y complejos. El empleo de uno u otro depender de la complejidad
del proyecto o aplicacin a realizar.

El PIC16F84 lo desarrolla Microchip y pertenece a la gama media de los
microcontroladores. Tiene un Microprocesador de 8 bits; una memoria FLASH de
1K words; una memoria EEPROM de 64 bytes; una RAM de 68 bytes; dos puertos:
PORTA y PORTB; y un temporizador TMR0.

El PIC para funcionar necesita de una seal de reloj. Adems, es necesario
realizar un arreglo RC sobre la patilla MCLR que asegure su inicializacin interna.

Su arquitectura es del tipo Harvard (acceso independiente y simultneo a la
memoria de datos e instrucciones), realiza procesamiento segmentado de las
instrucciones (mientras una se ejecuta, la siguiente instruccin se lee), posee un
reducido nmero de instrucciones (35) y dispone de un formato ortogonal.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.

http://perso.wanadoo.es/pictob/micropic16f84_3.htm
Aqu, hallar informacin sobre reset y oscilacin del PIC.

http://www.terra.es/personal/fremiro/arquitectura.htm
Aqu, hallar informacin sobre la arquitectura de este PIC.

20
CARRERAS PROFESIONALES CIBERTEC





EL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad bsica utilizando el Microcontrolador PIC16F84. Los
circuitos sern implementados en protoboards y deber asegurarse que las
conexiones realizadas de polarizacin, reinicio, oscilacin y puertos sean 100%
correctas. Por otro lado, los programas que activan el funcionamiento de los circuitos
se desarrollarn empleando el entorno de trabajo MPLAB pero utilizando comandos de
lenguaje C. Estos debern garantizar la perfecta configuracin de los puertos A y B del
Microcontrolador y el funcionamiento mnimo del 80% de las tareas propuestas.


TEMARIO
Organizacin de la memoria

ACTIVIDADES PROPUESTAS
Los alumnos describen las funciones relacionadas con la memoria FLASH.

Los alumnos distinguen la estructura y acceso de la memoria RAM.

Los alumnos describen la funcin de los registros.




UNIDAD DE
APRENDIZAJE
1
MI CROCONTROLADORES 21
CIBERTEC CARRERAS PROFESIONALES
1.3 ORGANIZACIN DE LA MEMORIA DEL PIC16F84

1.3.1 MAPEO DE LA MEMORIA FLASH

Esta memoria, encargada de proveer las
instrucciones al microprocesador, debe ser
adecuadamente tratada; de lo contrario,
podramos cometer errores involuntarios
de programacin.

La capacidad fsica de esta memoria es de
1Kwords, donde cada Word est formado
por 14 bits. Su direccionamiento va desde
la posicin 0000h hasta la 03FFh. Esta
rea es conocida como la memoria de
usuario.

El PC (contador de programa) es un
registro que se encarga de direccionar a
cada una de las instrucciones de esta
memoria. Cada vez que el pin MCLR del
microcontrolador recibe un pulso bajo, el
PC se fija automticamente a 0000h
(vector de reset) garantizando que se
apunte a la primera instruccin del
programa.

Cada vez que se presente alguna interrupcin, el valor del PC es guardado en uno de
los 8 niveles de la Pila, para recibir luego y de modo automtico la direccin 0004h
(vector de interrupcin).

La Pila es un arreglo de registros que sirve para guardar o restaurar los valores del
PC. Cada vez que se presenta una interrupcin o se invoca a alguna subrutina (CALL),
el valor del PC es guardado en la Pila; en cambio, cuando se termina la ejecucin de
una subrutina de interrupcin (RETFIE) o se finaliza la ejecucin de una subrutina
comn (RETURN o RETLW), el PC recupera de la Pila su valor.


1.3.2 LA MEMORIA RAM

Esta memoria es fundamental para el tratamiento de los datos y variables que maneja
un programa. En la figura, se nota que est formada por dos partes: los registros de
funciones especiales (SFR) y los registros de propsito general (GPR).

1.3.2.1 Registros de funciones especiales (SFR)
Estn formados por las primeras posiciones de la memoria y tienen un papel
importante en la funcin y configuracin del Microcontrolador.

1.3.2.2 Registros de propsito general (GPR)
Estn formados por 68 bytes y obviamente sirven para el tratamiento de los datos y
variables del programa. Estn direccionados desde la posicin 0Ch a 4Fh.

22
CARRERAS PROFESIONALES CIBERTEC
1.3.2.3 Bancos de Memoria
La RAM est estructurada por dos bancos de
memoria: El Banco 0 y el Banco 1. Los registros
de funciones especiales y de propsito general
se encuentran ubicados en los dos Bancos.

En las direcciones 00h a 0Bh del Banco 0 y en
las direcciones 80h a 8Bh del Banco 1 estn
ubicados los SFR. Algunos de estos registros
como INDF (Indirect addr), STATUS, FSR, se
encuentran tanto en el Banco 0 como en el
Banco 1, con el nico propsito de facilitar su
acceso.

El espacio de memoria del Banco 1 destinado
para los registros de propsito general no es
asequible, por lo que, si trata de manipular
alguno de estos registros, no ser posible. Este
banco est mapeado sobre el Banco 0.

1.3.2.4 Seleccin de los Bancos
El acceso a los Bancos se realiza a travs de la
manipulacin del bit 5 (RPO) del registro
STATUS. Si este bit es puesto a cero, se logra el
acceso a cualquiera de los registros contenidos
en el Banco 0, mientras que, si fijamos este bit a
uno, accederemos a los registros del Banco 1.


1.3.3 REGISTROS Y FUNCIONES

Los registros, como se mencion, tienen un papel muy importante y en el caso de los
PICs, su importancia se multiplica, porque no son simples almacenes de informacin,
estn encargados de llevar la configuracin y habilitacin de las funciones que los
PICs poseen. A continuacin, se muestran dos tablas: la primera con los registros de
funciones especiales del banco 0 y la segunda con los del Banco 1. En cada una, se
indica una breve descripcin de los registros.

BANCO 0
00h INDF Lee y escribe los datos en RAM en el modo indirecto con FSR.
01h TMR0 Temporizador/contador de 8 bits
02h PCL Contador de programa (puntero de instrucciones) parte baja
03h STATUS Indicador de estado de la ALU, selector de los Bancos de RAM
04h FSR Direccionador de las celdas de RAM en el modo indirecto
05h PORTA Puerto de lectura y escritura de 5 bits
06h PORTB Puerto de lectura y escritura de 8 bits
07h
08h EEDATA Lee y escribe los datos en EEPROM.
09h EEADR Direccionador de las celdas de EEPROM
0Ah PCLATH Contador de programa parte alta
0Bh INTCON Configurador e indicador de interrupciones


MI CROCONTROLADORES 23
CIBERTEC CARRERAS PROFESIONALES
BANCO 1
80h INDF Lee y escribe los datos en RAM en el modo indirecto con FSR.
81h OPTION Configurador del TMR0 y habilitador de interrupciones externas
82h PCL Contador de programa (puntero de instrucciones) parte baja
83h STATUS Indicador de estado de la ALU, selector de Banco de Ram
84h FSR Direccionador de las celdas de Ram en el modo indirecto
85h TRISA Configurador del sentido de trabajo de los bits del PORTA
86h TRISB Configurador del sentido de trabajo de los bits del PORTB
87h
88h EECON1 Controlador de la lectura o escritura sobre la EEPROM
89h EECON2 Secuenciador de escritura (55h y AAh) para la EEPROM
8Ah PCLATH Contador de programa parte alta
8Bh INTCON Configurador e indicador de interrupciones


1.3.3.1 Funciones de los registros
Cada registro tiene una capacidad mxima y cada bit tiene su funcin especial, por tal
motivo, es necesario desagregar a los registros en funcin de sus bits para tener una
idea ms completa de su funcin.

1.3.3.1.1 El registro STATUS
Este es el registro de estado. Est formado por 8 bits y contiene los indicadores de
estado de la ALU, el bit que permite la seleccin del banco de memoria RAM, y los
indicadores de watchdog y power down. Abajo, se muestra la disposicin de sus bits:

IRP RP1 RP0 T0 PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

Los bits IRP y RP1 no estn implementados para este microcontrolador.
RP0 : Selector del banco activo de memoria RAM.
0: Banco 0
1: Banco 1

TO : Indicador de ocurrencia del watchdog timer
1: Desactivado
0: Activado

PD: Indicador de funcionamiento de power down
1: Desactivado
0: Activado (modo SLEEP)

Z: Indicador de cero
0: Desactivado
1: Activado

DC: Indicador de carry o borrow decimal
0: Desactivado
1: Activado
24
CARRERAS PROFESIONALES CIBERTEC
C: Indicador de carry o borrow octal
0: Desactivado
1: Activado

1.3.3.1.2 El registro OPTION
El registro de opcin tambin est formado por 8 bits y contiene los bits de control para
la configuracin de trabajo del TIMER0 y WATCHDOG, los bits de habilitacin de
interrupcin externa y del TIMER0 y la habilitacin de la funcin PULL-up para los bits
del PUERTOB. A continuacin, se muestran sus bits:

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

RBPU: Funcin pull-up para el PUERTOB
1: Funcion desactivada
0: Funcion activada

INTEDG: Selector del tipo de interrupcin externa RBO/INT
1: activa por flanco de subida
0: activa por flanco de bajada

T0CS: Selector de la fuente de reloj para el TIMER0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4

T0SE: Selector del tipo de flanco externo para el TIMER0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMRE por flanco de subida del pin RA4/TOCKI

PSA: Desviador del factor de divisin de la seal de reloj
1: Hacia la funcin de WATCHDOG
0: Hacia la funcin del TIMER

PS2-PS1-PS0: Selectores del factor de divisin de la seal de reloj

PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128




MI CROCONTROLADORES 25
CIBERTEC CARRERAS PROFESIONALES
1.3.3.1.3 El registro INTCON
El registro de interrupcin tambin est formado por 8 bits y contiene los bits de
habilitacin para las interrupciones, asi como los indicadores de la presencia de
interrupcin. Enseguida, se muestran sus bits:

GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado

EEIE: Interrupcin por escritura de la EEPROM
1: Habilitado
0: Deshabilitado

T0IE: Interrupcin por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado

INTE: Interrupcin externa del pin RB0/INT
1: Habilitado
0: Deshabilitado

RBIE: Interrupcin por variacin del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado

T0IF: Indicador de interrupcin de desbordamiento del TIMER0
1: Activado
0: Desactivado

INTF: Indicador de interrupcin del pin RB0/INT
1: Activado
0: desactiva

RBIF: Indicador de interrupcin por variacin del valor de los bits <RB4:RB7>
1: Activado
0: Desactivado

1.3.3.1.4 El registro EECON1
El registro de configuracin 1 de la memoria EEPROM es de 8 bits y contiene los bits
que permiten la configuracin, habilitacin y puesta en marcha del proceso de lectura
o escritura de dicha memoria. Abajo, se muestran sus bits:

- - - EEIF WRWRR WREN WR RD
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

EEIF: Indicador de proceso de escritura
1: Escritura culminada
0: Escritura desactivada o en proceso

26
CARRERAS PROFESIONALES CIBERTEC
WRERR: Indicador de error del proceso de escritura
1: Proceso finalizado prematuramente debido a un reset o watchdoog
0: Proceso correcto

WREN: Habilitador del proceso de escritura
1: Habilitado
0: Deshabilitado

WR: Control de inicializacin de la escritura e indicador de proceso culminado
1: Inicia el proceso de escritura
0: Indica el fin del proceso de escritura

RD: Control de inicializacin de la lectura e indicador de proceso culminado
1: Inicia el proceso de lectura
0: Indica el fin del proceso de lectura

1.3.3.1.5 El registro EECON2
El registro de configuracin 2 de la memoria EEPROM es de 8 bits y slo sirve para
secuenciar la operacin de escritura sobre esta memoria. Este registro debe recibir
consecutivamente dos valores: primero se le debe transferir el valor 55h y luego el
valor AAh. Realizado esto, ya se puede iniciar el proceso de escritura sobre la
EEPROM.

1.3.3.1.6 El registro PORTA
El registro de puerto A est formado por 5 bits y contiene los 5 primeros pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

- - - RA4/TOCKI RA3 RA2 RA1 RA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

RA0: Bit menos significativo del puerto. Funciona como I/O digital.
RA1: Funciona como I/O digital.
RA2: Funciona como I/O digital.
RA3: Funciona como I/O digital.
RA4: Bit ms significativo del puerto. Funciona como I/O digital o como entrada de
fuente externa de reloj para el TMR0.

1.3.3.1.7 El registro PORTB
El registro de puerto B est formado por 8 bits y contiene los 8 siguientes pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0/INT
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

RB0: Bit menos significativo. Funciona como I/O digital o interrupcin por pulso bajo.
RB1: Funciona como I/O digital.
RB2: Funciona como I/O digital.
RB3: Funciona como I/O digital.
RB4: Funciona como I/O digital o interrupcin si vara su valor.
RB5 Funciona como I/O digital o interrupcin si vara su valor.
RB6 Funciona como I/O digital o interrupcin si vara su valor.
RB7 Bit ms significativo. Funciona como I/O o interrupcin si vara su valor.


MI CROCONTROLADORES 27
CIBERTEC CARRERAS PROFESIONALES
1.3.3.1.8 El registro TRISA
El registro de configuracin del sentido de trabajo est formado por 5 bits y establece
si cada pin del PUERTO A trabajar como entrada o salida. Veamos sus bits:

- - - TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

TRISA0: Bit de configuracin del pin RA0.
TRISA1: Bit de configuracin del pin RA1.
TRISA2: Bit de configuracin del pin RA2.
TRISA3: Bit de configuracin del pin RA3.
TRISA4: Bit de configuracin del pin RA4.

Cada bit puede ser configurado independientemente o en grupo segn se requiera. Si
el bit TRISAx es fijado a cero (0), su pin correspondiente en el PORTA RAx queda
configurado como salida. Por el contrario, si fijamos su valor a uno (1) el pin
correspondiente en RAx quedara configurado como entrada.

1.3.3.1.9 El registro TRISB
El registro de configuracin del sentido de trabajo est formado por 8 bits y establece
si cada pin del PUERTO B trabajar como entrada o salida. Veamos sus bits:

TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

TRISB0: Bit de configuracin del pin RB0
TRISB1: Bit de configuracin del pin RB1
TRISB2: Bit de configuracin del pin RB2
TRISB3: Bit de configuracin del pin RB3
TRISB4: Bit de configuracin del pin RB4
TRISB5: Bit de configuracin del pin RB5
TRISB6: Bit de configuracin del pin RB6
TRISB7: Bit de configuracin del pin RB7

Cada bit puede ser configurado independientemente o en grupo segn se requiera. Si
el bit TRISBx es fijado a cero (0), su pin correspondiente en el PORTB RBx queda
configurado como salida. Por el contrario, si fijamos su valor a uno (1), el pin
correspondiente en RBx quedara configurado como entrada.

28
CARRERAS PROFESIONALES CIBERTEC

Resumen






La memoria FLASH sirve para almacenar las instrucciones del programa. En esta,
se insertan las del programa principal y las de las subrutinas de interrupcin. El
registro encargado de direccionar estas instrucciones es el PC. Cada vez que
aparece un reset, el PC recibe la direccin 0000h para ejecutar la primera
instruccin.

La memoria RAM est organizada por dos Bancos: el Banco 0 y el Banco 1. En los
primeros espacios de memoria, estn contenidos los registros especiales de
configuracin y funcin del PIC, mientras que los dems espacios estn reservados
para el tratamiento de los datos y variables.

La seleccin de los Bancos se debe realizar cada vez que necesitamos manipular
algn registro especial o leer/escribir sobre alguna de las celdas de RAM. Esta
seleccin se realiza a travs del bit RP0 del registro STATUS.

Los registros de puertos PORTA y PORTB son los encargados de comunicarse
con los dispositivos externos, mientras que los registros TRISA y TRISB son los
encargados de configurar el sentido de trabajo de los puertos.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.

http://members.fortunecity.es/electronico/tutoriales/tutopic16f84/p3.html
Aqu, hallar informacin sobre la organizacin de la memoria del PIC.

http://www.terra.es/personal/fremiro/registros.htm
En esta pgina web, hallar informacin sobre los registros de este PIC.












MI CROCONTROLADORES 29
CIBERTEC CARRERAS PROFESIONALES




EL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad bsica utilizando el Microcontrolador PIC16F84. Los
circuitos sern implementados en protoboards y deber asegurarse que las
conexiones realizadas de polarizacin, reinicio, oscilacin y puertos sean 100%
correctas. Por otro lado, los programas que activan el funcionamiento de los circuitos
se desarrollarn empleando el entorno de trabajo MPLAB pero utilizando comandos de
lenguaje C. Estos debern garantizar la perfecta configuracin de los puertos A y B del
Microcontrolador y el funcionamiento mnimo del 80% de las tareas propuestas.


TEMARIO
Juego de instrucciones
Gestin de puertos

ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.

Los alumnos configuran el sentido de trabajo de los puertos.

Los alumnos leen y escriben informacin sobre los puertos.



UNIDAD DE
APRENDIZAJE
1
30
CARRERAS PROFESIONALES CIBERTEC
1.4 JUEGO DE INSTRUCCIONES

Antes de leer o escribir informacin sobre alguno de los puertos del Microcontrolador,
es necesario conocer sus instrucciones. En cualquier sistema basado en
Microcontrolador o Microprocesador, las instrucciones permiten llevar a cabo todas las
tareas y funciones propuestas para una aplicacin. Es importante identificar sus
funciones individuales y, ms an, interrelacionarlas para crear los programas. El
PIC16F84 soporta 35 instrucciones, las cuales, a continuacin, se describen
brevemente segn su orientacin:

1.4.1 Orientadas al byte

Orientadas al BYTE
La letra d indica el destino de la operacin, si d = 0 el destino de la
operacin es el registro de trabajo W, pero si d = 1 el destino ser el
elemento F (registro especial, celda de RAM o variable).
ADDWF F,d Suma el registro W y el elemento F
ANDWF F,d AND lgico entre W y F
CLRF F Borra todos los bits de F
CLRW Borra todos los bits de W
COMF F,d Complementa el valor de F
DECF F,d Disminuye en uno el valor de F
DECFSZ F,d Disminuye en uno el valor de F y salta si se hizo cero
INCF F,d Aumenta en uno el valor de F
INCFSZ F,d Aumenta en uno el valor de F y salta si se hizo cero
IORWF F,d OR lgico entre W y F
MOVFW F Transfiere el valor de F a W
MOVWF F Transfiere el valor del registro W a F
NOP Ninguna operacin, solo consume un ciclo de mquina
RLF F,d Rota hacia la izquierda un bit F a travs del Carry
RRF F,d Rota hacia la derecha un bit F a travs del Carry
SUBWF F,d Resta el registro W y F
SWAPF F,d Intercambia los nibbles de F
XORWF F,d XOR lgico entre W y F

Ejemplos:

ADDWF PORTB,1 ; PORTB = W + PORTB
ADDWF PORTB,0 ; W = W + PORTB
CLRF PORTA ; PORTA = 0 (todos sus bits)
CLRF TRISB ; TRISB = 0 (todos sus bits)
CLRW ; W = 0 (todos sus bits)
DECF VALOR ; VALOR = VALOR 1
INCF VARIABLE ; VARIABLE = VARIABLE + 1
MOVFW PORTB ; W = PORTB
MOVWF INDF ; INDF = W
SUBWF MAXIMO,1 ; MAXIMO = MAXIMO W
SUBWF MAXIMO,0 ; W = MAXIMO - W





MI CROCONTROLADORES 31
CIBERTEC CARRERAS PROFESIONALES
1.4.2 Orientadas al bit

Orientadas al BIT
La letra b indica el bit a manipular del elemento F (registro especial,
celda de RAM o variable). Si el bit tiene nombre, se colocar su
nombre en la posicin b; de lo contrario, tendr que indicarse la
posicin que ocupa el bit dentro del elemento F.
BCF F,b Pone a cero (0) el bit b del elemento F
BSF F,b Pone a uno (1) el bit b del elemento F
BTFSC F,b Salta si el bit b de F est en cero
BTFSS F,b Salta si el bit b de F est en uno

Ejemplos:

BCF STATUS,RP0 ; Pone a cero (0) el bit RP0 del registro STATUS
BSF PORTA,0 ; Pone a uno (1) el bit menos significativo del PUERTO A.
BCF TRISA,2 ; Pone a cero el tercer bit del registro TRISA.
BSF EECON1,7 ; Pone a uno el bit ms significativo del registro EECON1.
BTFSC PORTB,0 ; Salta si el bit menos significativo del PUERTO B es cero.
BTFSS PORTA,4 ; Salta si el bit ms significativo del PUERTO A es uno.

1.4.3 Orientadas al control

Constantes y control
La letra K es el operando constante que puede tomar cualquier valor
numrico o literal comprendido entre 0 y 255. Este valor puede ser
expresado en decimal, hexadecimal o binario. El destino de todas
las operaciones donde interviene K es el registro W.
ADDLW K Suma W ms K
ANDLW K AND lgica entre W y K
CALL ETIQUETA Se llama a ejecucin la subrutina cuya direccin lo indica ETIQUETA
CLRWDT Borra el temporizado de la funcin watchdog
GOTO K Salta a la direccin indicada en la ETIQUETA
IORLW K OR lgico entre W y K
MOVLW K Transfiere a W el valor de K
RETFIE Retorno de una subrutina de interrupcin
RETLW K Retorno de una subrutina comn cargando una constante en W
RETURN Retorno de una subrutina comn
SLEEP Ingreso al modo de descanso
SUBLW K Resta K menos W
XORLW K Xor lgico entre W y K

Ejemplos:

ADDLW .100 ; W = W + 100 (decimal)
ADDLW 0X35 ; W = W + 35h (hexadecimal)
ADDLW B11110001 ; W = W + 11110001b (binario)
ANDLW B11001100 ; W = W AND 11001100b
CALL DELAY ; Invoca la ejecucin de la funcin DELAY.
GOTO REPEAT ; Salta a la etiqueta REPEAT
MOVLW 0X55 ; W = 55h
RETLW .10 ; Retorna de una subrutina y transfiere el valor 10 a W
RETLW 0x58 ; Retorna de una subrutina y transfiere el valor 58h a W
SUBLW .200 ; W = 200 W
32
CARRERAS PROFESIONALES CIBERTEC
1.4.4 Algunos comandos c

A continuacin se muestran algunos comandos en C que emplearemos en la edicin
de los programas y que se relacionan con las instrucciones en Assembler del
Microcontrolador:

Orientadas al BYTE
Assembler Comandos en C
Comentario
MOVFW PORTA DATO=input_a();
DATO lee la informacin del puerto A
MOVWF PORTA output_a(DATO);
DATO es el valor que se escribe en el puerto A
MOVFW PORTB DATO=input_b();
DATO lee la informacin del puerto B
MOVWF PORTB output_b(DATO);
DATO es el valor que se escribe en el puerto B
MOVWF TRISA set_tris_a(CONF);
CONF es el valor de configuracin del puerto A
MOVWF TRISB set_tris_b(CONF);
CONF es el valor de configuracin del puerto B


Orientadas al BIT
Assembler Comandos en C
Comentario
BCF PORTA,2 output_low(PIN_A2);
Se fija a cero el pin 2 del puerto A
BSF PORTB,0 output_high(PIN_B0);
Se fija a uno el pin 0 del puerto B
BSF PORTA,4 output_high(PIN_A4);
Se fija a uno el pin 4 del puerto A
BCF PORTB,5 output_low(PIN_B5);
Se fija a cero el pin 5 del puerto B
BTFSC PORTA,1 if(!input(PIN_A1);
Evala si el pin 1 del Puerto A es cero
BTFSS PORTB,7 if(input(PIN_B7);
Evala si el pin 7 del Puerto B es uno
BTFSS PORTA,0 if(input(PIN_A0);
Evala si el pin 0 del Puerto A es uno
BTFSC PORTB,3 if(!input(PIN_B3);
Evala si el pin 3 del Puerto B es cero



1.5 GESTIN DE PUERTOS

Sabemos que se dispone de los puertos A y B para comunicar al PIC con cualquier
elemento externo y no es suficiente conectar los dispositivos a estos puertos para que
empiecen a funcionar.

1.5.1 Configuracin
Es necesario indicarle al Microcontrolador el sentido de trabajo de los elementos que
hemos conectado a sus puertos; de no hacerlo, en el mejor de los casos, nuestro
sistema no funcionara bien y en el peor de los casos quemaramos algunos bits de los
puertos.

1.5.1.1 Entradas o salidas
Cada pin de los puertos es configurable independientemente y solo puede trabajar en
un solo sentido, como entrada o salida. La configuracin se realiza a travs de los
registros TRISA y TRISB, donde TRISA configura al PUERTO A y TRISB configura el
PUERTO B. Un cero sobre los bits de los registros TRIS configura como salida los
pines relacionados en los PUERTOS, mientras que un uno deja configurado como
entrada los pines relacionados en los PUERTOS.

MI CROCONTROLADORES 33
CIBERTEC CARRERAS PROFESIONALES
1.5.1.2 Ejemplos de configuracin
Considere que al puerto A se ha conectado leds y switches segn el siguiente
esquema:




El registro de configuracin por manipular sera TRISA y sus bits deberan verse segn
el esquema:




Para lograr esto, utilizamos la siguiente instruccin:

set_tris_a(0XF4);

F4 en hexadecimal es 11110100 en binario.

Supongamos ahora que al PUERTO B se le ha conectado un rel, leds, un switch, un
sensor ptico y un pulsador segn el siguiente esquema:





El registro de configuracin por manipular sera TRISB y sus bits deberan verse segn
el esquema:





Para lograr esto, utilizamos la siguiente instruccin:

set_tris_b(0X31);

31 en hexadecimal es 00110001 en binario.

1.5.1.3 Seleccin de los bancos
Antes de manipular los bits de cualquier registro, debemos de asegurarnos que nos
encontramos en el banco al que pertenece este registro y, para ello, debemos
seleccionar el Banco adecuado utilizando el bit RP0 del registro STATUS.

Recordemos que si este bit recibe 0, seleccionamos el Banco 0; de lo contrario, si este
bit recibe un uno, estaramos seleccionando el Banco 1.

Las instrucciones relacionadas seran:
BCF STATUS,RP0 ;Selecciona el Banco 0
BSF STATUS,RP0 ;Selecciona el Banco 1

Recordemos que los registros de configuracin TRISA y TRISB se encuentran
ubicados en el Banco 1; por lo tanto, la configuracin adecuada para los dos casos
anteriores de conexin seran:

34
CARRERAS PROFESIONALES CIBERTEC
Para la configuracin del PUERTO A:
BSF STATUS,RP0 ;Seleccin del Banco 1
BCF TRISA,0 ;OUT (LED)
BCF TRISA,1 ;OUT (LED)
BSF TRISA,2 ;IN (SWITCH)
BCF TRISA,3 ;OUT (LED)
BSF TRISA,4 ;IN (SWITCH)

Para la configuracin del PUERTO B:
BSF STATUS,RP0 ;Seleccin del Banco 1
BSF TRISB,0 ;IN (PULSADOR)
BCF TRISB,1 ;OUT (LED)
BCF TRISB,2 ;OUT (LED)
BCF TRISB,3 ;OUT (LED)
BSF TRISB,4 ;IN (SENSOR)
BSF TRISB,5 ;IN (SWITCH)
BCF TRISB,6 ;OUT (LED)
BCF TRISB,7 ;OUT (RELE)

Un trabajo muy tedioso sin duda, pero tenemos buenas noticias, como emplearemos el
compiler C de MPLAB para los programas, nos olvidamos de este apartado, pues, este
compilador incluye automticamente las instrucciones de seleccin de los bancos
segn sean los registros que se estn manipulando en el programa. Una gran ventaja
sin duda.


1.5.2 Lectura y escritura
Llegado a este punto, estamos listos para comunicar (manipular) al Microcontrolador
con los dispositivos externos.

1.5.2.1 Lectura
Leer significa obtener informacin de los puertos, es decir, saber en qu estado se
encuentran los dispositivos de entrada. Para ello, disponemos de dos tipos de
instruccin: la que est orientada al byte y las que estn orientadas al BIT. Si se desea
capturar la informacin de varios bits de un puerto al mismo tiempo, ser necesario
utilizar DATO=input_a(); o DATO=input_b();, segn sea el puerto que deseamos leer.
Pero, si se desea saber el estado de un solo bit, conviene utilizar if(input(PIN_XN); o
if(!input(PIN_XN);, segn sea el estado que deseamos averiguar. X representa A o B
(puerto A o B) y N la posicin del bit (0 a 7).

Si tuvisemos un teclado conectado al Microcontrolador, tal
como se muestra en el esquema de la derecha, sera
necesario utilizar la instruccin orientada al byte porque el
teclado tiene varios bits.
Cada vez que necesitemos leer el teclado, utilizaramos
DATO=input_b();, con lo cual, la informacin obtenida del
teclado se transferira sobre la variable DATO tipo char. Que
hacer con la informacin obtenida del teclado, depender de la aplicacin planteada.

MI CROCONTROLADORES 35
CIBERTEC CARRERAS PROFESIONALES
Si tuviramos un pulsador, switch o sensor ptico conectado a
alguna de las entradas de los ports y querramos averiguar en qu
estado se encuentra este, estaramos obligados a utilizar las
instrucciones orientadas al bit. Si se requiere saber que el pulsador
est en 0 usaremos la instruccin; para este caso, if(!input(PIN_A2);.
Pero, si es requerido saber que este pulsador se encuentra en 1,
utilizaremos la instruccin if(input(PIN_A2);. Qu hacer si el pulsador
estuvo en cero o uno, depender nuevamente de las condiciones de la aplicacin
implementada.

1.5.2.2 Escritura
Escribir significa enviar informacin hacia los puertos, es decir, fijar a 0 1 los bits de
los dispositivos de salida y para esto disponemos de dos tipos de instruccin: la que
est orientada al byte y las que estn orientadas al BIT. Si se desea fijar el estado de
varios bits de un puerto al mismo tiempo, ser necesario utilizar output_x(DATO);,
donde x es a o b (puerto A o B) y DATO la variable o constante que se escribir en el
puerto. Pero, si se desea manipular el estado de un solo bit, conviene utilizar
output_low(PIN_XN); o output_high(PIN_XN); segn sea el estado que deseamos fijar.
X representa A o B (puerto A o B) y N la posicin del bit (0 a 7).

Si tenemos un display de 7 segmentos conectado uno de los
puertos, sera necesario manipular varios bits al mismo tiempo y,
por lo tanto, la instruccin conveniente sera orientada al byte.
Supngase que se desea apagar el display ctodo comn, es
decir, sus segmentos se apagan con ceros; la instruccin a usar
sera output_b(0x00);.

Sin embargo, si en lugar de displays se tiene leds conectados a los
puertos, tal como se muestra en la figura de la derecha, las
instrucciones por utilizar seran orientadas al bit, segn se requiera.
Suponiendo que los leds se encuentran en conexin normal, es
decir, se apagan con 0 y se encienden con 1, cules seran las
instrucciones para apagar el led conectado al puerto A y encender el
que est conectado al puerto B? Las instrucciones seran:
output_low(PIN_A3); y output_high(PIN_B4); respectivamente.

Si tuviera el siguiente esquema y le pidieran transferir
constantemente la informacin del teclado sobre el display,
Cules seran las instrucciones de lectura y escritura para
estos puertos? La instruccin de lectura sera
DATO=input_b(); y la de escritura sera output_a(DATO);.




1.5.3 Programas aplicativos

A continuacin, se propondrn aplicaciones bsicas de escritura y lectura de puertos.
Se plantearn circuitos con sus respectivas condiciones lgicas, y sobre la base de
estos, desarrollaremos los programas empleando comandos de lenguaje C que
sern compilados por el C Compiler de MPLAB. Este compilador tiene varias
ventajas: una es el empleo de comandos mucho ms entendibles en comparacin a
los comandos originales en Assembler, otra es el ahorro de lneas de programacin
relacionadas con la seleccin de los bancos de RAM, este compilador incluye
automticamente los comandos de seleccin, segn los registros manipulados (una
36
CARRERAS PROFESIONALES CIBERTEC
gran ventaja). Una ms es facilitar la tarea de configuracin de funciones especiales
como de los timers, interrupciones, comunicacin serie, conversin anlogo digital, etc,
permitiendo que muchas veces en una sla lnea quede configurada una funcin
especial de estas. Otra ms es contar con la estructura de programacin de alto nivel,
que facilita mucho la edicin, anlisis y correccin de los programas.

1.5.3.1 Escritura sobre cuatro leds
Realice el programa que encienda los cuatro leds conectados al
PORTB durante 1 segundo, luego los apague durante otro
segundo. Este proceso se debe repetir indefinidamente.
Como los leds se encuentran en conexin normal, se apagarn
recibiendo un 0 sobre el pin de conexin y se encendern
recibiendo un 1 sobre el pin conectado.
Pero, antes de lanzarnos con la ejecucin de las instrucciones
que enciendan y apaguen los leds, debemos recordar la
configuracin de trabajo del puerto B, es decir, el sentido. Como
solo tiene conectado leds, estas cuatro patillas deben trabajar
como salidas, lo cual debemos realizar utilizando el registro TRISB.

Empecemos con la configuracin. Para esto, debemos manipular el registro TRISB:

set_tris_b(0xF0); // Los pines RB0 a RB3 quedan configurados para trabajar como
// salidas, y el resto de pines (RB4 a RB7) como entradas.

Culminada la configuracin, podemos encender y apagar los leds segn lo requerido,
esto significa manipular los pines RB0, RB1, RB2 y RB3 del PORTB:

do{

output_low(PIN_B0); // Apagar
output_low(PIN_B1); // los LEDs
output_low(PIN_B2); // desde RB0
output_low(PIN_B3); // hasta RB3

delay_ms(1000); // esperar 1s.

output_high(PIN_B0); // encender
output_high(PIN_B1); // los LEDs
output_high(PIN_B2); // desde RB0
output_high(PIN_B3); // hasta RB3

delay_ms(1000); // esperar 1s.

}while(TRUE); // repetir el bucle


Notemos que ya no es necesario seleccionar el banco 1 de RAM para configurar los
registros de configuracin (TRIS), ni tampoco es necesario seleccionar el banco 0 para
manipular los contactos de los puertos (PORT).

MI CROCONTROLADORES 37
CIBERTEC CARRERAS PROFESIONALES
Finalmente, el programa ordenado seria el siguiente:

//---------- Cabecera -----------

#include <16f84.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
// XT: oscilacin XT (<=4MHZ)
// NOWDT: watchdog desactivado
// NOPROTECT: flash desprotegida de lectura
// PUT: Retardo al arranque de 72us
#use delay (clock=4000000) // oscilador a 4 MHz

//-----------Programa principal-------------

void main(void)
{

set_tris_b(0xF0); // Los pines RB0 a RB3 quedan configurados para trabajar como
// salidas, y el resto de pines (RB4 a RB7) como entradas.

do{

output_low(PIN_B0); // Apagar
output_low(PIN_B1); // los LEDs
output_low(PIN_B2); // desde RB0
output_low(PIN_B3); // hasta RB3

delay_ms(1000); // esperar 1s.

output_high(PIN_B0); // encender
output_high(PIN_B1); // los LEDs
output_high(PIN_B2); // desde RB0
output_high(PIN_B3); // hasta RB3

delay_ms(1000); // esperar 1s.

}while(TRUE); // repetir el bucle

}

1.5.3.2 Manipulacin de un led y un pulsador
Realice el programa que mantenga apagado el led hasta que se
active el pulsador. Es decir, el led permanecer apagado y se
encender apenas se active el pulsador.
Como el led est en conexin normal, se apagar con 0 y se
encender con 1.
Segn el arreglo del pulsador, cuando este no est activado, la
patilla RA0 (PORTA,0) est conectada a tierra a travs de la
resistencia, es decir, el pulsador, en estado natural, genera un 0
sobre el pin RA0. Y cuando se active el pulsador, el pin RA0
queda conectado a 5v. Es decir, en estado activado, el pulsador
genera un 1 sobre la patilla RA0.
Recordemos, por ltima vez que, antes de manipular los puertos, estos deben ser
configurados a travs del los registros TRIS.

38
CARRERAS PROFESIONALES CIBERTEC
Configuracin:

set_tris_a(0xFF); // El pin RA0 queda configurado para trabajar como entrada
// y el resto de pines del puerto A, tambin.

set_tris_b(0xFE); // El pin RB0 queda configurado para trabajar como salida,
// mientras que, el resto de pines del puerto B (RB1 a RB7)
//como entradas.

Manipulacin de los puertos:

do{
if(input(PIN_A0)){ // Si el pulsador est activado (en uno)
output_high(PIN_B0); } // encender el LED
else { // en caso contrario
output_low(PIN_B0); } // apagar el LED
}while(TRUE); // Repetir el bucle


El programa completo sera:

//---------- Cabecera -----------

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

//-----------Programa principal-------------

void main(void)
{
set_tris_a(0xFF); // El pin RA0 queda configurado para trabajar como entrada
// y el resto de pines del puerto A, tambin.

set_tris_b(0xFE); // El pin RB0 queda configurado para trabajar como salida,
// mientras que, el resto de pines del puerto B (RB1 a RB7)
//como entradas.

do{
if(input(PIN_A0)){ // Si el pulsador est activado (RA0=1)
output_high(PIN_B0); } // encender el LED (RB0=1)
else { // en caso contrario
output_low(PIN_B0); } // apagar el LED (RB0=0)
}while(TRUE); // Repetir el bucle

}


MI CROCONTROLADORES 39
CIBERTEC CARRERAS PROFESIONALES
1.5.3.3 Manipulacin de un led y dos pulsadores
Realice el programa que permita encender el led cada vez que se
active el pulsador P1 y apagar el led cada vez que se active el
pulsador P2. El led debe empezar apagado.
El led est en conexin contraria; por lo tanto, se encender con
un 0 y se apagar con un 1.
Los pulsadores tienen la misma conexin que el pulsador del
problema anterior; por lo tanto, mientras no se activan, generan un
0 sobre su pines y generan un 1 sobre sus patillas cada vez que
se activen.


Desarrollemos el programa:

//---------- Cabecera -----------

#include <16f84.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz

//-----------Programa principal-------------

void main(void)
{
set_tris_a(0xFF); // Los pines RA0 y RA1 quedan configurados como entrada
// y el resto de pines del puerto A, tambin.

set_tris_b(0xFE); // El pin RB0 queda configurado para trabajar como salida,
// mientras que, el resto de pines del puerto B (RB1 a RB7)
//como entradas.

output_high(PIN_B0); // el LED empieza apagado

do{
if(input(PIN_A0)){ // Si el pulsador P1 est activado (RA0=1)
output_low(PIN_B0); } // encender el LED (RB0=1)
else if (input(PIN_A1)){ // si el pulsador P2 est activado (RA1=1)
output_high(PIN_B0); } // apagar el LED (RB0=0)
}while(TRUE); // Repetir el bucle

}

1.5.3.4 Escritura sobre un display
Realice el programa que muestre sobre el display el nmero 9.
Tenga en cuenta que el display es ctodo comn, es decir, sus
segmentos se encienden con unos (1) y
se apagan con ceros (0). Adems, la
conexin de cada uno de sus
segmentos al puerto B se muestra en la
figura de la derecha. Segn esta
adaptacin, el bit PORTB,0 estara conectado al segmento a del display, el bit
PORTB1 al regento b y as sucesivamente. Con ello, podemos armar una tabla que
relacione los nmeros del 0 al 9 sobre el display con los valores que se deben
transferir sobre el PORTB. Para este problema, slo es necesario el nmero 9.
40
CARRERAS PROFESIONALES CIBERTEC
Veamos qu valor se debe enviar por el PORTB para que aparezca el nmero
requerido.

Segmentos p g f e d c b a
0 = OFF
1 = ON
Bits del PORTB 7 6 5 4 3 2 1 0
Nmero 9 0 1 1 0 1 1 1 1

El nmero 9 necesita encender (1) los segmentos a, b, c, d, f y g del display, los
dems segmentos, e y p, deben apagarse (0).

Desarrollemos el programa:

//---------- Cabecera -----------

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

//-----------Programa principal-------------

void main(void)
{

set_tris_b(0x00); // Todos los pines del puerto B (RB0 a RB7) quedan configurados
// para trabajar como salidas.

do{
output_high(PIN_B0); // Encender el segmento a
output_high(PIN_B1); // encender el segmento b
output_high(PIN_B2); // encender el segmento c
output_high(PIN_B3); // encender el segmento d
output_low(PIN_B4); // apagar el segmento e
output_high(PIN_B5); // encender el segmento f
output_high(PIN_B6); // encender el segmento g
output_low(PIN_B7); // apagar el punto
}while(TRUE); // repetir el bucle

}

1.5.3.5 Manipulacin de un display y dos pulsadores
Realice el programa que muestre sobre el display el nmero 8
cada vez que se active el pulsador P1 y cada vez que se active
P2 muestre el nmero 0. Tenga en
cuenta que la conexin al PORTB es
la misma que la conexin del
problema anterior, pero el tipo de
display ya no es ctodo comn, sino
nodo comn, eso quiere decir que sus segmentos se encienden
con ceros (0) y se apagan con unos (1). Los pulsadores, segn
su arreglo, generan los mismos cambios que en los problemas
anteriores: 0 para OFF y 1 para ON. Apenas inicie el programa, el display debe tener
apagado todos sus segmentos.

MI CROCONTROLADORES 41
CIBERTEC CARRERAS PROFESIONALES
Armemos la tabla para los nmeros 8 y 0:

Segmentos p g f e d c b a
1 = OFF
0 = ON
Bits del PORTB 7 6 5 4 3 2 1 0
Nmero 8 1 0 0 0 0 0 0 0
Nmero 0 1 1 0 0 0 0 0 0

Para mostrar el nmero 8 sobre el display el valor en binario es 10000000 pero en
hexadecimal es 80, el nmero 0 sobre el display tiene el valor binario 11000000 pero
en hexadecimal es C0. Los valores en hexadecimal 80 y C0 se emplearn para facilitar
la visualizacin sobre el display.

Iniciemos el programa:

//---------- Cabecera -----------

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

//-----------Programa principal-------------

void main(void)
{
set_tris_b(0x00); // configurar el PORTB completo como salida.
set_tris_a(0xFF); //configurar el PORTA completo como entrada.
output_b(0xFF); // apagar el display

do{
if(input(PIN_A2)){ // si el pulsador P1 est activado (RA2=1)
output_b(0x80);} // mostrar el nmero 8 sobre el display (0x80)
else if (input(PIN_A3)){ // si el pulsador P2 est activado (RA3=1)
output_b(0xC0);} // mostrar el nmero 0 sobre el display (0xC0)
}while(TRUE); // repetir el bucle.
}



42
CARRERAS PROFESIONALES CIBERTEC

Resumen






El PIC16F84 soporta 35 instrucciones y estn organizadas en tres grupos: las
orientadas al byte, orientadas al bit, y las literales y de control.

Las instrucciones orientadas al bytes permiten transferir datos de 8 bits entre las
memorias y los registros. Las instrucciones orientadas al bit permiten manipular
selectivamente el estado de un bit de las celdas de memoria o registros y tambin
permiten averiguar en qu estado se encuentra un bit. Las instrucciones literales
permiten operaciones entre el registro W y cualquier constante de 8 bits.

El acceso a los puertos (PORTA y PORTB) inicia con su configuracin a travs de
los registros TRISA y TRISB. Un cero sobre los bits de los registros TRIS configura
como salida a los bits relacionados en los POTS y un uno sobre los registros TRIS
configura como salida sus bits asociados en los PORTS.

Los puertos (A y B) se encuentran ubicados en el Banco 0 de RAM, mientras que
los registros de configuracin TRIS se encuentran ubicados en el Banco 1. El
Banco 0 se selecciona fijando a 0 el bit RP0 del registro STATUS, mientras que el
Banco 1 se habilita colocando un 1 sobre el bit RP0.

Programar al PIC empleando comandos de Lenguaje C es mucho ms fcil y
emplear el compiler C de MPLAB, ahorra la edicin de las instrucciones de
seleccin de los bancos de RAM, estas se incluyen automticamente.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.

http://perso.wanadoo.es/luis_ju/pic/pic04.html
Aqu, hallar informacin sobre la configuracin de los puertos.

http://perso.wanadoo.es/chyryes/tutoriales/pic13.htm
Aqu, hallar programas que manipulan los puertos.
MI CROCONTROLADORES 43
CIBERTEC CARRERAS PROFESIONALES




EL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad bsica utilizando el Microcontrolador PIC16F84. Los
circuitos sern implementados en protoboards y deber asegurarse que las
conexiones realizadas de polarizacin, reinicio, oscilacin y puertos sean 100%
correctas. Por otro lado, los programas que activan el funcionamiento de los circuitos
se desarrollarn empleando el entorno de trabajo MPLAB pero utilizando comandos de
lenguaje C. Estos debern garantizar la perfecta configuracin de los puertos A y B del
Microcontrolador y el funcionamiento mnimo del 80% de las tareas propuestas.


TEMARIO
Gestin de RAM
Gestin de Temporizacin

ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.

Los alumnos leen y escriben sobre la memoria RAM.

Los alumnos configuran y ponen en marcha el temporizador.



UNIDAD DE
APRENDIZAJE
1
44
CARRERAS PROFESIONALES CIBERTEC
1.6 GESTIN DE RAM

Como ya se mencion en pginas anteriores, esta memoria sirve para el tratamiento
de datos y variables, y se puede acceder a sus celdas en dos modos: directo e
indirecto. Las celdas disponibles van desde la direccin 0Ch hasta la 4Fh (68 celdas).

1.6.1 Acceso directo
La lectura o escritura de la memoria RAM siempre
se realiza utilizando el registro de trabajo W para la
transferencia del dato, mientras que el
direccionamiento de la celda
se realiza utilizando como
operando directamente la direccin de la celda o la
variable asignada a la direccin.

1.6.1.1 Escritura de datos
Si deseamos escribir sobre la
memoria utilizando como
operando la direccin de la celda, utilizaramos la
instruccin MOVWF DIRECCION, donde
DIRECCION es cualquier celda desde la 0Ch a la
4Fh.
Por ejemplo, suponga que desea escribir el valor
50 en la celda de memoria 30h. Primero,
transferimos el dato 50 al registro W: MOVLW .50;
luego, escribimos (transferimos) en la celda 30h
este dato: MOVWF 0X30.

Si, en lugar de la direccin, se conoce el nombre
de la variable asociada a la celda de memoria,
este toma el lugar del operando DIRECCION. As,
la instruccin para la escritura ser MOVWF
VARIABLE, donde obviamente VARIABLE es el nombre de la direccin de la celda
que deseamos manipular. Supongamos que la direccin de la celda 20h tiene
asociada la variable de nombre CELDA20 y queremos escribir sobre esta el valor 55h,
empezamos transfiriendo el dato 55h al registro W: MOVLW 0X55. Enseguida,
transferiramos este dato sobre la variable CELDA20 (celda 20h): MOVWF CELDA20.

1.6.1.2 Lectura de datos
Al igual que la escritura, la transferencia de los datos pasan por el
registro W y la direccin ser indicada directamente o a travs de
una variable. La instruccin asociada a la lectura es MOFW CELDA, donde CELDA es
directamente la direccin de la celda o la variable asociada a la direccin de la celda.
Por ejemplo, la celda de memoria 18h tiene
asociada la variable de nombre STORE y deseamos
leer su contenido para transferirlo por el PORTB. Primero, debemos transferir el
contenido de la celda hacia el registro W: MOVFW 0X18 o MOVFW STORE y,
segundo, transferir el valor del registro W sobre el PORTB: MOVWF PORTB.

MI CROCONTROLADORES 45
CIBERTEC CARRERAS PROFESIONALES
1.6.2 Acceso indirecto
Si se van a manipular cadenas de datos y, por lo tanto, la lectura o escritura sobre las
celdas de memoria es consecutiva y repetitiva, se hace necesario utilizar un puntero
que se desplace entre las direcciones consecutivas de la memoria para facilitar el
acceso. Este puntero es el registro FSR y cada vez que necesitemos almacenar o leer
un bloque de datos de la memoria RAM, este debe apuntar a la primera celda del
espacio a manipular.

Una vez direccionada la memoria ya se puede leer o escribir sobre esta y de eso se
encargan el registro INDF y el registro de trabajo
W. Para escribir en una celda de memoria, se
transfiere el valor de W a INDF a travs de la
instruccin MOVWF INDF y, para leer de una
celda de memoria, se transfiere el valor de INDF
a W a travs de la instruccin MOVFW INDF.

El espacio direccionable de la memoria RAM
slo est mapeado para el banco 0 y en este
modo indirecto se selecciona a travs de dos
bits: uno es el bit ms significativo del registro
FSR (bit 7) y el otro es el bit IRP del registro
STATUS. Debemos asegurar que estos dos bits
se encuentren a cero para accesar
adecuadamente a la RAM.

El grfico de la derecha resume lo explicado.

1.6.2.1 Lectura de datos
Suponga que en la memoria RAM, a partir de la celda 10h, se encuentra almacenada
una cadena de datos y desea transferirlos uno tras otro por el PORTB. Primero, se
debe seleccionar el Banco 0, fijando a 0 el bit IRP del registro STATUS y el bit 7 del
registro FSR. En segundo lugar, se debe direccionar al inicio de la
cadena. En este caso, la direccin 10h debe ser transferida sobre
el registro de direccionamiento indirecto FSR. En tercer lugar, se
debe leer el dato del registro INDF y transferirlo por el PORTB. Por
ltimo, se debe avanzar a la siguiente celda de memoria, lo cual
se lograra aumentando el valor del registro FSR. Luego de esto,
se vuelve a leer el dato y se transfiere otra vez por el PORTB. Se
aumenta la direccin del registro FSR tantas veces como datos se deseen leer de la
memoria.

En instrucciones sera as:

INICIO: BCF STATUS,IRP ; IRP = 0
BCF FSR,7 ; Bit 7 = 0
MOVLW 0X10 ; W = 10h
MOVWF FSR ; FSR = Direccin de inicio de cadena
MOVFW INDF ; W = INDF (DATO de la memoria)
MOVWF PORTB ; PORTB = W = DATO
INCF FSR ; Avanza a la siguiente celda

Nuevamente nos topamos con una tarea simple (leer datos de memoria) pero tediosa
en cuanto al empleo y secuencia de las de instrucciones en Assembler. Felizmente, el
entorno de compilacin del C Compiler nos facilita esta tarea. Para realizar este
proceso se emplean dos variables, una para declarar una tabla que contenga los
46
CARRERAS PROFESIONALES CIBERTEC
valores que deseemos, o que simplemente separe el espacio para almacenar
informacin y la segunda para acceder a esta desplazndonos entre las diferentes
posiciones de la tabla, ya sea para escribir o leer de esta.

Para trasladar estos 10 valores de la tabla por el puerto B las instrucciones seran:

char tabla[10]={0x67,0x7F,0x07,0x7D,0x6D,0x66,0x4F,0x5B,0x06,0x3F};
// esta es la declaracin de la tabla con los 10 valores (los que se requieran).

char i; // esta es la declaracin de la variable que apuntar a los datos de la tabla.

for (i=0;i<10;++i) // bucle for para 10 repeticiones
{
output_b(tabla[i]); // escribe en el puerto B cada dato de la tabla
}

De este modo es muchsimo ms fcil acceder a la RAM.


1.6.3 Programa aplicativo

1.6.3.1 Visualizacin consecutiva de datos
Realice el programa que permita transferir consecutivamente 10
valores sobre el display. Los valores son los cdigos del 0 al 9 y
se deben almacenar consecutivamente en RAM, para esto se
realizar un arreglo y para direccionarlas se emplear un
puntero.
El display debe iniciar apagado y, por cada vez que se active el
pulsador, los diez valores almacenados en la memoria sern
volcados sobre el display.
El display es del tipo ctodo comn (0 off y 1 on) y el pulsador
genera un 0 por su estado off y un 1 por su estado on.
Para direccionar las celdas de memoria que contienen los cdigos del 0 al 9, se
emplear un puntero.

Desarrollo del programa:

//---------- Encabezado -----------

#include <16f84.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz

//-----------Programa principal-------------

void main(void)
{
char i; // i ser el puntero para direccionar los cdigos del 0 al 9
// a continuacin se declara el arreglo tabla y se asignan
// los cdigos del 0 al 9 para un display ctodo comn

int tabla[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};

set_tris_b(0x00); // todo el puerto B configurado como salida.
set_tris_a(0xFF); // todo el puerto A configurado como entrada
MI CROCONTROLADORES 47
CIBERTEC CARRERAS PROFESIONALES

output_b(0); // apaga el display

do{
if(input(PIN_A2)) // si el pulsador est activado (RA2=1)
for (i=0;i<10;++i){ // aplicar la secuencia for que
output_b(tabla7s[i]); // accede a cada cdigo, lo muestra en el display
delay_ms(1000);} // y genera un retardo de 1 segundo por cada visualizacin.
}while(TRUE); // repetir el bucle.
}


1.7 GESTIN DE TEMPORIZACIN

El PIC16F84 dispone de un dispositivo de temporizado de 8 bits denominado TMR0.
Este puede operar como temporizador o como contador. El propsito de disponer de
estas funciones es generar retardos o bases de tiempo (temporizado) o simplemente
contabilizar alguna cantidad de eventos o seales externas (contador). Indiferente de
la operacin, el objetivo es saber en qu momento culmin el retardo, la base de
tiempo o la cantidad de cuenta, para tomar seguramente alguna decisin importante
en el proceso. Para ello, se dispone del bit indicador T0IF, el cual se pone a 1 cada
vez que el registro de trabajo TMRO gener un desborde (paso de su valor mximo
FFh a su valor mnimo 00h, lo cual, significa que culmin el temporizado o la cuenta).
A partir del estado de este bit, se determina el proceso del temporizado o cuenta. Si
est en 0 es porque el proceso an est en marcha, mientras que, cuando est en 1,
es porque ya culmin el proceso. Si no se activa la interrupcin del timer/counter, es
necesario verificar constantemente el estado del bit T0IF para enterarnos del instante
de la culminacin del proceso, pero, si la interrupcin del timer/counter est activa, el
microprocesador ejecutar automticamente el algoritmo almacenado en la memoria a
partir de la direccin 0004h (vector de interrupcin).

El timer/counter tiene las siguientes caractersticas:

Dispone de un registro de trabajo de 8 bits (TMR0)
Se puede elegir un clock externo (RA4) o interno (f/4)
Se puede fijar el tipo de flanco (T0SE) de clock externo (subida o bajada)
Se establece y asigna un factor de divisin (PS2, PS1, PS0, PSA)
Interrumpe (T0IF) cuando el registro TMR0 se desborda (FFh a 00h)












48
CARRERAS PROFESIONALES CIBERTEC
1.7.1 Modos de operacin
El TMR0 puede operar en dos modos: Contador y Temporizador. Sin importar el modo
en que opere, el principio de trabajo es el mismo: ingresan los pulsos al registro de
trabajo y este aumenta hasta desbordarse, causando la activacin del bit T0IF.
1.7.1.1 Modo Contador
Cuando trabajamos con este modo, es porque queremos contabilizar pulsos externos,
provenientes, lo ms probable, de sensores. Es necesario seleccionar el clock externo,
fijar el tipo de flanco para el avance de la cuenta, anular el factor de divisin (a menos
que sea til) y, finalmente, inicializar el registro de trabajo.

El sensor genera pulsos formados por flancos de subida y bajada. Estos se aplican en
la entrada de reloj del registro de trabajo (TMR0) y causan el aumento, en uno, de su
valor por cada flanco, o de subida o bajada, segn la seleccin realizada. Recordemos
que este registro es de 8 bits, su valor mnimo es 00h y su valor mximo es FFh, es
decir, 0 y 255 respectivamente. Cuando el registro se encuentra en su valor mximo
(FFh o 255), y en ese instante recibe un flanco ms, este no puede pasar a 256; en
cambio, regresa a su valor mnimo y activa el bit de desborde T0IF.

1.7.1.1.1 Secuencia de configuracin
Supngase que deseamos contabilizar 100 pulsos provenientes de un sensor ptico.
El sensor tendr que ser conectado al pin RA4/T0CKI y la configuracin ser como se
muestra a continuacin:

1- Eleccin del clock externo BSF OPTION_REG, T0CS
2- Fijar flanco de subida para la cuenta BCF OPTION_REG, T0SE
3- Anular el factor de divisin BSF OPTION_REG, PSA
4- Inicializar el registro de trabajo MOVLW .156
MOVWF TMR0
Recuerde el registro OPTION

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

T0CS: Selector de la fuente de reloj para el TIMER0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4

T0SE: Selector del tipo de flanco externo para el TIMER0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMRE por flanco de subida del pin RA4/TOCKI

PSA: Desviador del factor de divisin de la seal de reloj
1: Hacia la funcin de WATCHDOG
0: Hacia la funcin del TIMER

Recordemos que el indicador T0IF se activa cuando el registro de trabajo pasa de su
valor mximo FFh (255) a su valor mnimo 00h (0). Y como nuestro registro de trabajo
aumentar en uno por cada flanco de subida del sensor, la activacin del indicador
T0IF ocurrir despus de 256 (desborde de 255 a 0) 156 (valor de inicializacin del
registro de trabajo) pulsos; los 100 pulsos que deseamos contabilizar. Como frmula,
el valor de inicializacin (VI) del registro de trabajo TMR0 se obtiene al restar 256
menos la cantidad de pulsos a registrar. VI = 256 #PULSOS.

1.7.1.2 Modo Temporizador
Cuando trabajamos en este modo, es porque deseamos generar retardos o bases de
tiempo, como el segundero de un reloj. Es obligado seleccionar el clock interno, el cual
obtiene la frecuencia del cristal dividida entre cuatro (f/4), de ser necesario, elegir un
factor de divisin y asignrselo al TMR0. La aparicin de cada pulso sobre la entrada
MI CROCONTROLADORES 49
CIBERTEC CARRERAS PROFESIONALES
de reloj del registro de trabajo (TMR0), har que este aumente en uno su valor, hasta
que en algn momento genere su desbordamiento y, por lo tanto, la activacin del
indicador T0IF. Cada pulso que llegue al registro de trabajo tiene una frecuencia que
se calcula de la siguiente manera:

F = (f/4)/factor de divisin = f/(4*factor de divisin)

Si a esta le aadimos la cantidad de pulsos a contar, tendramos:

F = f/(4*factor de divisin*#pulsos)

Pero, el tiempo transcurrido se calculara:

T = (4*factor de divisin*#pulsos)/f

Frecuencia F = f/(4*factor de divisin*#pulsos)
Tiempo T = (4*factor de divisin*#pulsos)/f

Si tendramos un cristal 4Mhz y querramos generar un retardo de 20ms. Cul sera
el factor de divisin y cuntos pulsos seran necesarios contabilizar para lograr dicho
temporizado?

Veamos: 20ms = 4*factord*#pulsos/4Mhz
20ms = factord*#pulsos * 1us ; ya que 1/Mhz es 1 microsegundo (1us)
20ms = factord*#pulsos* 1ms/1000 ; ya que 1us = 1ms/1000
20ms*1000 = factord*#pulsos*1ms
20000 = factord*#pulsos

Observe el registro OPTION para saber qu valores asignar al factor de divisin.

Registro OPTION

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

PS2-PS1-PS0: Selectores del factor de divisin de la seal de reloj

PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128

Haciendo el factord = 256 tendramos: 20000 = 256*#pulsos

De aqu, #pulsos = 20000/256 = 78

Por lo tanto, el registro TMR0 tendra que ser inicializado con el valor: 256 78 = 178

50
CARRERAS PROFESIONALES CIBERTEC
1.7.1.2.1 Secuencia de configuracin
Supngase que deseamos lograr un temporizado de 40ms:

1- Eleccin del clock interno f/4 BCF OPTION_REG, T0CS
2- Asignar el factor de divisin al timer BCF OPTION_REG, PSA
3- Establecer el factor 256 de divisin BSF OPTION_REG, PS0
BSF OPTION_REG, PS1
BSF OPTION_REG, PS2
4- Inicializar el registro de trabajo MOVLW .100
(256 156) MOVWF TMR0


Empleando los comandos del compilador PIC C Compiler:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_TIMER0(100);

Nuevamente, de este modo se ve ms fcil la programacin.


1.7.2 Programas aplicativos

1.7.2.1 Temporizado de un led
Realice el programa que permita generar una onda cuadrada
de 131.072ms de periodo sobre el pin RB0. Es decir, el nivel
alto en el pin RB0 debe durar 65.536ms y el nivel bajo tambin
debe durar 65.536ms.

Suponga que el cristal es de 4Mhz y recuerde utilizar la
frmula:

T = (4*factor de divisin*#pulsos)/f
Si usamos el valor mximo del factor de divisin (256) y el valor
mximo para el #pulsos (256), obtendramos el tiempo mximo
que se puede generar con el TMR0. Remplazando valores tenemos lo siguiente:
T = (4*256*256)/4Mhz = 256*256/1Mhz = 65,536us (1us = 1/1Mhz) = 65.536ms

Justamente el tiempo que necesitamos para los niveles alto y bajo de la onda
cuadrada. Recordemos que el indicador de desborde TOIF del TIMER0 se activar (1)
cada 65.536ms.

Para que se cuenten los 256 pulsos, el registro de trabajo TIMER0 debe inicializarse
con 0, por la frmula: VI = 256 #PULSOS

Investigue que registro contiene al bit indicador de desbordamiento del TIMER0
(TOIF), es necesario saber cul es la direccin de este registro en la memoria RAM y
adems, cul es la posicin del bit (TOIF) dentro de este registro. Es fundamental para
detectar el desbordamiento del TIMER0.

A continuacin el programa:

//---------- Encabezado -----------

#include <16F84.h>
#FUSES NOWDT, XT, PUT, NOPROTECT
MI CROCONTROLADORES 51
CIBERTEC CARRERAS PROFESIONALES
#use delay(clock=4000000)
#bit RB0=0X6.7 // declaracin de la variable RB0 para la onda cuadrada (pin PORT)
#bit TOIF=0XB.2 // declaracin de la variable TOIF (indicador de desborde del TMRO)

//-----------Programa principal-------------

void main()
{
set_tris_b(0xFE); // pin RB0 del PORTB como salida
RB0=0; // RB0 empieza en cero

// a continuacin se configura el TIMER0 para trabajar con:
// reloj interno (RTCC_INTERNAL)
// y factor de divisin 256 (RTCC_DIV_256)
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);

TOIF=0; // desactivamos el indicador de desborde del TIMER0.
set_TIMER0(0); // inicializamos el registro de trabajo del TIMER0 con 0
// para que cuente 256 pulsos internos.

do{
if(TOIF==1) // si el indicador de desborde se activa
{
TOIF=0; // desactivar el indicador
if(RB0==0) // si la onda es 0
{
RB0=1; // fijar la onda a 1
set_TIMER0(0); // inicializa otra vez el TIMER con 0
}
Else // de lo contrario, si la onda es 1
{
RB7=0; // fijar la onda a 0
set_TIMER0(0); // inicializa otra vez el TIMER con 0
}
}

}while(TRUE); // repetir el bucle

}

1.7.2.2 Cuenta regresiva temporizada
Realice el programa que permita mostrar una cuenta regresiva de
9 a 0 cada vez que se active el pulsador. Cada dgito debe
aparecer durante 1 segundo. Despus del cero, el display debe
apagarse.
El display es ctodo comn por lo que sus segmentos se apagan
con ceros y se encienden con unos.
El pulsador genera un 0 en estado off y un 1 en estado on.
Para los cdigos de los dgitos 9, 8, 7, 6, 5, 4 ,3 ,2 ,1 y 0 realice
un arreglo en RAM, al que se acceda con un puntero.
Para el temporizado, suponga que el cristal es de 4Mhz y
recuerde utilizar la frmula: T = (4*factor de divisin*#pulsos)/f
En este caso, necesitaremos una base de tiempo y una variable que contabilice una
cantidad de estas bases de tiempo. Fijaremos la base de tiempo a 12.5ms y
52
CARRERAS PROFESIONALES CIBERTEC
necesitaremos una funcin for que cuente 80 de estas bases de tiempo para llegar a
los 1000ms = 1s (12.5ms * 80 = 1000ms).

Calculemos el #pulsos: T = (4*factor de divisin*#pulsos)/f

Reemplazando valores: 12.5ms = (4*factor de divisin*#pulsos)/4Mhz
12.5ms = factor de divisin*#pulsos us (1/1Mhz = 1us)
12.5ms x1000 = fd*#p ms
12,500 = fd*#p
Utilizando el valor 64 para el factor de divisin (fd) tendramos lo siguiente:

12,500 = 64*#p, entonces, #p = 12,500/64 = 195.3

Por lo que el valor inicial del TMR0 sera 256 195 = 61 = 0x3D (hexadecimal)

Iniciemos el programa:

//---------- Encabezado -----------

#include <16f84.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#bit TOIF=0XB.2 // variable del indicador de desborde del TMR0

//------Funcin que genera un segundo de retardo-------------

void un_segundo()
{
char j; // declaracin de variable j empleada en el for

for (j=0;j<80;++j) // bucle de 80 repeticiones
{
set_TIMER0(61); // inicializa el TMR0 con 61 para trabajar otros 12.5ms
TOIF=0; // borra el indicador de desborde del TMR0
do{ // mantenerse en el bucle do while hasta que TOIF sea 1
}while(TOIF==0); // TOIF se hace 1 cada 12.5ms
}
}

//------Programa principal-----------------------------------------------

void main(void)
{
char i; // i ser el puntero para direccionar los cdigos del 0 al 9
// a continuacin se declara el arreglo tabla y se asignan
// los cdigos del 0 al 9 para un display ctodo comn
int tabla9a0[10]={0x67,0x7F,0x07,0x7D,0x6D,0x66,0x4F,0x5B,0x06,0x3F};

set_tris_b(0x00); // todo el puerto B configurado como salida.
set_tris_a(0xFF); // todo el puerto A configurado como entrada

// a continuacin se configura el TIMER0 para trabajar con:
// reloj interno (RTCC_INTERNAL)
// y factor de divisin 64 (RTCC_DIV_64)
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
MI CROCONTROLADORES 53
CIBERTEC CARRERAS PROFESIONALES

do{
if(input(PIN_A2)) // si el pulsador est activado (RA2=1)
for (i=0;i<10;++i){ // aplicar la secuencia for que
output_b(tabla9a0[i]); // accede a un cdigo y lo muestra en el display
un_segundo();} // genera un retardo de 1 segundo
else // de lo contrario
output_b(0); // apagar el display
}while(TRUE); // repetir el bucle.
}
54
CARRERAS PROFESIONALES CIBERTEC

Resumen






La memoria RAM puede accederse en dos modos: directo e indirecto. El directo se
realiza seleccionando el banco a travs del bit RP0 e indicando la direccin de la
celda o el nombre de la celda asociada. El indirecto se hace seleccionando el
Banco a travs del bit IRP de registro STATUS; y el bit 7 del registro FSR indicando
la direccin a travs del registro FSR. El registro INDF, en este modo, se encarga
de la lectura y escritura de la celda de memoria.

El TMR0 es el dispositivo encargado de la temporizacin y puede funcionar en dos
modos: contador y temporizador. El modo contador se realiza para contabilizar
pulsos externos provenientes de sensores, mientras que el modo temporizado se
utiliza para crear bases de tiempo o retardos.

El registro OPTION-REG es el encargado de configurar y poner en marcha al
TMR0. Cuando est configurado en modo comn, se debe sensar constantemente
su bit T0IF indicador de desborde, para saber que culmin el tiempo programado.
Para los tiempos de programacin mayores a los 50ms, se hace necesario el uso
de una variable de cuenta.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.

http://members.fortunecity.es/electronico/tutoriales/tutopic16f84/p9.html
Aqu, hallar informacin sobre la funcin contador del TMR0.

http://perso.wanadoo.es/pictob/micropic16f84.htm#temporizador_contador_tmr0
Aqu, hallar informacin relacionada con el temporizador del TMR0.


MI CROCONTROLADORES 55
CIBERTEC CARRERAS PROFESIONALES




EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad media utilizando el Microcontrolador PIC16F877. Los
circuitos sern implementados en protoboards y no deben presentar fallas en las
conexiones realizadas. Por otro lado, los programas que activan el funcionamiento de
los circuitos se desarrollarn mediante comandos de Lenguaje C y el compilador C de
MPLAB y debern garantizar, luego de la correcta instalacin de los mismos, el
funcionamiento mnimo del 80% de las tareas propuestas para las aplicaciones de
lectura y/o escritura de puertos, temporizacin, comunicacin serie, conversin
anloga digital e interrupciones en los cinco puertos del Microcontrolador.

TEMARIO
Introduccin al PIC16F877

ACTIVIDADES PROPUESTAS
Los alumnos describen las caractersticas del PIC16F877.

Los alumnos reconocen la funcin de las seales de inicializacin.

Los alumnos distinguen las unidades internas del PIC16F877.

UNIDAD DE
APRENDIZAJE
2
56
CARRERAS PROFESIONALES CIBERTEC
2.1 INTRODUCCIN AL PIC16F877

El PIC16F877 pertenece a la gama alta, es decir, es un Microcontrolador con mejores
capacidades que el PIC16F84, ideal para el desarrollo de aplicaciones mayores, a
continuacin se indican sus caractersticas:

2.1.1 Caractersticas

2.1.1.1 Descripcin de contactos
























La figura de arriba muestra la disposicin de pines de este PIC. VDD y VSS son los
pines de polarizacin, +5V y GND, respectivamente. OSC1 y OSC2 son los pines para
el reloj. En estos se conectar el cristal. MCLR es el pin de programacin o reset.
Durante la programacin, esta patilla se conecta al voltaje de programacin (13,2V),
mientras que, en funcionamiento, este debe conectarse a un arreglo RC para recibir el
pulso de inicializacin. Los pines RAx, RBx, RCx, RDx y REx son los pines de los
puertos A, B, C, D y E, respectivamente. A travs de estas patillas, el microcontrolador
se conectar con el sistema por controlar.

2.1.1.2 Descripcin de la CPU
Este Microcontrolador posee, en su interior, un Microprocesador de 8 bits que opera a
una frecuencia mxima de 20Mhz. Soporta un total de 35 instrucciones las que ejecuta
en un ciclo de mquina, excepto las de salto que ejecuta en dos ciclos. Un ciclo de
mquina equivale a 4 periodos de reloj (f/4), donde f es la frecuencia del cristal
utilizado para proveer la seal de reloj.

2.1.1.3 Descripcin de las memorias
El PIC16F877, al igual que el PIC16F84, posee tres tipos de memorias: FLASH,
EEPROM y RAM.

MI CROCONTROLADORES 57
CIBERTEC CARRERAS PROFESIONALES
2.1.1.4 Memoria FLASH
La memoria flash es la memoria de programas destinada para almacenar las
instrucciones. Tiene una capacidad de 8192 celdas de 14 bits (8K words), es decir, se
pueden introducir, en esta memoria, hasta 8192 instrucciones. Esta memoria es la que
recibir, desde el computador, los programas desarrollados durante los laboratorios.
Esta memoria puede ser borrada y programada 10 mil veces. Las instrucciones
depositadas en esta no se perdern ni modificarn an si pierde la energa de
polarizacin.

2.1.1.5 Memoria EEPROM
La memoria eeprom es una memoria destinada para el almacenamiento de datos y
variables. Este tipo de memoria, al igual que la flash, no pierde su informacin aun si
pierde la energa que lo polariza. Su capacidad es de 256 celdas de 8 bits, es decir,
256 bytes. Esta memoria puede ser regrabada 10 millones de veces.

2.1.1.6 Memoria RAM
La memoria ram es una memoria destinada al almacenamiento de datos, pero, a su
vez, en esta, se encuentran todos los registros de configuracin de todas las funciones
del PIC. Su capacidad es de 368 celdas de 8 bits, es decir, 368bytes.

2.1.1.7 Descripcin de las unidades de entrada y salida
El PIC16F877 dispone de cinco puertos denominados PORTA, PORTB, PORTC,
PORTD y PORTE. El puerto A est formado por 6 pines, mientras que el puerto B, C y
D, por 8 pines y el puerto E, por slo tres pines. Es decir, 33 patillas a travs de los
cuales el Microcontrolador se conectar con las aplicaciones.

2.1.1.8 Dispositivos especiales
Adems de los puertos, este PIC posee lo siguiente:
3 temporizadores denominados TMR0, TMR1 y TMR2
1 puerto de comunicacin serie USART
1 puerto de comunicacin serie IC
8 canales de conversin anloga digital

2.1.2 PUESTA EN MARCHA

Poner en funcionamiento al Microcontrolador significa polarizarlo, proveerle la seal de
reloj y asegurar el impulso de inicializacin bsico para que pueda funcionar.

2.1.2.1 Polarizacin
Este PIC necesita ser energizado con +5V y GND, ya sea durante la programacin de
su memoria FLASH o durante su funcionamiento. Las patillas utilizadas para esto son
VDD y VSS. Este PIC tiene duplicadas estas patillas, pero no es necesario conectar
las dos patillas VDD a +5V ni tampoco conectar las dos patillas VSS a GND, basta con
adaptar una de las dos. Segn sea conveniente, se utilizar una u otra patilla de
polarizacin.

2.1.2.2 Reset
Todos los Microcontroladores necesitan recibir un impulso apenas se energizan. Esto
es fundamental para inicializar sus unidades y registros. De no presentarse este
impulso, el Microcontrolador probablemente quedara bloqueado ejecutando algn
grupo de instrucciones que nada tienen que ver con la ejecucin del programa
preparado, ya que el PC (contador de programa) podra estar apuntando a cualquier
parte de la memoria de programa flash. Este impulso, entre otras cosas, asegura que
58
CARRERAS PROFESIONALES CIBERTEC
el registro PC apunte a la primera celda de la memoria flash, es decir, el
Microcontrolador queda listo para leer, interpretar y ejecutar su primera instruccin.

Este impulso se logra realizando un arreglo RC sobre la patilla MCLR. Valores
comunes seran 1K ohmios para la resistencia y 10 uF para el condensador. Si durante
el funcionamiento del Microcontrolador ocurriera algn evento no deseado y este
quedase bloqueado o simplemente se requiere reiniciar la ejecucin del programa
desde el principio, es necesario inyectar un nuevo impulso sobre MCLR. Esto se logra
aadiendo un pulsador a este sistema.

2.1.2.3 Reloj
La funcin de reloj, tambin conocida como sistema de oscilacin, es fundamental
para que el Microcontrolador se ponga en marcha. Sin esta seal, los
Microcontroladores no podran realizar la ms mnima labor. Estos necesitan los
pulsos repetitivos de la seal de reloj para leer, interpretar y ejecutar las instrucciones
almacenadas en su memoria flash. Los pines destinados para esta funcin son OSC1
y OSC2. A estas se les tendr que adaptar un cristal, un arreglo RC o una fuente
externa de reloj.

2.1.2.3.1 Modos de oscilacin
El PIC16F877 puede trabajar hasta en cuatro modos de oscilacin: LP, XT, HS y RC.

2.1.2.3.1.1 Modo LP
Este sistema est diseado para que el microcontrolador opere a frecuencias bajas
comprendidas entre los 32Khz y 200Khz. Es posible adaptar un oscilador cermico o
un oscilador de cristal de cuarzo. Este debe ser acompaado por dos condensadores
cuyos valores dependen de la frecuencia de trabajo. Los fabricantes facilitan esta
informacin en tablas de la hoja de datos del PIC.

2.1.2.3.1.2 Modo XT
Este sistema est diseado para que el microcontrolador opere a frecuencias
comprendidas entre los 100Khz y 4Mhz. Es posible adaptar un oscilador cermico o un
oscilador de cristal de cuarzo. Este debe ser acompaado por dos condensadores
cuyos valores tpicos estn entre los 15pF y 33pF.

2.1.2.3.1.3 Modo HS
Este sistema est diseado para que el microcontrolador opere a frecuencias
comprendidas entre los 4Mhz y 20Mhz. Es posible adaptar un oscilador cermico o un
oscilador de cristal de cuarzo. Este debe ser acompaado por dos condensadores y
una resistencia cuyos valores dependen de la frecuencia de trabajo. Los fabricantes
facilitan esta informacin en tablas de la hoja de datos del PIC.

2.1.2.3.1.4 Modo RC
Este es un sistema poco preciso, pero econmico y se realiza utilizando una
resistencia y un condensador. Los valores recomendaos por los fabricantes para este
tipo de oscilador son 5K ohmios < R <100K ohmios y C > 20pF.


2.1.3 ARQUITECTURA INTERNA

El PIC16F877, al igual que el PIC16F84, se caracteriza por tener:
Una arquitectura Harvard
Un procesamiento segmentado (pipeline)
Un procesador tipo RISC
Un formato ortogonal
MI CROCONTROLADORES 59
CIBERTEC CARRERAS PROFESIONALES
Podemos notar, en la figura de abajo, la arquitectura Harvard del PIC16F877. La
memoria de programas FLASH (que almacena las instrucciones) tiene un bus
conectado directamente sobre el registro de instrucciones y este, a su vez, se conecta
con el decodificador de instrucciones, con el multiplexor de direcciones o al multiplexor
de entrada para las operaciones aritmtico lgicas. En cambio, la memoria RAM y la
memoria EEPROM (que almacenan los datos) comparten otro camino, otro bus, el
cual se conecta al registro FSR de direccionamiento indirecto de memoria RAM, a los
PUERTOS, al registro de trabajo W, al multiplexor de entrada para las operaciones
aritmtico lgicas, a los canales de conversin A/D, a los puertos de comunicacin
serie y a los TIMERS.

Tambin, podemos observar el formato de trabajo ortogonal. La ALU (unidad
aritmtica lgica) recibe, por una de sus entradas, la informacin proveniente del bus
de la memoria flash o del bus de las memorias RAM o EEPROM y, por su otra
entrada, recibe la informacin proveniente del registro de trabajo W. El resultado de las
operaciones es devuelto sobre el registro de trabajo W, sobre los puertos, los timers,
sobre los puertos seriales, sobre los canales de conversin A/D, sobre las memorias
RAM, EEPROM y sobre algunos registros especiales como el FSR, STATUS y PC.


60
CARRERAS PROFESIONALES CIBERTEC
2.1.4 MEMORIAS

2.1.4.1 Memoria FLASH
Esta memoria, encargada de proveer las
instrucciones al microprocesador, debe ser
adecuadamente tratada, de lo contrario
podramos cometer errores involuntarios
de programacin.

La capacidad fsica de esta memoria es de
8Kwords, donde cada Word est formado
por 14 bits. Su direccionamiento va desde
la posicin 0000h hasta la 1FFFh. Esta
rea es conocida como la memoria de
usuario.

El PC (contador de programa) es un
registro que se encarga de direccionar a
cada una de las instrucciones de esta
memoria. Cada vez que el pin MCLR del
microcontrolador recibe un pulso bajo, el
PC se fija automticamente a 0000h
(vector de reset) garantizando que se
apunte a la primera instruccin del
programa.

Cada vez que se presente alguna interrupcin, el valor del PC es guardado en uno de
los 8 niveles de la Pila, para recibir luego, y de modo automtico, la direccin 0004h
(vector de interrupcin).

La Pila es un arreglo de registros que sirve para guardar o restaurar los valores del
PC. Cada vez que se presenta una interrupcin o se invoca a alguna subrutina (CALL),
el valor del PC es guardado en la Pila; en cambio, cuando se termina la ejecucin de
una subrutina de interrupcin (RETFIE) o se finaliza la ejecucin de una subrutina
comn (RETURN o RETLW), el PC recupera su valor de la Pila.

La memoria de usuario est organizada por pginas de 2K words y es de fundamental
importancia trasladarse, desde los programas, adecuadamente sobre estas pginas.
Si desde la pgina 0 se desea ejecutar alguna subrutina ubicada en la pgina 2, no
basta con indicarle al PC la etiqueta (direccin) de esta subrutina, es necesario indicar
la pgina a travs del registro PCLATH, especficamente dos de sus bits 3 y 4 como se
muestra en la tabla:

PCLATH,4 PCLATH,3 Pgina
0 0 0
0 1 1
1 0 2
1 1 3

Y cuando deseamos retornar de una subrutina que se encuentra en otra pgina,
tambin se hace necesario seleccionar la pgina de destino.


MI CROCONTROLADORES 61
CIBERTEC CARRERAS PROFESIONALES
2.1.4.2 Memoria RAM
Esta memoria es fundamental para el tratamiento de los datos y variables que maneja
un programa. En la figura de abajo, se nota que est formada por dos partes: los
registros de funciones especiales (SFR) y los registros de propsito general (GPR).

2.1.4.2.1 Registros de funciones especiales (SFR)
Estos registros estn formados por las primeras posiciones de la memoria y tienen un
papel importante en la funcin y configuracin del Microcontrolador.

2.1.4.2.2 Registros de propsito general (GPR)
Estn formados por 368 bytes, y sirven para el tratamiento de los datos y variables del
programa. Cada Banco contiene 96 de estos registros.

2.1.4.2.3 Bancos de Memoria
La RAM est estructurada por cuatro bancos de memoria: el banco 0, el banco 1, el
banco 2 y el banco 3. Los registros de funciones especiales y de propsito general se
encuentran ubicados en los dos bancos, tal como se muestra en la siguiente figura:





































62
CARRERAS PROFESIONALES CIBERTEC
En las direcciones 00h a 1Fh del banco 0, 80h a 9Fh del banco 1, 100h a 10Fh del
banco 2 y 180h a 18Fh del banco 3 estn ubicados los registros de funciones
especiales (SFR). Algunos de estos registros, como Indirect, STATUS, FSR, se
encuentran en los cuatro bancos con el nico propsito de facilitar su acceso.

2.1.4.2.4 Seleccin de los Bancos
El acceso a los Bancos se realiza a travs de la manipulacin de los bits 6 (RP1) y 5
(RP0) del registro STATUS. Las cuatro combinaciones que se pueden generar con
estos bits seleccionan a uno de los cuatro bancos, tal como se indica en la tabla:

RP1 RP0 Banco
0 0 0
0 1 1
1 0 2
1 1 3

Pero, este procedimiento para nosotros es transparente, ya que el compilador C
insertar automticamente las instrucciones necesarias para realizar esta seleccin de
los bancos de memoria RAM.
MI CROCONTROLADORES 63
CIBERTEC CARRERAS PROFESIONALES

Resumen




El PIC16F877 pertenece a la gama alta de los microcontroladores. Tiene un
Microprocesador de 8 bits; una memoria FLASH de 8K words; una memoria
EEPROM de 256 bytes; una RAM de 368 bytes; cinco puertos: PORTA, PORTB,
PORTC, PORTD y PORTE; tres temporizadores: TMR0, TMR1 y TMR2; puertos
serie tipo USART e IC; y 8 canales de conversin A/D.

El PIC, para funcionar, necesita una seal de reloj, la cual puede ser del tipo RC,
XT, HS o LP. Adems, es necesario realizar un arreglo RC sobre la patilla MCLR
que asegure su inicializacin interna.

El PIC16F877 posee un reducido nmero de instrucciones (35) y dispone de un
formato ortogonal para la ejecucin de las instrucciones aritmtico lgicas (todos
los elementos internos pueden ser fuentes o destino).

La memoria FLASH sirve para almacenar las instrucciones del programa. En esta,
se insertan las del programa principal y las de las subrutinas de interrupcin. El
registro encargado de direccionar estas instrucciones es el PC. Cada vez que
aparece un reset, el PC recibe la direccin 0000h para ejecutar la primera
instruccin. Y cada vez que algn dispositivo interrumpe, el PC direcciona el vector
de interrupcin 0004h.

La memoria RAM est organizada por cuatro bancos: el banco 0, el banco 1, el
banco 2 y el banco 3. En los primeros espacios de memoria, estn contenidos los
registros especiales de configuracin y funciones del PIC, mientras que los dems
espacios estn reservados para el tratamiento de los datos y variables.

La seleccin de los Bancos se debe realizar cada vez que necesitamos manipular
algn registro especial o alguna de las celdas de RAM. Esta seleccin se realiza a
travs de dos bits: RP1 y RP0 del registro STATUS.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.

http://www.scribd.com/doc/6660807/Manual-Pic-16f877-2
Aqu, hallar informacin sobre arquitectura, reset y oscilacin del PIC.
http://www.ate.uniovi.es/fernando/Doc2006/Sed_06/Presentaciones/Organizacion
%20de%20la%20Memoria.pdf
Aqu, hallar informacin sobre la memoria FLASH y los bancos de RAM.



64
CARRERAS PROFESIONALES CIBERTEC




EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad media utilizando el Microcontrolador PIC16F877. Los
circuitos sern implementados en protoboards y no deben presentar fallas en las
conexiones realizadas. Por otro lado, los programas que activan el funcionamiento de
los circuitos se desarrollarn mediante comandos de Lenguaje C y el compilador C de
MPLAB y debern garantizar, luego de la correcta instalacin de los mismos, el
funcionamiento mnimo del 80% de las tareas propuestas para las aplicaciones de
lectura y/o escritura de puertos, temporizacin, comunicacin serie, conversin
anloga digital e interrupciones en los cinco puertos del Microcontrolador.

TEMARIO
Registros y sus funciones


ACTIVIDADES PROPUESTAS
Los alumnos identifican los registros del PIC16F877.

Los alumnos describen las funciones de los registros.


UNIDAD DE
APRENDIZAJE
2
MI CROCONTROLADORES 65
CIBERTEC CARRERAS PROFESIONALES
2.2 REGISTROS Y SUS FUNCIONES

2.2.1 Registros
Ya sabemos de la importancia que tienen los registros en los PICs: encargados de
llevar la configuracin y habilitacin de las funciones que los PICs poseen. A
continuacin, se muestran cuatro tablas, con los registros de funciones especiales de
los cuatro bancos. En cada una, se indica una breve descripcin de los registros.

BANCO 0
00h INDF Registro de lectura/escritura de RAM en acceso indirecto
01h TMR0 Registro de trabajo del TMR0
02h PCL Registro contador de programa (parte baja)
03h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
04h FSR Registro direccionador de RAM en el modo indirecto
05h PORTA Puerto A de lectura y escritura de 5 bits
06h PORTB Puerto B de lectura y escritura de 8 bits
07h PORTC Puerto C de lectura y escritura de 8 bits
08h PORTD Puerto D de lectura y escritura de 8 bits
09h PORTE Puerto E de lectura y escritura de 3 bits
0Ah PCLATH Registro contador de programa (parte alta)
0Bh INTCON Registro de configuracin de las primeras interrupciones
0Ch PIR1 Registro indicador de estado de perifricos
0Dh PIR2 Registro indicador de estado de perifricos
0Eh TMR1L Registro de trabajo del TMR1 (parte baja)
0Fh TMR1H Registro de trabajo del TMR1 (parte alta)


BANCO 0
10h T1CON Registro de configuracin del TMR1
11h TMR2 Registro de trabajo del TMR2
12h T2CON Registro de configuracin del TMR2
13h SSPBUF Registro buffer de transmisin y recepcin serial sncrona
14h SSPCON Registro de control serial sncrono
15h CCPR1L Registro de trabajo del mdulo 1 captura y comparacin (low)
16h CCPR1H Registro de trabajo del mdulo 1 captura y comparacin (high)
17h CCPCON Registro de configuracin del mdulo 1 captura y comparacin
18h RCSTA Registro de configuracin de la recepcin serie
19h TXREG Registro de transmisin de datos serie
1Ah RCREG Registros de recepcin de datos serie
1Bh CCPR2L Registro de trabajo del mdulo 2 captura y comparacin (low)
1Ch CCPR2H Registro de trabajo del mdulo 2 captura y comparacin (high)
1Dh CCPCON Registro de configuracin del mdulo 2 captura y comparacin
1Eh ADRESH Registro de datos de la conversin A/D (parte alta)
1Fh ADCON0 Registro de configuracin 0 del conversor A/D

66
CARRERAS PROFESIONALES CIBERTEC

BANCO 1
80h INDF Registro de lectura/escritura de RAM en acceso indirecto
81h OPTION Registro de Configuracin del TMR0
82h PCL Registro contador de programa (parte baja)
83h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
84h FSR Registro direccionador de RAM en el modo indirecto
85h TRISA Registro de configuracin del PORTA
86h TRISB Registro de configuracin del PORTB
87h TRISC Registro de configuracin del PORTC
88h TRISD Registro de configuracin del PORTD
89h TRISE Registro de configuracin del PORTE
8Ah PCLATH Registro contador de programa (parte alta)
8Bh INTCON Registro de configuracin de las primeras interrupciones
8Ch PIE1 Registro de configuracin de interrupciones de perifricos 1
8Dh PIE2 Registro de configuracin de interrupciones de perifricos 2
8Eh PCON Registro de control de reset
91h SSPCON2 Registro de control 1 de la comunicacin serie sncrona
92h PR2 Registro de trabajo del periodo del TMR2
93h SSPADD Registro de direccin de la comunicacin serie sncrona
94h SSPSTAT Registro de estado de la comunicacin serie sncrona
98h TXSTA Registro de control de la transmisin serie
99h SPBRG Registro generador de velocidad de la comunicacin serie
9Eh ADRESL Registro de datos de la conversin A/D (parte baja)
9Fh ADCON1 Registro de configuracin 1 del conversor A/D


BANCO 2
100h INDF Registro de lectura/escritura de RAM en acceso indirecto
101h TMR0 Registro de trabajo del TMR0
102h PCL Registro contador de programa (parte baja)
103h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
104h FSR Registro direccionador de RAM en el modo indirecto
106h PORTB Puerto B de lectura y escritura de 8 bits
10Ah PCLATH Registro contador de programa (parte alta)
10Bh INTCON Registro de configuracin de las primeras interrupciones
10Ch EEDATA Registro de datos de EEPROM y FLASH (parte baja)
10Dh EEADR Registro de direcciones de EEPROM y FLASH (parte baja)
10Eh EEDATH Registro de datos de FLASH (parte alta)
10Fh EEADRH Registro de direcciones de FLASH (parte alta)

MI CROCONTROLADORES 67
CIBERTEC CARRERAS PROFESIONALES

BANCO 3
180h INDF Registro de lectura/escritura de RAM en acceso indirecto
181h OPTION Registro de Configuracin del TMR0
182h PCL Registro contador de programa (parte baja)
183h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
184h FSR Registro direccionador de RAM en el modo indirecto
186h TRISB Registro de configuracin del PORTB
18Ah PCLATH Registro contador de programa (parte alta)
18Bh INTCON Registro de configuracin de las primeras interrupciones
18Ch EECON1 Registro de control de la memoria EEPROM
18Dh EECON2 Registro secuenciador de escritura (55h y AAh) de la EEPROM


2.2.2 FUNCIONES

Cada registro tiene una capacidad mxima de 8 bits y cada bit tiene su funcin
especial. Por tal motivo, es necesario desagregar a los registros en funcin de sus bits
para tener una idea ms completa de su funcin.

2.2.2.1 El registro STATUS
Este es el registro de estado. Est formado por 8 bits y contiene los indicadores de
estado de la ALU, el bit que permite la seleccin del banco de memoria RAM, y los
indicadores de watchdog y power down. Abajo, se muestra la disposicin de sus bits:

IRP RP1 RP0 T0 PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

Los bits IRP y RP1 no estn implementados para este microcontrolador.
RP0 : Selector del banco activo de memoria RAM.
0: Banco 0
1: Banco 1

TO : Indicador de ocurrencia del watchdog timer (WDT)
1: Desactivado
0: Activado


PD: Indicador de funcionamiento de power down
1: Desactivado
0: Activado (modo SLEEP)

Z: Indicador de cero
0: Desactivado
1: Activado

DC: Indicador de carry o borrow decimal
0: Desactivado
1: Activado
C: Indicador de carry o borrow octal
0: Desactivado
68
CARRERAS PROFESIONALES CIBERTEC
1: Activado

2.2.2.2 El registro OPTION
El registro de opcin tambin est formado por 8 bits y contiene los bits de control para
la configuracin de trabajo del TIMER0 y WATCHDOG, los bits de habilitacin de
interrupcin externa y del TIMER0, y la habilitacin de la funcin PULL-up para los bits
del PUERTOB. A continuacin, se muestran sus bits:

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

RBPU: Funcin pull-up para el PUERTOB
1: Funcin desactivada
0: Funcin activada

INTEDG: Selector del tipo de interrupcin externa RBO/INT
1: activa por flanco de subida
0: activa por flanco de bajada

T0CS: Selector de la fuente de reloj para el TIMER0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4

T0SE: Selector del tipo de flanco externo para el TIMER0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMRE por flanco de subida del pin RA4/TOCKI

PSA: Desviador del factor de divisin de la seal de reloj
1: Hacia la funcin de WATCHDOG
0: Hacia la funcin del TIMER

PS2-PS1-PS0: Selectores del factor de divisin de la seal de reloj

PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128

2.2.2.3 El registro INTCON
El registro de interrupcin tambin est formado por 8 bits y contiene los bits de
habilitacin para las interrupciones, as como los indicadores de la presencia de
interrupcin. A continuacin, se muestran sus bits:

GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 Bit5 bit4 bit3 bit2 bit1 bit0

GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado
MI CROCONTROLADORES 69
CIBERTEC CARRERAS PROFESIONALES

PEIE: Habilitador de interrupcin de los perifricos
1: Habilitado
0: Deshabilitado

T0IE: Interrupcin por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado

INTE: Interrupcin externa del pin RB0/INT
1: Habilitado
0: Deshabilitado

RBIE: Interrupcin por variacin del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado

T0IF: Indicador de interrupcin de desbordamiento del TIMER0
1: Activado
0: Desactivado

INTF: Indicador de interrupcin del pin RB0/INT
1: Activado
0: desactiva

RBIF: Indicador de interrupcin por variacin del valor de los bits <RB4:RB7>
1: Activado
0: Desactivado

2.2.2.4 El registro EECON1
El registro de configuracin 1 de la memoria EEPROM es de 8 bits y contiene los bits
que permiten la configuracin, habilitacin y puesta en marcha del proceso de lectura
o escritura de dicha memoria. Abajo, se muestran sus bits:

- - - EEIF WRWRR WREN WR RD
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

EEIF: Indicador de proceso de escritura
1: Escritura culminada
0: Escritura desactivada o en proceso
WRERR: Indicador de error del proceso de escritura
1: Proceso finalizado prematuramente debido a un reset o watchdoog
0: Proceso correcto

WREN: Habilitador del proceso de escritura
1: Habilitado
0: Deshabilitado

WR: Control de inicializacin de la escritura e indicador de proceso culminado
1: Inicia el proceso de escritura
0: Indica el fin del proceso de escritura

RD: Control de inicializacin de la lectura e indicador de proceso culminado
1: Inicia el proceso de lectura
70
CARRERAS PROFESIONALES CIBERTEC
0: Indica el fin del proceso de lectura

2.2.2.5 El registro EECON2
El registro de configuracin 2 de la memoria EEPROM es de 8 bits y solo sirve para
secuenciar la operacin de escritura sobre esta memoria. Este registro debe recibir
consecutivamente dos valores: primero se le debe transferir el valor 55h y, luego, el
valor AAh. Realizado esto, ya se puede iniciar el proceso de escritura sobre la
EEPROM.

2.2.2.6 El registro PORTA
El registro de puerto A est formado por 6 bits y contiene los 6 primeros pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

- - RA5 RA4 RA3 RA2 RA1 RA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

RA0: Bit menos significativo del puerto. Funciona como I/O digital o in anloga 0.
RA1: Funciona como I/O digital o entrada anloga 1.
RA2: Funciona como I/O digital o entrada anloga 2.
RA3: Funciona como I/O digital o entrada anloga 3 o VREF.
RA4: Funciona como I/O digital o entrada de fuente externa de reloj para el TMR0.
RA5: Bit ms significativo del puerto. Funciona como I/O o selector del puerto serie
esclavo sncrono de entrada o entrada anloga 4.

2.2.2.7 El registro PORTB
El registro de puerto B est formado por 8 bits y contiene los 8 siguientes pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

RB0: Bit menos significativo. Funciona como I/O digital o interrupcin por pulso bajo.
RB1: Funciona como I/O digital.
RB2: Funciona como I/O digital.
RB3: Funciona como I/O digital.
RB4: Funciona como I/O digital o interrupcin si vara su valor.
RB5 Funciona como I/O digital o interrupcin si vara su valor.
RB6 Funciona como I/O digital o interrupcin si vara su valor.
RB7 Bit ms significativo. Funciona como I/O o interrupcin si vara su valor.

2.2.2.8 El registro PORTC
El registro de puerto C est formado por 8 bits y contiene los 8 siguientes pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
bit7 bit6 Bit5 bit4 bit3 bit2 Bit1 Bit0

RC0: Bit menos significativo. Funciona como I/O digital o entrada de reloj para TMT1.
RC1: Funciona como I/O digital o captura 2 in/compare 2 out/pwm2 out.
RC2: Funciona como I/O digital o captura 1 in/compare 1 out/pwm1 out.
RC3: Funciona como I/O digital o reloj de sincronismo serie para SPI o IC.
RC4: Funciona como I/O digital o dato in para SPI o I/O para IC.
RC5 Funciona como I/O digital o sincronismo del puerto serie en salida de datos.
RC6 Funciona como I/O digital o transmisin asncrona USART/reloj sncrono.
MI CROCONTROLADORES 71
CIBERTEC CARRERAS PROFESIONALES
RC7 Bit ms significativo. Funciona como I/O o recepcin USART/data sncrona.

2.2.2.9 El registro PORTD
El registro de puerto D est formado por 8 bits y contiene los 8 siguientes pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

RD0: Bit menos significativo. Funciona como I/O digital o puerto paralelo esclavo 0
RD1: Funciona como I/O digital o puerto paralelo esclavo 1.
RD2: Funciona como I/O digital o puerto paralelo esclavo 2.
RD3: Funciona como I/O digital o puerto paralelo esclavo 3.
RD4: Funciona como I/O digital o puerto paralelo esclavo 4.
RD5 Funciona como I/O digital o puerto paralelo esclavo 5.
RD6 Funciona como I/O digital o puerto paralelo esclavo 6.
RD7 Bit ms significativo. Funciona como I/O o puerto paralelo esclavo 7.

2.2.2.10 El registro PORTE
El registro de puerto E est formado por 3 bits y contiene los 3 siguientes pines de
comunicacin con los elementos externos al Microcontrolador. Veamos sus bits:

- - - - - RE2 RE1 RE0
- - - - - bit2 Bit1 Bit0

RE0: Bit menos significativo. Funciona como I/O digital o control de lectura en el
modo puerto esclavo paralelo o entrada anloga 5.
RE1: Funciona como I/O digital o control de escritura en el modo puerto esclavo
paralelo o entrada anloga 6. .
RE2: Funciona como I/O digital o habilitador del chip en el modo puerto esclavo
paralelo o entrada anloga 7.

2.2.2.11 El registro TRISA
El registro de configuracin del sentido de trabajo est formado por 6 bits y establece
si cada pin del PUERTO A trabajar como entrada o salida. Veamos sus bits:

- - TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

TRISA0: Bit de configuracin del pin RA0
TRISA1: Bit de configuracin del pin RA1
TRISA2: Bit de configuracin del pin RA2
TRISA3: Bit de configuracin del pin RA3
TRISA4: Bit de configuracin del pin RA4
TRISA5: Bit de configuracin del pin RA5

2.2.2.12 El registro TRISB
El registro de configuracin del sentido de trabajo est formado por 8 bits y establece
si cada pin del PUERTO B trabajar como entrada o salida. Veamos sus bits:

TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

72
CARRERAS PROFESIONALES CIBERTEC
TRISB0: Bit de configuracin del pin RB0
TRISB1: Bit de configuracin del pin RB1
TRISB2: Bit de configuracin del pin RB2
TRISB3: Bit de configuracin del pin RB3
TRISB4: Bit de configuracin del pin RB4
TRISB5: Bit de configuracin del pin RB5
TRISB6: Bit de configuracin del pin RB6
TRISB7: Bit de configuracin del pin RB7

2.2.2.13 El registro TRISC
El registro de configuracin del sentido de trabajo est formado por 8 bits y establece
si cada pin del PUERTO C trabajar como entrada o salida. Veamos sus bits:

TRISC7 TRISC6 TRISC5 TRISBC TRISBC TRISBC TRISBC TRISC0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

TRISC0: Bit de configuracin del pin RC0
TRISC1: Bit de configuracin del pin RC1
TRISC2: Bit de configuracin del pin RC2
TRISC3: Bit de configuracin del pin RC3
TRISC4: Bit de configuracin del pin RC4
TRISC5: Bit de configuracin del pin RC5
TRISC6: Bit de configuracin del pin RC6
TRISC7: Bit de configuracin del pin RC7

2.2.2.14 El registro TRISD
El registro de configuracin del sentido de trabajo est formado por 8 bits y establece
si cada pin del PUERTO D trabajar como entrada o salida. Veamos sus bits:

TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

TRISD0: Bit de configuracin del pin RB0
TRISD1: Bit de configuracin del pin RD1
TRISD2: Bit de configuracin del pin RD2
TRISD3: Bit de configuracin del pin RD3
TRISD4: Bit de configuracin del pin RD4
TRISD5: Bit de configuracin del pin RD5
TRISD6: Bit de configuracin del pin RD6
TRISD7: Bit de configuracin del pin RD7

2.2.2.15 El registro TRISE
El registro de configuracin del sentido de trabajo est formado por 8 bits y establece
si cada pin del PUERTO E trabajar como entrada o salida. Veamos sus bits:

- - - - - TRISE2 TRISE1 TRISE0
bit2 bit1 Bit0

TRISE0: Bit de configuracin del pin RE0
TRISE1: Bit de configuracin del pin RE1
TRISE2: Bit de configuracin del pin RE2

Cada bit de los cinco puertos puede ser configurado independientemente o en grupo
segn se requiera. Si el bit TRISXy es fijado a cero (0), su pin correspondiente en el
MI CROCONTROLADORES 73
CIBERTEC CARRERAS PROFESIONALES
PORTXy (RXy) queda configurado como salida. Por el contrario, si fijamos su valor a
uno (1), el pin correspondiente en RXy quedara configurado como entrada.

2.2.2.16 El registro PIE1
El registro de interrupcin de perifricos 1 contiene la habilitacin individual de
interrupcin de los primeros perifricos. Es necesario fijar a 1 el bit relacionado con la
funcin de interrupcin que deseamos habilitar.

PSPIE1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

PSPIE : Lectura/escritura del puerto paralelo esclavo
0: Deshabilitado
1: Habilitado

ADIE : Conversin anloga digital
0: Deshabilitado
1: Habilitado

RCIE: USART recepcin
0: Deshabilitado
1: Habilitado

TXIE: USART transmisin
0: Deshabilitado
1: Habilitado

SSPIE: Puerto serial sncrono
0: Deshabilitado
1: Habilitado

CCP1IE: Mdulo de captura comparacin y fase 1
0: Deshabilitado
1: Habilitado

TMR2IE: Igualdad del timer2 con el registro PR2
0: Deshabilitado
1: Habilitado


TMR1IE: Desbordamiento del TMR1
0: Deshabilitado
1: Habilitado

2.2.2.17 El registro PIR1
El registro indicador de estado de perifricos 1 contiene los flags de interrupcin de los
primeros perifricos. Estos indicadores se fijan automticamente a 1 cada vez que su
proceso relacionado se ha completado.

PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

PSPIF: Lectura/escritura del puerto paralelo esclavo
1: Una operacin de lectura o escritura ha culminado.
74
CARRERAS PROFESIONALES CIBERTEC
0: Lectura o escritura en proceso

ADIF: Conversin anloga digital
1: Una operacin de conversin ha culminado.
0: Conversin an sin completar

RCIF: USART recepcin
1: El buffer de recepcin USART est lleno.
0: Buffer an por llenar

TXIF: USART transmisin
1: El buffer de transmisin USART est vaco.
0: Buffer an por vaciar

SSPIF: Puerto serial sncrono
1: Una transmisin o recepcin completa ha tenido lugar.
0: Transmisin o recepcin an por procesar

CCP1IF: Modulo de captura comparacin y fase 1
1: Una operacin de captura o comparacin del timer 1 ha ocurrido.
Esta ocurrencia resetea al timer 1.
0: An no ha ocurrido el proceso.

TMR2IF: Igualdad del timer2 con el registro PR2
1: La igualdad del timer 2 y del registro PR2 se dio.
0: Tal igualdad an no se da.

TMR1IF: Desbordamiento del timer 1
1: El timer uno se ha desbordado.
0: El desbordamiento an no sucede.

2.2.2.18 El registro PIE2

El registro de interrupcin perifricos 2 tiene la habilitacin de interrupcin de los
perifricos faltantes. Es necesario fijar a 1 el bit relacionado con la funcin de
interrupcin que deseamos habilitar.

- - - EEIE BCLIE - - CCP2IE
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

EEIE: Escritura de la EEPROM
0: Deshabilitado
1: Habilitado

BCLIE: Colisin de bus generado por el puerto serial sncrono
0: Deshabilitado
1: Habilitado

CCP2IE: Mdulo de captura, comparacin y fase 2
0: Deshabilitado
1: Habilitado


MI CROCONTROLADORES 75
CIBERTEC CARRERAS PROFESIONALES
2.2.2.19 El registro PIR2
El registro indicador de estado de perifricos 2 tiene los indicadores de los perifricos
restantes. Estos indicadores se fijan automticamente a 1 cada vez que su proceso
relacionado se ha completado.

- - - EEIF BCLIF - - CCP2IF
Bit7 Bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

EEIF: Escritura de la EEPROM
1: El proceso de escritura ha culminado.
0: La escritura an no termina.

BCLIF: Colisin de bus generado por el puerto serial sncrono
1: Colisin de bus generada
0: No hay colisin

CCP2IF: Mdulo de captura, comparacin y fase 2
1: Una operacin de captura o comparacin del timer 1 ha ocurrido.
Esta ocurrencia resetea al timer 1 y genera un proceso de conversin
anloga digital si el mdulo de conversin est habilitada.
0: No ha ocurrido an el proceso.

2.2.2.20 El registro T1CON

El registro de control del TMR1 contiene los bits de habilitacin, configuracin y factor
de divisin para el timer1.

- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

T1CKPS1- T1CKPS0: Selector del factor de divisin

PS1 PS0 TIMR1
0 0 1
0 1 2
1 0 4
1 1 8

T1OSCEN: Oscilador externo
1: Habilitado
0: Deshabilitado
T1SYNC: Sincronizacin de entrada del oscilador externo
0: Habilitada
1: Desactivada

TMR1CS: Eleccin de la fuente de reloj
1: Externa a travs del pin RC0/T1OSO/T1CKI
0: Interna (F/4)

TMR1ON: Puesta en marcha del timer
1: Activada
0: Desactivada

76
CARRERAS PROFESIONALES CIBERTEC
2.2.2.21 El registro T2CON
El registro de control del TMR2 contiene los bits de habilitacin, configuracin y factor
de divisin para el timer2.

- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Bit7 Bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

TOUTPSX: Selector del factor de post divisin

TOPS3 S2 S1 S0 POST TMR2
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
0 1 0 0 5
.
.
.
.
.
.
1 1 1 1 16

TMR2ON: Puesta en marcha del timer
1: Activada
0: Desactivada

T2CKPSX: Selector del factor de divisin

T2CKPS1 PS0 TMR2
0 0 1
0 1 4
1 0 16
1 1 16


2.2.2.22 El registro TXSTA
El registro de control de transmisin y estado serie muestra el estado y permite el
control de la transmisin de datos seriales.

CSRC TX9 TXEN SYNC - BRGH TRMT TX9D
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0



CSRC: Selector de la fuente de clock en modo sncrono
0: clock externo
1: clock interno

TX9: Habilitador de transmisin del noveno bit
0: desactivado
1: activado

TXEN: Habilitador de la transmisin
0: desactivado
1: activado

MI CROCONTROLADORES 77
CIBERTEC CARRERAS PROFESIONALES
SYNC: Selector del modo de trabajo
0: Asncrono
1: Sncrono

BRGH: Selector de velocidad en modo asncrono
0: baja
1: alta

TRMT: Estado del registro de desplazamiento de transmisin
0: En proceso de transmisin
1: vaco

TX9D: Noveno bit de dato a transmitir

2.2.2.23 El registro RCSTA
El registro de control de recepcin y estado serie muestra el estado y permite el control
de la recepcin de datos seriales.

SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

SPEN: Habilitador del puerto serial
0: desactivado
1: activado

RX9: Habilitador del noveno bit a recibir
0: desactivado
1: activado

SREN: Habilitador de recepcin simple en el modo sncrono maestro
0: deshabilitado
1: habilitado

CREN: Habilitador de recepcin continua en modo sncrono asncrono
0: desactivado
1: activado

ADDEN: Habilitador del detector de direccin
0: desactivado
1: activado



FERR: Indicador de error de trama
0: off
1: on

OERR: Indicador de error de sobrecorrimiento
0: off
1: on

RX9D: Noveno bit de dato a recibir

78
CARRERAS PROFESIONALES CIBERTEC
2.2.2.24 El registro ADCON0
El registro de control 0 de conversin A/D contiene los bits de habilitacin, seleccin,
puesta en marcha y estado de la conversin anloga digital.

ADCS1 ADCS0 CHS2 CH1 CH0 GO/DONE - ADON
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

ADCSX: Seleccin del clock de conversin

ADCS1 S0 CLOCK
0 0 F/2
0 1 F/8
1 0 F/32
1 1 FRC

CHSX: Seleccin del canal de conversin

CHS2 S1 S0 CANAL
0 0 0 0 (RA0)
0 0 1 1 (RA1)
0 1 0 2 (RA2)
0 1 1 3 (RA3)
1 0 0 4 (RA5)
1 0 1 5 (RE0)
1 1 0 6 (RE1)
1 1 1 7 (RE2)

GO/DONE: Estado de la conversin
1: En progreso
0: Culmin la conversin.

ADON: Puesta en marcha de la conversin.
1: Activada
0: Desactivada

2.2.2.25 El registro ADCON1
El registro de control 1 de conversin A/D contiene los bits de formato de conversin y
la configuracin de los puertos digitales y anlogos.

ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
Bit7 bit6 bit5 bit4 Bit3 bit2 Bit1 Bit0



ADFM: Formato del resultado de conversin
0: Justificado a la izquierda (8 bits ADRESH y 2 bits ADRESL)
1: justificado a la derecha (2 bits ADRESH y 8 bits ADRESL)

MI CROCONTROLADORES 79
CIBERTEC CARRERAS PROFESIONALES
PCFGX: Configuracin de los puertos anlogos y digitales

PCFG3:
PCFG0
AN7
RE2
AN6
RE1
AN5
RE0
AN4
RA5
AN3
RA3
AN2
RA2
AN1
RA1
AN0
RA0
VREF+ VREF-
0000 A A A A A A A A VDD GND
0001 A A A A - A A A RA3 GND
0010 D D D A A A A A VDD GND
0011 D D D A - A A A RA3 GND
0100 D D D D A D A A VDD GND
0101 D D D D - D A A RA3 GND
0110 D D D D D D D D - -
0111 D D D D D D D D - -
1000 A A A A - - A A RA3 RA2
1001 D D A A A A A A VDD GND
1010 D D A A - A A A RA3 GND
1011 D D A A - - A A RA3 RA2
1100 D D D A - - A A RA3 RA2
1101 D D D D - - A A RA3 RA2
1110 D D D D D D D A VDD GND
1111 D D D D - - D A RA3 RA2

La manipulacin de los bits de todos estos registros especiales se har necesario cada
vez que se configuren y utilicen los puertos, temporizadores, comunicacin serial,
acceso a la EEPROM y canales de conversin anloga digital.














80
CARRERAS PROFESIONALES CIBERTEC

Resumen




Los registros de los puertos PORTA, PORTB, PORTC, PORTD y PORTE son los
encargados de comunicarse con los dispositivos externos, mientras que los
registros TRISA, TRISB, TRISC, TRISD y TRISE son los encargados de configurar
el sentido de trabajo de los puertos.

Los registros INTCON, PIE1, PIE2, PIR1 y PIR2 son los encargados de habilitar las
fuentes de interrupcin e indicar la presencia de sus interrupciones.

Los registros OPTION, T1CON y T2CON son los encargados de configurar y poner
en marcha el funcionamiento de los timers TMR0, TMR1 y TMR2.

Los registros TXSTA y RCSTA son los encargados de configurar la comunicacin
serial tipo USART.

Los registros ADCON0 y ADCON1 son los registros encargados de configurar la
conversin anloga digital.

Si desea saber ms acerca de estos temas, puede consultar la siguiente pgina.

http://www.ate.uniovi.es/fernando/Doc2006/Sed_06/Presentaciones/Organizacion
%20de%20la%20Memoria.pdf
Aqu, hallar informacin sobre la memoria FLASH, los bancos de RAM y
registros.

MI CROCONTROLADORES 81
CIBERTEC CARRERAS PROFESIONALES




EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad media utilizando el Microcontrolador PIC16F877. Los
circuitos sern implementados en protoboards y no deben presentar fallas en las
conexiones realizadas. Por otro lado, los programas que activan el funcionamiento de
los circuitos se desarrollarn mediante comandos de Lenguaje C y el compilador C de
MPLAB y debern garantizar, luego de la correcta instalacin de los mismos, el
funcionamiento mnimo del 80% de las tareas propuestas para las aplicaciones de
lectura y/o escritura de puertos, temporizacin, comunicacin serie, conversin
anloga digital e interrupciones en los cinco puertos del Microcontrolador.


TEMARIO
Gestin de puertos y RAM

ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.

Los alumnos configuran el sentido de trabajo de los puertos.

Los alumnos leen y escriben informacin sobre los puertos.

Los alumnos leen y escriben de modo directo e indirecto de RAM.

UNIDAD DE
APRENDIZAJE
2
82
CARRERAS PROFESIONALES CIBERTEC
2.3 GESTIN DE PUERTOS Y RAM

2.3.1 JUEGO DE INSTRUCCIONES

El PIC16F877, al igual que el PIC16F84, posee 35 instrucciones. A continuacin, se
describen estas:

Orientadas al BYTE
La letra d indica el destino de la operacin. Si d = 0, el destino de la
operacin es el registro de trabajo W, pero si d = 1, el destino ser el
elemento F (registro especial, celda de ram o variable).
ADDWF F,d Suma el registro W y F.
ANDWF F,d And lgico entre W y F
CLRF F Borra todos los bits de F.
CLRW Borra todos los bits de W.
COMF F,d Complementa el valor de F.
DECF F,d Disminuye en uno el valor de F.
DECFSZ F,d Disminuye en uno el valor de F y salta si se hizo cero.
INCF F,d Aumenta en uno el valor de F.
INCFSZ F,d Aumenta en uno el valor de F y salta si se hizo cero.
IORWF F,d Or lgico entre W y F
MOVFW F Transfiere el valor de F a W.
MOVWF F Transfiere el valor del registro W a F.
NOP Ninguna operacin, slo consume un ciclo de mquina.
RLF F,d Rota hacia la izquierda un bit F a travs del Carry.
RRF F,d Rota hacia la derecha un bit F a travs del Carry.
SUBWF F,d Resta el registro W de F.
SWAPF F,d Intercambia los nibbles de F.
XORWF F,d Xor lgico entre W y F


Orientadas al BIT
La letra b indica el bit por manipular del elemento F (registro
especial, celda de ram o variable). Si el bit tiene nombre, se colocar
su nombre en la posicin b; de lo contrario, tendr que indicarse la
posicin que ocupa el bit dentro del elemento F.
BCF F,b Pone a cero (0) el bit b del elemento F.
BSF F,b Pone a uno (1) el bit b del elemento F.
BTFSC F,b Salta si el bit b de F est en cero
BTFSS F,b Salta si el bit b de F est en uno.


Constantes y control
La letra K es el operando constante que puede tomar cualquier valor
numrico o literal comprendido entre 0 y 255. Este valor puede ser
expresado en decimal, hexadecimal o binario. El destino de todas
las operaciones donde interviene K es el registro W.
ADDLW K Suma W ms K.
ANDLW K AND lgica entre W y K
CALL ETIQUETA
Se llama a ejecucin la subrutina cuya direccin lo indica
ETIQUETA.
CLRWDT Borra el temporizado de la funcin watchdog.
GOTO K Salta a la direccin indicada en la ETIQUETA.
IORLW K OR lgico entre W y K
MI CROCONTROLADORES 83
CIBERTEC CARRERAS PROFESIONALES
MOVLW K Transfiere a W el valor de K.
RETFIE Retorno de una subrutina de interrupcin.
RETLW K Retorno de una subrutina comn cargando una constante en W
RETURN Retorno de una subrutina comn
SLEEP Ingreso al modo de descanso
SUBLW K Resta a K, W.
XORLW K Xor lgico entre W y K


2.3.2 ACCESO A LOS PUERTOS

Sabemos que se dispone de los puertos A, B, C, D y E para comunicar al PIC con
cualquier elemento externo y no es suficiente conectar los dispositivos a estos puertos
para que empiecen a funcionar.

2.3.2.1 Configuracin de los puertos
Es necesario indicarle al Microcontrolador el sentido de trabajo de los elementos que
hemos conectado a sus puertos; de no hacerlo, en el mejor de los casos, nuestro
sistema no funcionara bien y, en el peor de los casos, quemaramos algunos bits de
los puertos.

2.3.2.1.1 Entradas o salidas
Al igual que los puertos del PIC16F84, cada pin de los puertos del PIC16F877 es
configurable independientemente y slo puede trabajar en un solo sentido, como
entrada o salida. La configuracin se realiza a travs de los registros TRISX. Donde
TRISA configura al PUERTO A, TRISB configura al PUERTO B, TRISC configura al
PUERTO C, TRISD configura al PUERTO D y TRISE configura al PUERTO E.

Un cero sobre los bits de los registros TRISX configura como salida los pines
relacionados en los PUERTOS, mientras que un uno deja configurado como entrada
los pines relacionados en los PUERTOS.

2.3.2.1.2 Ejemplos de configuracin
Considere que el puerto D tiene conectado leds y switches segn el siguiente
esquema:





El registro de configuracin por manipular sera TRISD y sus bits deberan verse
segn el siguiente esquema:





Para lograr esto, utilizamos el siguiente comando:

set_tris_d(0XF4); // F4 (hexadecimal) = 11110100 (binario)

Recuerde dejar configurado como entradas los bits de los puertos que no se utilizan,
en este caso los tres bits de la izquierda del puerto D.

84
CARRERAS PROFESIONALES CIBERTEC
Supongamos ahora que al PUERTO C se le ha conectado un rel, leds, un switch, un
sensor ptico y un pulsador segn el siguiente esquema:





El registro de configuracin por manipular sera TRISC y sus bits deberan verse
segn el esquema siguiente:





Para lograr esto, utilizamos la siguiente instruccin:
set_tris_c(0X31); // 31 (hexadecimal) = 00110001 (binario)

2.3.2.1.3 Seleccin de los bancos
Existen cuatro bancos que contienen los registros y puertos del PIC16F877 y se sabe
que para acceder alguno de estos se debe realizar previamente la seleccin del banco
de memoria RAM que lo contiene, para tal funcin se emplean un par de bits llamados
RP0 y RP1. De su manipulacin para acceder algn banco, lo realizar
automticamente el compilador PIC C Compiler.


2.3.2.2 Lectura y escritura de los puertos
Una vez dominadas la seleccin de los bancos de memoria y la configuracin de los
puertos, podemos manipular los puertos de comunicacin para enviar o recibir datos a
travs de estos.

2.3.2.2.1 Lectura
Del mismo modo que se leen los datos utilizando el PIC16F84, se realiza el proceso
de lectura con el PIC16F877. Recordemos que se cuentan con dos tipos de instruccin
para este tratamiento: la que est orientada al byte MOVFW sera reemplazada por el
comando DATO=input_X(); donde DATO es una variable tipo char y X el puerto a leer.
Por ejemplo, si queremos leer el puerto B, el comando sera: DATO=input_b();
Y las que estn orientadas al BIT BTFSC y BTFSS seran reemplazadas por los
comandos if(input(PIN)); si queremos evaluar el estado 1 y if(input(PIN)); si queremos
evaluar el estado 0. PIN, en los dos casos, representa el pin del puerto en evaluacin.
Supongamos que necesitamos evaluar el estado 1 del bit 2 del puerto D, el comando
sera: if(input(PIN_D2);

Considere la figura de la izquierda. Para esta conexin sera
necesario utilizar el comando DATO=input_X();.
En cada lectura del teclado utilizaramos DATO=input_d();
con lo cual, la informacin obtenida del teclado se trasladara
sobre la variable DATO que debe ser definida como char.

De acuerdo a la figura de la derecha,
tenemos un pulsador conectado al puerto C. Por tratarse de un
dispositivo de entrada que utiliza un solo bit, utilizaremos los
comandos . if(input(PIN)); o if(input(PIN));. Si se requiere saber que
el pulsador est en 1 usaremos el primer comando
if(input(PIN_C4)); pero si se requiere saber que el pulsador est en 0
usaremos el segundo comando if(input(PIN_C4));
MI CROCONTROLADORES 85
CIBERTEC CARRERAS PROFESIONALES
No hay que preocuparse por seleccionar el banco 0 antes de manipular algn bit de
los puertos, ya que, el compilador PIC C Compiler lo realiza automticamente.


2.3.2.2.2 Escritura
El tratamiento de escritura con el PIC16F877 tambin se realiza del mismo modo que
la escritura con el PIC16F84. Las instrucciones asociadas a este proceso son las que
estn orientadas al byte MOVWF sera reemplazada por el comando output_X(DATO);
donde X el puerto a manipular y DATO la constante o variable de 8 bits que deseamos
escribir en el puerto. Por ejemplo, si queremos escribir el valor 0X55 en el puerto B, el
comando sera: output_b(0x55); pero si queremos escribir en el puerto D el valor de
una variable tipo char (8 bits) nombrada VALOR, sera: output_d(VALOR);
Y las que estn orientadas al BIT BCF y BSF seran reemplazadas por los comandos
output_high(PIN); si queremos fijar el estado 1 y output_low(PIN); si queremos fijar el
estado 0. PIN, en los dos casos, representa el pin del puerto a manipular.
Supongamos que necesitamos fijar el estado 1 al bit 1 del puerto A, el comando sera:
output_high(PIN_A1);

Considerando la figura de la izquierda, el PIC tiene conectado un
display de 7 segmentos a su puerto C. Esto implica manipular
varios bits a la vez y por consiguiente, el comando a utilizar sera
output_X(DATO);. Suponga que se desea apagar el display
nodo comn, es decir, sus segmentos se apagan con unos; el
comando sera: output_c(0XFF);.

Pero, si en lugar de displays se tienen leds conectados a los
puertos, tal como se muestra en la figura de la derecha, los
comandos seran output_high(PIN); y output_low(PIN); segn sea lo
requerido, apagarlos o encenderlos. Suponga que los leds se
encuentran en conexin normal, es decir, se apagan con 0 y se
encienden con 1. Los comandos para apagar el primer led y
encender el segundo seran: output_low(PIN_E1); y
output_high(PIN_D5);
De acuerdo a la figura de la derecha, Cules seran las
instrucciones que permitan leer la informacin del teclado y
transferir esta sobre el display repetitivamente? Para leer el
teclado, la instruccin sera DATO=input_c(); y para escribir
sobre el display la instruccin sera output_X(DATO);. Para
la lectura repetitiva sera:

do{
DATO=input_c();
output_b(DATO);
}while(TRUE);



2.3.3 ACCESO A RAM

Esta memoria sirve para el tratamiento de datos y variables. Como ya sabemos, para
la lectura o escritura de la memoria se declarar un arreglo en la memoria y a travs
de variables que utilizaremos como punteros, accederemos a esta tanto para su
lectura como escritura.

86
CARRERAS PROFESIONALES CIBERTEC
Ejemplo1: declarar una tabla que separe 10 datos tipo char.

char tabla[10];

Supongamos que deseamos escribir el dato proveniente del puerto C en la primera
posicin de esta tabla y en la siguiente el dato proveniente del puerto D, las
instrucciones seran:

DATO=input_c();
tabla[0]=DATO;
DATO=input_d();
tabla[1]=DATO;

Si queremos escribir de modo indirecto, tendramos que utilizar una variable que
apunte a las diferentes posiciones dentro de la tabla, el comando se vera asi:

tabla[i]=DATO;

Donde DATO es la variable que contiene el valor a escribir en la tabla e i la posicin a
donde se escribir.

Ejemplo2: declarar una tabla que contenga los cdigos del 0 al 9 para un display
ctodo comn.

char cdigos[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};

Si queremos leer de esta, emplearamos como en el ltimo ejemplo una variable que
apunte a los diferentes cdigos de la tabla, el comando se vera asi:

DATO=tabla[i];

Donde DATO es la variable que recibir el dato de la tabla e i la posicin de donde se
leer.


MI CROCONTROLADORES 87
CIBERTEC CARRERAS PROFESIONALES
2.3.4 Programas aplicativos

A continuacin, se propondrn aplicaciones bsicas de escritura y lectura de puertos.
Se plantearn circuitos y, sobre la base de estos y las condiciones propuestas,
desarrollaremos los programas.

2.3.4.1 Nmero del pulsador activado
Realice el programa que indique sobre los leds el nmero del pulsador que fue
presionado. Es decir, si se activa el pulsador P1, sobre los leds debe aparecer el
nmero 1; si se activa P2, sobre los leds se observar en nmero 2; si se activa P3,
sobre los leds debe aparecer el nmero 3; y si se activa el pulsador P4, los leds
beberan representar el nmero 4.





















Empecemos el desarrollo del programa:

//---------- Configuracin inicial -----------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz

//-----------Programa principal-------------

void main(void)
{
char DATO; // variable que servir para leer el estado de los pulsadores y obtener el
// valor (posicin del pulsador) de la tabla que se mostrar sobre los leds.

char tabla[10]={0,1,2,0,3,0,0,0,4,0}; // tabla que contiene los valores posicin

set_tris_d(0xFF); // entrada todo el puerto D.
set_tris_b(0x00); // salida todo el puerto B.
output_b(0); //leds apagados.
do{
DATO=input_d(); // DATO lee todo el puerto D (con los cuatro pulsadores)
88
CARRERAS PROFESIONALES CIBERTEC
DATO=DATO&0X0F; // validacin slo del estado de los pulsadores
if(DATO!=0){ // si algn pulsador est activado
output_b(tabla[DATO]); } // leer posicin de la tabla y escribirlo en el puerto B.
}while(TRUE); // repetir el bucle
}



2.3.4.2 Desplazamiento de iluminacin sobre leds
Realice el programa que permita desplazar, una sola vez, el encendido de un led de
izquierda a derecha, cada vez que se active el pulsador P1; pero, si se activa el
pulsador P2, el encendido del led se desplazar en sentido contrario. Cada led debe
durar encendido 500ms.





















Iniciemos el desarrollo del programa:

//---------- Configuracin inicial -----------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz

//-----------Programa principal-------------

void main(void)
{
char secuencia[4]={0x01,0x02,0x04,0x08}; // secuencia de activacin de los leds
char i; // variable para desplazarse en la secuencia
set_tris_d(0xFF); // entrada todo el puerto D.
set_tris_b(0x00); // salida todo el puerto B.

output_b(0); // leds apagados.
do{
MI CROCONTROLADORES 89
CIBERTEC CARRERAS PROFESIONALES
if(input(PIN_D2)) // si el pulsador P1 est activado (1)
for(i=0;i<4;i++){ // realizar cuenta de 0 a 3
output_b(secuencia[i]); // sacar dato en secuencia normal y enviar al puerto B
delay_ms(500); // retardo de medio segundo
}

else if(input(PIN_D3)) // si el pulsador P2 est activado (1)
for(i=0;i<4;i++){ // realizar cuenta de 0 a 3
output_b(secuencia[3-i]); // sacar dato en secuencia inversa y enviar al puerto B
delay_ms(500); // retardo de medio segundo
}

}while(TRUE); // repetir bucle
}


2.3.4.3 Control de un motor de paso
Realice el programa que permita activar y desactivar el giro de un motor de paso.
Cada vez que se active el pulsador P1, el motor empezar a girar y se mantendr as,
mientras que, cada vez que se active el pulsador P2, el motor detendr su movimiento
y permanecer detenido. Los motores de paso giran si colocamos en sus terminales
una secuencia repetitiva de cuatro datos: 1010, 1001, 0101 y 0110. Para que el motor
siga girando, se tiene que proveer una y otra vez esta secuencia repetitivamente. El
tiempo que se demore en enviar cada dato de la secuencia determina la velocidad de
giro.






















Iniciemos el desarrollo del programa:

//---------- Configuracin inicial -----------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz

90
CARRERAS PROFESIONALES CIBERTEC
//-----------Programa principal-------------

void main(void)
{
short estado; // variable que se utilizar para activar o desactivar el motor
char secuencia[4]={0x0A,0x09,0x05,0x06}; // secuencia de giro del motor
char i; // variable para desplazarse en la secuencia
set_tris_d(0xFF); // entrada todo el puerto D
set_tris_b(0x00); // salida todo el puerto B

output_b(0); // apagar leds
estado=FALSE; // empezar la variable con estado OFF

do{

do{
if(input(PIN_D2)) // si pulsador de P1 (ON) se activa
activar=TRUE; // fijar en ON el estado de la variable activar
}while(!activar); // repetir bucle si variable activar sigue en estado OFF

do{
for(i=0;i<4;i++){ // realizar cuenta de 0 a 3
output_b(secuencia[i]); // sacar dato en secuencia normal y enviar al puerto B
delay_ms(250); // retardo de 250ms (velocidad de giro)
if(input(PIN_D3)) // si pulsador P2 (OFF) se activa
activar=FALSE;} // fijar en OFF el estado de la variable activar
}while(activar); // repetir bucle si variable activar sigue en estado ON

}while(TRUE); // repetir bucle
}
MI CROCONTROLADORES 91
CIBERTEC CARRERAS PROFESIONALES
2.3.4.4 Mensaje deslizante sobre un LCD
Muestre constantemente sobre el display de cristal lquido de modo deslizante, de
derecha a izquierda, el mensaje: CIBERTEC 2011. Este mensaje estar almacenado
en la memoria RAM.






















Empecemos el desarrollo del programa:

//---------- Configuracin inicial -----------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz


//------funcin que escribe un comando en el display----------

void write_command(char comando)
{
output_low(PIN_B1);
output_low(PIN_B2);
delay_us(1300);
output_high(PIN_B0);
delay_us(1300);
output_d(comando);
delay_us(1300);
output_low(PIN_B0);
delay_us(1300);
output_high(PIN_B1);
output_high(PIN_B2);
delay_us(1300);
}

92
CARRERAS PROFESIONALES CIBERTEC
//------funcin que escribe un caracter en el display----------

void write_char(char caracter)
{
output_d(caracter);
output_high(PIN_B2);
output_low(PIN_B1);
delay_us(1300);
output_high(PIN_B0);
delay_us(2600);
output_low(PIN_B0);
delay_us(1300);
output_low(PIN_B2);
output_high(PIN_B1);
delay_us(1300);
}

//-----------Programa principal-------------

void main(void)
{
char mensaje[13]={'C','I','B','E','R','T','E','C',' ','2','0','1','1'}; // mensaje a mostrar
char i; // variable puntero

set_tris_b(0x00); //todo el PORTB como salida
set_tris_d(0x00); //todo el PORTD como salida
write_command(0x38); // 8 bits de datos,2 filas y caracteres de 7x5 pixeles
write_command(0x60); // desplazar a la derecha el cursor por caracter escrito
write_command(0x0E); // activa la visualizacin del display
write_command(0x01); // borra memoria del display (mensajes anteriores)
write_command(0x02); // coloca el cursor en la primera posicin de la fila 1

for(i=0;i<13;i++){ // bucle para los 13 caracteres del mensaje
write_char(mensaje[i]); // escribe en el display cada caracter
delay_ms(60);} // retardo por cada caracter escrito en el display

delay_ms(2000);} // retardo de 2 segundos antes del desplazamiento

do{
write_command(0XC0); // desplaza el mensaje una posicin a la izquierda
delay_ms(200); // retardo de desplazamiento
}while(TRUE); // repetir desplazamiento
}





MI CROCONTROLADORES 93
CIBERTEC CARRERAS PROFESIONALES
Resumen






El PIC16F877 tambin soporta 35 instrucciones y estn organizadas en tres
grupos: las orientadas al byte, orientadas al bit, y las orientadas al literal y control.

Las instrucciones orientadas al byte permiten transferir datos de 8 bits entre las
memorias y los registros. Las instrucciones orientadas al bit permiten manipular
selectivamente el estado de un bit de las celdas de memoria o registros. Tambin,
permiten averiguar en qu estado se encuentra un bit.

El acceso a los puertos (PORTA, PORTB, PORTC, PORTD y PORTE) inicia con la
configuracin a travs de los registros TRISX. Un cero sobre sus bits configura
como salida y un uno como entrada.

La seleccin de los bancos de RAM para configurar los registros TRIS o para
manipular los puertos es obviada, ya que, el compilador C de MPLAB incluye
automticamente los comandos de seleccin.

El acceso a la memoria RAM empleando comandos de Lenguaje C requiere la
declaracin de un arreglo de datos, definir los datos de este arreglo si se requiere y
luego, sin necesidad de saber en qu direccin inicia o acaba este arreglo, se
puede leer o escribir sobre este empleando una variable puntero.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.


http://www.alos.5u.com/pic16f877/Modulo1a.htm#1.%20Registros%20para%20el%2
0manejo%20de%20puertos%20digitales
Aqu, hallars informacin sobre los puertos del PIC16F877.


http://www.todorobot.com.ar/documentos/display.pdf
Aqu, hallar informacin sobre los comandos de un LCD.





94
CARRERAS PROFESIONALES CIBERTEC




EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad media utilizando el Microcontrolador PIC16F877. Los
circuitos sern implementados en protoboards y no deben presentar fallas en las
conexiones realizadas. Por otro lado, los programas que activan el funcionamiento de
los circuitos se desarrollarn mediante comandos de Lenguaje C y el compilador C de
MPLAB y debern garantizar, luego de la correcta instalacin de los mismos, el
funcionamiento mnimo del 80% de las tareas propuestas para las aplicaciones de
lectura y/o escritura de puertos, temporizacin, comunicacin serie, conversin
anloga digital e interrupciones en los cinco puertos del Microcontrolador.


TEMARIO
Gestin de temporizacin

ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC y configuran sus puertos.

Los alumnos configuran y ponen en marcha los timers.


UNIDAD DE
APRENDIZAJE
2
MI CROCONTROLADORES 95
CIBERTEC CARRERAS PROFESIONALES
2.4 GESTIN DE TEMPORIZACIN

El PIC16F877 dispone de tres temporizadores denominados TMR0, TMR1 y TMR2.
Dos son de 8 bits y uno de 16 bits. A continuacin, se detallar su funcionamiento,
configuracin y puesta en marcha de cada uno de estos.

2.4.1 El TMR0

El TMR0 de este PIC es de 8 bits y funciona del mismo modo que el TMR0 del
PIC16F84. Puede trabajar en modo contador o temporizador. En el siguiente
esquema, se observa el sistema funcional y los bits de configuracin.












2.4.1.1 Modos de operacin
Cuando funciona en el modo contador, el registro de trabajo TMR0 recibe los pulsos
provenientes de la entrada RA4, mientras que, en el modo temporizador, los pulsos
provienen de la entrada F/4. Sin importar el modo en que opere, el principio de trabajo
es el mismo: ingresan los pulsos ya sea de RA4 o F/4, pasan por la preescala si se
requiere y llegan al registro de trabajo TMR0, el cual, por cada pulso recibido, aumenta
hasta desbordarse, causando la activacin del bit T0IF.

2.4.1.1.1 Modo Contador
Cuando trabajamos con este modo, es porque necesitamos contabilizar pulsos
externos provenientes, lo ms probable, de sensores. Es obligado seleccionar el clock
externo (RA4), fijar el tipo de flanco para el avance de la cuenta, anular el factor de
divisin (a menos que sea til) y, finalmente, inicializar el registro de trabajo.

La aparicin de cada flanco del sensor se inyecta sobre la entrada de reloj del registro
de trabajo (TMR0), lo cual aumenta en uno su valor. Recordemos que este registro es
de 8 bits, su valor mnimo es 00h y su valor mximo es FFh, es decir, 0 y 255. Cuando
el registro se encuentra en su valor mximo (FFh o 255) y en ese instante recibe un
flanco ms, este no puede pasar a 256; en cambio, regresa a su valor mnimo y activa
el bit de desborde T0IF (Esto indica que la cuenta ha culminado).

2.4.1.1.1.1 Secuencia de configuracin
Supngase que deseamos contabilizar 20 pulsos provenientes de un sensor ptico. El
sensor tendr que ser conectado al pin RA4/T0CKI y la configuracin ser como se
muestra a continuacin:

1- Eleccin del clock externo BSF OPTION_REG, T0CS
2- Fijar flanco de subida para la cuenta BCF OPTION_REG, T0SE
3- Anular el factor de divisin BSF OPTION_REG, PSA
4- Inicializar el registro de trabajo MOVLW .236
MOVWF TMR0
96
CARRERAS PROFESIONALES CIBERTEC


Recuerde el registro OPTION

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 Bit1 bit0

T0CS: Selector de la fuente de reloj para el TMR0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4

T0SE: Selector del tipo de flanco externo para el TMR0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMER por flanco de subida del pin RA4/TOCKI

PSA: Desviador del factor de divisin de la seal de reloj
1: Hacia la funcin de WATCHDOG
0: Hacia la funcin del TIMER

Recordemos que el indicador T0IF se activa cuando el registro de trabajo pasa de su
valor mximo FFh (255) a su valor mnimo 00h (0). Y como nuestro registro de trabajo
aumentar en uno por cada flanco de subida del sensor, la activacin del indicador
T0IF ocurrir despus de 256 (desborde de 255 a 0) 236 (valor de inicializacin del
registro de trabajo) pulsos; los 20 pulsos que deseamos contabilizar. Como frmula, el
valor de inicializacin (VI) del registro de trabajo TMR0 se obtiene al restar 256 menos
la cantidad de pulsos por registrar. VI = 256 #PULSOS.

2.4.1.1.2 Modo Temporizador
Cuando trabajamos en este modo, es porque deseamos generar retardos o bases de
tiempo, como por ejemplo el segundero de un reloj. Es obligado seleccionar el clock
interno, el cual obtiene la frecuencia del cristal dividida entre cuatro (F/4). De ser
necesario, se debe elegir un factor de divisin y asignrselo al TMR0. La aparicin de
cada pulso sobre la entrada de reloj del registro de trabajo (TMR0) har que este
aumente en uno su valor, hasta que en algn momento genere su desbordamiento y,
por lo tanto, la activacin del indicador T0IF. Cada pulso que llegue al registro de
trabajo tiene una frecuencia que se calcula de la siguiente manera:

F = (f/4)/factor de divisin = f/(4*factor de divisin)

Si a esta le aadimos la cantidad de pulsos a contar, tendramos lo siguiente:

F = f/(4*factor de divisin*#pulsos)

Pero, el tiempo transcurrido se calculara de la siguiente forma:

T = (4*factor de divisin*#pulsos)/f

Frecuencia F = f/(4*factor de divisin*#pulsos)
Tiempo T = (4*factor de divisin*#pulsos)/f

Si tendramos un cristal 4Mhz y querramos generar un retardo de 10ms, cul sera el
factor de divisin y cuntos pulsos seran necesarios contabilizar para lograr dicho
temporizado?.

Veamos: 10ms = 4*factord*#pulsos/4Mhz

10ms = factord*#pulsos * 1us ; ya que 1/Mhz es 1 microsegundo (us)
MI CROCONTROLADORES 97
CIBERTEC CARRERAS PROFESIONALES

10ms = factord*#pulsos* 1ms/1000 ; ya que 1us = 1ms/1000

10ms*1000 = factord*#pulsos*1ms

10000 = factord*#pulsos

Observe el registro OPTION para saber qu valores asignar al factor de divisin.

Registro OPTION

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

PS2-PS1-PS0: Selectores del factor de divisin de la seal de reloj

PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128

Haciendo el factord = 256 tendramos: 1000 = 256*#pulsos

De aqu, #pulsos = 10000/256 = 39

Por lo tanto, el registro TMR0 tendra que ser inicializado con el valor: 256 39 = 217

2.4.1.1.2.1 Secuencia de configuracin
Supngase que deseamos lograr un temporizado de 40ms:

1- Eleccin del clock interno f/4 BCF OPTION_REG, T0CS
2- Asignar el factor de divisin al timer BCF OPTION_REG, PSA
3- Establecer el factor 256 de divisin BSF OPTION_REG, PS0
BSF OPTION_REG, PS1
BSF OPTION_REG, PS2
4- Inicializar el registro de trabajo MOVLW .100
(256 156) MOVWF TMR0


Empleando los comandos del compilador PIC C Compiler:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_TIMER0(100);

Nuevamente, de este modo se ve ms fcil la programacin.






98
CARRERAS PROFESIONALES CIBERTEC
2.4.2 El TMR1

Este TIMER es de 16 bits y, al igual que el TMR0, trabaja en los modos de cuenta y
temporizacin. A continuacin, se mencionan sus caractersticas:
- Dispone de dos registros de trabajo de 8 bits denominados TMR1H y TMR1L.
- Se puede elegir un clock externo o interno.
- El clock externo podra provenir de un oscilador o una seal cualesquiera.
- Se puede establecer un factor de divisin.
- Interrumpe cuando los registros de trabajo se desbordan de FFFFh a 0000h.

El siguiente esquema muestra el sistema funcional y sus bits de configuracin:



2.4.2.1 Operacin
La secuencia de trabajo del timer 1 es similar a la del timer 0, con la diferencia que
posee 16 bits de trabajo y no 8. Tiene la posibilidad de adaptarle un oscilador externo,
lo cual facilitara el desarrollo de retardos ms amplios.

Recordemos el registro T1CON

El registro de control del timer 1 contiene los bits de habilitacin, configuracin y factor de divisin para el
timer 1.



T1CKPS1- T1CKPS0: Selector del factor de divisin
0 0 1
0 1 2
1 0 4
1 1 8

T1OSCEN: Oscilador externo
1: Habilitado
0: Deshabilitado

T1SYNC: Sincronizacin de entrada del oscilador externo
0: Habilitada
1: Desactivada

TMR1CS: Eleccin de la fuente de reloj
1: Externa a travs del pin RC0/T1OSO/T1CKI
0: Interna (F/4)

TMR1ON: Puesta en marcha del timer
MI CROCONTROLADORES 99
CIBERTEC CARRERAS PROFESIONALES
1: Activada
0: Desactivada


2.4.2.1.1 Secuencia de configuracin en el modo contador
Supngase que deseamos contabilizar 1000 pulsos provenientes de un sensor ptico.
El sensor tendr que ser conectado al pin RC0/T1OSO/T1CKI y la configuracin ser
como se muestra a continuacin:

1- Elegir clock externo BSF T1CON, TMR1CS
2- Desactivar el oscilador externo BCF T1CON, T1OSCEN
3- Anular el factor de divisin (1) BCF T1CON, T1CKPS0
BCF T1CON, T1CKPS1
4- Inicializar los registros de trabajo MOVLW 0x18
MOVWF TMR1L
65536 1000 = 64536 = FC18 MOVLW 0XFC
MOVWF TMR1H
5- Poner en marcha al timer BSF T1CON, TMR1ON

Aplicando los comandos del compilador PIC C Compiler tendramos:
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); // clock externo y factor anulado (1)
set_TIMER1(64536); // inicializacin del timer1 para contar 1000 pulsos


2.4.2.1.2 Secuencia de configuracin en el modo temporizador
Supngase que se dispone de un cristal de 8Mhz y se desea realizar un retardo de
100ms. La configuracin debera considerar los siguientes pasos:

1- Eleccin del clock interno f/4 BCF T1CON, TMR1CS
2- Elegir el factor 8 de divisin BSF T1CON, T1CKPS0
BSF T1CON, T1CKPS1
3- Inicializar los registros de trabajo MOVLW 0x58
MOVWF TMR1L
65536 25000 = 40536 = 9E58 MOVLW 0X9E
MOVWF TMR1H
4- Poner en marcha el timer BSF T1CON, TMR1ON

Recordemos que el tiempo transcurrido para la temporizacin se calcula de la
siguiente manera:

T= (4*factor de divisin*pulsos a contar)/f

100
CARRERAS PROFESIONALES CIBERTEC
Veamos: T = ( 4 * 8 * 25000 ) / 8Mhz
T = ( 4 * 25000 ) / 1Mhz
T = 100000 / 1Mhz

Pero 1Mhz = 1000Khz
Entonces : T = 100000 / 1000Khz
T = 100 / 1Khz
T = 100 * 1/1Khz
Sin embargo, 1/1Khz = 1ms
Por lo tanto, T = 100 ms (el tiempo requerido).

Aplicando los comandos del compilador PIC C Compiler tendramos:
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // clock interno y factor 8
set_TIMER1(40536); // inicializacin del timer1 para contar 25000 pulsos
TMR1ON=1; // poner en marcha el TIMER1


2.4.3 El TMR2
Este timer es de 8 bits al igual que el TMR0, pero solo funciona en modo temporizador
y tiene un modo especial de operar. A continuacin, se mencionan sus caractersticas:
- Dispone de dos registros de trabajo de 8 bits denominados TMR2 y PR2.
- Slo trabaja con el clock interno (f/4).
- Se puede establecer un pre y post factor de divisin.
- Interrumpe cuando el post factor de divisin reinicia.

2.4.3.1 Operacin
El registro de trabajo TMR2
incrementa su valor por cada
pulso recibido, es decir, por
cada f/4/pre factor de
divisin. En algn momento,
el valor de este registro
coincide con el valor del
registro PR2, por lo cual
suceden dos cosas: la
primera es reiniciar a 0 el
valor del registro TMR2; y la
segunda es afectar al post
divisor, disminuyndolo en
uno cada vez que esto sucede. Cuando el valor del post divisor (postscaler) se hace
cero, suceden dos situaciones adicionales: la primera es reiniciar el valor de post
divisin de acuerdo con la configuracin realizada; y la segunda es activar el bit
indicador de interrupcin TMR2IF, culminando de este modo el proceso.
El modo operativo es parecido al timer0. La diferencia radica en la reinicializacin
automtica del registro de trabajo TMR2, lo cual facilita el trabajo de las bases de
tiempo.

MI CROCONTROLADORES 101
CIBERTEC CARRERAS PROFESIONALES
Recordemos el registro T2CON

- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Bit7 Bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

TOUTPSX: Selector del factor de post divisin

TOPS3 S2 S1 S0 POST TMR2
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
.
.
.
.
.
.
1 1 1 1 16

TMR2ON: Puesta en marcha del timer
1: Activada
0: Desactivada

T2CKPSX: Selector del factor de divisin

T2CKPS1 PS0 TMR2
0 0 1
0 1 4
1 0 16
1 1 16


2.4.3.1.1 Secuencia de operacin
Realice la secuencia necesaria para establecer una base de tiempo de 32 ms, es
decir, generar interrupciones repetitivas del TMR2 cada 32 ms. Considere, adems,
que el cristal es de 4Mhz.
Los siguientes pasos deben tenerse en cuenta para la configuracin:

1- Inicializar TMR2 en cero CLRF TMR2
2- Fijar el valor del registro PR2 en 250 MOVLW .250
MOVWF PR2
3- Seleccionar el factor de pre divisin BSF T2CON, T2CKPS0
en 16 BSF T2CON, T2CKPS1
4- Establecer el factor de post division BSF T2CON, T2OUTPS0
BSF T2CON, T2OUTPS1
En 8 BSF T2CON, T2OUTPS2
BCF T2CON, T2OUTPS3
5- Poner en marcha al timer BSF T2CON, TMR2ON

El tiempo total transcurrido sera: 4*16*250*8/4Mhz = 32000us = 32ms

102
CARRERAS PROFESIONALES CIBERTEC
Aplicando comandos del compilador PIC C Compiler:

set_TIMER2(0); // inicializar TMR2 en cero
setup_timer_2(T2_DIV_BY_16,250,8); // pre division a 16, PR2 con 250
// y post division a 8
TMR2ON=1; // poner en marcha al timer


2.4.4 Programas aplicativos

A continuacin, se propondrn programas que tienen como aplicacin el uso de los
temporizadores.

2.4.4.1 Desplazamiento constante de un led encendido
Realice el programa que muestre de modo repetitivo, sobre el puerto D, la secuencia
de desplazamiento de un solo led encendido de derecha a izquierda y viceversa. Cada
led debe permanecer encendido durante segundo. Utilice el TMR1 para la
temporizacin.






















Realicemos los clculos previos para el factor de divisin y el valor inicial del registro
de trabajo.
Recordemos que el tiempo se calcula as:
T= (4*factor de divisin*pulsos a contar)/f
Veamos:

Considerando el factor mximo de divisin (8) y la frecuencia del cristal de 4Mhz
(segn el esquema), los pulsos por contabilizar seran as:

Pulsos por contar = T*f/4*factor de divisin = 500ms*4000Khz/4*8 = 62,500

Pero, el valor inicial de los registros de trabajo se obtiene como 65,536 62,500
= 3036.

MI CROCONTROLADORES 103
CIBERTEC CARRERAS PROFESIONALES
Aplicando los comandos del compilador PIC C Compiler tendramos:
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // clock interno y factor 8
set_TIMER1(3036); // inicializacin del timer1 para contar 62500 pulsos
TMR1ON=1; // poner en marcha el TIMER1

Investigue que registro contiene al bit indicador de desbordamiento del TIMER1
(TMR1IF), es necesario saber cul es la direccin de este registro en la memoria RAM
y tambin, cul es la posicin del bit (TMR1IF) dentro de este registro. Es fundamental
para detectar el desbordamiento del TIMER1. Adems, es necesario saber cul es el
registro que contiene al bit TMR1ON y su posicin en este, ya que con este se controla
la puesta en marcha del TIMER1.


Iniciemos el programa:

//------Configuracin inicial----------------------------------------------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4Mhz
#bit TMR1IF=0XC.0 // variable indicadora de desborde del TMR1
#bit TMR1ON=0X10.0 // variable de puesta en marcha del TMR1

//------Funcin de 500ms con el TMR1------------------------------

void medio_segundo()
{
set_TIMER1(3036);
TMR1IF=0;
do{
}while(TMR1IF==0);
}

//------Programa principal-----------------------------------------------

void main(void)
{
char i; // i ser el contador para tabla que contiene la secuencia
// declaracin y asignacin de valores a la tabla tabla
char secuencia[14]={1,2,4,8,16,32,64,128,64,32,16,8,4,2,};
set_tris_d(0x00); // configuracn del PORTB completo como salida.


setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // configuracin del TIMER
TMR1ON=1; // puerta en marcha del TIMER

do{
for(i=0;i<15;i++){ // bucle de 14 repeticiones
output_d(secuencia[i]); // lee secuencia y escribe en el puerto D
medio_segundo();} // retardo de 500ms
}while(TRUE); // repetir el bucle
}

104
CARRERAS PROFESIONALES CIBERTEC
2.4.4.2 Seal de 1 KHz
Realice el programa que muestre sobre la patilla 2 del puerto B, una onda cuadrada
que tenga una frecuencia de 1Khz. Utilice el TMR2 para la temporizacin de 1/2
milisegundo.






















Realicemos los clculos previos para el factor de divisin y el valor inicial del registro
de trabajo.
Recordemos que el tiempo se calcula as:
T= (4*factor de divisin*PR2)/f
Veamos:

Considerando como factor de divisin 4, la frecuencia del cristal de 4Mhz (segn el
esquema) y 25 el valor de PR2. El tiempo transcurrido en cada coincidencia con PR2
sera 4*4*25/4Mhz = 0.1ms; y considerando el factor de post divisin 5, el tiempo total
transcurrido sera 0.1 * 5 = 0.5ms.

Aplicando los comandos del compilador PIC C Compiler tendramos:
setup_timer_2(T2_DIV_BY_4,25,5); // factor de division 4, PR2 = 25 y post factor 5
set_TIMER2(0); // siempre se inicializa el timer2 con 0

Iniciemos el programa:

//------Configuracin inicial----------------------------------------------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4Mhz
#bit TMR2IF=0XC.1 // variable indicadora de desborde del TMR2
#bit TMR2ON=0X12.2 // variable de puesta en marcha del TMR2

MI CROCONTROLADORES 105
CIBERTEC CARRERAS PROFESIONALES
//------Funcin de 500us con el TIMER2----------------------------

void medio_ms()
{
TMR2IF=0;
do{
}while(TMR2IF==0);
}

//------Programa principal-----------------------------------------------

void main(void)
{
set_tris_b(0x00); // configucin del PORTB completo como salida

setup_timer_2(T2_DIV_BY_4,24,5); // configuracin del TIMER2
set_TIMER2(0); // TMR2 inicia siempre con 0
TMR2ON=1; // puesta en marcha del TIMER2

do{
output_high(PIN_B2); // onda a 1
medio_ms(); // medio milisegundo de retardo
output_low(PIN_B2); // onda a 0
medio_ms(); // medio milisegundo de retardo
}while(TRUE); // repetir el bucle
}









106
CARRERAS PROFESIONALES CIBERTEC

Resumen






El PIC16F877 dispone de tres temporizadores para el tratamiento de las
aplicaciones relacionadas con el tiempo. Los dispositivos se denominan TMR0,
TMR1 y TMR2.

El temporizador TMR0 es de 8 bits y trabaja de modo idntico al temporizador
TMR0 del PIC16F84.

El temporizador TMR1 es de 16 bits. Sus registros de trabajo son TMR1H y
TMR1L. Estos registros pueden operar recibiendo los pulsos provenientes del
cristal F/4 (reloj interno) o de una fuente externa de reloj (proveniente de algn
sensor u oscilador). Adems, poseen una preescala de divisin, mxima de 8, que
aletarga la llegada de los pulsos a sus registros de trabajo. Generado el desborde
de los registros, se activa su bit indicador TMR1IF.

El temporizador TMR2 es de 8 bits y algo especial en su funcionamiento. Slo
trabaja con el reloj interno (F/4), dispone de una preescala de divisin y de una
post escala de divisin. Asimismo, utiliza dos registros: el TMR2 y el PR2. La
preescala aletarga los pulsos que llegan al registro TMR2 y hace que este aumente
su valor. Cada vez que el valor de este registro coincide con el registro PR2, el
valor de la post escala de divisin disminuye en uno y el registro TMR2 se reinicia
en 0. Si el valor de la post escala de divisin se desborda, culmina el temporizado
activndose el bit indicador TMR2IF y recargndose la post escala de divisin con
su valor de previa configuracin.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.


http://www.alos.5u.com/pic16f877/Modulo2.html
Aqu, hallar informacin sobre los temporizadores del PIC16f877.









MI CROCONTROLADORES 107
CIBERTEC CARRERAS PROFESIONALES




EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad media utilizando el Microcontrolador PIC16F877. Los
circuitos sern implementados en protoboards y no deben presentar fallas en las
conexiones realizadas. Por otro lado, los programas que activan el funcionamiento de
los circuitos se desarrollarn mediante comandos de Lenguaje C y el compilador C de
MPLAB y debern garantizar, luego de la correcta instalacin de los mismos, el
funcionamiento mnimo del 80% de las tareas propuestas para las aplicaciones de
lectura y/o escritura de puertos, temporizacin, comunicacin serie, conversin
anloga digital e interrupciones en los cinco puertos del Microcontrolador.


TEMARIO
Gestin de comunicacin y ADC

ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.

Los alumnos configuran el sentido de trabajo de los puertos serie.

Los alumnos leen y escriben informacin sobre los puertos serie.



UNIDAD DE
APRENDIZAJE
2
108
CARRERAS PROFESIONALES CIBERTEC
2.5 GESTIN DE COMUNICACIN Y ADC
2.5.1 COMUNICACIN SERIE
La comunicacin serie es un medio muy necesario si se trata de ahorrar lneas de
conexin o alcanzar mayores distancias que la comunicacin paralela limita. En la
actualidad, esta forma de transferir informacin es frecuentemente usada por los
circuitos integrados y sistemas digitales. El Microcontrolador PIC16F877 dispone de
varios modos de comunicacin de este tipo. En este captulo, describiremos y
analizaremos uno de estos.

2.5.1.1 USART
El USART (universal sncrono asncrono recepcin transmisin) permite transmitir y
recibir informacin bit a bit cual fuese el desplazamiento de un registro. Cada dato de 8
bits es transferido bajo el siguiente formato:
1 bit de start (0)
8 bits de datos (XXXXXXXX)
1 bit de control (paridad)
1 bit de stop (1)
El USART puede funcionar de modo sncrono o asncrono. Cuando trabaja en modo
sncrono utiliza una seal de reloj para el sincronismo y solo puede operar en una
direccin, es decir, solo transmite o solo recibe informacin. Mientras que cuando
trabaja en modo asncrono, puede transferir o recibir informacin a la vez.
La comunicacin serie maneja un parmetro que determina la velocidad de
desplazamiento de los bits. Esta se mide en baudios (bits por segundo). Es necesario
que el sistema transmisor y receptor sincronicen este parmetro.

2.5.1.1.1 Transmisin de un dato
En este proceso, los datos que se desean transmitir se escriben sobre un registro
especial y automticamente empieza la transmisin, envindose uno por uno sus bits
a travs del pin RC6 del Microcontrolador, hasta vaciar totalmente el contenido del
registro. Observando el esquema de abajo, notamos que la escritura se debe realizar
sobre el registro TXREG. Este, a su vez, transfiere su valor sobre el registro TSR.
Desde este registro, se inicia el desplazamiento de los bits, de izquierda a derecha y
tan rpido como lo permita el generador de baudios. Cada bit desplazado pasa por el
buffer para llegar, finalmente, a transmitirse por el pin RC6/TX/CK.









MI CROCONTROLADORES 109
CIBERTEC CARRERAS PROFESIONALES
Observe que, para la transferencia de los bits hacia el pin RC6/TX/CK, existe un bit de
control llamado SPEN (habilitador del puerto serie). Este debe encontrarse habilitado;
de lo contrario, ningn bit podr salir del buffer. El proceso en detalle sera as:
a) Copia manual del dato (a transmitir) sobre el registro TXREG
b) Copia automtica de TXREG sobre el registro TSR
c) Activacin del indicador TXIF y si la interrupcin por transmisin estuviese
activada (TXIE = 1), se generara la interrupcin respectiva. Al mismo tiempo,
el indicador de proceso de la transmisin se activa (TRMT = 0).
d) Transmisin del bit de START (LSB) de TSR hacia el pin RC6/TX/CK
e) Transmisin bit a bit de los 8 siguientes bits (dato) de TSR. Si la transmisin
del noveno bit se encontrase habilitado (TX9=1), inmediatamente se
transmitira el bit TX9D, que podra ser el bit de paridad del dato enviado.
f) Desactivacin del indicador de proceso de la transmisin (TRMT = 1)
g) Finalmente, se transmite el bit de STOP (1).

La rapidez con la que se desplazan los bits es controlada por el registro SPBRG y el
bit BRGH. Sin embargo, para que esta seal de sincronismo se pueda utilizar, debe
activarse (1) el bit TXEN.

2.5.1.1.2 Recepcin de datos
En este proceso, los datos son recibidos bit a bit a travs del pin RC7. Estos ingresan
a un registro especial para formar el dato de 8 bits. El proceso se inicia con la
aparicin del bit de START (0) sobre el pin RC7/RX/DT. Note, en el siguiente
esquema, que, para recibir los datos provenientes de este pin, el puerto serial debe
encontrarse habilitado (SPEN = 1).
El proceso contina segn el siguiente orden:
a) El bit en cero (bit de START) es recuperado y desplazado hacia RSR.
b) Recuperacin de los 8 bits siguientes (DATO) y desplazamiento hacia RSR
c) Recuperacin del noveno bit (si lo hubiese) y desplazamiento hacia RSR
d) Recuperacin del bit de STOP (1), el cual es desplazado hacia el registro RSR
del mismo modo y genera tres acciones:
1- Los ocho bits de datos de este registro <7:0> son transferidos a RCREG.
2- El bit (8) es trasladado al bit RX9D si est habilitado (RX9 = 1).
3- Activacin del indicador RCIF y la interrupcin respectiva si est habilitada
















110
CARRERAS PROFESIONALES CIBERTEC
La rapidez con la que se desplazan los bits es controlada por el registro SPBRG y el
bit BRGH. Los bits OERR y FERR son indicadores de error durante la recepcin.

2.5.1.1.3 Registros asociados
Es necesario configurar y manipular los bits de estos registros para tener acceso a
este tipo de comunicacin. Los registros asociados son los siguientes:
TXSTA: Registro de configuracin para la transmisin. Est ubicado en el banco 1.
RCSTA: Registro de configuracin para la recepcin. Pertenece al banco 0.
SPBRG: Registro para la configuracin de los baudios. Se encuentra en el banco 1.
RCREG: Registro de datos de la recepcin. Se trabaja en el banco 0.
TXREG: Registro de datos de la transmisin. Se sita en el banco 0.

2.5.1.1.3.1 Registro TXSTA
Este registro muestra el estado y permite el control de la transmisin de datos seriales.
CSRC TX9 TXEN SYNC - BRGH TRMT TX9D
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

CSRC: Selector de la fuente de clock en modo sncrono
0: clock externo
1: clock interno

TX9: Habilitador de transmisin del noveno bit
0: desactivado
1: activado

TXEN: Habilitador de la seal de reloj (baudios)
0: desactivado
1: activado

SYNC: Selector del modo de trabajo
0: Asncrono
1: Sncrono

BRGH: Selector de velocidad en modo asncrono
0: baja
1: alta

TRMT: Indicador del estado del registro de desplazamiento de transmisin
0: En proceso de transmisin
1: vaco

TX9D: 9no bit de dato por transmitir

MI CROCONTROLADORES 111
CIBERTEC CARRERAS PROFESIONALES
2.5.1.1.3.2 Registro RCSTA
Este registro muestra el estado y permite el control de la recepcin de datos seriales.
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

SPEN: Habilitador del puerto serial
0: desactivado
1: activado

RX9: Habilitador del noveno bit a recibir
0: desactivado
1: activado

SREN: Habilitador de recepcin simple en el modo sncrono maestro
0: deshabilitado
1: habilitado

CREN: Habilitador de recepcin continua en modo sncrono asncrono
0: desactivado
1: activado

ADDEN: Habilitador del detector de direccin
0: desactivado
1: activado

FERR: Indicador de error de trama
0: off
1: on

OERR: Indicador de error de sobrecorrimiento
0: off
1: on

RX9D: Noveno bit por recibir

2.5.1.1.3.3 Registro SPBRG
Como se mencion en algunas lneas anteriores, la velocidad depende del valor del
registro SPBRG y del bit BRGH del registro TXSTA, tal como se muestra en la
siguiente tabla:
SYNC Baja velocidad (bit BRG = 0) Alta velocidad (bit BRG = 1)
0 (asncrono) Baudios = F/64(X+1) Baudios = F/16(X+1)
1 (sncrono) Baudios = F/4(X+1) n/a

El valor de X puede variar de 0 a 255. Supngase que se desea establecer la
velocidad a 2400 baudios (bits por segundo) en el modo asncrono y en alta velocidad.
La frmula que se utilizara sera Baudios = F/16(X+1). Considere que el cristal es de
4Mhz.
Reemplazando valores tenemos lo siguiente:
2400Hz = 4Mhz/(16(X+1))
2400Hz = 4000000Hz/(16(X+1))
112
CARRERAS PROFESIONALES CIBERTEC
X+1 = 4000000HZ/16*2400Hz
X+1 = 104.16
X = 103.16
Sin embargo, como X es un valor entero, lo redondeamos a 103.
Con estos resultados, las instrucciones que lograran establecer esta velocidad seran
las siguientes:
BSF TXSTA, BRGH
MOVLW .103
MOVWF SPBRG

2.5.1.1.4 Secuencia de configuracin para la transmisin
Supngase que se desea transmitir un valor por el puerto serial a una velocidad de
4800 baudios, sin noveno bit (paridad), en modo asncrono y utilizando un cristal de
8Mhz.
Se considerarn los siguientes pasos:
1- Establecer la velocidad de comunicacin a 4800 baudios
2- Seleccionar el modo de comunicacin asncrono
3- Deshabilitar el 9no bit de dato (paridad)
4- Habilitar la transmisin
5- Habilitar el puerto serial
6- Transmitir el dato deseado
Las instrucciones seran las siguientes:

BCF TXSTA,BRGH ;velocidad
MOVLW .25 ;a
MOVWF SPBRG ;4800 baudios
BCF TXSTA,SYN ;seleccin del modo asincrnico
BCF TXSTA,TX9 ;desactivacin del 9no bit de datos
BSF TXSTA,TXEN ;habilitacin de la transmisin
BSF RCSTA,SPEN ;habilitacin del puerto serial
Aplicando los comandos del compilador PIC C Compiler tendramos:

#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Con la ejecucin de estas instrucciones, el puerto serial quedara configurado y listo
para transmitir cualquier dato. Supongamos que se desea enviar una constante, por
ejemplo 55h, las instrucciones seran las siguientes:

TXREG=0X55;

Si en lugar de una constante se desea enviar el valor de una variable, cuyo nombre es
DATO, las instrucciones seran las siguientes:

TXREG=DATO; // DATO tiene que ser una variable tipo char

Pero, si se quisiera enviar el valor de un puerto; por ejemplo, el valor del PORTD, las
instrucciones serian las siguientes:

TXREG=input_d();

MI CROCONTROLADORES 113
CIBERTEC CARRERAS PROFESIONALES
Y si se deseara enviar algn dato de una tabla almacenada en memoria RAM, se
empleara la siguiente instruccin:

TXREG=tabla[i]; // table es la variable que apunta a una table con datos tipo char
// e i la variable que apunta a los datos de esta tabla


2.5.1.1.5 Secuencia de configuracin para la recepcin

Supngase que se desea recibir valores por el puerto serial a una velocidad de 9600
baudios, sin 9no bit (paridad), en modo asncrono y con un cristal de 8Mhz.

1- Establecer la velocidad de comunicacin a 9600
2- Seleccionar el modo de comunicacin asncrono
3- Deshabilitar el 9no bit de dato (paridad)
4- Establecer el modo recepcin
5- Deshabilitar la transmisin (habilitar la recepcin)
6- Habilitar el puerto serial
7- Recibir datos

Las instrucciones serian las siguientes:

BCF TXSTA,BRGH ;velocidad
MOVLW .12 ;a
MOVWF SPBRG ;9600 baudios
BCF TXSTA,SYN ;seleccin del modo asincrnico
BCF TXSTA,TX9 ;desactivacin del 9no bit de datos (paridad)
BCF TXSTA,TXEN ;des habilitacin de la transmisin
BSF RCSTA,SPEN ;habilitacin del puerto serial

Aplicando los comandos del compilador PIC C Compiler tendramos:

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


Con la ejecucin de estas instrucciones, el puerto serial quedara configurado y listo
para recibir cualquier dato. Tenemos dos opciones para recibir un dato:

1- Activar la interrupcin por recepcin y desarrollar la subrutina de interrupcin
relacionada para esto
2- No activar la interrupcin, pero verificar constantemente el estado del indicador
de interrupcin RCIF. Cuando este bit se pone a 1, es porque acaba de
recibirse un dato y se encuentra disponible en el registro RCREG.

Supongamos que no se activa la interrupcin por recepcin y deseamos mostrar por el
PORTB cada dato que llegue por el puerto serial; las instrucciones serian las
siguientes:

do{
if(RCIF==1){ // si el indicador de buffer serie est activado
output_b(RCREG); // envar por el Puerto B el dato recibido en ECREG
RCIF=0;} // desactivar el indicador
}while(TRUE); // repetir el bucle


114
CARRERAS PROFESIONALES CIBERTEC
2.5.2 CONVERSIN ANLOGA DIGITAL

El PIC16F877 tiene 8 canales de entrada para la conversin anloga digital. Estas
ocho lneas se encuentran repartidas entre el PORTA (5 canales) y PORTE (3
canales). Cualquier seal analgica ingresada por alguna de estas patillas es
convertida a digital a travs de aproximaciones sucesivas controladas por una seal
de reloj, y el resultado de la conversin se representa en un nmero binario de 10 bits
(ADRESH ADRESL). Toda conversin analgica a digital requiere de un voltaje de
referencia. En este caso, la seal de referencia es programable, la cual puede ser
configurada seleccionando la combinacin VDD, VSS, RA2 o RA3, tal como se
muestra en el esquema siguiente:
























2.5.2.1 Registros asociados
La conversin anloga digital tiene asociado cuatro registros:
- Dos de control: ADCON0 y ADCON1, que pertenecen a los bancos 0 y 1
respectivamente.
- Y dos de datos: ADRESH y ADRESL, que pertenecen a los bancos 0 y 1
respectivamente.

MI CROCONTROLADORES 115
CIBERTEC CARRERAS PROFESIONALES
2.5.2.1.1 Registro ADCON0
Este registro de control se encarga de la configuracin y control de la operacin de la
conversin anloga digital. Veamos sus bits:

ADCS1 ADCS0 CHS2 CH1 CH0 GO/DONE - ADON
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

ADCSX: Seleccin del reloj de conversin

ADCS1 S0 RELOJ
0 0 F/2
0 1 F/8
1 0 F/32
1 1 FRC

CHSX: Seleccin del canal de conversin

CHS2 S1 S0 CANAL
0 0 0 0 (RA0)
0 0 1 1 (RA1)
0 1 0 2 (RA2)
0 1 1 3 (RA3)
1 0 0 4 (RA5)
1 0 1 5 (RE0)
1 1 0 6 (RE1)
1 1 1 7 (RE2)

GO/DONE: Puesta en marcha de la conversin
1: En progreso
0: Culmin la conversin

ADON: Activacin de la conversin
1: Activada
0: Desactivada


2.5.2.1.2 El registro ADCON1
Este registro se encarga de establecer el formato del resultado de la conversin, fijar la
operacin digital o analgica de los pines de los puertos A y E, y definir la seal de
referencia. Veamos sus bits:

ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

ADFM: Formato del resultado de conversin
0: Justificado a la izquierda (8 bits ADRESH y 2 bits ADRESL)
1: justificado a la derecha (2 bits ADRESH y 8 bits ADRESL)
PCFGX: Configuracin de los pines para funcionar como analgicos o digitales
y establecer el voltaje de referencia
116
CARRERAS PROFESIONALES CIBERTEC


PCFG3:
PCFG0
AN7
RE2
AN6
RE1
AN5
RE0
AN4
RA5
AN3
RA3
AN2
RA2
AN1
RA1
AN0
RA0
VREF+ VREF-
0000 A A A A A A A A VDD GND
0001 A A A A - A A A RA3 GND
0010 D D D A A A A A VDD GND
0011 D D D A - A A A RA3 GND
0100 D D D D A D A A VDD GND
0101 D D D D - D A A RA3 GND
0110 D D D D D D D D - -
0111 D D D D D D D D - -
1000 A A A A - - A A RA3 RA2
1001 D D A A A A A A VDD GND
1010 D D A A - A A A RA3 GND
1011 D D A A - - A A RA3 RA2
1100 D D D A - - A A RA3 RA2
1101 D D D D - - A A RA3 RA2
1110 D D D D D D D A VDD GND
1111 D D D D - - D A RA3 RA2


2.5.2.2 Secuencia de configuracin
Suponga que se tiene conectado en la patilla RA0 un sensor de luz y se necesita
obtener sus valores.
La secuencia de configuracin debera tener los siguientes pasos:
1- Asegurar que la patilla RA0 quede configurada como entrada analgica
2- Establecer como voltajes de referencia VDD (+5v) y GND (0v)
3- Fijar el formato del resultado de la conversin a 2 bits ADRESH y 8 bits ADRESL
4- Seleccionar la seal de reloj a F/8
5- Seleccionar a la patilla RA0 como el canal de entrada para la conversin
6- Activar el sistema de conversin
7- Poner en marcha la conversin

Las instrucciones seran las siguientes:

BSF ADCON1,ADFM ;Formato del resultado 8 bits ADRESL
BCF ADCON1,PCFG0 ;Configuracin de la
BSF ADCON1,PCFG1 ;patilla RA0 como entrada
BSF ADCON1,PCFG2 ;analgica y voltaje de referencia
BSF ADCON1,PCFG3 ;VDD con GND
BSF ADCON0, ADCS0 ;seleccin de la seal de
BCF ADCON0, ADCS1 ;reloj a F/8
BCF ADCON0, CHS0 ;seleccin de la
BCF ADCON0, CHS1 ;patilla RA0 como
BCF ADCON0, CHS2 ;canal de conversin
BSF ADCON0, ADON ;activa la conversin
NOP ;tiempo
MI CROCONTROLADORES 117
CIBERTEC CARRERAS PROFESIONALES
NOP ;de espera
NOP ;para iniciar
NOP ;cada conversin
BSF ADCON0,GO/DONE ;pone en marcha la conversin.

Aplicando comandos del compilador PIC C Compiler tendramos:

#device adc=8 // formato de 8 bits
setup_adc_ports(AN0); // pin RA0 como entrada analgica
setup_adc(ADC_CLOCK_DIV_8); // clock F/8
set_adc_channel(0); // multiplexor ADC a RA0

output_b(read_adc()); // leer valor analgico de RA0 y muestra en PORTB


2.5.3 Programas aplicativos

A continuacin, se propondrn aplicaciones que utilicen el puerto serie y los canales
de conversin A/D.

2.5.3.1 Recepcin de datos de una PC
Realice el programa que permita recibir, por el puerto serial, valores enviados desde la
PC. Estos valores recibidos deben reflejarse sobre los leds del puerto B. Una PC
enviar por el COM1 el valor SCII de cualquier tecla presionada a la velocidad de 9600
baudios.





















Investigue la direccin en memoria RAM del registro RCREG, este recibe los datos
provenientes del puerto serie. Adems, averige que registro contiene al bit indicador
de dato serie recibido y listo (RCIF), es necesario saber cul es la direccin de este
registro en la memoria RAM y tambin, cul es la posicin del bit RCIF dentro de este
registro. Es fundamental para leer los datos del puerto serie.

Iniciemos el desarrollo del programa:

//------Configuracin inicial----------------------------------------------
118
CARRERAS PROFESIONALES CIBERTEC

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#byte RCREG=0X1A
#bit RCIF=0XC.5

//------Programa principal----------------------------------------------

void main()
{
set_tris_b(0x00);

do{
if(RCIF==1){
output_b(RCREG);
RCIF=0;}
}while(TRUE);
}


2.5.3.2 Visualizacin de conversin analgica
Realice el programa que permita mostrar constantemente a travs del puertos B el
valor digital del voltaje ingresado a travs de la patilla PA0 (RA0).






















Se utilizar la seal de reloj F/8, ya que esta se configura hasta frecuencias mximas
de cristal de 5Mhz y, segn el esquema, el cristal es de 4Mhz. El voltaje de referencia
ser VDD y GND, y el formato de conversin debe ser 8 bits.

MI CROCONTROLADORES 119
CIBERTEC CARRERAS PROFESIONALES
Iniciemos el programa:

//------Configuracin inicial----------------------------------------------

#include <16F877.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)

//------Programa principal----------------------------------------------

void main()
{
set_tris_b(0x00);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);

do{
output_b(read_adc());
delay_ms(100);
}while(TRUE);

}


2.5.3.3 Iluminacin automtica
Realice el programa que
permita prender o apagar un
foco segn la cantidad de luz
natural. El sensor de luz
provee un rango de voltajes
segn la cantidad de luz que
incida sobre este. Suponga
que, tras las pruebas, una luz
ptima natural genera un
voltaje de 3.5v; y una luz
tenue, apenas visible, genera
un voltaje de 1v. Por lo tanto,
para los valores menores o
iguales a 1v, la luz del foco se
debe encender, mientras que
para los valores iguales o
mayores a 3.5v, la luz del foco
se tendr que apagar.
Se utilizar la misma
configuracin del problema
anterior.

120
CARRERAS PROFESIONALES CIBERTEC
Iniciemos el programa.

//------Configuracin inicial----------------------------------------------

#include <16F877.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)

//------Programa principal----------------------------------------------

void main()
{
char cant_luz; // variable que obtendr el voltaje
set_tris_d(0x00);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);

do{
cant_luz=read_adc(); // lee la cantidad de voltaje

if(cant_luz<=51) // verificar si es menor a 1V
output_high(PIN_D0); // si es asi prende la luz

else if(cant_luz>=178) // verificar si es mayor a 3.5V
output_low(PIN_D0); // si es asi apaga la luz

delay_ms(100); // retardo entre lecturas
}while(TRUE);

}



















MI CROCONTROLADORES 121
CIBERTEC CARRERAS PROFESIONALES
Resumen






Los puertos de comunicacin serie trabajan la informacin bit a bit como el
desplazamiento de bits en un registro. La rapidez con la que se manejan estos bits
debe sincronizarse tanto en el transmisor como en el receptor de la informacin.

Uno de los tipos de comunicacin serie es USART (universal sncrono, asncrono
de recepcin y transmisin). Este puede trabajar de modo asncrono transmitiendo
y recibiendo informacin a la vez, mientras que en modo sncrono slo trabaja
transmitiendo o recibiendo informacin.

Los pines asociados para la transmisin y recepcin de datos son RC6 y RC7,
respectivamente; y los registros asociados a la configuracin son TXSTA y RCSTA,
mientras que los registros de datos son TXREG y RCREG. La velocidad
recomunicacin la determina el registro SPBRG y el bit BRGH del registro TXSTA.

La conversin anloga digital del PIC16F877 posee hasta 8 canales de conversin
entre los puertos A y E, pero solo uno de estos canales se puede convertir a la vez.
Es necesario establecer el tipo de trabajo que realizarn los pines del puerto A y E
antes de usar la conversin.

Los registros encargados de la configuracin son ADCON0 y ADCON1 y los
registros que contienen el resultado de cada conversin son ADRESH y ADRESL.
Es necesario fijar la frecuencia de reloj segn el cristal conectado al PIC, configurar
los pines anlogos por trabajar, establecer como entradas los pines anlogos,
activar el puerto de conversin y esperar unos 4us antes de realizar cada
conversin.


Si desea saber ms acerca de estos temas, puede consultar la siguiente pgina.

http://www.ufps.edu.co/materias/ucontrol/htdocs/pdf/grua.pdf
Aqu, hallar un programa y hardware aplicativo de la conversin A/D.










122
CARRERAS PROFESIONALES CIBERTEC




EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno construye e implementa circuitos electrnicos
funcionales de complejidad media utilizando el Microcontrolador PIC16F877. Los
circuitos sern implementados en protoboards y no deben presentar fallas en las
conexiones realizadas. Por otro lado, los programas que activan el funcionamiento de
los circuitos se desarrollarn mediante comandos de Lenguaje C y el compilador C de
MPLAB y debern garantizar, luego de la correcta instalacin de los mismos, el
funcionamiento mnimo del 80% de las tareas propuestas para las aplicaciones de
lectura y/o escritura de puertos, temporizacin, comunicacin serie, conversin
anloga digital e interrupciones en los cinco puertos del Microcontrolador.

TEMARIO
Gestin de Interrupciones


ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.

Los alumnos configuran las interrupciones.

Los alumnos desarrollan las subrutinas de interrupcin.




UNIDAD DE
APRENDIZAJE
2
MI CROCONTROLADORES 123
CIBERTEC CARRERAS PROFESIONALES
2.6 GESTIN DE INTERRUPCIONES

2.6.1 TRATAMIENTO DE UNA INTERRUPCIN

Las interrupciones son pedidos de atencin que ciertos dispositivos solicitan del
Microprocesador. Los dispositivos que no poseen una actividad muy frecuente,
normalmente trabajan pidiendo la atencin del microprocesador. Cuando estos tienen
alguna informacin disponible o requieren de esta, solicitan el servicio del
Microprocesador, el cual lo atender a travs de un programa relacionado con el
dispositivo. Normalmente, un programa principal se encarga de atender
constantemente a los dispositivos de actividad frecuente, mientras que a los
dispositivos de baja actividad los atendern las subrutinas de interrupcin (programas
asociados).

Mientras el Microprocesador se encuentra
ejecutando el programa principal, su
registro PC (contador de programa o
puntero de instrucciones) va avanzando
entre las direcciones de las instrucciones
de la FLASH, conforme estas se van
ejecutando. Suponga que el PC est
direccionando la celda 0250h y ,en ese
instante, se presenta la interrupcin de un
dispositivo. El Microprocesador culmina la
ejecucin de la instruccin de la celda
0250h, avanza el PC a la siguiente
instruccin (0251h) y se guarda esta
direccin del PC en la PILA (buffer de
memoria temporal), truncando
temporalmente la ejecucin del programa
principal. Enseguida, el PC se carga con
el vector de interrupcin 0004h de FLASH
y el Microprocesador empieza a ejecutar
las instrucciones a partir de esta
direccin, la cual debe contener la
subrutina de atencin del dispositivo.
Culminada la atencin del dispositivo
(terminada la ejecucin de la subrutina),
el PC recupera de la PILA la direccin
guardada (0251h) y retoma la ejecucin
de las instrucciones del programa principal.

2.6.1.1 Fuentes de interrupcin
El PIC16F877 tiene catorce posibles formas de sufrir interrupcin:
- 2 generadas a travs del PORTB
- 3 generadas por los desbordes de los timers/counters TMR0, TMR1 y TMR2
- 1 generada por la culminacin de la conversin A/D
- 2 generadas por la transmisin y recepcin serie tipo USART
- 1 generada por la transmisin o recepcin serie sncrona SSP
- 1 generada por la escritura sobre la memoria EEPROM
- 1 generada por la transferencia sobre el puerto esclavo paralelo PSP
- 2 generados por los mdulos de captura y comparacin CCP
- 1 generada por la colisin del bus serie
124
CARRERAS PROFESIONALES CIBERTEC
Cualquiera que cause la interrupcin, obligar la modificacin del PC al vector 0004h.
De aqu, se tiene que averiguar cul de las catorce posibles fuentes caus la
interrupcin para ejecutar la subrutina de interrupcin relacionada. Cada fuente de
interrupcin tiene un indicador de interrupcin asociado, el cual se pone a 1 indicando
su presencia. Este indicador debe limpiarse luego de ejecutada la subrutina de
interrupcin.

2.6.1.2 Habilitacin de las interrupciones
Las fuentes de interrupcin solo pueden obligar al PC direccionar al vector 0004h, si
estas se han configurado y habilitado. De no haberse realizado tal paso, las fuentes
jams podrn interrumpir y, por lo tanto, no podrn ser atendidas.

Los registros especiales encargados del tratamiento de las interrupciones son el
registro INTCON, OPTION_REG, PIE1, PIR1, PIE2 y PIR2. Veamos la descripcin de
sus bits.


2.6.2 REGISTROS ASOCIADOS

2.6.2.1 Registro INTCON

GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado

PEIE: Habilitador de interrupcin de los perifricos
1: Habilitado
0: Deshabilitado

T0IE: Interrupcin por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado

INTE: Interrupcin externa del pin RB0/INT
1: Habilitado
0: Deshabilitado

RBIE: Interrupcin por variacin del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado

T0IF: Indicador de interrupcin de desbordamiento del TIMER0
1: Activado
0: Desactivado

INTF: Indicador de interrupcin del pin RB0/INT
1: Activado
0: desactiva

RBIF: Indicador de interrupcin por variacin del valor de los bits <RB4:RB7>
1: Activado
MI CROCONTROLADORES 125
CIBERTEC CARRERAS PROFESIONALES
0: Desactivado

2.6.2.2 Registro OPTION

RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

INTEDG: Selector del tipo de interrupcin externa RBO/INT
1: activa por flanco ascendente
0: activa por flanco descendente


2.6.2.3 Registro PIE1

PSPIE1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

PSPIE : Interrupcin por lectura/escritura del puerto paralelo esclavo
0: Deshabilitado
1: Habilitado

ADIE : Interrupcin por conversin anloga digital
0: Deshabilitado
1: Habilitado

RCIE: Interrupcin por USART recepcin
0: Deshabilitado
1: Habilitado

TXIE: Interrupcin por USART transmisin
0: Deshabilitado
1: Habilitado

SSPIE: Interrupcin por transmisin o recepcin serie sncrona
0: Deshabilitado
1: Habilitado

CCP1IE: Interrupcin del mdulo de captura comparacin y fase 1
0: Deshabilitado
1: Habilitado

TMR2IE: Interrupcin por Igualdad del timer2 con el registro PR2
0: Deshabilitado
1: Habilitado

TMR1IE: Interrupcin por desbordamiento del TMR1
0: Deshabilitado
1: Habilitado


126
CARRERAS PROFESIONALES CIBERTEC
2.6.2.4 El Registro PIR1

PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0


PSPIF: Indicador de interrupcin de lectura/escritura del puerto paralelo esclavo
1: Una operacin de lectura o escritura ha culminado.
0: Lectura o escritura en proceso

ADIF: Indicador de interrupcin de la conversin anloga digital
1: Una operacin de conversin ha culminado.
0: Conversin an sin completar

RCIF: Indicador de interrupcin USART recepcin
1: El buffer de recepcin USART est lleno
0: Buffer an por llenar

TXIF: Indicador de interrupcin USART transmisin
1: El buffer de transmisin USART est vaco.
0: Buffer an por vaciar

SSPIF: Indicador de interrupcin del puerto serie sncrono
1: Una transmisin o recepcin completa ha tenido lugar.
0: Transmisin o recepcin an por procesar

CCP1IF: Indicador de interrupcin del mdulo de captura comparacin y fase 1
1: Una operacin de captura o comparacin del timer 1 ha ocurrido
Esta ocurrencia resetea al timer 1.
0: An no ha ocurrido el proceso.

TMR2IF: Indicador de interrupcin por igualdad del timer2 con el registro PR2
1: La igualdad del timer 2 y del registro PR2 se dio.
0: Tal igualdad an no se da.

TMR1IF: Indicador de interrupcin por desbordamiento del timer 1
1: El timer uno se ha desbordado.
0: El desbordamiento an no sucede.

2.6.2.5 El Registro PIE2

- - - EEIE BCLIE - - CCP2IE
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

EEIE: Interrupcin de escritura de la EEPROM
0: Deshabilitado
1: Habilitado

BCLIE: Interrupcin por colisin de bus del puerto serie sncrono
0: Deshabilitado
1: Habilitado

CCP2IE: Interrupcin del mdulo de captura, comparacin y fase 2
0: Deshabilitado
MI CROCONTROLADORES 127
CIBERTEC CARRERAS PROFESIONALES
1: Habilitado


2.6.2.6 El Registro PIR2

- - - EEIF BCLIF - - CCP2IF
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0

EEIF: Indicador de interrupcin de escritura de la EEPROM
1: El proceso de escritura ha culminado.
0: La escritura an no termina.

BCLIF: Indicador de interrupcin por colisin de bus del puerto serial sncrono
1: Colisin de bus generada
0: No hay colisin.

CCP2IF: Indicador de interrupcin del mdulo de captura, comparacin y fase 2
1: Una operacin de captura o comparacin del timer 1 ha ocurrido.
Esta ocurrencia resetea al timer 1 y genera un proceso de conversin
anloga digital si el modulo de conversin est habilitada.
0: No ha ocurrido an el proceso.

2.6.3 SECUENCIA DE CONFIGURACIN
Las interrupciones, para ser habilitadas, deben realizarse teniendo en cuenta los
siguientes pasos:
1. Activar el bit de interrupcin o bits de interrupcin asociados a la fuente o fuentes
2. Activar el habilitador de interrupcin de perifricos
3. Activar el habilitador global de interrupciones
Supongamos que se desea habilitar la interrupcin del TMR1 y la conversin A/D. La
secuencia sera la siguiente:
BSF PIE1, TMR1IE ;Activa interrupcin del TMR1.
BSF PIE1, ADIE ;Activa interrupcin del canal de conversin A/D.
BSF INTCON, GIE ;Habilita todas las interrupciones.

Aplicando los comandos del PIC C Compiler tendramos:

enable_interrupts(INT_AD);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
128
CARRERAS PROFESIONALES CIBERTEC
2.6.4 Programas aplicativos

2.6.4.1 Interrupcin del pin RB0/INT
Realice el programa que realice dos funciones. La primera es mostrar por el pin RB1
un led prendindose y apagndose por cada medio segundo. Y la segunda, aplicando
la interrupcin externa con el pulsador conectado al pin RB0, una cuenta ascendente
repetitiva de 0 a 15. Cada aumento de valor en uno de la cuenta, depende de cada
interrupcin generada por la activacin del pulsador. El pulsador en estado off se
encuentra en 0 y cuando pase al estado on se har 1. Es decir, la interrupcin se
presentar cada vez que en el pin RB0 aparezca un flanco de subida (0 a 1). El valor
inicial sobre los leds debe ser 0.





















Iniciemos el programa:

//------Configuracin inicial----------------------------------------------

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)
#Byte CUENTA=0X30
#int_EXT

//------Funcin de interrupcin que genera cuenta de 0 a 15 por el puerto D------------

EXT_isr()
{
CUENTA=CUENTA+1;
if(CUENTA==16)
CUENTA=0;
output_d(CUENTA);
}


MI CROCONTROLADORES 129
CIBERTEC CARRERAS PROFESIONALES
//------Programa principal----------------------------------------------

void main()
{

enable_interrupts(INT_EXT); // habilitar interrupcin externa
enable_interrupts(GLOBAL); // habilitar interrupciones

set_tris_d(0x00);
set_tris_b(0xFD);
CUENTA=0;
output_d(CUENTA); // apagar led

//--------Prende y apaga un led repetitivamente--------

do{
output_high(PIN_B1);
delay_ms(500);
output_low(PIN_B1);
delay_ms(500);
}while(TRUE);

}

2.6.4.2 Interrupcin por variacin de los bits RB4 - RB7
Realice el programa que permita mostrar sobre los 4 leds del puerto C una cuenta
ascendente repetitiva desde 0 hasta el valor indicado en los switches del puerto B.
Este lmite de la cuenta, indicado en los switches, debe mostrarse sobre los leds del
puerto D cada vez que vare.
























130
CARRERAS PROFESIONALES CIBERTEC
Desarrollemos el programa:

//------Configuracin inicial----------------------------------------------

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)
#byte LIMITE=0X30
#int_RB

//------Funcin de interrupcin que carga en LIMITE el valor del puerto B------------

RB_isr()
{
LIMITE=input_b();
LIMITE=LIMITE>>4; // rota hacia la derecha 4 posiciones
output_c(LIMITE); // muestra el lmite en el Puerto C
}

//------Programa principal----------------------------------------------

void main()
{
char CUENTA;

enable_interrupts(INT_RB); // habilitar interrupcin por variacin de RB4 a RB7
enable_interrupts(GLOBAL); // habilitar interrupciones

set_tris_c(0x00);
set_tris_d(0x00);

output_c(0x00);
output_d(0x00);

do{
for(CUENTA=0;CUENTA<=LIMITE;CUENTA++){
output_d(CUENTA);
delay_ms(500);}
}while(TRUE);
}






MI CROCONTROLADORES 131
CIBERTEC CARRERAS PROFESIONALES
2.6.4.3 Interrupcin por el TMR1
Realice el programa que muestre sobre los leds una sola vez la cuenta descendente
de 15 a 0, cada vez que se active el pulsador. Cada nmero de la cuenta debe
mostrarse sobre los leds durante 1/2 segundo.
Considere que el cristal es de 4Mhz y utilice el TMR1 para generar el tiempo de
visualizacin de cada nmero.






















Iniciemos el programa:

//------Configuracin inicial----------------------------------------------

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)
#byte CUENTA=0X30
#bit TMR1ON=0X10.0
#int_TIMER1

//------Funcin de interrupcin del TMER1 cada 500ms------------

TIMER1_isr()
{
set_TIMER1(3036);
CUENTA=CUENTA-1;
}

132
CARRERAS PROFESIONALES CIBERTEC
//------Programa principal----------------------------------------------

void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
set_TIMER1(3036);
TMR1ON=0;

set_tris_b(0xFF);
set_tris_c(0x00);

output_c(0x00);

do{
if(input(PIN_B0)){
CUENTA=15;
TMR1ON=1;
do
output_c(CUENTA);
while(CUENTA!=0);}
TMR1ON=0;
}while(TRUE);
}
MI CROCONTROLADORES 133
CIBERTEC CARRERAS PROFESIONALES
2.6.4.4 Control de temperatura
Realice el programa que permita activar o desactivar el encendido de un horno. Las
temperaturas de referencia de la temperatura mxima y mnima se encuentran
ubicadas en dos variables T_MAX y T_MIN respectivamente. La temperatura del horno
se simula con la variacin del estado del potencimetro. Si la temperatura medida
supera el lmite alto, debe apagar el horno, mientras que si la temperatura es menor al
lmite bajo, debe encenderlo. Mientras la temperatura se encuentre entre el lmite
superior e inferior, no se puede apagar ni encender el horno, es decir, debe mantener
su ltimo estado. Este control debe realizarse tomando muestreos de la temperatura
cada 100ms, para lo cual debe programar al TMR1. Los leds ROJO, VERDE y
AMARILLO son los indicadores de la temperatura del horno. El rojo indicar que la
temperatura ha superado el nivel de referencia alto, el amarillo indicar que la
temperatura es menor al nivel de referencia bajo y el color verde indicar que la
temperatura se encuentra entre el nivel alto y bajo de referencia.





















Iniciamos el desarrollo del programa:

//------Configuracin inicial----------------------------------------------

#include <16F877.h>
#device adc=8
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG
#use delay(clock=4000000)
#byte TEMPERATURA=0X30
#bit TMR1ON=0X10.0
#int_TIMER1

//------Funcin de interrupcin del TMER1 cada 100ms------------

TIMER1_isr()
{
set_TIMER1(3036);
TEMPERATURA=read_adc();
}
134
CARRERAS PROFESIONALES CIBERTEC
//------Programa principal----------------------------------------------

void main()
{
char T_MAX=0xCC; // 4.0V
char T_MIN=0x4C; // 1.5V

setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

set_tris_b(0x00);
set_tris_d(0x00);
set_TIMER1(3036);

TMR1ON=1;

TEMPERATURA=read_adc();

do{
if(TEMPERATURA<=T_MIN){
output_high(PIN_D0);
output_high(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);}
else if(TEMPERATURA>=T_MAX){
output_low(PIN_D0);
output_low(PIN_B0);
output_low(PIN_B1);
output_high(PIN_B2);}
else{
output_low(PIN_B0);
output_high(PIN_B1);
output_low(PIN_B2);}

}while(TRUE);

}









MI CROCONTROLADORES 135
CIBERTEC CARRERAS PROFESIONALES
2.6.4.5 Escaneo de un teclado y visualizacin en LCD
Realice el programa que permita mostrar sobre el display de cristal lquido la tecla
presionada. El barrido sobre las filas (A0, A1, A2 y A3) se realizar cada 100ms, para
lo cual programaremos la interrupcin del TMR1 para generar esta base de tiempo.
Nos enteraremos que se ha presionado una tecla activando la interrupcin por
variacin de los pines <RB4 _RB7>. La tecla presionada se obtendr segn los
valores de la fila y columna activada al momento de la interrupcin. Antes de mostrar
la tecla presionada, inicialmente se mostrar en el display el mensaje IN KEY:






















Iniciemos el programa.

//---------- Configuracin inicial -----------

#include <16f877.h> // PIC utilizado
#fuses XT,NOWDT,NOPROTECT,PUT // configuracin de los fuses
#use delay (clock=4000000) // oscilador a 4 MHz
#bit KEY_ON=0X30.0
#byte tecla=0X31
#byte dfila=0x32
#byte dcol=0x33
#byte dcolx=0x34
#bit TMR1ON=0X10.0
#bit RBIF=0XB.0
#bit RBIE=0XB.3

136
CARRERAS PROFESIONALES CIBERTEC
//------funcin para escribir un comando en el display----------

void write_command(char comando)
{
output_low(PIN_C1);
output_low(PIN_C2);
delay_us(1300);
output_high(PIN_C0);
delay_us(1300);
output_d(comando);
delay_us(1300);
output_low(PIN_C0);
delay_us(1300);
output_high(PIN_C1);
output_high(PIN_C2);
delay_us(1300);
}

//------funcin para escribir un caracter en el display----------

void write_char(char dato)
{
output_d(dato);
output_high(PIN_C2);
output_low(PIN_C1);
delay_us(1300);
output_high(PIN_C0);
delay_us(2600);
output_low(PIN_C0);
delay_us(1300);
output_low(PIN_C2);
output_high(PIN_C1);
delay_us(1300);
}

//------funcin de interrupcin RBX para obtener columna activada y detectar tecla
presionada----------

#int_RB
RB_isr()
{
char col[9]={0,0,4,0,8,0,0,0,12};
//TMR1ON=0;
//RBIE=0;
//RBIF=0;
dcolx=input_b();
if(dcolx!=0) {
dcol=dcolx>>4;
dcol=dcol&0x0F;
dcol=col[dcol];
tecla=dcol+dfila;
tecla=tecla+4;
KEY_ON=1;}
}

MI CROCONTROLADORES 137
CIBERTEC CARRERAS PROFESIONALES

//------funcin de interrupcin del TIMER1 para barrido de filas----------

#int_TIMER1
TIMER1_isr()
{
char fila[4]={0x0E,0x0D,0x0B,0x07};
set_TIMER1(53036);
dfila=dfila+1;
if(dfila==4)
dfila=0;
output_a(fila[dfila]);
}

//-----------Programa principal-------------

void main(void)
{
char caracter[8]={'I','N',' ','K','E','Y',':',' '};
char teclado[20]={'0','0','0','0','>','0','=','+','1','2','3','-','4','5','6','X','7','8','9','/'};
char i; // variable direccionar el mensaje

TMR1ON=0;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

set_tris_b(0xFF);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_a(0x00);

write_command(0x38); // 8 bits de datos,2 filas y caracteres de 7x5 pixeles
write_command(0x60); // desplazar a la derecha el cursor por caracter escrito
write_command(0x0E); // activa la visualizacin del display
write_command(0x01); // borra memoria del display (mensajes anteriores)
write_command(0x02); // coloca el cursor en la primera posicin de la fila 1

for(i=0;i<8;i++){ // bucle para los 8 caracteres del mensaje: IN KEY:
write_char(caracter[i]); // escribe en el display cada caracter
delay_ms(60);} // retardo por cada caracter escrito en el display

dfila=0;
set_TIMER1(53036);
TMR1ON=1;
KEY_ON=0;

do{
if(KEY_ON==1){ // si la interrupcin RBX activa el bit KEY_ON
write_char(teclado[tecla]); // muestra en el display la tecla presionada
delay_ms(500); // retardo por cada tecla presionada
KEY_ON=0;} // desactiva el indicador de tecla presionada
}while(TRUE); // repetir bucle
}
138
CARRERAS PROFESIONALES CIBERTEC

Resumen






El PIC16F877 posee catorce fuentes de interrupcin: dos de estas se pueden
generar a travs del PORTB; tres por el tratamiento de los timers TMR0, TMR1 y
TMR2; uno por la conversin A/D; dos por la comunicacin USART; uno por la
comunicacin serie SPP; uno por la escritura sobre EEPROM; uno por la
transferencia sobre el puerto PSP; dos por los mdulos de captura, comparacin y
fase; y una generada por la colisin del bus serie.

Estas fuentes deben habilitarse para que realmente puedan interrumpir. El registro
INTCON, PIE1, PIE2, PIR1 y PIR2 contienen los bits de habilitacin y los bits
indicadores de la presencia de interrupcin.

Cada vez que se produce una interrupcin, el PC detiene temporalmente la
ejecucin del programa en curso y direcciona el vector 0004h de memoria FLASH
para ejecutar las subrutinas de interrupcin. Culminada esta atencin, retoma la
ejecucin del programa detenido.

Para saber cul de las catorce fuentes ha interrumpido, debemos verificar los bits
indicadores de la presencia de interrupcin. De este modo, sabremos qu subrutina
ejecutar para lograr la atencin del dispositivo que interrumpi. Culminada la
ejecucin de la subrutina, debemos limpiar el bit indicador de interrupcin
respectivo.

Si desea saber ms acerca de estos temas, puede consultar las siguientes
pginas.

http://www.alos.5u.com/pic16f877/Modulo5.html
Aqu, hallar informacin sobre las interrupciones.

http://www.micropar.com/index.php?option=com_docman&task=cat_view&gid=14&di
r=DESC&order=name&Itemid=27&limit=5&limitstart=5
Aqu, hallar informacin sobre automatizacin de casas.

http://www.todorobot.com.ar/documentos/display.pdf
Aqu, hallar informacin sobre los comandos de un LCD.

http://galia.fc.uaslp.mx/~cantocar/microcontroladores/SLIDES_8051_PDF/20_MATRI
.PDF
Aqu, hallar informacin sobre un teclado matricial.
MI CROCONTROLADORES 139
CIBERTEC CARRERAS PROFESIONALES














140
CARRERAS PROFESIONALES CIBERTEC




PICS DE 16 Y 32 BITS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno describe las caractersticas y capacidades de los
microcontroladores de 16 y 32 bits de la familia Microchip, empleando los conceptos
de las hojas de datos de los microcontroladores PIC24FJ64GA006 y
PIC32MX300F032H. Asimismo, implementar circuitos aplicativos con estos
microcontroladores y desarrollar los programas que pongan en funcionamiento los
sistemas en un 80%.

TEMARIO
El PIC24FJ64GA006

ACTIVIDADES PROPUESTAS
Los alumnos describen las caractersticas del PIC24FJ64GA006.

Los alumnos reconocen las funciones de las seales de inicializacin.

Los alumnos distinguen las unidades internas del PIC24FJ64GA006.

UNIDAD DE
APRENDIZAJE
3
MI CROCONTROLADORES 141
CIBERTEC CARRERAS PROFESIONALES
3.1 EL PIC24FJ64GA006

El PIC24FJ64GA006 es un microcontrolador desarrollado por Microchip. Pertenece a
la gama baja de microcontroladores de 16 bits, ideal para iniciar el estudio de estos
microcontroladores ms avanzados.

3.1.1 Caractersticas

3.1.1.1 Descripcin de contactos


La figura muestra la disposicin de pines de este PIC. Posee 64 contactos, donde
VDD y VSS son los pines de polarizacin. OSCO y OSCI son los pines de reloj
principal, en estos se conectar comnmente el cristal. MCLR es el pin de
programacin o reset. Durante la programacin, esta patilla se conecta al voltaje de
programacin, mientras que, en funcionamiento, este debe conectarse a un arreglo RC
para recibir el pulso de inicializacin. Los pines compartidos RBx, RCx, RDx, REx, RFx
y RGx son los pines de los puertos a travs de los cuales el microcontrolador se
conectar con el sistema a controlar.

142
CARRERAS PROFESIONALES CIBERTEC
3.1.1.2 Descripcin de la CPU
Este Microcontrolador posee, en su interior, un Microprocesador de 16 bits que puede
ejecutar 16 MIPS a una frecuencia mxima de 32Mhz. Soporta un total de 76
instrucciones las que ejecuta en un ciclo de mquina, excepto las de salto que ejecuta
en dos o tres ciclos y las instrucciones de divisin las ejecuta en 18 ciclos.

3.1.1.3 Descripcin de las memorias
Posee dos tipos de memorias: FLASH y RAM.

3.1.1.3.1 Memoria FLASH
La memoria flash es la memoria de programas destinada para almacenar las
instrucciones. Tiene una capacidad de 64Kbytes o 22Kwords, es decir, se pueden
introducir en esta memoria hasta 22,016 instrucciones. Esta memoria es la que
recibir, desde el computador, los programas desarrollados durante los laboratorios.
Esta memoria puede ser borrada y programada 10 mil veces. Las instrucciones
depositadas en esta no se perdern ni modificarn an si pierde la energa de
polarizacin.

3.1.1.3.2 Memoria RAM
La memoria ram es una memoria destinada para el almacenamiento de datos, pero, a
su vez, en esta se encuentran todos los registros de configuracin de todas las
funciones del PIC, ocupando los primeros 2Kbytes. La capacidad total de esta
memoria es de 8Kbytes.

3.1.1.4 Descripcin de las unidades de entrada y salida
Este PIC dispone de seis puertos denominados PORTB, PORTC, PORTD, PORTE,
PORTF y PORTG. Entre los seis puertos, se dispone de 53 pines a travs de los
cuales el Microcontrolador se conectar con las aplicaciones.

3.1.1.5 Dispositivos especiales
Adems de los puertos, este PIC posee lo siguiente:
5 temporizadores de 16 bits y 2 de 32 bits
5 canales de modulacin por ancho de pulso PWM
2 puertos de comunicacin serie USART
2 puertos de comunicacin SPI
2 puertos de comunicacin serie IC
1 sistema de comunicacin paralela PMP/PSP
16 canales de conversin anloga digital de 10 bits
2 comparadores anlogos
43 fuentes de interrupcin

MI CROCONTROLADORES 143
CIBERTEC CARRERAS PROFESIONALES
3.1.2 PUESTA EN MARCHA

Poner en funcionamiento al Microcontrolador significa polarizarlo, proveerle la seal de
reloj y asegurar el impulso de inicializacin bsico para que pueda funcionar.

3.1.2.1 Polarizacin
Este PIC necesita ser energizado con +3.3V, GND y 2.5V de ser necesario. Las
patillas utilizadas para esto son VDD, VSS, DISVREG y VDDCORE. A continuacin se
muestran las configuraciones tpicas:


Regulador habilitado


Regulador deshabilitado

Regulador deshabilitado



3.1.2.2 Reset
Todos los Microcontroladores necesitan recibir un impulso apenas se energizan. Esto
es fundamental para inicializar sus unidades y registros. De no presentarse este
impulso, el Microcontrolador probablemente quedara bloqueado ejecutando algn
grupo de instrucciones que nada tienen que ver con la ejecucin del programa
preparado, ya que el PC (contador de programa) podra estar apuntando a cualquier
parte de la memoria de programa flash. Este impulso, entre otras cosas, asegura que
el registro PC apunte a la primera celda de la memoria flash, es decir, el
Microcontrolador queda listo para leer, interpretar y ejecutar su primera instruccin.

Este impulso se logra
realizando un arreglo RC
sobre la patilla MCLR, tal
como se muestra en la
figura de la izquierda.
Valores comunes seran
1K ohmios para la
resistencia y 10 uF para
el condensador. Si
durante el funcionamiento
del Microcontrolador
ocurriera algn evento no
deseado y este quedase
bloqueado o simplemente
se requiere reiniciar la
ejecucin del programa
desde el principio, es
necesario inyectar un
nuevo impulso sobre
MCLR. Pero como notamos en la grfica, MCLR, no es la nica fuente que puede
generar un reset del sistema.
144
CARRERAS PROFESIONALES CIBERTEC
3.1.2.3 Reloj
La funcin de reloj, tambin conocida como sistema de oscilacin, es fundamental
para que el Microcontrolador se ponga en marcha. Sin esta seal, los
Microcontroladores no podran realizar la ms mnima labor. Estos necesitan los
pulsos repetitivos de la seal de reloj para leer, interpretar y ejecutar las instrucciones
almacenadas en su memoria flash.





















Tiene cuatro posibilidades de asignacin de reloj:

1 Oscilador principal (OSCI y OSCO).
2 Oscilador secundario (SOSCI y SOSCO).
3 Oscilador interno rpido (FRC)
4 Oscilador RC interno de baja potencia (LPRC)

La seleccin de una de estas 4 posibles configuraciones se realiza a travs de los
registros OSCCON, CLKDIV y OSCTUN.

















MI CROCONTROLADORES 145
CIBERTEC CARRERAS PROFESIONALES
3.1.3 ARQUITECTURA INTERNA

El PIC24FJ64GA006, al igual que cualquier PIC de MICROCHIP, se caracteriza por
tener:

Una arquitectura Harvard
Un procesamiento segmentado (pipeline)
Un procesador tipo RISC
Un formato ortogonal





































Podemos notar, la arquitectura Harvard mejorada del PIC24FJ64GA006. La memoria
de programas FLASH (que almacena las instrucciones) tiene un bus conectado
directamente sobre el registro de instrucciones y este, a su vez, se conecta con el
decodificador de instrucciones, con el multiplexor de direcciones o al multiplexor de
entrada para las operaciones aritmtico lgicas. En cambio, la memoria RAM (que
almacena los datos) comparte otro camino, otro bus, el cual se conecta, a los
PUERTOS, al registro de trabajo W, al multiplexor de entrada para las operaciones
aritmtico lgicas, a los canales de conversin A/D, a los puertos de comunicacin
serie y a los TIMERS.
146
CARRERAS PROFESIONALES CIBERTEC

Tambin, podemos observar el formato de trabajo ortogonal. La ALU (unidad
aritmtica lgica) recibe, por una de sus entradas, la informacin proveniente del bus
de la memoria flash o del bus de las memorias RAM, y por su otra entrada, recibe la
informacin proveniente del registro de trabajo W. El resultado de las operaciones es
devuelto sobre el registro de trabajo W, sobre los puertos, los timers, sobre los puertos
seriales, sobre los canales de conversin A/D, sobre las memorias RAM y sobre
algunos registros especiales.


3.1.4 MEMORIA RAM

Esta memoria es fundamental para el tratamiento de los datos y variables que maneja
un programa. En la figura se nota que est formada por dos partes: el espacio de los
registros de funciones especiales (SFR) y el espacio para los datos y variables (Data
RAM).















Los primeros 2Kbytes le pertenecen a los registros FSR direccionables desde la
posicin 0000h hasta 07FFh y los 8Kbytes siguientes estn destinados para el
tratamiento de datos, direccionables desde la posicin 0800h hasta 27FFh.


3.1.4.1 Registros de funciones especiales (SFR)
Estos registros estn formados por las primeras posiciones de la memoria y tienen un
papel fundamental. A continuacin se muestran los principales:


RCON: Registro de configuracin para el RESET



MI CROCONTROLADORES 147
CIBERTEC CARRERAS PROFESIONALES


OSCCON: Registro de control del oscilador


148
CARRERAS PROFESIONALES CIBERTEC


CLKDIV: Registro divisor de reloj



MI CROCONTROLADORES 149
CIBERTEC CARRERAS PROFESIONALES


OSCTUN: Registro de ajuste del oscilador FRC





T1CON: registro de control del TIMER1


150
CARRERAS PROFESIONALES CIBERTEC


TXCON: Registro de control del TIMER2 y TIMER4


MI CROCONTROLADORES 151
CIBERTEC CARRERAS PROFESIONALES


TyCON: Registro de control del TIMER3 y TIMER5




UxMODE: Registro del modo de operacin UART


152
CARRERAS PROFESIONALES CIBERTEC

UxSTA: Registro de control y estado UART




MI CROCONTROLADORES 153
CIBERTEC CARRERAS PROFESIONALES





154
CARRERAS PROFESIONALES CIBERTEC
UxTXREG: Registro de transmisin UART



UxRXREG: Registro de recepcin UART




AD1CON1: Registro de configuracin 1 ADC


MI CROCONTROLADORES 155
CIBERTEC CARRERAS PROFESIONALES


AD1CON2: Registro de configuracin 2 ADC


156
CARRERAS PROFESIONALES CIBERTEC


AD1CON3: Registro de configuracin 3 ADC




AD1CHO: Registro de seleccin del canal de entrada ADC



MI CROCONTROLADORES 157
CIBERTEC CARRERAS PROFESIONALES


AD1PCFG: Registro de configuracin del puerto ADC




SR: Registro de estado




158
CARRERAS PROFESIONALES CIBERTEC


CORCON: Registro de control del CPU





NVMCON: Registro de control de la memoria FLASH


MI CROCONTROLADORES 159
CIBERTEC CARRERAS PROFESIONALES


TRISB y PORTB:


TRISC y PORTC:


TRISD y PORTD:


TRISE y PORTE:


TRISF y PORTF:


TRISG y PORTG:








160
CARRERAS PROFESIONALES CIBERTEC
3.1.5 JUEGO DE INSTRUCCIONES

A continuacin se muestra el juego de instrucciones de este PIC:




MI CROCONTROLADORES 161
CIBERTEC CARRERAS PROFESIONALES










162
CARRERAS PROFESIONALES CIBERTEC









MI CROCONTROLADORES 163
CIBERTEC CARRERAS PROFESIONALES











164
CARRERAS PROFESIONALES CIBERTEC




3.1.6 Programa aplicativo

3.1.6.1 Calculadora
Implemente el circuito en Proteus y realice el programa en MPLAB que permita
ejecutar las funciones de una calculadora. Las funciones a implementar son las que se
disponen en el teclado (+, -, * y /). Los valores numricos se irn mostrando en el LCD
mientras van ingresando.



MI CROCONTROLADORES 165
CIBERTEC CARRERAS PROFESIONALES
Iniciemos el desarrollo del programa:

//-----------------Configuracin inicial-----------------------

#include "p24FJ64GA006.h"
#include "calc.h"
#include "stddef.h"
#include "math.h"
#include "stdlib.h"
#include "string.h"

_CONFIG1(FWDTEN_OFF);
_CONFIG2(FNOSC_FRC&POSCMOD_NONE); // Oscilacin interna RFC

//-----------Variables------------------
static FLOAT lvalue = 0;
static FLOAT rvalue = 0;
static CHAR lastop;

//----------------Programa principal----------------

INT main (VOID)
{ lcd_init();
calc_evaluate();
}

VOID calc_evaluate()
{ CHAR number[MAX_DISPLAY_CHAR+1], key;
INT8 pos;
FLOAT tmp;

lvalue = 0;
rvalue = 0;
lastop = 0;

calc_format(0);

pos = 0;

for (;;)
{ key = calc_getkey();
if (calc_testkey(key))
{
if (pos != MAX_DISPLAY_CHAR - 2)
{ number[pos++] = key;
number[pos] = 0;
calc_display(number);
}
}
else
{
if (pos != 0)
{ tmp = atof(number);
if (lastop == 0)
lvalue = tmp;
166
CARRERAS PROFESIONALES CIBERTEC
else
rvalue = tmp;
}

pos = 0;

if (lastop != 0)
calc_opfunctions(lastop);
if (key != '=')
lastop = key;
else
lastop = 0;
}
}
}

VOID calc_opfunctions (CHAR token)
{ INT8 result = OK;
switch (token)
{ case '+' : lvalue += rvalue; break;
case '-' : lvalue -= rvalue; break;
case '*' : lvalue *= rvalue; break;
case '/' :
if (rvalue != 0)
lvalue /= rvalue;
else
result = ERROR;
break;
}

if (result == OK)
calc_format(lvalue);
else if (result == ERROR)
{ char buf[] = "*ERROR*";
calc_display(buf);
}
}


VOID calc_format (FLOAT f)
{ static const float divisors[] =
{ 100000000,
10000000,
1000000,
100000,
10000,
1000,
100,
10,
1,
0.1,
0.01,
0.001,
0.0001,
0.00001,
MI CROCONTROLADORES 167
CIBERTEC CARRERAS PROFESIONALES
0.000001,
0.0000001,
0
};
CHAR dbuf [MAX_DISPLAY_CHAR+1];
FLOAT divisor, tmp;
INT count = 0, digit;
INT pad=0, p=0;

if (f >= 0)
dbuf[p++] = ' ';
else
{ dbuf[p++] = '-';
f = -f;
}

if (f >= divisors[0])
dbuf[p++] = 'E';
else
while (p < MAX_DISPLAY_CHAR && ((divisor=divisors[count++]) >= 1 || f >
0.0000001))
{ if (fabs(f)<1)
digit = f/divisor+0.05;
else
digit = f/divisor;

if (divisor == 0.1)
dbuf[p++] = '.';
if (digit != 0 || divisor < 10)
{ dbuf[p++] = digit + '0';
pad = TRUE;
}
else if (pad)
dbuf[p++] = '0';
tmp = digit*divisor;
f -= tmp;
}
dbuf[p] = 0;
calc_display(dbuf);
}

BOOL calc_testkey (CHAR key)
{ if ((key == '.')|| ((key >= '0') && (key <= '9')))
return TRUE;
else
return FALSE;
}


CHAR calc_getkey (VOID)
{ CHAR mykey;
while ((mykey = keypadread()) == 0x00)
/* Poll again */;
return mykey;
}
168
CARRERAS PROFESIONALES CIBERTEC

VOID calc_display (CHAR *buf)
{ INT8 i;
clearscreen();
for (i=0 ; buf[i] != 0; i++)
// { if (buf[calc_testkey(buf[i]) || buf[i] == 0x2D)
{ wrdata(buf[i]); }
// }
}


//--------------Archivo calc.h----------------------

typedef void VOID;
typedef int INT;
typedef signed char INT8;
typedef signed int INT16;
typedef signed long INT32;
typedef unsigned short WORD;
typedef char CHAR;
typedef unsigned char BYTE;
typedef double FLOAT;
typedef long LONG;
typedef INT8 BOOL;

#define MAX_DISPLAY_CHAR 10

#define KEYP_NUM_ROWS 4
#define KEYP_NUM_COLS 4

#define LCD_CMD_WR 0x0000
#define LCD_DATA_WR 0x0100
#define LCD_BUSY_RD 0x0200
#define LCD_DATA_RD 0x0300

#define E_PIN_MASK 0x0400

#define LCD_CLS 0x01
#define LCD_HOME 0x02
#define LCD_SETMODE 0x04
#define LCD_SETVISIBLE 0x08
#define LCD_SHIFT 0x10
#define LCD_SETFUNCTION 0x20
#define LCD_SETCGADDR 0x40
#define LCD_SETDDADDR 0x80


#define G_MASK 0x03C0
#define G_SHIFT 6
#define nop() {__asm__ volatile("nop");}

#define FALSE 0
#define TRUE 1

enum ERROR { OK = 0, SLEEP = 1, ERROR = 2};
MI CROCONTROLADORES 169
CIBERTEC CARRERAS PROFESIONALES

VOID calc_evaluate(void);
CHAR calc_getkey (VOID);
VOID calc_format (FLOAT f);
VOID calc_display (CHAR *buf);

VOID calc_opfunctions (CHAR token);

BOOL calc_testkey (CHAR ch);
VOID calc_output (INT status);

CHAR keypadread(void);
CHAR scankeypad(void);

VOID lcd_init(void);
VOID lcd_wait(void);
VOID wrcmd (BYTE data);
VOID wrdata(BYTE data);
VOID clearscreen(void);

//--------------Archivo keybdio.c----------------------

#include "p24FJ64GA006.h"
#include "calc.h"

CHAR keycodes[16] = {'7','8','9','/','4','5','6','*','1','2','3','-','.','0','=','+'};

CHAR keypadread()
{ CHAR key = scankeypad();
if (key)
while (scankeypad() != 0);
return key;
}

CHAR scankeypad()
{ INT8 row,col,tmp;
CHAR key=0;
INT wait;

TRISG = 0xFFFF;
TRISD = 0x0000;
TRISB = 0;

for (row=0; row < KEYP_NUM_ROWS; row++)
{
PORTD = (~(1 << row)) & 0xFF;
for (wait=0; wait<100; ++wait);
tmp = (PORTG & G_MASK) >> G_SHIFT;

for (col=0; col<KEYP_NUM_COLS; ++col)
if ((tmp & (1<<col)) == 0)
{ INT idx = (row*KEYP_NUM_COLS) + col;
key = keycodes[idx];
PORTB = idx;
goto DONE;
170
CARRERAS PROFESIONALES CIBERTEC
}
}
DONE:
PORTD = 0x00FF;
TRISD = 0x00FF;
return key;
}

//--------------Archivo lcdio.c----------------------

#include "p24FJ64GA006.h"
#include "calc.h"

CHAR keycodes[16] = {'7','8','9','/','4','5','6','*','1','2','3','-','.','0','=','+'};

CHAR keypadread()
{ CHAR key = scankeypad();
if (key)
while (scankeypad() != 0)
/* Nothing */ ;
return key;
}

CHAR scankeypad()
{ INT8 row,col,tmp;
CHAR key=0;
INT wait;

TRISG = 0xFFFF;
TRISD = 0x0000;
TRISB = 0;

for (row=0; row < KEYP_NUM_ROWS; row++)
{ // Drive appropriate row low and read columns:
PORTD = (~(1 << row)) & 0xFF;
for (wait=0; wait<100; ++wait)
;
tmp = (PORTG & G_MASK) >> G_SHIFT;

for (col=0; col<KEYP_NUM_COLS; ++col)
if ((tmp & (1<<col)) == 0)
{ INT idx = (row*KEYP_NUM_COLS) + col;
key = keycodes[idx];
PORTB = idx;
goto DONE;
}

}
DONE:

PORTD = 0x00FF;
TRISD = 0x00FF;
return key;
}
MI CROCONTROLADORES 171
CIBERTEC CARRERAS PROFESIONALES
Resumen




El PIC24FJ64GA006 pertenece a la gama media de los microcontroladores de 16
bits. Posee seis puertos: PORTB, PORTC, PORTD, PORTE, PORTF y PORTG;
cinco temporizadores, dos puertos serie tipo USART, dos puertos IC; y 16 canales
de conversin A/D.

Para funcionar necesita una seal de reloj, la cual puede aplicarse desde un
oscilador externo primario, externo secundario o a travs de un sistema de reloj
interno. Adems, dispone de un sistema de configuracin de polarizacin para
energizar los perifricos y el corazn del microprocesador. Su voltaje de
polarizacin no debe superar los 3.3V y la del ncleo no debe ser mayor a 2.5V.

Su sistema de RESET est formado por 9 fuentes posibles de reinicio.

Posee 76 instrucciones y dispone de un formato ortogonal para la ejecucin de las
instrucciones aritmtico lgicas (todos los elementos internos pueden ser fuentes o
destino). Incluye instrucciones de multiplicacin y divisin que facilitan
enormemente las aplicaciones que involucran clculo.

La memoria FLASH sirve para almacenar las instrucciones del programa. En esta,
se insertan las del programa principal y las de las subrutinas de interrupcin. Esta
tiene una capacidad de 22KWords.

La memoria RAM tiene una capacidad de 8Kbytes. Los primeros 2Kbytes estn
destinados para los registros, mientras que, los 6Kbytes restantes para el
tratamiento de los datos y variables.

172
CARRERAS PROFESIONALES CIBERTEC




PICS DE 16 Y 32 BITS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, el alumno describe las caractersticas y capacidades de los
microcontroladores de 16 y 32 bits de la familia Microchip, empleando los conceptos
de las hojas de datos de los microcontroladores PIC24FJ64GA006 y
PIC32MX300F032H. Asimismo, implementar circuitos aplicativos con estos
microcontroladores y desarrollar los programas que pongan en funcionamiento los
sistemas en un 80%.


TEMARIO
El PIC32MX300F032H

ACTIVIDADES PROPUESTAS
Los alumnos describen las caractersticas del PIC32MX300F032H.

Los alumnos reconocen las funciones de las seales de inicializacin.

Los alumnos distinguen las unidades internas del PIC32MX300F032H.

UNIDAD DE
APRENDIZAJE
3
MI CROCONTROLADORES 173
CIBERTEC CARRERAS PROFESIONALES
3.2 EL PIC32MX300F032H

El PIC32MX300F032H es un microcontrolador desarrollado por Microchip. Pertenece a
la gama de microcontroladores de 32 bits.

3.2.1 Caractersticas

3.2.1.1 Contactos del PIC32MX320F032H







La figura muestra la disposicin de pines de este PIC. Posee 64 contactos, donde
VDD y VSS son los pines de polarizacin. OSCO y OSCI son los pines de reloj
principal, en estos se conectar comnmente el cristal. MCLR es el pin de
programacin o reset. Durante la programacin, esta patilla se conecta al voltaje de
174
CARRERAS PROFESIONALES CIBERTEC
programacin, mientras que, en funcionamiento, este debe conectarse a un arreglo RC
para recibir el pulso de inicializacin. Los pines compartidos RBx, RCx, RDx, REx, RFx
y RGx son los pines de los puertos a travs de los cuales el microcontrolador se
conectar con el sistema a controlar.

3.2.1.2 Descripcin de la CPU
Este Microcontrolador posee, en su interior, un Microprocesador de 32 bits que puede
ejecutar hasta 300 MIPS a una frecuencia mxima de 20Mhz, para lo cual posee un
ncleo con 5 tuberas de procesamiento. Soporta instrucciones de 16 y 32 bits.

3.2.1.3 Descripcin de las memorias
Posee dos tipos de memorias: FLASH y RAM.

3.2.1.3.1 Memoria FLASH
La memoria flash es la memoria de programas destinada para almacenar las
instrucciones. Tiene una capacidad de 32Kbytes. Esta memoria es la que recibir,
desde el computador, los programas desarrollados durante los laboratorios. Esta
memoria puede ser borrada y programada 10 mil veces. Las instrucciones depositadas
en esta no se perdern ni modificarn an si pierde la energa de polarizacin.

3.2.1.3.2 Memoria RAM
La memoria ram es una memoria destinada para el almacenamiento de datos, pero, a
su vez, en esta se encuentran todos los registros de configuracin de todas las
funciones del PIC, ocupando los primeros 2Kbytes. La capacidad total de esta
memoria es de 8Kbytes.

3.2.1.4 Descripcin de las unidades de entrada y salida
Este PIC dispone de seis puertos denominados PORTB, PORTC, PORTD, PORTE,
PORTF y PORTG. Entre los seis puertos, se dispone de 53 pines a travs de los
cuales el Microcontrolador se conectar con las aplicaciones.

3.2.1.5 Dispositivos especiales
Adems de los puertos, este PIC posee lo siguiente:
5 temporizadores de 16 bits y 2 de 32 bits
5 canales de modulacin por ancho de pulso PWM
2 puertos de comunicacin serie USART
2 puertos de comunicacin SPI
2 puertos de comunicacin serie IC
1 sistema de comunicacin paralela PMP/PSP
16 canales de conversin anloga digital de 10 bits
2 comparadores anlogos
63 fuentes de interrupcin
ICSP
Hardware Break POINT

MI CROCONTROLADORES 175
CIBERTEC CARRERAS PROFESIONALES
3.2.2 PUESTA EN MARCHA

Poner en funcionamiento al Microcontrolador significa polarizarlo, proveerle la seal de
reloj y asegurar el impulso de inicializacin bsico para que pueda funcionar.

3.2.2.1 Polarizacin
Este PIC necesita ser energizado con +3.3V, GND y 2.5V de ser necesario. Las
patillas utilizadas para esto son VDD, VSS, DISVREG y VDDCORE. A continuacin se
muestran las configuraciones tpicas:


Regulador habilitado


Regulador deshabilitado

Regulador deshabilitado



3.2.2.2 Reset
Todos los Microcontroladores necesitan recibir un impulso apenas se energizan. Esto
es fundamental para inicializar sus unidades y registros. De no presentarse este
impulso, el Microcontrolador probablemente quedara bloqueado ejecutando algn
grupo de instrucciones que nada tienen que ver con la ejecucin del programa
preparado, ya que el PC (contador de programa) podra estar apuntando a cualquier
parte de la memoria de programa flash. Este impulso, entre otras cosas, asegura que
el registro PC apunte a la primera celda de la memoria flash, es decir, el
Microcontrolador queda listo para leer, interpretar y ejecutar su primera instruccin.

Este impulso se
logra realizando un
arreglo RC sobre la
patilla MCLR.
Valores comunes
seran 1K ohmios
para la resistencia
y 10 uF para el
condensador. Si
durante el
funcionamiento del
Microcontrolador
ocurriera algn
evento no deseado
y este quedase bloqueado o simplemente se requiere reiniciar la ejecucin del
programa desde el principio, es necesario inyectar un nuevo impulso sobre MCLR.
Pero como notamos en la grfica, MCLR, no es la nica fuente que puede generar un
reset del sistema.
176
CARRERAS PROFESIONALES CIBERTEC
3.2.2.3 Reloj
La funcin de reloj, tambin conocida como sistema de oscilacin, es fundamental
para que el Microcontrolador se ponga en marcha. Sin esta seal, los
Microcontroladores no podran realizar la ms mnima labor. Estos necesitan los
pulsos repetitivos de la seal de reloj para leer, interpretar y ejecutar las instrucciones
almacenadas en su memoria flash.





















Tiene
cuatro
Posibilidades de asignacin de reloj:

1 Oscilador principal (OSCI y OSCO).
2 Oscilador secundario (SOSCI y SOSCO).
3 Oscilador interno rpido (FRC)
4 Oscilador RC interno de baja potencia (LPRC)












MI CROCONTROLADORES 177
CIBERTEC CARRERAS PROFESIONALES
3.2.3 ARQUITECTURA INTERNA

El PIC32MX300F032H posee una arquitectura mucho ms avanzada en comparacin
a los PICs de 16 bits.




.


178
CARRERAS PROFESIONALES CIBERTEC
3.2.4 ORGANIZACIN DE LA MEMORIA

La memoria fsica es direccionada de modo virtual a travs de cinco segmentos
llamados KSEG0, KSEG1, KSEG2, KSEG3 y KUSEG.






MI CROCONTROLADORES 179
CIBERTEC CARRERAS PROFESIONALES
3.2.5 JUEGO DE INSTRUCCIONES

A continuacin se muestra el juego de instrucciones Assembler de este PIC:














180
CARRERAS PROFESIONALES CIBERTEC









MI CROCONTROLADORES 181
CIBERTEC CARRERAS PROFESIONALES











182
CARRERAS PROFESIONALES CIBERTEC


















MI CROCONTROLADORES 183
CIBERTEC CARRERAS PROFESIONALES
























184
CARRERAS PROFESIONALES CIBERTEC

Resumen




El PIC32MX300F032H pertenece a la gama de los microcontroladores de 32 bits.
Tiene un Microprocesador de 32 bits, una memoria FLASH de 32KBytes, una RAM
de 8Kbytes, seis puertos: PORTB, PORTC, PORTD, PORTE, PORTF y PORTG;
cinco temporizadores, dos puertos serie tipo USART, dos puertos IC; y 16 canales
de conversin A/D.

Para funcionar necesita una seal de reloj, la cual puede aplicarse desde un
oscilador externo primario, externo secundario o a travs de un sistema de reloj
interno.

Adems, dispone de un sistema de configuracin de polarizacin para energizar
los perifricos y el corazn del microprocesador. Su voltaje de polarizacin no debe
superar los 3.3V y la del ncleo no debe ser mayor a 2.5V.

Su sistema de RESET est formado por 7 fuentes posibles de reinicio.

Soporta 76 instrucciones. Incluye instrucciones de multiplicacin y divisin que
facilitan enormemente las aplicaciones que involucran clculo.

You might also like