Вы находитесь на странице: 1из 6

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA

DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores

Comunicación serial en microcontroladores.

Objetivos.
• Conocer los fundamentos y usar una comunicación serial asincrónica.
• Programar los registros que determinan la comunicación serial.
• Conocer las rutinas primitivas de comunicación: putchar y getchar.
• Simular el comportamiento de la comunicación serial.
• Visualizar en un osciloscopio los frames asincrónicos seriales.
• Programar la comunicación serial por interrupciones.

Estudio previo.
Comunicación Serial Asincrónica.
Se emplea para comunicar dos sistemas digitales empleando un mínimo de cables. No se
transmite un reloj entre las unidades que se comunican. Esta forma de intercambio de
información ha sido muy empleada y su uso está normalizado. Básicamente, en la
configuración mínima consiste de tres cables.
Usando la norma RS-232, los nombres lógicos de las señales y su ubicación en conectores
de 9 y 25 pines se ilustran en el siguiente diagrama:
DB9 DB25 DTE DCE
3 2 Tx Rx
2 3 Rx Tx
5 7 Gnd
Conector Cable Conector
Macho Hembra
1 1

Los conectores se muestran mirados de frente. El cable que conecta los dos equipos que
tengan interfaz serial tiene sus propios conectores que deben sintonizar con las salidas
existentes.
Un uno lógico en transmisión debe ser mayor de +5 volts y menor que +15; en recepción
debe estar entre +3 y +25.
Un cero lógico en transmisión debe ser mayor de -15 volts y menor que -5; en recepción
debe estar entre -25 y -3.

A pesar que está normalizado el tipo de conector si se trata de un equipo terminal(Data


Terminal Equipment) o un equipo de comunicación(Data Communication Equipment) es
preferible efectuar pruebas para determinar cuál es el transmisor y cuál es el receptor antes
de efectuar una conexión entre los dispositivos, ya que significa un riesgo eléctrico conectar
dos transmisores, que suelen ser dispositivos activos. Ubicando un tester entre tierra y el
pin 2 ó 3 en cada dispositivo antes de que estén conectados, puede determinarse la señal Tx,
ya que ésta es una salida activa; y normalmente está en uno lógico.

Prof. Leopoldo Silva Bijit. Lab. 09 18-10-2002 51


UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores

En el 8051, el pin 11 corresponde a la señal Rx, que puede denominarse también P3.0. Tx
se encuentra en el pin 10, y se denomina P3.1. Y recibe y transmite en niveles compatibles
TTL.
Tx Pin 13 P3.1

Pin 11 P3.0
Rx

Los pines corresponden al chip de 44 pines PLCC, que se encuetra en la tarjeta xess.

Existen circuitos integrados para cambiar de niveles lógicos entre RS-232 y TTL: Los
chips 1488, 1489 requieren dos fuentes. Los integrados ICL232 o MAX 232 emplean sólo
una fuente de 5 V.

Un frame de datos comienza cuando ocurre un canto de bajada, luego se envía un bit de
start, con nivel bajo. Luego los 8 bits de datos, con el menos significativo(lsb) primero; y el
más significativo (msb) al final. Luego termina el frame un pulso de stop en nivel alto.

lsb msb
1 8

start stop

Puede programarse un frame con uno, 1,5 ó 2 bits de stop. Que agregue un bit de paridad
par o impar, o que no agregue dicho bit, antes del bit se stop.

Las velocidades de transmisión se miden en baudios, que está definido como el número de
bits por segundo. Las velocidades usuales son: 300, 1200, 2400, 4800, 9600, 19.200,
38.400 hasta 115.200 en algunas puertas seriales.
Existen circuitos integrados que realizan la transmisión y recepción serial, tienen diferentes
denominaciones según los fabricantes: USART, ACIA.

La unidad de control del microcontrolador implementa un transmisor y receptor serial que


