You are on page 1of 82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


Products Solutions Store Distributors Libstock C ontact Us
se arch he re

Login | C art (1)

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


TOC Capitulo 1 Capitulo 2 Capitulo 3 Capitulo 4 Apndice A

Featured Development Tools EasyPIC v7 Development System

Capitulo 3: Microcontrolador PIC16F887


El PIC16F887 es un producto conocido de la compaa Microchip. Dispone de todos los componentes disponib les en la mayora de los microcontroladores modernos. Por su b ajo precio, un rango amplio de aplicaciones, alta calidad y disponib ilidad, es una solucin perfecta aplicarlo para controlar diferentes procesos en la industria, en dispositivos de control de mquinas, para medir variab les de procesos etc. Algunas de sus caractersticas principales se enumeran a continuacin.

3.1 CARACTERSTICAS BSICAS DEL PIC16F887 3.2 PRINCIPALES REGISTROS SFR 3.3 PUERTOS DE ENTRADA/SALIDA 3.4 TEMPORIZADOR TIMER0 3.5 TEMPORIZADOR TIMER1 3.6 TEMPORIZADOR TIMER2 3.7 MDULOS CCP 3.8 MDULOS DE COMUNICACIN SERIE 3.9 MDULOS ANALGICOS 3.10 OSCILADOR DE RELOJ 3.11 MEMORIA EEPROM 3.12 REINICIO! BLACK-OUT, BROWN-OUT O RUIDOS?

EasyPIC v7 is top selling PIC Development Board for 250 Microchip PIC MCUs in DIP packaging. It features USB 2.0 programmer/debugger and over 17 essential modules necessary in development. Board comes w ith PIC18F45K22. [more info]

Featured Compilers mikroC PRO for PIC

3.1 CARACTERSTICAS BSICAS DEL PIC16F887


arquitectura RISC
El microcontrolador cuenta con solo 35 instrucciones diferentes Todas las instrucciones son uni-ciclo excepto por las de ramificacin

256 bytes de memoria EEPROM


Los datos se pueden grabar ms de 1.000.000 veces

368 bytes de memoria RAM Convertidor A/D:


14 canales resolucin de 10 bits Popular PIC m icocontrollers are loved by hobbyists and 8-bit geeks. m ikroC helps you bring your ideas to life easy as never before. [more info]

Frecuencia de operacin 0-20 MHz Oscilador interno de alta precisin


Calibrado de fbrica Rango de frecuencia de 8MHz a 31KHz seleccionado por softw are

3 temporizadores/contadores independientes Temporizador perro guardin Mdulo comparador analgico con


Dos comparadores analgicos Referencia de voltaje fija (0.6V) Referencia de voltaje programable en el chip

Voltaje de la fuente de alimentacin de 2.0V a 5.5V


Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz) 50nA (en modo de espera)

Ahorro de energa en el Modo de suspensin Brown-out Reset (BOR) con opcin para controlar por software 35 pines de entrada/salida
alta corriente de fuente y de drenador para manejo de LED resistencias pull-up programables individualmente por softw are interrupcin al cambiar el estado del pin

Mdulo PWM incorporado Mdulo USART mejorado


Soporta las comunicaciones seriales RS-485, RS-232 y LIN2.0 Auto deteccin de baudios

Puerto Serie Sncrono Maestro (MSSP)


Soporta los modos SPI e I2C

memoria ROM de 8K con tecnologa FLASH


El chip se puede re-programar hasta 100.000 veces

Opcin de programacin serial en el circuito


El chip se puede programar incluso incorporado en el dispositivo destino.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

1/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

DESCRIPCIN DE PINES
La mayora de los pines del microcontrolador PIC16F887 son multipropsito como se muestra en la figura anterior. Por ejemplo, la asignacin RA3/AN3/Vref+/C1IN+ para el quinto pin del microcontrolador indica que ste dispone de las siguientes funciones:

RA3 Tercera entrada/salida digital del puerto A AN3 Tercera entrada analgica Vref+ Referencia positiva de voltaje C1IN+ Entrada positiva del comparador C1
La funcionalidad de los pines presentados anteriormente es muy til puesto que permite un mejor aprovechamiento de los recursos del microcontrolador sin afectar a su funcionamiento. Estas funciones de los pines no se pueden utilizar simultneamente, sin embargo se pueden cambiar en cualquier instante durante el funcionamiento. Las siguientes tablas se refieren al microcontrolador DIP de 40 pines.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

2/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

3/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

4/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

UNIDAD CENTRAL DE PROCESAMIENTO (CPU)


Con el propsito de explicar en forma clara y concisa, sin describir profundamente el funcionamiento de la CPU, vamos a hacer constar que la CPU est fabricada con la tecnologa RISC ya que esto es un factor importante al decidir qu microcontrolador utilizar. RISC es un acrnimo derivado del ingls Reduced Instruction Set Computer, lo que proporciona al PIC16F887 dos grandes ventajas:

La CPU cuenta con slo 35 instrucciones simples. Cabe decir que para poder programar otros microcontroladores en lenguaje ensamblador es necesario saber ms de 200 instrucciones El tiempo de ejecucin es igual para casi todas las instrucciones y tarda 4 ciclos de reloj. La frecuencia del oscilador se estabiliza por un cristal de cuarzo. Las instrucciones de salto y de ramificacin tardan ocho ciclos de reloj en ejecutarse. Esto significa que si la velocidad de operacin del microcontrolador es 20 MHz, el tiempo de ejecucin de cada instruccin ser 200nS, o sea, el programa ejecutar 5millones de instrucciones por segundo!

MEMORIA
El PIC16F887 tiene tres tipos de memoria: ROM, RAM y EEPROM. Como cada una tiene las funciones, caractersticas y organizacin especficas, vamos a presentarlas por separado.

MEMORIA ROM

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

5/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

La memoria ROM se utiliza para guardar permanente el programa que se est ejecutando. Es la razn por la que es frecuentemente llamada memoria de programa. El PIC16F887 tiene 8Kb de memoria ROM (en total 8192 localidades). Como la memoria ROM est fabricada con tecnologa FLASH, su contenido se puede cambiar al proporcionarle un voltaje de programacin especial (13V). No obstante, no es necesario explicarlo en detalles puesto que se realiza automticamente por un programa especial en la PC y un simple dispositivo electrnico denominado programador.

MEMORIA EEPROM
Similar a la memoria de programa, el contenido de memoria EEPROM est permanentemente guardado al apagar la fuente de alimentacin. Sin embargo, a diferencia de la ROM, el contenido de la EEPROM se puede cambiar durante el funcionamiento del microcontrolador. Es la razn por la que esta memoria (256 localidades) es perfecta para guardar permanentemente algunos resultados creados y utilizados durante la ejecucin del programa.

MEMORIA RAM
Es la tercera y la ms compleja parte de la memoria del microcontrolador. En este caso consiste en dos partes: en registros de propsito general y en los registros de funciones especiales (SFR). Todos estos registros se dividen en cuatro bancos de memoria de los que vamos a hablar ms tarde en este captulo. A unque los dos grupos de registros se ponen a cero al apagar la fuente de alimentacin, adems estn fabricados de la misma forma y se comportan de la manera similar, sus funciones no tienen muchas cosas en comn.

REGISTROS DE PROPSITO GENERAL


Los registros de propsito general se utilizan para almacenar los datos temporales y los resultados creados durante el funcionamiento. Por ejemplo, si el programa realiza el conteo (de los productos en una cadena de montaje), es necesario tener un registro que representa lo que en la vida cotidiana llamamos suma. Como el microcontrolador no es nada creativo, es necesario especificar la direccin de un registro de propsito general y asignarle esa funcin. Se debe crear un programa simple para incrementar el valor de

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

6/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

este registro por 1, despus de que cada producto haya pasado por el sensor. Ahora el microcontrolador puede ejecutar el programa ya que sabe qu es y dnde est la suma que se va a incrementar. De manera similar, a cada variable de programa se le debe pre-asignar alguno de los registros de propsito general.

/ *E ne s t as e c u e n c i a ,l av a r i a b l ee ne lr e g i s t r os u ms ea u m e n t ac a d av e zq u es e l l e v eu nu n o( 1 )l g i c oe ne lp i nd ee n t r a d aR B 0 .* / . . . i f( P O R T B . 0=1 )/ /C o m p r o b a rs ie lp i nR B 0e s t au n o s u m + +; . . . . . . / /S ie s t ,e lv a l o rd el av a r i a b l es ea u m e n t ap o r1 / /S in oe s t ,e lp r o g r a m as a l ed el as e n t e n c i ai f

REGISTROS DE FUNCIONES ESPECIALES (SFR)


Los registros de funciones especiales son tambin parte de la memoria RAM. A diferencia de los registros de propsito general, su propsito es predeterminado durante el proceso de fabricacin y no se pueden cambiar. Como los bits estn conectados a los circuitos particulares en el chip (convertidor A/D, mdulo de comunicacin serial, etc), cualquier cambio de su contenido afecta directamente al funcionamiento del microcontrolador o de alguno de los circuitos. Por ejemplo, el registro ADCON0 controla el funcionamiento del convertidor A/D. Al cambiar los bits se determina qu pin del puerto se configurar como la entrada del convertidor, el momento del inicio de la conversin as como la velocidad de la conversin. Otra caracterstica de estas localidades de memoria es que tienen nombres (tanto los registros como sus bits), lo que simplifica considerablemente el proceso de escribir un programa. Como el lenguaje de programacin de alto nivel puede utilizar la lista de todos los registros con sus direcciones exactas, basta con especificar el nombre de registro para leer o cambiar su contenido.

/ /E ne s t as e c u e n c i a ,e lc o n t e n i d od el o sr e g i s t r o sT R I S CyP O R T Cs e r m o d i f i c a d o . . . T R I S C=0 x 0 0 / /u nc e r ol g i c o( 0 )s ee s c r i b ee ne lr e g i s t r oT R I S C( t o d o s / /l o sp i n e sd e lp u e r t oP O R T Cs ec o n f i g u r a nc o m os a l i d a s ) P O R T C=0 b 0 1 1 0 0 0 1 1 / /c a m b i od ee s t a d ol g i c od et o d o sl o sp i n e sd e lp u e r t oP O R T C . . .

BANCOS DE LA MEMORIA RAM


La memoria RAM est dividida en cuatro bancos. Antes de acceder a un registro al escribir un programa (para leer o cambiar su contenido), es necesario seleccionar el banco que contiene ese registro. Ms tarde vamos a tratar dos bits del registro STATUS utilizados para seleccin del banco. Para simplificar el funcionamiento, los SFR utilizados con ms frecuencia tienen la misma direccin en todos los bancos, lo que permite accederlos con facilidad.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

7/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Trabajar con bancos puede ser difcil slo si se escribe un programa en lenguaje ensamblador. Al utilizar el lenguaje de programacin de alto nivel como es C y el compilador como es mikroC PRO for PIC, basta con escribir el nombre del registro. A partir de esa informacin, el compilador selecciona el banco necesario. Las instrucciones apropiadas para la seleccin del banco sern incorporadas en el cdigo durante el proceso de la compilacin. Hasta ahora usted ha utilizado slo el lenguaje ensamblador y esta es la primera vez que utiliza el compilador C, verdad? Es una noticia maravillosa, no lo cree?

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

8/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

9/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

10/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

PILA
Una parte de la RAM utilizada como pila consiste de ocho registros de 13 bits. Antes de que el microcontrolador se ponga a ejecutar una subrutina (instruccin CALL) o al ocurrir una interrupcin, la direccin de la primera siguiente instruccin en ser ejecutada se coloca en la pila (se apila), o sea, en uno de los registros. Gracias a eso, despus de ejecutarse una subrutina o una interrupcin, el microcontrolador sabe dnde continuar con la ejecucin de programa. Esta direccin se borra (se desapila) despus de volver al programa, ya que no es necesario guardarla, disponiendo automticamente esas localidades de la pila para un uso futuro. Cabe tener en mente que el dato se apila circularmente. Esto significa que despus de que se apile ocho veces, la novena vez se sobrescribe el valor que se almacen al apilar el dato por primera vez. La dcima vez que se apile, se sobrescribe el valor que se almacen al apilar el dato por segunda vez etc. Datos sobrescritos de esta manera no se pueden recuperar. Adems, el programador no puede acceder a estos registros para hacer escritura/lectura. No hay ningn bit de estado para indicar el estado de desbordamiento o subdesbordamiento de pila. Por esta razn hay que tener un especial cuidado al escribir un programa. Vamos a hacerlo en mikroC...

/ *A le n t r a roa ls a l i rd el ai n s t r u c c i ne ne n s a m b l a d o rd e lp r o g r a m a ,e lc o m p i l a d o r n ov aag u a r d a rl o sd a t o se ne lb a n c od el aR A Ma c t u a l m e n t ea c t i v o .E s t os i g n i f i c a q u ee ne s t as e c c i nd ep r o g r a m al as e l e c c i nd eb a n c od e p e n d ed el o sr e g i s t r o sS F R u t i l i z a d o s .A lv o l v e ral as e c c i nd ep r o g r a m ae s c r i t oe nC ,l o sb i t sd ec o n t r o l R P 0yR P 1d e b e nd e v o l v e re le s t a d oq u et e n a na n t e sd el ae j e c u c i nd e lc d i g oe n l e n g u a j ee n s a m b l a d o r .E ne s t ee j e m p l o ,e lp r o b l e m as es o l u c i o n aa lu t i l i z a rl a v a r i a b l ea u x i l i a rs a v e B a n kq u eg u a r d ae le s t a d od ee s t o sd o sb i t s * / s a v e B a n k=S T A T U S&0 b 0 1 1 0 0 0 0 0 ;/ /G u a r d a re le s t a d od el o sb i t sR P 0yR P 1 / /( b i t s5y6d e lr e g i s t r oS T A T U S ) a s m{ . . . . . . . . . } / /I n i c i od el as e c u e n c i ae ne n s a m b l a d o r / /C d i g oe n s a m b l a d o r / /F i n a ld el as e c u e n c i ae ne n s a m b l a d o r

S T A T U S& =0 b 1 0 0 1 1 1 1 1 ;/ /B i t sR P 0yR P 1d e v u e l v e ns ue s t a d oo r i g i n a l S T A T U S| =s a v e B a n k ; . . . . . .

SISTEMA DE INTERRUPCIONES
Al aparecer una peticin de interrupcin lo primero que hace el microcontrolador es ejecutar la instruccin actual despus de que se detiene el proceso de ejecucin de programa. Como resultado, la direccin de memoria de programa actual se apila automticamente y la direccin por defecto (predefinida por el fabricante) se escribe en el contador de programa. La localidad en la que el programa contina con la ejecucin se le denomina vector de interrupcin. En el caso del microcontrolador PIC16F887 esta direccin es 0x0004h. Como se muestra en la siguiente figura la localidad que contiene el vector de interrupcin se omite durante la ejecucin de programa regular. Una parte de programa que se ejecutar al hacer una peticin de interrupcin se le denomina rutina de interrupcin. Su primera instruccin se encuentra en el vector de interrupcin. Cunto tiempo tardar en ejecutar esta subrutina y cmo ser depende de la destreza del programador as como de la fuente de interrupcin. Algunos microcontroladores tienen ms de un vector de interrupcin (cada peticin de interrupcin tiene su vector), pero en este caso slo hay uno. En consecuencia, la primera parte da la rutina de interrupcin consiste en detectar la fuente de interrupcin. Por fin, al reconocer la fuente de interrupcin y al terminar de ejecutar la rutina de interrupcin el microcontrolador alcanza la instruccin R E T F I E , toma la direccin de la pila y contina con la ejecucin de programa desde donde se interrumpi.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

11/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

mikroC reconoce una rutina de interrupcin que se ejecutar como la funcin v o i di n t e r r u p t ( ) . El cuerpo de la funcin, o sea, rutina de interrupcin, debe ser escrito por el usuario.

v o i di n t e r r u p t ( ){/ /I n t e r r u p tr o u t i n e c n t + +; } / /I n t e r r u p tc a u s e sv a r i a b l ec n tt ob ei n c r e m e n t e db y1

Cmo utilizar los registros SFR


Supongamos que usted ha comprado ya un microcontrolador y que tiene una buena idea de cmo utilizarlo... La lista de los registros SFR as como de sus bits es muy larga. Cada uno controla algn proceso. En general, parece como una gran tabla de control con un gran nmero de instrumentos e interruptores. Ahora est preocupado de cmo conseguir aprender acerca de todos ellos? Es poco probable, pero no se preocupe, Usted no tiene que hacerlo! Los microcontroladores son tan potentes que se parecen a los supermercados: ofrecen tantas cosas a bajos precios y a usted solo le toca elegir las que necesita. Por eso, seleccione el campo en que est interesado y examine slo lo que necesita. Cuando entienda completamente el funcionamiento de hardware, examine los registros SFR encargados de controlarlo (normalmente son unos pocos). Como todos los dispositivos tienen un tipo de sistema de control el microcontrolador tiene sus "palancas" con las que usted deb e estar familiarizado para ser capaz de utilizarlos correctamente. Por supuesto, estamos hab lando de los registros SFR desde los que el proceso de programacin se inicia y en los que el mismo termina.

3.2 PRINCIPALES REGISTROS SFR


El siguiente texto describe los principales registros SFR del microcontrolador PIC16F887. Los bits de cada registro controlan los circuitos diferentes dentro del chip, as que no es posible clasificarlos en grupos especiales. Por esta razn, se describen junto con los procesos que controlan.

Registro STATUS

El registro STATUS contiene: el estado aritmtico de datos en el registro W, el estado RESET, los bits para seleccionar el banco para los datos de la memoria.

IRP - Registro de seleccin de Banco (usado para direccionamiento indirecto)


1 - Bancos 0 y 1 son activos (localidades de memoria 00h-FFh) 0 - Bancos 2 y 3 son activos (localidades de memoria 100h-1FFh)

RP1,RP0 - Registro de seleccin de banco (usado para direccionamiento directo).


RP 1 0 0 1 1 RP 0 0 1 0 1 BA NC O A C T I V O Banco 0 Banco 1 Banco 2 Banco 3

TO - Time-out bit (bit de salida del temporizador perro guardin)


1 - Despus de encender el microcontrolador, despus de ejecutarse la instruccin C L R W D Tque reinicia al WDT (temporizador perro guardin) o despus de ejecutarse la instruccin SLEEP que pone al microcontrolador en el modo de bajo consumo. 0 - Despus de acabarse el tiempo del WDT.

PD - Power-down bit (bit de apagado)


1 - Despus de encender el microcontrolador, despus de ejecutar la instruccin C L R W D Tque reinicia al WDT. 0 - Despus de ejecutarse la instruccin S L E E Pque pone al microcontrolador en el modo de bajo consumo.

Z - Zero bit (bit cero)


1 - El resultado de una operacin lgica o aritmtica es 0.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

12/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


0 - El resultado de una operacin lgica o aritmtica es distinto de 0.

DC - Digit carry/borrow bit (bit de acarreo/prstamo de dgito) cambia al sumar o al restar si ocurre un "desbordamiento" o un "prstamo" en el resultado.
1 - Hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado. 0 - No hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.

C - Carry/Borrow bit (bit de acarreo/prstamo) cambia al sumar o al restar si ocurre un "desbordamiento" o un "prstamo" en el resultado, o sea si el resultado es mayor de 255 o menor de 0.
1 - Ocurri acarreo en el bit ms significativo (MSB) del resultado. 0 - No ocurri acarreo en el bit ms significativo (MSB) del resultado.

Registro OPTION_REG

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Temporizador 0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up en el puerto PORTB.

RBPU - Port B Pull up Enable bit (resistencia Pull Up Puerto B)


1 - Desactivadas. 0 - Activadas.

INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin externa)
1 - Interrupcin por flanco ascendente en el RB0/INT. 0 - Interrupcin por flanco descendente en el RB0/INT.

T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj para el Timer0)
1 - Pulsos introducidos a travs del TOCKI (contador). 0 - Pulsos de reloj internos Fosc/4 (temporizador).

T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco en TOCKI) selecciona el flanco (ascendente o descendente) contado por el temporizador Timer0 por el pin RA4/T0CKI.
1 - Incrementa en flanco descendente en el pin TOCKI. 0 - Incrementa en flanco ascendente en el pinTOCKI.

PSA - Prescaler Assignment bit asigna el pre-escalador (hay slo uno) al temporizador o al WDT.
1 - Pre - escalador se le asigna al WDT. 0 - Pre - escalador se le asigna al temporizador Timer0.

PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia)

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

13/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

El valor del divisor de frecuencia se selecciona al combinar estos tres bits. Como se muestra en la siguiente tabla, el valor del divisor de frecuencia se le asigna al temporizador (Timer0) o al temporizador perro guardin (WDT).
PS2 0 0 0 0 1 1 1 PS1 0 0 1 1 0 1 1 PS0 0 1 0 1 1 0 1 T M R0 1:2 1:4 1:8 1:16 1:64 1:128 1:256 W DT 1:1 1:2 1:4 1:8 1:32 1:64 1:128

Para conseguir el valor del divisor de frecuencia 1:1 cuando el temporizador Timer0 cuenta pulsos, el preescalador debe ser asignado al WDT. En consecuencia, el temporizador Timer0 no utiliza el pre-escalador, sino que cuenta directamente los pulsos generados por el oscilador, lo que era el objetivo. Vamos a hacerlo en mikroC...

/ *S ie lc o m a n d oC L R W D Tn os ee j e c u t a , e lW D Tv aar e i n i c i a ra lm i c r o c o n t r o l a d o rc a d a3 2 . 7 6 8u S( f = 4M H z )* / v o i dm a i n ( ){ O P T I O N _ R E G=0 b 0 0 0 0 1 1 1 1 ;/ /P r e e s c a l a d o re s t a s i g n a d oa lW D T( 1 : 1 2 8 ) a s mC L R W D T ;/ /C o m a n d oe ne n s a m b l a d o rp a r ar e i n i c i a ra lW D T . . . . . . / /E lt i e m p oe n t r ee s t o sd o sc o m a n d o sC L R W D Tn od e b ee x c e d e r3 2 . 7 6 8m i c r o s e g u n d o s( 1 2 8 x 2 5 6 ) . . . a s mC L R W D T ;/ /C o m a n d oe ne n s a m b l a d o rp a r ar e i n i c i a ra lW D T . . . . . . / /E lt i e m p oe n t r ee s t o sd o sc o m a n d o sC L R W D Tn od e b ee x c e d e r3 2 . 7 6 8m i c r o s e g u n d o s( 1 2 8 x 2 5 6 ) . . . a s mC L R W D T ;/ /C o m a n d oe ne n s a m b l a d o rp a r ar e i n i c i a ra lW D T }

REGISTROS DEL SISTEMA DE INTERRUPCIN


Al llegar la peticin de interrupcin, no significa que una interrupcin ocurrir automticamente, puesto que debe ser habilitada por el usuario (por el programa) tambin. Por esta razn, hay bits especiales utilizados para habilitar o deshabilitar interrupciones. Es fcil de reconocerlos por las letras IE contenidas en sus nombres (Interrupt Enable - Interrupcin habilitada). Adems, cada interrupcin se asocia con otro bit denominado bandera que indica que una peticin de interrupcin ha llegado sin verificar si est habilitada. Asimismo, se reconocen con facilidad por las dos ltimas letras contenidas en sus nombres - IF (Interrupt Flag - Bandera de interrupcin).

Como hemos visto, toda la idea es muy simple y eficiente. Al llegar la peticin de interrupcin, primero el bit de bandera se pone a uno. Si el bit IE apropiado est a cero (0), esta condicin ser ignorada completamente. De lo contrario, ocurre una interrupcin. Si varias fuentes de interrupcin estn habilitadas, es necesario detectar la activa antes de que la rutina de interrupcin se ponga a ejecutar. La deteccin de la fuente se realiza al comprobar los bits de las banderas. Cabe destacar que los bits de cada bandera no se ponen a cero automticamente, sino por el software, mientras que la ejecucin de la rutina de interrupcin contina ejecutndose. Si no hacemos caso a este detalle, ocurrir otra interrupcin inmediatamente despus de volver al programa principal, aunque no hay ms peticiones de ejecucin. Simplemente, la bandera, as como el bit IE, se quedan en uno. Todas las fuentes de interrupcin tpicas para el microcontrolador PIC16F887 se muestran en la siguiente pgina. Fjese en lo siguiente: El bit GIE habilita/deshabilita simultneamente las interrupciones no enmascaradas. El PEIE bit habilita/deshabilita las interrupciones no enmascaradas de perifricos. Esto no se refiere al temporizador Timer0 y a las fuentes de interrupcin del puerto PORTB. Para habilitar una interrupcin causada por el cambio del estado lgico en el puerto PORTB, es necesario habilitarla para cada bit por separado. En este caso, los bits del registro IOCB se comportan como los bits IE de control.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

14/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Registro INTCON
El registro INTCON contiene varios bits de habilitacin y de bandera para el desbordamiento en el registro TMR0, e interrupciones por el cambio del estado en el puerto PORTB y las interrupciones externas en el pin INT.

GIE - Global Interrupt Enable bit - (bit de habilitacin de interrupciones globales) controla simultneamente todas las fuentes de interrupciones posibles.
1 - Habilita las interrupciones no enmascaradas. 0 - Deshabilita las interrupciones no enmascaradas.

PEIE - Peripheral Interrupt Enable bit (bit de habilitacin de interrupciones perifricas) es similar al bit GIE, sin embargo controla interrupciones habilitadas por los perifricos. Eso significa que no influye en interrupciones causadas por el temporizador Timer0 o por el cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT.
1 - Habilita las interrupciones perifricas no enmascaradas. 0 - Deshabilita las interrupciones perifricas no enmascaradas.

T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitacin de interrupciones por el desbordamiento del temporizador Timer0) controla interrupciones causadas por el desbordamiento del Timer0.
1 - Habilita interrupciones por Timer0. 0 - Deshabilita interrupciones por Timer0.

INTE - RB0/INT External Interrupt Enable bit (bit de habilitacin de la interrupcin externa en RB0) controla interrupciones causadas por el cambio del estado lgico en el pin de entrada RB0/INT (interrupcin externa).
1 - Habilita interrupciones externas INT. 0 - Deshabilita interrupciones externas INT.

RBIE - RB Port Change Interrupt Enable bit (bit de habilitacin de interrupciones por cambios en el puerto PORTB). Cuando se configuran como entradas, los pines en el puerto PORTB pueden causar una interrupcin al cambiar el estado lgico (no importa si se produce bajada o subida de tensin, lo que importa es que se produce un cambio). Este bit determina si una interrupcin va a ocurrir.
1 - Habilita interrupciones por cambio en el puerto PORTB. 0 - Deshabilita interrupciones por cambio en el puerto PORTB.

T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupcin por el desbor damiento del Timer0) detecta el desbordamiento en el registro del temporizador Timer0, o sea el contador se pone a cero.
1 - En el registro del Timer0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por softw are). 0 - En el registro del Timer0 no ha ocurrido desbordamiento.

INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupcin externa en INT) detecta el cambio en el estado lgico en el pin INT.
1 - Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0 por softw are) 0 - No ha ocurrido una interrupcin externa por INT.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

15/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupcin por cambio en el puerto RB) detecta cualquier cambio del estado lgico de alguno de los pines de entrada en el puerto PORTB.
1 - Al menos uno de los pines de E/S de propsito general en el puerto PORTB ha cambido de valor. Despus de leer el puerto PORTB, el bit RBIF debe volverse a 0 por softw are). 0 - Ninguno de los pines de E/S de propsito general en el puerto PORTB ha cambiado de valor.

Vamos a hacerlo en mikroC...

/ /E lp i nP O R T B . 4s ec o n f i g u r ac o m ou n ae n t r a d as e n s i b l ea lc a m b i od e le s t a d ol g i c o . v o i di n i t M a i n ( ){ A N S E L=A N S E L H=0 ; / /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s P O R T B=0 ; / /T o d o sl o sp i n e sd e lp u e r t oP O R T Bs ep o n e nac e r o / /c o n f i g u r a nc o m os a l i d a s R B I E=1 ; I O C B 4=1 ; G I E=1 ; . . . . . . . . . / /S eh a b i l i t a nl a si n t e r r u p c i o n e sp o re lc a m b i oe ne lp u e r t oP O R T B / /S eh a b i l i t al ai n t e r r u p c i np o re lc a m b i oe ne lp i n4e ne l / /p u e r t oP O R T B / /S eh a b i l i t al ai n t e r r u p c i ng l o b a l / /D e s d ee s t ep u n t o ,s ep r o d u c eu n ai n t e r r u p c i nc o nc u a l q u i e rc a m b i o / /d e le s t a d ol g i c oe ne lp i nP O R T B . 4 T R I S B=0 b 0 0 0 1 0 0 0 0 ; / /T o d o sl o sp i n e sd e lp u e r t oP O R T Bm e n o sP O R T B . 4s e

Registro PIE1
El registro PIE1 contiene los bits de habilitacin de interrupciones perifricas.

ADIE - A/D Converter Interrupt Enable bit (bit de habilitacin de interrupciones del convertidor A/D).
1 - Habilita la interrupcin ADC. 0 - Deshabilita la interrupcin ADC.

RCIE - EUSART Receive Interrupt Enable bit (bit de habilitacin de interrupciones de recepcin del EUSART).
1 - Habilita la interrupcin de recepcin del EUSART. 0 - Deshabilita la interrupcin de recepcin del EUSART.

TXIE - EUSART Transmit Interrupt Enable bit (bit de habilitacin de interrupciones de transmisin del EUSART).
1 - Habilita la interrupcin de transmisin del EUSART. 0 - Deshabilita la interrupcin de transmisin del EUSART.

SSPIE - Master Synchronous Serial Port (MSSP) Interrupt Enable bit - (bit de habilitacin de la interrupcin del puerto serie sncrono maestro (MSSP) habilita generar una peticin de interrupcin despus de cada transmisin de datos por el mdulo de comunicacin serie sncrona (modo SPI o I2C).
1 - Habilita la interrupcin del MSSP. 0 - Deshabilita la interrupcin del MSSP.

CCP1IE - CCP1 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 1 de Comparacin/Captura/PWM - CCP1) permite generar una peticin de interrupcin en el mdulo CCP1 utilizado para procesamiento de la seal PWM.
1 - Habilita la interrupcin CCP1. 0 - Deshabilita la interrupcin CCP1.

TMR2IE - TMR2 to PR2 Match Interrupt Enable bit (bit de habilitacin de la interrupcin de igualdad entre TMR2 y PR2)
1 - Habilita la interrupcin de igualdad entre TMR2 y PR2. 0 - Deshabilita la interrupcin de igualdad entre TMR2 y PR2.

TMR1IE - TMR1 Overflow Interrupt Enable bit (bit de habilitacin de la interrupcin de desbordamiento del temporizador Timer1) habilita generar una peticin de interrupcin despus de cada desbordamiento en el registro del temporizador Timer1, o sea el contador se pone a cero.
1 - Habilita la interrupcin de desbordamiento del temporizador Timer1. 0 - Deshabilita la interrupcin de desbordamiento del temporizador Timer1.

Vamos a hecerlo en mikroC...

/ *S ep r o d u c eu n ai n t e r r u p c i nc o nc a d ad e s b o r d a m i e n t oe ne lr e g i s t r od e lt e m p o r i z a d o r 1 q u ec o n s i s t ee nT M R 1 HyT M R 1 L .E nc a d ar u t i n ad ei n t e r r u c p i o n e s ,l av a r i a b l e c n ts e r i n c r e m e n t a d ap o r1* /

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

16/82

4/2/2014
u n s i g n e ds h o r tc n t ; v o i di n t e r r u p t ( ) c n t + +; P I R 1 . T M R 1 I F=0 ; T M R 1 H=0 x 8 0 ; T M R 1 L=0 x 0 0 ; } v o i dm a i n ( ){ A N S E L=A N S E L H=0 ; T 1 C O N=1 ; P I R 1 . T M R 1 I F=0 ; T M R 1 H=0 x 8 0 ; T M R 1 L=0 x 0 0 ; P I E 1 . T M R 1 I E=1 ; c n t=0 ; I N T C O N=0 x C 0 ; . . .

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


/ /D e f i n i rl av a r i a b l ec n t / /I n i c i od el ar u t i n ad ei n t e r r u p c i n / /A lp r o d u c i r s eu n ai n t e r r u p c i n ,l ac n ts e / /i n c r e m e n t ap o r1 / /E lb i tT M R 1 I Fs er e i n i c i a / /Al o sr e g i s t r o sd e lt e m p o r i z a d o rT M R 1 HyT M R 1 Ls el e s / /d e v u e l v e ns u sv a l o r e si n i c i a l e s / /F i n a ld el ar u t i n ad ei n t e r r u p c i n

/ /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s / /E n c e n d e re lt e m p o r i z a d o rT i m e r / /E lb i tT M R 1 I Fs ep o n eac e r o / /E s t a b l e c e rl o sv a l o r e si n i c i a l e sp a r ae lt e m p o r i z a d o rT i m e r 1 / /H a b i l i t a rl ai n t e r r u p c i na lp r o d u c i r s eu n / /d e s b o r d a m i e n t oe ne lT i m e r 1 / /R e i n i c i a rl av a r i a b l ec n t / /H a b i l i t a rl ai n t e r r u p c i n( l o sb i t sG I EyP E I E )

Registro PIE2
El registro PIE2 tambin contiene varios bits de habilitacin de interrupciones.

OSFIE - Oscillator Fail Interrupt Enable bit (bit de habilitacin de la interrupcin de fallo en el oscilador)
1 - Habilita la interrupcin de fallo en el oscilador. 0 - Deshabilita la interrupcin de fallo en el oscilador.

C2IE - Comparator C2 Interrupt Enable bit (bit de habilitacin de la interrupcin del comparador C2)
1 - Habilita la interrupcin del comparador C2. 0 - Deshabilita la interrupcin del comparador C2.

C1IE - Comparator C1 Interrupt Enable bit (bit de habilitacin de la interupcin del comparador C1)
1 - Habilita la interrupcin del comparador C1 0 - Deshabilita la interrupcin del comparador C1.

EEIE - EEPROM Write Operation Interrupt Enable bit (bit de habilitacin de la interrupcin de escritura en la memoria EEPROM)
1 - Habilita la interrupcin de escritura en la memoria EEPROM. 0 - Deshabilita la interrupcin de escritura en la memoria EEPROM.

BCLIE - Bus Collision Interrupt Enable bit (bit de habilitacin de la interrupcin de colisin de bus)
1 - Habilita la interrupcin de colisin de bus. 0 - Deshabilita la interrupcin de colisin de bus.

ULPWUIE - Ultra Low-Power Wake-up Interrupt Enable bit (bit de habilitacin de la interrupcin para salir del modo de ultra bajo consumo - la reactivacin)
1 - Habilita la interrupcin para salir del modo de ultra bajo consumo. 0 - Deshabilita la interrupcin para salir del modo de ultra bajo consumo.

CCP2IE - CCP2 Interrupt Enable bit (bit de habilitacin de la interrupcin del mdulo 2 de Comparacin/Captura/PWM (CCP2)
1 - Habilita la interrupcin del CCP2. 0 - Deshabilita la interrupcin del CCP2.

Vamos a hacerlo en mikroC...

/ *E lc o m p a r a d o rC 2s ec o n f i g u r ap a r au t i l i z a rl o sp i n e sR A 0yR A 2c o m oe n t r a d a s .A lp r o d u c i r s e u nc a m b i oe nl as a l i d ad e lc o m p a r a d o r ,e lp i nd es a l i d aP O R T B . 1c a m b i ae le s t a d ol g i c oe nl a r u t i n ad ei n t e r r u p c i n . * / v o i di n t e r r u p t ( ){ / /I n i c i od el ar u t i n ad ei n t e r r u p c i n / /p i nP O R T B . 1 P I R 2 . C 2 I F=0 ; } v o i dm a i n ( ){ T R I S B=0 ; / /T o d o sl o sp i n e sd e lp u e r t oP O R T Bs ec o n f i g u r a n / /B i td eb a n d e r ad ei n t e r r u p c i nC 2 I Fs ep o n eac e r o / /F i n a ld el ar u t i n ad ei n t e r r u p c i n

P O R T B . F 1=~ P O R T B . F 1; / /L ai n t e r r u p c i ni n v e r t i r e le s t a d ol g i c od e l

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

17/82

4/2/2014
P O R T B . F 1=1 ; A N S E L=0 b 0 0 0 0 0 1 0 1 ; ; A N S E L H=0 ;

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


/ /c o m os a l i d a s / /E lp i nP O R T B . 1s ep o n eau n o / /L o sp i n e sR A 0 / C 1 2 I N 0 -yR A 2 / C 2 I N +s o nl a s / /e n t r a d a sa n a l g i c a s / /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s / /e n t r a d ai n v e r t i d ad e lC 2

C M 2 C O N 0 . C 2 C H 0=C M 2 C O N 0 . C 2 C H 1=0 ;/ /E lp i nR A 0s es e l e c c i o n ap a r as e ru n a P I E 2 . C 2 I E=1 ; C O N . G I E=1 ; C M 2 C O N 0 . C 2 O N=1 ; . . . . . . / /H a b i l i t al ai n t e r r u p c i nd e lc o m p a r a d o rC 2 I N T / /I n t e r r u p c i ng l o b a le s t h a b i l i t a d a / /C o m p a r a d o rC 2e s t h a b i l i t a d o

Registro PIR1
El registro PIR1 contiene los bits de banderas de interrupcin.

ADIF - A/D Converter Interrupt Flag bit (bit de bandera de la interrupcin del convertidor A/D)
1 - Se ha completado una conversin A/D (el bit debe volverse a 0 por softw are) 0 - No se ha completado una conversin A/D o no ha empezado

RCIF - EUSART Receive Interrupt Flag bit (bit de bandera de la interrupcin de recepcin del EUSART)
1 - El bfer de recepcin del EUSART est lleno. El bit se pone a cero al leer el registro RCREG. 0 - El bfer de recepcin del EUSART no est lleno.

TXIF - EUSART Transmit Interrupt Flag bit (bit de la interrupcin de transmisin del EUSART)
1 - El bfer de transmisin del EUSART est vaco. El bit se pone a cero al esribir un dato en el registro TXREG. 0 - El bfer de transmisin del EUSART est lleno.

SSPIF - Master Synchronous Serial Port (MSSP) Interrupt Flag bit (bit de bandera de la interrupcin de puerto serie sncrono maestro)
1 - Se ha cumplido la condicin de ocurrir una interrupcin del MSSP al transmitir/ recibir los datos. Difieren dependiendo del modo de operacin del MSSP (SPI o I2C). El bit debe ponerse a cero por softw are antes de volver de la rutina de servicio de interrupciones) 0 - No se ha cumplido ninguna condicin de ocurrir una interrupcin del MSSP.

CCP1IF - CCP1 Interrupt Flag bit (bit de bandera de la interrupcin del mdulo 1 de Comparacin/Captura/PWM (CCP1).
1 - Se ha cumplido la condicin de la interrupcin del CCP1 (CCP1 es una unidad para captar, comparar y generar una seal PWM). Dependiendo del modo de operacin (modo captura o modo comparacin), se produce una captura o la igualdad en la comparacin. En ambos casos, el bit debe volverse a cero por softw are. El bit no se utiliza en el modo PWM. 0 - No se ha cumplido la condicin de la interrupcin del CCP1.

TMR2IF - Timer2 to PR2 Interrupt Flag bit (bit de bandera de la interrupcin de igual dad entre el temporizador Timer2 y el registro PR2)
1 - Se ha producido igualdad con el valor del TMR2 (registro de 8 bits del temporizador) y el valor del PR2. El bit debe ponerse a cero por softw are antes de volver de la rutina de servicio de interrupciones). 0 - No se ha producido igualdad con el valor del TMR2 y el valor del PR2.

TMR1IF - Timer1 Overflow Interrupt Flag bit (bit de bandera de la interrupcin de desbordamiento del temporizador Timer1)
1 - Se ha producido desbordamiento del Timer1. El bit debe ponerse a cero por softw are. 0 - No se ha producido desbordamiento del Timer1.

Registro PIR2
El registro PIR2 contiene los bits de banderas da la interrupcin.

OSFIF - Oscillator Fail Interrupt Flag bit (bit de bandera de la interrupcin de fallo en el oscilador)
1 - Se ha producido un fallo en el oscilador del sistema. La entrada de reloj ha sido conmutada al oscilador interno INTOSC. El bit debe ponerse a cero por softw are. 0 - El oscilador del sistema funciona correctamente.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

18/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


C2IF - Comparator C2 Interrupt Flag bit (bit de bandera de la interrupcin del comparador C2)
1 - La salida del comparador analgico C2 ha sido cambiada (el bit C2OUT). El bit debe ponerse a cero por softw are. 0 - La salida del comparador analgico C2 no ha sido cambiada.

C1IF - Comparator C1 Interrupt Flag bit (bit de bandera de la interrupcin del comparador C1)
1 - La salida del comparador analgico C1 ha sido cambiada (el bit C1OUT). El bit debe ponerse a cero por softw are. 0 - La salida del comparador analgico C1 no ha sido cambiada.

EEIF - EE Write Operation Interrupt Flag bit (bit de bandera de la interrupcin de la operacin de escritura en la memoria EEPROM)
1 - La operacin de escritura en la memoria EEPROM se ha completado. El bit debe ponerse a cero por softw are. 0 - La operacin de escritura en la memoria EEPROM no se ha completado o todava no se ha iniciado.

BCLIF - Bus Collision Interrupt Flag bit (bit de bandera de la interrupcin de colisin de bus en el MSSP)
1 - Se ha producido una colisin de bus en el MSSP al ser configurado para el modo maestro I2C. El bit debe ponerse a cero por softw are. 0 - No se ha producido colisin de bus en el MSSP.

ULPWUIF - Ultra Low-power Wake-up Interrupt Flag bit (bit de bandera de la interrupcin para salir del modo de ultra bajo consumo - la reactivacin)
1 - Se ha cumplido la condicin de salir del modo de ultra bajo consumo. El bit debe ponerse a cero por softw are. 0 - No se ha cumplido la condicin de salir del modo de ultra bajo consumo.

CCP2IF - CCP2 Interrupt Flag bit (bit de la interrupcin del mdulo 2 de Comparacin/Captura/PWM - CCP2)
1 - Se ha cumplido la condicin de la interrupcin del CCP2 (CCP2 es una unidad para captar, comparar y generar una seal PWM). Dependiendo del modo de operacin (modo captura o modo comparacin), se produce una captura o la igualdad en la comparacin. En ambos casos, el bit debe volverse a cero por softw are. El bit no se utiliza en el modo PWM. 0 - No se ha cumplido la condicin de la interrupcin del CCP2.

Vamos a hacerlo en mikroC...

/ /S e c u e n c i ad ea c t i v a c i nd e lm d u l oU L P W U v o i dm a i n ( ){ P O R T A . F 0=1 ; A N S E L=A N S E L H=0 ; T R I S A=0 ; D e l a y _ m s ( 1 ) ; P I R 2 . U L P W U I F=0 ; P C O N . U L P W U E=1 ; T R I S A . F 0=1 ; P I E 2 . U L P W U I E=1 ; a s mS L E E P ; . . . . . . / /P i nP O R T A . 0s ep o n eau n o / /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s / /L o sp i n e sd e lp u e r t oP O R T As ec o n f i g u r a nc o m os a l i d a s / /C a r g a re lc a p a c i t o r / /B a n d e r aU L P W U I Fs ep o n eac e r o / /H a b i l i t a re lf u n c i o n a m i e n t od e lm d u l oU L P W U / /P O R T A . 0s ec o n f i g u r ac o m oe n t r a d a / /H a b i l i t a rl ai n t e r r u p c i np o re lm d u l oU L P W U / /P a s a ra lm o d od eb a j oc o n s u m o

I N T C O N . G I E=I N T C O N . P E I E=1 ;/ /H a b i l i t a rt o d a sl a si n t e r r u p c i o n e s

Registro PCON
El registro PCON contiene solamente dos bits de banderas utilizados para diferenciar entre un Power-on reset (POR), un Brown-out reset (BOR), un reinicio por el temporizador perro guardin (WDT) y un reinicio externo por el pin MCLR.

ULPWUE - Ultra Low-Power Wake-up Enable bit (bit de habilitacin para salir del modo de ultra bajo consumo - la reactivacin)
1 - Se habilita salir del modo de ultra bajo consumo. 0 - No se habilita salir del modo de ultra bajo consumo.

SBOREN - Software BOR Enable bit (bit de habilitacin del BOR por software)
1 - Se habilita Brow n-out reset. 0 - Se deshabilita Brow n-out reset.

POR - Power-on Reset Status bit (bit de estado Power - on reset)


1 - No se ha producido Pow er - on reset. 0 - Se ha producido Pow er - on reset. El bit debe ponerse a uno por softw are despus de que se haya producido un Pow er - on reset.

BOR - Brown-out Reset Status bit (bit de estado Brown - out reset)
1 - No se ha producido Brow n - out reset. 0 - Se ha producido Brow n - out reset. El bit debe ponerse a uno por softw are despus de que se haya producido Brow n - out reset.

REGISTROS PCL Y PCLATH


La memoria de programa del PIC16F887 es de 8K y tiene 8192 localidades para el almacenamiento de programa. Por esta razn, el

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

19/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

contador de programa debe de ser de 13 bits de anchura (213 = 8192). Para habilitar el acceso a una localidad de memoria de programa durante el funcionamiento del microcontrolador , es necesario acceder a su direccin por medio de los registros SFR. Como todos los registros SFR son de 8 bits de anchura, este registro de direccionamiento es creado artificialmente al dividir los 13 bits en dos registros independientes, PCLATH y PCL. Si la ejecucin de programa no afecta al contador de programa, el valor de este registro va incrementndose automtica y constantemente: +1, +1, +1, +1... De esta manera, el programa se ejecuta como est escrito - instruccin a instruccin, seguido por un incremento de direccin constante.

Si el contador de programa ha sido cambiado por software, debe tomar en cuenta lo siguiente para evitar problemas:

Los ocho bits inferiores (el byte inferior) del registro PCL son de lectura/escritura, mientras que los cinco bits superiores del registro PCLATH son de slo escritura. El registro PCLATH se borra con cada reinicio. En el lenguaje ensamblador, el valor del contador de programa est marcado con PCL y se refiere slo a los ocho bits. Usted debe tener cuidado al utilizar la instruccin " A D D W FP C L " . Esto es una instruccin de salto que especifica la localidad destino al aadir un nmero a la direccin actual. Se utiliza con frecuencia para saltar a la tabla de bsqueda o a la tabla de ramificacin de programa y leerlas. Un problema surge si la direccin actual es de tal tamao que al sumar se produce un cambio en un bit que pertenece al byte superior del registro PCLATH. La ejecucin de una instruccin sobre el registro PCL causa simultneamente la sustitucin de los bits del contador de programa por los contenidos en el registro PCLATH. De todos modos, el registro PCL puede acceder slo a 8 bits inferiores del resultado de la instruccin, pues el siguiente salto ser completamente incorrecto. La solucin a este problema es poner estas instrucciones en las direcciones que terminan en xx00h. De esta manera se habilitan los saltos de programa hasta 255 localidades. Si se ejecutan los saltos ms largos por medio de esta instruccin, el registro PCLATH debe ser incrementado por 1 cada vez que se produce desbordamiento en el registro PCL. Al llamar una subrutina o al ejecutarse un salto (instrucciones C A L Ly G O T O ), el microcontrolador es capaz de proporcionar solamente direccionamiento de 11 bits. Similar a la RAM que est dividida en bancos, la ROM est dividida en las cuatro pginas de 2K cada una. Las instrucciones dentro de estas pginas se ejecutan regularmente. Dicho de manera sencilla, como el procesador est proporcionado con una direccin de 11 bits del programa, es capaz de direccionar cualquier localidad dentro de 2KB. La siguiente figura muestra el salto a la direccin del subprograma PP1.

Sin embargo, si una subrutina o una direccin de salto no est en la misma pgina que la localidad de salto, se deben proporcionar dos bits superiores que faltan al escribir en el registro PCLATH. La siguiente figura muestra el salto a la direccin de la subrutina PP2. En ambos casos, cuando la subrutina llega a las instrucciones R E T U R N ,R E T L Wo R E T F I E(vuelta al programa principal), el microcontrolador continuar con la ejecucin de programa desde donde se interrumpi, ya que la direccin de retorno se empuja y se guarda en la pila que consiste en registros de 13 bits, como hemos mencionado.

REGISTROS DE DIRECCIONAMIENTO INDIRECTO


Adems del direccionamiento directo, que es lgico y claro (basta con especificar la direccin de un registro para leer su contenido), este microcontrolador es capaz de realizar el direccionamiento indirecto por los registros INDF y FSR. A veces esto facilita el proceso de escribir un programa. El procedimiento entero est habilitado ya que el registro INDF no es real (no existe fsicamente), sino que solamente especifica el registro cuya direccin est situada en el registro FSR. Por esta razn, escribir o leer los datos del registro INDF realmente significa escribir o leer del registro cuya direccin est situada en el registro FSR. En otras palabras, direcciones de registros se especifican en el registro FSR, y su contenido se almacena en el registro INDF. La diferencia entre el direccionamiento directo e indirecto se muestra en la siguiente figura: Como hemos visto, el problema con "los bits de direccionamiento que faltan" se soluciona con un "prstamo" del otro registro. Esta vez,

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

20/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

es el sptimo bit, denominado bit IRP del registro STATUS.

Una de las caractersticas ms importantes del microcontrolador es el nmero de los pines de entrada/ salida, que permite conectarlo con los perifricos. El PIC16F887 tiene en total 35 pines de E/S de propsito general, lo que es suficiente para la mayora de las aplicaciones.

3.3 PUERTOS DE ENTRADA/SALIDA


Con el propsito de sincronizar el funcionamiento de los puertos de E/S con la organizacin interna del microcontrolador de 8 bits, ellos se agrupan, de manera similar a los registros, en cinco puertos denotados con A, B, C, D y E. Todos ellos tienen las siguientes caractersticas en comn:

Por las razones prcticas, muchos pines de E/S son multifuncionales. Si un pin re aliza una de estas funciones, puede ser utilizado como pin de E/S de propsito general. Cada puerto tiene su propio registro de control de flujo, o sea el registro TRIS correspondiente: TRISA, TRISB, TRISC etc. lo que determina el comportamiento de bits del puerto, pero no determina su contenido.
Al poner a cero un bit del registro TRIS (pin=0), el pin correspondiente del puerto se configurar como una salida. De manera similar, al poner a uno un bit del registro TRIS (bit=1), el pin correspondiente del puerto se configurar como una entrada. Esta regla es fcil de recordar: 0 = Entrada 1 = Salida.

Puerto PORTA y registro TRISA


El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits de los registros TRISA y ANSEL controlan los pines del PORTA. Todos los pines del PORTA se comportan como entradas/salidas digitales. Cinco de ellos pueden ser entradas analgicas (denotadas por AN):

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

21/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

RA0 = AN0 (determinado por el bit ANS0 del registro ANSEL) RA1 = AN1 (determinado por el bit ANS1 del registro ANSEL) RA2 = AN2 (determinado por el bit ANS2 del registro ANSEL) RA3 = AN3 (determinado por el bit ANS3 del registro ANSEL) RA5 = AN4 (determinado por el bit ANS4 del registro ANSEL) Similar a que los bits del registro TRISA determinan cules pines sern configurados como entradas y cules sern configurados como salidas, los bits apropiados del registro ANSEL determinan si los pines sern configurados como entradas analgicas o entradas/salidas digitales. Cada bit de este puerto tiene una funcin adicional relacionada a algunas unidades perifricas integradas, que vamos a describir en los siguientes captulos. Este captulo cubre slo la funcin adicional del pin RA0, puesto que est relacionado al puerto PORTA y a la unidad ULPWU. Vamos a hacerlo en mikroC...

/ /E lp i nP O R T A . 2s ec o n f i g u r ac o m ou n ae n t r a d ad i g i t a l .T o d o sl o sd e m sp i n e sd e lp u e r t o / /P O R T As o ns a l i d a sd i g i t a l e s . . . A N S E L=A N S E L H=0 ;/ /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s P O R T A=0 ; / /T o d o sl o sp i n e sd e lp u e r t oP O R T As ep o n e nac e r o / /P O R T A . 2s ec o n f i g u r a nc o m os a l i d a s . . . T R I S A=0 b 0 0 0 0 0 1 0 0 ;/ /T o d o sl o sp i n e sd e lp u e r t oP O R T Ae x c e p t oe l

UNIDAD ULPWU
El microcontrolador se utiliza generalmente en los dispositivos que funcionan peridicamente y completamente independiente utilizando una fuente de alimentacin de batera. En tal caso, el consumo de corriente mnimo es una de las prioridades. Los ejemplos tpicos de tales aplicaciones son: termmetros, sensores de deteccin del fuego y similar. Es conocido que al reducir frecuencia de reloj se reduce el consumo de corriente, pues una de las soluciones ms convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el cristal de cuarzo de 32KHz en vez de el de 20MHz. Al poner el microcontrolador en el modo de reposo es otro paso en la misma direccin. An ha quedado el problema de salir de este modo y poner el microcontrolador en modo normal de funcionamiento. Es obviamente necesario tener una seal externa en alguno de los pines. Esta seal debe ser generada por componentes electrnicos adicionales, lo que resulta en un consumo de energa ms alto del dispositivo completo... La solucin perfecta sera que el microcontrolador saliera del modo de reposo peridicamente por si mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la izquierda. El principio de funcionamiento es simple: Un pin se configura como salida y se le lleva un uno lgico (1). Esto causa una carga del capacitor. Inmediatamente despus, el mismo pin se configura como entrada. El cambio de estado lgico habilita una interrupcin y el microcontrolador entra en modo de reposo. Slo ha quedado esperar que se descargue el capacitor por la corriente de fuga fluyendo por el pin de entrada. Despus de la descarga, se produce una interrupcin y el microcontrolador contina con la ejecucin de programa en modo normal. Todo el procedimiento se repite. En teora, esto es una solucin perfecta. El problema es que todos los pines capaces de causar una interrupcin son digitales y tienen una corriente de fuga relativamente alta cuando el voltaje sobre ellos no est cerca de los valores lmites de Vdd (1) o VSS (0). En este caso, el condensador se descarga en poco tiempo ya que la corriente es de varias centenas de microamperios. Por esta razn se dise el circuito ULPWU, capaz de indicar una lenta cada de voltaje con un consumo de corriente mnimo. La salida genera una interrupcin, mientras que la entrada est conectada a uno de los pines del microcontrolador. Es el pin RA0. Refirindose a la Figura (R=200 ohms, C=1nF), el tiempo de descarga es aproximadamente 30mS, mientras que un consumo total de corriente del microcontrolador es 1000 veces ms bajo (de varias centenas de nanoamperios).

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

22/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Puerto PORTB y registro TRISB


El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISB determinan la funcin de sus pines.

Similar al puerto PORTA, un uno lgico (1) en el registro TRISB configura el pin apropiado en el puerto PORTB y al revs. Los seis pines de este puerto se pueden comportar como las entradas analgicas (AN). Los bits del registro ANSELH determinan si estos pines sern configurados como entradas analgicas o entradas/salidas digitales: RB0 = AN12 (determinado por el bit ANS12 del registro ANSELH) RB1 = AN10 (determinado por el bit ANS10 del registro ANSELH) RB2 = AN8 (determinado por el bit ANS8 del registro ANSELH) RB3 = AN9 (determinado por el bit ANS9 del registro ANSELH) RB4 = AN11 (determinado por el bit ANS11del registro ANSELH) RB4 = AN11 (determinado por el bit ANS11del registro ANSELH) Cada bit de este puerto tiene una funcin adicional relacionada a algunas unidades perifricas integradas, que vamos a describir en los siguientes captulos. Este puerto dispone de varias caractersticas por las que se distingue de otros puertos y por las que sus pines se utilizan con frecuencia:

Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que los hacen perfectos para que se conecten con los botones de presin (con el teclado), interruptores y optoacopladores. Con el propsito de conectar las resisitencias a los puertos del microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*

Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias "virtuales" no afectan a los pines configurados como salidas, sino que sirven de un complemento til a las entradas. Estas resistencias estn conectados a las entradas de los circuitos lgicos CMOS. De lo contrario, se comportaran como si fueran flotantes gracias a su alta resistencia de entrada.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

23/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Adems de los b its del registro WPUB, hay otro b it que afecta a la instalacin de las resistencias pull-up. Es el b it RBPU del registro OPTION_REG.

Al estar habilitado, cada bit del puerto PORTB configurado como una entrada puede causar una interrupcin al cambiar su estado lgico. Con el propsito de habilitar que los termi nales causen una interrupcin, el bit apropiado del registro IOCB debe estar a uno.

Gracias a estas caractersticas, los pines del puerto PORTB se utilizan con frecuencia para comprobar los botones de presin en el teclado ya que detectan cada apretn de botn infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra vez.

Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), slo se necesita esperar una peticin de interrupcin que aparece al apretar un botn. Ms tarde, se comprueba cul botn fue activado al combinar ceros y unos en las entradas. Vamos a hacerlo en mikroC...

/ *E lp i nP O R T B . 1s ec o n f i g u r ac o m oe n t r a d ad i g i t a l .S ep r o d u c eu n ai n t e r r u p c i nc o nc u a l q u i e r c a m b i od es ue s t a d ol g i c o .T a m b i nt i e n eu n ar e s i s t e n c i ap u l l u p .T o d o sl o sd e m sp i n e sd e l p u e r t oP O R T Bs o ne n t r a d a sd i g i t a l e s .* / . . . A N S E L=A N S E L H=0 ;/ /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s P O R T B=0 ; / /T o d o sl o sp i n e sd e lp u e r t oP O R T Bs ep o n e nac e r o / /s ec o n f i g u r a nc o m os a l i d a s R B P U=0 ; W P U B 1=1 ; I O C B 1=1 ; R B I E=G I E=1 ; / /S eh a b i l i t a nl a sr e s i s t e n c i a sp u l l u p / /L ar e s i s t e n c i ap u l l u ps ec o n e c t aa lp i nP O R T B . 1 / /E lp i nP O R T B . 1p u e d ec a u s a ru n ai n t e r r u p c i np o re l / /c a m b i od e le s t a d ol g i c o / /S eh a b i l i t au n ai n t e r r u p c i n T R I S B=0 b 0 0 0 0 0 0 1 0 ;/ /T o d o sl o sp i n e sd e lp u e r t oP O R T Be x c e p t oP O R T B . 1

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

24/82

4/2/2014
. . .

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

PIN RB0/INT
El pin RB0/INT es la nica fuente verdadera de la interrupcin externa. Se puede configurar de manera que reaccione al borde ascendente de seal (transicin de cero a uno) o al borde descendente de seal (transicin de uno a cero). El bit INTEDG del registro OPTION_REG selecciona la seal apropriada.

PINES RB6 Y RB7


El PIC16F887 no dispone de ningn pin especial para la programacin (el proceso de escribir un programa en la ROM). Los pines que generalmente estn disponibles como los pines de E/S de propsito general, se utilizan para este propsito. Para decir con ms precisin, son los pines del puerto PORTB utilizados para la transmisin de seal de reloj (RB6) y de datos (RB7) al cargar el programa. Adems, es necesario suministrar el voltaje de alimentacin Vdd (5V) as como el voltaje apropiado Vpp (12-14V) para la programacin de memoria FLASH. Durante la programacin, el voltaje Vpp se aplica al pin MCLR. No se preocupe de los detalles relacionados a este proceso, tampoco se preocupe de cul voltaje se aplica primero puesto que los componentes del programador se encargan de eso. Lo que es muy importante es que el programa se puede cargar al microcontrolador an despus de haber sido soldado en el dispositivo destino. Por supuesto, el programa cargado se puede cambiar de la misma manera. Esta funcin se le denomina ICSP (In-Circuit Serial Programming - Programacin serial en circuito) Para utilizarlo correctamente es necesario planificar con antelacin. Es pan comido! Slo es necesario instalar un conector miniatura de 5 pines en el dispositivo destino para suministrar al microcontrolador un voltaje de programacin necesario. Para evitar la interferencia entre los voltajes y los componentes del dispositivo conectados a los pines del microcontrolador, todos los perifricos adicionales deben estar desconectados durante la programacin (utilizando las resistencias o los puentes).

Como hemos visto, los voltajes aplicados a los pines del zcalo del programador son los mismos que los utilizados durante la programacin ICSP.

Puerto PORTC y registro TRISC


El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISC determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro TRISC configura el pin apropiado del puerto PORTC como entrada.

Todas las funciones adicionales del puerto PORTC se describen en los siguientes captulos.

Puerto PORTD y registro TRISD


El puerto PORTD es un puerto bidireccional de 8 bits de anchura. Los bits del registro TRISD determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro TRISD configura el pin apropiado del puerto PORTD como entrada.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

25/82

4/2/2014
Puerto PORTE y registro TRISE

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

El puerto PORTE es un puerto bidireccional, de 4 bits de anchura. Los bits del registro TRISE determinan la funcin de sus pines. Similar a otros puertos, un uno lgico (1) en el registro TRISE configura el pin apropiado del puerto PORTE como entrada.

La excepcin es el pin RE3, que siempre est configurado como entrada. Similar a los puertos PORTA y PORTB, en este caso los tres pines se pueden configurar como entradas analgicas. Los bits del registro ANSEL determinan si estos pines sern configurados como entradas analgicas (AN) o entradas/salidas digitales: RE0 = AN5 (determinado por el bit ANS5 del registro ANSEL); RE1 = AN6 (determinado por el bit ANS6 del registro ANSEL); y RE2 = AN7 (determinado por el bit ANS7 del registro ANSEL). Vamos a hacerlo en mikroC...

/ *E lp i nP O R T E . 0s ec o n f i g u r ac o m ou n ae n t r a d aa n a l g i c am i e n t r a sq u el o sd e m st r e s p i n e sd e lm i s m op u e r t os ec o n f i g u r a nc o m od i g i t a l e s* / . . . A N S E L=0 b 0 0 1 0 0 0 0 0 ;/ /E lp i nP O R T E . 0s ec o n f i g u r ac o m oa n a l g i c o A N S E L H=0 ; / /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s / /P O R T E . 0s ec o n f i g u r a nc o m os a l i d a s P O R T E=0 ; . . . / /T o d o sl o sb i t sd e lp u e r t oP O R T Es ep o n e nac e r o T R I S E=0 b 0 0 0 0 0 0 0 1 ;/ /T o d o sl o sp i n e sd e lp u e r t oP O R T Ee x c e p t oe l

Registros ANSEL y ANSELH


Los registros ANSEL y ANSELH se utilizan para configurar el modo de entrada de un pin de E/S como analgico o como digital.

La regla es la siguiente: Para configurar un pin como una entrada analgica, el bit apropiado de los registros ANSEL o ANSELH se debe poner a uno (1). Para configurar un pin como una entrada/salida digital, el bit apropiado se debe poner a cero (0). El estado lgico de los bits del registro ANSEL no tiene influencia en las funciones de salidas digitales. Al intentar a leer un pin de puerto configurado como una entrada analgica, el resultado es siempre 0.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

26/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Es probable que usted nunca vaya a escribir un programa que no utilice puertos, as que el esfuerzo para aprender todo sobre ellos en definitiva vale la pena. De todos modos, los puertos son probablemente los mdulos ms simples dentro del microcontrolador. Se utilizan de la siguiente manera:

Al disear un dispositivo, seleccione un puerto por el que el microcontrolador comunicar al entorno perifrico. Si usted utiliza slo entradas/salidas digitales, seleccione cualquier puerto. Si utiliza alguna de las entradas analgicas, seleccione los puertos apropiados que soportan tal configuracin de los pines (AN0-AN13). Cada pin del puerto se puede configurar como salida o como entrada. Los bits de los registros TRISA,TRISB, TRISC, TRISD y TRISE determinan cmo se com portarn los pines apropiados de los puertos PORTA, PORTB, PORTC, PORTD y PORTE. Simplemente... Si utiliza alguna de las entradas analgicas, primero es necesario poner a uno los bits apropiados de los registros ANSEL y ANSELH en el principio de programa. Si utiliza resistencias o botones de presin como una fuente de seal de en trada, conctelos a los pines del puerto PORTB, ya que tienen las resistencias pull-up. El uso de estos registros est habilitado por el bit RBPU del registro OPTION_REG, mientras que la instalacin de las resistencias individuales est habilitada por los bits del registro WPUB. Con frecuencia se necesita responder tan pronto como los pines de entrada cambien su estado lgico. Sin embargo, no es necesario escribir un programa para comprobar el estado lgico de los pines. Es mucho ms simple conectar estas entradas a los pines del puerto PORTB y habilitar que ocurra una interrupcin con cada cambio de voltaje. Los bits de los registros IOCB e INTCON se encargan de eso.
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores independientes, denominados Timer0, Timer1 y Timer2. En este captulo se presenta una descripcin detallada de los mismos.

3.4 TEMPORIZADOR TIMER0


El temporizador Timer0 tiene una amplia gama de aplicaciones en la prctica. Slo unos pocos programas no lo utilizan de alguna forma. Es muy conveniente y fcil de utilizar en programas o subrutinas para generar pulsos de duracin arbitraria, en medir tiempo o en contar los pulsos externos (eventos) casi sin limitaciones. El mdulo del temporizador Timer0 es un temporizador/contador de 8 bits con las siguientes caractersticas:

Temporizador/contador de 8 bits; Pre-escalador de 8 bits (lo comparte con el temporizador perro guardin); Fuente de reloj interna o externa programable; Generacin de interrupcin por desbordamiento; y Seleccin del flanco de reloj externo programable.
La siguiente figura muestra el esquema del temporizador Timer0 con todos los bits que determinan su funcionamiento. Estos bits se almacenan en el registro OPTION_REG.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

27/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Registro OPTION_REG

RBPU - PORTB Pull-up enable bit (resistencia Pull Up del puerto PORTB)
0 - Resistencias pull-up del puerto PORTB estn deshabilitadas. 1 - Pines del puerto PORTB pueden estar conectados a las resistencias pull-up.

INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin externa)
0 - Interrupcin por flanco ascendente en el pin INT (0-1). 1 - Interrupcin por flanco descendente en el pin INT (1-0).

T0CS - TMR0 Clock Select bit (bit selector de tipo de reloj para el Timer0)
0 - Los pulsos se llevan a la entrada del temporizador/contador Timer0 por el pin RA4. 1 - El temporizador utiliza los pulsos de reloj internos (Fosc/4).

T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco)
0 - Incrementa en flanco descendente en el pin TMR0. 1 - Incrementa en flanco ascendente en el pin TMR0.

PSA - Prescaler Assignment bit (bit de asignacin del pre-escalador)


0 - Pre-escalador se le asigna al WDT. 1 - Pre-escalador se le asigna al temporizador/contador Timer0.

PS2, PS1, PS0 - Prescaler Rate Select bit (bit selector del valor del divisor de frecuencias)
El valor del divisor de frecuencias se ajusta al combinar estos bits. Como se muestra en la tabla a la derecha, la misma combinacin de bits proporciona los diferentes valores del divisor de frecuencias para el temporizador/contador y el temporizador perro guardin, respectivamente. PS2 0 0 0 0 1 1 1 1 PS1 0 0 1 1 0 0 1 1 PS0 0 1 0 1 0 1 0 1 T M R0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 W DT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Cuando el bit PSA est a 0, el pre-escalador se le asigna al temporizador/contador Timer0, como se muestra en la siguiente figura.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

28/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Vamos a hacerlo en mikroC...

/ /E ne s t ee j e m p l o ,T i m e r 0s ec o n f i g u r ac o m ou nt e m p o r i z a d o rys el ea s i g n au np r e e s c a l a d o r . u n s i g n e dc n t ; v o i di n t e r r u p t ( ){ c n t + + ; T M R 0=1 5 5 ; I N T C O N=0 x 2 0 ; } v o i dm a i n ( ){ O P T I O N _ R E G=0 x 0 4 ; T M R 0=1 5 5 ; I N T C O N=0 x A 0 ; . . . . . . / /E ne ls i g u i e n t ee j e m p l o ,T i m e r 0s ec o n f i g u r ac o m ou nt e m p o r i z a d o r / /ys el ea s i g n au np r e e s c a l a d o r . O P T I O N _ R E G=0 x 2 0 ; T M R 0=1 5 5 ; I N T C O N=0 x A 0 ; . . . . . . / /P r e e s c a l a d o r( 1 : 2 )s el ea s i g n aa lc o n t a d o rT i m e r 0 / /C o n t a d o rT 0c u e n t ad e1 5 5a2 5 5 / /H a b i l i t a d al ag e n e r a c i nd ei n t e r r u p c i np o re l / /t e m p o r i z a d o rT i m e r 0 / /P r e e s c a l a d o r( 1 : 3 2 )s el ea s i g n aa lt e m p o r i z a d o rT i m e r 0 / /T e m p o r i z a d o rT 0c u e n t ad e1 5 5a2 5 5 / /H a b i l i t a d al ag e n e r a c i nd ei n t e r r u p c i np a r ae l / /t e m p o r i z a d o rT i m e r 0 / /D e c l a r a rl av a r i a b l ec n t / /R u t i n ad ei n t e r r u p c i n / /I n t e r r u p c i nc a u s ae li n c r e m e n t od ec n tp o r1 / /T e m p o r i z a d o r( oc o n t a d o r )T i m e r 0d e v u e l v es uv a l o ri n i c i a l / /B i tT 0 I Ee s t a1 ,b i tT 0 I Fe s t a0

Cuando el bit PSA est a 1, el pre-escalador se le asigna al temporizador perro guardin como se muestra en la siguiente figura.

Vamos a hacerlo en mikroC...

/ /E ne s t ee j e m p l o ,e lp r e e s c a l a d o r( 1 : 6 4 )s el ea s i g n aa lt e m p o r i z a d o rp e r r og u a r d i n .

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

29/82

4/2/2014
v o i dm a i n ( ){

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

O P T I O N _ R E G=0 x 0 E ;/ /P r e e s c a l a d o rs el ea s i g n aa lW D T( 1 : 6 4 ) a s mC L R W D T ; . . . . . . a s mC L R W D T ; . . . / /C o m a n d oe ne n s a m b l a d o rp a r ar e i n i c i a re lW D T

/ /C o m a n d oe ne n s a m b l a d o rp a r ar e i n i c i a re lW D T

Aparte de lo dicho anteriormente, cabe destacar lo siguiente:

Al asignarle el pre-escalador al temporizador/contador, el pre-escalador se pondr a 0 con cualquier escritura en el registro TMR0. Al asignar el pre-escalador al temporizador perro guardin, tanto el WDT como el preescalador se pondrn a 0 con la instruccin CLRWDT. Al escribir en el registro TMR0, utilizado como un temporizador, no se inicia el conteo de los pulsos inmediatamente, sino con retraso de dos ciclos de instrucciones. Por consiguiente, es necesario ajustar el valor escrito en el registro TMR0. Al poner el microcontrolador en el modo de reposo se apaga el oscilador de reloj. No puede ocurrir el desbordamiento ya que no hay pulsos a contar. Es la razn por la que la interrupcin por el desbordamiento del TMR0 no puededespertar al procesador del modo de reposo. Si se utiliza como un contador de reloj externo sin pre-escalador, la longitud de pulso mnima o tiempo muerto entre dos pulsos deber ser 2 Tosc + 20 nS (Tosc es el perodo de seal de reloj del oscilador). Si se utiliza como un contador de reloj externo con pre-escalador, la longitud de pulso mnima o tiempo muerto entre dos pulsos es slo 10nS. El registro del pre-escalador de 8 bits no est disponible al usuario, lo que significa que no es posible leerlo o escribir en l directamente. Al cambiar de asignacin del pre-escalador del Timer0 al temporizador perro guardin, es necesario ejecutar la siguiente secuencia de instrucciones escritas en ensamblador para impedir reiniciar el microcontrolador:
B A N K S E LT M R 0 C L R W D T C L R FT M R 0

; P O N E RAC E R OW D T ; P O N E RAC E R OT M R 0YP R E E S C A L A D O R

B A N K S E LO P T I O N _ R E G B S FO P T I O N _ R E G , P S A; A S I G N A R L EE LP R E E S C A L A D O RA LW D T C L R W D T ; P O N E RAC E R OW D T M O V L Wb ' 1 1 1 1 1 0 0 0 ' ; S E L E C C I O N A RL O SB I T SP S 2 , P S 1 , P S 0YP O N E R L O S A N D W FO P T I O N _ R E G , W; AC E R OP O RL AI N S T R U C C I N' YL G I C O ' I O R L Wb ' 0 0 0 0 0 1 0 1 ' ; B I T SP S 2 ,P S 1 ,YP S 0P O N E NE LV A L O R M O V W FO P T I O N _ R E G ; D E LD I V I S O RD EF R E C U E N C I A SA1 : 3 2

De manera similar, al cambiar de asignacin del pre-escalador del WDT al Timer0, es necesario ejecutar la siguiente secuencia de instrucciones, tambin escritas en ensamblador:
B A N K S E LT M R 0 C L R W D T

; P O N E RAC E R OW D TYP R E E S C A L A D O R

B A N K S E LO P T I O N _ R E G M O V L Wb ' 1 1 1 1 0 0 0 0 ' ; S E L E C C I O N A RS L OL O SB I T SP S A , P S 2 , P S 1 , P S 0 A N D W FO P T I O N _ R E G , W; YP O N E R L O SAC E R OP O RL AI N S T R U C C I N' YL G I C O ' I O R L Wb ' 0 0 0 0 0 0 1 1 ' ; V A L O RD E LD I V I S O RD EF R E C U E N C I A SE S1 : 1 6 M O V W FO P T I O N _ R E G

Para utilizar el Timer0 apropiadamente, es necesario: Paso 1: Seleccionar el modo:

El modo de temporizador se selecciona por el bit TOSC del registro OPTION_REG (TOSC: 0=temporizador, 1=contador). Cuando se asigna el pre-escalador al temporizador/contador se debe poner a cero el bit PSA del registro OPTION_REG. El valor del divisor de frecuencias se configura al utilizar los bits PS2-PS0 del mismo registro. Al utilizar una interrupcin, los bits GIE y TMR0IE del registro INTCON deben estar a uno.
Paso 2: Medir y contar Para medir tiempo:

Reiniciar el registro TMR0 o escribir un valor conocido en l. El tiempo transcurrido(en microsegundos al utilizar el oscilador de 4MHz) se mide al leer el registro TMR0. El bit de bandera TMR0IF del registro INTCON se pone a uno automticamente siempre que ocurra el desbordamiento del registro TMR0. Si est habilitada, ocurre una interrupcin.
Para contar pulsos:

La polaridad de pulsos a contar en el pin RA4 se selecciona por el bit TOSE del registro OPTION_REG (T0SE: 0=pulsos positivos, 1=pulsos negativos). Varios pulsos se pueden leer del registro TMR0. El pre-escalador y la interrupcin se utilizan de la misma forma que en el modo de temporizador.

3.5 TEMPORIZADOR TIMER1


El mdulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que consiste en dos registros (TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo ciclo, o sea, antes de que el conteo se inicie desde cero.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

30/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Similar al temporizador Timer0, estos registros se pueden leer o se puede escribir en ellos en cualquier momento. En caso de que ocurra un desbordamiento, se genera una interrupcin si est habilitada. El mdulo del temporizador Timer1 puede funcionar en uno o dos modos bsicos, eso es como un temporizador o como un contador. A diferencia del temporizador Timer0, cada uno de estos dos modos tiene funciones adicionales. El temporizador Timer1 tiene las siguientes caractersticas:

Temporizador/contador de 16 bits compuesto por un par de registros; Fuente de reloj interna o externa programable; Pre-escalador de 3 bits; Oscilador LP opcional; Funcionamiento sncrono o asncrono; Compuerta para controlar el temporizador Timer1 (conteo habilitado) por medio del comparador o por el pin T1G; Interrupcin por desbordamiento; "Despierta" al microcontrolador (salida del modo de reposo) por desbordamiento (reloj externo); y Fuente de reloj para la funcin de Captura/Comparacin.

SELECCIN DE LA FUENTE DE RELOJ DEL TEMPORIZADOR TIMER1


El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para este temporizador:
F UENT E DE REL O J Fosc/4 T1C KI pin T M R1 C S 0 1

Al seleccionar la fuente de reloj interna, el par de registros TMR1H-TMR1L ser incrementado con varios pulsos Fosc como es determinado por el pre-escalador. Al seleccionar la fuente de reloj externa, este temporizador puede funcionar como un temporizador o un contador. Los pulsos en el modo temporizador pueden estar sincronizados con el reloj interno del microcontrolador o funcionar asncronamente. En caso de que se necesite un oscilador del reloj externo y el microcontrolador PIC16F887 utilice el oscilador interno INTOSC con el pin RA6/OSC2/CLIKOUT, el temporizador Timer1 puede utilizar el oscilador LP como una fuente de reloj.

PRE-ESCALADOR DEL TEMPORIZADOR TIMER1


El temporizador Timer1 tiene un escalador completamente separado que permite dividir la frecuencia de entrada de reloj por 1,2,4 o 8. No es posible leer el pre-escalador o escribir en l directamente. De todas formas, el contador del pre-escalador se pone a 0 automticamente despus de escribir en los registros TMR1H o TMR1L.

OSCILADOR DEL TEMPORIZADOR TIMER1


Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que vienen de los dispositivos perifricos, pero tambin tienen una funcin adicional. Como se puede ver en la siguiente figura, se configuran simultneamente como entrada (pin RC1) y salida (pin RC0) del oscilador de cuarzo LP (Low Power - de bajo consumo) adicional. Este circuito est principalmente diseado para funcionar a bajas frecuencias (hasta 200 KHz), exactamente para el uso de cristal de cuarzo de 32.768 KHz. Este cristal se utiliza en los relojes de cristal puesto que es fcil de obtener un pulso de duracin de un segundo al dividir esta frecuencia. Como el oscilador no depende del reloj interno, puede funcionar incluso en el modo de reposo. Se habilita al poner a uno el bit de control T1OSCEN del registro T1CON. El usuario debe proporcionar tiempo muerto por medio de software (unos pocos milisegundos) para habilitar que el oscilador se inicie apropiadamente. La siguiente tabla muestra los valores recomendados de los capacitores convenientes con el oscilador de cuarzo. No es necesario que

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

31/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


estos valores sean exactos. De todas formas, la regla general es: cunto ms alta sea la capacidad, tanto ms alta ser la estabilidad, lo que a la vez prolonga el tiempo necesario para la estabilizacin del oscilador.
O S C I L A DO R F REC UENC I A 32 kHz LP 100 kHz 200 kHz C1 33 pF 15 pF 15 pF C2 33 pF 15 pF 15 pF

El consumo de corriente del microcontrolador se reduce a nivel ms bajo en el modo de reposo ya que el consumidor de corriente principal - el oscilador - no funciona. Es fcil de poner al microcontrolador en este modo - al ejecutar la instruccin SLEEP. El problema es cmo despertar al microcontrolador porque slo una interrupcin puede producirlo. Como el microcontrolador duerme, se debe usar una interrupcin causada por dispositivos perifricos para despertarlo. Se pone muy complicado si es necesario despertar al microcontrolador a intervalos de tiempo regulares... Para resolver el problema, un oscilador de cuarzo LP (de bajo consumo de corriente) completamente independiente, capaz de funcionar en el modo de reposo, est integrado en el microcontrolador PIC16F887. Simplemente, un circuito anteriormente separado ahora est integrado en el microcontrolador y asignado al temporizador Timer1. El oscilador est habilitado al poner a 1 el bit T1OSCEN del registro T1CON. El bit TMR1CS del mismo registro se utiliza para habilitar que el temporizador Timer1 utilice secuencias de pulsos de ese oscilador.

Una seal generada por este oscilador de cuarzo est sincronizada con el reloj del microcontrolador al poner a 0 el bit T1SYNC. En este caso, el temporizador no puede funcionar en modo de reposo porque el circuito para sincronizacin utiliza el reloj del microcontrolador. La interrupcin por desbordamiento en el registro del temporizador Timer1 puede estar habilitada. Si el bit T1SYNC se pone a 1, tales interrupciones se producirn en el modo de reposo tambin.

COMPUERTA DEL TEMPORIZADOR TIMER1


El pin TG1 o la salida del comparador C2 pueden ser una fuente de los pulsos que pasan por la compuerta del temporizador Timer1. Se configuran por software. Esta compuerta permite que el temporizador mida directamente la duracin de los eventos externos al utilizar el estado lgico del pin T1G o los eventos analgicos al utilizar la salida del comparador C2. Refirase a la Figura en la pgina anterior. Para medir duracin de seal, basta con habilitar esta compuerta y contar los pulsos que pasan por ella.

TIMER1 EN EL MODO TEMPORIZADOR


Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Despus de eso, el registro de 16 bits ser incrementado con cada pulso generado por el oscilador interno. Si se utiliza el cristal de cuarzo de 4 MHZ, el registro ser incrementado cada microsegundo. En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los pulsos de reloj interno. Como todos los dispositivos utilizan estos pulsos, no hace falta sincronizarlos.

El oscilador de reloj del microcontrolador no funciona durante el modo de reposo as que el desbordamiento en el registro del

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

32/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

temporizador no puede causar interrupcin. Vamos a hacerlo en mikroC...

/ /E ne s t ee j e m p l o ,e lT M R 1e s t c o n f i g u r a d oc o m ou nt e m p o r i z a d o rc o ne lv a l o r / /d e lp r e e s c a l a d o r1 : 8 .C a d av e zq u eo c u r r au nd e s b o r d a m i e n t od el o sr e g i s t r o sT M R 1 Hy / /T M R 1 L ,s es o l i c i t a r u n ai n t e r r u p c i n . v o i dm a i n ( ){ P I R 1 . T M R 1 I F=0 ; T M R 1 H=0 x 2 2 ; T M R 1 L=0 x 0 0 ; T M R 1 C S=0 ; P I E 1 . T M R 1 I E=1 ; I N T C O N=0 x C 0 ; T M R 1 O N=1 ; . . . / /P o n e ra0l ab a n d e r ad eb i td e lT M R 1 I F / /P o n e re lv a l o ri n i c i a lp a r ae lt e m p o r i z a d o rT i m e r 1 / /T e m p o r i z a d o r 1c u e n t al o sp u l s o sd e lo s c i l a d o ri n t e r n o / /I n t e r r u p c i nh a b i l i t a d ap o rd e s b o r d a m i e n t o / /I n t e r r u p c i nh a b i l i t a d a( b i t sG I EyP E I E ) / /E n c e n d e re lt e m p o r i z a d o rT i m e r 1

T 1 C K P S 1=T 1 C K P S 0=1 ;/ /E lv a l o rd e lp r e e s c a l a d o ra s i g n a d ae s1 : 8

TIMER1 EN EL MODO CONTADOR


El temporizador Timer1 se pone a funcionar como un contador al poner a 1 el bit TMR1CS. Este bit cuenta los pulsos llevados al pin PC0/T1CKI y se incrementa en el flanco ascendente de la entrada del reloj externo T1CKI. Si el bit de control T1SYNC del registro T1CON se pone a 0, las entradas del reloj externo se sincronizarn en su camino al temporizador Timer1. En otras palabras, el temporizador Timer1 se sincroniza con el reloj interno del microcontrolador y se le denomina contador sncrono. Al poner en modo de reposo el microcontrolador que funciona de esta manera, los registros del temporizador Timer1H y TMR1L no sern incrementados aunque los pulsos de reloj aparezcan en los pines de entrada. Como el reloj interno del microcontrolador no funciona en este modo, no hay entradas de reloj que se utilicen para la sincronizacin. De todas formas, el pre-escalador sigue funcionando siempre que haya pulsos de reloj en los pines, porque es un simple divisor de frecuencias.

Este contador detecta un uno lgico (1) en los pines de entrada. Cabe destacar que al menos un flanco ascendente debe ser detectado antes de empezar a contar los pulsos. Refirase a la Figura a la izquierda. Las flechas en la figura indican los incrementos del contador.

Registro T1CON

T1GINV - Timer1 Gate Invert bit (Bit inversor de la compuerta del temporizador1) se comporta como un inversor del estado lgico en la compuerta formada por el pin T1G o la salida (C2OUT) del comparador C2. Este bit habilita al temporizador para con tar los pulsos cuando la compuerta est a alto o a bajo.

1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn a alto (1). 0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estn a bajo (0).

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

33/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

TMR1GE - Timer1 Gate Enable bit (Bit de habilitacin de la compuerta del temporizador1) determina si la compuerta formada por el pin T1G o salida del comparador C2 (C2OUT) estar activa o no. Este bit es funcional slo en caso de que el temporizador Timer1 est encendido (el bit TMR1ON = 1). De lo contrario, este bit se ignora.

1 - Temporizador Timer1 est encendido slo si la compuerta no est activa. 0 - Compuerta no afecta al temporizador Timer1.
T1CKPS1, T1CKPS0 - Timer1 Input Clock Prescale Select bits (Bits de seleccin del preescalador de seal de reloj del Temporizador1) determina el valor del divisor de frecuen cias asignada al temporizador Timer1.
T 1 C KP S 1 0 0 1 1 T 1 C KP S 0 0 1 0 1 V A L O R DEL P RE- ES C A L A DO R 1:1 1:2 1:4 1:8

T1OSCEN - LP Oscillator Enable Control bit (bit de habilitacin del oscilador LP del Timer1)

1 - Oscilador LP est habilitado para el reloj del Timer1 (oscilador de bajo consumo y de frecuencia de 32.768 kHz) 0 - Oscilador LP est apagado.
T1SYNC - Timer1 External Clock Input Synchronization Control bit (Bit de control de sincronizacin de la seal de entrada) habilita la sincronizacin de la entrada del oscilador LP o de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al contar los pulsos desde el oscilador principal (el bit TMR1CS = 0).

1 - Entrada de reloj externa no est sincronizada. 0 - Entrada de reloj externa est sincronizada.
TMR1CS - Timer TMR1 Clock Source Select bit (bit de seleccin de la fuente de reloj del temporizador Timer1)

1 - Cuenta los pulsos por el pin T1CKI (por el flanco ascendente 0-1) 0 - Cuenta los pulsos del reloj interno del microcontrolador
TMR1ON - Timer1 On bit (TMR activo, hace entrar o no en funcionamiento el Timer1).

1 - Habilita el temporizador Timer1. 0 - Deshabilita el temporizador Timer1.


Para utilizar el Timer1 apropiadamente, es necesario hacer lo siguiente:

Como no es posible apagar el pre-escalador, su valor debe estar ajustado a los bits T1CKPS1 y T1CKPS0 del registro T1CON (Refirase a la tabla). Seleccionar el modo por el bit TMR1CS del registro T1CON. (TMR1CS: 0=la fuente de reloj es oscilador de cuarzo interno, 1= la fuente de reloj es oscilador de cuarzo externo). Al configurar el bit T1OSCEN del mismo registro, el oscilador est habilitado y los registros TMR1H y TMR1L se incrementan con cada pulso de reloj. Al poner este bit a 0, se detiene el conteo. Al reiniciar los registros del contador o al escribir en ellos, se reinicia el pre-escalador. Al llenar ambos registros del temporizador, se configura la bandera TMR1IF y el conteo empieza desde cero.

3.6 TEMPORIZADOR TIMER2


El mdulo del temporizador Timer2 es un temporizador de 8 bits.

Los pulsos que vienen del oscilador de cuarzo primero pasan por el pre-escalador cuyo valor puede ser modificado al combinar los bits T2CKPS1 y T2CKPS0. La salida del preescalador se utiliza para incrementar el registro TMR2 empezando por 00h. Los valores del TMR2 y del PR2 se comparan constantemente y el registro TMR2 va incrementndose hasta alcanzar el valor del registro PR2. Cuando se igualan los valores de los registros, lo que ser registrado por el comparador, el TMR2 se reinicia a 00h automticamente. El postescalador del temporizador Timer2 se incrementa y su salida se utiliza para generar una interrupcin si est habilitada. Los ambos registros TMR y PR2 son de lectura y escritura. El conteo se puede detener al poner a 0 el bit TMR2ON, lo que resulta en un ahorro de energa. El momento de reinicio del TMR2 se puede utilizar para determinar la velocidad de transmisin en baudios de la comunicacin serie sncrona. Varios bits del registro T2CON estn en control del temporizador Timer2.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

34/82

4/2/2014
Registro T2CON

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

TOUTPS3 - TOUTPS0 - Timer2 Output Postcaler Select bits (bits de seleccin del rango del divisor del post-escalador para el Timer2) se utilizan para determinar el valor del post-escalador segn la siguiente tabla:
T O UT P S 3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 T O UT P S 2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 T O UT P S 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 T O UT P S 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 V A L O R DEL P O S T - ES C A L A DO R 1:1 1:2 1:3 1:4 1:5 1:6 1:7 1:8 1:9 1:10 1:11 1:12 1:13 1:14 1:15 1:16

TMR2ON Timer2 On bit - (bit de activacin del TIMR2) hace entrar en funcionamiento el temporizador Timer2.

1 - Habilita el funcionamiento del Timer2. 0 - Deshabilita el funcionamiento del Timer2.


T2CKPS1, T2CKPS0 - Timer2 Clock Prescaler bits (seleccin del rango del divisor del preescalador del Timer2) determina el valor del divisor de frecuencias:
T 2 C KP S 1 0 0 1 T 2 C KP S 0 0 1 x V A L O R DEL P RE- ES C A L A DO R 1:1 1:4 1:16

Al utilizar el temporizador Timer2 hay que saber varios detalles relacionados con sus registros:

En el momento de encender una fuente de alimentacin, el registro PR2 contiene el valor FFh. Tanto el pre-escalador como el post-escalador se borran al escribir en el registro TMR2. Tanto el pre-escalador como el post-escalador se borran al escribir en el registro T2CON. Al producirse cualquier reinicio, como puede anticiparse, tanto el pre-escalador como el post-escalador se borran.
Los mdulos CCP pueden funcionar en muchos modos diferentes, por lo que se consideran los ms complicados. Si usted intenta analizar su funcionamiento a b ase de tab las que describ en las funciones de b its, comprender mejor de lo qu le estamos hab lando. Si utiliza alguno de los mdulos CCP, primero seleccione el modo que necesita, analice la figura apropiada y entonces pngase a modificar los b its de registros. Si no...

3.7 MDULOS CCP


El mdulo CCP (Captura/Comparacin/PWM) es un perifrico que le permite medir y controlar diferentes eventos. El modo de captura proporciona el acceso al estado actual de un registro que cambia su valor constantemente. En este caso, es el registro del temporizador Timer1. El modo de comparacin compara constantemente valores de dos registros. Uno de ellos es el registro del temporizador Timer1. Este circuito tambin le permite al usuario activar un evento externo despus de que haya expirado una cantidad de tiempo predeterminada. PWM (Pulse Width Modulation - modulacin por ancho de pulsos) puede generar seales de frecuencia y de ciclo de trabajo variados por uno o ms pines de salida. El microcontrolador PIC16F887 dispone de dos mdulos CCP - CCP1 y CCP2. Ambos son idnticos en modo normal de funcionamiento, mientras que las caractersticas del PWM mejorado estn disponibles slo en el modo CCP1. sta es la razn por la que en este captulo se describe detalladamente el funcionamiento del mdulo CCP1. Con respecto al CCP2, se presentarn slo las caractersticas que lo distinguen del CCP1.

MDULO CCP1

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

35/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros CCPR1L y CCOR1H. Se utiliza para capturar y comparar sus valores con los nmeros almacenados en el registro del temporizador Timer1 (TMR1H y TMR1L).

Si est habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los valores en modo de Comparacin. Adems, el mdulo CCP1 puede generar seales PWM de frecuencia y de ciclo de trabajo variados. Los bits del registro CCP1CON estn en control del mdulo CCP1.

CCP1 EN MODO DE CAPTURA


En este modo, el registro del temporizador Timer1 (que consiste en los TMR1H y TMR1L) se copia al registro CCP1 (que consiste en los CCPR1H y CCPR1L) en las siguientes situaciones:

Cada flanco ascendente (1 -> 0) en el pin RC2/CCP; Cada flanco descendente (0 -> 1) en el pin RC2/CCP1; Cada cuarto flanco ascendente (0 -> 1) en el pin RC2/CCP1; y Cada decimosexto flanco descendente (0 -> 1) en el pin RC2/CCP1.
Una combinacin de cuatro bits (CCP1M3 - CCP1M0) del registro de control determina cul de estos eventos causar transmisin de dato de 16 bits. Adems, se deben cumplir los siguientes requisitos::

El pin RC2/CCP1 debe estar configurado como entrada; y El Timer1 debe funcionar como temporizador o contador sncrono.

El bit de bandera CCP1IF se pone a uno despus de acabar la captura. Si se pone a 1 el bit CCP1IE del registro PIE1, se producir una interrupcin. En caso de que el mdulo CCP1 est en modo de captura, puede producirse una interrupcin no deseada. Para evitarlo, antes de que ocurra un cambio en el registro de control se deben poner a 0 tanto el bit que habilita la interrupcin CCP1IE, como el bit de bandera CCP1IF. Las interrupciones no deseadas pueden producirse al cambiar el valor del pre-escalador. Para evitarlo, el mdulo CCP1 debe estar apagado temporalmente antes de cambiar el valor del pre-escalador. Se recomienda la siguiente secuencia de programa, escrita en ensamblador:

B A N K E S E LC C P 1 C O N C L R F M O V L W M O V W F C C P 1 C O N ; R E G I S T R OD EC O N T R O LB O R R A D O ; M D U L OC C P 1E S T A P A G A D O X X ; N U E V OM O D OD E LP R E E S C A L A D O RE S T S E L E C C I O N A D O ; M D U L OC C P 1S EE N C I E N D ES I M U L T N E A M E N T E C C P 1 C O N ; E NE LR E G I S T R OD EC O N T R O LS EI N T R O D U C EU NN U E V OV A L O R

Vamos a hacerlo en mikroC...

. . . A S M{ B A N K E S E LC C P 1 C O N C L R FC C P 1 C O N M O V L WX X M O V W FC C P 1 C O N } . . . / /R E G I S T R OD EC O N T R O LB O R R A D O / /M D U L OC C P 1E S T A P A G A D O / /N U E V OM O D OD E LP R E E S C A L A D O RE S T S E L E C C I O N A D O / /E NE LR E G I S T R OD EC O N T R O LS EI N T R O D U C EN U E V OV A L O R / /M D U L OC C P 1S EE N C I E N D ES I M U L T N E A M E N T E

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

36/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

CCP1 EN MODO DE COMPARACIN


En este modo, el valor almacenado en el registro CCP1 se compara constantemente al valor almacenado en el registro del temporizador Timer1. Al igualarse los valores, el estado lgico en el pin de salida puede ser cambiado, lo que depende del estado de bits en el registro de control (CCP1M3 - CCP1M0). El bit de bandera CCP1IF se pone a uno simultneamente.

Para poner el mdulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:

El pin RC2/CCP1 debe estar configurado como salida; y El temporizador Timer1 debe estar sincronizado con el reloj interno.

CCP1 EN MODO PWM


Las seales de frecuencia y de ciclo de trabajo variados tienen una amplia gama de aplicaciones en automatizacin. Un ejemplo tpico es un circuito de control de potencia. Refirase a la siguiente figura. Si un cero lgico (0) indica un interruptor abierto y un uno lgico (1) indica un interruptor cerrado, la potencia elctrica que se transmite a los consumidores ser directamente proporcional a la duracin del pulso. Esta relacin se le denomina Ciclo de Trab ajo.

El otro ejemplo, comn en la prctica, es el uso de seales PWM en un circuito para generar seales de forma de onda arbitraria como una onda sinusoidal. Vea la siguiente figura:

Los dispositivos que funcionan segn este principio se utilizan con frecuencia en la prctica como variadores de frecuencia ajustable que controlan motores elctricos (velocidad, aceleracin, desaceleracin etc.)

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

37/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

La Figura anterior muestra el diagrama de bloques del mdulo CCP1 puesto en el modo PWM. Para generar un pulso de forma arbitraria en el pin de salida, es necesario ajustar el perodo de pulsos (frecuencia) y la duracin de pulsos.

PERODO DE PWM
El perodo de pulso de salida (T) se determina por el registro PR2 del temporizador Timer2. El perodo de PWM se puede calcular por la siguiente ecuacin: Perodo PWM = (PR2 +1) * 4Tosc * Valor de pre-escala del Timer2 Si el perodo de PWM (T) es conocido, es fcil determinar la frecuencia de seal F, porque estos dos valores estn relacionados por la ecuacin F=1/T.

CICLO DE TRABAJO DE PWM


El ciclo de trabajo de PWM se especifica al utilizar en total 10 bits: los ocho bits ms significativos del registro CCPR1L y los dos bits menos significativos adicionales del registro CCP1CON (DC1B1 y DC1B0). El resultado es un nmero de 10 bits dado por la siguiente frmula: Ancho de pulsos = (CCPR1L,DC1B1,DC1B0) * Tosc * Valor de pre-escala del Timer2 La siguiente tabla muestra cmo generar las seales PWM de diferentes frecuencias cuando el microcontrolador utiliza un cristal de cuarzo de 20 MHz (Tosc=50nS).
F REC UENC I A [ KHZ ] Pre-escalador del TMR2 Registro PR2 1.22 16 FFh 4.88 4 FFh 19.53 1 FFh 78.12 1 3Fh 156.3 1 1Fh 208.3 1 17h

Notas adicionales:

El pin de salida se va a poner a 1 constantemente, si por error el ancho de pulso generado es ms largo que el perodo de PWM. En esta aplicacin, no se puede utilizar el post-escalador del temporizador Timer2 para generar perodos de PWM largos.

RESOLUCIN DE PWM
Una seal PWM no es nada ms que una secuencia de pulsos que varan su ciclo de trabajo. Para una frecuencia especfica (nmero de pulsos por segundo), hay un nmero limitado de combinaciones de ciclos de trabajo. Este nmero representa una resolucin medida en bits. Por ejemplo, si una resolucin es de 10 bits estarn disponibles 1024 ciclos de trabajo discretos; si una resolucin es de 8 bits estarn disponibles 256 ciclos de trabajo disretos etc. En este microcontrolador la resolucin es determinada por el registro PR2. El mximo valor se obtiene al usar el nmero FFh. Frecuencias y resoluciones de PWM (Fosc = 20MHz):
F REC UENC I A DE P W M 1 . 2 2 KHZ 4 . 8 8 KHZ 1 9 . 5 3 KHZ 7 8 . 1 2 KHZ 1 5 6 . 3 KHZ 2 0 8 . 3 KHZ

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

38/82

4/2/2014
Pre-escala del temporizador Valor del PR2 Resolucin mxima

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


16 FFh 10 4 FFh 10 1 FFh 10 1 3Fh 8 1 1Fh 7 1 17h 6

Frecuencias y resoluciones de PWM (Fosc = 8MHz):


F REC UENC I A DEL P W M Pre-escala del temporizador Valor del PR2 Resolucin mxima 1 . 2 2 KHZ 16 65h 8 4 . 9 0 KHZ 4 65h 8 1 9 . 6 1 KHZ 1 65h 8 7 6 . 9 2 KHZ 1 19h 6 1 5 3 . 8 5 KHZ 1 0C h 5 2 0 0 . 0 KHZ 1 09h 5

Vamos a hacerlo en mikroC...

/ *E ne s t ee j e m p l o ,e lm d u l oP W Me s t i n i c i a l i z a d oya j u s t a d op a r ap r o d u c i ru n as e c u e n c i a d ep u l s o sd ec i c l od et r a b a j od e l5 0 % .P a r ae s t ep r o p s i t o ,s eu t i l i z a nl a sf u n c i o n e s P W M 1 _ I n i t ( ) ,P W M 1 _ S t a r t ( )yP W M 1 _ S e t _ D u t y ( ) .T o d a sl a sf u n c i o n e sl a sc o n t i e n el al i b r e r a P W Md e lm i k r o CP R Of o rP I C .S l oe sn e c e s a r i oc o p i a r l a sa lp r o g r a m a* / u n s i g n e ds h o r td u t y _ c ; v o i di n i t M a i n ( ){ A N S E L=A N S E L H=0 ; P O R T C=T R I S C=0 ; P W M 1 _ I n i t ( 5 0 0 0 ) ; } v o i dm a i n ( ){ i n i t M a i n ( ) ; d u t y _ c=1 2 7 ; P W M 1 _ S t a r t ( ) ; / /V a l o ri n i c i a ld e lc i c l od et r a b a j o / /I n i c i a re lm d u l oP W M 1 / /T o d o sl o sp i n e sd eE / Ss ec o n f i g u r a nc o m od i g i t a l e s / /E s t a d oi n i c i a ld el o sp i n e sd es a l i d ad e lp u e r t oP O R T C / /I n i c i a l i z a c i nd e lm d u l oP W M( 5 K H z ) / /D e f i n i rl av a r i a b l ed u t y _ c

P W M 1 _ S e t _ D u t y ( d u t y _ c ) ;/ /A j u s t a re lc i c l od et r a b a j od eP W Ma l5 0 % . . . . . .

Registro CCP1CON

P1M1, P1M0 - PWM Output Configuration bits (bits de configuracin del modo PWM) - El pin P1A es la entrada del mdulo de Captura/Comparacin en todos los modos, menos en modo PWM. Los pines P1B, P1C y P1D actan como los pines de E/S del puerto D. En modo PWM estos bits afectan al funcionamiento del mdulo CCP1 como se muestra en la siguiente tabla:
P1M 1 P1M 0 M O DO PWM con una sla salida 0 0 Por el pin P1A sale una seal modulada. Pines P1B, P1C y P1D son entradas/salidas del puerto D. Configuracin Full Bridge - Forward (puente completo con salida directa) 0 1 Por el pin P1D sale una seal modulada. Por el pin P1D sale una seal modulada. Pines P1B y P1C estn inactivos. Configuracin Half Bridge (medio-puente) 1 0 Por los pines P1A y P1B sale una seal modulada. Pines P1C y P1D son entradas/salidas del puerto D. Configuracin Full Bridge - Reverse (puente completo con salida inversa) 1 1 Por el pin P1B sale una seal modulada. Pin P1C est activo. Pines P1A y P1D estn inactivos.

DC1B1, DC1B0 - PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de PWM) - Se utilizan slo en el modo PWM y representan dos bits menos significativos de un nmero de 10 bits. Este nmero determina el ciclo de trabajo de la seal PWM. Los dems 8 bits se almacenan en el registro CCPR1L. CCP1M3 - CCP1M0 - (bits de seleccin de modo del mdulo CCP1) determina el modo del mdulo CCP1.
CCP1M 3 0 CCP1M 2 0 CCP1M 1 0 CCP1M 0 0 M O DO Mdulo est deshabilitado (reinicio).

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

39/82

4/2/2014
0 0 0 0 0 0 0 1 0 1 1 0

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


1 0 1 0 No utilizado. Modo de comparacin El bit C C P1IF bit se pone a 1 al ocurrir una coincidencia. No utilizado. Modo de captura C ada flanco descendente en el pin C C P1. Modo de captura C ada flanco ascendente en el pin C C P1. Modo de captura C ada cuarto flanco ascendente en el pin C C P1. Modo de captura C ada decimosexto flanco ascendente en el pin C C P1. Modo de comparacin La salida y el bit C C P1IF se ponen a 1 al ocurrir una coincidencia Modo de comparacin 1 0 0 1 La salida se pone a 0 y el bit C C P1IF se pone a 1 al ocurrir una coincidencia. Modo de comparacin 1 0 1 0 Llega la solicitud de interrupcin y el bit C C P1IF se pone a 1 al ocurrir una coincidencia Modo de comparacin 1 0 1 1 El bit C C P1IF se pone a 1, y los registros de temporizadores 1 o 2 se borran al ocurrir una coincidencia Modo PWM 1 1 0 0 Pines P1A y P1C estn activos a nivel alto. Pines P1B y P1D estn activos a nivel alto. Modo PWM 1 1 0 1 Pines P1A y P1C estn activos a nivel alto. Pines P1B y P1D estn activos a nivel bajo. Modo PWM 1 1 1 0 Pines P1A y P1C estn activos a nivel bajo. Pines P1B y P1D estn activos a nivel alto. Modo PWM 1 1 1 1 Pines P1A y P1C estn activos a nivel bajo. Pines P1B y P1D estn activos a nivel bajo.

MDULO CCP2
Con exclusin de los nombres diferentes de los registros y de los bits, este mdulo es una muy buena copia del mdulo CCP1 puesto en modo normal. La nica diferencia significativa entre ellos es el funcionamiento en modo de comparacin del mdulo CCP2. La diferencia se refiere a la seal de reinicio del temporizador T1. Concretamente, si el convertidor A/D est habilitado, al igualarse los valores de los registros TMR1 y CCPR2, la seal de reinicio del temporizador T1 iniciar automticamente la conversin A/D. Similar al mdulo anterior, este circuito tambin est bajo el control de los bits del registro de control. Esta vez es el registro CCP2CON.

Registro CCP2CON

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

40/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

DC2B1, DC2B0 - PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de PWM) - Se utilizan slo en modo PWM y representan dos bits menos significativos de un nmero de 10 bits. Este nmero determina el ciclo de trabajo de la seal PWM. Los dems 8 bits se almacenan en el registro CCPR2L. CCP2M3 - CCP2M0 - CCP2 Mode Select bits (bits de seleccin de modo del mdulo CCP2) determina el modo del mdulo CCP2.
CCP2M 3 0 0 0 0 0 CCP2M 2 0 0 0 0 1 CCP2M 1 0 0 1 1 0 CCP2M 0 0 1 0 1 0 M O DO Mdulo est deshabilitado (reinicio). No utilizado. No utilizado. No utilizado. Modo de Captura C ada flanco descendente en el pin C C P2. Modo de Captura C ada flanco ascendente en el pin C C P2. Modo de Captura 0 1 1 0 C ada cuarto flanco ascendente en el pin C C P2. Modo de Captura C ada decimosexto flanco ascendente en el pin C C P2. Modo de comparacin La salida y el bit C C P2IF se ponen a 1 al ocurrir una coincidencia. Modo de comparacin 1 0 0 1 La salida se pone a 0 y el bit C C P2IF se pone a 1 al ocurrir una coincidencia Modo de comparacin 1 0 1 0 Se produce una interrupcin, el bit C C P2IF se pone a 1 y no hay cambio el pin C C P2 pin al ocurrir una coincidencia. Modo de comparacin 1 0 1 1 Al ocurrir una coincidencia, el bit C C P2IF se pone a 1, los registros del temporizador 1 se borran y la conversin A/D se inicia si el convertidor A/D est habilitado. Modo PWM

Cmo configurar e iniciar el mdulo CCP1 para funcionar en modo PWM?


Para configurar e iniciar el mdulo CCP1 para funcionar en modo PWM, siga los siguientes pasos:

Deshabilitar el pin de salida del CCP1. Deber estar configurado como entrada. Seleccionar el perodo de seal PWM al introducir el valor en el registro PR2. Configurar el mdulo CCP1 para funcionar en modo PWM al combinar los bits del registro CCP1CON. Ajustar el ciclo de trabajo de seal PWM al introducir el valor en el registro CCPR1L y al utilizar los bits DC1B1 y DC1B0 del registro CCP1CON. Configurar e iniciar el temporizador Timer2:
Poner a cero el bit de bandera de interrupcin TMR2IF en el registro PIR1 Ajustar el valor de divisin de frecuencia del temporizador Timer2 por los bits T2CKPS1 y T2CKPS0 del registro T2CON. Iniciar el temporizador Timer2 al poner a uno el bit TMR2ON del registro T2CON.

Habilitar los pines de salida de PWM despus de que haya sido acabado un ciclo de PWM:
Esperar el desbordamiento del temporizador Timer2 (el bit TMR2IF del registro PIR1 se pone a uno) Configurar el pin apropiado como salida al poner a cero el bit en el registro TRIS.

MDULO CCP1 EN MODO MEJORADO


El mdulo CCP1 es el nico que se puede poner en modo mejorado. Este modo bsicamente no difiere del modo normal del CCP1 y la mejora se refiere a la transmisin de la seal PWM a los pines de salida. Por qu es eso tan importante? Por el uso cada vez ms frecuente de los microcontroladores en los sistemas de control de motores elctricos. Aqu no vamos a describir estos dispositivos, sin embrago si tiene la oportunidad de trabajar en el desarrollo de los dispositivos similares, reconocer los elementos que se utilizaban hasta hace poco como los perifricos. Decimos &se utilizaban& porque todos estos elementos ahora estn integrados en el microcontrolador y pueden funcionar en varios modos diferentes.

MODO PWM CON UNA SALIDA


El modo PWM con una salida est habilitado slo en el caso de que se pongan a cero los bits P1M1 y P1M0 en el registro CCP1CON. En tal caso, una seal PWM puede estar disponible simultneamente en como mximo cuatro diferentes pines de salida. Adems, la secuencia de seales PWM puede aparecer en forma de onda bsica o invertida. La distribucin de seales depende de los bits del registro PSTRCON, mientras que su polaridad depende de los bits CCP1M1 y CCP1M0 del registro CCP1CON.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

41/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Si se utiliza una salida invertida, los pines activos a nivel bajo y los pulsos que tienen la misma forma de onda se generan siempre en parejas: en los pines P1A y P1C as como en los pines P1B y P1D, respectivamente.

MODO DE MEDIO-PUENTE
En cuanto al modo de medio-puente, la seal PWM es una salida en el pin P1A, mientras que a la vez la seal complementaria PWM es una salida en el pin P1B. Estos pulsos activan a los controladores MOSFET en modo de Medio-Puente que habilitan/deshabilitan el flujo de corriente por el dispositivo.

En este modo es muy peligroso encender los controladores MOSFET simultneamente (el cortocircuito producido en aquel momento sera fatal). Para evitarlo, es necesario proporcionar un tiempo muerto entre encender y apagar los controladores. Este tiempo muerto est marcado con 'td' (time delay) en la siguiente figura. El problema se resuelve al utilizar los bits PDC0-PDC6 del registro PWM1CON.

Como se muestra en la siguiente figura, el modo de medio-puente se puede utilizar para activar los controladores MOSFET en la configuracin Puente completo:

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

42/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

MODO PUENTE-COMPLETO
Todos los cuatro pines se utilizan como salidas en el modo Puente completo. En la prctica, este modo es utiliza con frecuencia para activar los motores, lo que proporciona un control simple y completo de velocidad y direccin de rotacin. Hay dos configuraciones de este modo: Full Bridge-Forward (puente completo con salida directa) y Full Bridge-Reverse (puente completo con salida inversa).

CONFIGURACIN PUENTE COMPLETO - DIRECTO


En modo Directo ocurre lo siguiente:

Un uno lgico (1) aparece en el pin P1A (pin est activo a nivel alto); Secuencia de pulsos aparece en el pin P1D; y Un cero lgico (0) en los pines P1B y P1C (pines estn activos a nivel bajo).
La siguiente figura muestra el estado de los pines P1A-P1D durante un ciclo PWM completo:

CONFIGURACIN PUENTE COMPLETO - INVERSO


Lo similar ocurre en modo Inverso, a menos que estos pines dispongan de funciones diferentes:

Un uno lgico (1) aparece en el pin P1C (pin est activo a nivel alto); Secuencia de pulsos aparece en el pin P1B; y Un cero lgico (0) aparece en los pines P1A y P1D (pines estn activos a nivel bajo).

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

43/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Registro PWM1CON

STRC PWM Restart Enable bit (Bit de habilitacin del reinicio automtico del PWM) 1 - Despus de un apagado automtico, el mdulo PWM se reinicia automticamente, y el bit ECCPASE del registro ECCPAS se pone a cero. 0 - Para iciar el mdulo PWM despus de un apagado automtico, el bit ECCPASE debe ponerse a cero por software.
PDC6 - PDC0 PWM Delay Count bits (Bits de configuracin del tiempo muerto en el modo PWM) - El nmero binario de 7 dgitos determina el nmero de ciclos de in strucciones (4Tosc) aadidos como tiempo muerto al activar los pines de entrada PWM.

Registro PSTRCON

STRSYNC - Steering Sync bit (bit de sincronizacin de direccin) determina el momento de la direccin de los pulsos de PWM:

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

44/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


1 - La direccin ocurre despus de que el registro PSTRCION haya sido cambiado, slo si se ha completado la forma de onda del PWM. 0 - La direccin ocurre despus de que el registro PSTRCION haya sido cambiado. La seal PWM en la salida del pin ser cambiada inmediatamente sin reparar en si el ciclo anterior ha sido completado. Este procedimiento es til cuando es necesario detener la transmisin de una seal PWM del pin.

STRD - Steering Enable bit D (bit D de habilitacin de direccin) determina la funcin del pin P1D.

1 - El pin P1D tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1. 0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRC Steering Enable bit C (bit C de habilitacin de direccin) determina la funcin del pin P1C.

1 - El pin P1C tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1. 0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRB - Steering Enable bit B (bit B de habilitacin de direccin) determina la funcin del pin P1B.

1 - El pin P1B tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1. 0 - Pin est configurado como entrada/salida general del puerto PORTD.
STRA - Steering Enable bit A (bit A de habilitacin de direccin) determina la funcin del pin P1A.

1 - El pin P1A tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1. 0 - Pin est configurado como entrada/salida general del puerto PORTC.

Registro ECCPAS

ECCPASE - ECCP Auto-Shutdown Event Status bit (bit de estado del apagado automtico) indica si ha ocurrido el apagado automtico del mdulo CCP (estado de Apagado):

1 - Mdulo CCP est en estado de Apagado. 0 - Mdulo CCP funciona normalmente.


ECCPAS2 - ECCPAS0 - ECCP Auto-Shutdown Source Select bits (Bits de seleccin de la fuente de apagado automtico) selecciona la fuente de apagado automtico.
EC C P A S 2 0 0 0 0 1 1 1 1 EC C P A S 1 0 0 1 1 0 0 1 1 EC C P A S 0 0 1 0 1 0 1 0 1 F UENT E DEL ES T A DO DE A P A G A DO Estado del apagado deshabilitado C ambio de salida del comparador C 1 C ambio de salida del comparador C 2 C ambio de salidas de los comparadores C 1 y C 2 C ero lgico (0) en el pin INT C ero lgico (0) en el pin INT o cambio de salida del comparador C 1 C ero lgico (0) en el pin INT o cambio de salida del comparador C 2 C ero lgico (0) en el pin INT o cambio de salidas de los comparadores C 1 y C 2

PSSAC1, PSSAC0 - Pins P1A, P1C Shutdown State Control bits (Bits de configuracin de los pines P1A y P1C en modo de apagado) define el estado lgico de los pines P1A y P1C cuando el mdulo CCP est en el estado de apagado.
PSSAC1 0 0 1 PSSAC0 0 1 X ES T A DO L G I C O DE L O S P I NES 0 1 Alta impedancia (Tri-estado)

PSSBD1, PSSBD0 - Pins P1B, P1D Shutdown State Control bits (Bits de configuracin de los pines P1B y P1D en modo de apagado) define el estado lgico de los pines P1B y P1D cuando el mdulo CCP est en el estado de apagado.
P S S BD1 0 0 1 P S S BD0 0 1 X ES T A DO L G I C O DE L O S P I NES 0 1 Alta impedancia (Tri-estado)

El microcontrolador PIC 16F887 dispone de varios mdulos de comunicacin serie independientes, adems cada uno se puede configurar a funcionar en modos diferentes. Eso es lo que los hace insustituib les en muchos casos. Acurdese de lo que hemos dicho sob re los mdulos CCP ya que lo mismo se aplica aqu. No se preocupe de los detalles del funcionamiento de todos los mdulos, solo seleccione uno y utilice lo que realmente necesita.

3.8 MDULOS DE COMUNICACIN SERIE


El USART es uno de los primeros sistemas de comunicacin serie. Las versiones nuevas de este sistema estn actualizadas y se les denomina un poco diferente - EUSART.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

45/82

4/2/2014
EUSART
El mdulo Transmisor/Receptor Universal

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Sncrono/Asncrono mejorado (Enhanced Universal Synchronous Asynchronous Receiver Transmitter - EUSART) es un perifrico de comunicacin serie de entrada/salida. Asimismo es conocido como Interfaz de comunicacin serie (Serial Communications Interface - SCI). Contiene todos los generadores de seales de reloj, registros de desplazamiento y bfers de datos necesarios para realizar transmisin de datos serie de entrada/salida, independientemente de la ejecucin de programa del dispositivo. Como indica su nombre, aparte de utilizar el reloj para la sincronizacin, este mdulo puede establecer la conexin asncrona, lo que lo hace nico para algunas aplicaciones. Por ejemplo, en caso de que sea difcil o imposible proporcionar canales especiales para transmisin y recepcin de datos y seales de reloj (por ejemplo, mando a distancia de radio o infrarrojas), el mdulo EUSART es definitivamente la mejor opcin posible. El EUSART integrado en el PIC16F887 posee las siguientes caractersticas:

Transmisin y recepcin asncrona en modo Full-duplex; Caracteres de anchura de 8 9 bits programables; Deteccin de direccin en modo de 9 bits; Deteccin de errores por saturacin del bfer de entrada; y Comunicacin Half Duplex en modo sncrono. EUSART EN MODO ASNCRONO
El EUSART transmite y recibe los datos utilizando la codificacin de no retorno a cero - NRZ (non-return-to-zero). Como se muestra en la siguiente figura, no se utiliza una seal de reloj y los datos se transmiten de forma muy simple:

Cada dato se transmite de la siguiente forma:

En estado inactivo la lnea de datos permanece en estado alto (1); Cada transmisin de datos comienza con un bit de arranque (START), el cual, siempre es cero (0); Cada dato tiene un ancho de 8 o 9 bits (primero se transmite el bit menos significativo - LSB); y Cada transmisin de datos termina con un bit de parada (STOP), el cual, siempre es uno (1) La siguiente figura muestra cmo conectar de manera habitual un microcontrolador PIC que utiliza el mdulo EUSART. El circuito RS-232 se utiliza como un convertidor de nivel de voltaje.
Figure below shows a common way of connecting PIC microcontroller that uses EUSART module. The RS-232 circuit is used as a voltage level converter.

EUSART EN MODO DE TRANSMISOR ASNCRONO

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

46/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Para habilitar la transmisin de datos por medio del mdulo EUSART, es necesario configurarlo para que funcione como un transmisor. En otras palabras, es necesario definir el estado de los siguientes bits:

TXEN = 1 - El transmisor EUSART se habilita al poner a uno el bit TXEN del registro TXSTA. SYNC = 0 - El EUSART se configura a funcionar en modo asncrono al poner a cero el bit SYNC del registro TXSTA. SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART est habilitado y el pin TX/CK se configura automticamente como salida. Si el bit se utiliza simultneamente para alguna funcin analgica, se debe deshabilitar al poner a cero el bit correspondiente del registro ANSEL.
La parte central del transmisor EUSART ocupa el registro de desplazamiento TSR que no est directamente disponible al usuario. Para iniciar la transmisin de datos, el mdulo debe estar habilitado al poner a uno el bit TXEN del registro TXSTA. Los datos a enviar se deben escribir en el registro TXREG, lo que resultar en la siguiente secuencia de eventos:

Byte ser transmitido inmediatamente al registro de desplazamiento TSR; El registro TXREG permanece vaco, lo que indica la bandera de bit TXIF del registro PIR1. Si se pone a uno el bit TXIE del registro PIE1, se generar una interrupcin. De todos modos, la bandera se pone a uno sin reparar en si una interrupcin est habilitada o no y no se puede poner a cero por software, sino al escribir un dato nuevo en el registro TXREG. Dispositivos electrnicos de control "empujan" el dato hacia el pin TX en sincronizacin con seal de reloj interna: bit de arranque (START) (1).....datos....bit de parada (STOP) (1). Cuando el ltimo bit abandona el registro TSR, el bit TRMT en el registro TXSTA se pone a cero automticamente. Si mientras tanto se escribe un dato nuevo en el registro TXREG, todo el procedimiento se repite inmediatamente despus de la transmisin del bit de parada del dato anterior.
Para transmitir un dato de 9 bits es necesario poner a uno el bit TX9 del registro TXSTA. El bit TX9D del registro TXSRTA es el noveno bit y el ms significativo. Al transmitir un dato de 9 bits, el bit de datos TX9D deber estar escrito antes de que de se escriban los 8 bits menos significativos en el registro TXREG. Todos los nueve bits de datos se transmiten al registro de desplazamiento TFR inmediatamente despus de que se acabe la escritura en el registro TXREG.

EUSART EN MODO DE RECEPTOR ASNCRONO

Similar al poner en marcha el transmisor del EUSART, para habilitar el receptor es necesario configurar los siguientes bits:

CREN = 1 - El receptor EUSART se habilita al poner a uno el bit CREN del registro RCSTA; SYNC = 0 - El EUSART se configura a funcionar en modo asncrono al poner a cero el bit SYNC del registro TXSTA; y SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART est habilitado y el pin RX/DT se configura automticamente como salida. Si el bit se utiliza simultneamente para alguna funcin analgica, se debe desha

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

47/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


bilitar al poner a cero el bit correspondiente del registro ANSEL.

Despus de que se haya terminado el primer paso necesario y se haya detectado el bit de arranque (START), el dato se transmite al registro de desplazamiento RSR por el pin RX. Al haber recibido el bit de parada (STOP), ocurre lo siguiente:

El dato se transmite automticamente al registro RCREG (si est vaco); El bit de bandera RCIF se pone a uno y ocurre una interrupcin si est habilita da por el bit RCIE en el registro PIE1. Similar al transmisor, el bit de bandera se pone a cero slo por software, o sea, al leer el registro RCREG. Tenga en cuenta que esto es un doble registro de tipo FIFO (primero en entrar, primero en salir - first-in, first-out), lo que permite almacenamiento de dos caracteres simultneamente); Si el registro RCREG est ocupado (contiene dos bytes) y el registro de desplazamiento detecta el nuevo bit de parada (STOP), el bit de sobrescritura OERR se pondr a uno. En tal caso se pierde un dato nuevo que viene, y el bit OERR debe ponerse a cero por software al poner a cero y luego al poner a uno el bit CREN; Nota: No es posible recibir un dato nuevo sino hasta que el bit OERR est a uno. Si el bit de parada (STOP) est a cero (0), el bit FERR del registro RCSTA estar a uno, lo que indica un error en recepcin; y Para habilitar la recepcin de un dato de 9 bits, es necesario poner a uno el bit RX9 del registro RCSTA. DETECCIN DE ERRORES EN RECEPCIN
El microcontrolador puede detectar automticamente dos tipos de errores. El primero es denominado error de encuadre (Framing error). Ocurre cuando el receptor no detecta el bit de parada en un intervalo predeterminado de tiempo. Este error se indica mediante el bit FERR del registro RCSTA. Si el bit est a uno, el ltimo dato recibido puede ser incorrecto. Cabe destacar lo siguiente:

El error de encuadre no genera por si mismo una interrupcin; Si el bit est a uno, el ltimo dato recibido contiene un error; El error de encuadre (bit est a uno) no impide la recepcin de un dato nuevo; El bit FERR se pone a cero al leer el dato recibido, lo que significa que se debe hacer una verificacin antes de leer el dato; y El bit FERR no se puede poner a cero por software. Si es necesario, se puede borrar al poner a cero al bit SPEN del registro RCSTA, lo cual, simultneamente causa una reinicializacin del sistema EUSART.
Otro tipo de error es denominado error de sobrescritura (Overrun Error). Como hemos mencionado anteriormente, el registro de tipo FIFO puede almacenar slo dos caracteres. Un error de sobrescritura ocurre cuando el registro recibe el tercer carcter. Simplemente no hay espacio para almacenar un byte ms, por lo que un error es inevitable. Cuando ocurre este error, el bit OERR del registro RCSTA se pone a uno. Las consecuencias son las siguientes:

Los datos almacenados en los registros FIFO (2 bytes) se pueden leer normalmente; No se recibirn ms datos hasta que el bit OERR est puesto a cero; y A este bit no se le puede acceder directamente. Para borrarlo, es necesario poner a cero el bit CREN del registro RCSTA o reiniciar el sistema EUSART al poner a cero al bit SPEN del registro RCSTA. RECEPCIN DE DATOS DE 9 BITS
Aparte de recibir los datos de forma estndar de 8 bits, el sistema EUSART soporta la recepcin de datos de 9 bits. En el lado del transmisor, el noveno bit se adjunta al byte original directamente antes del bit de parada. En el lado del receptor, al poner a uno el bit RX9 del registro RCSTA, el noveno bit de datos ser automticamente escrito en el bit RX9D del mismo registro. Despus de almacenar este byte, es necesario tener cuidado en como leer estos bits - primero se debe leer el bit RX9D y luego los ocho (8) bits menos significativos del registro RCREG. De otra forma, el noveno bit ser puesto a cero antes de ser ledo.

DETECCIN DE DIRECCIN
Cuando el bit ADDEN del registro RCSTA est a uno, el modulo EUSART es capaz de recibir slo los datos de 9 bits, mientras que se ignoran todos los datos de 8 bits. Aunque parece una restriccin, este modo habilita la comunicacin serial entre varios microcontroladores. El principio de funcionamiento es muy simple. El dispositivo maestro enva un dato de 9 bits que representa la direccin de un microcontrolador esclavo. No obstante, todos deben tener el bit ADDEN puesto a uno, ya que de esta manera se habilita

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

48/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

la deteccin de direccin. Todos los microcontroladores esclavos que comparten la misma lnea de transmisin, reciben este dato (direccin) y verifican automticamente si coincide con su propia direccin. El software, en el que ocurre la coincidencia de direccin, debe deshabilitar la deteccin de direccin, poniendo a cero el bit ADDEN.

El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador. Todos los datos que pasan por la lnea de transmisin sern recibidos slo por el mdulo EUSART direccionado. Una vez recibido el ltimo byte, el microcontrolador esclavo debe poner a uno el bit ADDEN para habilitar de nuevo la deteccin de direccin.

Registro TXSTA

CSRC - Clock Source Select bit - (bit de seleccin de la fuente de reloj) determina la fuente del reloj. Se utiliza slo en modo sincrnico.

1 - Modo Maestro. Reloj generado internamente por el generador de tasa de baudios. 0 - Modo Esclavo. Reloj proveniente de una fuente externa.
TX9 - 9-bit Transmit Enable bit (bit de habilitacin del modo de 9 bits en transmisin)

1 - Se habilita el modo de 9 bits en transmisin por el sistema EUSART. 0 - Se habilita el modo de 8 bits en transmisin por el sistema EUSART.
TXEN - Transmit Enable bit (Bit de habilitacin de transmisin)

1 - Transmisin habilitada. 0 - Transmisin deshabilitada.


SYNC - EUSART Mode Select bit (Bit de seleccin del modo EUSART)

1 - El EUSART funciona en modo sncrono. 0 - El EUSART funciona en modo asncrono.


SENDB - Send Break Character bit (Bit de envo de carcter Break en modo asncrono) se utiliza slo en modo asncrono y cuando se requiere obedecer el estndar de bus LIN.

1 - Se enviar un carcter Break en la prxima transmisin (se pone a 0 por hardware cuando finaliza el envo). 0 - Envo del carcter de transmisin Break completado.
BRGH - High Baud Rate Select bit (bit de seleccin de modo de alta velocidad en modo asncrono). Determina la velocidad de transmisin en modo sncrono. No afecta al EUSART en modo sncrono.

1 - EUSART funciona a alta velocidad.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

49/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


0 - EUSART funciona a baja velocidad.

TRMT - Transmit Shift Register Status bit (bit de estado de registro de desplazamiento de transmisin)

1 - Registro TSR est vaco. 0 - Registro TSR est lleno.


TX9D - Ninth bit of Transmit Data (Valor del noveno bit en transmisin) Puede ser utilizado como direccin o bit de paridad o para distinguir entre direccin o dato en los buses maestro-esclavo).

Registro RCSTA

SPEN - Serial Port Enable bit (bit de habilitacin del puerto serie)

1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran automticamente como entrada y salida, respectivamente. 0 - Puerto serie deshabilitado.
RX9 - (bit de habilitacin del modo de 9 bits en recepcin):

1 - Se habilita la recepcin de datos de 9 bits por medio del sistema EUSART. 0 - Se habilita la recepcin de datos de 8 bits por medio del sistema EUSART.
SREN - Single ReceiveEnable bit (bit de habilitacin de la recepcin simple). Es utilizado slo en modo sincrnico y en funcionamiento como Maestro.

1 - Recepcin simple habilitada. 0 - Recepcin simple deshabilitada.


CREN - Continuous Receive Enable bit (bit de habilitacin de la recepcin continua) acta dependiendo del modo EUSART. Modo asncrono:

1 - Recepcin habilitada. 0 - Recepcin deshabilitada.


Modo sncrono:

1 - Se habilita la recepcin continua hasta que el bit CREN est a cero. 0 - No se habilita la recepcin en forma continua.
ADDEN - Address Detect Enable bit (bit de habilitacin de la deteccin de direccin) se utiliza slo en modo de detectar la direccin.

1 - Habilita la deteccin de direccin (slo se procesa un byte recibido en el registro de desplazamiento de recepcin si el noveno bit est a uno) 0 - Deteccin de direccin deshabilitada (todos los bytes recibidos en el registro de desplazamiento de recepcin son procesados independientemente del valor del noveno bit recibido). El noveno bit se utiliza como bit de paridad.
FERR - Framing Error bit (bit de error de encuadre)

1 - Se ha producido un error de encuadre en recepcin. 0 - No se ha producido un error de encuadre.


OERR - Overrun Error bit (bit de error de sobrescritura).

1 - Se ha producido un error de sobrescritura en recepcin. 0 - No se ha producido un error de sobrescritura.


RX9D - Ninth bit of Received Data No se ha producido un error de sobrescritura.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

50/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

GENERADOR DE BAUDIOS DEL EUSART (BRG)


Si mira atentamente al diagrama del receptor o transmisor EUSART asncrono, ver que los ambos utilizan seal de reloj del temporizador local BRG para la sincronizacin. La misma fuente de reloj se utiliza tambin en modo sncrono. El temporizador BRG consiste en dos registros de 8 bits haciendo un registro de 16 bits.

El valor de un nmero escrito en estos dos registros determinar la velocidad de transmisin en baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL, afectan la frecuencia de reloj utilizada para el clculo de los baudios. El valor de un nmero escrito en estos dos registros determinar la velocidad de transmisin en baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL, afectan la frecuencia de reloj utilizada para el clculo de los baudios.
BI T S SYNC 0 0 0 0 1 1 BRG1G 0 0 1 1 0 1 BRGH 0 1 0 1 X X de 8 bits /asncrono de 8 bits / asncrono de 16 bits / asncrono de 16 bits / asncrono de 8 bits / sncrono de 16 bits / sncrono Fosc / [64 (n + 1)] Fosc / [16 (n + 1)] Fosc / [16 (n + 1)] Fosc / [4 (n + 1)] Fosc / [4 (n + 1)] Fosc / [4 (n + 1)]

M O DO BRG / EUS A RT

F RM UL A DE V EL O C I DA D DE T RA NS M I S I N EN BA UDI O S

Las tablas en las siguientes pginas contienen los valores que deben estar escritos en el registro de 16 bits SPBRG y asignados a los bits SYNC, BRGH y BRGH16 para obtener algunos valores de la velocidad de transmisin en baudios estndar. La frmula para hacer el clculo de la velocidad de transmisin en baudios:

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

51/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Registro BAUDCTL

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

52/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

ABDOVF - Auto-Baud Detect Overflow bit (bit de desbordamiento de auto-deteccin de la velocidad de transmisin) se utiliza slo en modo asncrono durante la deteccin de la velocidad de transmisin.

1 - Se ha producido desbordamiento durante la auto-deteccin. 0 - No se ha producido desbordamiento durante la auto-deteccin.


RCIDL - Receive Idle Flag bit No se ha producido desbordamiento durante la auto-deteccin.

1 - Receptor en estado inactivo. No hay operacin de recepcin en marcha. 0 - Se ha recibido el bit de arranque (START) y hay una operacin de recepcin en marcha.
SCKP - Synchronous Clock Polarity Select bit. (bit de seleccin de polaridad de la seal de reloj en modo sncrono). El estado lgico de este bit difiere dependiendo de cul modo de EUSART est activo Modo asncrono:

1 - El dato invertido se transmite al pin RC6/TX/CK. 0 - El dato no invertido se transmite al pin RC6/TX/CK.
Modo sncrono:

1 - Sincronizacin en el flanco ascendente de la seal de reloj. 0 - Sincronizacin en el flanco descendente de la seal de reloj.
BRG16 16-bit Baud Rate Generator bit - (bit de habilitacin del generador de velocidad de transmisin de 16 bits) determina si el registro SPBRGH se utilizar, o sea si el temporizador BGRG tendr 8 o 16 bits.

1 - Se utiliza el generador de velocidad de transmisin de 16 bits 0 - Se utiliza el generador de velocidad de transmisin de 8 bits
WUE Wake-up Enable bit (bit de habilitacin del modo de auto-activacin en modo asncrono):

1 - Modo de auto-activacin habilitado. El receptor espera a que el flanco descendente aparezca en el pin RC7/RX/DT para que el microcontrolador se despierte del modo de reposo. 0 - Modo de auto-activacin habilitado. El receptor funciona normalmente.
ABDEN - Auto-Baud Detect Enable bit (bit de habilitacin de auto-deteccin de velocidad de transmisin) se utiliza slo en modo asncrono.

1 - Modo de auto-deteccin habilitado. Al detectar la velocidad de transmisin, el bit se pone a uno automticamente. 0 - Modo de auto-deteccin deshabilitado.
Vamos a hacerlo en mikroC...

/ *E ne s t ee j e m p l o ,e lm d u l oE U S A R Ti n t e r n os ei n i c i a l i z ays ea j u s t ap a r ae n v i a re l m e n s a j ei n m e d i a t a m e n t ed e s p u sd er e c i b i r l o .L av e l o c i d a dd et r a n s m i s i ne nb a u d i o ss e a j u s t aa9 6 0 0b p s .E lp r o g r a m au t i l i z al a ss i g u i e n t e sr u t i n a sd el i b r e r aU A R T : U A R T 1 _ i n i t ( ) ,U A R T 1 _ W r i t e _ T e x t ( ) ,U A R T 1 _ D a t a _ R e a d y ( ) ,U A R T 1 _ W r i t e ( )yU A R T 1 _ R e a d ( ) . * / c h a ru a r t _ r d ; v o i dm a i n ( ){ A N S E L=A N S E L H=0 ; C 1 O N _ b i t=C 2 O N _ b i t=0 ; U A R T 1 _ I n i t ( 9 6 0 0 ) ; D e l a y _ m s ( 1 0 0 ) ; U A R T 1 _ W r i t e _ T e x t ( " S t a r t " ) ; w h i l e( 1 ){ i f( U A R T 1 _ D a t a _ R e a d y ( ) ){ u a r t _ r d=U A R T 1 _ R e a d ( ) ; U A R T 1 _ W r i t e ( u a r t _ r d ) ; } } } / /B u c l ei n f i n i t o / /S ie ld a t os eh ar e c i b i d o , / /l e ae ld a t or e c i b i d o / /ye n v e l oa t r sp o re lU A R T / /T o d o sl o sp i n e ss ec o n f i g u r a nc o m od i g i t a l e s / /D e s h a b i l i t a rl o sc o m p a r a d o r e s / /I n i c i a l i z a re lm d u l oU A R Ta9 6 0 0b p s / /E s p e r a raq u es e a ld er e l o jd e lm d u l oU A R Ts e / /p o n g ae s t a b l e

Transmisin serial asncrona a travs de los registros del mdulo EUSART 1. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG. 2. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

53/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

3. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG. 4. La transmisin de datos es habilitada poniendo a uno el bit TXEN del registro TXSTA. El bit TXIF del registro PIR1 est automticamente puesto a uno. 5. Para que el bit TXEN cause una interrupcin, tanto el bit TXIE del registro PIE1 como los bits GIE, PEIE del registro INTCON debern estar puestos a uno. 6. En una transmisin de datos de 9 bits, el valor del noveno bit deber estar escrito en el bit TX9D del registro TXSTA. 7. La transmisin comienza cuando se escribe el dato de 8 bits sobre el registro de recepcin TXREG. Recepcin serial asncrona a travs de los registros del mdulo EUSART: 1. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG. 2. El bit SYNC (del registro TXSTA) deber estar puesto a cero y el bit SPEN (del registro RCSTA) deber estar puesto a uno a fin de habilitar el puerto serie. 3. Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON debern estar puestos a uno si se necesita habilitar que la recepcin de dato cause una interrupcin. 4. Para una recepcin de datos de 9 bits, el bit RX9 (del registro RCSTA) deber estar puesto a uno 5. La recepcin de datos es habilitada poniendo a uno el bit CREN del registro RCSTA. 6. El registro RCSTA deber leerse para obtener informacin acerca de la ocurrencia de errores durante la recepcin. El valor del noveno bit ser almacena do en este registro en la recepcin de datos de 9 bits. 7. El dato de 8 bits recibido ser almacenado en el registro RCREG y deber leerse para obtener dicho dato. Ajustar el modo de deteccin de direccin: 1. La velocidad de transmisin deseada deber estar ajustada a travs de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG. 2. El bit SYNC (del registro TXSTA) deber estar puesto a cero y el bit SPEN (del registro RCSTA) deber estar puesto a uno (1) a fin de habilitar el puerto serie. 3. Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON debern estar puestos a uno si se necesita habilitar que la recepcin de dato cause una interrupcin. 4. El bit RX9 del registro RCSTA debe estar a uno. 5. El bit ADDEN del registro RCSTA debe estar a uno, lo que habilita que un dato sea reconocido como direccin. 6. La recepcin de datos es habilitada poniendo a uno el bit CREN del registro RCSTA. 7. Tan pronto como se reciba un dato de 9 bits, el bit RCIF del registro PIR1 estar automticamente puesto a uno. Si est habilitada se produce una interrupcin. 8. El registro RCSTA deber leerse para obtener informacin acerca de la ocurrencia de errores durante la transmisin. El noveno bit RX9D siempre estar a uno. 9. El dato de 8 bits recibido ser almacenado en el registro RCREG y deber leerse. Se deber comprobar si la combinacin de estos bits coincide con la direccin predefinida. Si coincide, es necesario poner a cero el bit ADDEN del registro RCSTA, lo que habilita la recepcin de datos de 8 bits.

MDULO PUERTO SERIE SNCRONO MAESTRO (MSSP)


El MSSP (Puerto serie sncrono maestro - Master Synchronous Serial Port) es un mdulo muy til, y a la vez uno de los circuitos ms complejos dentro del microcontrolador. Este mdulo permite la comunicacin de alta velocidad entre un microcontrolador y otros perifricos u otros microcontroladores al utilizar varias lneas de E/S (como mximo dos o tres lneas). Por eso, se utiliza con frecuencia para conectar el microcontrolador a los visualizadores LCD, los convertidores A/D, las memorias EEPROM seriales, los registros de desplazamiento etc. La caracterstica principal de este tipo de comunicacin es que es sncrona y adecuada para ser utilizada en sistemas con un slo maestro y uno o ms esclavos. Un dispositivo maestro contiene un circuito para generacin de baudios y adems, suministra seales de reloj a todos los dispositivos del sistema. Los dispositivos esclavos no disponen de un circuito interno para generacin de seales de reloj. El mdulo MSSP puede funcionar en uno de dos modos:

modo SPI (Interfaz perifrica serial - Serial Peripheral Interface); y modo I2C (Circuito inter-integrado - Inter-Integrated Circuit).
Como se muestra en la siguiente figura, un mdulo MSSP representa slo una mitad de un hardware necesario para establecer una comunicacin serial, mientras que la otra mitad se almacena en el dispositivo con el que intercambia los datos. Aunque los mdulos en ambas puntas de lnea son los mismos, sus modos de funcionamiento difieren esencialmente dependiendo de si el mdulo funciona como Maestro o como Esclavo: Si el microcontrolador a ser programado controla otro dispositivo o circuito (perifricos), deber funcionar como un dispositivo maestro. Este mdulo generar seal de reloj cuando sea necesario, o sea slo cuando se requiera recibir y transmitir los datos por software. Por consiguiente, el establecimiento de conexin depende nicamente del dispositivo maestro.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

54/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

De lo contrario, si el microcontrolador a ser programado est integrado en un dispositivo ms complejo (por ejemplo en una PC), deber funcionar como un dispositivo esclavo. Como tal, un esclavo siempre tiene que esperar a que un dispositivo maestro enve la solicitud de transmisin de datos.

MODO SPI
El modo SPI permite la transmisin y recepcin simultnea de datos de 8 bits al utilizar tres lneas de entrada/salida

SDO - Serial Data Out (salida de datos serie )- lnea de transmisin; SDI - Serial Data In (entrada de datos serie) - lnea de recepcin; y SCK - Serial Clock (reloj de comunicacin) - lnea de sincronizacin.
Adicionalmente, hay una cuarta lnea (SS) que se puede utilizar si el microcontrolador intercambia los datos con varios dispositivos perifricos. Refirase a la siguiente figura. SS - Slave Select (Seleccin de esclavo) - Es una lnea adicional utilizada para la seleccin de un dispositivo especfico. Esta lnea est activa slo si el microcontrolador funciona como esclavo, o sea cuando el dispositivo externo - maestro requiere intercambiar los datos. Al funcionar en modo SPI, el mdulo MSSP utiliza 4 registros en total:

SSPSTAT - registro de estado SSPCON - registro de control SSPBUF - bfer serie de transmisin/recepcin SSPSR - registro de desplazamiento (no es accesible directamente)
Los primeros tres registros son de lectura/escritura y se pueden modificar en cualquier momento, mientras que el cuarto, como no es accesible, se utiliza para convertir datos en formato serial.

Como se muestra en la siguiente figura, la parte central del mdulo SPI consiste de dos registros conectados a los pines para recepcin, transmisin y sincronizacin.

El registro de desplazamiento (SSPRS) est directamente conectado a los pines del microcontrolador y es utilizado para transmisin de datos en formato serie. El registro SSPRS dispone de la entrada y salida para desplazar los datos hacia dentro y hacia fuera del dispositivo. En otras palabras, cada bit que aparece en la entrada (lnea de recepcin) desplaza simultneamente otro bit hacia la salida (lnea de transmisin). El registro SSPBUF (Bfer) es una parte de memoria utilizada para almacenar temporalmente los datos antes de que se enven, o sea

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

55/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

inmediatamente despus de que se reciban. Despus de que todos los 8 bits hayan sido recibidos, el byte se mueve del registro SSPRS al registro SSPBUF. Este proceso de crear un doble bfer para recibir los datos permite iniciar la recepcin del prximo byte antes de leer los datos que se acaban de recibir. Durante la transmisin/recepcin de datos se ignora un intento de escribir un dato en el registro SSBUF. Desde el punto de vista de un programador, este registro se considera el ms importante por haber sido accedido con ms frecuencia. Concretamente, si dejamos aparte el ajuste del modo de funcionamiento, la transmisin de datos por el mdulo SPI no es nada ms que escritura y lectura de datos de este registro, mientras que las dems acrobacias como mover los registros, se llevan a cabo automticamente por el hardware. Vamos a hacerlo en mikroC...

/ *E ne s t ee j e m p l o ,e lm i c r o c o n t r o l a d o rP I C( m a e s t r o )e n v au nb y t ed ed a t o sau nc h i p p e r i f r i c o( e s c l a v o )p o re lm d u l oS P I .E lp r o g r a m au t i l i z al a sf u n c i o n e sd el i b r e r a S P IS P I 1 _ i n i t ( )yS P I 1 _ W r i t e .* / s b i tC h i p _ S e l e c ta tR C 0 _ b i t ; / /p e r i f r i c oS e l e c c i n _ d e _ c h i p s b i tC h i p _ S e l e c t _ D i r e c t i o na tT R I S C 0 _ b i t ;/ /B i tT R I S C 0d e f i n ee lp i nR C 0c o m oe n t r a d aos a l i d a u n s i g n e di n tv a l u e ; v o i dm a i n ( ){ A N S E L=A N S E L H=0 ; C h i p _ S e l e c t=0 ; C h i p _ S e l e c t _ D i r e c t i o n=0 ; S P I 1 _ I n i t ( ) ; S P I 1 _ W r i t e ( v a l u e ) ; . . . / /D a t oas e re n v i a d oe sd et i p ou n s i g n e di n t / /P i nR C 0e su np i nd es e l e c c i o n a re lc h i p

/ /T o d o sl o sp i n e sd eE / Ss o nd i g i t a l e s / /S e l e c c i o n a re lc h i pp e r i f r i c o / /C o n f i g u r a re lp i nC S #c o m os a l i d a / /I n i c i a l i z a re lm d u l oS P I / /E n v a re lv a l o ra lc h i pp e r i f r i c o

T R I S B 0 _ b i t=T R I S B 1 _ b i t=1 ;/ /C o n f i g u r a rl o sp i n e sR B 0 ,R B 1c o m oe n t r a d a s

Comunicacin serial sncrona SPI


Antes de inicializar el mdulo SPI, es necesario especificar varias opciones:

Modo maestro TRISC.3=0 (pin SCK es salida de seal de reloj); Modo de esclavo TRISC.3=1 (pin SCK es entrada de seal de reloj); Fase de datos de entrada - la mitad o el final del tiempo de salida (bit SMP del registro SSPSTAT ); Flanco de reloj (bit CKE del registro SSPSTAT); Velocidad de transmisin en baudios, los bits SSPM3-SSPM0 del registro SSPCON (slo en modo Maestro); Seleccin de modo esclavo, bits SSPM3-SSPM0 del registro SSPCON (slo en modo Esclavo)
El mdulo se pone en marcha al poner a uno el bit SSPEN: Paso 1. Los datos a ser transmitidos debern ser escritos en el registro del bfer SSPBUF. Si el mdulo SPI funciona en modo maestro, el microcontrolador ejecutar automticamente la secuencia de los siguientes pasos 2,3 y 4. Si el mdulo SPI funciona en modo esclavo, el microcontrolador no ejecutar la secuencia de los siguientes pasos hasta que el pin SCK detecte seal de reloj.

Paso 2. El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no se borra.

Paso 3. El dato se desplaza hacia el pin de salida (primero se desplaza el bit ms significativo - MSB), mientras que a la vez el registro se carga con los bits por el pin de entrada. En modo maestro el microcontrolador en si mismo genera seal de reloj, mientras que el modo esclavo utiliza seal de reloj externa (pin SCK). Paso 4. El registro SSPSR est lleno despus de que hayan sido recibidos 8 bits de datos, lo que se indica al poner a uno el bit BF del registro SSPSTAT y el bit SSPIF del registro PIR1. Los datos recibidos (un byte) son automticamente movidos del registro SSPSR al registro SSPBUF. Como la transmisin de datos serial se realiza automticamente, el resto de programa se ejecuta normalmente mientras que la transmisin de datos est en progreso. En este caso, la funcin del bit SSPIF es de generar una interrupcin al acabar la transmisin de un byte. Paso 5. Por ltimo, el dato almacenado en el registro SSPBUF est listo para su uso y debe moverse al registro deseado.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

56/82

4/2/2014
Modo I2C

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

El modo I2 C (Bus de circuito inter-integrado) es adecuado para ser utilizado cuando el microcontrolador debe intercambiar los datos con un circuito integrado dentro de un mismo dispositivo. stos son con frecuencia otros microcontroladores, o los circuitos integrados especializados y baratos que pertenecen a la nueva generacin de as llamados "perifricos inteligentes" (memorias, sensores de temperatura, relojes de tiempo real etc.) Similar a la comunicacin serie en modo SPI, la transmisin de datos en modo I2C es sncrona y bidireccional. Esta vez slo dos pines se utilizan para transmisin de datos. stos son los pines de SDA (Datos seriales) y SCL (Reloj serial). El usuario debe configurar estos pines como entradas o salidas por los bits TRISC. Al observar las reglas particulares (protocolos), este modo habilita conectar simultneamente de una manera simple hasta 112 diferentes componentes al utilizar slo dos valiosos pines de E/S. Vamos a ver cmo funciona el sistema: El reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre es generado por un dispositivo maestro (un microcontrolador) y su frecuencia directamente afecta a la velocidad de transmisin de datos. Aunque hay un protocolo que permite como mximo una frecuencia de reloj de 3,4 MHz (as llamado bus I2C de alta velocidad), este libro cubre slo el protocolo utilizado con ms frecuencia, con una frecuencia de reloj limitada a 100 KHz. La frecuencia mnima no est limitada. Cuando los componentes maestro y esclavo estn sincronizados por el reloj, el maestro siempre inicia cada intercambio de datos. Una vez que el mdulo MSSP se ha habilitado, espera que ocurra una condicin de arranque (Start condition). El dispositivo maestro primero enva el bit de arranque (est a cero) por el pin SDA, luego la direccin de 7 bits del dispositivo esclavo seleccionado, y por ltimo, el bit que requiere al dispositivo escribir (0) o leer (1) el dato enviado. En otras palabras, los ocho bits se desplazan al registro SSPSR despus de ocurrir una condicin de arranque. Todos los dispositivos esclavos que comparten la misma lnea de transmisin recibirn simultneamente el primer byte, pero slo el que contiene la direccin coincidente recibir el dato entero.

Una vez que el primer byte se ha enviado (slo se transmiten datos de 8 bits), el maestro se pone en modo de recepcin y espera el reconocimiento del dispositivo receptor acerca de la direccin coincidente. Si el dispositivo esclavo enva un bit de reconocimiento (1) la transmisin de datos continuar hasta que el dispositivo maestro (microcontrolador) enve el bit de parada (Stop).

Esto es una explicacin simple de cmo se comunican dos componentes. Este microcontrolador es capaz de controlar las situaciones ms complicadas cuando estn conectados 1024 diferentes componentes (direccin de 10 bits), compartidos por varios dispositivos maestros diferentes. Por supuesto, estos dispositivos se utilizan pocas veces en la prctica por lo que no es necesario hablar de ellos detalladamente. La siguiente figura muestra el diagrama de bloques del mdulo MDSSP en modo I2 C.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

57/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

En una operacin I2 C con el mdulo MSSP intervienen seis registros. Algunos de ellos se muestran en la Figura anterior.

SSPCON SSPCON2 SSPSTAT SSPBUF SSPSR SSPADD

Registro SSPSTAT

SMP Sample bit (Bit de muestra) Modo maestro SPI - Este bit determina fase de datos de entrada.

1 - Estado lgico se lee al final del tiempo de salida. 0 - Estado lgico se lee en la mitad del tiempo de salida.
Modo esclavo SPI - Este bit debe ser borrado cuando SPI se emplea en modo esclavo. Modo IC (maestro o esclavo)

1 - Deshabilita control de variaciones para velocidad estndar (100kHz). 0 - Habilita control de variaciones para velocidad alta (400k Hz).
CKE - Clock Edge Select bit (bit de seleccin del flanco de reloj) selecciona el modo de sincronizacin. CKP = 0:

1 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1). 0 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
CKP = 1:

1 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0). 0 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
D/A - Data/Address bit (bit de direcciones/datos) se utiliza slo en modo I2 C.

1 - Indica que el ltimo byte recibido o transmitido es un dato.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

58/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


0 - Indica que el ltimo byte recibido o transmitido es una direccin.

P - Stop bit (bit de parada) se utiliza slo en modo IC.

1 - Bit de parada (STOP) se ha detectado. 0 - Bit de parada (STOP) no se ha detectado.


S - Start bit (bit de arranque) se utiliza slo en modo I2C.

1 - Bit de arranque (START) se ha detectado. 0 - Bit de arranque (START) no se ha detectado.


R/W - Read Write bit (bit de informacin Lectura/Escritura) se utiliza slo en modo I2 C. Este bit contiene la informacin del bit de L/E despus de la ltima direccin coin cidente. Este bit es vlido slo desde la direccin coincidente hasta el siguiente bit de arranque, bit de parada o bit no ACK. Modo IC en modo esclavo

1 - Lectura de dato. 0 - Escritura de dato.


Modo IC en modo esclavo

1 - Transmisin en progreso. 0 - Transmisin no est en progreso.


UA - Update Address bit (bit de activacin de direccin) se utiliza slo en modo I2 C de 10 bits.

1 - Indica que es necesario actualizar la direccin en el registro SSPADD. 0 - Indica que la direccin es correcta y que no se necesita actualizarla.
BF Buffer Full Status bit (bit de estado de bfer lleno) Durante la recepcin de dato (en modos SPI e IC)

1 - Recepcin completa. El registro SSPBUF est lleno. 0 - Recepcin no completa. El registro SSPBUF est vaco.
Durante la transmisin de dato (slo en modo IC)

1 - Transmisin de dato en progreso (no incluye el bit ACK y bits de parada). 0 - Transmisin de dato completa (no incluye el bit ACK y bits de parada).

Registro SSPSTAT

WCOL Write Collision Detect bit (bit detector de colisin)

1 - Colisin detectada. En el registro SSPBUF se ha escrito cuando no se han cumplido las condiciones para iniciar una transmisin. 0 - No hay colisin.
SSPOV Receive Overflow Indicator bit (bit detector de desbordamiento en recepcin)

1 - Se recibe un nuevo byte cuando el registro SSPBUF an mantiene los datos ante riores. Como no hay espacio para recibir datos nuevos, uno de estos dos bytes debe ser borrado. En este caso, los datos almacenados en el registro SSPSR se pierden irremediablemente. 0 - Dato serial es recibido correctamente.
SSPEN - Synchronous Serial Port Enable bit (bit de habilitacin del mdulo SSP - puerto serie sncrono) determina la funcin de los pines del microcontrolador e inicializa el mdulo MSSP: En modo SPI

1 - Habilita el mdulo MSSP y configura los pines SCK, SDO, SDI y SS como una fuente de pines del puerto serie. 0 - Deshabilita el mdulo MSSP y configura estos pines como pines del puerto de E/S.
En modo IC

