Você está na página 1de 52

TIMERS

INTRODUCCIN
Un temporizador, en general, es un dispositivo que marca o indica el
transcurso de un tiempo determinado.

Los PIC16F87X tienen 3 mdulos temporizadores denominados TIMER0
(TMR0), TIMER1 (TMR1) y TIMER2 (TMR2).

Los mdulos temporizadores en los microcontroladores PIC se emplean
para contabilizar intervalos de tiempo o para contar flancos que aparecen
en pines externos del micro, esto ltimo lo pueden hacer TMR0 y TMR1
pero no TMR2.

Cuando trabajan como temporizadores, utilizan como patrn de cuenta un
reloj que se genera a partir del oscilador del microcontrolador.

Cada mdulo puede generar una interrupcin para indicar que algn evento
ha ocurrido (que se ha sobrepasado el valor mximo de cuenta de un
temporizador overflow- o que se ha alcanzado un valor dado)
TIMER 0
Un timer se implementa por medio de un contador que determina un tiempo
preciso entre el momento en que el valor es cargado y el instante en el que
se produce su desbordamiento.

Bsicamente, un temporizador consiste en un contador ascendente (tambien
podra ser descendente) que, una vez inicializado con un valor, su contenido
se incrementa con cada impulso de entrada hasta llegar a su valor mximo
b11111111, desbordando y volviendo a comenzar desde cero
TIMER 0
El PIC16F877 dispone de un timer principal denominado Timer0 o TMR0 que
es un contador ascendente de 8 bits.

El TMR0 se inicializa con un valor, que se incrementa con cada impulso de
entrada hasta su valor mximo b11111111, con el siguiente impulso de
entrada el contador se desborda pasando a valer b00000000, circunstancia
que se advierte mediante la activacin del flag de fin de conteo T0IF
localizado en el registro INTCON.
TIMER 0
Registro especial INTCON
TIMER 0
Los impulsos aplicados al TMR0, pueden provenir de los pulsos
aplicados al pin T0CKI o de la seal de reloj interna (Fosc/4), lo que le
permite actuar de dos formas diferentes:

Como contador de los impulsos externos que le llegan por el
pin RA4/T0CKI

Como temporizador de tiempos

El actuar de una u otra forma depende del bit T0CS del registro

OPTION:

Si T0CS=1, el TMR0 acta como contador.
Si T0CS=0, el TMR0 acta como temporizador.
TIMER 0
Registro especial OPTION
TIMER 0
TMR0 como CONTADOR
Cuando el TMR0 trabaja como contador se le introducen los impulsos desde el
exterior por el pin RA4/T0CKI (TMR0 External Clock Input). Su misin es contar
el nmero de acontecimientos externos representados por los impulsos que se
aplican al pin T0CKI.

El tipo de flanco activo se elige mediante el bit T0SE del registro OPTION:

Si T0SE=1, el flanco activo es descendente
Si T0SE=0, el flanco activo es ascendente
TMR0 como TEMPORIZADOR
Cuando el TMR0 funciona como temporizador cuenta los impulsos de FOSC/4.
Se usa para determinar intervalos de tiempo concretos.

Para una frecuencia de reloj igual a 4 MHz el TMR0 se incrementa cada 1
microsegundo.
Para una frecuencia de reloj igual a 8 MHz el TMR0 se incrementa cada medio
microsegundo.
TIMER 0
Como se trata de un contador ascendente el TMR0 debe ser cargado con el
valor de los impulsos que se desean contar restados de 256 que es el valor
de desbordamiento. Por ejemplo, para contar 4 impulsos, se carga el TMR0
con 256-4=252.
TIMER 0
DIVISOR DE FRECUENCIA (PRESCALER)
A veces es necesario controlar tiempos largos y aumentar la duracin de los
impulsos que incrementan el TMR0. Para cubrir esta necesidad se dispone de un
circuito programable llamado Divisor de frecuencia o Prescaler que divide la
frecuencia utilizada por diversos rangos para poder conseguir temporizaciones ms
largas.

La temporizacin que se puede obtener con este mdulo se obtiene de la siguiente
relacin:

Tiempo = [(256 - precarga)*PS+2]*Tinstruccion

Donde:
precarga = Valor que se le asigna al registro TMR0 al comenzar la temporizacin
PS = Preescalador.
Tinstruccin = 4/frecuencia de oscilacin y la temporizacin est dada en
segundos.
TIMER 0
EJEMPLO
Se desea complementar el valor del puerto B cada 50mS. Se estar revisando que se haya cumplido el
tiempo de la temporizacin checando la bandera T0IF. Utilizando la expresin de la precarga y
utilizando el preescalador ms grande (256) obtenemos el valor que necesitamos cargar al registro
TMR0 para obtener una temporizacin de 50mS
include <htc.h>
__CONFIG(0x3f71);
void init(void)
{
// port directions: 1=input, 0=output
TRISB = 0b00000000;
}

void main(void)
{
init();
T0CS=0; // Con valor de cero actua como contador
PSA=0; // prescaler asignado al timer 0
// bits configuracion prescaler como indica la tabla 111 = 256
PS0=1;
PS1=1;
PS2=1;
//OPTION=0b00000111; se puede declarar utilizando el registro completo
T0IF=0;
TMR0=60;
while (1){
if (T0IF==1)
{
T0IF=0;
PORTB=~PORTB;
TMR0=60;
}

}
}
INTERRUPCIONES
Se trata de un acontecimiento que hace que el
micro deje de lado lo que se encuentra
realizando, atienda ese suceso y luego regrese
y contine con la actividad que estaba
realizando.
Hay dos tipos de interrupciones posibles, una es
mediante una accin externa (es decir por la
activacin de uno de sus pines), la otra es
interna (por ejemplo cuando ocurre el
desbordamiento de uno de sus registros)

INTERRUPCIONES
Cada fuente de interrupcin posee dos bits
asociados a ella:
Una Bandera (terminada en F) de Interrupcin,
la cual es activada (en alto) por el evento para
solicitar una interrupcin.
Una Mscara (terminada en E) Local de
Interrupcin, la cual si est desactivada (en
bajo) bloquear la solicitud de interrupcin
correspondiente, pero si est activada (en alto)
permitir la solicitud de Interrupcin.
INTERRUPCIONES
Adems existe una mscara de interrupcin global GIE (INTCON<7>), la
cual bloquear todas las solicitudes de interrupcin si est desactivada
(GIE=0).
Algunas fuentes de interrupcin tambin poseen una segunda mscara de
interrupcin global denominada PEIE (INTCON<6>). De hecho, acta sobre
todas las fuentes de interrupcin, excepto las interrupciones debidas a al pin
INT, el sobre flujo del Timer 0 y las interrupciones del puerto B (INTF, T0IF y
RBIF).
INTERRUPCIONES
De acuerdo a lo anterior, la nica manera en que una solicitud de interrupcin
provoca en efecto una interrupcin en el programa es cuando:
La mscara global est activada (GIE=1).
(En su caso) la mscara global de perifricos est activada (PEIE=1)
La mscara local est activada
Ocurre un evento que activa la bandera correspondiente.
INTERRUPCIONES
Cuando se cumplen las siguientes tres
condiciones simultneamente:

El bit GIE est activado (en alto)
Se produce un evento que solicita interrupcin (se activa
alguna de las banderas de interrupcin)
Est activada la mscara correspondiente a la bandera
activada.
Proceso de reconocimiento de una interrupcin
Entonces la CPU es interrumpida inmediatamente y ejecuta lo siguiente:

Termina la ejecucin de la instruccin actual.
Desactiva el bit GIE (GIE=0) para bloquear cualquier otra solicitud de interrupcin.
La direccin de programa de la siguiente instruccin a ejecutar es guardada en el
stack.
Ejecuta un salto a la localidad de programa 0004h denominada vector de
interrupcin, en donde el usuario deber haber colocado el inicio de la rutina de
atencin a la interrupcin.
Ejecuta la rutina de atencin a la interrupcin escrita por el usuario, en la cual ste
podr constatar la fuente de interrupcin consultando por comparacin las
banderas de interrupcin.
La rutina de atencin a la interrupcin deber limpiar los bits de la bandera que
solicit la interrupcin antes de rehabilitar interrupciones, para evitar interrupciones
recursivas.
La rutina de atencin deber terminar con una instruccin RETFIE(en asembler), la
cual activa nuevamente el bit GIE (GIE=1) y lee el stack para continuar la ejecucin
del programa que fue interrumpido en la siguiente instruccin.

INTERRUPCIONES
static void interrupt nombre (void) {

if (T0IF==1)
{

T0IF=0;
PORTB=~PORTB;
TMR0=60;
}

}
#include <htc.h>
__CONFIG(0x3F71);

void main(void)
{
while (1){
}
}

include <htc.h>
__CONFIG(0x3f71);
void init(void)
{
// port directions: 1=input, 0=output
TRISB = 0b00000000;
}

void main(void)
{
init();
T0CS=0; // Con valor de cero acta como contador
PSA=0; // prescaler asignado al timer 0
// bits configuracin prescaler como indica la tabla 111 = 256
GIE=1; // Interrupcin global
T0IE=1: // habilitador interrupcin timer 0
PS0=1;
PS1=1;
PS2=1;
//OPTION=0b00000111; se puede declarar utilizando el registro completo
T0IF=0;
TMR0=60;
while (1)
{

}
}

El Mdulo del Timer 1.

El Timer 1 a diferencia del Timer 0 es un
contador / temporizador de 16 bits.
El conteo es realizado por dos registros de
8 bits: (TMR1H (0Fh) y TMR1L (0Eh)),
estos dos registros son tanto de lectura
como de escritura.
Al par de registros TMR1H:TMR1L los
denominaremos por comodidad como si
fueran un solo registro de 16 bits (TMR1).

El Mdulo del Timer 1.
As, el registro TMR1 se incrementa de
0000h a FFFFh y en la siguiente cuenta
se reinicia en 0000h y as sucesivamente,
al reciclarse se activa (en alto) la bandera
TMR1IF (PIR1<0>), la cual puede ser
utilizada para generar una interrupcin, o
bien, para ser consultada por inspeccin,
teniendo las mismas precauciones que ya
se explicaron antes para la bandera T0IF.

El Mdulo del Timer 1.
Este mdulo al igual que el Timer 0 puede funcionar en modo temporizador y en
modo contador. En modo temporizador el par de registros TMR1 se
incrementa en cada ciclo de instruccin, este modo se selecciona poniendo a 0
el bit TMR1CS del registro T1CON.

En modo contador el par de registros TMR1 se incrementa en cada flanco
subida de una seal de reloj externa en RC0 o por flanco de subida de un
oscilador a cristal conectado entre RC0 y RC1 , este modo se selecciona
poniendo a 1 el bit TMR1CS del registro T1CON.

T1OSCEN : Impulsos reloj externo
0 : RC0/T1OSO/T1CKI
1 : RC0/T1OSO/T1CKI y RC1/T1OSI/CCP2

T1SYNC# : Sincronizacin reloj interno con reloj externo
0 : Sincronizacin
1 : No hay Sincronizacin


- - T1CKPS1 T1CKPS0 T1OSCEN T1SYN# TMR1CS TMR1ON
El preescalador del Timer 1 tiene un valor mximo de 8
y se selecciona con los bits T1CKPS1:T1CKPS0 de la
siguiente manera:
T1CKPS1 T1CKPS0
0 0 1
0 1 2
1 0 4
1 1 8

A diferencia del Timer 0, el Timer 1 tiene la posibilidad
de activar o detener la cuenta mediante el bit TMR1ON
del registro T1CON.

T1OSCEN : Impulsos reloj externo
0 RC0/T1OSO/T1CKI
1 RC0/T1OSO/T1CKI y
RC1/T1OSI/CCP2

T1SYNC# : Sincronizacin reloj interno
con reloj externo
0 Sincronizacin
1 No hay Sincronizacin
TMR1CS : 0 Temporizador
: 1 Contador


TMR1ON : Activa desactiva
el Timer

El Mdulo del Timer 1.
Carga y Temporizacin
En modo temporizador el Timer 1 incrementa su cuenta en cada ciclo de
instruccin. La temporizacin que se puede obtener con este mdulo se
obtiene de la siguiente relacin:

TempTMR1 = [(65536 - precarga)*PS]*Tinstr
Donde:
precarga Valor que se le asigna al par de registros TMR1 al comenzar la
temporizacin
PS Valor del preescalador
Tinstr 4/frecuencia de oscilacin
TempTMR1 Temporizacin dada en segundos

La temporizacin mxima utilizando el oscilador interno del pic 16f877 y el
valor ms grande de preescalador es:

TempTMR1.Max = [(65536 - 0)*8]*1uS = 524288uS
Ejemplo
Se desea complementar el valor del puerto B cada
50mS. Se estar revisando que se haya cumplido el
tiempo de la temporizacin chequeando la bandera
TMR1IF. Utilizando la expresin de la precarga y
utilizando el preescalador ms grande.

precarga = -[([50mS/(4/fosc)])/8]+65536 = 59286 =
0xE796

As que para obtener una temporizacin de 50mS
mediante el Timer 1 se debe cargar 0xE7 al registro
TMR1h y 096 al registro TMR1L. El cdigo del
programa sera el siguiente:

#include <htc.h>
__CONFIG(0x3f71);
void init(void)
{
// port directions: 1=input, 0=output
TRISB = 0b00000000;
}

void main(void)
{
init();
TMR1CS=0; // Con valor de cero actua como contador

// bits configuracion prescaler como indica la tabla 11 = 8
T1CKPS0=1;
T1CKPS1=1;

//T1CON=0b00111100; se puede declarar utilizando el registro completo
TMR1IF=0;
TMR1H=0x3c;
TMR1L=0xB0;
TMR1ON=1;
while (1){
if (TMR1IF==1)
{
TMR1IF=0;
PORTB=~PORTB;
TMR1H=60;
TMR1L=60;
}
}
}
INTERRUPCION RB4 RB7
Interrupcin por cambio de nivel en los pines
RB4 a RB7
Registros involucrados
TRISB
PORTB
OPTION_REG
INTCON

OPTION_REG

/RBPU (Resistor Port B Pull-UP Enable Bit)

0 = habilita las resistencias pull-up
1 = deshabilita las resistencias pull-up


/RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0
INTCON
RBIE (RB Port Change Interrupt Enable) : Permiso de
interrupcin por cambio de estado en los pines RB4 a RB7
0 = Deshabilitado
1 = Habilitado

RBIF (RB Port Change Interrupt Flag): Bandera de estado de la
interrupcin por cambio en los pines RB4 a RB7
0 = No hay interrupcin
1 = Hay interrupcin por cambio en los pines RB4 a RB7 (Borrar
por software)

GIE PEIE TOIE INTE RBIE TOIF INTF RBIF
Ejemplo :
Se tienen cuatro pulsadores conectados a las
lneas del puerto B (RB4 a RB7), en el
momento en que algn pulsador se activa
debe incrementar un contador que se
visualizar en otro puerto


PROYECTO SEGUNDO PARCIAL.
Cuadrada
Triangular
Senoidal
HZ
KHZ
ENTER
PIC 16f877A




TECLADO Y
TIMER 1
CON
INTERRUPCIN

D/A
Salida
Realizar un generador de seales cuadrada, triangular y senoidal, la
frecuencia de ingresara por teclado, con rangos de 1Hz a 100kHz, la
frecuencia se visualizara en 3 displays.
HZ
KHZ
El Mdulo del Timer 2
El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener
un preescalador y un post-escalador.
Adems este mdulo cuenta con un registro de periodo PR2 que marca el
valor mximo que puede alcanzar la cuenta del registro TMR2
A diferencia de los otros temporizadores, el temporizador Timer 2 no
incrementa su cuenta hasta llegar a 0xFF
Incrementa su cuenta desde 000 con cada ciclo de instruccin hasta que
el valor del registro TMR2 coincide con el del registro PR2 y despus, en el
siguiente ciclo reinicia la cuenta desde 000.
El preescalador tiene la misma funcin que en los otros dos timers y sirve
como divisor de frecuencia antes de cada incremento
El post-escalador funciona como un divisor de frecuencia despus de cada
coincidencia entre los registros TMR2 y PR2 ,si el post-escalador es 1:1 la
bandera de interrupcin TMR2IF se habilitar en cada coincidencia entre
TMR2 y PR2, en cambio si por ejemplo el post-escalador es 1:16, la
interrupcin se presentar cada 16 coincidencias
El Mdulo del Timer 2
Este temporizador, al igual que el Timer 1, puede habilitarse y deshabilitarse
mediante el bit TMR2ON.
El preescalador se selecciona con los bits T2CKPS1:T2CKPS0 y el post-
escalador con los bits T0UTPS3:TOUTPS0 de la siguiente manera:





