martes, 3 de enero de 2017

PRACTICA # 3 UART

OBJETIVO:

Se hará uso del módulo del puerto serial UART1 con el que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Se le enviara un dato de 8 bits por medio de una hypeterminal serial, el MCU la recibe en su interrupción y ese mismo dato de 8 bits lo reenvía de regreso a la hypeterminal.
  • Configurar la unidad UART1
  • Habilitar ambas interrupciones (Send – Receive)
  • Hacer Eco del dato recibido

DESARROLLO:
  • Del manual Renesas RL78G14 RDK User's Manual ubicamos los pines del puerto serial:

  • Utilizamos un conversor USB-Serial:
Conectamos TxD1 --> RxD, TxD --> RxD1 y GND --> PIN 20 GND



PASOS:
  • Creación de un proyecto:
1.- Abrir el software e2studio
2.- New/ C Project
  • Configurar proyecto:

1.- Clic derecho en el proyecto generado y seleccionar Properties:

2.- Seleccionar C/C++ Build / Settings / Linker / Device y establecer los siguientes parámetros:
OCD = 85
Option Byte = efffe8
Palomear: Use range of debug monitor area. Nota: No establecer ningún valor solo dejarlo en blanco.
Apply y después OK.

3.- Configuraremos el UART 1 por medio del modulo SAU0 a 9600 bps, 1 bit stop y no paridad.

void R_SAU0_Create(void)
{
    SAU0EN = 1U;    /* supply SAU0 clock */
    __nop();
    __nop();
    __nop();
    __nop();
    SPS0 = _0004_SAU_CK00_FCLK_4 | _0040_SAU_CK01_FCLK_4;
    R_UART1_Create();
}

void R_UART1_Create(void)
{
    ST0 |= _0008_SAU_CH3_STOP_TRG_ON | _0004_SAU_CH2_STOP_TRG_ON;    /* disable UART1 receive and transmit */
    STMK1 = 1U;    /* disable INTST1 interrupt */
    STIF1 = 0U;    /* clear INTST1 interrupt flag */
    SRMK1 = 1U;    /* disable INTSR1 interrupt */
    SRIF1 = 0U;    /* clear INTSR1 interrupt flag */
    SREMK1 = 1U;   /* disable INTSRE1 interrupt */
    SREIF1 = 0U;   /* clear INTSRE1 interrupt flag */
    /* Set INTST1 low priority */
    STPR11 = 1U;
    STPR01 = 1U;
    /* Set INTSR1 low priority */
    SRPR11 = 1U;
    SRPR01 = 1U;
    /* Set INTSRE1 low priority */
    SREPR11 = 1U;
    SREPR01 = 1U;
    SMR02 = _0020_SAU_SMRMN_INITIALVALUE | _0000_SAU_CLOCK_SELECT_CK00 | _0000_SAU_TRIGGER_SOFTWARE |
            _0002_SAU_MODE_UART | _0000_SAU_TRANSFER_END;
    SCR02 = _8000_SAU_TRANSMISSION | _0000_SAU_INTSRE_MASK | _0000_SAU_PARITY_NONE | _0080_SAU_LSB | _0010_SAU_STOP_1 |
            _0007_SAU_LENGTH_8;
    SDR02 = _CE00_UART1_TRANSMIT_DIVISOR;
    NFEN0 |= _04_SAU_RXD1_FILTER_ON;
    SIR03 = _0004_SAU_SIRMN_FECTMN | _0002_SAU_SIRMN_PECTMN | _0001_SAU_SIRMN_OVCTMN;    /* clear error flag */
    SMR03 = _0020_SAU_SMRMN_INITIALVALUE | _0000_SAU_CLOCK_SELECT_CK00 | _0100_SAU_TRIGGER_RXD | _0000_SAU_EDGE_FALL |
            _0002_SAU_MODE_UART | _0000_SAU_TRANSFER_END;
    SCR03 = _4000_SAU_RECEPTION | _0400_SAU_INTSRE_ENABLE | _0000_SAU_PARITY_NONE | _0080_SAU_LSB | _0010_SAU_STOP_1 |
            _0007_SAU_LENGTH_8;
    SDR03 = _CE00_UART1_RECEIVE_DIVISOR;
    SO0 |= _0004_SAU_CH2_DATA_OUTPUT_1;
    SOL0 |= _0000_SAU_CHANNEL2_NORMAL;    /* output level normal */
    SOE0 |= _0004_SAU_CH2_OUTPUT_ENABLE;    /* enable UART1 output */
    /* Set RxD1 pin */
    PMC0 &= 0xF7U;
    PM0 |= 0x08U;
    /* Set TxD1 pin */
    PMC0 &= 0xFBU;
    P0 |= 0x04U;
    PM0 &= 0xFBU;
}


4.- Creamos las 2 interrupciones:

#pragma interrupt r_uart1_interrupt_send(vect=INTST1)
static void __near r_uart1_interrupt_send(void)
{
            STMK1 = 1U;    /* disable INTST1 interrupt */
}

// interrupcion UART 1 RX PIN 94
#pragma interrupt r_uart1_interrupt_receive(vect=INTSR1)
static void __near r_uart1_interrupt_receive(void)
{
             data_uart = RXD1;
             TXD1 = data_uart;
             STMK1 = 0U;    /* enable INTST1 interrupt */
}

Como se puede observar lo que recibe data_uart en su interrupción de vector INTSR1 es cargado al registro TXD1 y se habilita su interrupción STMK1 para que lo envié de regreso al puerto UART y así hacer eco de todo lo que se reciba.

  • Agregar código, compilar y debug:
1.- Bajar el código de:

2.- Compilar con el icono del martillo, debug con el icono del insecto y correr software: 


3.- Abrir Comm operator u alguna otra hypeterminal serial, configurarla a 9600 bps:


CONEXIÓN:


1 comentario: