Sei sulla pagina 1di 28

USART

SESION14
El módulo del Transmisor del receptor asíncrono universal (UART) es una de las E / S
en serie módulos disponibles en la familia de dispositivos dsPIC30F Switch Mode
Power Supply (SMPS).

El UART es un canal de comunicación asíncrono full-duplex que se comunica con


periféricos dispositivos y computadoras personales, usando protocolos como RS-232,
RS-485, LIN 1.2 e IrDA
.
El módulo también incluye el codificador y decodificador IrDA.
¿Cómo convertir de USB a RS232?
Lo que hacen estos adaptadores es emular
un puerto serie mediante el puerto USB
Estos adaptadores vienen con un software
que una vez instalado crea un puerto serie
virtual a través del puerto USB.

Sin embargo existen muchas aplicaciones


en electrónica donde resulta muy
conveniente usar el protocolo RS232 para
el intercambio de información y la PC
resulta la interfase más conveniente
Las características principales del módulo UART son:
• Transmisión de datos full-duplex, de 8 o 9 bits a través de los pines UxTX y UxRX
• Par, impar o sin opciones de paridad (para datos de 8 bits)
• Uno o dos bits de parada
• Función Auto Baud de hardware
• Generador de velocidad de baudios totalmente integrado con preescaler de 16 bits
• 4-profundidad First-In First-Out (FIFO) Transmitir memoria intermedia
• buffer de recepción de datos FIFO de 4 profundidades
• Detección de errores de paridad, encuadre y desbordamiento de búfer
• Soporte para modo de 9 bits con detección de dirección (noveno bit = 1)
• Transmitir y recibir interrupciones
• Modo de bucle invertido para soporte de diagnóstico
• Codificador IrDA y lógica decodificadora
• Compatibilidad con el protocolo LIN 1.2
La Figura 1 muestra un diagrama de bloques simplificado de UART. El módulo UART
consiste en siguientes elementos de hardware clave:
• Generador de tasa de baudios
• Transmisor asincrónico
• Receptor asincrónico
• IrDA Encoder and Decoder Logic
UxMODE: Registro en modo UARTx

bit 15 UARTEN: bit Habilitar UARTx


1 = Habilitar UARTx; Los pines UARTx están controlados por el módulo UARTx
0 = Desactivar UARTx; Los pines UARTx están controlados por registros de control de puertos de E / S

bit 13 USIDL: Stop en el bit de modo inactivo


1 = suspender el funcionamiento cuando el dispositivo ingrese en el modo Inactivo
0 = Continuar operación en el modo inactivo

bit 12 IREN: codificador IrDA y bit de habilitación del decodificador


1 = Habilitar el codificador y decodificador IrDA
0 = Deshabilitar codificador y decodificador IrDA
bit 10 ALTIO: Bit de selección de E / S alternativas de UARTx
1 = Use los pines de E / S UxATX y UxARX
0 = Usar pines de E / S UxTX y UxRX

bit 7 WAKE: habilitar Wake-up en el bit de inicio


1 = Activar despertar
0 = Desactivar Wake-up

bit 6 LPBACK: Modo de bucle UARTx Seleccionar bit


1 = Habilitar modo Loopback
0 = Desactivar modo Loopback

bit 5 ABAUD: bit Auto-Baud Enable


1 = Habilitar la medición de la velocidad en baudios en el siguiente caracter. Requiere la recepción de un campo
de Sincronización (55h); despejado en hardware al finalizar
0 = medición de la tasa de baudios deshabilitada o completada

bit 4 RXINV: bit de inversión de polaridad de recepción


1 = estado inactivo UxRX es '0'
0 = estado inactivo UxRX es '1'
bit 3 BRGH: bit de selección de velocidad de baudios alto
1 = Alta velocidad
0 = baja velocidad

bit 2-1 PDSEL <1: 0>: bits de paridad y selección de datos


11 = datos de 9 bits, sin paridad
10 = datos de 8 bits, paridad impar
01 = datos de 8 bits, incluso paridad
00 = datos de 8 bits, sin paridad

bit 0 STSEL: bit de detención de selección


1 = 2 bits de parada
0 = 1 bit de parada
UxSTA: registro de estado y control UARTx

bit 15,13 UTXISEL <1: 0>: bits de selección del modo de interrupción de transmisión
11 = Reservado
10 = Interrupción generada cuando un personaje se transfiere al registro Transmit Shift y al buffer de transmisión se
vacía
01 = Interrupción generada cuando finaliza la última transmisión (último carácter desplazado de Transmit Shift
registrarse) y se completan todas las operaciones de transmisión
00 = Interrupción generada cuando cualquier carácter se transfiere al Registro de cambio de transmisión (esto
implica a al menos una ubicación está vacía en el buffer de transmisión)
bit 14 UTXINV: bit de inversión de polaridad de transmisión del codificador IrDA
1 = estado inactivo UxTX codificado con IrDA es '1'
0 = IrDA codificado UxTX El estado inactivo es '0‘

bit 11 UTXBRK: bit de interrupción de transmisión


1 = El pin UxTX se acciona bajo, independientemente del estado del transmisor (Transmisión de interrupción de
sincronización - Bit de inicio seguido de doce '0's y seguido por un bit de Stop)
0 = la transmisión Sync Break está desactivada o completada

bit 10 UTXEN: bit de habilitación de transmisión


1 = transmisor UARTx habilitado, pin UxTX controlado por UARTx (si UARTEN = 1)
0 = transmisor UARTx deshabilitado, cualquier transmisión pendiente se cancela y el búfer se restablece. Pin
UxTX controlado por PORT

bit 9 UTXBF: bit de estado completo del búfer de transmisión (solo lectura)
1 = El búfer de transmisión está lleno
0 = El búfer de transmisión no está lleno, al menos se puede escribir una palabra de datos más
bit 8 TRMT: Transmitir registro de cambios está vacío (solo lectura)
1 = El registro de cambio de transmisión está vacío y el búfer de transmisión está vacío (se completó la última
transmisión)
0 = El registro de desplazamiento de transmisión no está vacío, hay una transmisión en curso o en cola en el
búfer de transmisión
bit 7-6 URXISEL <1: 0>: recibir bits de selección de modo de interrupción
11 = El bit de indicador de interrupción se establece cuando el búfer de recepción está lleno (es decir, tiene 4
caracteres de datos)
10 = El bit de indicador de interrupción se establece cuando el búfer de recepción está lleno a 3/4 (es decir,
tiene 3 caracteres de datos)
0x = El bit de indicador de interrupción se establece cuando se recibe un carácter

bit 5 ADDEN: Bit de detección de caracteres de dirección (bit 8 de datos recibidos = 1)


1 = Modo de detección de direcciones habilitado. Si no se selecciona el modo de 9 bits, este bit de control no
tiene efecto
0 = Modo de detección de dirección deshabilitado

bit 4 RIDLE: bit inactivo del receptor (solo lectura)


1 = El receptor está inactivo
0 = Se están recibiendo datos

bit 3 PERR: bit de estado de error de paridad (solo lectura)


1 = Se ha detectado un error de paridad para el personaje actual
0 = No se ha detectado el error de paridad
bit 2 FERR: bit de estado de error de trama (solo lectura)
1 = Se ha detectado un error de encuadre para el personaje actual
0 = No se ha detectado error de encuadre

bit 1 OERR: bit de estado de error de recepción de exceso de búfer (borrar / solo lectura)
1 = El buffer de recepción se ha desbordado
0 = El búfer de recepción no se ha desbordado (borrar un bit OERR previamente establecido restablece el búfer
del receptor y
RSR al estado vacío)

bit 0 URXDA: bit de recepción de datos de memoria disponible (solo lectura)


1 = El búfer de recepción tiene datos, se puede leer al menos un carácter más
0 = El búfer de recepción está vacío
UxRXREG: UARTx Receive Register

bit 8 URX8: bit de datos 8 del dato recibido (en modo de 9 bits)
bit 7-0 URX <7: 0>: bits de datos 7-0 del dato recibido

UxTXREG: UARTx Transmit Register (Write-Only)


UxBRG: registro de tasa de baudios UARTx

bit 15 BRG <15: 0>: bits del divisor de velocidad en baudios


UART Baud Rate Generator (BRG)
El UART tiene un generador de velocidad de baudios completo de 16 bits para permitir la
máxima flexibilidad en velocidad de transmisión en baudios Generación.
El BRG funciona en modos de alta velocidad o de baja velocidad, según lo seleccionado por
el Alto Velocidad de transferencia de baudios (BRGH) en el registro del modo UART
(UxMODE <3>).
• El modo de alta velocidad (BRGH = 1) genera 4 pulsos de reloj por cada bit de tiempo
• El modo de baja velocidad (BRGH = 0) genera 16 pulsos de reloj por cada bit de tiempo
La ecuación 1 muestra la fórmula para calcular la velocidad en baudios para el modo de baja
velocidad (BRGH = 0).

El ejemplo 1 muestra cómo calcular el error de velocidad en baudios para las siguientes
condiciones:
•FCY = 4 MHz
• Tasa de baudios deseada = 9600
• BRGH = 0
La velocidad máxima en baudios (BRGH = 0) es FCY / 16 (para UxBRG = 0), y el baud mínimo
la tasa posible es FCY / (16 • 65536).
La ecuación 2 muestra la fórmula para calcular la velocidad en baudios con BRGH = 1
Transmisor UART
La Figura 2 muestra el diagrama de
bloque del transmisor UART.
El corazón del transmisor es el Registro de
desplazamiento de transmisión (UxTSR).
Este registro de desplazamiento obtiene
sus datos del búfer FIFO de
transmisión,UxTXREG.
El registro UxTXREG se carga con datos en
el software.
El registro UxTSR no es cargado hasta que
el bit Stop haya sido transmitido desde la
carga anterior. Tan pronto como el bit
Stop sea transmitido, el UxTSR se carga
con nuevos datos del registro UxTXREG (si
está disponible).
Receptor UART

La Figura muestra el diagrama de bloques del receptor.


El corazón del receptor es el Receive (Serial)
Registro de desplazamiento (UxRSR).
Los datos se reciben en el pin UxRX y se envían a la
recuperación de datos bloquear.
El bloque de recuperación de datos funciona a 16 veces
la velocidad en baudios, mientras que el bloque de
recuperación de datos funciona la palanca de cambios
serial funciona a la velocidad en baudios.
Después de que el pin UxRX se muestrea para el bit de
parada, los datos recibidos en UxRSR se transfieren al
búfer FIFO de recepción (si está vacío).
Receive Buffer (UxRXREG)
El receptor UART tiene un búfer de datos de recepción
FIFO de 4 profundidades y 9 bits de ancho. UxRXREG es
una memoria registro mapeado que proporciona acceso
a la salida del FIFO
Imprimir texto desde dsPIC30F4011 a una PC a través de UART

Este es un ejemplo simple de enviar texto desde un microcontrolador dsPIC30F4011 a una PC a través de
UART.
Este programa alterna un LED en RD0 una vez por segundo. Cada vez que se enciende o apaga el LED, la
palabra "Hola" se transmite a través del UART utilizando la función printf.

#include <xc.h>
#include <stdio.h>
#include <libpic30.h>