pueden funcionar en 4 diferentes modos. Dos de ellos tienen velocidades fijas de
transmisión y dos modos(uno de 8 y otro de 9 bits de datos) tienen velocidades
programables. El frame anterior, que se ilustra en el diagrama, corresponde al modo 8-bit
UART con velocidad variable( modo 1).
Los modos 2 y 3 se emplean para comunicar dos microcontroladores.

En el modo 1 (y 3) se requiere emplear el timer 1 como generador de baudios. Suele


emplearse el modo 2 del timer(autocarga) y con interrupciones deshabilitadas. En esta
configuración, la baudios quedan determinados por:
(2 SMOD * Frecuencia reloj)/(32*12(256-TH1)).

SMOD es PCON.7 , y PCON ocupa la dirección 0x87; se escribe por Byte.

Prof. Leopoldo Silva Bijit. Lab. 09 18-10-2002 52


UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores

SBUF tiene dirección 0x99, pero internamente son dos registros separados; uno para
transmisión y el otro para recepción. Basta mover un byte desde un registro a SBUFF para
que comience la transmisión.

El registro SCON, con dirección 0x98, permite programar el modo. El bit PCON.4 es REN
que estando en 1 habilita la recepción. PCON, también contiene a los flags TI, RI.

SCON 7 6 5 4 3 2 1 0
0x98 SM0 SM1 SM2 REN TB8 RB8 TI RI
bit 0 1 0 1 0 0 1 0

La siguiente programación ilustra la inicialización de la puerta serial.


SCON = 0x50; /* mode 1, 8-bit UART, receptor habilitado */
TI = 1; /* vacía el registro del transmisor, simulando que está lleno. */

Requiere también programar timer 1.


TMOD |= 0x20; /* timer 1, modo 2, 8-bit recarga */
TH1 = 0xf3; /* Valor de recarga para 2400 baudios. Depende del reloj */
TR1 = 1; /* pone a funcionar el timer */

TMODo 7 6 5 4 3 2 1 0
0x89 Gate1 C/T1 M11 M01 Gate0 C/T0 M10 M00
Byte 1

TCONontrol 7 6 5 4 3 2 1 0
0x88 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
bit 1

Luego de esta inicialización pueden ejecutarse las funciones orientadas a entrada salida de
caracteres: putchar, printf, scanf, getch

Las rutinas printf y scanf están implementadas en base a putchar y getchar. Se ilustran a
continuación las rutinas más primitivas para entrada y salida de caracteres.

Ambas rutinas son del tipo dedicación completa(el procesador espera, ejecutando
instrucciones), y operan encuestando(pooling) a los bits TI y RI.

La unidad de control del microcontrolador coloca en uno dichos bits, cuando se ha


terminado de sacar bit por bit(en serie) el contenido de un registro que se carga en
paralelo(TI); o cuando desde el medio externo ha llegado completo un frame, en serie, y se
tiene el carácter(ya en paralelo) en un registro de 8 bits(RI).

Prof. Leopoldo Silva Bijit. Lab. 09 18-10-2002 53


UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores

Los siguientes diagramas muestran la generación de las señales TI y RI, cuando el 8031
transmite y recibe respectivamente.

lsb msb
0 7
Tx
start stop

El programa
escribe en SBUF TI

Cuando el buffer de transmisión envía el octavo bit, queda disponible para ser cargado
nuevamente. Debe advertirse que no puede escribirse en SBUF si TI está bajo.

En el caso de recepción:

lsb msb
0 7
Rx
start stop

RI

Cuando se ha recibido los ocho bits en el buffer de Recepción se activa RI, indicando que
puede leerse el carácter. Debe advertirse que no puede leerse SBUF si RI está bajo.

#include <reg51.h>
#define CR 0x0D
#define LF 0x0A
int putchar( const char caracter ) {
if(caracter == LF ) {/* si es \n saca la secuencia CR, LF */
while( !TI ); /*espera buffer transmisor disponible. Que salga el anterior;*/
TI = 0; /*Asume lleno registro transmisión. Debe sacar en serie el dato. */
SBUF = CR; /*Primero escribe CR */
}
while( !TI ); /*espera buffer transmisor disponible/
TI = 0; /*marca ocupado al buffer de transmisión*/
SBUF = caracter; /*graba en el buffer de transmisión lo que transmitirá*/
return(caracter);
}

