React とか TypeScript とかでアプリとかを作っているうちに
前に買ったとき 95 円だったお気に入りのSTM32L010F4P6が 200 円になっていた。
円安のせいだろうが、ここで文句を言ってもどうしようもないので
国産のたぶん熊本産のルネサスエレクトロニクス製
秋月電子価格 110 円マイコンRL78/G10 ファミリ R5F10Y16ASPを使ってみる。
RL78-S1 コア 8 ビット・シングルチップ・マイクロコントローラの世界にウェブフロントエンドから戻ってまいりました。
書き込み回路を用意
ブレッドボードに挿すので120 円のR5F10Y16ASP使用 RL78マイコンモジュールの方を選ぶ。
このマイコンに Renesas Flash Programmer を使ってシリアル書込みでプログラミングするのでルネサスのドキュメントを参考にして書き込み回路を作る。
秋月電子でこれらを買って書き込み器を作る。
買ってみた後で気づいたが、このページによるともっと単純になるようだ。
シリアル変換器から RTS 信号が出てないので DTR にインバーター回路を接続した。きちんと動く
RL78 マイコンモジュールと書き込み回路を接続
接続回路はこのように GND, VDD, TOOL0, RESET を接続する。
回路図を参照して、ポート P00 つまり 6 番ピンに L チカ用 LED をシンク接続する。(ソース接続でも構わないが)
Renesas Flash Programmer
Renesas Flash Programmer を起動して「新しいプロジェクトの作成」を選択。
ツール詳細 -> リセット設定
リセット信号を DTR にする。
(デフォルトで Invert なのでインバーター回路が不要だった)
接続をクリックすると「操作が成功しました。」となる。
Device: RL78 と表示されているのでマイコンと会話できている。
Renesas Flash Programmer によって RL78 マイコンに書き込めるようになった。
e2 studio で新規プロジェクトを作る。
この後は「次へ」を連続でクリックして新規プロジェクトを作る。
L チカソフトウェアを作る
スマート・コンフィギュレータが使えないようなので、 RL78/G10 ユーザーズマニュアル ハードウェア編を参照して手作業でレジスタ設定をする。
/***************************************************************/
/* */
/* 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;
}
ビルド
プロジェクト -> すべてビルドをする。
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 で書き込むファイル
Renesas Flash Programmer によるプログラミング
RESET ピンにつながる線を抜くとプログラムが実行されて LED が点灯する。
(このソフトウェアでは点滅が早すぎて点灯に見える。)
RESET ボタンを追加する
実行するのに毎回 RESET 線を抜くのが面倒なので、RESET 端子を 1k 抵抗でプルアップして RESET 線と RESET 端子間にタクトスイッチを追加する。
このタクトスイッチは書き込み時に書込みが完了するまで押し続ける。
L チカが見えるように遅くする
LED の点滅が早すぎて点灯にしか見えないので、ループで nop を実行する(つまり「なにもしない」を実行する)ことで点滅を遅くする。
/***************************************************************/
/* */
/* 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) { }
の部分をコメントアウトする。
/*
* INT_TM00 (0x12)
*/
//void INT_TM00 (void) { }
で、こう。
/***************************************************************/
/* */
/* 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 チカコードをかく。
/* 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 規格にしておく。
ビルド
このファイルを 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 に囲まれた部分のみ)
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 に囲まれた部分のみ)
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 に囲まれた部分のみ)
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 が点滅する。
なぜか周期が安定しない。(LED を見ていても感じる。)
まあいいか。
コメント