Carga y Temporizacin
La temporizacin del Timer 2 est dada por la siguiente expresin:
TempTMR2 = [Preescaler*(PR2+1)*Postscaler]*Tinstr

Donde
Preescaler = Valor del preescalador
PR2 = Valor cargado al registro PR2
Postscaler = Valor del post-escalador
Tinstr = 4/frecuencia de oscilacin
TempTMR2 = Temporizacin dada en segundos

PR2 = [([TempTMR2/(4/fosc)])/(Preescaler*Postscaler)]-1


Ejemplo
Se desea complementar el valor del puerto B cada 50ms. Se estar revisando que se haya cumplido
el tiempo de la temporizacion chequeando la bandera TMR2IF. Utilizando la expresin de la precarga y
utilizando el preescalador y el post-escalador ms grande (16) obtenemos el valor quer que
necesitamos cargar al registro PR2 para obtener una temporizacion de 50mS.
PR2 = [([50mS/(4/4Mhz)])/(16*16)]-1 = 194.31

Ya que no podemos cargar nmeros fraccionarios el valor del registro PR2 necesario es 194. El
cdigo del programa sera el siguiente:
Estructura de programa en C
#include <pic.h>
#include "delay.h
.
.

// Configuration Bits (Fuses)
// Estas lineas son opcionales, ya que se pueden fijar externamente
// en MPLAB IDE bajo la opcion de la barra de menu
// Definiciones:
// RC/HS/XT/LP: Oscilador RC, High-speed XTAL, XTAL, Low-power XTAL
// WDT: Watchdog Timer (EN/DIS: Enable, Disable)
// PWRT: Power-up Timer (EN/DIS: Enable, Disable)
// PROTECT: Code write protection

__CONFIG(XT&WDTDIS&PWRTDIS&PROTECT);

#define XTAL_FREQ 20MHZ

// Variables Globales
static volatile bit boton = 0;

// Funcion Interrupcion
static void interrupt isr(void) {
}
// Rutina Principal
void main(void) {
}
Ejercicios
Escribir un programa que realice un parpadeo de 200 ms en el
encendido/apagado de ocho LEDs conectados en ctodo comn al Puerto B
de un microcontrolador PIC 16F877 operando en modo XT con un oscilador
de 4 MHz.
Ejercicios
Debido a un accidente de circulacin se han colocado cuatro seales luminosas a cada lado de la
calzada para que sirvan de advertencia a los conductores que circulan por esa ruta (ver figura). El
control del encendido/apagado se realiza mediante un microcontrolador PIC 16F84 y unos drivers
conectados a los terminales del puerto B, como indica la figura.
El sistema debe arrancar con todas las lmparas apagadas. Al apretar el pulsador conectado a RA4,
debe comenzar la siguiente secuencia de luces: L0, L2, L4, L6, L1, L3, L5 y L7, es decir, primero las
de la derecha y luego las de la izquierda. Al finalizar la secuencia, el ciclo debe repetirse
indefinidamente. El oscilador es XT de 4 MHz y el ciclo completo debe durar (ms o menos) 1
segundo.