1 - Habilita el mdulo MSSP y configura los pines SDA y SCL como una fuente de pines del puerto serie. 0 - Deshabilita el mdulo MSSP y configura estos pines como pines del puerto de E/S.
CKP - Clock Polarity Select bit (bit de seleccin de polaridad de reloj) no se utiliza en modo IC maestro. En modo SPI

1 - Para una seal de reloj, el estado inactivo es un nivel alto. 0 - Para una seal de reloj, el estado inactivo es un nivel bajo.
En modo IC esclavo

1 - Seal de reloj habilitada. 0 - Mantiene la salida de seal de reloj en estado bajo. Se utiliza para proporcionar ms tiempo para estabilizacin de datos.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

59/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

SSPM3-SSPM0 - Synchronous Serial Port Mode Select bits. (bit de seleccin del modo del SSP (puerto serie sncrono). El modo SSP se determina al combinar los siguientes bits:
SSPM 3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 SSPM 2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 SSPM 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 SSPM 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 M O DO Modo maestro del SPI, reloj = Fosc/4. Modo maestro del SPI, reloj = Fosc/16. Modo maestro del SPI, reloj = Fosc/64. Modo maestro del SPI, reloj = (TMR output)/2. Modo esclavo del SPI, habilitado el pin de control SS. Modo esclavo del SPI, deshabilitado el pin de control SS, SS se puede utilizar como pin de E/S. Modo esclavo I2C , direccin de 7 bits utilizada. Modo esclavo I2C , direccin de 10 bits utilizada. Modo maestro I2C , reloj = Fosc / [4(SSPAD+1)]. Mscara utilizada en modo esclavo I2C . No utilizado. Modo maestro I2C controlado. No utilizado. No utilizado. Modo esclavo I2C , direccin de 7 bits utilizada, los bits de arranque (START) y de parada (STOP) habilitan interrupcin. Modo esclavo I2C , direccin de 10 bits utilizada, los bits de arranque (START) y de parada (STOP) habilitan interrupcin.

Registro SSPCON2

GCEN - General Call Enable bit (bit de habilitacin general) Slo en modo esclavo IC

1 - Habilita interrupcin cuando una direccin de llamada general es recibida en el SSPST (0000h). 0 - Deshabilita direccin de llamada general.
ACKSTAT - Acknowledge Status bit (bit de estado de reconocimiento) Slo en modo de transmisin maestro IC

1 - Reconocimiento del esclavo no recibido. 0 - Reconocimiento del esclavo recibido.


ACKDT - Acknowledge data bit (bit de recepcin) Slo en modo de recepcin maestro IC

1 - No reconocimiento. 0 - Reconocimiento.
ACKEN - Acknowledge Sequence Enable bit (bit de habilitacin de secuencia de reconocimiento) En modo de recepcin maestro IC

1 - Indica una secuencia de reconocimiento en los pines SDA y SCL y transmite el bit ACKDT. Automticamente borrado por hardware. 0 - Secuencia de reconocimiento en reposo.
RCEN - Receive Enable bit (bit de habilitacin de recepcin) Slo en modo maestro IC

1 - Habilita recepcin en modo I2C. 0 - Recepcin deshabilitada.


PEN - STOP condition Enable bit (bit de habilitacin de condicin de Parada) Slo en modo maestro IC

1 - Indica una condicin de Parada en los pines SDA y SCL. Luego, este bit es automticamente borrado por hardware. 0 - Condicin de Parada en reposo.
RSEN - Repeated START Condition Enabled bit (bit de habilitacin de repetir condicin de Arranque) Slo en modo maestro IC

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

60/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


1 - Indica repeticin de condicin de Arranque en los pines SDA y SCL. Luego, este bit es automticamente borrado por hardware. 0 - Condicin de repeticin de Arranque en reposo.

SEN - START Condition Enabled/Stretch Enabled bit (bit de habilitacin de condicin de Arranque) Slo en modo maestro IC

1 - Indica condicin de Arranque en los pines SDA y SCL. Luego, este bit es automticamente borrado por hardware. 0 - Condicin de Arranque en reposo.

IC en Modo Maestro
El caso ms comn es que un microcontrolador funciona como maestro y un perifrico como esclavo. Es la razn por la que este libro slo trata este modo. Se da por entendido que la direccin consiste en 7 bits y el dispositivo contiene un solo microcontrolador (dispositivo con maestro nico). Para habilitar el mdulo MSSP en este modo, siga las siguientes instrucciones:

Ajuste la velocidad de transmisin (registro SSPADD), desactive el control de velocidad de rotacin (al poner a uno el bit SMP del registro SSPSTAT) y seleccione el modo maestro (registro SSPCON). Despus de finalizar todos los ajustes y habilitar el mdulo (registro SSPCON: bit SSPEN), es necesario esperar a que los circuitos de control internos indiquen con una seal que todo est preparado para transmisin de datos: o sea, que el bit SSPIF del registro PIR1 se haya puesto a uno. Despus de poner este bit a cero por software, el microcontrolador est listo para intercambiar los datos con los perifricos.

Transmisin de datos en Modo Maestro IC


La transmisin de datos en el pin SDA se inicia con un cero lgico (0) que aparece al poner a uno el bit SPEN del registro SSPCON2. Sin embargo, aunque est habilitado, el microcontrolador tiene que esperar cierto tiempo antes de iniciar la comunicacin. Se le denomina 'Condicin de Inicio' durante la que se realizan las preparaciones y verificaciones internas. Si se cumplen con todas la condiciones, el bit SSPIF del registro PIR1 se pone a uno y la transmisin de datos se inicia en cuanto se cargue el registro SSPBUF.

Como mximo 112 circuitos integrados (dispositivos esclavos) pueden compartir simultneamente la misma lnea de transmisin. El primer byte de datos enviado por el dispositivo maestro contiene la direccin que coincide con una sola direccin del dispositivo esclavo. Todas las direcciones se enumeran en las hojas de datos respectivas. El octavo bit del primer byte de datos especifica la direccin de transmisin de datos, o sea si el microcontrolador va a enviar o recibir los datos. En este caso, como se trata de transmisin de datos, el octavo bit se pone a cero (0).

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

61/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Cuando ocurre la coincidencia de direcciones, el microcontrolador tiene que esperar a que el dispositivo esclavo enve el bit de reconocimiento, o sea que se ponga a cero el bit ASKSTAT del registro SSPCON2. Una vez que la coincidencia de direcciones ha ocurrido apropiadamente, todos los bytes de datos se transmiten de la misma manera. La transmisin de datos termina al poner a uno el bit SEN del registro SSPCON2. Ocurre la condicin de parada (STOP), lo que habilita que el pin SDA reciba una secuencia de pulsos: Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - Parada!

Recepcin de datos en Modo Maestro IC


Las preparaciones para recibir los datos son similares a las de transmitir los datos, con excepcin de que el ltimo bit del primer byte enviado (el que contiene la direccin) se ponga a uno lgico (1). Eso especifica que el dispositivo maestro espera recibir los datos del dispositivo esclavo direccionado. Con respecto al microcontrolador, ocurre lo siguiente: Despus de hacer las pruebas internas y poner a uno el bit de arranque (START), el dispositivo esclavo enva byte por byte. Estos bytes se almacenan en el registro serial SSPSR. Despus de recibir el ltimo - octavo bit, cada dato se carga en el registro SSPBUF del que se puede leer. Al leer este registro, se enva automticamente el bit de reconocimiento, lo que significa que el dispositivo maestro est listo para recibir los nuevos datos. Al igual que en el caso de la transmisin, la recepcin de datos termina al poner a uno el bit de parada (STOP):

Inicio - Direccin - Reconocimiento - Dato - Reconocimiento .... Dato - Reconocimiento - Parada! En esta secuencia de pulsos, el bit de reconocimiento se enva al dispositivo esclavo.

Generador de baudios
Para sincronizar la transmisin de datos, todos los eventos que ocurren en el pin SDA deben estar sincronizados con la seal de reloj generada en el dispositivo maestro. Esta seal de reloj se genera por un simple oscilador cuya frecuencia depende de la frecuencia del

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

62/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

oscilador principal del microcontrolador, del valor que se introduce al registro SSPADD y as como del modo SPI actual. La frecuencia de seal de reloj del modo descrito en este libro depende del cristal de cuarzo seleccionado y del registro SPADD. La frmula utilizada para hacer el clculo de frecuencia de reloj es:

Vamos a hacerlo en mikroC...

/ *E ne s t ee j e m p l o ,e lm i c r o c o n t r o l a d o rP I Ce s t c o n e c t a d oal am e m o r i aE E P R O M2 4 C 0 2 p o rl o sp i n e sS C LyS D A .E lp r o g r a m ae n v au nb y t ed ed a t oal ad i r e c c i n2d el aE E P R O M . E n t o n c e s ,e lp r o g r a m al e ee s t ed a t op o re lm o d oI 2 Cd el aE E P R O Myl oe n v aa l p u e r t oP O R T Bp a r ac o m p r o b a rs ie ld a t os eh ae s c r i t oc o n x i t o .E lb y t ep a r ad i r e c c i o n a r l aE E P R O Me s t c o m p u e s t op o r7b i t sd el ad i r e c c i n( 1 0 1 0 0 0 1 )ye lb i tq u ed e t e r m i n a l e c t u r aoe s c r i t u r ad e ld a t o( L S B-b i tm e n o ss i g n i f i c a t i v o ) . * / v o i dm a i n ( ) { A N S E L=A N S E L H=P O R T B=T R I S B=0 ;/ /T o d o sl o sp i n e ss o nd i g i t a l e s .L o sp i n e sd e l / /p u e r t oP O R T Bs o ns a l i d a s . I 2 C 1 _ I n i t ( 1 0 0 0 0 0 ) ; / /I n i c i a l i z a rI 2 Cc o nr e l o jd e s e a d o

/ /I n c i od e lb l o q u ed es e n t e n c i a sp a r ae s c r i b i ru nb y t ee nl am e m o r i aE E P R O M . I 2 C 1 _ S t a r t ( ) ; I 2 C 1 _ W r ( 0 x A 2 ) ; I 2 C 1 _ W r ( 2 ) ; I 2 C 1 _ W r ( 0 x F 0 ) ; I 2 C 1 _ S t o p ( ) ; D e l a y _ 1 0 0 m s ( ) ; / /S e a ld ei n i c i od eI 2 C / /E n v i a rb y t ep o rI 2 C( d i r e c c i nd ed i s p o s i t i v o+W ) / /E n v i a rb y t e( d i r e c c i nd el al o c a l i d a dE E P R O M ) / /E n v i a rl o sd a t o sae s c r i b i r / /S e a ld ep a r a d ad eI 2 C

/ /E ne ls i g u i e n t eb l o q u ed es e n t e n c i a ss ed e t e r m i n al ad i r e c c i n2d el aq u es el e e r e ld a t o I 2 C 1 _ S t a r t ( ) ; I 2 C 1 _ W r ( 0 x A 2 ) ; I 2 C 1 _ W r ( 2 ) ; / /S e a ld ei n i c i od eI 2 C / /E n v i a rb y t ep o rI 2 C( d i r e c c i nd ed i s p o s i t i v o+W ) / /E n v i a rb y t e( d i r e c c i nd ed a t o )

/ /L ad i r e c c i ne s t d e t e r m i n a d aye ld a t oe s t l i s t op a r as e rl e d o I 2 C 1 _ R e p e a t e d _ S t a r t ( ) ; I 2 C 1 _ W r ( 0 x A 3 ) ; P O R T B=I 2 C 1 _ R d ( 0 u ) ; I 2 C 1 _ S t o p ( ) ; } / /S ev u e l v eag e n e r a re li n i c i od es e a lI 2 C / /E n v i a rb y t e( d i r e c c i nd ed i s p o s i t i v o+R ) / /L e e re ld a t o( r e c o n o c i m i e n t oN O ) / /S e a ld ep a r a d ad eI 2 C

NOTAS TILES ...


Cuando el microcontrolador se comunica con un perifrico, puede ocurrir un fallo en la transmisin de datos por alguna razn. En este caso, es recomendable comprobar el estado de algunos bits que pueden aclarar el problema. En la prctica, el estado de estos bits se comprueba al ejecutar una pequea subrutina despus de transmisin y recepcin de cada byte (por si acaso). WCOL (SPCON,7) - Si intenta escribir un dato nuevo al registro SSPBUF mientras que otra transmisin/recepcin de datos est en progreso, el bit WCOL se pone a uno y el contenido del registro SSBUF se queda sin cambios. No hay escritura. Luego, el bit WCOL debe ser borrado por el software. BF (SSPSTAT,0) - Al transmitir los datos, este bit se pone a uno durante la escritura en el registro SSPBUF y se queda puesto a uno hasta que el byte en formato serial se desplace del registro SSPRS. En modo de recepcin, este bit se pone a uno al cargar un dato o una direccin al registro SSPBUF. Se pone a cero despus de leer el registro SSPBUF. SSPOV (SSPCON,6) - En modo de recepcin, este bit se pone a uno al recibir un nuevo byte en el registro SSPSR por medio de la comunicacin serial, todava sin haber ledo el dato anteriormente recibido del registro SSPBUF. Pines SDA y SCL - Cuando el mdulo SSP est habilitado, estos pines se vuelven a las salidas de Drenaje Abierto. Esto significa que

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

63/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

deben estar conectados a resistencias conectados a la otra punta al polo positivo de la fuente de alimentacin.

Para establecer la comunicacin serial en modo I2C, se debe realizar lo siguiente: Ajustar el mdulo y enviar la direccin:

Introducir en el registro SSPADD el valor para definir la velocidad de transmisin en baudios. Poner a uno el bit SMP del registro SSPSTAT para desactivar el control de la velocidad de rotacin. Introducir el valor binario 1000 a los bits SSPM3-SSPM0 del registro SSPCON1 para seleccionar el modo Maestro. Poner a uno el bit SEN del registro SSPCON2 (secuencia de Inicio - START). El bit SSPIF se pone a uno automticamente en final de la secuencia de Inicio cuando el mdulo est listo para funcionar. Se deber poner a cero. Introducir la direccin de esclavo al registro SSPBUF. Cuando se enva un byte, el bit SSPIF (interrupcin) se pone a uno automticamente despus de haber recibido el bit de reconocimiento del dispositivo esclavo.
Transmitir los datos:

Introducir en el registro SSPBUF los datos a enviar. Cuando se enva un byte, el bit SSPIF (interrupcin) se pone a uno automticamente despus de haber recibido el bit de reconocimiento del dispositivo esclavo. La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON para informar al dispositivo Esclavo que la transmisin de datos se acab.
Recibir los datos:

Poner a uno el bit RSEN del registro SSPCON2 para habilitar la recepcin. El bit SSPIF indica con su estado lgico la recepcin de datos. Despus de leer los datos del registro SSPBUF, el bit ACKEN del registro SSPCON2 debe ponerse a uno para habilitar el envo del bit de reconocimiento. La condicin de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON para informar al dispositivo Esclavo que la transmisin se acab.
Aparte de disponer de un gran nmero de lneas digitales de E/S utilizadas para la comunicacin con los perifricos, el PIC16F887 contiene 14 entradas analgicas. Deb ido a stas, el microcontrolador no slo puede reconocer si un pin es llevado a b ajo o alto (0 o +5V), sino que puede medir con precisin el voltaje y convertirlo en un valor numrico, o sea, en formato digital.

3.9 MDULOS ANALGICOS


El mdulo del convertidor A/D dispone de las siguientes caractersticas:

El convertidor genera un resultado binario de 10 bits utilizando el mtodo de aproximaciones sucesivas y almacena los resultados de conversin en los registros ADC (ADRESL y ADRESH); Dispone de 14 entradas analgicas separadas; El convertidor A/D convierte una seal de entrada analgica en un nmero binario de 10 bits; La resolucin mnima o calidad de conversin se puede ajustar a diferentes necesidades al seleccionar voltajes de referencia Vref- y Vref+.

CONVERTIDOR A/D
Aunque a primera vista parece muy complicado utilizar un convertidor A/D, en realidad es muy simple. De hecho resulta ms simple utilizar un convertidor A/D que los temporizadores o mdulos de comunicacin serie.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

64/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

El funcionamiento del convertidor A/D est bajo el control de los bits de cuatro registros:

ADRESH Registro alto del resultado de la conversin A/D; ADRESL Registro bajo del resultado de la conversin A/D; ADCON0 Registro de control 0; y ADCON1 Registro de control 1.

Registros ADRESH y ADRESL


El resultado obtenido despus de convertir un valor analgico en digital es un nmero de 10 bits que se almacenar en los registros ADRESH y ADRESL. Hay dos maneras de manejarlo: justificacin a la izquierda y a la derecha que simplifica en gran medida su uso. El formato del resultado de la conversin depende del bit ADFM del registro ADCON1. En caso de que no se utilice el convertidor A/D, estos registros se pueden utilizar como registros de propsito general.

REQUERIMIENTOS DE ADQUISICIN A/D


Para que el convertidor A/D alcance su exactitud especificada, es necesario proporcionar un cierto tiempo muerto entre seleccionar una entrada analgica especfica y la medicin misma. Este tiempo se le denomina tiempo de adquisicin y generalmente depende de la impedancia de la fuente. Se utiliza una ecuacin para hacer clculo de tiempo de adquisicin con precisin, cuyo valor mnimo es de 20uS aproximadamente. Por consiguiente, para realizar una conversin con precisin, no se olvide este detalle.

RELOJ PARA LA CONVERSIN A/D


El tiempo necesario para realizar una conversin A/D cuyo resultado es 1 bit se define en unidades de TAD. Se requiere que sea como mnimo 1,6 uS. Para realizar una conversin completa de 10 bits se requiere un poco ms tiempo de lo esperado, son 11 TAD. Como la frecuencia de reloj as como la fuente de conversin A/D son determinadas por software, es necesario seleccionar una de las combinaciones de los bits disponibles ADCS1 y ADCS0 antes de empezar a medir voltaje en una de las entradas analgicas. Estos bits se almacenan en el registro ADCON0.
F REC UENC I A DE DI S P O S I T I V O ( F O S C ) 20 Mhz Fosc/2 Fosc/8 Fosc/32 Frc 0 0 1 1 0 1 0 1 100 nS 400 nS 1.6 uS 2 - 6 uS 8 Mhz 250 nS 1 uS 4 uS 2 - 6 uS 4 Mhz 500 nS 2 uS 8 uS 2 - 6 uS 1 Mhz 2 uS 8 uS 32 uS 2 - 6 uS

F UENT E DE REL O J DE A DC

A DC S 1

A DC S 0

Cualquier cambio de la frecuencia de reloj del microcontrolador afectar a la frecuencia de reloj de la conversin A/D, lo que puede

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

65/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

perjudicar al resultado de la conversin A/D. En la siguiente tabla se muestran las caractersticas de la frecuencia del dispositivo. Los valores en las celdas sombreadas estn fuera del rango recomendado.

CMO UTILIZAR EL CONVERTIDOR A/D?


Para llevar a cabo una conversin A/D sin problemas as como para evitar los resultados inesperados, es necesario considerar lo siguiente:

El convertidor A/D no hace diferencia entre seales digitales y analgicas. Para evitar errores en medicin o daar el chip, los pines se deben configurar como en tradas analgicas antes de que empiece el proceso de conversin. Los bits utiliza dos para este propsito se almacenan en los registros TRIS y ANSEL (ANSELH); Al leer el estado de puerto con las entradas analgicas, el estado de los bits correspondientes se leer como cero lgico (0), sin reparar en el valor del voltaje real en el pin; y Hablando en trminos generales, la medicin de voltaje en el convertidor est basado en comparar voltaje de entrada con una escala interna que tiene 1023 grados (210 - 1 =1023). El grado ms bajo de esta escala representa el voltaje Vref-, mientras que el grado ms alto se refiere al voltaje Vref+. La siguiente figura muestra los voltajes de referencia seleccionables as como sus valores mximos y mnimos.

Registro ADCON0

ADCS1, ADCS0 - A/D Conversion Clock Select bits (bits de seleccin de reloj de conversin A/D) selecciona la frecuencia de reloj utilizada para sincronizacin interna del convertidor A/D. Asimismo afecta a la duracin de la conversin.
A DC S 1 0 0 1 1 A DC S 2 0 1 0 1 REL O J Fosc/2 Fosc/8 Fosc/32 RC *

* Seal de reloj se genera por el oscilador interno RC que est integrado en el convertidor. CHS3-CHS0 - Analog Channel Select bits (bits de seleccin de canal analgico) selecciona un pin o un canal analgico para la conversin A/D, o sea para medir el voltaje:
C HS 3 0 0 C HS 2 0 0 C HS 1 0 0 C HS 0 0 1 C A NA L 0 1 PIN RA0/AN0 RA1/AN1

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

66/82

4/2/2014
0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 C Vref Vref = 0.6V RA2/AN2 RA3/AN3 RA5/AN4 RE0/AN5 RE1/AN6 RE2/AN7 RB2/AN8 RB3/AN9 RB1/AN10 RB4/AN11 RB0/AN12 RB5/AN13

GO/DONE - A/D Conversion Status bit (bit de estado de la conversin A/D) determina el estado actual de de la conversin:

1 - La conversin A/D est en progreso. 0 - La conversin A/D ha finalizado. El bit se pone a cero automticamente por hardware cuando la conversin A/D finaliza.
ADON - A/D On bit (bit de encendido A/D) habilita el convertidor A/D.

1 - Convertidor A/D est habilitado. 0 - Convertidor A/D est deshabilitado.


Vamos a hacerlo en mikroC...

/ *E s t ec d i g oe su ne j e m p l od el e e re lv a l o ra n a l g i c od e lc a n a l2yd ev i s u a l i z a r l o e nl o sp u e r t o sP O R T ByP O R T Cc o m on m e r ob i n a r i od e1 0b i t s .* / # i n c l u d e< b u i l t _ i n . h > u n s i g n e di n ta d c _ r d ; v o i dm a i n ( ){ A N S E L=0 x 0 4 ; T R I S A=0 x F F ; A N S E L H=0 ; T R I S C=0 x 3 F ; T R I S B=0 ; d o{ t e m p _ r e s=A D C _ R e a d ( 2 ) ;/ /O b t e n e re lr e s u l t a d od e1 0b i t sd el ac o n v e r s i nA D P O R T B=t e m p _ r e s ; }w h i l e ( 1 ) ; } / /E n v i a rl o s8b i t sm sb a j o sa lP O R T B / /Q u e d a r s ee ne lb u c l e P O R T C=t e m p _ r e s> >2 ; / /E n v i a rl o s2b i t sm ss i g n i f i c a t i v o sal o sR C 7 ,R C 6 / /C o n f i g u r a rA N 2c o m op i na n a l g i c o / /P O R T As ec o n f i g u r ac o m oe n t r a d a / /C o n f i g u r a rl o sd e m sp i n e sA Nc o m oE / Sd i g i t a l e s / /P i n e sR C 7yR C 6s ec o n f i g u r a nc o m os a l i d a s / /P O R T Bs ec o n f i g u r ac o m os a l i d a

Registro ADCON1

ADFM - A/D Result Format Select bit (bit de seleccin del formato del resultado de la conversin A/D)

1 - Resultado de conversin est justificado a la derecha. No se utilizan los seis bits ms significativos del registro ADRESH. 0 - Resultado de conversin est justificado a la izquierda. No se utilizan los seis bits menos significativos del registro ADRESL.
VCFG1 - Voltage Reference bit (bit de configuracin de voltaje de referencia) selecciona la fuente de voltaje de referencia bajo que se necesita para el funcionamiento del convertidor A/D.

1 - Voltaje de referencia bajo se aplica al pin Vref0 - Voltaje de alimentacin Vss se utiliza como una fuente de voltaje de referencia bajo.
VCFG0 - Voltage Reference bit (bit de configuracin de voltaje de referencia) selecciona la fuente de voltaje de referencia alto que se necesita para el fucionamiento del convertidor A/D.

1 - Voltaje de referencia alto se aplica al pin Vref+. 0 - Voltaje de alimentacin Vdd se utiliza como una fuente de voltaje de referencia alto.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

67/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Para medir el voltaje en un pin de entrada por medio del convertidor A/D, se debe realizar lo siguiente: Paso 1 - Configuracin del puerto:

Escribir un uno lgico (1) a un bit del registro TRIS, lo que resulta en configurar el pin apropiado como una entrada. Escribir un uno lgico (1) a un bit del registro ANSEL, lo que resulta en configurar el pin apropiado como una entrada analgica.
Paso 2 - Configuracin del mdulo de la conversin A/D:

Configurar voltaje de referencia en el registro ADCON1. Seleccionar una seal de reloj de la conversin A/D en el registro ADCON0. Seleccionar uno de los canales de entrada CH0-CH13 del registro ADCON0. Seleccionar el formato de dato por medio de ADFM del registro ADCON1. Habilitar el convertidor A/D al poner a uno el bit ADON del registro ADCON0.
Paso 3 - Configuracin de la interrupcin (opcionalmente):

Poner a cero el bit ADIF. Poner a uno los bits ADIE, PEIE y GIE.
Paso 4 - Tiempo de espera para que transcurra el tiempo de adquisicin (aproximadamente 20uS). Paso 5 - Inicio de la conversin poniendo a uno el bit GO/DONE del reg istro ADCON0. Paso 6 - Esperar a que la conversin A/D finalice.

Es necesario comprobar en el bucle de programa si el bit GO/DONE est a cero o esperar que se produzca una interrupcin (deber estar anteriormente habilitada).
Paso 7 - Lectura del resultado de la conversin A/D:

Leer los registros ADRESH y ADRESL.

COMPARADOR ANALGICO
Aparte del convertidor A/D, hay otro mdulo, que hasta hace poco ha sido incorpodo slo en los circuitos integrados que pertenecen a los llamados componentes analgicos. Debido al hecho de que casi no hay ningn dispositivo automtico complejo que en cierto modo no utilice estos circuitos, dos comparadores de alta calidad, junto con los componentes adicionales estn integrados en el microcontrolador y conectados a sus pines. Cmo funciona un comparador? Bsicamente, el comparador analgico es un amplificador que compara la magnitud de voltajes en dos entradas. Dispone de dos entradas y una salida. Dependiendo de cul voltaje de entrada es ms alto (valor analgico), un cero lgico (0) o un uno lgico (1) (valores digitales) ser la salida.

Cuando el voltaje analgico en Vin - es ms alto que el voltaje anlogo en Vin+, la salida del comparador estar a un nivel digital bajo. Cuando el voltaje analgico en Vin+ es ms alto que el voltaje anlogo en Vin-, la salida del comparador estar a un nivel digital alto.
El microcontrolador PIC16F887 dispone de dos de estos comparadores de voltaje cuyas entradas estn conectadas a los pines de E/S RA0-RA3, mientras que las salidas estn conectadas a los pines RA4 y RA5. Adems, hay una fuente de voltaje de referencia interna en el chip mismo, la que vamos a discutir ms tarde. Estos dos circuitos estn bajo el control de los bits almacenados en los siguientes registros:

CM1CON0 est en control del comparador C1; CM2CON0 est en control del comparador C2; CM2CON1 est en control del comparador C2;

FUENTE INTERNA DE VOLTAJE DE REFERENCIA


Uno de dos voltajes analgicos proporcionados en las entradas del comparador es por lo general estable e inalterable. Es denominado voltaje de referencia(Vref). Para generarlo, se pueden utilizar tanto una fuente de voltaje externa como una fuente de voltaje interna especial. El voltaje de referencia Vref se deriva despus de seleccionar una fuente, por medio de una red en escalera que consiste en 16 resistencias, formando un divisor de voltaje. La fuente de voltaje es seleccionable por el bit VRSS del registro VRCON. Adems, la fraccin de voltaje proporcionada por la red de resistencias es seleccionable por los bits VR0-VR3 y utilizada como voltaje de referencia. Vea la siguiente figura:

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

68/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

El voltaje de referencia del comparador dispone de dos gamas con 16 diferentes niveles de voltaje cada una. La seleccin de gama es controlada por el bit VRR del registro VRCON. El voltaje de referencia seleccionado CVref puede ser la salida al pin RA2/AN2 si el bit VROE se pone a uno. Aunque la idea principal era obtener el voltaje de referencia variable para el funcionamiento de mdulos analgicos, de ese modo se obtiene un simple convertidor A/D. Este convertidor es muy til en algunas situaciones. Su funcionamiento est bajo el control del registro VRCON.

COMPARADORES E INTERRUPCIN
Siempre que haya un cambio del estado lgico en la salida de un comparador, el bit de bandera CMIF del registro PIR se pone a uno. Ese cambio tambin causar una interrupcin si los siguientes bits se ponen a uno:

El bit CMIE del registro PIE = 1; El bit PEIE del registro INTCON = 1; y El bit GIE del registro INTCON = 1.
Si una interrupcin est habilitada, un cambio en la salida de un comparador cuando el microcontrolador est en modo de reposo, puede causar que el microcontrolador salga de reposo y vuelva a funcionar en modo normal.

FUNCIONAMIENTO EN MODO DE REPOSO (SLEEP MODE)


Si est habilitado antes de entrar en modo de reposo, el comparador se queda activo durante el modo de reposo. Si el comparador no se utiliza para "despertar" el dispositivo, el consumo de corriente se puede reducir en modo de reposo al apagar el comparador. Esto se lleva a cabo al poner a cero el bit CxON del registro CMxCON0. Para que el comparador "despierte" al microcontrolador del modo de reposo, el bit CxIE del registro IE2 y el bit PEIE del registro INTCON debern ponerse a uno. La instruccin que sigue a la instruccin Sleep siempre se ejecuta al salir del modo de reposo. Si el bit GIE del registro INTCON se pone a uno, el dispositivo ejecutar la rutina de servicio de interrupcin.

Registro CM1CON0

Los bits de este registro estn en control del comparador C1. Eso afecta principalmente a la configuracin de las entradas. Para explicarlo con ms claridad, vea la siguiente figura en la que se muestran slo los componentes directamente afectados por los bits de este registro.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

69/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

C1ON - Comparator C1 Enable bit (bit de habilitacin del comparador C1) habilita al comparador C1.

1 - Comparador C1 est habilitado. 0 - Comparador C1 est deshabilitado.


C1OUT - Comparator C1 Output bit (bit de salida del comparador C1) es la salida del comparador C1. Si C1POL = 1 (salida del comparador est invertida)

1 - Voltaje de entrada C1Vin+ es ms bajo que el voltaje de entrada C1Vin-. 0 - Voltaje de entrada C1Vin+ es ms alto que el voltaje de entrada C1Vin-.
If C1POL = 0 (salida del comparador no est invertida)

1 - Voltaje de entrada C1Vin+ es ms alto que el voltaje de entrada C1Vin-. 0 - Voltaje de entrada C1Vin+ es ms bajo que el voltaje de entrada C1Vin-.
C1OE Comparator C1 Output Enable bit (bit de habilitacin de salida del comparador C1)

1 - Salida del comparador C1OUT est conectada al pin C1OUT *. 0 - Salida del comparador se utiliza internamente.
* Para habilitar que el bit C1OUT aparezca en el pin, se deben cumplir dos condiciones: C1ON = 1 (el comparador debe estar activado) y el bit correspondiente TRIS = 0 (pin se debe configurar como salida). C1POL - Comparator C1 Output Polarity Select bit (bit de seleccin de polaridad de salida del comparador C1) habilita la inversin del estado de la salida del comparador C1.

1 - Salida del comparador C1 est invertida. 0 - Salida del comparador C1 no est invertida.
C1R - Comparator C1 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del comparador C1)

1 - Entrada no invertida C1Vin+ est conectada a la fuente de voltaje de referencia C1Vref. 0 - Entrada no invertida C1Vin+ est conectada al pin C1IN+.
C1CH1, C1CH0 - Comparator C1 Channel Select bit (bit de seleccin de canal del comparador C1)
C 1 C H1 0 0 1 1 C 1 C H0 0 1 0 1 ENT RA DA C 1 V I N- DEL C O M P A RA DO R Entrada C 1Vin- est conectada al pin C 12IN0Entrada C 1Vin- est conectada al pin C 12IN1Entrada C 1Vin- est conectada al pin C 12IN2Entrada C 1Vin- est conectada al pin C 12IN3-

Registro CM2CON0

Los bits de este registro estn en control del comparador C2. Similar al caso anterior, la siguiente figura muestra un esquema simplificado del circuito afectado por los bits de este registro.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

70/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

C2ON - Comparator C2 Enable bit (bit de habilitacin del comparador C2) habilita el comparador C2.

1 - Comparador C2 est habilitado. 0 - Comparador C2 est deshabilitado.


C2OUT - Comparator C2 Output bit (bit de salida del comparador C2) es la salida del comparador C2. If C2POL = 1 (salida del comparador est invertida)

1 - Voltaje de entrada C2Vin+ es ms bajo que el voltaje de entrada C2Vin-. 0 - Voltaje de entrada C2Vin+ es ms alto que el voltaje de entrada C2Vin-.
If C2POL = 0 (salida del comparador no est invertida)

1 - Voltaje de entrada C2Vin+ es ms alto que el voltaje de entrada C2Vin-. 0 - Voltaje de entrada C2Vin+ es ms bajo que el voltaje de entrada C2Vin-.
C2OE - Comparator C2Output Enable bit (bit de habilitacin de salida del comparador C2)

1 - Salida del comparador C2OUT est conectada al pin C2OUT*. 0 - Salida del comparador se utiliza internamente.
* Para habilitar que el bit C2OUT aparezca en el pin, se deben cumplir dos condiciones: C2ON = 1 (el comparador debe estar activado) y el bit correspondiente TRIS = 0 (pin se debe configurar como salida). C2POL - Comparator C2 Output Polarity Select bit (bit de seleccin de polaridad de salida del comparador C2) habilita la inversin del estado de la salida del comparador C2.

1 - Salida del comparador C2 est invertida. 0 - Salida del comparador C2 no est invertida.
C2R - Comparator C2 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del comparador C2)

1 - Entrada no invertida C2Vin+ est conectada a la fuente de voltaje de referencia C2Vref. 0 - Entrada no invertida C2Vin+ est conectada al pin C2IN+.
C2CH1, C2CH0 Comparator C2 Channel Select bit (bit de seleccin de canal del comparador C2)
C 2 C H1 0 0 1 1 C 2 C H0 0 1 0 1 ENT RA DA C 2 V I N- DEL C O M P A RA DO R Entrada C 2Vin- est conectada al pin C 12IN0Entrada C 2Vin- est conectada al pin C 12IN1Entrada C 2Vin- est conectada al pin C 12IN2Entrada C 2Vin- est conectada al pin C 12IN3-

Registro CM2CON1

MC1OUT Mirror Copy of C1OUT bit es una copia del bit C1OUT MC2OUT Mirror Copy of C2OUT bit es una copia del bit C2OUT C1RSEL Comparator C1 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del comparador C1)

1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia C1Vref. 0 - Voltaje de referencia fijo de 0,6V se utiliza en la fuente de voltaje de referencia C1Vref.
C2RSEL - Comparator C2 Reference Select bit (bit de seleccin de la fuente de voltaje de referencia del comparador C2)

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

71/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia C2Vref. 0 - Voltaje de referencia fijo de 0,6V se utiliza en la fuente de voltaje de referencia C2Vref.

T1GSS - Timer1 Gate Source Select bit (bit de seleccin de la fuente de la compuerta del temporizador Timer1)

1 - Compuerta del temporizador Timer1 utiliza seal del pin T1G. 0 - Compuerta del temporizador Timer1 utiliza seal SYNCC2OUT.
C2SYNC - Comparator C2 Output Synchronization bit (bit de sincronizacin de salida del comparador C2)

1 - Salida del comparador C2 est sincronizada con un flanco ascendente de seal de reloj del temporizador Timer1 0 - Salida del comparador es una seal asncrona.
Registro VRCON

VREN Comparator C1 Voltage Reference Enable bit (bit de habilitacin de la fuente de voltaje de referencia del comparador C1)

1 - Fuente de voltaje de referencia CVref est encendido. 0 - Fuente de voltaje de referencia CVref est apagado.
VROE Comparator C2 Voltage Reference Enable bit (bit de habilitacin de la fuente de voltaje de referencia del comparador C2)

1 - Fuente de voltaje de referencia CVref est conectada al pin. 0 - Fuente de voltaje de referencia CVref no est conectada al pin.
VRR - CVref Range Selection bit (bit de seleccin de gama de voltaje de referencia Vref)

1 - Fuente de voltaje de referencia se ajusta a producir baja gama de voltaje. 0 - Fuente de voltaje de referencia se ajusta a producir alta gama de voltaje.
VRSS - Comparator Vref Range selection bit (bit de seleccin de gama de voltaje de referencia Vref del comparador)

1 - Voltaje de referencia est en la gama de Vref+ a Vref-. 0 - Voltaje de referencia est en la gama de Vdd a Vss. (voltaje de alimentacin).
VR3 - VR0 CVref Value Selection (seleccin de valor de voltaje de referencia) If VRR = 1 (gama baja) El voltaje de referencia se calcula por medio de la frmula: CVref = ([VR3:VR0]/24)Vdd. If VRR = 0 (gama alta) El voltaje de referencia se calcula por medio de la frmula CVref = Vdd/4 + ([VR3:VR0]/32)Vdd. Pasos a seguir para utilizar apropiadamente los comparadores integrados: Paso 1 - Configuracin del mdulo:

Para seleccionar el modo apropiado, se deben configurar los estados de los bits de los registros CM1CON0 y CM2CON0. La interrupcin debe estar deshabilitada durante el cambio de modo.
Paso 2 - Configurar la fuente de voltaje de referencia Vref interna (slo si se utiliza). En el registro VRCON es necesario realizar lo siguiente:

Seleccionar una de dos gamas de voltaje por medio del bit VRR. Configurar el voltaje de referencia Vref necesario por medio de los bits VR3 - VR0. Poner a uno el bit VROE si es necesario. Habilitar la fuente de voltaje de referencia Vref al poner a uno el bit VREN.
Frmula utilizada para calcular el voltaje de referencia VRR = 1 (gama baja) CVref = ([VR3:VR0]/24)VLADDER VRR = 0 (gama alta) CVref = (VLADDER/4) + ([VR3:VR0]VLADDER/32) Vladder = Vdd or ([Vref+] - [Vref-]) or Vref+ Paso 3 - Inicio del funcionamiento:

Habilitar una interrupcin al poner a uno los bits CMIE (registro PIE), PEIE y GIE (registro INTCON ). Leer los bits C1OUT y C2OUT del registro CMCON. Leer la bandera de bit CMIF del registro PIR. Despus de haber sido puesto a uno, este bit se pone a cero por software.
Para sincronizar todos los procesos que se llevan a cab o dentro del microcontrolador, se deb e utilizar una seal de reloj, mientras que para generar una seal de reloj, se deb e utilizar un oscilador. As de simple. El microcontrolador dispone de varios osciladores capaces de funcionar en modos diferentes. Y aqu es donde viene lo interesante...

3.10 OSCILADOR DE RELOJ


http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/ 72/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

Como se muestra en la siguiente figura, la seal de reloj se genera por uno de los dos osciladores integrados.

Un oscilador externo est instalado fuera del microcontrolador y conectado a los pines OSC1 y OSC2. Es denominado 'externo' porque utiliza componentes externos para generar una seal de reloj y estabilizar la frecuencia. Estos son: cristal de cuarzo, resonador cermico o circuito resistor - capacitor. El modo de funcionamiento del oscilador se selecciona por los bits, que se envan durante la programacin, denominados Palabra de Configuracin. El oscilador interno consiste en dos osciladores internos separados: El HFINTOSC es un oscilador interno de alta frecuencia calibrado a 8MHz. El microcontrolador puede utilizar una seal de reloj generada a esta frecuencia o despus de haber sido dividida en el pre-escalador. El LFINTOSC es un oscilador interno de baja frecuencia calibrado a 31 kHz. Sus pulsos de reloj se utilizan para funcionamiento de los temporizadores de encendido y perro guardin, asimismo puede utilizarse como fuente de seal de reloj para el funcionamiento de todo el microcontrolador. El bit System Clock Select (bit de seleccin del reloj del sistema - SCS) del registro OSCCON determina si una fuente de seal de reloj del microcontrolador ser interna o externa.

