You are on page 1of 13

Comunicaciones puerto serie (UART)

Vamos a dedicar un par de entradas a examinar con cierto detalle el funcionamiento de las comunicaciones asncronas (UART, o lo que habitualmente se conoce como el puerto serie) de la familia PIC18. Nos centraremos en el software, dejando de lado el aspecto hardware, sobre todo la conversin de niveles si la comunicacin es entre un PIC y el PC o entre dos microcontroladores con diferentes voltajes (p.e. 3.3V y 5V). En mis pruebas he usado el conversor de niveles integrado en la placa EasyPIC6. En general habr que usar un conversor de niveles basado en el Max232 o similar. Una bsqueda de RS232 MAX232 TTL en ebay nos mostrar varias posibilidades a partir de unos $5. En primer lugar presentaremos las funciones bsicas que la mayora de los compiladores tienen para abrir el puerto serie, enviar/recibir, etc. Luego escribiremos nuestras propias rutinas. El objetivo no es prescindir de las rutinas del compilador, sino entender los fundamentos para ser capaces (cuando sea necesario) de saltarnos las limitaciones de un compilador en particular. Tambin escribiremos una funcin que nos permita configurar el puerto serie a partir de la velocidad en baudios, sin tener que calcular y programar los registros asociados. Cdigo asociado a esta entrada: uart0.c uart1.c ----------------------------------------------------------------------------------------------------------Funciones bsicas de manejo de puerto serie: (uart0.c) En primer lugar vamos a ver un sencillo cdigo en C que establece una comunicacin serie entre el PIC y p.e. un PC usando las rutinas del compilador. Dos compiladores que uso habitualmente son el C18 de Microchip y el MikroC Pro de Mikroelectronica. No importa que estis usando algn otro compilador porque la idea es profundizar un poco ms sobre que hace un compilador al manejar el puerto serie de un PIC. Las funciones bsicas de ambos compiladores en relacin al puerto serie son:
FUNCION Inicializacin Data ? Leer MikroC Pro UART1_init UART1_Data_ready UART1_read C18 Open_USART DataRdyUSART ReadUSART / getcUSART

Escribir

UART1_write

WriteUSART / putcUSART

Usando las funciones anteriores, un sencillo programa en C18 que abre el puerto serie a 9600 bauds, lo monitoriza el puerto serie y rebota lo que recibe sera el siguiente (notad que es necesario incluir usart.h):
#include <usart.h>

void main() { char ch;

TRISB=0; PORTB=0;

OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH,129);

while(1) { if (DataRdyUSART()) { ch = get_byte(); send_byte(ch+1); send_byte(0x0D); send_byte(0x0A); PORTB++; } Delay10KTCYx(5); } }

El mismo programa en MikroC Pro:


void main() { char ch; TRISB=0; PORTB=0;

UART1_Init(9600); while(1) { if (UART1_Data_Ready()) { ch = UART1_Read(); UART1_Write(ch+1); UART1_Write(0x0D); UART1_Write(0x0A); PORTB++; }

delay_ms(10); } }

Si conectamos PIC y PC, cualquier cosa que tecleemos en un terminal nos es devuelta como el carcter siguiente en la tabla ASCII, debido a que enviamos (ch+1) donde ch es el carcter recibido. Adems se manda un retorno de carro y salto de lnea. Segn la configuracin de nuestro terminal es posible que veamos tanto el carcter que hemos tecleado como el que enva el PIC. Adems PORTB se incrementa con cada carcter recibido de forma que podemos ver un feedback visual de los bytes recibidos. Lo que vamos a hacer ahora es volver a escribir las funciones anteriores pero usando nuestro propio cdigo, lo que implicar manejar los SFR (Special Function Register) del PIC asociados a la UART. El efecto colateral ser que entenderemos como funcionan a "bajo nivel" dichas comunicaciones. Hay 5 registros que tendremos que conocer y manejar: TXSTA -> Status de TX, con el indicamos las opciones de transmisin RXSTA -> Status de RX, opciones de recepcin. SPBRG -> determina la velocidad de las comunicaciones (bauds) junto con el bit BRGH de TXSTA RCREG y TXREG -> registros donde se guarda el byte recibido y donde ponemos el byte a transmitir. La ms complicada es la inicializacin de la UART. Afecta a los distintos bits de TXTSTA, RXSTA y SPBRG.
void setup_UART(uint8 brgh,uint8 spbrg) { TRISCbits.TRISC6=0; TRISCbits.TRISC7=1; // RC6 out (tx), RC7 in (rx)

TXSTA =

0b00100110; // Clear TX status // Async mode // Enable TX // TRS empty (we start with an empty TX register)*/

/*TXSTA = 0x00; TXSTA.SYNC=0; TXSTA.TXEN=1; TXSTA.TRMT=1;

RCSTA = 0b10010000; /*RCSTA =0x00; // Clear RC status

RCSTA.SPEN=1; // Enable Serial Port RCSTA.CREN=1; // Enable Receiver*/

// BRGH=0 -> Baud Rate = Fosc / (64 * (SPBRG+1)) // BRGH=1 -> Baud Rate = Fosc / (16 * (SPBRG+1)) TXSTAbits.BRGH=brgh; SPBRG = spbrg; }

La rutina setup_UART inicializa la UART para una comunicacin asncrona con 8 bits. La velocidad (bauds) se calcula en funcin de los parmetros BRGH y SPBRG, junto con la frecuencia del oscilador Fosc: BRGH=0 -> baud = F_osc / (64 x(SPBRG+1)) BRGH=1 -> baud = F_osc / (16x(SPBRG+1)) Con un oscilador de 20 MHz, para una velocidad de 9600 baudios usaramos BRGH=1 y SPBRG=129, obteniendo baud = 20000000/(16 x 130) = 9615 suficientemente prxima al valor correcto. En la rutina tambin se determina la direccin (out) del pin TX y la del pin RX (in). En este ejemplo (familia PIC18F2520/4520) son RC6 y RC7 respectivamente. No estoy seguro de que esto sea necesario (tal vez la direccin de RC6/RC7 se establezca automticamente al habilitar el receptor y el emisor) pero por si acaso... Enviar un byte es una simple cuestin de esperar a que el buffer de salida est vaco (consultando flag TXSTA.TRMT) y cuando lo est, poner el carcter a transmitir en el buffer de TX. Automticamente el bit TRMT se pondr a 0 (buffer lleno), por lo que una siguiente llamada a la funcin tendra que esperar a terminar de mandar el carcter.
void send_byte(unsigned char ch) { while (TXSTAbits.TRMT==0); TXREG=ch; } // wait until TX buffer is empty

Para ver si se ha recibido algo se consulta la bandera de la interrupcin de recepcin del puerto serie (definida como RX_flag como ya vimos):
char rx_ready(void) { return RX_flag; }

Finalmente, si se ha detectado (rx_ready) una recepcin, una llamada a get_byte recupera el byte recibido (que est esperndonos en RCREG). Tambin se quita la bandera RX_flag para indicar que estamos de nuevo a la espera.
char get_byte(void) { RX_flag=0; // Clear RX flag return RCREG; } // Devuelve byte recibido

El siguiente cdigo usa estas funciones para hacer exactamente lo mismo que antes:
void main() { char ch;

TRISB=0; PORTB=0;

setup_UART(1,129);

while(1) { if (rx_ready()) { ch = get_byte(); send_byte(ch+1); send_byte(0x0D); send_byte(0x0A); PORTB++; } Delay10KTCYx(5); } }

Hemos ganado algo? Obviamente nada si slo queramos hacer lo que hacamos en el programa inicial. Para ello nos bastaban las rutinas que ya existan en nuestro compilador. Las ventajas aparecen cuando necesitamos apurar un poco ms:

1. Las rutinas standard en muchos compiladores solo soportan el modo de comunicacin ms usual (8 bits sin paridad). Si por ejemplo queremos usar paridad no nos sirven. Sin embargo ahora que sabemos lo fcil que es enviar o recibir bytes ser muy sencillo cambiar algunos bits en TXSTA y/o RXSTA para establecer una comunicacin usando p.e. paridad o 9 bits. 2. Las rutinas standard (y las que hemos escrito, ya que eran intercambiables) son bloqueantes. Antes de escribir debemos esperar a que el buffer de transmision (1 byte) se libere. Antes de recibir debemos estar continuamente preguntando (rx_ready) si se ha recibido algo. Imaginad que el PIC est conectado a un sensor que genera unos 1000 bytes/segundo que deben ser enviados al PC). Cada byte supone como mnimo 10 bits (start + 8 bits + stop) , por lo que para poder enviar 1000 bytes/sec precisaremos un enlace de aproximadamentelo unos 1000 x 10 (podra valernos 9600). Si en estas circunstancias usamos las rutinas originales, todos los recursos del PIC estaran prcticamente dedicados a la transmisin de los datos. Esta situacin puede implementarse mucho ms eficientemente usando interrupciones y esperando que la UART nos avise de que ha recibido un dato o que est libre para enviar otro. El resto del tiempo el PIC puede estar haciendo otras cosas. La diferencia puede ser grande. Si esperamos a que se complete la TX, enviar un byte puede costarnos del orden de 1 ms ( @ 9600 bauds). Usando interrupciones el nico trabajo del microcontrolador ser poner un byte en TXREG, lo que esencialmente nos llevar una instruccin. Transmitir dicho byte seguir llevando 1 ms, pero el que estar ocupado durante ese tiempo ser el perifrico (UART). Habiendo aprendido como funciona por debajo la UART ser muy sencillo implementar tanto la recepcin como la transmisin usando interrupciones. Determinacin de SPBRG y BRGH en funcin de la velocidad en baudios Vimos que aunque la funcin de MikroC Pro era menos verstil en la configuracin del puerto serie tiene la ventaja de que bastaba con darle la velocidad y ella se encargaba de determinar los parmetros SPBRG y el bit BRGH. Esto es posible porque en un proyecto de MikroC Pro se especifica la velocidad del oscilador. Por la misma razn en MikroC Pro podemos

especificar delays en unidades limitarnos a ciclos como en C18.

absolutas (msec o usec) en vez de

Es muy sencillo escribir una funcin que calcule los valores correctos de SPBRG y BRGH y nos lo devuelva para usarlos en una llamada a nuestra rutina setup_UART o a la OpenUSART de C18:
uint8 get_usart_speed(uint32 baud, uint32 Fosc, uint8* spbrg) // baud rate 1200,2400,4800,9600,19200, ..., 115200 // Fosc = Frequency osc in KHz -> 20MHz = 20000 // Returns 0 (USART_BRGH_LOW), 1 (USART_BRGH_HIGH), or 2 (cannot get speed requested) // It places in spbrg the value to be used as argument spbrg in OpenUSART { uint16 FF; uint8 brgh; uint8 shift;

Fosc=Fosc*1000; baud>>=1; Fosc=Fosc/baud+1; Fosc>>=1; // computes round(Fosc/baud)

FF=(uint16)Fosc;

if ((FF>16320)||(FF<16)) return 2;

// Baud rate too low or too high

brgh = (FF>4096)? 0:1; shift= (brgh==1)? 3:5;

// Decides between BRGH=0 o BRGH=1

FF>>=shift; FF--; FF>>=1; // Computes round(FF/64 -1) or round(FF/16-1)

*spbrg = (uint8)FF; return brgh; }

