Vous êtes sur la page 1sur 184

Microcontroladores

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

NDICE
Presentacin

Red de contenidos

Unidad de aprendizaje 1: El PIC16F84


1.1 Tema1

: El microprocesador

1.1.1 : Arquitectura de Von Newman


1.1.2 : Sistema basado en Microprocesador
1.2 Tema2

: El PIC16F84

9
9
10
13

1.2.1 : Caractersticas

13

1.2.2 : Puesta en marcha

14

1.2.3 : Arquitectura interna

16

1.3 Tema3

: Organizacin de la memoria

21

1.3.1 : Mapeo de la memoria Flash

21

1.3.2 : Memoria RAM

21

1.3.3 : Registros y funciones

22

1.4 Tema4

: Juego de Instrucciones

30

1.4.1 : Orientadas al Byte

30

1.4.2 : Orientadas al bit

31

1.4.3 : Algunos comandos en C

32

1.5 Tema5

: Gestin de puertos

32

1.5.1 : Configuracin

32

1.5.2 : Lectura y escritura

34

1.5.3 : Programas aplicativos

35

1.6 Tema6

: Gestin de RAM

44

1.6.1 : Acceso directo

44

1.6.2 : Acceso indirecto

45

1.6.3 : Programa aplicativo

46

1.7 Tema7

: Gestin de Temporizacin

47

1.7.1 : Modos de operacin

48

1.7.2 : Programas aplicativos

50

Unidad de aprendizaje 2 : El PIC16F877


2.1 Tema8

CIBERTEC

: Introduccin al PIC16F877

56

2.1.1 : Caractersticas

56

2.1.2 : Puesta en marcha

57

2.1.3 : Arquitectura interna

58

CARRERAS PROFESIONALES

2.1.4 : Memorias
2.2 Tema9

: Registros y funciones

59
65

2.2.1 : Registros

65

2.2.2 : Funciones

67

2.3 Tema10

: Gestin de Puertos y RAM

82

2.3.1 : Juego de instrucciones

82

2.3.2 : Acceso a los puertos

83

2.3.3 : Acceso a RAM

85

2.3.4 : Programas aplicativos

87

2.4 Tema11

: Gestin de Temporizacin

95

2.4.1 : Timer0

95

2.4.2 : Timer1

97

2.4.3 : Timer2

100

2.4.4 : Programas aplicativos

102

2.5 Tema12

: Gestin de Comunicacin y ADC

108

2.5.1 : Comunicacin serie

108

2.5.2 : Conversin ADC

114

2.5.3 : Programas aplicativos

117

2.6 Tema13

: Gestin de Interrupciones

123

2.6.1 : Tratamiento de una interrupcin

123

2.6.2 : Registros asociados

124

2.6.3 : Secuencia de configuracin

127

2.6.4 : Programas aplicativos

128

Unidad de aprendizaje 3 : PICs de 16 y 32 bits


3.1 Tema14

: El PIC24FJ64GA006

141

3.1.1 : Caractersticas

141

3.1.2 : Puesta en marcha

143

3.1.3 : Arquitectura interna

145

3.1.4 : Memoria RAM

146

3.1.5 : Juego de Instrucciones

160

3.1.6 : Programa aplicativo

164

3.2 Tema15

: El PIC32MX300F032H

173

3.2.1 : Caractersticas

173

3.2.2 : Puesta en marcha

175

3.2.3 : Arquitectura interna

177

3.2.4 : Organizacin de la memoria

178

3.2.5 : Juego de Instrucciones

179

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

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.

CIBERTEC

CARRERAS PROFESIONALES

RED DE CONTENIDOS

Microcontroladores

PIC24FJ64GA006
PIC32MX300FO32H

Arquitectura
y
Puesta en marcha

Memorias
y
Registros

PIC16F84
PIC16F877

Arquitectura
y
Puesta en marcha

Memorias
y
Registros

Programacin de los PICs

Juego de instrucciones
y Configuracin

CARRERAS PROFESIONALES

Acceso a los Puertos


y a memoria RAM

Temporizacin,
Comunicacin serial
e Interrupciones

CIBERTEC

MICROCONTROLADORES

CIBERTEC

CARRERAS PROFESIONALES

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

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

CIBERTEC

CARRERAS PROFESIONALES

10

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

11

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

CIBERTEC

CARRERAS PROFESIONALES

12

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)
b)
c)
d)
e)

Escribirse sobre alguna celda de memoria RAM


Escribirse sobre alguna unidad de salida OUT
Leerse de alguna celda de memoria RAM
Leerse de alguna unidad de entrada IN
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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

13

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.

CIBERTEC

CARRERAS PROFESIONALES

14

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

15

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.

CIBERTEC

CARRERAS PROFESIONALES

16

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

17

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

CIBERTEC

CARRERAS PROFESIONALES

18

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

19

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.

CIBERTEC

CARRERAS PROFESIONALES

20

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

21

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.

CIBERTEC

CARRERAS PROFESIONALES

22

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
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh

INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB

Lee y escribe los datos en RAM en el modo indirecto con FSR.


Temporizador/contador de 8 bits
Contador de programa (puntero de instrucciones) parte baja
Indicador de estado de la ALU, selector de los Bancos de RAM
Direccionador de las celdas de RAM en el modo indirecto
Puerto de lectura y escritura de 5 bits
Puerto de lectura y escritura de 8 bits

EEDATA
EEADR
PCLATH
INTCON

Lee y escribe los datos en EEPROM.


Direccionador de las celdas de EEPROM
Contador de programa parte alta
Configurador e indicador de interrupciones

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

23

BANCO 1
80h
81h
82h
83h
84h
85h
86h
87h
88h
89h
8Ah
8Bh

INDF
OPTION
PCL
STATUS
FSR
TRISA
TRISB

Lee y escribe los datos en RAM en el modo indirecto con FSR.


Configurador del TMR0 y habilitador de interrupciones externas
Contador de programa (puntero de instrucciones) parte baja
Indicador de estado de la ALU, selector de Banco de Ram
Direccionador de las celdas de Ram en el modo indirecto
Configurador del sentido de trabajo de los bits del PORTA
Configurador del sentido de trabajo de los bits del PORTB

EECON1
EECON2
PCLATH
INTCON

Controlador de la lectura o escritura sobre la EEPROM


Secuenciador de escritura (55h y AAh) para la EEPROM
Contador de programa parte alta
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
bit7

RP1
bit6

RP0
bit5

T0
bit4

PD
bit3

Z
bit2

DC
bit1

C
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

CIBERTEC

CARRERAS PROFESIONALES

24

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
bit7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
bit1

PS0
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
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

CARRERAS PROFESIONALES

TIMER0
2
4
8
16
32
64
128
256

WATCHDOG
1
2
4
8
16
32
64
128

CIBERTEC

MICROCONTROLADORES

25

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
bit7

GIE:

EEIE
bit6

T0IE
bit5

INTE
bit4

RBIE
bit3

T0IF
bit2

INTF
bit1

RBIF
bit0

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:
bit7

EEIF:

bit6

bit5

EEIF
bit4

WRWRR
bit3

WREN
bit2

WR
bit1

RD
Bit0

Indicador de proceso de escritura


1: Escritura culminada
0: Escritura desactivada o en proceso

CIBERTEC

CARRERAS PROFESIONALES

26

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:
bit7

RA0:
RA1:
RA2:
RA3:
RA4:

bit6

bit5

RA4/TOCKI
bit4

RA3
bit3

RA2
bit2

RA1
bit1

RA0
Bit0

Bit menos significativo del puerto. Funciona como I/O digital.


Funciona como I/O digital.
Funciona como I/O digital.
Funciona como I/O digital.
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
bit7

RB0:
RB1:
RB2:
RB3:
RB4:
RB5
RB6
RB7

RB6
bit6

RB5
bit5

RB4
bit4

RB3
bit3

RB2
bit2

RB1
Bit1

RB0/INT
Bit0

Bit menos significativo. Funciona como I/O digital o interrupcin por pulso bajo.
Funciona como I/O digital.
Funciona como I/O digital.
Funciona como I/O digital.
Funciona como I/O digital o interrupcin si vara su valor.
Funciona como I/O digital o interrupcin si vara su valor.
Funciona como I/O digital o interrupcin si vara su valor.
Bit ms significativo. Funciona como I/O o interrupcin si vara su valor.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

27

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:
bit7

TRISA0:
TRISA1:
TRISA2:
TRISA3:
TRISA4:

bit6

bit5

TRISA4
bit4

TRISA3
bit3

TRISA2
bit2

TRISA1
bit1

TRISA0
Bit0

Bit de configuracin del pin RA0.


Bit de configuracin del pin RA1.
Bit de configuracin del pin RA2.
Bit de configuracin del pin RA3.
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
bit7

TRISB0:
TRISB1:
TRISB2:
TRISB3:
TRISB4:
TRISB5:
TRISB6:
TRISB7:

TRISB6
bit6

TRISB5
bit5

TRISB4
bit4

TRISB3
bit3

TRISB2
bit2

TRISB1
bit1

TRISB0
Bit0

Bit de configuracin del pin RB0


Bit de configuracin del pin RB1
Bit de configuracin del pin RB2
Bit de configuracin del pin RB3
Bit de configuracin del pin RB4
Bit de configuracin del pin RB5
Bit de configuracin del pin RB6
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.

CIBERTEC

CARRERAS PROFESIONALES

28

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

29

UNIDAD DE
APRENDIZAJE

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.

CIBERTEC

CARRERAS PROFESIONALES

30

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
ADDWF F,d
ANDWF F,d
CLRF F
CLRW
COMF F,d
DECF F,d
DECFSZ F,d
INCF F,d
INCFSZ F,d
IORWF F,d
MOVFW F
MOVWF F
NOP
RLF F,d
RRF F,d
SUBWF F,d
SWAPF F,d
XORWF F,d

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).
Suma el registro W y el elemento F
AND lgico entre W y F
Borra todos los bits de F
Borra todos los bits de W
Complementa el valor de F
Disminuye en uno el valor de F
Disminuye en uno el valor de F y salta si se hizo cero
Aumenta en uno el valor de F
Aumenta en uno el valor de F y salta si se hizo cero
OR lgico entre W y F
Transfiere el valor de F a W
Transfiere el valor del registro W a F
Ninguna operacin, solo consume un ciclo de mquina
Rota hacia la izquierda un bit F a travs del Carry
Rota hacia la derecha un bit F a travs del Carry
Resta el registro W y F
Intercambia los nibbles de F
XOR lgico entre W y F

Ejemplos:
ADDWF
ADDWF
CLRF
CLRF
CLRW
DECF
INCF
MOVFW
MOVWF
SUBWF
SUBWF

PORTB,1
PORTB,0
PORTA
TRISB
VALOR
VARIABLE
PORTB
INDF
MAXIMO,1
MAXIMO,0

CARRERAS PROFESIONALES

; PORTB = W + PORTB
; W = W + PORTB
; PORTA = 0 (todos sus bits)
; TRISB = 0 (todos sus bits)
; W = 0 (todos sus bits)
; VALOR = VALOR 1
; VARIABLE = VARIABLE + 1
; W = PORTB
; INDF = W
; MAXIMO = MAXIMO W
; W = MAXIMO - W

CIBERTEC

MICROCONTROLADORES

31

1.4.2 Orientadas al bit

Orientadas al BIT
BCF F,b
BSF F,b
BTFSC F,b
BTFSS F,b

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.
Pone a cero (0) el bit b del elemento F
Pone a uno (1) el bit b del elemento F
Salta si el bit b de F est en cero
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
ADDLW K
ANDLW K
CALL ETIQUETA
CLRWDT
GOTO K
IORLW K
MOVLW K
RETFIE
RETLW K
RETURN
SLEEP
SUBLW K
XORLW K

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.
Suma W ms K
AND lgica entre W y K
Se llama a ejecucin la subrutina cuya direccin lo indica ETIQUETA
Borra el temporizado de la funcin watchdog
Salta a la direccin indicada en la ETIQUETA
OR lgico entre W y K
Transfiere a W el valor de K
Retorno de una subrutina de interrupcin
Retorno de una subrutina comn cargando una constante en W
Retorno de una subrutina comn
Ingreso al modo de descanso
Resta K menos W
Xor lgico entre W y K

Ejemplos:
ADDLW
ADDLW
ADDLW
ANDLW
CALL
GOTO
MOVLW
RETLW
RETLW
SUBLW

CIBERTEC

.100
; W = W + 100 (decimal)
0X35
; W = W + 35h (hexadecimal)
B11110001 ; W = W + 11110001b (binario)
B11001100 ; W = W AND 11001100b
DELAY
; Invoca la ejecucin de la funcin DELAY.
REPEAT
; Salta a la etiqueta REPEAT
0X55
; W = 55h
.10
; Retorna de una subrutina y transfiere el valor 10 a W
0x58
; Retorna de una subrutina y transfiere el valor 58h a W
.200
; W = 200 W

CARRERAS PROFESIONALES

32

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:

Assembler
MOVFW PORTA
MOVWF PORTA
MOVFW PORTB
MOVWF PORTB
MOVWF TRISA
MOVWF TRISB

Assembler
BCF PORTA,2
BSF PORTB,0
BSF PORTA,4
BCF PORTB,5
BTFSC PORTA,1
BTFSS PORTB,7
BTFSS PORTA,0
BTFSC PORTB,3

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

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

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

33

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:

CIBERTEC

CARRERAS PROFESIONALES

34

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

35

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

CIBERTEC

CARRERAS PROFESIONALES

36

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);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);

// Apagar
// los LEDs
// desde RB0
// hasta RB3

delay_ms(1000);

// esperar 1s.

output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);

// encender
// los LEDs
// desde RB0
// 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).

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

37

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);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);

// Apagar
// los LEDs
// desde RB0
// hasta RB3

delay_ms(1000);

// esperar 1s.

output_high(PIN_B0);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);

// encender
// los LEDs
// desde RB0
// 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.

CIBERTEC

CARRERAS PROFESIONALES

38

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)){
output_high(PIN_B0); }
else {
output_low(PIN_B0); }
}while(TRUE);

// Si el pulsador est activado (en uno)


// encender el LED
// en caso contrario
// apagar el LED
// 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)){
output_high(PIN_B0); }
else {
output_low(PIN_B0); }
}while(TRUE);

// Si el pulsador est activado (RA0=1)


// encender el LED (RB0=1)
// en caso contrario
// apagar el LED (RB0=0)
// Repetir el bucle

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

39

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)){
output_low(PIN_B0); }
else if (input(PIN_A1)){
output_high(PIN_B0); }
}while(TRUE);

// Si el pulsador P1 est activado (RA0=1)


// encender el LED (RB0=1)
// si el pulsador P2 est activado (RA1=1)
// apagar el LED (RB0=0)
// 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.

CIBERTEC

CARRERAS PROFESIONALES

40

Veamos qu valor se debe enviar por el PORTB para que aparezca el nmero
requerido.
Segmentos

Bits del PORTB

Nmero 9

0 = OFF
1 = ON

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);
output_high(PIN_B1);
output_high(PIN_B2);
output_high(PIN_B3);
output_low(PIN_B4);
output_high(PIN_B5);
output_high(PIN_B6);
output_low(PIN_B7);
}while(TRUE);

// Encender el segmento a
// encender el segmento b
// encender el segmento c
// encender el segmento d
// apagar el segmento e
// encender el segmento f
// encender el segmento g
// apagar el punto
// 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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

41

Armemos la tabla para los nmeros 8 y 0:


Segmentos

Bits del PORTB

Nmero 8

Nmero 0

1 = OFF
0 = ON

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)){
output_b(0x80);}
else if (input(PIN_A3)){
output_b(0xC0);}
}while(TRUE);

// si el pulsador P1 est activado (RA2=1)


// mostrar el nmero 8 sobre el display (0x80)
// si el pulsador P2 est activado (RA3=1)
// mostrar el nmero 0 sobre el display (0xC0)
// repetir el bucle.

CIBERTEC

CARRERAS PROFESIONALES

42

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

43

UNIDAD DE
APRENDIZAJE

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.

CIBERTEC

CARRERAS PROFESIONALES

44

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

45

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
BCF
MOVLW
MOVWF
MOVFW
MOVWF
INCF

STATUS,IRP
FSR,7
0X10
FSR
INDF
PORTB
FSR

; IRP = 0
; Bit 7 = 0
; W = 10h
; FSR = Direccin de inicio de cadena
; W = INDF (DATO de la memoria)
; PORTB = W = DATO
; 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

CIBERTEC

CARRERAS PROFESIONALES

46

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);
set_tris_a(0xFF);

CARRERAS PROFESIONALES

// todo el puerto B configurado como salida.


// todo el puerto A configurado como entrada

CIBERTEC

MICROCONTROLADORES

output_b(0);
do{
if(input(PIN_A2))
for (i=0;i<10;++i){
output_b(tabla7s[i]);
delay_ms(1000);}
}while(TRUE);

47

// apaga el display

// si el pulsador est activado (RA2=1)


// aplicar la secuencia for que
// accede a cada cdigo, lo muestra en el display
// y genera un retardo de 1 segundo por cada visualizacin.
// 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)

CIBERTEC

CARRERAS PROFESIONALES

48

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
2- Fijar flanco de subida para la cuenta
3- Anular el factor de divisin
4- Inicializar el registro de trabajo

BSF
BCF
BSF
MOVLW
MOVWF

OPTION_REG, T0CS
OPTION_REG, T0SE
OPTION_REG, PSA
.156
TMR0

Recuerde el registro OPTION


RBPU
bit 7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
bit1

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

PS0
bit0

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

49

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
bit 7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
bit1

PS0
bit0

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


PS2 PS1 PS0
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

TIMER0
2
4
8
16
32
64
128
256

WATCHDOG
1
2
4
8
16
32
64
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

CIBERTEC

CARRERAS PROFESIONALES

50

1.7.1.2.1 Secuencia de configuracin


Supngase que deseamos lograr un temporizado de 40ms:
1- Eleccin del clock interno f/4
2- Asignar el factor de divisin al timer
3- Establecer el factor 256 de divisin

4- Inicializar el registro de trabajo


(256 156)

BCF OPTION_REG, T0CS


BCF OPTION_REG, PSA
BSF OPTION_REG, PS0
BSF OPTION_REG, PS1
BSF OPTION_REG, PS2
MOVLW
.100
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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

51

#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);
RB0=0;

// pin RB0 del PORTB como salida


// 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;
set_TIMER0(0);

// desactivamos el indicador de desborde del TIMER0.


// 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

CIBERTEC

CARRERAS PROFESIONALES

52

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);
set_tris_a(0xFF);

// todo el puerto B configurado como salida.


// 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);

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

53

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.
}

CIBERTEC

CARRERAS PROFESIONALES

54

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

55

UNIDAD DE
APRENDIZAJE

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.

CIBERTEC

CARRERAS PROFESIONALES

56

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

57

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

CIBERTEC

CARRERAS PROFESIONALES

58

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

59

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.

CIBERTEC

CARRERAS PROFESIONALES

60

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
0
0
1
1

PCLATH,3
0
1
0
1

Pgina
0
1
2
3

Y cuando deseamos retornar de una subrutina que se encuentra en otra pgina,


tambin se hace necesario seleccionar la pgina de destino.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

61

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:

CIBERTEC

CARRERAS PROFESIONALES

62

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
0
0
1
1

RP0
0
1
0
1

Banco
0
1
2
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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

63

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.

CIBERTEC

CARRERAS PROFESIONALES

64

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

65

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
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh
0Eh
0Fh

INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
PORTC
PORTD
PORTE
PCLATH
INTCON
PIR1
PIR2
TMR1L
TMR1H

Registro de lectura/escritura de RAM en acceso indirecto


Registro de trabajo del TMR0
Registro contador de programa (parte baja)
Registro de estado de la ALU y selector de los Bancos de RAM
Registro direccionador de RAM en el modo indirecto
Puerto A de lectura y escritura de 5 bits
Puerto B de lectura y escritura de 8 bits
Puerto C de lectura y escritura de 8 bits
Puerto D de lectura y escritura de 8 bits
Puerto E de lectura y escritura de 3 bits
Registro contador de programa (parte alta)
Registro de configuracin de las primeras interrupciones
Registro indicador de estado de perifricos
Registro indicador de estado de perifricos
Registro de trabajo del TMR1 (parte baja)
Registro de trabajo del TMR1 (parte alta)

BANCO 0
10h
11h
12h
13h
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
1Eh
1Fh

CIBERTEC

T1CON
TMR2
T2CON
SSPBUF
SSPCON
CCPR1L
CCPR1H
CCPCON
RCSTA
TXREG
RCREG
CCPR2L
CCPR2H
CCPCON
ADRESH
ADCON0

Registro de configuracin del TMR1


Registro de trabajo del TMR2
Registro de configuracin del TMR2
Registro buffer de transmisin y recepcin serial sncrona
Registro de control serial sncrono
Registro de trabajo del mdulo 1 captura y comparacin (low)
Registro de trabajo del mdulo 1 captura y comparacin (high)
Registro de configuracin del mdulo 1 captura y comparacin
Registro de configuracin de la recepcin serie
Registro de transmisin de datos serie
Registros de recepcin de datos serie
Registro de trabajo del mdulo 2 captura y comparacin (low)
Registro de trabajo del mdulo 2 captura y comparacin (high)
Registro de configuracin del mdulo 2 captura y comparacin
Registro de datos de la conversin A/D (parte alta)
Registro de configuracin 0 del conversor A/D

CARRERAS PROFESIONALES

66

BANCO 1
80h
81h
82h
83h
84h
85h
86h
87h
88h
89h
8Ah
8Bh
8Ch
8Dh
8Eh
91h
92h
93h
94h
98h
99h
9Eh
9Fh

INDF
OPTION
PCL
STATUS
FSR
TRISA
TRISB
TRISC
TRISD
TRISE
PCLATH
INTCON
PIE1
PIE2
PCON
SSPCON2
PR2
SSPADD
SSPSTAT
TXSTA
SPBRG
ADRESL
ADCON1

Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro

de lectura/escritura de RAM en acceso indirecto


de Configuracin del TMR0
contador de programa (parte baja)
de estado de la ALU y selector de los Bancos de RAM
direccionador de RAM en el modo indirecto
de configuracin del PORTA
de configuracin del PORTB
de configuracin del PORTC
de configuracin del PORTD
de configuracin del PORTE
contador de programa (parte alta)
de configuracin de las primeras interrupciones
de configuracin de interrupciones de perifricos 1
de configuracin de interrupciones de perifricos 2
de control de reset
de control 1 de la comunicacin serie sncrona
de trabajo del periodo del TMR2
de direccin de la comunicacin serie sncrona
de estado de la comunicacin serie sncrona
de control de la transmisin serie
generador de velocidad de la comunicacin serie
de datos de la conversin A/D (parte baja)
de configuracin 1 del conversor A/D

BANCO 2
100h
101h
102h
103h
104h
106h
10Ah
10Bh
10Ch
10Dh
10Eh
10Fh

INDF
TMR0
PCL
STATUS
FSR
PORTB
PCLATH
INTCON
EEDATA
EEADR
EEDATH
EEADRH

Registro de lectura/escritura de RAM en acceso indirecto


Registro de trabajo del TMR0
Registro contador de programa (parte baja)
Registro de estado de la ALU y selector de los Bancos de RAM
Registro direccionador de RAM en el modo indirecto
Puerto B de lectura y escritura de 8 bits
Registro contador de programa (parte alta)
Registro de configuracin de las primeras interrupciones
Registro de datos de EEPROM y FLASH (parte baja)
Registro de direcciones de EEPROM y FLASH (parte baja)
Registro de datos de FLASH (parte alta)
Registro de direcciones de FLASH (parte alta)

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

67

BANCO 3
180h
181h
182h
183h
184h
186h
18Ah
18Bh
18Ch
18Dh

INDF
OPTION
PCL
STATUS
FSR
TRISB
PCLATH
INTCON
EECON1
EECON2

Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro
Registro

de lectura/escritura de RAM en acceso indirecto


de Configuracin del TMR0
contador de programa (parte baja)
de estado de la ALU y selector de los Bancos de RAM
direccionador de RAM en el modo indirecto
de configuracin del PORTB
contador de programa (parte alta)
de configuracin de las primeras interrupciones
de control de la memoria EEPROM
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
bit7

RP1
bit6

RP0
bit5

T0
bit4

PD
bit3

Z
bit2

DC
bit1

C
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

CIBERTEC

CARRERAS PROFESIONALES

68

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
bit7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
bit1

PS0
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
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

TIMER0
2
4
8
16
32
64
128
256

WATCHDOG
1
2
4
8
16
32
64
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
bit7

GIE:

PEIE
bit6

T0IE
Bit5

INTE
bit4

RBIE
bit3

T0IF
bit2

INTF
bit1

RBIF
bit0

Habilitador global de las interrupciones