Comunicacin Serie Asncrona
Entre las herramientas que disponen los PIC16F8x se encuentra el
USART (Transmisor/Receptor Sncrono/Asncrono Serie), llamado SCI
(Serial Comunications Interface), puede funcionar como un sistema de
comunicacin bidireccional, adaptndose a multitud de perifricos y
dispositivos que transfieren informacin de forma serial, tales como un
ordenador.
Tambin puede trabajar en modo unidireccional para soportar
perifricos como memorias, conversores, etc.
USART
Asncrono (Bidireccional)
Sncrono (Unidireccional)
En el modo asncrono, la comunicacin serie del USART en los
PIC16F8x esta soportada por las lneas RC6/TX/CK y RC7/RX/DT por
las que se mueven los bits a la frecuencia interna de reloj.
En el modo sncrono, los bits de informacin circulan en ambos
sentidos por la lnea RC7/RX/DT a la frecuencia de los impulsos que
genere el maestro por la linea RC6/TX/CK
Comunicacin Serie Asncrona
En esta forma de comunicacin serie, se usa la norma RS-232-C,
donde cada palabra de informacin o dato se enva
independientemente de los dems.
Suele constar de 8 o 9 bits y van precedidos por un bit de START
(inicio) y detrs de ellos se coloca un bit de STOP (parada), de acuerdo
con las normas del formato estndar NRZ (Non Return-to-Zero).
Los bits se transfieren a una frecuencia fija y normalizada.
La USART transmite y recibe primero el bit menos significativo.
La USART en modo asncrono contiene los siguientes elementos:

Generador de Baudios
Circuito de Muestreo
Transmisor Asncrono
Receptor Asncrono

Modo Asncrono
Comunicacin Serie Asncrona
Para el protocolo asncrono RS-232-C, la frecuencia en baudios
(bits por segundo) a la que se realiza la transferencia se debe
efectuar a un valor normalizado: 330, 600, 1200, 2400, 4800,
9600, 19200, 38400, etc.
Para generar esta frecuencia, el USART dispone de un
generador de frecuencia en Baudios, BRG, cuyo valor es
controlado por el contenido grabado en el registro SPBRG.
Aparte del valor X cargado en el registro SPBRG, la frecuencia
en baudios del generador depende del bit BRGH del registro
TXSTA <2>.
En el caso de que BRGH = 0 se trabaja en baja velocidad y si
BRGH = 1 se trabaja en alta velocidad.
Segn este bit se obtendr el valor de una constante K
necesaria en la determinacin de la frecuencia de
funcionamiento.
Generador de Baudios
Comunicacin Serie Asncrona
Generador de Baudios
X es el valor cargado en el registro SPBRG

BRG
Si BRG = 0, baja velocidad y K = 64
Si BRG = 1, alta velocidad y K = 16
Comunicacin Serie Asncrona
Comunicacin Serie Asncrona
Comunicacin Serie Asncrona
Trasmisor Asncrono
La figura muestra el diagrama por bloques de la seccin de transmisin del USART en modo
asncrono.
El dato que se desea transmitir por el USART se deposita en el registro TXREG y a continuacin
se traspasa al registro de desplazamiento TSR, que va sacando los bits secuencialmente y a la
frecuencia establecida.
Ademas, antes de los bits del dato de informacin incluye un bit de inicio y despus de sacar
todos los bits aade un bit de parada.
El USART receptor recibe, uno a uno, los bits, elimina los de control y los de informacin una vez
que han llenado el registro de desplazamiento RSR los traslada automticamente al registro
RCREG, donde quedan disponibles para su posterior procesamiento
Comunicacin Serie Asncrona
Si observamos el diagrama de bloques de la seccin transmisora del USART. El ncleo esta
constituido por el registro de desplazamiento TSR, que obtiene el dato desde el registro TXREG y
luego lo va desplazando y sacando bit a bit, en serie, por la lnea RC6/TX/CK.
El primer bit que sale es el de menos peso. El dato a transferir se carga por software en TXREG y
se transfiere al TSR en cuanto se haya transmitido el bit de parada del dato anterior.
La transferencia entre los dos registros se realiza en un ciclo y entonces el sealizador TXIF se
pone a 1, para advertir que el registro de transmisin se ha vaciado.
Tambin en este momento puede producirse una interrupcin si se ha posibilitado el uso de
interrupciones. Cuando se escribe otro dato sobre TXREG, el sealizador TXIF se pone a 0. El bit
TRMT sirve para indicar el estado del registro TSR y vale 1 cuando esta vaco.
Comunicacin Serie Asncrona
La secuencia de pasos a seguir para una transmisin en el USART es la como sigue:

Configurar las lneas RC6/TX/CK como salida y RC7/RX/DT como entrada.
Asignar SYNC=0 y SPEN=1 para activar el USART como asncrono.
Si se va a trabajar con interrupcin, asignar TXIE=1, adems de habilitar las
interrupciones.
Si el dato consta de 9 bits, en lugar de los 8 tpicos, asignar el bit TX9=1. El noveno
bit se colocar en TX9D (TXSTA)
Se carga el valor adecuado en el registro SPBRG, para producir la frecuencia de
trabajo deseada. Hay que controlar el bit BRGH (alta y baja velocidad)
Activar la transmisin con TXEN = 1. El bit TXIF tendra valor 1; ya que TXREG se
encuentra vacio.
Cargar en TXREG el dato a transmitir. Comienza la transmisin.

Comunicacin Serie Asncrona
Receptor Asncrono
La figura muestra el diagrama de bloques de la seccin receptora del USART
Los datos se reciben en serie, bit a bit, por la linea RC7/RX/DT y se van introduciendo
secuencialmente en el registro de desplazamiento RSR que funciona a una frecuencia 16 veces
ms rapida que la de trabajo (baud rate). Cuando el dato consta de 9 bits hay que programar el bit
RX9 = 1 y el noveno bit de informacin se colocar en el bit RX9D del registro RCSTA.
Comunicacin Serie Asncrona
Receptor Asncrono
La recepcin es habilitada colocando a 1-lgico el bit CREN (RCSTA<4>), Despus de detectar
el bit de parada el dato presente en RSR es transferida al registro RCREG( si es que est vaco)
Si la transferencia ha sido completada con xito el RCIF (PIR1<5>) es puesto a 1-lgico, si lo
deseamos podemos usar esta caracterstica para trabajar interrupciones. Para ello deberemos
habilitar el bit RCIE (PIE1<5>),El bit RCIF solo es de lectura y colocado a 0-lgico por hardware
es decir cuando el registro RCREG esta vaco.
El registro RCREG es una suerte de pila de dos posiciones. Por tanto es capaz de almacenar 2
datos (bytes) y mantener un tercer dato en RSR, al llegar el bit de stop del 3 dato el
microcontrolador procede a colocar a 1-lgico en el bit OERR (over run error bit) y el valor
presente en RSR se pierde.
De darse esta situacin lo que debemos hacer es rescatar los dos datos que estn en la pila de
RCREG.
Luego resetear el OERR, para eso es necesario resetear el bit CREN (ponerlo a 0-lgico y luego
a 1-lgico).
Cuando se activa el bit OERR las transferencias de RSR a RCREG son deshabilitadas por lo
tanto debemos cumplir con hacer el reset del bit CREN para normalizar la recepcin.
Hay otro bit que tambin es importante sealar y es el bit FERR (RCSTA<2>) error de frame o
trama o marco. El bit FERR se coloca a 1-lgico si detecta un 0-lgico como bit de parada.
Por lo tanto antes de leer lo que contiene el registro RCREG es necesario revisar el valor de los
bits FERR y OERR.


Comunicacin Serie Asncrona
Inicializar el registro SPBRG con el valor apropiado que genere los baudios necesarios. No olvide
colocar un valor al bit BRGH en funcin a si va o no a transmitir en alta velocidad.
Habilite la puerta serial asncrona colocando a 0-lgico el bit SYNC y a 1-lgico el bit SPEN.
Si se va a trabajar con interrupcin, asignar RCIE=1, adems de habilitar las interrupciones.
Habilite la recepcin colocando a 1-lgico el bit CREN.
El bit RCIF se colocar a 1-lgico cuando un dato llegue completo al microcontrolador y una
interrupcin se generar si es que se ha seteado el bit RCIE.
Lea el registro RCSTA para obtener el valor del noveno bit (si es que esta trabajndo con 9 bits de
datos) y determine si hubo error en la comunicacin (revise los bits OERR y FERR).
Si no hubo error lea los 8 bits de datos del registro RCREG.
Si hubo algn error resetee el bit CREN.
La siguiente es la secuencia de pasos a realizar para configurar la recepcin asncrona
MAX 232
El circuito integrado MAX232 cambia los niveles TTL a los del estndar RS-232 cuando se hace
una transmisin, y cambia los niveles RS-232 a TTL cuando se tiene una recepcin. El circuito
tpico se muestra en la siguiente figura
Circuito General