La forma de usar esta rutina para inicializar la UART en conjuncin con setup_UART() sera:
void main() { uint8 brgh,sp;

brgh=get_usart_speed(38400,20000,&sp); setup_UART(brgh,sp); }

Si preferimos seguir usando la rutina de C18 (OpenUSART) para inicializar la USART:


void main() { uint8 brgh,brgh_config,sp;

brgh=get_usart_speed(38400,20000,&sp); brgh_config=(brgh)? USART_BRGH_HIGH:USART_BRGH_LOW; OpenUSART(USART_ASYNCH_MODE & USART_EIGHT_BIT & brgh_config, sp); }

Si solo vamos a inicializar el puerto es obviamente ms eficiente calcular nosotros los valores a usar y programarlos directamente. De esta forma nos ahorraramos los 30-40 palabras de memoria de programa que ocupa la rutina anterior. Este enfoque es ms til si queremos dinmicamente cambiar la velocidad del puerto serie durante el programa.

Baudio
El baudio (en ingls baud) es una unidad de medida, usada en telecomunicaciones, que representa el nmero de smbolos por segundo en un medio de transmisin digital. 1 Cada smbolo puede codificar 1 o ms bits dependiendo del esquema de modulacin. Es importante resaltar que no se debe confundir el baud rate o velocidad en baudios con el bit rate o velocidad en bits por segundo, ya que cada evento de sealizacin (smbolo) transmitido puede transportar uno o ms bits. Slo cuando cada evento de sealizacin (smbolo) transporta un solo bit coinciden la velocidad de transmisin de datos baudios y en bits por segundo. Las seales binarias tienen la tasa de bit igual a la tasa de smbolos (rb = rs), con lo cual la duracin de smbolo y la duracin de bit son tambin iguales (Ts = Tb). n = rb/rs Donde rb: rgimen binario o tasa de bits (bit rate) rs: tasa de modulacin o tasa de smbolos y n: nmero de bits por nivel para la codificacin de lnea Se utiliz originariamente para medir la velocidad de las transmisiones telegrficas, tomando su nombre del ingeniero francs Jean Maurice Baudot, quien fue el primero en realizar este tipo de mediciones. Ejemplos:

En el caso de las mquinas teletipo, todava en uso en algunos medios, se deca que la velocidad de transmisin era normalmente de 50 baudios. En este caso, como los eventos eran simples cambios de voltaje 1 --> (+), 0 --> (-), cada evento representaba un solo bit o impulso elemental, y su velocidad de transmisin en bits por segundo coincida con la velocidad en baudios.

Sin embargo, en los mdems que utilizan diversos niveles de codificacin, por ejemplo mediante modulacin de fase, cada evento puede representar ms de un bit, con lo cual ya no coinciden bits por segundo y baudios.

Baud rate
La tasa de baudios (en ingls Baud Rate), tambin conocida como baudaje, es el nmero de unidades de seal por segundo. Un baudio puede contener varios bits. Aunque a veces se confunden los baudios con los bits por segundo, son conceptos distintos. En transmisiones digitales ocurre lo siguiente: la informacin digital, codificada en bits, normalmente no se puede enviar por el medio de transmisin directamente (por ejemplo asociando un nivel elctrico al 1 y al 0, tpicamente 5V y 0V respectivamente) debido a que los medios de transmisin suelen estar limitados en banda, esto es, que solo dejan pasar las componentes frecuenciales de una seal que se encuentren en un rango determinado de frecuencias, por ejemplo, entre 1 kHZ y 4 kHz. Ocurre que al codificar los bits, como un nivel elctrico, la seal sufre transiciones muy rpidas, lo que genera frecuencias muy altas. Por ejemplo, si se quiere transmitir un 1 y despus un 0, hay que pasar de 5V a 0V inmediatamente. Una forma de solucionar esto es codificando los bits de otra forma, por ejemplo, asociando cada bit a una seal que s admita el medio, como por ejemplo, senos y cosenos; si el medio limita a seales que se encuentren en el rango de 1KHz y 4 Khz, podemos transmitir una seal sinusoidal de 2KHz para expresar un 1 y otra de 3KHz para expresar un 0, lo que sera una forma primitiva de modulacin FSK (Frequency Shift Keying o Codificacin por Desplazamiento en Frecuencia en castellano). Estas seales tienen un tiempo de duracin comnmente llamado tiempo de smbolo T, de modo que cada T segundos se transmite una de las 2 seales. Como cada seal codifica 1 bit, cada T segundos se transmite 1 bit, luego la tasa de bit es 1/T bps (bits por segundo), que en este caso coincide con los baudios. Puede ser interesante codificar de una forma ms complicada, usando por ejemplo 4 senos; as un seno a 1KHz significa 00, uno a 2 kHz corresponde a 01, los 3 kHz a 10 y los 4 kHz a 11. De este modo, el baud rate sigue siendo 1/T baudios ya que se transmite 1 seal cada T segundos. No obstante, la tasa

de bits es distinta porque en cada seal van 2 bits, esto es 2/T bps o 2 bits cada T segundos. De forma general, una seal puede codificar bits {1, 2, 4, 8, 16, 32, 64, 128...} y se define la tasa de smbolo

Rs como el nmero de smbolos (seales) que se transmiten en un tiempo de smbolo T, normalmente:

Asimismo, el bitrate o tasa de bits, es el nmero de bits que se transmiten en un tiempo T y se calcula como:

Consideraciones:

El baud rate y el bitrate aumentan si disminuye T El bitrate aumenta tambin si aumenta n La tasa de baudios siempre es menor o igual a la tasa de bits, esto es:

ya que:

con n = {0, 1, 2, 3,...}

Tasa de bits
(Redirigido desde Bit rate)

Este artculo o seccin necesita referencias que aparezcan en una publicacin acreditada, como revistas especializadas, monografas, prensa diaria o pginas de Internet fidedignas.
Puedes aadirlas as o avisar al autor principal del artculo en su pgina de discusin pegando: {{subst:Aviso referencias|Tasa de bits}} ~~~~