1: Habilitado
0: Deshabilitado

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

69

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:
bit7

bit6

bit5

EEIF
bit4

WRWRR
bit3

WREN
bit2

WR
bit1

RD
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

CIBERTEC

CARRERAS PROFESIONALES

70

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:
bit7

bit6

RA5
bit5

RA4
bit4

RA3
bit3

RA2
bit2

RA1
bit1

RA0
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
bit7

RB0:
RB1:
RB2:
RB3:
RB4:
RB5
RB6
RB7

RB6
bit6

RB5
bit5

RB4
bit4

RB3
bit3

RB2
bit2

RB1
Bit1

RB0
Bit0

Bit menos significativo. Funciona como I/O digital o interrupcin por pulso bajo.
Funciona como I/O digital.
Funciona como I/O digital.
Funciona como I/O digital.
Funciona como I/O digital o interrupcin si vara su valor.
Funciona como I/O digital o interrupcin si vara su valor.
Funciona como I/O digital o interrupcin si vara su valor.
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
bit7

RC0:
RC1:
RC2:
RC3:
RC4:
RC5
RC6

RC6
bit6

RC5
Bit5

RC4
bit4

RC3
bit3

RC2
bit2

RC1
Bit1

RC0
Bit0

Bit menos significativo. Funciona como I/O digital o entrada de reloj para TMT1.
Funciona como I/O digital o captura 2 in/compare 2 out/pwm2 out.
Funciona como I/O digital o captura 1 in/compare 1 out/pwm1 out.
Funciona como I/O digital o reloj de sincronismo serie para SPI o IC.
Funciona como I/O digital o dato in para SPI o I/O para IC.
Funciona como I/O digital o sincronismo del puerto serie en salida de datos.
Funciona como I/O digital o transmisin asncrona USART/reloj sncrono.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

RC7

71

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
Bit7

RD0:
RD1:
RD2:
RD3:
RD4:
RD5
RD6
RD7

RD6
bit6

RD5
bit5

RD4
bit4

RD3
bit3

RD2
bit2

RD1
Bit1

RD0
Bit0

Bit menos significativo. Funciona como I/O digital o puerto paralelo esclavo 0
Funciona como I/O digital o puerto paralelo esclavo 1.
Funciona como I/O digital o puerto paralelo esclavo 2.
Funciona como I/O digital o puerto paralelo esclavo 3.
Funciona como I/O digital o puerto paralelo esclavo 4.
Funciona como I/O digital o puerto paralelo esclavo 5.
Funciona como I/O digital o puerto paralelo esclavo 6.
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
bit2

RE1
Bit1

RE0
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:
bit7

TRISA0:
TRISA1:
TRISA2:
TRISA3:
TRISA4:
TRISA5:

bit6

TRISA5
bit5

TRISA4
bit4

TRISA3
bit3

TRISA2
bit2

TRISA1
bit1

TRISA0
Bit0

Bit de configuracin del pin RA0


Bit de configuracin del pin RA1
Bit de configuracin del pin RA2
Bit de configuracin del pin RA3
Bit de configuracin del pin RA4
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
bit7

CIBERTEC

TRISB6
bit6

TRISB5
bit5

TRISB4
bit4

TRISB3
bit3

TRISB2
bit2

TRISB1
bit1

TRISB0
Bit0

CARRERAS PROFESIONALES

72

TRISB0:
TRISB1:
TRISB2:
TRISB3:
TRISB4:
TRISB5:
TRISB6:
TRISB7:

Bit de configuracin del pin RB0


Bit de configuracin del pin RB1
Bit de configuracin del pin RB2
Bit de configuracin del pin RB3
Bit de configuracin del pin RB4
Bit de configuracin del pin RB5
Bit de configuracin del pin RB6
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
bit7

TRISC0:
TRISC1:
TRISC2:
TRISC3:
TRISC4:
TRISC5:
TRISC6:
TRISC7:

TRISC6
bit6

TRISC5
bit5

TRISBC
bit4

TRISBC
bit3

TRISBC
bit2

TRISBC
bit1

TRISC0
Bit0

Bit de configuracin del pin RC0


Bit de configuracin del pin RC1
Bit de configuracin del pin RC2
Bit de configuracin del pin RC3
Bit de configuracin del pin RC4
Bit de configuracin del pin RC5
Bit de configuracin del pin RC6
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
bit7

TRISD0:
TRISD1:
TRISD2:
TRISD3:
TRISD4:
TRISD5:
TRISD6:
TRISD7:

TRISD6
bit6

TRISD5
bit5

TRISD4
bit4

TRISD3
bit3

TRISD2
bit2

TRISD1
bit1

TRISD0
Bit0

Bit de configuracin del pin RB0


Bit de configuracin del pin RD1
Bit de configuracin del pin RD2
Bit de configuracin del pin RD3
Bit de configuracin del pin RD4
Bit de configuracin del pin RD5
Bit de configuracin del pin RD6
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:
-

TRISE0:
TRISE1:
TRISE2:

TRISE2
bit2

TRISE1
bit1

TRISE0
Bit0

Bit de configuracin del pin RE0


Bit de configuracin del pin RE1
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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

73

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
bit7

ADIE
bit6

RCIE
bit5

TXIE
bit4

SSPIE
bit3

CCP1IE
bit2

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

TMR2IE
bit1

TMR1IE
Bit0

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
bit7

PSPIF:

CIBERTEC

ADIF
bit6

RCIF
bit5

TXIF
bit4

SSPIF
bit3

CCP1IF
bit2

TMR2IF
bit1

TMR1IF
Bit0

Lectura/escritura del puerto paralelo esclavo


1: Una operacin de lectura o escritura ha culminado.

CARRERAS PROFESIONALES

74

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.
bit7

bit6

bit5

EEIE
bit4

BCLIE
bit3

bit2

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

CARRERAS PROFESIONALES

Bit1

CCP2IE
Bit0

CIBERTEC

MICROCONTROLADORES

75

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.
Bit7

Bit6

bit5

EEIF
bit4

BCLIF
bit3

bit2

Bit1

CCP2IF
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.
Bit7

bit6

T1CKPS1
bit5

T1CKPS0
bit4

T1OSCEN
bit3

T1SYNC
bit2

TMR1CS
Bit1

TMR1ON
Bit0

T1CKPS1- T1CKPS0: Selector del factor de divisin


PS1 PS0
0
0
0
1
1
0
1
1

T1OSCEN:

T1SYNC:

TIMR1
1
2
4
8

Oscilador externo
1: Habilitado
0: Deshabilitado
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

CIBERTEC

CARRERAS PROFESIONALES

76

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.
Bit7

TOUTPS3

TOUTPS2

TOUTPS1

TOUTPS0

TMR2ON

T2CKPS1

T2CKPS0

Bit6

bit5

bit4

bit3

bit2

Bit1

Bit0

TOUTPSX:

Selector del factor de post divisin


TOPS3 S2 S1 S0
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0

POST TMR2
1
2
3
4
5

.
.
.

.
.
.

TMR2ON:

Puesta en marcha del timer


1: Activada
0: Desactivada

T2CKPSX:

Selector del factor de divisin


T2CKPS1 PS0
0
0
0
1
1
0
1
1

16

TMR2
1
4
16
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
Bit7

TX9

TXEN

SYNC

BRGH

TRMT

TX9D

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

77

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
Bit7

RX9

SREN

CREN

ADDEN

FERR

OERR

RX9D

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

CIBERTEC

CARRERAS PROFESIONALES

78

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
Bit7

ADCSX:

ADCS0

CHS2

CH1

CH0

GO/DONE

ADON

bit6

bit5

bit4

bit3

bit2

Bit1

Bit0

Seleccin del clock de conversin


ADCS1 S0
0
0
0
1
1
0
1
1

CHSX:

CLOCK
F/2
F/8
F/32
FRC

Seleccin del canal de conversin


CHS2 S1 S0
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

CANAL
0 (RA0)
1 (RA1)
2 (RA2)
3 (RA3)
4 (RA5)
5 (RE0)
6 (RE1)
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
Bit7

ADFM:

PCFG3

PCFG2

PCFG1

PCFG0

bit6

bit5

bit4

Bit3

bit2

Bit1

Bit0

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)

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

PCFGX:

79

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

VDD

GND

0001

RA3

GND

0010

VDD

GND

0011

RA3

GND

0100

VDD

GND

0101

RA3

GND

0110

0111

1000

RA3

RA2

1001

VDD

GND

1010

RA3

GND

1011

RA3

RA2

1100

RA3

RA2

1101

RA3

RA2

1110

VDD

GND

1111

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.

CIBERTEC

CARRERAS PROFESIONALES

80

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

81

UNIDAD DE
APRENDIZAJE

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.

CIBERTEC

CARRERAS PROFESIONALES

82

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
ADDWF F,d
ANDWF F,d
CLRF F
CLRW
COMF F,d
DECF F,d
DECFSZ F,d
INCF F,d
INCFSZ F,d
IORWF F,d
MOVFW F
MOVWF F
NOP
RLF F,d
RRF F,d
SUBWF F,d
SWAPF F,d
XORWF F,d

Orientadas al BIT
BCF F,b
BSF F,b
BTFSC F,b
BTFSS F,b

Constantes y control
ADDLW K
ANDLW K
CALL ETIQUETA
CLRWDT
GOTO K
IORLW K

CARRERAS PROFESIONALES

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).
Suma el registro W y F.
And lgico entre W y F
Borra todos los bits de F.
Borra todos los bits de W.
Complementa el valor de F.
Disminuye en uno el valor de F.
Disminuye en uno el valor de F y salta si se hizo cero.
Aumenta en uno el valor de F.
Aumenta en uno el valor de F y salta si se hizo cero.
Or lgico entre W y F
Transfiere el valor de F a W.
Transfiere el valor del registro W a F.
Ninguna operacin, slo consume un ciclo de mquina.
Rota hacia la izquierda un bit F a travs del Carry.
Rota hacia la derecha un bit F a travs del Carry.
Resta el registro W de F.
Intercambia los nibbles de F.
Xor lgico entre W y F

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.
Pone a cero (0) el bit b del elemento F.
Pone a uno (1) el bit b del elemento F.
Salta si el bit b de F est en cero
Salta si el bit b de F est en uno.

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.
Suma W ms K.
AND lgica entre W y K
Se llama a ejecucin la subrutina cuya direccin lo indica
ETIQUETA.
Borra el temporizado de la funcin watchdog.
Salta a la direccin indicada en la ETIQUETA.
OR lgico entre W y K

CIBERTEC

MICROCONTROLADORES

MOVLW K
RETFIE
RETLW K
RETURN
SLEEP
SUBLW K
XORLW K

83

Transfiere a W el valor de K.
Retorno de una subrutina de interrupcin.
Retorno de una subrutina comn cargando una constante en W
Retorno de una subrutina comn
Ingreso al modo de descanso
Resta a K, W.
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.

CIBERTEC

CARRERAS PROFESIONALES

84

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));

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

85

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.

CIBERTEC

CARRERAS PROFESIONALES

86

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

87

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)

CIBERTEC

CARRERAS PROFESIONALES

88

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);
do{

// leds apagados.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

89

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

CIBERTEC

CARRERAS PROFESIONALES

90

//-----------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);
estado=FALSE;

// apagar leds
// empezar la variable con estado OFF

do{
do{
if(input(PIN_D2))
activar=TRUE;
}while(!activar);

// si pulsador de P1 (ON) se activa


// fijar en ON el estado de la variable 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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

91

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>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)

// PIC utilizado
// configuracin de los fuses
// 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);
}

CIBERTEC

CARRERAS PROFESIONALES

92

//------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);
set_tris_d(0x00);
write_command(0x38);
write_command(0x60);
write_command(0x0E);
write_command(0x01);
write_command(0x02);

//todo el PORTB como salida


//todo el PORTD como salida
// 8 bits de datos,2 filas y caracteres de 7x5 pixeles
// desplazar a la derecha el cursor por caracter escrito
// activa la visualizacin del display
// borra memoria del display (mensajes anteriores)
// 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
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

93

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.

CIBERTEC

CARRERAS PROFESIONALES

94

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

95

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
2- Fijar flanco de subida para la cuenta
3- Anular el factor de divisin
4- Inicializar el registro de trabajo

CIBERTEC

BSF OPTION_REG, T0CS


BCF OPTION_REG, T0SE
BSF OPTION_REG, PSA
MOVLW
.236
MOVWF
TMR0

CARRERAS PROFESIONALES

96

Recuerde el registro OPTION


RBPU
bit 7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
Bit1

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

PS0
bit0

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)

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

97

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
bit 7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
bit1

PS0
bit0

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


PS2 PS1 PS0
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

TIMER0
2
4
8
16
32
64
128
256

WATCHDOG
1
2
4
8
16
32
64
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
2- Asignar el factor de divisin al timer
3- Establecer el factor 256 de divisin

4- Inicializar el registro de trabajo


(256 156)

BCF OPTION_REG, T0CS


BCF OPTION_REG, PSA
BSF OPTION_REG, PS0
BSF OPTION_REG, PS1
BSF OPTION_REG, PS2
MOVLW
.100
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.

CIBERTEC

CARRERAS PROFESIONALES

98

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

99

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


65536 1000 = 64536 = FC18
5- Poner en marcha al timer

MOVLW

0x18

MOVWF

TMR1L

MOVLW

0XFC

MOVWF

TMR1H

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

MOVLW

0x58

MOVWF

TMR1L

MOVLW

0X9E

MOVWF

TMR1H

BSF

T1CON, TMR1ON

3- Inicializar los registros de trabajo


65536 25000 = 40536 = 9E58
4- Poner en marcha el timer

Recordemos que el tiempo transcurrido para la temporizacin se calcula de la


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

CIBERTEC

CARRERAS PROFESIONALES

100

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

101

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
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
.
.
.
1

TMR2ON:

Puesta en marcha del timer


1: Activada
0: Desactivada

T2CKPSX:

Selector del factor de divisin

POST TMR2
1
2
3
4
.
.
.

16

T2CKPS1 PS0
0
0
0
1
1
0
1
1

TMR2
1
4
16
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

BSF

T2CON, T2CKPS0

BSF

T2CON, T2CKPS1

BSF

T2CON, T2OUTPS0

BSF

T2CON, T2OUTPS1

BSF

T2CON, T2OUTPS2

BCF

T2CON, T2OUTPS3

BSF

T2CON, TMR2ON

3- Seleccionar el factor de pre divisin


en 16
4- Establecer el factor de post division
En 8
5- Poner en marcha al timer

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

CIBERTEC

CARRERAS PROFESIONALES

102

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

103

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++){
output_d(secuencia[i]);
medio_segundo();}
}while(TRUE);

// bucle de 14 repeticiones
// lee secuencia y escribe en el puerto D
// retardo de 500ms
// repetir el bucle

CIBERTEC

CARRERAS PROFESIONALES

104

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

105

//------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
}

CIBERTEC

CARRERAS PROFESIONALES

106

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

107

UNIDAD DE
APRENDIZAJE

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.

CIBERTEC

CARRERAS PROFESIONALES

108

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

109

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)
b)
c)
d)

El bit en cero (bit de START) es recuperado y desplazado hacia RSR.


Recuperacin de los 8 bits siguientes (DATO) y desplazamiento hacia RSR
Recuperacin del noveno bit (si lo hubiese) y desplazamiento hacia RSR
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

CIBERTEC

CARRERAS PROFESIONALES

110

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

111

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))

CIBERTEC

CARRERAS PROFESIONALES

112

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();

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

113

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
MOVLW
MOVWF
BCF
BCF
BCF
BSF

TXSTA,BRGH
.12
SPBRG
TXSTA,SYN
TXSTA,TX9
TXSTA,TXEN
RCSTA,SPEN

;velocidad
;a
;9600 baudios
;seleccin del modo asincrnico
;desactivacin del 9no bit de datos (paridad)
;des habilitacin de la transmisin
;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){
output_b(RCREG);
RCIF=0;}
}while(TRUE);

CIBERTEC

// si el indicador de buffer serie est activado


// envar por el Puerto B el dato recibido en ECREG
// desactivar el indicador
// repetir el bucle

CARRERAS PROFESIONALES

114

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

115

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
Bit7

ADCSX:

ADCS0

CHS2

CH1

CH0

GO/DONE

ADON

bit6

bit5

bit4

bit3

bit2

Bit1

Bit0

Seleccin del reloj de conversin


ADCS1 S0
0
0
0
1
1
0
1
1

CHSX:

RELOJ
F/2
F/8
F/32
FRC

Seleccin del canal de conversin


CHS2 S1 S0
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

CANAL
0 (RA0)
1 (RA1)
2 (RA2)
3 (RA3)
4 (RA5)
5 (RE0)
6 (RE1)
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
Bit7

ADFM:

PCFGX:

CIBERTEC

PCFG3

PCFG2

PCFG1

PCFG0

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

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)
Configuracin de los pines para funcionar como analgicos o digitales
y establecer el voltaje de referencia

CARRERAS PROFESIONALES

116

PCFG3:
PCFG0

AN7
RE2

AN6
RE1

AN5
RE0

AN4
RA5

AN3
RA3

AN2
RA2

AN1
RA1

AN0
RA0

VREF+

VREF-

0000

VDD

GND

0001

RA3

GND

0010

VDD

GND

0011

RA3

GND

0100

VDD

GND

0101

RA3

GND

0110

0111

1000

RA3

RA2

1001

VDD

GND

1010

RA3

GND

1011

RA3

RA2

1100

RA3

RA2

1101

RA3

RA2

1110

VDD

GND

1111

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
BCF ADCON1,PCFG0
BSF ADCON1,PCFG1
BSF ADCON1,PCFG2
BSF ADCON1,PCFG3
BSF ADCON0, ADCS0
BCF ADCON0, ADCS1
BCF ADCON0, CHS0
BCF ADCON0, CHS1
BCF ADCON0, CHS2
BSF ADCON0, ADON
NOP

CARRERAS PROFESIONALES

;Formato del resultado 8 bits ADRESL


;Configuracin de la
;patilla RA0 como entrada
;analgica y voltaje de referencia
;VDD con GND
;seleccin de la seal de
;reloj a F/8
;seleccin de la
;patilla RA0 como
;canal de conversin
;activa la conversin
;tiempo

CIBERTEC

MICROCONTROLADORES

NOP
NOP
NOP
BSF ADCON0,GO/DONE

117

;de espera
;para iniciar
;cada conversin
;pone en marcha la conversin.

Aplicando comandos del compilador PIC C Compiler tendramos:


#device adc=8
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);

// formato de 8 bits
// pin RA0 como entrada analgica
// clock F/8
// 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----------------------------------------------

CIBERTEC

CARRERAS PROFESIONALES

118

#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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

119

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.

CIBERTEC

CARRERAS PROFESIONALES

120

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)
output_high(PIN_D0);

// verificar si es menor a 1V
// si es asi prende la luz

else if(cant_luz>=178)
output_low(PIN_D0);

// verificar si es mayor a 3.5V


// si es asi apaga la luz

delay_ms(100);
}while(TRUE);

// retardo entre lecturas

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

121

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.

CIBERTEC

CARRERAS PROFESIONALES

122

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

123

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

CIBERTEC

CARRERAS PROFESIONALES

124

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
bit7

GIE:

PEIE
bit6

T0IE
bit5

INTE
bit4

RBIE
bit3

T0IF
bit2

INTF
bit1

RBIF
bit0

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

125

0: Desactivado
2.6.2.2 Registro OPTION
RBPU
bit7

INTDEG
bit6

T0CS
bit5

T0SE
bit4

PSA
bit3

PS2
bit2

PS1
bit1

PS0
bit0

TMR2IE
bit1

TMR1IE
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
bit7

ADIE
bit6

RCIE
bit5

TXIE
bit4

SSPIE
bit3

CCP1IE
bit2

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

CIBERTEC

CARRERAS PROFESIONALES

126

2.6.2.4 El Registro PIR1


PSPIF
bit7

ADIF
bit6

RCIF
bit5

TXIF
bit4

SSPIF
bit3

CCP1IF
bit2

TMR2IF
bit1

TMR1IF
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


bit7

bit6

bit5

EEIE
bit4

BCLIE
bit3

bit2

Bit1

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

CARRERAS PROFESIONALES

CCP2IE
Bit0

CIBERTEC

MICROCONTROLADORES

127

1: Habilitado

2.6.2.6 El Registro PIR2


Bit7

bit6

bit5

EEIF
bit4

BCLIF
bit3

bit2

Bit1

CCP2IF
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);

CIBERTEC

CARRERAS PROFESIONALES

128

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);
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

129

//------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.

CIBERTEC

CARRERAS PROFESIONALES

130

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);
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

131

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;
}

CIBERTEC

CARRERAS PROFESIONALES

132

//------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);
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

133

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();
}

CIBERTEC

CARRERAS PROFESIONALES

134

//------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);
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

135

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

CIBERTEC

CARRERAS PROFESIONALES

136

//------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;}
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

137

//------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);
write_command(0x60);
write_command(0x0E);
write_command(0x01);
write_command(0x02);

// 8 bits de datos,2 filas y caracteres de 7x5 pixeles


// desplazar a la derecha el cursor por caracter escrito
// activa la visualizacin del display
// borra memoria del display (mensajes anteriores)
// 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
}

CIBERTEC

CARRERAS PROFESIONALES

138

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

CIBERTEC

139

CARRERAS PROFESIONALES

140

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

141

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.

CIBERTEC

CARRERAS PROFESIONALES

142

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

143

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.

CIBERTEC

CARRERAS PROFESIONALES

144

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

145

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.

CIBERTEC

CARRERAS PROFESIONALES

146

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

147

OSCCON: Registro de control del oscilador

CIBERTEC

CARRERAS PROFESIONALES

148

CLKDIV: Registro divisor de reloj

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

149

OSCTUN: Registro de ajuste del oscilador FRC

T1CON: registro de control del TIMER1

CIBERTEC

CARRERAS PROFESIONALES

150

TXCON: Registro de control del TIMER2 y TIMER4

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

151

TyCON: Registro de control del TIMER3 y TIMER5

UxMODE: Registro del modo de operacin UART

CIBERTEC

CARRERAS PROFESIONALES

152

UxSTA: Registro de control y estado UART

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

CIBERTEC

153

CARRERAS PROFESIONALES

154

UxTXREG: Registro de transmisin UART

UxRXREG: Registro de recepcin UART

AD1CON1: Registro de configuracin 1 ADC

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

155

AD1CON2: Registro de configuracin 2 ADC

CIBERTEC

CARRERAS PROFESIONALES

156

AD1CON3: Registro de configuracin 3 ADC

AD1CHO: Registro de seleccin del canal de entrada ADC

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

157

AD1PCFG: Registro de configuracin del puerto ADC

SR: Registro de estado

CIBERTEC

CARRERAS PROFESIONALES

158

CORCON: Registro de control del CPU

NVMCON: Registro de control de la memoria FLASH

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

159

TRISB y PORTB:

TRISC y PORTC:

TRISD y PORTD:

TRISE y PORTE:

TRISF y PORTF:

TRISG y PORTG:

CIBERTEC

CARRERAS PROFESIONALES

160

3.1.5 JUEGO DE INSTRUCCIONES


A continuacin se muestra el juego de instrucciones de este PIC:

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

CIBERTEC

161

CARRERAS PROFESIONALES

162

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

CIBERTEC

163

CARRERAS PROFESIONALES

164

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

165

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;

CIBERTEC

CARRERAS PROFESIONALES

166

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,

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

167

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;
}

CIBERTEC

CARRERAS PROFESIONALES

168

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
#define LCD_DATA_WR
#define LCD_BUSY_RD
#define LCD_DATA_RD
#define E_PIN_MASK

0x0000
0x0100
0x0200
0x0300
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};

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

169

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;

CIBERTEC

CARRERAS PROFESIONALES

170

}
}
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;
}

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

171

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.

CIBERTEC

CARRERAS PROFESIONALES

172

UNIDAD DE
APRENDIZAJE

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

173

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

CIBERTEC

CARRERAS PROFESIONALES

174

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

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

175

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.

CIBERTEC

CARRERAS PROFESIONALES

176

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)

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

177

3.2.3 ARQUITECTURA INTERNA


El PIC32MX300F032H posee una arquitectura mucho ms avanzada en comparacin
a los PICs de 16 bits.

CIBERTEC

CARRERAS PROFESIONALES

178

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.

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

179

3.2.5 JUEGO DE INSTRUCCIONES


A continuacin se muestra el juego de instrucciones Assembler de este PIC:

CIBERTEC

CARRERAS PROFESIONALES

180

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

CIBERTEC

181

CARRERAS PROFESIONALES

182

CARRERAS PROFESIONALES

CIBERTEC

MICROCONTROLADORES

CIBERTEC

183

CARRERAS PROFESIONALES

184

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.

CARRERAS PROFESIONALES

CIBERTEC