TB-RX65N/RX130/RX231+CSplus sample program

こんにちは。NoMaYです。

TB-RX65N/RX130/RX231のCS+のサンプルプログラムです。まずはデバッグコンソール出力のサンプルです。(サンプルプログラム置き場とGitHubに置きました。)

japan.renesasrulz.com/cafe_rene/m/sample_program/460

github.com/NoMaY-jp/RX_SmartConfigurator_examples_RXTB_CSplus/tree/cafe_rene/10_DebugConsole_printf

int main(void)
{
    LED0 = LED_ON;

    for (;;)
    {
        printf( "Hello World\r\n" );

        R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );
        LED0 = ~LED0;

        R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );
        LED0 = ~LED0;
    }
}


 

  • こんにちは。NoMaYです。

    TB-RX65N/RX130/RX231のCS+のサンプルプログラムです。UART出力のサンプルを追加しました。(サンプルプログラム置き場とGitHubに置きました。)

    japan.renesasrulz.com/cafe_rene/m/sample_program/460

    github.com/NoMaY-jp/RX_SmartConfigurator_examples_RXTB_CSplus/tree/cafe_rene/30_UART_Printf

    R_CONFIG_SCI_SEND_IMPL( SCI1, 128 /* transmit buffer size */ );11/08変更
    U_CONFIG_UART_PRINTF_IMPL( SCI1, 128 /* transmit buffer size */ );

    int main(void)
    {
        LED0 = LED_ON;

        for (;;)
        {
            Printf( SCI1, "Hello World\r\n" );

            R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );
            LED0 = ~LED0;

            R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );
            LED0 = ~LED0;
        }
    }

    なお、Config_ext.hというヘッダをプロジェクトに追加して、r_cg_macrodriver.hの中からインクルードして下さい。(このヘッダにはパズルのようなマクロを記述してありますが、ちょっと初学者向きでは無いですので、説明は省略します。すみません。) また、Config_ext.hは、どのSCIチャンネルでも使用出来るようになっていますが、サンプルプログラムで使用しているSCIチャンネル以外を使用する場合は、予め、使用するSCIコンポーネントをRXスマートコンフィグレータで生成しておいて下さい。

    プロジェクトツリー: File/Smart Configurator/general/r_cg_macrodriver.h
    変更内容: 赤文字箇所を追加

    /******************************************************************************
    Global functions
    ******************************************************************************/
    void R_Systeminit(void);
    /* Start user code for function. Do not edit comment generated here */

    #include "Config_ext.h"

    /* End user code. Do not edit comment generated here */

    実行例: (なお、写真は別プロジェクトのもので、本プロジェクトでは光るLEDは左側のみです。)




     

  • NoMaYさん
    これは便利ですね、
    Debug Consoleに表示できるのですね、是非試してみたいですが
    Debug Consoleから'A'というようなキー入力したときに分岐するようなことは
    本来可能なのでしょうか?
    この投稿タイトルとは関係ないことですが
    NoMaYさんにお伺いしたくて
    今一方向ですから両方向で通信できればさらに便利かなと思った次第です。
  • IKUZOさん、こんにちは。NoMaYです。

    デバッグコンソールで両方向通信も可能です。RXスマートコンフィグレータ(というかFIT BSPモジュール)+CC-RXで、例えば、以下のような普通のC言語プログラムで可能です。(ただし、普通のC言語プログラム同様に入力待ちで処理が止まりますので、FIT BSPモジュールの下層を見たくない場合はRTOSで入力待ちのタスクを作るか、RTOSを使いたくない場合はFIT BSPモジュールのソースを参考にして入力存在確認関数を作るか、そういったことをする必要が出てくるかとは思います。)

    プログラム例のソース:

    int main(void)
    {
        char c;

        for (;;)
        {
            printf( "Please enter one digit number>\r\n" );

            c = getchar();

            printf( "\r\nNow %c is entered.\r\n\r\n", c );
        }
    }

    プログラム例の実行画面:



    FIT BSPモジュールの下層の処理:

    github.com/renesas/rx-driver-package/blob/153ad87/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/all/lowlvl.c
     

  • NoMaYさん
    getchar();も使用できるんですね、そうするとターミナルソフトを別に用意する必要も無いのでデバッグがやりやすいですよね、今自分はSCIで引き出してやっているのですが、これはE1とかE2のエミュレータの配線を使用して通信しているわけなんでしょ?
  • IKUZOさん、こんにちは。NoMaYです。

    > これはE1とかE2のエミュレータの配線を使用して通信しているわけなんでしょ?

    そうです。ただ、以下の欠点もありますので、それを踏まえておく必要はあるかと思います。

    (1) あまり速くは無い。きちんと計っていないが数十Kbps~数Kbpsぐらいっぽい
    (2) DMA/DTCによる転送が出来ないので送受信中はCPUに負担を掛ける
    (3) パソコン側のターミナルソフトを自作することが出来ない

  • こんにちは。NoMaYです。

    TB-RX65N/RX130/RX231のCS+のサンプルプログラムです。I2C送受信のサンプルを追加しました。(サンプルプログラム置き場とGitHubに置きました。) なお、今回、手っ取り早く通信相手を用意したかったので、RX72N Envision Kit及びそれに搭載されているライトセンサISL29034を使用したことにより、TBボードに関してはビルド出来ることまでしか確認していないです。

    japan.renesasrulz.com/cafe_rene/m/sample_program/460

    github.com/NoMaY-jp/RX_SmartConfigurator_examples_RXTB_CSplus/tree/cafe_rene/60_I2C_Master

    U_CONFIG_I2C_MASTER_IMPL( SCI11 );

    int main(void)
    {
        /* ISL29034 data sheet: https://www.renesas.com/jp/ja/doc/datasheet/isl29034.pdf */
        uint8_t adr7_ISL29034 = 0x44; /* The 7-bits address of the device */
        uint8_t cmd_read_ID[1] = {
            0x0F  /* Address of the ID register */
        };
        uint8_t cmd_clr_BOUT[2] = {
            0x0F, /* Address of the ID register */
            0x00  /* Write data (the BOUT bit is the bit7 of the ID register) */
        };
        uint8_t ret_data1[1] = { 0x00 }; /* Just clear before reception */
        uint8_t ret_data2[1] = { 0x00 }; /* Just clear before reception */

        printf( "Hit 'Enter' key to proceed the operation.\r\n" );
        getchar();

        U_Config_I2C_Master_Start( SCI11 );

        U_Config_I2C_Master_Send_UWT( SCI11, adr7_ISL29034, cmd_read_ID, sizeof(cmd_read_ID) );
        U_Config_I2C_Master_Receive_UWT( SCI11, adr7_ISL29034, ret_data1, sizeof(ret_data1) );
        printf( "Read the initial value of the ID register:        " );
        printf( "(val & 0xA8) = 0x%02x (expected: 0xA8)\r\n\r\n", ret_data1[0] & 0xA8 );11/26変更
        printf( "(val & 0xA8) = 0x%02X (expected: 0xA8)\r\n\r\n", ret_data1[0] & 0xA8 );

        U_Config_I2C_Master_Send_UWT( SCI11, adr7_ISL29034, cmd_clr_BOUT, sizeof(cmd_clr_BOUT) );
        printf( "Clear the BOUT bit (the bit7 of the ID register).\r\n\r\n" );

        U_Config_I2C_Master_Send_UWT( SCI11, adr7_ISL29034, cmd_read_ID, sizeof(cmd_read_ID) );
        U_Config_I2C_Master_Receive_UWT( SCI11, adr7_ISL29034, ret_data2, sizeof(ret_data2) );
        printf( "Read again the value of the ID register:          " );
        printf( "(val & 0xA8) = 0x%02x (expected: 0x28)\r\n\r\n", ret_data2[0] & 0xA8 );11/26変更
        printf( "(val & 0xA8) = 0x%02X (expected: 0x28)\r\n\r\n", ret_data2[0] & 0xA8 );


        printf( "Done.\r\n" );
        for (;;)
        {
        }
    }

    なお、Config_ext.hというヘッダをプロジェクトに追加して、r_cg_macrodriver.hの中からインクルードして下さい。(このヘッダにはパズルのようなマクロを記述してありますが、ちょっと初学者向きでは無いですので、説明は省略します。すみません。) また、Config_ext.hは、どのSCIチャンネルでも使用出来るようになっていますが、サンプルプログラムで使用しているSCIチャンネル以外を使用する場合は、予め、使用するSCIコンポーネントをRXスマートコンフィグレータで生成しておいて下さい。

    プロジェクトツリー: File/Smart Configurator/general/r_cg_macrodriver.h
    変更内容: 赤文字箇所を追加

    /******************************************************************************
    Global functions
    ******************************************************************************/
    void R_Systeminit(void);
    /* Start user code for function. Do not edit comment generated here */

    #include "Config_ext.h"

    /* End user code. Do not edit comment generated here */

    実行例: (今回はRX72N Envision Kitを使用しました。)


    [関連スレッド]

    RX231のコード生成を用いた簡易IIC通信について
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/6169/rx231-iic/34171#34171
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/6169/rx231-iic/34173#34173

    今回、送信完了/受信完了を待つ送信関数名/受信関数名の末尾に _UWT を付けてみました。(unlimited wait timeの意。また、先頭を R_ ではなくて U_ にしてあります。ちなみに、STM32CubeMXでは送信完了/受信完了を待たない関数の名前の末尾に _IT を付けるようでしたので、逆向きに(?)真似てみました。)


    以下は私のチョンボですね。

  • こんにちは。NoMaYです。

    TB-RX65N/RX130/RX231(とRX72N Envision Kit)でのCS+のサンプルプログラムです。以下のサンプルを追加しました。(サンプルプログラム置き場とGitHubに置きました。) (それと、RXスマートコンフィグレータの素のAPIを使うサンプルプログラムもあった方が良さそうかな、とも思い始めています、、、)

    デバッグコンソール入力
    デバッグコンソール入力確認
    UART入力
    UART入力確認

    japan.renesasrulz.com/cafe_rene/m/sample_program/460

    github.com/NoMaY-jp/RX_SmartConfigurator_examples_RXTB_CSplus/tree/cafe_rene

    デバッグコンソール入力

    20_DebugConsole_getchar/

    int main(void)
    {
        char c;

        for (;;)
        {
            printf( "Please enter a character:\r\n" );

            c = getchar();

            printf( "\r\nNow %c is entered.\r\n\r\n", c );
        }
    }

    実行例:


    デバッグコンソール入力確認

    21_DebugConsole_getchar_ready/

    int main(void)
    {
        char c;
        int i;

        for (;;)
        {
            printf( "Please enter a character:\r\n" );

            for (i = 0; i < 3; i++)
            {
                R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );

                if (is_getchar_ready())
                {
                    c = getchar();
                    printf( "\r\nYeah, %c is entered.\r\n\r\n", c );

                    R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );

                    break;
                }
            }
        }
    }

    実行例:


    UART入力

    40_UART_Getchar/

    U_CONFIG_UART_PRINTF_IMPL(  SCI1, 128 /* transmit buffer size */ );
    U_CONFIG_UART_GETCHAR_IMPL( SCI1, 128 /* receive ring buffer size */ );

    int main(void)
    {
        char c;

        for (;;)
        {
            Printf( SCI1, "Please enter a character:\r\n" );

            c = Getchar( SCI1 );

            Printf( SCI1, "\r\nNow %c is entered.\r\n\r\n", c );
        }
    }

    実行例: (9600bpsです。)


    UART入力確認

    41_UART_Getchar_Ready/

    U_CONFIG_UART_PRINTF_IMPL(  SCI1, 128 /* transmit buffer size */ );
    U_CONFIG_UART_GETCHAR_IMPL( SCI1, 128 /* receive ring buffer size */ );

    int main(void)
    {
        char c;
        int i;

        for (;;)
        {
            Printf( SCI1, "Please enter a character:\r\n" );

            for (i = 0; i < 3; i++)
            {
                R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );

                if (Is_Getchar_Ready( SCI1 ))
                {
                    c = Getchar( SCI1 );
                    Printf( SCI1, "\r\nYeah, %c is entered.\r\n\r\n", c );

                    R_BSP_SoftwareDelay( 1000, BSP_DELAY_MILLISECS );

                    break;
                }
            }
        }
    }

    実行例: (9600bpsです。)


    なお、Config_ext.hというヘッダをプロジェクトに追加して、r_cg_macrodriver.hの中からインクルードして下さい。(このヘッダにはパズルのようなマクロを記述してありますが、ちょっと初学者向きでは無いですので、説明は省略します。すみません。) また、Config_ext.hは、どのSCIチャンネルでも使用出来るようになっていますが、サンプルプログラムで使用しているSCIチャンネル以外を使用する場合は、予め、使用するSCIコンポーネントをRXスマートコンフィグレータで生成しておいて下さい。

    プロジェクトツリー: File/Smart Configurator/general/r_cg_macrodriver.h
    変更内容: 赤文字箇所を追加

    /******************************************************************************
    Global functions
    ******************************************************************************/
    void R_Systeminit(void);
    /* Start user code for function. Do not edit comment generated here */

    #include "Config_ext.h"

    /* End user code. Do not edit comment generated here */

     

  • こんにちは。NoMaYです。

    投稿したサンプルプログラムですが、時間待ちをするのに、FITのBSPモジュールのR_BSP_SoftwareDelay()というAPIを使っています。この場合、時間待ちをしている間は何も出来なくなります。そうでは無くて、ループを回しながら時間待ちをしたい場合には、以下のスレッドの投稿のような方法を試してみて下さい。

    タイマーと配列
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/7247/thread/38656#38656
     

  • こんにちは。NoMaYです。

    ここ数日、以下のスレッドが立っていましたが(以下のスレッド自体はTENDの話がメインでしたけれど)、このサンプルプログラムで実装したPrintf() APIは連続複数回送信に対応済みです。#以下のスレッドに"検索"のキーワードのこともありましたが、結局、ちょっとうざい行為ではありますけれど、こうやって検索にヒットし易くなるようにしていかないと駄目そうかも、ですね、、、(駄目なのでしょうね、、、)

    スマートコンフィグレータのCGで生成したSCI調歩同期のコードで、連続複数回の送信が出来ません
    japan.renesasrulz.com/cafe_rene/f/forum5/7355/cg-sci/39159#39159
     

  • こんにちは。NoMaYです。

    実は、以下のような内部実装関数があるのですが、これを直接使っているサンプルプログラムは、まだ、作っていませんので使っている人はいないと思いますけど、たぶん、後日、ちょっと変えると思います。

    現在(一例):

    U_Config_SCI0_UART_Send() → 送信完了を待たない
    U_Config_SCI0_UART_Send_UWT() → 送信完了を待つ

     
    後日(一例):

    U_Config_SCI0_UART_Send() → 送信完了を待つ
    U_Config_SCI0_UART_Send_IT() → 送信完了を待たない
    U_Config_SCI0_UART_Send_Ex() → 引数で送信完了を待つ/待たないを指定

     
    [関連リンク]

    RL78 SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッド
    japan.renesasrulz.com/cafe_rene/f/forum18/7253/rl78-smartconfigurator/39178#39178