En informtica y telecomunicaciones, el trmino tasa de bits (en ingls bit rate, a menudo tasa de transferencia) define el nmero de bits que se transmiten por unidad de tiempo a travs de un sistema de transmisin digital o entre dos dispositivos digitales. As pues, es la velocidad de transferencia de datos.

ndice
[ocultar]

1 Introduccin

1.1 Ejemplos

2 Tipos 3 Vase tambin

Introduccin[editar editar cdigo]


La tasa de transferencia se refiere al ancho de banda real medido en un momento concreto del da empleando rutas concretas de internet mientras se transmite un conjunto especfico de datos, desafortunadamente, por muchas razones la tasa es con frecuencia menor al ancho de banda mximo del medio que se est empleando. Los siguientes son algunos de los factores que determinan la tasa de transferencia:

Dispositivos de Internet-Working Tipos de datos que se van a transferir Topologa de la red Nmero de usuarios en la red La computadora del usuario El servidor Condiciones de la energa Congestin

El ancho de banda terico de la red es una consideracin importante en el diseo de la red, porque la tasa de transferencia de la red nunca es mayor que dicho ancho de banda, debido a las limitaciones puestas por el medio y a las tecnologas de red elegidas. La unidad con que el Sistema Internacional de Unidades expresa el bit rate es el bit por segundo (bit/s, b/s, bps). La b debe escribirse siempre en minscula, para impedir la confusin con bytepor segundo (B/s). Para convertir de bytes/s a bits/s, basta simplemente multiplicar por "8" y viceversa. Que la unidad utilizada sea el bit/s, no implica que no puedan utilizarse mltiplos del mismo:

kbit/s o kbps (kb/s, kilobit/s o mil bits por segundo) Mbit/s o Mbps(Mb/s, Megabit/s o un milln de bits por segundo) Gbit/s o Gbps (Gb/s, Gigabit, mil millones de bits)

byte/s (B/s u 8 bits por segundo) kilobyte/s (kB/s, mil bytes u ocho mil bits por segundo) megabyte/s (MB/s, un milln de bytes u 8 millones de bit por segundo) gigabyte/s (GB/s, mil millones de bytes u 8 mil millones de bits)

Ejemplos[editar editar cdigo]


Velocidades tpicas de los accesos de conexin a Internet (abril de 2006):

Mdem RTB: 56 kbit/s = 7 kB/s (7 kilobytes por segundo) ADSL: 1024 kbit/s = 128 kB/s (128 kilobytes por segundo) Cable: 2400 kbit/s = 300 kB/s (300 kilobytes por segundo) VSAT: 600 kbit/s = 75 kB/s (75 kilobytes por segundo) Telefona mvil 3G: 384 kbit/s = 48 kB/s (48 kilobytes por segundo)

Tasas de bits de compresin a MP3:

4 kbit/s Mnimo para reconocer el habla. 8 kbit/s Calidad telefnica convencional 32 kbit/s Radio AM 96 kbit/s Radio FM 128 kbit/s Sonido calidad semi CD, muy comn en MP3 192 kbit/s Sonido calidad CD en formato MP3 320 kbit/s Mxima calidad para formato MP3

Las velocidades de conexin a Internet son brutas. En la prctica, la velocidad neta disponible para el usuario, suele ser entre un 10-15% menor, debido al ancho de banda consumido por las cabeceras y las colas de los protocolos. Los consumidores generalmente son los perjudicados al pagar por una velocidad de internet y recibir otra menor, se debera establecer un % mnimo de prdida admisible como control de calidad. Otro error frecuente es utilizar el baudio como sinnimo de bit por segundo. La velocidad en baudios o baud rate no debe confundirse con la tasa de bits. La velocidad en baudios de una seal representa el nmero de cambios de estado, o eventos de sealizacin, que la seal tiene en un segundo. Cada evento de sealizacin transmitido puede transportar uno o ms bits. Slo cuando cada evento de sealizacin transporta un solo bit coinciden la velocidad de transmisin de datos en baudios y en bits por segundo.

Tipos[editar editar cdigo]


La velocidad de transferencia de datos puede ser constante o variable: 1. Tasa de bits constante (CBR): Aplica una cuantificacin uniforme, por lo que no tiene en cuenta si en la seal hay zonas con mayor o menor densidad de informacin, sino que cuantificatoda la seal por igual. 2. Tasa de bits variable (VBR): Aplica una cuantificacin no uniforme que s que hace diferenciacin entre las zonas con mayor o menor densidad de informacin, por lo que la cuantificacinresulta ms eficaz.

You might also like