// Configuration settings
_FOSC(CSW_FSCM_OFF & FRC_PLL16); // Fosc=16x7.5MHz, Fcy=30MHz
_FWDT(WDT_OFF); // Watchdog timer off
_FBORPOR(MCLR_DIS); // Disable reset pin
int main ()
{
TRISD = 0; // Establecer todos los pines del puerto D como salidas

// Configuración de UART: la mayoría de las opciones predeterminadas están bien


U1BRG = 48; // 38400 baud @ 30 MIPS
U1MODEbits.UARTEN = 1; // Habilita UART

while (1)
{
printf ("Hola \ r \ n"); // Enviar texto a través de UART
_LATD0 = 1 - _LATD0; // Alternar LED en RD0
__delay32 (30000000); // 1 segundo de retraso
}
return 0;
}
Transmisión de datos en serie desde dsPIC30F4011 UART
El siguiente programa es un ejemplo de transmisión de datos en
serie desde el UART dsPIC30F4011. Este programa lee
repetidamente lecturas analógicas de 10 bits de AN0-AN7 y luego
imprime los resultados en la salida en serie.
La velocidad en baudios se establece en 38,400. Sin embargo,
estoy viendo problemas técnicos ocasionales en los datos
entrantes. Estoy usando el oscilador RC interno para sincronizar el
PIC, por lo que es probable que Fcy (y, por lo tanto, la velocidad en
baudios) esté un poco apagado.
#include <libpic30.h>
#include <p30f4011.h>
#include <stdio.h>
// Configuration settings
_FOSC(CSW_FSCM_OFF & FRC_PLL16); // Fosc=16x7.5MHz, Fcy=30MHz
_FWDT(WDT_OFF); // Watchdog timer off
_FBORPOR(MCLR_DIS); // Disable reset pin

// Function prototypes
void configure_pins();
unsigned int read_analog_channel(int n);

int main()
{
// Variables to store analog input voltages
int v0, v1, v2, v3, v4, v5, v6, v7;

// Set up which pins are which


configure_pins();
while(1)
{
// Read AN0-AN7
v0 = read_analog_channel(0);
v1 = read_analog_channel(1);
v2 = read_analog_channel(2);
v3 = read_analog_channel(3);
v4 = read_analog_channel(4);
v5 = read_analog_channel(5);
v6 = read_analog_channel(6);
v7 = read_analog_channel(7);
// Print the measured voltages on the serial o/p
printf("AN0=%04d, AN1=%04d, AN2=%04d, AN3=%04d, ", v0, v1, v2, v3);
printf("AN4=%04d, AN5=%04d, AN6=%04d, AN7=%04d\r\n", v4, v5, v6, v7);
}
return 0;
}
void configure_pins ()
{
// Configurar RD0 como salida digital
LATD = 0;
TRISD = 0b11111110; // Configurar entradas analógicas
TRISB = 0x01FF; // Puerto B todas las entradas
ADPCFG = 0xFF00; // Los 8 pines PORTB más bajos son entradas analógicas
ADCON1 = 0; // borrar manualmente SAMP para finalizar el muestreo, iniciar la conversión
ADCON2 = 0; // Referencia de voltaje de AVDD y AVSS
ADCON3 = 0x0005; // Muestra manual, ADCS = 5 -> Tad = 3 * Tcy
ADCON1bits.ADON = 1; // Encienda ADC

// Configurar UART
// Por defecto hay 8 bits de datos, 1 bit de parada, ningún bit de paridad
U1BRG = 48; // 38400 baud @ 30 MIPS
U1MODEbits.UARTEN = 1; // Habilita UART
U1STAbits.UTXISEL = 1; // interrumpe cuando el buffer TX está vacío
U1STAbits.UTXEN = 1; // Habilitar TX
}
// Esta función lee una muestra única de la especificada
// entrada analogica. Debe tomar menos de 2.5us si el chip
// se ejecuta a unos 30 MIPS.

unsigned int read_analog_channel(int channel)


{
ADCHS = channel; // Select the requested channel
ADCON1bits.SAMP = 1; // start sampling
__delay32(30); // 1us delay @ 30 MIPS
ADCON1bits.SAMP = 0; // start Converting
while (!ADCON1bits.DONE); // Should take 12 * Tad = 1.2us
return ADCBUF0;
}

Potrebbero piacerti anche