RL78/G10ファミリR5F10Y16ASPを使ってLチカしてみた

React とか TypeScript とかでアプリとかを作っているうちに
前に買ったとき 95 円だったお気に入りのSTM32L010F4P6が 200 円になっていた。

円安のせいだろうが、ここで文句を言ってもどうしようもないので
国産のたぶん熊本産のルネサスエレクトロニクス製
秋月電子価格 110 円マイコンRL78/G10 ファミリ R5F10Y16ASPを使ってみる。

RL78-S1 コア 8 ビット・シングルチップ・マイクロコントローラの世界にウェブフロントエンドから戻ってまいりました。

書き込み回路を用意

ブレッドボードに挿すので120 円のR5F10Y16ASP使用 RL78マイコンモジュールの方を選ぶ。
このマイコンに Renesas Flash Programmer を使ってシリアル書込みでプログラミングするのでルネサスのドキュメントを参考にして書き込み回路を作る。

ドキュメント名:『Renesas Flash Programmer PC のシリアルポートを使用した書き込み回路例』

ドキュメント番号:R20UT0857JJ0300

『Renesas Flash Programmer PCのシリアルポートを使用した書き込み回路例』

『Renesas Flash Programmer PCのシリアルポートを使用した書き込み回路例』

秋月電子でこれらを買って書き込み器を作る。

買ってみた後で気づいたが、このページによるともっと単純になるようだ。

シリアル変換器から RTS 信号が出てないので DTR にインバーター回路を接続した。きちんと動く

RL78 マイコンモジュールと書き込み回路を接続

接続回路はこのように GND, VDD, TOOL0, RESET を接続する。

AE-R5F10Y16ASPマイコンモジュールの回路

E1接続書き込み回路例

E1接続書き込み回路例

回路図を参照して、ポート P00 つまり 6 番ピンに L チカ用 LED をシンク接続する。(ソース接続でも構わないが)

回路

Renesas Flash Programmer

Renesas Flash Programmer を起動して「新しいプロジェクトの作成」を選択。

新しいプロジェクトの作成

ツール詳細 -> リセット設定
リセット信号を DTR にする。
(デフォルトで Invert なのでインバーター回路が不要だった)

ツール詳細

接続をクリックすると「操作が成功しました。」となる。

操作が成功しました

Device: RL78 と表示されているのでマイコンと会話できている。
Renesas Flash Programmer によって RL78 マイコンに書き込めるようになった。

e2 studio で新規プロジェクトを作る。

この後は「次へ」を連続でクリックして新規プロジェクトを作る。

L チカソフトウェアを作る

スマート・コンフィギュレータが使えないようなので、 RL78/G10 ユーザーズマニュアル ハードウェア編を参照して手作業でレジスタ設定をする。

C
/***************************************************************/
/*                                                             */
/*      PROJECT NAME :  RL78_blink                             */
/*      FILE         :  RL78_blink.c                           */
/*      DESCRIPTION  :  Main Program                           */
/*                                                             */
/*      This file was generated by e2 studio.                  */
/*                                                             */
/***************************************************************/

#include "iodefine.h"
#include "iodefine_ext.h"
#include <stdbool.h>

int main() {
    // IOポート
    PM0 &= ~(0x1FU);		// P00-P04 を出力に設定

    while(true) {
        P0_bit.no0 = 0;		// P00 をクリア
        P0_bit.no0 = 1;		// P00 をセット
    }
    return 0;
}
クリックして展開し、詳細を表示

ビルド

プロジェクト -> すべてビルドをする。

PLAINTEXT
Extracting support files...
15:22:38 **** プロジェクト RL78_blink に対する構成 Debug の ビルド ****
make -r -j16 all
Building file: ../src/RL78_blink.c
Building file: ../generate/hwinit.c
Building file: ../generate/inthandler.c
../src/RL78_blink.c
../generate/hwinit.c
Building file: ../generate/start.S
../generate/inthandler.c
Building file: ../generate/vects.c
../generate/start.S
../generate/vects.c
Building target: RL78_blink.elf
llvm-objcopy "RL78_blink.elf" -O srec  "RL78_blink.srec"
llvm-size --format=berkeley "RL78_blink.elf"
   text	   data	    bss	    dec	    hex	filename
    252	    128	     32	    412	    19c	RL78_blink.elf

15:22:39 Build Finished. 0 errors, 0 warnings. (took 257ms)
クリックして展開し、詳細を表示

「構成 Debug」なので Debug ディレクトリ内の RL78_blink.srec ファイルが Renesas Flash Programmer で書き込むファイル

RL78_blink.srecファイル

Renesas Flash Programmer によるプログラミング

RL78_blink.srec ファイルを選択して「スタート」をクリックすると書き込める

RESET ピンにつながる線を抜くとプログラムが実行されて LED が点灯する。
(このソフトウェアでは点滅が早すぎて点灯に見える。)

RESET ボタンを追加する

実行するのに毎回 RESET 線を抜くのが面倒なので、RESET 端子を 1k 抵抗でプルアップして RESET 線と RESET 端子間にタクトスイッチを追加する。
このタクトスイッチは書き込み時に書込みが完了するまで押し続ける。

回路

L チカが見えるように遅くする

LED の点滅が早すぎて点灯にしか見えないので、ループで nop を実行する(つまり「なにもしない」を実行する)ことで点滅を遅くする。

C
/***************************************************************/
/*                                                             */
/*      PROJECT NAME :  RL78_blink                             */
/*      FILE         :  RL78_blink.c                           */
/*      DESCRIPTION  :  Main Program                           */
/*                                                             */
/*      This file was generated by e2 studio.                  */
/*                                                             */
/***************************************************************/

#include "iodefine.h"
#include "iodefine_ext.h"
#include <stdbool.h>
#include <stdint.h>

static void __near toggle_pin(){
    P0_bit.no0 ^= 1U;      // P00 出力を反転
}

int main() {
    // IOポート
    PM0 &= ~(0x1FU);		// P00-P04 を出力に設定

    P0_bit.no0 = 0;			// P00 をクリア
    while(true) {
        for(uint16_t counter=50000U ; counter>0 ; --counter) {
            NOP();
        }
        toggle_pin();
    }
    return 0;
}
クリックして展開し、詳細を表示

プロジェクト -> すべてビルドをする。
タクトスイッチを押し続けながら Renesas Flash Programmer の「スタート」をクリックして RL78 マイコンにソフトウェアをプログラミングする。

実行

書込み完了後にタクトスイッチを離すことでプログラムを実行する。

blink LED

インターバルタイマーを使って L チカ

続けてインターバルタイマー割り込みを使って L チカ、インターバルタイマーの操作手順はマニュアルを参照する。

リンクエラーになるので generate/inthandler.c の void INT_TM00 (void) { } の部分をコメントアウトする。

C
/*
 * INT_TM00 (0x12)
 */
//void INT_TM00 (void) { }
クリックして展開し、詳細を表示

で、こう。

C
/***************************************************************/
/*                                                             */
/*      PROJECT NAME :  RL78_blink                             */
/*      FILE         :  RL78_blink.c                           */
/*      DESCRIPTION  :  Main Program                           */
/*                                                             */
/*      This file was generated by e2 studio.                  */
/*                                                             */
/***************************************************************/

#include "iodefine.h"
#include "iodefine_ext.h"
#include <stdbool.h>
#include <stdint.h>
#include "interrupt_handlers.h"

/*
 * INT_TM00 (0x12)
 */
void INT_TM00 (void) {
    P0_bit.no0 ^= 1U;      // P00出力を反転
}

int main() {
    // クロック設定
    HOCODIV = 0x01U ;       // 高速オンチップオシレータ―クロック 20 MHz
    // 周辺ハードウェアに供給するクロック
    PER0 |= 1U;            // TAU0EN タイマアレイユニットにクロックを供給

    // タイマアレイユニット
    TPS0 = 0x08U;          // 20MHzクロック, プリスケーラ 1/256 = 78.1kHz = 12.8us

    // INTTM0nの発生周期=カウントクロックの周期×(TDR0nの設定値+1)
    // 12.8us * (39061+1) = 500ms
    const uint16_t timer_count = 39061;
    // タイマアレイユニット
    TT0 = 1U;               // チャネル0カウント停止
    // インターバルタイマ設定
    TMR00H = 0x00;
    TMR00L = 0x00;
    // カウント値設定
    TDR00H = timer_count >> 8 & 0xFF;
    TDR00L = timer_count & 0xFF;
    //
    MK0L &= ~(1 << 7);      // タイマー0割り込み許可
    TS0 = 1U;               // タイマー開始
    //
    EI();                   // 割り込み許可

    // IOポート
    PM0 &= ~0x1F;           // P00-P04 を出力に設定
    PMC0 &= ~0x1E;          // P01-P04はアナログ入力が可能なポートなので
                            // デジタル入出力に設定

    P0_bit.no0 = 0;         // P00 をクリア

    // メインループは何もしない
    while(true) {}
    return 0;
}
クリックして展開し、詳細を表示

インターバルタイマー割り込みの発生周期はマニュアルに書いてある。 実行してポート P00 をオシロスコープで見てみると、だいたい計算通り 500ms で割り込みされている。

CC-RL 無償評価版を使ってみる。

https://www.google.com/search?q=R20TS0898JJ0100

V1.12.00 以降の CC-RL 無償評価版のライセンスが「製品開発・商用利用」が許可に変更されていたので、使ってみる。

「次へ」をクリックして新規プロジェクトを作る。

コード生成

「コードを生成する」をクリックする。

src/cg_src/r_cg_main.c ファイルの main 関数内にある Start user code から End user code に囲まれた部分に L チカコードをかく。

C
    /* Start user code. Do not edit comment generated here */
    while (1U)
    {
        for(uint16_t counter=50000U ; counter>0 ; --counter) {
    	    NOP();
        }
        P0_bit.no0 ^= 1U;      // P00 出力を反転
    }
    /* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示

赤線が出るので言語規格を C99 規格にしておく。

e2_studio14

ビルド

このファイルを Renesas Flash Programmer でマイコンに書き込むと LLVM ツールチェーンでビルドしたソフトウェアと同じく LED が点滅する。

コード生成を使ってインターバルタイマー

CC-RL コード生成を使ってインターバルタイマー割り込みの L チカをしてみる。

「コードを生成する」をクリックする。

src/cg_src/r_cg_tau_user.c ファイルの r_tau0_channel0_interrupt 関数内にある Start user code から End user code に囲まれた部分に L チカコードをかく。
(コピペするなら Start user code から End user code に囲まれた部分のみ)

C
static void __near r_tau0_channel0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
	P0_bit.no0 ^= 1U;      // P00 出力を反転
    /* End user code. Do not edit comment generated here */
}
クリックして展開し、詳細を表示

src/cg_src/r_cg_main.c ファイルの main 関数内にある Start user code から End user code に囲まれた部分にコードをかく。
タイマー割り込みで L チカするので、このメインループは何もしない。
(コピペするなら Start user code から End user code に囲まれた部分のみ)

C
void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    while (1U)
    {
    	NOP();
    }
    /* End user code. Do not edit comment generated here */
}
クリックして展開し、詳細を表示

同じファイルの R_MAIN_UserInit 関数内にある Start user code から End user code に囲まれた部分に初期化コードをかく。
(コピペするなら Start user code から End user code に囲まれた部分のみ)

C
static void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    R_TAU0_Channel0_Start();
    EI();
    /* End user code. Do not edit comment generated here */
}
クリックして展開し、詳細を表示

ビルドしてできた mot ファイルを Renesas Flash Programmer でマイコンに書き込むと
LLVM ツールチェーンでビルドしたソフトウェアと同じく LED が点滅する。

Lチカ周期

なぜか周期が安定しない。(LED を見ていても感じる。)
まあいいか。

著作権表示

著者: Akihiro Yamamoto

リンク: https://ak1211.com/posts/7736/

ライセンス: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

コメント

検索を開始

キーワードを入力して記事を検索

↑↓
ESC
⌘K ショートカット