Prof. Leopoldo Silva Bijit. Lab. 09 18-10-2002 54


UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores

char _getkey (void) { /*lee sin eco */


char c;
while (!RI); /*espera buffer recepción lleno/
c = SBUF; /*salva contenido del buffer */
RI = 0; /*marca buffer recepción disponible */
return (c);
}

int getchar(void) { /*lectura con eco */


char c;
while (!RI);
c = SBUF;
RI = 0;
putchar(c); /*lo copia en la salida */
return (c);
}

Pueden escribirse rutinas para entrada y salida serial que operen por interrupciones. De esta
forma se activan sólo cuando se produce la interrupción por tener registro de transmisión
vacío, o cuando se tiene registro de recepción lleno. En lugar de ejecutar instrucciones para
encuestar los flags, el microcontrolador realiza el programa principal, mientras la rutina de
servicio se activa sólo cuando ocurre un evento(en TI o RI) que requiera servicio.
IE 7 6 5 4 3 2 1 0
0xA8 EA -- -- ES ET1 EX1 ET0 EX0
bit

Son de interés los bits EA y ES para la programación de la puerta serial por interrupciones.

La siguiente sentencia instala un vector para enlazar con la rutina de servicio de puerta
serial, empleando el banco 3. Denomina serial a la rutina, a la que se ingresa si se produce
interrupción, en ésta debe determinarse cuál fue el evento que produjo la interrupción; si
fue la llegada de un carácter, o si se terminó de enviar un carácter, y también debe manejar
el estado de los flags TI o RI.
void serial (void) interrupt 4 using 3

Preparación Previa.
a) Escribir en C, un programa que escriba un string hacia la salida, en 4800 baudios.
Efectuar una salida repetitiva de un carácter mediante putchar, ejecutar debug y
analizar el texto assembler incorporado por el compilador, para la función putchar.
Efectuar una salida repetitiva de un carácter mediante printf, ejecutar debug y
visualizar el texto assembler incorporado por el compilador, para la función
printf("%c", ch).
Simular, visualizando la salida(en la consola o terminal del simulador) con:
View/Hardware/UART

Prof. Leopoldo Silva Bijit. Lab. 09 18-10-2002 55


UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO312 Laboratorio de Estructuras de Computadores

Visualizar el pin P3.1(Tx) mediante una traza.


¿Cuál es la diferencia entre los frames seriales asociados a las letras A y B?

b) Generar tabla que muestre en la ventana de la uart, algunos valores de funciones


trigonómetricas en el primer cuadrante. Usar campos de anchos y decimales en el
argumento de control de printf. Setear el compilador para que procese flotantes. Ver
las funciones en help: Index/Compiler Reference/Library Reference/Function
Reference/cos
Debe emplearse: #include <math.h> para tener acceso a las funciones.
Esto debe mostrarse en el simulador solamente.

c) Escribir en C, un programa que escriba por interrupciones un carácter hacia la salida,


en 9600 baudios. Colocar un puente en el CPLD entre Tx y Rx, y que el programa lea
el carácter recibido, también por interrupciones. Además el programa debe generar,
como programa principal, las siguientes formas de ondas, empleando el timer 0.

P1.1

P1.2

125 ms

En el Laboratorio.
• Ver el frame serial asincrónico mediante el osciloscopio, generado por el programa
descrito en a). Medir los baudios.
• Mostrar la tabla generada en la consola del simulador, por el programa en b).
• Mostrar en el osciloscopio las señales Tx, P1.1 y P1.2. generadas por el programa
escrito en C.

Prof. Leopoldo Silva Bijit. Lab. 09 18-10-2002 56

Вам также может понравиться