Registro OSCCON
El registro OSCCON gobierna el microcontrolador y las opciones de seleccin de frecuencia. Contiene los siguientes bits: bits de seleccin de frecuencia (IRCF2, IRCF1, IRCF0), bits de estado de frecuencia (HTS, LTS), bits de control de reloj del sistema (OSTA, SCS).

IRCF2-0 - Internal Oscillator Frequency Select bits. (bits de seleccin de frecuencia del oscilador interno). El valor del divisor de frecuencias depende de la combinacin de estos tres bits. La frecuencia de reloj del oscilador interno se determina de la misma manera.
I RC F 2 1 1 1 1 0 0 0 0 I RC F 1 1 1 0 0 1 1 0 0 I RC F 0 1 0 1 0 1 0 1 0 F REC UENC I A 8 MHz 4 MHz 2 MHz 1 MHz 500 kHz 250 kHz 125 kHz 31 kHz OSC . HFINTOSC HFINTOSC HFINTOSC HFINTOSC HFINTOSC HFINTOSC HFINTOSC LFINTOSC

OSTS - Oscillator Start-up Time-out Status bit (bit de estado del temporizador de encendido) indica cul fuente de reloj est actualmente en uso. Es un bit de slo lectura.

1 - Se utiliza el oscilador de reloj externo. 0 - Se utiliza uno de los osciladores de reloj interno (HFINTOSC o LFINTOSC).

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

73/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

HTS - HFINTOSC Status bit (8 MHz - 125 kHz) (bit de estado del HFINTOSC) indica si el oscilador interno de alta frecuencia funciona en modo estable.

1 - HFINTOSC est estable. 0 - HFINTOSC no est estable.


LTS - LFINTOSC Stable bit (31 kHz) (bit de estado del LFINTOSC) indica si el oscilador de baja frecuencia funciona en modo estable.

1 - LFINTOSC est estable. 0 - LFINTOSC no est estable.


SCS - System Clock Select bit (bit de seleccin del reloj del sistema) determina cul oscilador se utilizar como una fuente de reloj.

1 - Oscilador interno se utiliza como reloj del sistema. 0 - Oscilador externo se utiliza como reloj del sistema. El modo del oscilador se configura por medio de los bits, denominados Palabra de Configuracin, que se escribe en la memoria del microcontrolador durante el proceso de la programacin.

MODOS DE RELOJ EXTERNO


El oscilador externo se puede configurar para funcionar en uno de varios modos, lo que habilita que funcione a diferentes velocidades y utilice diferentes componentes para estabilizar la frecuencia. El modo de funcionamiento se selecciona durante el proceso de escribir un programa en el microcontrolador. Antes que nada, es necesario activar el programa en una PC que se utilizar para programar el microcontrolador. En este caso, es el programa PICflash. Pulse sobre la casilla del oscilador y seleccione uno de la lista desplegable. Los bits apropiados se pondrn a uno automticamente, formando parte de varios bytes, denominados Palabra de Configuracin. Durante el proceso de la programacin del microcontrolador, los bytes de la Palabra de Configuracin se escriben en la memoria ROM del microcontrolador y se almacenan en los registros especiales no disponibles al usuario. A base de estos bits, el microcontrolador sabe qu hacer, aunque eso no se indica explcitamente en el programa.

Modo de funcionamiento se selecciona despus de escribir y compilar un programa

OSCILADOR EXTERNO EN MODO EC


El modo de reloj externo (EC - external clock) utiliza un oscilador externo como una fuente de seal de reloj. La mxima frecuencia de seal de reloj est limitada a 20 MHz.

Las ventajas del funcionamiento del oscilador externo en modo EC son las siguientes:

La fuente de reloj externa independiente est conectada al pin de entrada OSC1. El pin OSC2 est disponible como pin de E/S de propsito general; Es posible sincronizar el funcionamiento del microcontrolador con los dems componentes incorporados en el dispositivo; En este modo el microcontrolador se pone a funcionar inmediatamente despus de encenderlo. No se requiere esperar para estabilizar la frecuencia. Al deshabilitar temporalmente la fuente de reloj externa, se detiene el funcionamiento del dispositivo, dejando todos los

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

74/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


datos intactos. Despus de reiniciar el reloj externo, el dispositivo sigue funcionando como si no hubiera pasado nada.

OSCILADOR EXTERNO EN MODO LP, XT O HS

Los modos LP, XT y HS utilizan un oscilador externo como una fuente de reloj cuya frecuencia est determinada por un cristal de cuarzo o por resonadores cermicos conectados a los pines OSC1 y OSC2. Dependiendo de las caractersticas de los componentes utilizados, seleccione uno de los siguientes modos:

Modo LP - (Baja potencia) se utiliza slo para cristal de cuarzo de baja frecuencia. Este modo est destinado para trabajar con cristales de 32.768 KHz normalmente embebidos en los relojes de cristal. Es fcil de reconocerlos por sus dimensiones pequeas y una forma cilndrica. Al utilizar este modo el consumo de corriente ser menor que en los dems modos. Modo XT se utiliza para cristales de cuarzo de frecuencias intermedias hasta 8 MHz. El consumo de corriente es media en comparacin con los dems modos. Modo HS - (Alta velocidad) se utiliza para cristales de reloj de frecuencia ms alta de 8 MHz. Al utilizar este modo el consumo de corriente ser mayor que en los dems modos.

RESONADORES CERMICOS EN MODO XT O HS


Los resonadores cermicos son similares a los cristales de cuarzo segn sus caractersticas, por lo que se conectan de la misma manera. A diferencia de los cristales de cuarzo, son ms baratos y los osciladores que hacen uso de ellos son de calidad ms baja. Se utilizan para las frecuencias de reloj entre 100 kHz y 20 MHz.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

75/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

OSCILADOR EXTERNO EN MODOS RC Y RCIO


El uso de los elementos para estabilizar la frecuencia sin duda alguna tiene muchas ventajas, pero a veces realmente no es necesario. En la mayora de casos el oscilador puede funcionar a frecuencias que no son precisamente definidas, as que sera una prdida de dinero embeber tales elementos. La solucin ms simple y ms barata es estas situaciones es utilizar una resistencia y un capacitor para el funcionamiento del oscilador. Hay dos modos: Modo RC. Cuando el oscilador externo se configura a funcionar en modo RC, el pin OSC1 debe estar conectado al circuito RC como se muestra en la figura a la derecha. La seal de frecuencia del oscilador RC dividida por 4 est disponible en el pin OSC2. Esta seal se puede utilizar para la calibracin, sincronizacin o para otros propsitos.

Modo RCIO. De manera similar, el circuito RC est conectado al pin OSC1. Esta vez, el pin OSC2 est disponible para ser utilizado como pin de E/S de propsito general.

En ambos casos se le recomienda utilizar los componentes como se muestra en la figura. La frecuencia de este oscilador se calcula por medio de la frmula f = 1/T segn la que:

f = frecuencia [Hz]; T = R * C = constante de tiempo [s]; R = resistencia elctrica []; y C = capacitancia del condensador [F].

MODOS DE RELOJ INTERNO


El circuito del oscilador interno consiste en dos osciladores separados que se pueden seleccionar como la fuente del reloj del microcontrolador: El oscilador HFINTOSC est calibrado de fbrica y funciona a 8Mhz. La frecuencia de este oscilador se puede configurar por el usuario por medio de software utilizando los bits del registro OSCTUNE. El oscilador LFINTOSC no est calibrado de fbrica y funciona a 31kHz. Similar al oscilador externo, el interno tambin puede funcionar en varios modos. El modo de funcionamiento se selecciona de la misma manera que en el oscilador externo - por medio de los bits que forman Palab ra de configuracin. En otras palabras, todo se lleva a cabo dentro del software de PC antes de escribir un programa en el microcontrolador. OSCILADOR INTERNO EN MODO INTOSC En este modo, el pin OSC1 est disponible para ser utilizado como pin de E/S de propsito general. La seal de frecuencia del oscilador interno dividida por 4 est disponible en el pin OSC2.

OSCILADOR INTERNO EN MODO INTOSCIO En este modo, los dos pines estn disponibles como pines de E/S de propsito general.

CONFIGURACIN DEL OSCILADOR INTERNO


El oscilador interno consiste en dos circuitos separados:

1. El oscilador interno de alta frecuencia HFINTOSC est conectado al post-escalador (divisor de frecuencias). Est calibrado de fbrica y
funciona a 8 Mhz. Al utilizar el post-escalador, este oscilador puede producir una seal de reloj a una de siete frecuencias. La seleccin de frecuencia se realiza dentro del software utilizando los pines IRCF2, IRCF1 y IRCF0 del registro OSCCON. El HFINTOSC est habilitado al seleccionar una de siete frecuencias (entre 8 Mhz y 125 kHz) y poner a uno el bit de la fuente de reloj del sistema (SCS) del registro OSCCON. Como se muestra en la siguiente figura , todo el procedimiento se realiza por medio de los bits del registro OSCCON.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

76/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

2. El oscilador de baja frecuencia LFINTOSC no est calibrado de fbrica y funciona a 31 kHz. Est habilitado al seleccionar la frecuencia
(bits del registro OSCCON) y poner a uno el bit SCS del mismo registro.

MODO DE CAMBIO AUTOMTICO DE VELOCIDAD DE RELOJ (TWO-SPEED CLOCK START-UP MODE)


El modo de cambio automtico de velocidad de reloj se utiliza para reducir el consumo de corriente cuando el microcontrolador funciona en modo de reposo. De qu se trata todo esto? Cuando se configura en modo LP, XT o HS, el oscilador externo se desactiva al pasar a modo de reposo para reducir el consumo de corriente total del dispositivo. Cuando se cumplen las condiciones de "despertamiento", el microcontrolador no se pone a funcionar inmediatamente puesto que tiene que esperar a que se estabilice la frecuencia de seal de reloj. Este tiempo muerto dura exactamente 1024 pulsos, despus de que el microcontrolador contina con la ejecucin del programa. El caso es que se ejecutan slo unas pocas instrucciones antes de que el microcontrolador vuelva al modo de reposo. Eso significa que la mayora de tiempo as como la mayora de corriente de bateras se ha perdido en vano. El caso se soluciona utilizando el oscilador interno para ejecutar el programa durante la duracin de 1024 pulsos. Tan pronto como se estabilice la frecuencia del oscilador externo, l retoma automticamente "el papel principal". Todo el procedimiento se habilita al poner a uno el bit de palabra de configuracin. Para programar el microcontrolador, es necesario seleccionar la opcin Int-Ext Switchover (conmutacin interna/externa) por software.

MONITOR PARA DETECTAR UN FALLO DE LA FUENTE DE RELOJ (FAIL-SAFE CLOCK MONITOR)


Como indica su nombre, el monitor para detectar un fallo de la fuente de reloj (Fail-Safe Clock Monitor - FSCM) monitorea el funcionamiento externo y permite al microcontrolador continuar con la ejecucin de programa en caso de que el oscilador falle por alguna razn. En tal caso, el oscilador interno toma su funcin.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

77/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

El monitor detecta un fallo al comparar las fuentes de reloj interno y externo. Si los pulsos del oscilador externo tardan ms de 2mS en llegar, la fuente de reloj ser automticamente cambiada por la interna. As, el oscilador interno sigue funcionando controlado por los bits del registro OSCCON. Si el bit OSFIE del registro PIE2 est a uno, se producir una interrupcin. El reloj interno sigue siendo la fuente del reloj del sistema hasta que el dispositivo reinicie con xito el oscilador externo que vuelve a ser la fuente de reloj del sistema. De manera similar a casos anteriores, este mdulo est habilitado al cambiar la palabra de configuracin justamente antes de que se inicie el proceso de programar el chip. Esta vez, esto se realiza al seleccionar la opcin Fail-Safe Clock Monitor.

Registro OSCTUNE
Los cambios del registro OSCTUNE afectan a la frecuencia del oscilador HFINTOSC, pero no a la frecuencia del LFINTOSC. No hay ninguna indicacin de que haya ocurrido desplazamiento de frecuencia durante el funcionamiento del microcontrolador.

TUN4 - TUN0 Frequency Tuning bits. (bits de calibrar la frecuencia). Al combinar estos cinco bits, la frecuencia del oscilador de 8Mhz se reduce o se aumenta. De este modo, las frecuencias obtenidas por la divisin en el post-escalador cambian tambin.
T UN4 0 0 0 T UN3 1 1 1 T UN2 1 1 1 T UN1 1 1 0 T UN0 1 0 1 F REC UENC I A Mxima

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

78/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

0 0 1

0 0 1

0 0 1

0 0 1

1 0 1 C alibrada

1 1 1

0 0 0

0 0 0

1 0 0

0 1 0 Mnima

La EEPROM es un segmento de memoria separado, que no pertenece a la memoria de programa (ROM), tampoco a la memoria de datos (RAM). Aunque a estas localidades de memoria no se les puede acceder fcil y rpidamente, su propsito es insustituib le. Los datos almacenados en la EEMPROM estn permanentemente guardados incluso al apagar la fuente de alimentacin, y pueden ser camb iados en cualquier momento. Por estas caractersticas excepcionales cada b yte de la EEPROM se considera valioso.

3.11 MEMORIA EEPROM


El microcontrolador PIC16F887 dispone de 256 localidades de memoria EEPROM controlados por los bits de los siguientes registros:

EECON1 (registro de control); EECON2 (registro de control); EEDAT (almacena los datos listos para escritura y lectura); y EEADR (almacena la direccin de la EEPROM a la que se accede).
Adems, el registro EECON2 no es un registro verdadero, no existe fsicamente en el chip. Se utiliza slo durante la escritura de los datos en la memoria. Los registros EEDATH y EEADRH se utilizan durante la escritura y lectura de la EEPROM. Los dos se utilizan tambin durante la escritura y lectura de la memoria de programa (FLASH). Por considerar esto una zona de riesgo (por supuesto usted no quiere que el microcontrolador borre su propio programa por casualidad), no vamos a discutirlo aqu, no obstante le avisamos que tenga cuidado.

Registro EECON1

EEPGD - Program/Data EEPROM Select bit (bit de seleccin de memorias)

1 - Acceso a la memoria Flash de programa. 0 - Acceso a la memoria de datos EEPROM.


WRERR - EEPROM Error Flag bit (bit de error de escritura)

1 - Se produce un error de escritura de forma prematura y ha ocurrido un error. 0 - Se ha completado la operacin de escritura.
WREN - EEPROM Write Enable bit (bit de habilitacin de escritura)

1 - Escritura de datos en la EEPROM habilitada. 0 - Escritura de datos en la EEPROM deshabilitada.


WR - Write Control bit (bit de control de escritura)

1 - Se ha iniciado una operacin de escritura de datos en la EEPROM. 0 - Se ha completado una operacin de escritura de datos en la EEPROM.
RD - Read Control bit (bit de control de lectura)

1 - Inicia una lectura de la memoria EEPROM. 0 - Lectura de la memoria EEPROM deshabilitada.

LECTURA DE LA MEMORIA EEPROM


Para leer los datos de la memoria EEMPROM, siga los siguientes pasos:

Paso Paso Paso Paso

1: 2: 3: 4:

Escribir la direccin (00h - FFh) en el registro EEADR. Seleccionar el bloque de memoria EEPROM al poner a cero el bit EEPGD del registro EECON1. Poner a uno el bit RD del mismo registro para leer el contenido de la localidad. El dato se almacena en el registro EEDAT y est listo para su uso.

El siguiente ejemplo muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador:

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

79/82

4/2/2014
B S FS T A T U S , R P 1 B C FS T A T U S , R P 0 M O V FA D D R E S S , W M O V W FE E A D R B S FS T A T U S , R P 0 B S FE E C O N 1 , R D B C FS T A T U S , R P 0 M O V FE E D A T A , W ;

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


;A c c e d e ra lb a n c o2 ;M o v e rl ad i r e c c i na lr e g i s t r oW ;E s c r i b i rl ad i r e c c i n ;A c c e d e ra lb a n c o3 ;L e e rl o sd a t o s ;A c c e d e ra lb a n c o2 ;D a t os ea l m a c e n ae ne lr e g i s t r oW

B C FE E C O N 1 , E E P G D;S e l e c c i o n a rl aE E P R O M

La misma secuencia de programa escrita en C se parece a lo siguiente:

W=E E P R O M _ R e a d ( A D D R E S S ) ;

Las ventajas del uso del lenguaje C se han hecho ms obvias, no lo cree?

ESCRITURA EN LA MEMORIA EEPROM


Antes de escribir los datos en la memoria EEPROM es necesario escribir la direccin en el registro EESADR y los datos en el registro EESAT. Slo ha quedado seguir a una secuencia especial para iniciar la escritura para cada byte. Durante el proceso de escritura las interrupciones deben estar deshabilitadas. El ejemplo que sigue muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador:

B S FS T A T U S , R P 1 B S FS T A T U S , R P 0 B T F S CE E C O N , W R 1 ;E s p e r a raq u es ec o m p l e t el ae s c r i t u r aa n t e r i o r G O T O$ 1; B C FS T A T U S , R P 0 M O V FA D D R E S S , W M O V W FE E A D R M O V FD A T A , W M O V W FE E D A T A B S FS T A T U S , R P 0 ;B a n c o2 ;M o v e rl ad i r e c c i naW ;E s c r i b i rl ad i r e c c i n ;M o v e rl o sd a t o saW ;E s c r i b i rl o sd a t o s ;B a n c o3

B C FE E C O N 1 , E E P G D;S e l e c c i o n a rl aE E P R O M B S FE E C O N 1 , W R E N ;E s c r i t u r aal aE E P R O Mh a b i l i t a d a B C FI N C O N , G I E M O V L W5 5 h M O V W FE E C O N 2 M O V L WA A h M O V W FE E C O N 2 B S FE E C O N 1 , W R B S FI N T C O N , G I E ;I n t e r r u p c i o n e sh a b i l i t a d a s ;T o d a sl a si n t e r r u p c i o n e sd e s h a b i l i t a d a s

B C FE E C O N 1 , W R E N ;E s c r i t u r aal aE E P R O Md e s h a b i l i t a d a

La misma secuencia de programa escrita en C se parece a lo siguiente:

W=E E P R O M _ W r i t e ( A D D R E S S ,W ) ;

No hace falta comentar nada. Vamos a hacerlo en mikroC...

/ /E le j e m p l om u e s t r ac m ou t i l i z a rl al i b r e r aE E P R O Me ne lc o m p i l a d o rm i k r o CP R Of o rP I C . c h a ri i ;/ /L av a r i a b l ei iu t i l i z a d ae ne lb u c l e v o i dm a i n ( ) { A N S E L=0 ; A N S E L H=0 ; P O R T B=0 ; P O R T C=0 ; P O R T D=0 ; T R I S B=0 ; T R I S C=0 ; T R I S D=0 ; f o r ( i i=0 ;i i<3 2 ;i i + + ) E E P R O M _ W r i t e ( 0 x 8 0 + i i ,i i ) ; E E P R O M _ W r i t e ( 0 x 0 2 , 0 x A A ) ; / /C o n f i g u r a c i nd el o sp i n e sA Nc o m oE / Sd i g i t a l e s

/ /L l e n a re lb f e rc o nl o sd a t o s / /E s c r i b i rl o sd a t o se nl ad i r e c c i n0 x 8 0 + i i / /E s c r i b i ru nd a t oe nl ad i r e c c i n2d el aE E M P R O M

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

80/82

4/2/2014
E E P R O M _ W r i t e ( 0 x 5 0 , 0 x 5 5 ) ; / /d el aE E M P R O M D e l a y _ m s ( 1 0 0 0 ) ; P O R T B=0 x F F ; P O R T C=0 x F F ; D e l a y _ m s ( 1 0 0 0 ) ; P O R T B=0 x 0 0 ; P O R T C=0 x 0 0 ; D e l a y _ m s ( 1 0 0 0 ) ;

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos


/ /E s c r i b i ru nd a t oe nl ad i r e c c i n0 x 5 0

/ /D i o d o se nl o sp u e r t o sP O R T ByP O R T C / /p a r ai n d i c a re lc o m i e n z od el al e c t u r a

P O R T B=E E P R O M _ R e a d ( 0 x 0 2 ) ;

/ /L e e rl o sd a t o sd el ad i r e c c i n2d el aE E P R O My

/ /v i s u a l i z a r l ae ne lp u e r t oP O R B P O R T C=E E P R O M _ R e a d ( 0 x 5 0 ) ; / /L e e rl o sd a t o sd el ad i r e c c i n0 x 5 0d el aE E P R O My

/ /v i s u a l i z a r l ae ne lp u e r t oP O R C D e l a y _ m s ( 1 0 0 0 ) ; f o r ( i i=0 ;i i<3 2 ;i i + + ){ / /L e e re lb l o q u ed e3 2b y t e sd el ad i r e c c i n

P O R T D=E E P R O M _ R e a d ( 0 x 8 0 + i i ) ;/ /0 x 8 0yv i s u a l i z a r l ae ne lp u e r t oP O R T D D e l a y _ m s ( 2 5 0 ) ; } }

Aprimera vista, b asta con encender una fuente de alimentacin para hacer funcionar un microcontrolador. A primera vista, b asta con apagar una fuente de alimentacin para detenerlo. Slo a primera vista. En realidad, el arranque y el final del funcionamiento son las fases crticas de las que se encarga una seal especial denominada RESET.

3.12 REINICIO! BLACK-OUT, BROWN-OUT O RUIDOS?


Al producirse un reinicio el microcontrolador detiene su funcionamiento inmediatamente y borra sus registros. Una seal de reinicio se puede generar externamente en cualquier momento (nivel lgico bajo en el pin MCLR). Si se necesita, una seal tambin puede ser generada por la lgica de control interna. Al encender una fuente de alimentacin siempre se produce un reinicio. Por muchos eventos de transicin que ocurren al encender una fuente de alimentacin (centelleos y fogonazos de contactos elctricos en interruptores, subida de voltaje lenta, estabilizacin de la frecuencia de seal de reloj graduada etc.) es necesario proporcionar un cierto tiempo muerto antes de que el microcontrolador se ponga a funcionar. Dos temporizadores internos PWRT y OST se encargan de eso. El PWRT puede estar habilitado/ deshabilitado durante el proceso de escribir un programa. Vamos a ver cmo funciona todo. Cuando el voltaje de la fuente de alimentacin alcanza entre 1.2 y 1.7V, un circuito denominado temporizador de arranque (Power-up timer) mantiene al microcontrolador reiniciado durante unos 72mS. Tan pronto como transcurra el tiempo, otro temporizador denominado temporizador de encendido del oscilador (Oscillator start-up timer) genera otra seal de reinicio durante la duracin de 1024 perodos del oscilador de cuarzo. Al expirar el tiempo muerto (marcado con Reset T en la Figura) y al poner a alto el pin MCLR, todas las condiciones se han cumplido y el microcontrolador se pone a ejecutar la primera instruccin en el programa.

Aparte de este reinicio "controlado" que ocurre al encender una fuente de alimentacin, hay dos tipos de reinicio denominados Black-out y Brown-out que pueden producirse durante el funcionamiento del microcontrolador as como al apagar una fuente de alimentacin.

REINICIO BLACK-OUT
El reinicio black out ocurre al apagar una fuente de alimentacin correctamente. El microcontrolador no tiene tiempo para hacer nada imprevisible puesto que el voltaje cae muy rpidamente por debajo de su valor mnimo. En otras palabras, se apaga la luz, las cortinas bajan y el espectculo ha terminado!

REINICIO BROWN-OUT
Cuando el voltaje de la fuente de alimentacin cae lentamente (un ejemplo tpico es descarga de bateras, aunque el microcontrolador experimentara unas cadas mucho ms rpidas como un proceso lento) los componentes internos detienen su funcionamiento gradualmente y ocurre el as llamado reinicio Brownout. En tal caso, antes de que el microcontrolador detenga su funcionamiento completamente, hay un peligro real de que los circuitos que funcionan a frecuencias altas se pongan a funcionar de forma imprevisible. El reinicio brown-out puede causar cambios fatales en el programa ya que se almacena en la memoria flash incorporada en el chip.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

81/82

4/2/2014

Microcontrolador PIC16F887 - Microcontroladores PIC Programacin en C con ejemplos

RUIDO ELCTRICO
Es un tipo especial del reinicio Brownout que ocurre en un ambiente industrial cuando voltaje de alimentacin parpadea por un momento y cae por debajo del valor mnimo. Aunque es corto, este ruido producido en una lnea de conduccin elctrica puede afectar desfavorablemente al funcionamiento del dispositivo.

PIN MCLR
Un cero lgico (0) al pin MCLR causa un reinicio inmediato y regular. Es recomendable conectarlo de la forma mostrada en la Figura a la derecha. La funcin de los componentes adicionales es de mantener un uno lgico "puro" durante el funcionamiento normal. Si sus valores se seleccionan de manera que proporcionen un nivel lgico alto en el pin despus de que haya transcurrido el tiempo muerto reset T, el microcontrolador se pondr a funcionar inmediatamente. Esto puede ser muy til cuando se necesita sincronizar el funcionamiento del microcontrolador con los componentes adicionales o con el funcionamiento de varios microcontroladores.

Para evitar posibles errores al producirse el reinicio Brown-out, el PIC 16F887 tiene un mecanismo de proteccin incorporado. Es un circuito simple, pero eficaz que reacciona cada vez que el voltaje de alimentacin cae por debajo de 4V (si se utiliza un voltaje de alimentacin de 5V) y mantiene este nivel de voltaje por ms de 100 microsegundos. Este circuito genera una seal despus de que todo el microcontrolador funcionar como si hubiera sido encendido por primera vez. previous chapter | table of contents | next chapter

MikroElektronika Embedded Solutions


PIC Solution
PIC De ve lopm e nt Boards PIC C om pile rs PIC Program m e rs/De bugge rs PIC Kits PIC Book s

Follow us on
STM32 Solution
STM32 De ve lopm e nt Boards STM32 C om pile rs STM32 Program m e rs/De bugge rs STM32 Kits

dsPIC Solution
dsPIC De ve lopm e nt Boards dsPIC C om pile rs dsPIC Program m e rs/De bugge rs dsPIC Kits dsPIC Book s

8051 Solution
8051 De v. Boards 8051 C om pile rs 8051 Program m e rs 8051 Book s 8051 Kits

Add-on boards
C lick Boards m ik rom e dia shie lds C om m unication Storage R e al Tim e C lock Display Me asure m e nt Audio & Voice Powe r Supply GPS GSM/GPR S

Tiva C Series Solution


Tiva C De ve lopm e nt Boards Tiva C C om pile rs Tiva C Program m e rs/De bugge rs Tiva C Kits

PIC32 Solution
PIC 32 De ve lopm e nt Boards PIC 32 C om pile rs PIC 32 Program m e rs/De bugge rs PIC 32 Kits

AVR Solution
AVR De ve lopm e nt Boards AVR C om pile rs AVR Program m e rs/De bugge rs AVR Kits

Additional Software
Visual TFT Visual GLC D Pack age Manage r GLC D Font C re ator Tim e r C alculator

Support

Forum

m ik roBUS

Le ts m ak e

Pre ss

Le gal Inform ation

Product Archive

About Us

C opyright 1998 - 2014. MikroElektronika. All rights reserved. All trade and/or services marks mentioned are the property of their respective owners.

http://www.mikroe.com/chapters/view/81/capitulo-3-microcontrolador-pic16f887/

82/82

You might also like