sábado, 7 de enero de 2017

INTRODUCCIÓN A RENESAS RL78


Antes de comenzar con el listado de prácticas se hará una breve descripción de lo que es la tecnología RL78 de Renesas.

Renesas líder mundial en los MCU de 16 bits  trajo al mercado en el 2011 el RL78. Una tecnología de microcontroladores que combina el core de ex-NEC 78K y todo el repertorio de periféricos del R8C. En la figura 1 se muestra las diferentes familias de MCU dando lugar al RL78 con aplicaciones directas al consumo como por ejemplo, electrodomésticos, maquinas dispensadoras,  automatización, iluminación,  electrónica en general, etc.


Figura 1. Familias de MCU Renesas

Los elementos que conforman el RL78 se muestra en la figura 2. Es un MCU que corre a 32 Mhz y que nos ofrece un performance de 44 DMIPS. De ese core existen varios grupos como G1x, GLx, G1x, F1x, D1x para diversas aplicaciones y configuraciones de memoria, periféricos, I/O, empaquetados, etc.


Toda la información técnica sobre la familia RL78 se encuentra disponible en la pagina oficial de Renesas. Es recomendable registrarse para así bajar no solo la documentación sino los programas, compiladores, programadores, etc que se necesitaran para poder usar el MCU.

Para poder iniciarse en estas tecnologías también recomiendo el siguiente libro:


En la siguiente entrada describiremos las diversas herramientas, tarjetas, documentación y programas que necesitamos para iniciarnos en este largo y entretenido camino hacia la conquista del RL78.

viernes, 6 de enero de 2017

HERRAMIENTAS Y DOCUMENTACIÓN NECESARIA ANTES DE COMENZAR

Antes de comenzar con las prácticas en necesario tener las siguientes herramientas. Si existen versiones superiores de preferencia utilizarlas.

HARDWARE:
  •          Tarjeta de demostración YRDKRL78G14
https://www.renesas.com/en-us/products/software-tools/boards-and-kits/renesas-demonstration-kits/yrdkrl78g14-for-rl78-g14.html

SOFTWARE:
  •  e² studio 5.2 installer (Web installer)
https://www.renesas.com/en-us/products/software-tools/tools/ide/e2studio.html

  •  RL78 Compiler CC-RL V1.03.00
https://www.renesas.com/en-us/products/software-tools/tools/compiler-assembler/compiler-package-for-rl78-family.html#

  •          Applilet3 for RL78 V1.11.00
https://www.renesas.com/en-eu/products/software-tools/tools/code-generator/ap4-application-leading-tool-applilet.html#


·         Renesas Flash Programmer (Programming GUI) V3.02.00




DOCUMENTACIÓN:
  • R20UT2534EU0200 
Renesas RL78G14 RDK User's Manual
https://www.renesas.com/zh-cn/doc/products/tools/r20ut2534eu0200_yrdkrl78g14_um.pdf

jueves, 5 de enero de 2017

PRACTICA # 1 I/O, LEDS Y SWITCH

OBJETIVO:

1. Configurar el Oscilador interno a 32 Mhz
2. Configurar los Option Byte y el debugger OCD
3. Configurar las entradas y salidas del RF5104PJ
4. Encender un led a través de un switch
5. Debug


DESARROLLO: 

Del manual Renesas RL78G14 RDK User's Manual ubicamos el LED 3 y el SWITCH 1:



PASOS:

Creación de un proyecto:

1.- Abrir el software e2studio
2.- New/ C Project

3.- Seleccionar Renesas CCRL ToolChain después en Next >

4.- Seleccionar el target RF5104PJ, Hardware debug, después Finish


  • 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.

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

2.- Compilar con el icono del martillo

3.- Debug con el icono del insecto:

4.- Correr el programa con el icono start:


FUNCIONAMIENTO:

miércoles, 4 de enero de 2017

PRACTICA # 2 INTERVAL TIMER (IT)

La familia RL78 posee dentro de su arquitectura un oscilador de baja velocidad de 32.768 kHz que es usado por el IT de 12 bits.

OBJETIVO:


1. Configurar la FSUB par el IT
2. Configurar el IT
3. Crear la interrupción IT
4. Crear funciones delay_ms exactas.


DESARROLLO:

Del manual Renesas RL78G14 RDK User's Manual ubicamos el LED 3:



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 oscilador interno High Speed para obtener FCLK a 32 Mhz y el Oscilador de subsistema para obtener FSUB a 32.768 kHz para alimentar al IT.
RL78/G14 User's Manual: Hardware página 239.

// Fclk = 32 Mhz  Fsub = 32.768 khz para el IT (interval Timer)
void SR_Oscilador(void)
{
        volatile uint32_t w_count;
        /*The IT can count one of two possible clock sources, based on the WUTMMCK0 bit in
         the Operation Speed Mode Control Register (OSMC):

         A 0 selects the subsystem clock fSUB. This clock’s frequency is typically
         32.768 kHz, so the period is about 30.5176 _s.

         A 1 selects the internal low-speed oscillation clock fIL. This clock’s frequency is
         nominally 15 kHz but can vary by 15 percent.*/

        /* Set fMX */
        CMC = _00_CGC_HISYS_PORT | _10_CGC_SUB_OSC | _00_CGC_SYSOSC_DEFAULT
                        | _00_CGC_SUBMODE_LOW;
        MSTOP = 1U;
        /* Set fMAIN */
        MCM0 = 0U;
        /* Set fSUB */
        XTSTOP = 0U;

        /* Change the waiting time according to the system */
        for (w_count = 0U; w_count <= CGC_SUBWAITTIME; w_count++)
        {
                __nop();
        }

        OSMC = _00_CGC_SUBINHALT_ON | _00_CGC_RTC_CLK_FSUB;
        /* Set fCLK */
        CSS = 0U;
        /* Set fIH */
        HIOSTOP = 0U;
}


4.- Configuramos IT para obtener una base de tiempo de 100 us:

void R_IT_Create(void)
{
    RTCEN = 1U;    /* supply IT clock */
    ITMC = _0000_IT_OPERATION_DISABLE;    /* disable IT operation */
    ITMK = 1U;    /* disable INTIT interrupt */
    ITIF = 0U;    /* clear INTIT interrupt flag */
    /* Set INTIT low priority */
    ITPR1 = 1U;
    ITPR0 = 1U;
    ITMC = _0002_ITMCMP_VALUE; // 100 us
}


5.- Creamos la interrupción IT

#pragma interrupt r_it_interrupt(vect=INTIT)
static void __near r_it_interrupt(void)
{
          G_100usTimer++;
          if((G_100usTimer % 10) == 0)
               G_msTimer++;
}
   

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

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



VÍDEO:


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:


lunes, 2 de enero de 2017

PRACTICA # 4 LCD GRAFICA 96x64 (SPI)


OBJETIVO:

Se creará el driver para la lcd grafica 96x64 con interfaz de comunicación SPI. Se mostrará un mensaje de 7 líneas.
  • Crear y configurar las unidades SAU1 y CSI21
  • Inicializar los pines de LCD-CS y LCD-RS
  • Incluimos todos los archivos de la librería gráfica en una carpeta

DESARROLLO:
  • Del manual Renesas RL78G14 RDK User's Manual ubicamos los pines del LCD:
  • Del YRDKRL78G14 schematic ubicamos el LCD okaya:

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 SPI por medio del modulo SAU1 y CSI21 a 1 Mhz en el archivo r_cg_serial_SPI.c
void R_SAU1_Create(void)
{
    SAU1EN = 1U;    /* supply SAU1 clock */
    __nop();
    __nop();
    __nop();
    __nop();
    SPS1 = _0000_SAU_CK00_FCLK_0 | _0000_SAU_CK01_FCLK_0;     // fMCK = 32 Mhz cuando SPS1 = 0
    R_CSI21_Create();
}

void R_CSI21_Create(void)
{
    ST1 |= _0002_SAU_CH1_STOP_TRG_ON;    /* disable CSI21 */
    CSIMK21 = 1U;    /* disable INTCSI21 interrupt */
    CSIIF21 = 0U;    /* clear INTCSI21 interrupt flag */
    /* Set INTCSI21 low priority */
    CSIPR121 = 1U;
    CSIPR021 = 1U;
    // al tener SPS1 = 0 da lo mismo tener _8000_SAU_CLOCK_SELECT_CK01 que _0000_SAU_CLOCK_SELECT_CK00
    SIR11 = _0004_SAU_SIRMN_FECTMN | _0002_SAU_SIRMN_PECTMN | _0001_SAU_SIRMN_OVCTMN;    /* clear error flag */
    SMR11 = _0020_SAU_SMRMN_INITIALVALUE | _0000_SAU_CLOCK_SELECT_CK00 | _0000_SAU_CLOCK_MODE_CKS |
            _0000_SAU_TRIGGER_SOFTWARE | _0000_SAU_MODE_CSI | _0000_SAU_TRANSFER_END;
    SCR11 = _C000_SAU_RECEPTION_TRANSMISSION | _0000_SAU_TIMING_1 | _0000_SAU_MSB | _0007_SAU_LENGTH_8;
    //SDR11 = _6400_CSI21_DIVISOR;
    SDR11 = 0x1E00; // 1 Mhz de velocidad SPI de acuerdo a la formula (Transfer clock frequency) = {Operation clock (fMCK) frequency of target channel} ÷ (SDRmn[15:9] + 1) ÷ 2 [Hz]
    SO1 |= _0200_SAU_CH1_CLOCK_OUTPUT_1;    /* CSI21 clock initial level */
    SO1 &= ~_0002_SAU_CH1_DATA_OUTPUT_1;    /* CSI21 SO initial level */
    SOE1 |= _0002_SAU_CH1_OUTPUT_ENABLE;    /* enable CSI21 output */
    /* Set SI21 pin */
    PM7 |= 0x02U;
    /* Set SO21 pin */
    P7 |= 0x04U;
    PM7 &= 0xFBU;
    /* Set SCK21 pin */
    P7 |= 0x01U;
    PM7 &= 0xFEU;
}


4.- Inicializamos la LCD con la función en main.c SR_LCD_GRAPH

5.- Las demás funciones e interrupciones están en el archivo r_cg_serial_SPI.c
  • · R_CSI21_Start
  • · R_CSI21_Send_Receive
  • · r_csi21_interrupt
  • · r_csi21_callback_receiveend
  • · r_csi21_callback_sendend
6.- El API de usuario RDKRL78_spi, YRDKRL78_spi y el driver ST7579, glyph_api se encuentran en la carpeta Glyph:

  • 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:


DEMOSTRACIÓN: