余白 Copyright © 2010-2018,2021,2023-2024 てきーらサンドム


■■■ 78K0R,RL78の屋根裏部屋 ■■■

 ルネサス製マイコン78K0R,RL78に関する情報ページです。デバイスや開発ツールについて,注意点,使いこなしのポイント,落とし穴,裏技,雑学などをトピックスとして掲載していきます。
 RL78ファミリ(コアは78K0Rをベースとして一部変更)は,ルネサス エレクトロニクス(Renesas Electronics)の8〜16ビット系マイコンの主力品種です。
 (2023/11/10)久しぶりにデジキーで一番安いRL78を検索したらRL78/G1Nが出てきました。大電流ポートがあってLED駆動用として人気があるのかな?

最近の更新以前の更新
2024/03/10 [ハードウエア]”端子比較 RL78/G13とG23(64pin)”を追加。
2024/03/09 [ハードウエア]”RL78/G2x,F2xのデータ・フラッシュ”を追加。
2023/11/10 [資料室]RL78/G22、RL78/G1N 追加。
2021/04/16 [資料室]RL78/G23 追加。
2018/09/19 [資料室]RL78/L1A 追加。
2018/04/09 [ハードウエア]”ボーレート設定の落とし穴”を追加。
2018/04/07 [ハードウエア]”低電圧メインの落とし穴”を追加。

  〜〜〜 補足 〜〜〜

 


●ツール総合(PM+,CubeSuite+,CC78K0R,RA78K0R) (CS+forCC、e2studio+gccの詳細は別項)

開発ツールの種類とダウンロード場所】 2018/2/12 更新
 現在ダウンロード可能な統合環境は以下の4種類です(ダウンロード・ページは[資料室]参照)。
  ・CS+ for CC (RL78, RH850, RX用環境、CC-RLコンパイラ同梱)
  ・e2studio (gcc(GNURL78)あるいはCC-RLコンパイラが別途必要)
  ・CS+ for CA (RL78, 78K0R,78K0,V850用環境、CA78K0(CC78K0Rコンパイラ)同梱)
  ・PM+ (78K0R,78K0,V850用環境、RA78K0Rアセンブラに同梱、CC78K0Rコンパイラ別ファイル,78K0R用合計で100MB程度)
 コンパイラの種類としては、NEC系統のCC78K0R、日立系統のCC-RL、gccの3種類ということになります。
 サポート製品から見て将来的にはCC78K0Rは消えてしまうのでしょうね。

項目 CC-RL製品版 CC-RL評価版 CC78K0R評価版 GCC for Renesas 4.9.2.201703
-GNURL78 Windows Toolchain
入手費用 42,500円/年
194,000円/無期限
(チップワン調べ)
無償 無償 無償
サポート 有り(のはず) 無し(かふぇルネで可か?) 有り(日本語も可)
サイズ制限 無し 60日間は無し。以降64Kバイト 64Kバイト 無し
良い点 たぶんオブジェクト効率が
一番高い(IARとの比較は
不明)
・1bit変数が定義可能
(ビットフィールドにしなくても
自動パッキングしてくれる)
無償でサイズ無制限、サポート有り
劣る点 M社XCコンパイラ(通常版)
が無償の状況でこの強気
の値付けは、PC98終焉の
過程を思い起こします。
64Kバイト制限
(1bit変数がアセンブラでしか使え
ないとか多少の不満はあれど
制限解除してくれたら許す^^;)
・64Kバイト制限
・改良が期待できない
 (終息品扱いか?)
・doubleは32bitのみ
・高速の割込み処理に向かない
 (レジスタ退避復旧が多い)
・日本語の親切な資料がない。
・英語版もRL78専用の解説書が
 見つからない。
・レジスタバンクが解放されて無い
・高速の割込み処理に向かない
 (レジスタ退避復旧が多い)
 
 78K0RとMINICUBE2を使う場合はPM+の方が軽いし,PM+版Cコンパイラには基本的なC言語文法のヘルプも付いているのでお勧めでしたがアップデートが無いのは残念。どうしてもPM+環境でアップデートしたければ,CubeSuite+もインストールし,そのBinディレクトリからCC78K0R, RA78K0Rをコピーします(CS+版でもできるかは未確認)。
 RL78を使う場合またはE1エミュレータを使う場合は,CubeSuite+しか対応していません(RL78/G12,G13のビルドのみなら後述の方法でPM+環境で実行出来ましたが,素直にCubeSuite+に移行した方が良いでしょう)。基本的なC言語文法のドキュメントが必要であれば,旧ドキュメントを参照すればよいです。
 
致命的障害】 2013/9/21 追加
 CubeSuite+でソースファイルが消失する障害が報告されています。恒久対策はV2.01〜。V2.00まででソース保存時にエラーが表示された場合は、保存手順を見てください。
ソースの表示順序/リンク順序を変更する方法 2012/7/8 更新
@PM+の場合
 ソース・ファイルの登録順(表示順)にリンクされるため,スタートアップ・ルーチンのように最初にリンクしたいソースを後で追加した場合は,登録順番を上げる必要があります。
 「プロジェクト」→「プロジェクトの設定」→「ソース・ファイル」
の画面で移動したいソースを選んで矢印ボタン↓または↑を押すと移動します。一番下にある場合に↓ボタンを押すと先頭に移動します。

ACubeSuite+の場合
 表示とリンクの順序は独立に設定できます。表示順序を変更したい場合は「プロジェクトツリー」の中で,移動したいソースを左クリックで掴んで移動先で離します。
 リンク順序は,「ビルドツール(右クリックメニュー)」→「リンク順を設定する」で変更します。
  
PM+→CubeSuite+移行ガイド】 2014/1/14 更新
 いよいよWindowsXPのサポートが切れるので自宅マシン群をWin7機に切り替えしています。CubeSuite+もようやくVer2をインストールしてみました。
 
SFR定義場所】 2012/2/11 追加
 IOポート名,各種周辺レジスタ名と言ったSFR名は,デバイス・ファイルの中で定義されています。デバイス・ファイルはバイナリ形式のファイルですので,バイナリ・エディタがないと編集できません。
 SFR名の変更用ツールを作るのは難しくないのですが,デバイス登録の管理など管理の手間が増えるので,名前を変えたければ#define(C言語)またはEQU(アセンブラ)で定義し直した方が良いです。再定義した名前は青字表示ではなくなりますが,頭にrとか適当な接頭辞付けてSFR名だと分かるようにしておけば良いでしょう。また自分でSFRアドレスを記述したヘッダを作るのはお勧めしません。効率の悪いコードが生成される可能性があります。
・デバイス・ファイル格納場所
  PM+    :Program files¥NEC Electronics Tools¥DEV¥*.78K
  CubeSuite+:Program files(x86)¥Renesas Electronics¥CubeSuite+¥Devices\RL78¥Devicefile¥*.DVF
・デバイス・ファイルの内容
  「デバイス・ファイル調査」の項を参照して下さい。
  
フリー・ツールの64K制限
 RA78K0Rに含まれているリンカによって,ROM64Kバイトに制限されています。逆に言うと,コンパイラ,アセンブラは64Kを越えるコードを出力できるようです。デバッガはもともとフリー版しかないので当然64Kを越えるオブジェクトを扱えます。フリー・ツールで64K越えのプログラムを作る方法については,「64K越えの技法」の項を見てください。なおベクターに64K越えの支援用としてヘキサ追加ツール(紹介ページ)を掲載しています。
ファイル形式
 オブジェクト・ファイルやロードモジュール・ファイルの形式は,COFF形式の系統のようです。COFF形式はWindowsやUNIX(旧形式)で使われているので,詳細は検索して見てください。wikiにCOFFの解説があります。そのリンク先に詳細もあります。ただしCOFFにもXCOFF,ECOFFなど各種の拡張があり,具体的なフォーマットは現物を調査中です。調査状況については「COFF調査」の項を参照してください。
RL78をPM+で開発する方法(挫折中)】 2012/2/11 更新
@ビルド方法
 CubeSuite+添付のRL78用デバイス・ファイルに以下の修正をして,PM+でデバイスファイル登録したらビルドまでは出来ました。
 (1)ファイル名変更:R5を消して,拡張子を78Kに変更(例:DR5F100EH.DVF → DF100EH.78K)
 (2)ファイルの11バイト目から25バイトを書き換える:(”(C) 2011 Renesas\0\0\0\0\0\0\0\0\0” → ” (C) NEC Corporation 2006”注:先頭スペースあり)
 (3)ファイルの37バイト目の0Chを0Bhに書き換える。
Aデバッグ方法
 デバッガ(V3.61)を起動してokボタンを押すと「デバイス・ファイルのオンチップデバッグ情報に未サポート情報が含まれています。」と出て,起動しません。
 デバイス・ファイルを解析して,”QB”,”OD”の情報を78K0Rのデバイス・ファイルからコピーしてみたのですが,依然として「未サポート情報が含まれています」が出て起動しません。デバイス・ファイルの内容については「デバイス・ファイル調査」の項を参照して下さい。
 ・RL78−MINICUBE2接続図(PDF) (実際の動作確認には,RL78/G13 STICK(スタータキット)を使用)
 

 


●CC-RLコンパイラ (CS+ for CC統合環境含む)

CS+ for CA, CC78K0Rとの違い】 2017/8/15 追加
 CAで十分と思ってCCへ移行する気は無かったのですが、RH850やRXの新規開発が来るようになって、ツールをCCに統一せざるを得なくなりました。逆に言えばRL78しか使わない人は、無理に乗り換える必要は無いと思います。特にライブラリサイズが大きくなって、printfを使うと5.3Kバイト増加、math.hを使うと2.3Kバイト増加します。64Kバイト制限のある評価版を使っている人にはかなり痛いかもしれません。

(1)オプション設定の違い
項目 CS+ for CA CS+ for CC
変数の最大サイズ (64k固定で設定は無かったような?) コンパイラ・オプション→C言語→「変数の最大を0xffffにする」
これを「はい」にしないと, ROMに格納するconst変数が32Kバイト未満に制限されます。
まぁ、漢字フォントのような巨大なテーブルを使わない人には関係ないですが。
char型 デフォルトは、signed char コンパイラ・オプション→出力コード→「char型の符号」
デフォルトはunsigned charです。if (x < 0)のようにマイナスの数値を前提としたソースを書いている場合は変更が必要です。
int拡張 デフォルトは、int拡張しない 設定は見当たりません(見落としているのかも)
C言語の規格どおりint拡張します。タイミング・クリティカルな部分でchar演算多用している場合は問題ないか確認が必要と思います。
printf デフォルトは、float非対応 デフォルトは、float対応。
非対応にする設定はオプションでは無く、ソース記述でstdio.hをインクルードする前に__PRINTF_TINY__をdefineします。

(2)ソース記述の違い
項目 CC78K0R CC-RL
boolean変数 1bit単位で領域確保 _Bool変数(0,1のみの値を保持)は、1バイトの領域を確保。
1bit単位で割り当てたかったら、ビット・フィールド構造体を用います。
double変数
double関数
float(32bit)と同じ。 double変数は、64bitの領域確保。
double関数(例えばsin)とfloat関数(例えばsinf)でオブジェクト・サイズの差異がありませんでした。float演算精度はCC78K0Rのライブラリより良くなっているので、もしかしたらfloat関数も内部的にはdoubleを呼んでいるかも?
__sreg変数 147バイトに制限。
残りはコンパイラ予約領域。
修飾子が__saddrに変更されました。192バイト全部を使えます(フラッシュライブラリ使用時を除く)。
long long変数 非対応。 対応。
SFR(周辺機能レジスタ) #pragma SFRにより使用可能。
ビット指定は、あたかも構造体のごとく、SFR名.1のように記述できました。
SFR名を定義したiodefine.hをインクルードします。
SFR名は構造体のようなアクセスはできず、「SFR名_bit」という構造体が別に定義されています。ビットのメンバ名もno0〜no7となった。つまり従来記述の「.」を「_bit.no」で置き換える必要があります。
組み込み関数 HALT, DI, EIなどは#pragma指示が必要 宣言無しに使用できます。名前は__halt, __DI, __EIのように変更されています。
関数ポインタへの__far修飾子 __far(* のような形式。
(__far * と書くとエラーになります。
(__far *のような形式。たぶん言語的にはこちらが正しいように思えます。
__far(*記述だと、戻り値に__far修飾されたとみなされ、「戻り値に__far修飾するのは無意味」(だったかな?)というようなワーニングがでます。
return文 1つでも「return 戻り値;」が記述してあれば、他に「return;」のみの記述があってもワーニングすら出ません。 左記は改 善されました。しかし条件文の中だけに「return 戻り値;」が現れないとなると、必ずそれが実行されるとしても「return 戻り値」が無いというメッセージが出ます。この場合、break文で抜けてからreturn 戻り値;を記述すればよいです。
セクション指示 @@CONSTL のような書き方。 const, data, bssのような書き方。__far修飾の付いた変数定義があると「セクション名_f」のようにセクション名が自動的に分けられます。
C言語内でのアセンブラ記述 挿入位置に記述 関数形式であらかじめ記述が必要です。
割り込み関数の記述方法 #pragma interrupt INTTM07 BTIMER_INT RB1
__interrupt void BTIMER_INT(void) {
pragmaの書式が異なります。関数に__interruptを付けません。
#pragma interrupt BTIMER_INT(vect=INTTM07, bank=RB1)
void BTIMER_INT(void) {

(3)オブジェクト・サイズへの影響
項目 CC78K0R CC-RL
math.h (数学関数) 約4.6Kバイト(floatのみ) 約7Kバイト(double対応)。2.4Kバイト増加。double関数を使わずfloat関数のみ使用しても同じ。
stdio.h (printf等) 約5.3Kバイト(float対応) 約10.5Kバイト(double, long long対応)。5.2Kバイト増加。double, long long使わなくても同じ。

 


●gcc(GNURL78コンパイラ)、e2stdio統合環境 2018/2/12 追加

CC-RLとの違い
 CC-RLの評価版はオブジェクト・コードに64Kバイト制限が付きますが、GNURL78には制限がありません。60日ごとにマシンを変えればCC-RLでも無制限に使い続けられますが、そんなにマシンが余るぐらいのお金があるなら、素直にアニュアル・ライセンス(チップ1ストップで42,500円)を買ったほうが良いでしょう。
 1台のマシンで無償ツールを使いたいとなるとGNURL78を使うことになるのですが、CC-RLに比べると敷居が高いので、下記に該当する方以外はまだCC-RLを使うことをお勧めします。
 ・オブジェクト・サイズがどうしても64Kバイトに収まらない、かつ
 ・マシン交換も、アニュアル・ライセンス購入もできない、かつ
 ・RL78以外は眼中にない(PIC16〜32 ,AVRやATSAMに乗り換えできない)、かつ
 ・gccに抵抗がない(親切な日本語マニュアルが無いことも含め)
 
インストール方法
 GNU toolchainもe2studioもあっさりとインストールできました。以下、GNU toolchainをe2studioとは別にインストールする手順を示します(e2studioインストール画面に最新のGNUツールが表示されなかったため)。

[GNURL78インストール]
(1)https://gcc-renesas.com/ja/
(2)登録を行う
(3)メールがくる→そこに示されたURLをクリックすると登録情報とともにActivation Codeが送られてくる
(3)ログインして「製品→RL78→Toolchaiのダウンロード→最新版」でWindows用をダウンロード
  私はGCC for Renesas 4.9.2.201703-GNURL78 Windows Toolchain (ELF)をダウンロードしました。
(4)ダウンロードファイルを実行。途中でメールアドレスとAuthentic(Activation)コードを入力し、インストール
 
[e2studioインストール]
(1)https://www.renesas.com/ja-jp/products/software-tools/tools/ide/e2studio.html#build
(2)e2studioをダウンロード
(3)インストール。なおインストールフォルダに空白を含むことができないので"program files"はインストール先に選べません。
 追加ソフトの設定画面で、チェックをすべて外しました。GCCも表示されたのですが、最新版は表示されていませんでした。
(4)インストール後の起動時に、ツールチェイン登録画面が表示され、そこにインストール済みのGCC for Renesas 4.9.2.201703が表示されたので選択

[プロジェクト新規作成]
i)Create a new C/C++ project
ii)GCC for Renesas RL78 C/C++ Executable project
iii)プロジェクト名選択
iv)デバイス選択(例えば R5F100LG(64pin,128KB))、ハードデバッグ(E1/E20)選択、CかC++選択(私はC選択)。
これでgenerateフォルダの下にスタートアップ等のモジュールと、srcフォルダの下にmainが生成されます。
 
使いこなし
 いずれは系統だって書きたいと思いますが、まずはわかったことをづらづらと書きます。対象はe2studio 6.2.0およびgcc 4.9.2.201703の組み合わせ。
 
■char(デフォルトは符号無し)を符号付に変えるには、
 (プロジェクト右クリック)プロパティ→C/C++ビルド→設定→ツール設定タブ→compiler→souce→user defined compiler options で、追加アイコンをクリックし、-fsigned-charを記入

■double(デフォルトは64bit)を32bitに変えるには、
 (プロジェクト右クリック)プロパティ→C/C++ビルド→設定→ツール設定タブ→compiler→souce→user defined compiler options で、追加アイコンをクリックし、-m32bit-doublesを記入
 マニュアルには、32bitがデフォルトと書かれていて、64bitにするには-m64bit-doublesオプションが必要なはずですが、
 mapでメモリサイズを確認したところ、デフォルトで64bit(8バイト)の領域が確保されていました。私は念のため-m64bit-doublesをつけてます。

■const変数(定数)がミラー領域を超えたらエラーにするには、(デフォルトではエラーにならない)
 左画面 generate/linker_script.ldをクリック→中央下の3つのタブのうち「linker_script.ld」タブをクリック→.rodataのところに下記のようにASSERT文を追加
  .rodata MAX(., 0x3000):
 {
 . = ALIGN(2);
 *(.rodata)
 *(.rodata.*)
 _erodata = .;
 ASSERT((_erodata < (_data - 0x0EFFFF)), "Error: Too much data - no room left for the const data");
 } > ROM
 そもそもスクリプトの並びがconstをミラー領域に優先的に配置するようになっていません。スクリプトの順序変更については後日検討します。

■__far const変数をconst変数(ミラー領域)とは別の場所に配置するには、
これはサポートから回答もらいましたm(_ _)m。
(1)(プロジェクト右クリック)プロパティ→C/C++ビルド→設定→ツール設定タブ→optimization→「Data sections (-fdata-sections) 」のチェックを外す
(2)左画面 generate/linker_script.ldをクリック→中央下の3つのタブのうち「linker_script.ld」タブをクリック→.frodataのところを下記のように記載
 .frodata :
 {
 . = ALIGN(2);
 *(.frodata)
 *(.frodata.*)
 _efrodata = .;
 } > ROM

■オプションバイト、セキュリティIDの記述は、
 generate/vects.cの最初のほうに書いてあります。

■割り込みの記述は、
 generate/vects.cにベクタアドレス、generate/interrupt_handlers.hに関数プロトタイプ、generate/inthandler.cに関数本体(中身は空)が書かれています。

■最適化(デフォルトではしない)を変更するには、
 (プロジェクト右クリック)プロパティ→C/C++ビルド→設定→ツール設定タブ→optimization→optimization leveを少なくとも-o1以上に設定(推奨設定後述)

 この設定をせずにデフォルトのままにしておくと、とんでもなく凶悪なコードが出力されます。
 例えば割り込み処理で、void INT_P1 (void) { P1_bit.no0 = 1;}と書いた場合、デフォルトでは、
   バンクRB0へ切り替え
   RB0のレジスタペア4つ退避
   バンクRB1へ切り替え
   RB1のレジスタペア2つ退避
   バンクRB0へ切り替え
   P1のアドレス(定数)→r8(saddr変数)→axレジスタ→r10(saddr変数)→hlレジスタ と無駄に転送する
   P1.0に1を設定(P1をhlレジスタで指定)
   バンクRB1へ切り替え
   RB1のレジスタペア2つ復旧
   バンクRB0へ切り替え
   RB0のレジスタペア4つ復旧
   リターン
 と36バイトものコードが出てきます。optimizeを-o1以上(どれでも)にすると、
   バンクRB0へ切り替え
   RB0のレジスタペア4つ退避
   P1.0に1を設定(P1を直接指定)
   バンクRB0へ切り替え
   RB0のレジスタペア4つ復旧
   リターン
 と15バイトになります。まぁCC-RLの7バイトに比べれば劣りますが、CC78K0Rよりはましなコードになります。
 RB0の退避/復旧をなくす方法については調査中です。マニュアル読むと下記のようにnaked指定すれば無くなるような気がしましたが、
   void INT_P1(void) __attribute__ ((interrupt("naked")));
 コンパイルエラーは出無いものの出力オブジェクトは、依然としてRB0の退避復旧が行われます。
 ま、割り込みだけならアセンブラで書けばよいんですけどね、関数とか全般に影響してそうで怖いです(CC78K0Rも無駄な退避が頻発していました)。

 optimizeの推奨設定は、GNURL78インストールフォルダ¥doc¥optimization_in_GCC.htmlに記載があります。それによると、
  (1)optimization levelとして -o2を選択
  (2)user defined options に -ftree-loop-distribute-patterns と -mmul=g13(RL78/G13の場合) を追加
 とすれば良いようです。ただしこのファイルの日付が2016/12/20と古いので、現在のバージョンでも有効かどうかは不明です。

■レジスタ・バンクが使えない(開放されて無い)
 レジスタ・バンクRB0〜2は、コンパイラが通常ルーチン用に使うようです。RB3は割り込みに使うようです(ただし出力コード見た感じではRB3を使ってないような?)。
 RB1-2の各レジスタにはr8〜r23の名前をつけて、ショートアドレス変数(CC-RLで言う__saddr変数)としてアクセスしています。
 それなら、CC78K0Rのようにレジスタ・バンク外のショートアドレス空間を使ってほしいところですが、割り込み処理でレジスタ退避するときに、バンク切り替えでレジスタをpushしていました。つまり、通常のショートアドレス空間の変数であればいったんAXに読み込んでpushしなければならないのですが(CC78K0Rはそうしている)、レジスタバンク領域なら、バンク切り替えだけで各レジスタをpushできます。
 コンパイラとしてショートアドレス空間にワークを置く方法とワーク無しで少ないレジスタをやりくりする方法とどっちが得かという問題ですが、CC-RLの効率が勝っていることを考えるとワーク無し(スタック使うとか)にしてレジスタ・バンクは解放してほしいですね。

■配列が32Kバイトまでしか定義できない
 CC-RLもデフォルトは32Kバイトまでで、オプションで64Kバイトまで可能になります。gccにもそのようなオプションが無いかざっと探してみましたが見つかりませんでした。とりあえずは配列を分割して配置するしかなさそうですね。
 
objdump補足
大きな声では言えないですが(いや別に言っても問題ないと思いますが)、同梱のobjdumpはCC-RLの出力ファイルも覗けます。

■格納場所
 標準では「C:\Program Files (x86)\GCC for Renesas RL78 4.9.2.201703-GNURL78-ELF\rl78-elf\rl78-elf\rl78-elf\bin」の下にあります。
■ディスアセンブルの使用例
 objdump -d C:\xxxxxxxxx\project_name.abs > C:\xxxxxxxxx\project_name.txt
■ディスアセンブルの注意点
 本質的な制約なのか、このバージョンだけの制約なのか分かりませんが、ラベル手前の00がnopとして認識されません。ラベル直前以外ならちゃんとnopが表示されます。
 解析例:
 00004877 <_exsample_label_1>:
 4877: fb 80 f8 movw hl, !ff880
 ...          →実はここにnop(0x00)があるが、ラベルの手前は無効データ扱い
 0000487b <_exsample_label_2>:
 487b: 89 mov a, [de]
 

 


●Cコンパイラ(CC78K0R,CA78K0Rコンパイラ部)

関数へのポインタ変数】 2011/03/23 追加
 関数へのポインタ変数は,領域としては4バイトとられますが,格納は3バイトのみです。つまり1バイトは無駄になるわけです。
 プログラム内ではいったんlong型にキャストして,最上位バイトを書き換えれば使えますが,変数初期化ではコンパイラ内部エラーのため最上位バイトを初期化できません。ただしバージョン2.12特有かもしれませんので,将来のバージョンでは出来るようになるかも知れません。
  例
extern void funct(void);
typedef void __far (*FUNC)(void);
FUNC table1[ ] = { /*1要素4バイトの領域が確保されます*/
   funct,    /*許される*/
   0xff0000,  /*許される(アドレスとしては20ビットまで有効ですが,3バイトの値まで格納されます) */
   0x1ff0000, /*上位の値が失われるというワーニングがでます。実際3バイトのみが格納されます */
   funct + 2,  /*許され無い*/
   };
long table2[ ] = { 
   funct,    /*キャストしなくても許されます(ワーニングも出ません)*/
   (long)funct, /*許される*/
   (long)funct + 2, /*インターナル・エラーがでます。将来のバージョンでは許される可能性はあります。 */
   };

void main(void) {
   table2[2] = (long)funct + 0x10000000; /*プログラム内ではインターナル・エラーは出ません*/

   ((long *)table1)[1] = 0x10000000;    /*最上位バイトに値を格納できます*/
   table1[1] = funct;     /*下位3バイトしか格納されないので,最上位の0x10はそのまま残ります(規格外動作)*/
   table1[1]();         /*下位3バイトしか使われないので,4バイト目が0でなくても正常に動作します(規格外動作)。*/
}
注意:規格外動作をあてにした記述は,当然移植性を悪くします(特に最上位バイトの保存)。
注意:デフォルトは「int拡張しない」】 2012/5/13更新
 デフォルトのコンパイラオプションではchar変数などの演算においてC言語で定められているint拡張(charをintに拡張して演算する)をしません。78K0R,RL78は元々8ビットマイコンをベースにしたもので,8ビット演算命令の方が豊富にあります。したがって確かにコードサイズ,速度ともその方が有利なのですが,これに合わせて標準的にintを使うべきところをunsigned char(無符号の方がさらに速く,サイズが小さい),charを多用すると移植性の悪いプログラムになります。
 本格的な16ビットマイコン,32ビットマイコンに移植すると,単に効率が落ちるだけではなく,演算結果が変わって重大なトラブルに至ることも多々あるため,78K系と心中するつもりの人以外は「int拡張しない」のチェックを外しておくのが良いでしょう。
 差異のある例@
  unsigned char a = 0, b = 0x80;
  if (a - b > 200) 処理P;   規格上a-bは0xff80だが, int拡張しない場合a-bは0x80となって判定結果が異なる。
 差異のある例A
  unsigned char a = 0x40;
  if (a << 2) 処理P;   規格上a<<2は0x100だが, int拡張しない場合a<<2は0となって判定結果が異なる。
 差異のある例B
  unsigned char a = 0xff;
  if (~a) 処理P;   規格上~aは0xff00だが, int拡張しない場合aは0となって判定結果が異なる。
オプション設定は,「最適化」の中にあります。「機能拡張」の中の”ANSI準拠”を選択しても規格準拠のint拡張は行われません(これは欠陥だと思うが?)。PM+なら「最適化」→”グループ”のプルダウン→”char型処理”で符号拡張せずのチェックボックスを外します。CubeSuite+なら「最適化」→「最適化を行う」で”はい(詳細設定)”を選び,”符号拡張しない”を”いいえ”にします。
割り込み高速化】 2010/12/18追加
 C言語(CC78K0R)で割り込みを記述すると極端に遅くなる場合があります。
・理由:CC78K0Rのランタイムライブラリ等が固定の予約領域を使うため,割り込み中でその領域を保護するために退避/復旧を行います。例えば関数呼び出しするだけでも100クロック程度のオーバーヘッドが出ます。
・対策:明示的な関数呼び出しは”使わない”ように気をつけることが出来ますが,int乗算などのランタイム関数はオブジェクトで確認しない限り分かりません。高速応答や割り込み時間最小化を行いたい場合はオブジェクトを確認するか,アセンブラがかける人は最初からアセンブラで書いてしまうのが良いでしょう。
int乗算の速度】 2010/11/25追加
 78K0Rでは16ビット乗算器を周辺回路で実装しています。命令で実装しているマイコンに比べるとオーバーヘッドがかなり大きいです。intの乗算の場合だと,
   @PSW退避。1クロック・・・後でIEフラグを復帰するのに必要
   A割り込み禁止。4クロック・・・乗算回路を割り込みで使用されるのを防ぐ
   Bデータを乗算回路に転送。2クロック・・・オペランド2つ
   C乗算
   D結果を乗算回路から転送。1クロック・・・結果は32ビットですがC言語では下16ビットのみ転送なので1回。
   EPSW復帰。3クロック・・・乗算前の割り込み許可/禁止状態の復帰
 これだけでも計11クロックのオーバーヘッドです。オペランドの片方が同じ乗算を繰り返す場合も,割り込みによって書き換えられる可能性があるので毎回転送します。さらにCC78K0Rでは,上記をランタイム関数として実装しているため,CALL/RETによるオーバーヘッド9クロック,変数受け渡し(コンパイラ予約領域@RTARG0使用)のオーバーヘッド2クロックがあるため,合計22クロックのオーバーヘッドが出ます。
C言語スタートアップ・ルーチン】 2012/7/8 更新
スタートアップ・ルーチンのソースはインストールしたフォルダの下の方にあります
 PM+:CC78K0R\バージョン\src\78k0r\src\cstart.asm
 CubeSuite+:CA78K0R\バージョン\Src\cc78k0r\src\cstart.asm
主な仕事は,次のとおりです。
(1)スタック設定,hdwinit関数呼び出し(ハードウエア初期化)
(2)C言語ライブラリで使う変数領域の初期化
(3)静的変数の初期化
(4)main呼び出し
(5)exit呼び出し
この中で変更した方が良さそうなのは,exit関連と,malloc関連でしょう。
 ・exit関連:exit関数はmainプログラム終了時に実行する関数で,具体的作業はatexit関数で
  登録する必要があります。この登録のために130バイトのRAM領域を取っています。
  K0Rクラスのマイコンではちょっともったいない気がします。まぁ,RAMが足りていれば変更
  の必要はありません。
 ・malloc関連:malloc,callocなど動的に変数を割りつける関数を使用するには,その割付領域が
  必要になります。デフォルトは32バイトのようです。
  使わないときはもったいないし,本格的に使う場合は32じゃ到底足りないと思います。
スタートアップ・ルーチンのソースを変更した場合は,変更のためのバッチファイルを走らせろとマニュアルに書いてあります。それが面倒な場合は,そのソースをビルド対象に加えてもよいですが,最初にリンクしないと不具合がでるので,ソースの登録順序を1番最初にします(順序変更方法は【ソースの登録順序変更】参照)。
  スモール・モデル専用のスタートアップ・ルーチン参考例(exit関連削除版)(アセンブラ・ソース →アップデート版はRL78ドライバ・キットに同梱
最適化オプション
 デフォルトのオプション指定だと最適化レベルが低いため,コードサイズが数+%〜100%も増えます。コード・サイズを減らしたい場合は,コンパイラ・オプションの最適化≫推奨統合オプションで”サイズ優先”を選ぶのが簡単です。ただし,これを選ぶと,最適化≫char型処理,自動割当の”□charに関する演算を符号拡張せずに行う”に自動的にチェックが付きます。このチェックを外す場合は”サイズ優先”を選んだ後で外します。もっともコード・サイズや性能から考えるとチェックが付いている方が良いです。もし78K系と心中しても良いという人は,チェックは付いたままにしておいても良いでしょう(ドライバ・キットは標準的なC言語を解説しているためチェックを外しています)。
出力セクション名
 C言語記述に対するデフォルト出力セクション名については普通は気にする必要はありませんが,配置を指定したいとか確認したい場合には必要になります。CC78K0Rヘルプを読めば分かる内容ですが,簡単にまとめておきます。以下,メモリ・モデルがスモール(すなわちコード,データともに__near修飾省略)の場合の例です。
場所 記述例 出力セクション (メモリ・モデルがスモールの場合)




int c1; @@DATA (F1000H以上のRAMに配置)。
int c2 = 10; 変数は@@INIT(F1000H以上のRAMに配置),初期値は@@R_INIT (任意のROM上)
__far int c3; @@DATAL (任意のRAM上)。外部RAM(または周辺)配置に使用する。
__far int c4 = 10; 変数は@@INITL (任意のRAM上),初期値は@@RLINIT(任意のROM上)。外部RAM(または周辺)配置に使用する。
__sreg int c5; @@DATS(FFE20H以上のRAMに配置)。
__sreg int c6 = 10; 変数は@@INIS (FFE20H以上のRAMに配置),初期値は@@R_INIS(任意のROM上)。
const int c7; @@CNST (ミラー領域に配置)。定数0を定義していることになる。
const int c8 = 10; @@CNST (ミラー領域に配置)。
__far const int c9; @@CNSTL(任意のROM上)。定数0を定義していることになる。
__far const int c10 = 10; @@CNSTL(任意のROM上)。
boolean b; @@BITS(FFE20H以上のRAMに配置)。

int funct(int c) { } @@CODE(10000H未満に配置)。
int __far funcf(int c) { } @@CODEL(任意のROM上)。




int c; セクション無し(スタックに配置)。
int c = 10; 変数はセクション無し(スタックに配置),初期値はコードとして埋め込まれるか@@CNST (ミラー領域に配置)。
"文字列リテラル" @@CNST (ミラー領域に配置)。

Cソース中のアセンブラ記述
 #asm〜#endasmの間にアセンブラ記述を埋め込めますが,ラベルをたくさん使うとシンボル・テーブルが崩れてエラーになってしまう不具合があります( W2.12ではまだ試していませんが以前のバージョンで発生)。W2.12でも起きるようなら回避方法を検討しようかなぁ。
 また残念なことに78K0でサポートしていた #pragma realregister が無くなったので,#defineマクロ変数をレジスタに直接渡すことが困難になりました。ポートなどのSFR変数名をリネームしてレジスタAに直接引き渡すのに重宝したんですがねぇ。まぁ,コンパイラ上でレジスタAがどのように使われているか分からない状況では使えない機能だった(つまりコンパイラの挙動を知っていて,ここでなら使えると分かっている場合だけ使えた)ので,使う人はほとんど居なかったのかも知れません。
他コンパイラとの比較(雑談)】 2017/10/30 更新
 CC-RLコンパイラが登場したとき(2015年ごろか)、「処理能力が従来比3倍」とか言ってました。まぁこれは「やっと他コンパイラ並みになりました。従来のCC78K0Rコンパイラは、まっとうなコンパイラの1/3ぐらいの性能しかでなくてごめんなさい」と言ってるのと同じようなもんです。3倍という数値を自分で検証したわけではないですが、過去アセンブラに書き換えて2〜3倍の性能が出たことはよくあったので、妥当な感じはします。ちなみにDhrystone MIPS値は、IARがCC78K0Rの2倍くらいだったと記憶しています。
 出力コードを見た感じでは、もともと8ビット用のCC78K0コンパイラをほんのちょっと手直しした程度の感じでした。せっかく78K0Rで追加されたスタック相対アクセスなどを有効活用されてなかったですね。元のCC78K0コンパイラ自体、無駄なレジスタ退避してたり、出来がいいようには見えませんでしたし。まぁ78K0から乗り換えた私にしてみれば、同一クロックで4倍くらいの性能が出るんだから、それで十分でした。
 性能はあったに越したこと無いですが、仕事でも4MHz〜12MHz程度のクロックで間に合うことが多いので、高速化よりは64KB以上の無償化を期待したいところです。今のところマイクロチップのXCコンパイラでは日本語文字列が使えない(エスケープシーケンスで、バイト単位での文字コード打ち込みが必要)らしいので乗換えを躊躇していますが、PIC32MMの256KB品がRL78 64KB品より安いのを考えると、プリコンパイラを自分で作ってでも乗り換えしなきゃいかんかなぁと考える今日この頃です。(RL78用のリンカを自作するより、日本語コードを分解するほうが楽なので)

[以下2011年頃の記事]
 噂によるとIARコンパイラの生成コードはCC78K0Rより,サイズ,速度とも格段に良いらしいですね。もっとも値段も格段に高いらしいので,趣味で使う人にとっては比較対象外ですね。
 RL78のニュースリリースに性能が41DMIPSと書かれてます。1MHz換算で約1.28DMIPSです。Dhrystone MIPSは,”コンパイラの性能”も含めて評価している値なので,当然どのコンパイラ使ったかが重要なポイントになりますが明記されていません。上記の観点からすると,きっと高価なIARコンパイラ使っているんでしょうね。フリーツールでその性能を出すには,アセンブラで書くしかないかな?
ポインタに対する__far,const修飾
 ポインタ変数に__far, constを付ける場合は,ポインタ自体の位置に対する修飾なのか,ポインタが指し示しているアドレスに対する修飾なのか,こんがらがることがあります。まぁ,ちゃんと右から順に追っていけば分かることですが,プログラムって普通は左からコーディングしたり読んだりするので,引っかかりやすいです。ってことで表を作ってみました。
記述 (メモリ・モデル=スモール時) ポインタ自身の場所 指し示している場所
RAM (near) ミラー領域 ROM(far) RAM(far) RAM (near) ミラー領域 ROM(far) RAM(far)
    int*     c;          
  const int*     c;          
    int*   const c;          
  const int*   const c;          
__far   int*     c;      
    int* __far   c;          
__far   int* __far   c;      
__far const int*     c;      
  const int* __far   c;          
__far const int* __far   c;      
__far   int*   const c;      
    int* __far const c;          
__far   int* __far const c;      
__far const int*   const c;      
  const int* __far const c;          
__far const int* __far const c;      
◎:代入,参照とも可。○:参照のみ可。代入記述がエラーになる。△:参照のみ可。代入記述がエラーにならない。・:farに包含される。
RAM(near):内蔵RAM(F1000H以上のRAM), ミラー領域:F1000H以上に写像されるROM(実体は10000H未満に配置),
ROM(far):ROM領域全域, RAM (far):外部バス接続のRAMや周辺LSIの操作に使う。

 


●アセンブラ,リンカ(RA78K0R,CA78K0Rアセンブラ・リンカ部)

C言語インタフェース】 2011/04/11 追加
 CC78K0Rヘルプにも記載がありますが,ここにも簡単に書いておきます。
 まずC言語から呼び出されるアセンブラ関数については,次のように書きます。
  public _C言語関数名   ・・・・C言語から呼び出される関数名の手前に_(アンダーバー)を付けます
  extrn _C言語変数名   ・・・・C言語で定義した1バイト以上の型を参照する場合
  extbit _C言語変数名   ・・・・C言語で定義した1ビット型を参照する場合
  public _ラベル名など   ・・・・DSEG,CSEGで定義したラベルやEQU,SETで定義した名称を
                     C言語で参照(extern宣言)する場合に記述します。
  cseg
_C言語関数名:
  この位置において,汎用レジスタおよびスタックは次のようになっています。
  AX ・・・C言語関数に4バイト以下の第1引数があれば下位2バイトが格納されます。
       1バイト型引数はint拡張されてAXに格納されます。保存不要(破壊可能)です。
  BC ・・・C言語関数の第1引数が4バイト型ならば上位が格納されています。保存不要です。
  DE ・・・不定。保存不要です。
  HL ・・・保存する必要があります(HLを使いたいときはPUSHして保存し,最後にPOPします)。

  [SP+4]〜 第2引数(ただし第1引数が5バイト以上の場合はここが第1引数になります)
  [SP+2]〜 戻りアドレス(上位)
  [SP+0]〜 戻りアドレス(下位)

  スタックに積んである引数をアクセスする方法として,次の方法があります。
   (1)sp間接命令(オペランドに[sp + #byte]を記述する命令)でアクセス。
    MOV, MOVW命令しかありませんが,汎用レジスタをつぶさないので効率よく処理できる場合があります。
    ただしプログラム中でPUSH/POPを使用すると,その都度引数のオフセット位置が変わるので管理が大変です。
  (2)spをDEへコピーして(MOVW DE, SP),DE間接命令でアクセス。
    DEレジスタが占有されますが,PUSH/POPを使っても引数のオフセット位置は変わりません。
    また,MOV,MOVWだけでなくXCH命令も使えます。[DE+#byte]だけでなく[DE]も使えるため,
    第2引数のオフセット位置をあらかじめ加算しておけば,第2引数が1バイトでアクセスできます。
  (3)まずHLを保存(PUSH)し,spをHLへコピーしてHL間接命令でアクセス。
    HL間接命令の種類が多いため,複雑な処理をする場合はこの方法が一番効率よくなります。
    スタックの位置関係は次のようになります。
    [SP+6]〜 第2引数(第1引数がレジスタ格納の場合)
    [SP+4]〜 戻りアドレス(上位)
    [SP+2]〜 戻りアドレス(下位)
    [SP+0]〜 HL保存値
  (4)HLだけでなく第1引数もスタックへ保存する場合やスタックに自動変数領域を取る場合は,
    さらにスタックが深くなります。
  
  最後にRETする前にC関数への戻り値を格納します(戻り値がある場合)。
  CY ・・・ 戻り値が1ビット型の場合に格納します。なければ不定で良いです。
  AX ・・・ 不定で良いです。
  BC ・・・ 戻り値が1バイト型以上なら下位2バイトを格納します(1バイト型はint拡張して格納)。なければ不定で良いです。
  DE ・・・ 戻り値が4バイト型なら上位2バイトを格納します。なければ不定で良いです。
  HL ・・・ 元の値に戻しておく必要があります。


 次にC言語関数を呼び出すアセンブラ記述は,次のとおりです。
 @ extrn _C言語関数名   ・・・・呼び出すC言語関数名の手前に_(アンダーバー)を付けます。
 A AX,BC,DEの内容が破壊されると困る場合は保存(PUSH)します。
 B スタックに引数をPUSHします(引数が2つ以上の場合および第1引数が5バイト以上の場合)。
    積む引数が2つ以上ある場合は,最後の引数から順にPUSHします。
 C 第1引数をAXまたはAX(下位),BC(上位)に格納します(4バイト以下の第1引数がある場合)。
 D CALL !_C言語関数名 または CALL !!_C言語関数名(__far配置関数の場合)
 E スタック位置を元に戻します(引数をスタックに積んだ場合)。
    POP AX       ・・・ 引数を2バイトしか積んでない場合
    ADDW SP, #byte ・・・ 引数を4バイト以上積んでいる場合
 F 戻り値がある場合は,BCまたはBC(下位),DE(上位)を参照します。
 G AX,BC,DEの内容をAで保存している場合は復旧(POP)します。
小技】 2011/04/11 追加
78K0互換マクロ・オプション
 78K0用アセンブラ・ソースをそのまま使用したい場合には,アセンブラ・オプションの中の”□78K0互換マクロ”をチェックします。これをチェックすると,RA78K0Rがインストールされているフォルダの/inc78k0r/compati.incがインクルードされます。完全な機能互換性を保ちたければそのまま使いますが,速度と効率を優先するためには,DBNZ命令の変換マクロを次のように書き換えると良いでしょう。
DBNZ    macro para1,para2
    DEC    para1
    BNZ    para2
endm
 この場合ステータス・フラグ(Z, AC)が変化してしまいます。本来のDBNZ命令ではフラグは変化しないので,もしその性質を使ってプログラムを書いている場合は,このような書き換えはできません。
 また,ROR4命令など,長いプログラムに変換される命令を多用している場合は,サブルーチンcallに変更した方が良いでしょう。
SFRがSADDRに変更されてしまう
 オペランドにSFR名を記述してもSADDR空間内であれば(主にポート・レジスタが対象),SADDR記述命令に自動的に置き換えられてしまいます。例えば,
  MOV A, P0      ;オブジェクト 8E 00(本来の定義)
  MOV A, 0ff00h ;オブジェクト 8D 00
になるはずですが, MOV A, P0もオブジェクトが8D 00になってしまいます。78K0の場合はclr1,set1命令のように実行クロック数の少ない場合があるSADDRへの置換えが有効だったのですが, 78K0Rでは動作クロック数は同じなので意味がありません。素直に8Eを出せば良いと思いますがねぇ。add命令のようにsaddrは指定可能だがsfrは指定できない場合もあるので,共通的に扱いたかったのですかね。
SFR名が定義されてないSFR空間を指定する方法
 非常に希なケースだと思いますが,レジスタが存在しているけどSFR名が定義されてないアドレスを指定する場合は,必ず20ビットアドレスで指定します(バージョン1.33)。
  MOV A, 0FFFF9H  ; オブジェクト 8E F9
  MOV A, 0FFF9H    ; →SADDR範囲オーバーのエラーが出る。
ちなみにSADDR空間は,16ビット指定でも20ビット指定でも同じ結果になります(バージョン1.33)。
  MOV A, 0FFE20H  ; オブジェクト 8D 20
  MOV A, 0FE20H    ; オブジェクト 8D 20
そもそも16ビットで指定できることが変なんですが,78K0とのソース互換性のためにはやむを得ない措置なんでしょう。

 


●ハードウエア(78K0R, RL78)

ボーレート設定の落とし穴2018/4/9 追加
 ボーレート設定用のSDRレジスタは2以上の値を設定できます。ところが設定値2(分周比3)の場合、自分のボーレート誤差が0であっても相手のボーレート誤差が-1.82〜+1.69%(パリティ無し),-1.64〜+1.54%(パリティ有り)以下でないと正常に受信できません。もちろん自分も相手も水晶発振子を使っていて、周波数もきっちりしている場合は何も問題ありません。でも一般的にはそういう限定ができないので、自分の誤差を差し引いて3%以上の余裕が欲しいところです。
 以下SDR設定値と受信許容誤差の代表例示します。設定値で5以上、できれば10以上欲しいところです。
SDR設定値 下限(parity無) 上限(parity無) 下限(parity有) 上限(parity有)
2 -1.82% 1.69% -1.64% 1.54%
3 -2.70% 2.56% -2.44% 2.33%
4 -3.23% 3.09% -2.91% 2.80%
5 -3.57% 3.45% -3.23% 3.13%
6 -3.82% 3.70% -3.45% 3.36%
8 -4.14% 4.05% -3.74% 3.66%
10 -4.35% 4.27% -3.93% 3.86%
12 -4.49% 4.42% -4.06% 4.00%
21 -4.81% 4.76% -4.35% 4.31%
34 -4.98% 4.95% -4.50% 4.48%
 
低電圧メインの落とし穴2018/4/7 追加
 今更ながら気が付いたのですが、RL78の低電圧メインモード(1.6V〜)は低速メインモード(1.8V〜)より消費電流が多いようです。たぶん昇圧回路が動くからでしょう(たぶんフラッシュの動作下限が1.8V)。
 マニュアルの電気特性で、8MHzと4MHzの動作電流が同じなので以前から変だなとは感じていたのですが、HALT電流が4MHzクロックの方が多いことに気が付いて、「こりゃ周波数の違いじゃなくてモードの違いだ」ということに、やっと思い当たりました。確認はしていませんが、低速メインモードで4MHz動作させたら動作電流は1mA(typ.)を切れるんじゃないかと思います。
 低電圧メインは1.6Vから使用可能、低速メインは1.8Vから使用可能とわずかの差しか有りません。しかも消費電流が多いとなると、バッテリ動作ではどちらがいいか微妙な感じです。電池の種類にもよると思いますが、なんか低速メインの方が長持ちするような気がします。
 
データ・フラッシュ2018/2/12 追加
■データ・フラッシュライブラリを使うためにRAMを占有する品種としない品種が有ります(例えばRL78/G13のFLASH64KB品は必要、32KB品は不要)。
 実は容量違いの品種はチップ自体は同じなので、例えば32KB品にもRAMは4KB乗っています。データ・フラッシュ・ライブラリは実搭載RAMの先頭から(G13の64KB以下なら0xFEF00〜)使うため、品種によってはカタログ上存在しないエリアを使っていることになります。
 それでは見えてないRAMをユーザがアクセス可能でしょうか? 残念ながらミラー領域として設定されているので少なくともリードはROM領域しか見えません。ミラー領域を設定する裏設定があるかも知れませんが、私はまだ見つけられて無いです(^^;

■データ・フラッシュ・ライブラリの種類によって、RAMの消費量が異なります。しかしながらCS+のオプション設定(リンク→デバイス)で"セルフRAMへの配置を制限する"を「はい」にしてしまうと1KBが無条件で確保されます。type04ライブラリ(RAM136バイト)を使う場合は「いいえ」にしておいて、リンクディレクティブで制限するか、もしくはスタート・アップで領域を確保します(以下の例)。
 SELFRAM .dseg BSS_AT 0xfef00 ;// セルフRAM予約領域
 .DS 136 ;// Type04用

■なぜライブラリ提供にしているのか
 それはユーザに見せたくない情報が入ってたりするからでしょう(^^; 例えば、フラッシュ制御ファームがカタログ上は存在しないROM領域に入っていたりとか・・・
 
RL78/G2x,F2xのデータ・フラッシュ2024/3/9 追加
CPUコアや周辺は従来の1xシリーズと互換性があると聞いていたのでソースはほとんど変更せずに済むと思っていたのですが、フラッシュに関してはライブラリが刷新されたのでソースを変更する必要があります。
従来はコードフラッシュがFSL Type01、データフラッシュがFDL Type04だったのが、コード/データともG2xはRFD Type01、F2xはRFD Type02になりました。なんか紛らわしいのでType1xとかに名前を変えて欲しかったですね。
具体的にどう変更するかの詳細はこれから見ますが、ざっと見た感じなんかとっても面倒になった気がします。ハードの互換性だけでなくソースの互換性も考慮して欲しかったですね。
 
端子一覧(RL78/G13:44〜128pin)2012/3/4 追加
ドライバ・キットの検討用にエクセルで作りました。~で囲まれた記号は反転を意味します。横方向の同じ色は同じ端子機能です。
(非圧縮エクセル・ファイル)
端子比較 RL78/G13とG23(64pin)2024/3/10 追加
機能欄   ”で囲まれた信号名は反転を意味します。注のついている信号はG23(192KB以上)のみ対応です。
入出力欄 o:G13,G23とも対応、(o):G23(96KB以上)のみ対応、[o]:G23(192KB以上)のみ対応 、6V:6V耐圧、オープンドレインのoはVDD耐圧。
pin G13端子機能 G23追加機能 CMOS入力 プルアップ TTL入力 CMOS出力 オープンドレイン 定電流出力
62 P00/TI00 /TS26注/EI00 o o - o o -
61 P01/TO00 /TS27注/EI01/EO01 o o o o - -
60 P02/ANI17/SO10/TxD1 /TS28注 o o - o o -
59 P03/ANI16/SI10/RxD1/SDA10 /TS29注 o o o o o -
58 P04/~SCK10~/SCL10 o o o o o -
31 P05/TI05/TO05 /TS10 o o - o - -
30 P06/TI06/TO06 /TS11/CLKA0 o o - o - -
46 P10/~SCK00~/SCL00/(TI07)/(TO07) /EI10/EO10 o o o o o -
45 P11/SI00/RxD0/TOOLRxD/SDA00/(TI06)/(TO06) /EI11/EO11 o o o o o -
44 P12/SO00/TxD0/TOOLTxD/(INTP5)/(TI05)/(TO05) /EI12/EO12 o o - o o -
43 P13/TxD2/SO20/(SDAA0)/(TI04)/(TO04) /IVREF1/EO13 o o o o o -
42 P14/RxD2/SI20/SDA20/(SCLA0)/(TI03)/(TO03) /VCOUT1/EO14 o o o o o -
41 P15/~SCK20~/SCL20/(TI02)/(TO02) /EO15 o o o o o -
40 P16/TI01/TO01/INTP5/(SI00)/(RXD0) /EO16/CCD00 o o o o - (o)
39 P17/TI02/TO02/(SO00)/(TXD0) /EO17/CCD01 o o o o o (o)
56 P20/ANI0/AVREFP /EI20 o - - o - -
55 P21/ANI1/AVREFM /EI21 o - - o - -
54 P22/ANI2 /ANO0/TS20注/EI22 o - - o - -
53 P23/ANI3 /ANO1/IVREF0/TS21注/EI23 o - - o - -
52 P24/ANI4 /TS22注 o - - o - -
51 P25/ANI5 /TS23注 o - - o - -
50 P26/ANI6 /TS24注 o - - o - -
49 P27/ANI7 /TS25注 o - - o - -
32 P30/INTP3/RTC1HZ/~SCK11~/SCL11 /VCOUT0/TSCAP/EI30 o o - o - -
21 P31/TI03/TO03/INTP4/(PCLBUZ0) /TS01/EI31 o o - o - -
5 P40/TOOL0 o o - o - -
4 P41/TI07/TO07 /RxDA1 o o (o) o - -
3 P42/TI04/TO04 /TxDA1 o o - o (o) -
2 P43 /CLKA1 o o [o] o [o] -
33 P50/INTP1/SI11/SDA11 /TS00/EI50/EO50/CCD03 o o - o o (o)
34 P51/INTP2/SO11 /EI51/EO51/CCD02 o o - o - (o)
35 P52/(INTP10) o o - o [o] -
36 P53/(INTP11) o o [o] o [o] -
37 P54 o o [o] o [o] -
38 P55/(PCLBUZ1)/(~SCK00~) o o o o o -
17 P60/SCLA0 /EO60/CCD04 o - - - 6V (o)
18 P61/SDAA0 /EO61/CCD05 o - - - 6V (o)
19 P62 /CCD06/SCLA1 o - - - 6V (o)
20 P63 /CCD07/SDAA1 o - - - 6V (o)
29 P70/KR0/~SCK21~/SCL21 /TS02/RIN0 o o - o - -
28 P71/KR1/SI21/SDA21 /TS03/RxDA0 o o (o) o o -
27 P72/KR2/SO21 /TS04/TxDA0 o o - o (o) -
26 P73/KR3/SO01 /TS05 o o - o - -
25 P74/KR4/INTP8/SI01/SDA01 /TS06 o o - o o -
24 P75/KR5/INTP9/~SCK01~/SCL01 /TS07 o o - o - -
23 P76/KR6/INTP10/(RXD2) /TS08 o o - o - -
22 P77/KR7/INTP11/(TXD2) /TS09 o o - o - -
1 P120/ANI19 /IVCMP1/EI120 o o - o (o) -
11 P121/X1 /VBAT/EI121 o (o) - (o) - -
10 P122/X2/EXCLK /EI122 o (o) - (o) - -
8 P123/XT1 o - - - - -
7 P124/XT2/EXCLKS o - - - - -
57 P130 - - - o - -
9 P137/INTP0 /EI137 o - - - - -
64 P140/PCLBUZ0/INTP6 o o - o - -
63 P141/PCLBUZ1/INTP7 o o - o - -
47 P146 o o - o - -
48 P147/ANI18 /IVCMP0/EI147 o o - o - -
6 ~RESET~ o - - - - -
12 REGC - - - - - -
13 VSS - - - - - -
14 EVSS0 - - - - - -
15 VDD - - - - - -
16 EVDD0 - - - - - -
 
78K0R→RL78の違い2011/6/26 更新
やっとで一般公開されたRL78/G12〜G14暫定ユーザーズ・マニュアルおよびソフトマニュアルに基づいた情報です。
  78K0R→RL78差分(桃色は最近の更新情報)
CPUコア G13は78K0Rのまま。ざっと見たところ78K0Rのマニュアルから完全にコピペして作った内容で,78K0からの差分も網掛けのままで表示されています。ソフトマニュアルに,16x16乗算命令が追加されていたので一瞬喜んだのですが,G12,G13の16ビット乗算は従来どおり周辺ハードウエアのままです。G14は16ビット乗算命令があります。
動作周波数 従来20MHz(Hxは24MHz)→32MHzまで上がりました(G13グループ)。1.8V時動作周波数も8MHzにアップ。外部発振周波数だけは20MHzのままです。マニュアル0.01版では「内蔵32MHz発振器の精度が±1%なので,もう外部発振で使う人は少ないっていうことなんでしょうね」と思っていたのですが,0.01版ではTBDになっています。精度が出ないなら外部発振周波数も32MHz対応して欲しいなぁ。
 起動時周波数は,オプションバイトで1MHz〜32MHzまで選択可能です。G12/G13は起動後に変更も可能です。ただし起動時に24MHz,12MHzを選択した場合は24MHzの2分周,それ以外を選択した場合は32MHzの2分周への変更が可能です。
最低動作電圧 従来1.8VでしたがG13は4MHz動作なら1.6Vから動作可能になり,A/Dも1.6Vから使えるようになりました。G12は1.8Vからです。ただし,従来可能であった低電圧低速で起動して,後で高電圧高速動作に変更するいということができなくなったようです。 オプションバイトの「フラッシュ動作モード」で最低動作電圧が1.6V(低電圧モード),1.8V(低速モード),2.4V(高速モード)のいずれかに決まってしまいます。8MHzを超えるクロックに切り替えるためには高速モードをオプションとして設定する必要があります。ただし,この最低動作電圧がMaxクロック周波数における値として書かれているのであれば,高速モード&1MHz起動を設定して動く可能性も残っています。
電源系統 64ピン以上の製品は,VDDとEVDDの電圧が異なっても良いようになりました。EVDD≦VDDの範囲です。VDDの対象は,ポート以外の端子およびP20〜P27,P137,P150〜P156です。EVDDはそれ以外のポートが対象になります。
消費電流 特にLVD(電圧検出)の消費電流が,従来9μA(typ.)→0.08μA(typ.)と激減。これでコイン電池バックアップ中も電圧監視可能になりました。
TAU(16ビット・タイマの集合体) 上位互換のようです。追加機能としてチャネル1, 3の2つは8ビットx2としても使えるようになっています。8ビットx2時は,上位8ビットはインターバル・タイマ用途だけ,下位8ビットはインターバル・タイマ/外部イベントカウンタ/ディレイカウンタを選択できます。ソース・クロック選択はチャネル1,3のみ4種類選べます。他のチャネルは従来どおり2種類だけです。
非同期タイマ 新たに12ビット・インターバル・タイマが追加されました。非同期なのでストップ中のカウントも出来ます。ただし入力は32KHzサブ発振か,内蔵低速発振に限られます。外部カウントは出来ないし, 内部カウントの場合もカウント値の読み出しは出来ないようです。
SAU(シリアルI/Fの集合体) SNOOZEモード(STOP中の自動受信)が追加されています。ただし同期シリアル(ユニット0チャネル0)かUART(ユニット0チャネル1)のどちらかだけです。
3線シリアルのクロックがCPUクロック/2までに向上しました(従来1/4まで)。つまり従来5MHzまでだったのが3倍強の16MHzまで速度が上がりました(まぁ従来が遅すぎたとも言えますが)。ただし,2.7V以上の同電位I/Fの場合です。私が掲載しているSDカードの基板は異電位I/Fを使っていて,この場合は従来どおり5MHzが限度となっていました(残念。でもまぁ,16MHzじゃどのみちオープンドレイン+プルアップじゃきついですしね)。
16ビット乗算,積和演算 従来符号無し乗算だけでしたが,符号付き乗算が出来るようになりました。さらに積和も出来るようになりました(アキュムレータは32ビット)。G12,G13は従来どおり周辺ハードですが,G14は命令として実装されているので実質的な乗算性能は数段上がっています。
データROM データ格納専用のフラッシュ(4〜8KB)を内蔵する製品が追加されています。
これに伴いミラー領域が従来のF1000hからF2000h(データ4KB品)またはF3000h(データ8KB品)に変更になりました。データ・フラッシュ無し品もこのようにミラー領域が減っています(物理的には存在しているのかな?)。内蔵RAM32KB品では,ミラーが20KB弱まで小さくなります。しかし,もしコンパイラの記述でデータ・フラッシュにも定数が書けるなら(書けるかどうか現在不詳)データフラッシュあり品を使えば実質ミラー領域を増やせることになります。しかもコード領域とは別領域なので,コードフラッシュ64KB品であっても定数領域含めた実質的なプログラムサイズを増やせることになります(コンパイラ/リンカに変な制限が付かなければ)。
・・・よく考えたら,そもそもミラーなんかにせず,そこに実際にフラッシュ置いてくれればもっと増えるのにねぇ・・・(値段や融通性との兼ね合いでしょうが)。
A/D入力端子 デジタルポートとして使う場合の割り付け方法が78K0Rと逆になりました。78K0RはANI0(P20)から連続でデジタルポートを割りつける必要があったのですが,RL78では逆にANI0(P20)から連続でA/D入力を割りつけて,残りをデジタルポートにします。
その他周辺 今後R8C系の周辺を取り込んだ物も出るようです。
パッケージ 144ピン・パッケージがラインナップから消えました。ニュースリリースには10ピン〜128ピンと書かれているため,小ピンが拡充される一方,今後も128ピンまでしか作らない雰囲気です。
デバッガ対応 E1に変更になりました。0.01版には,QB-MINI2(MiniCube2)との接続方法が書いてありましたが,結局消されてしまったのですね。会社統合がなければ,MiniCube2でのサポートが続いていたでしょうから,残念なことですね。

回路設計の手引き2017/7/2 更新
 デバッガとしてMINICUBE2(78K0R)またはE1(RL78)を使う場合の回路設計チェックリストです。
端子 確認事項
FLMD0端子
(78K0Rのみ)
プログラマやデバッガを接続する専用端子です。セルフ・プログラミングを行う場合は,オープンにするか100kΩでプルダウンします。
外部書き換えおよびセルフ・プログラミングを禁止にしたい場合(従って書込み済みの状態で実装する場合)は,GNDに直接接続するか,プルダウン抵抗として0Ωを実装します(デバッグ時のみ100kΩを実装)。
RESET端子 内蔵リセットを使う場合およびプログラマやデバッガを接続する場合は10kΩ程度でプルアップします。デバッガのリセット機能を使用する場合の回路構成はマニュアルを参照してください。
TOOL0/1兼用端子 プログラマやデバッガを接続する場合,TOOL0端子は必須であり10kΩ(78K0R時),1kΩ(RL78時)でプルアップしておきます。
TOOL1端子(78K0Rのみ存在)は,デバッガで疑似リアルタイムRAMモニタ機能などを使う場合に必要になり,その場合は10kΩでプルアップしておきます。
TOOLRxD/
TOOLTxD兼用端子(RL78のみ)
プログラマやデバッガ以外の外部デバイスからプログラミングを行う場合の通信端子として使用できます。この場合もTOOL0端子はプログラミング・モード引き込み用として使います。
A/D入力端子 78K0RとRL78で割り付けが逆になります。78K0Rの場合は,デジタルとして使うポートがあればANI0(大抵はP20と兼用)から連続で割り付ける必要があります。従って,A/D入力として使う方はANIn兼用端子のnの大きい方から割り付けます。
RL78の場合は逆にA/D入力として使う方をANI0(大抵はP20と兼用)から連続で割り付けます。
またノイズ低減用に100pF以上のコンデンサを入力端子−GND間に入れるのが望ましいです。
D/A出力端子 今のところバッファ内蔵品は無いので,オペアンプを外付けます。フルレンジで出力したければ,レールtoレール入出力(入出力フルスイング対応)のオペアンプを選びます。入力インピーダンスの高いCMOSオペアンプ等が適合します。
異電位I/F端子 品種によって,兼用になっている端子が異なる場合があります(特にKx3とKx3-L間で異なります)。異なる品種を使った回路図をコピーして使う場合は特に注意します(端子名からは異電位対応が判別できないのでマニュアルで確認するしかありません)。
P60-P63端子 出力形式はオープン・ドレインで,かつプルアップ抵抗も内蔵されていません。'H'レベル出力が必要な場合はプルアップ抵抗を外付けする必要があります。
X1, X2端子 発振子によってはX2端子側に直列抵抗が必要になる場合があります。発振子メーカに推奨回路定数を確認するのが望ましいです(一部の品種はマニュアルに推奨値が掲載されています)。
XT2端子 ・32.768kHz発振子を接続する場合,直列抵抗が必要になる場合が多くあります。具体的な値は発振子メーカに評価を依頼して決めるのが望ましいです(特に発振回路の電力を指定できる品種ではレジスタの電力設定をした上で評価してもらいます)。
・78K0Rは外部クロック入力が出来ません(等価回路的にはX1,X2と似てますが,XTは発振用インバータだけをOFFにすることが出来ないようです。Xは外部クロック入力指定することによりOFFに出来ます。また発振用インバータはREGC出力電圧で動いている可能性があるので(波形を見た感じ),インバータを動かした上でXT1側にVDDレベル・クロックを入れるのもNGと考えられます)。
REGC端子 内蔵レギュレータの出力端子ですが,他の回路の電源として流用してはいけません。また外部で作った電圧をコア電圧として印可するのもいけません。
マニュアルには「特性の良いコンデンサを接続してください」としか書かれていませんが,一般的にはB特性またはR特性の積層セラミック・コンデンサを接続します。
電源端子 内蔵リセットを使う場合は,電源電圧がリセット解除電圧(1.5V程度)に達してからMCUの最低動作電圧(78K0R/Kxは1.8V,RL78/G13は1.6V)に達するまでの立ち上がり時間が長くならないように注意します。
78K0Rは電源立ち上げ時間が規定(0V→1.8Vで3.6ms(max.))されています。また,外部リセットを1.8Vよりも低い状態で解除したとしてもVDD1.8V到達までの時間が1.88ms以内ならば許されます。ただし個別のカタログでスペックの確認が必要です。
RL78は,今のところ立ち上げ時間が規定されていません。内蔵リセットを使い,なおかつ厳格な動作保証が要求される機器においては,メーカに立ち上げ時間を規定してもらってください。
(注:バッテリ・バックアップする場合のように長い時間MCU最低動作電圧を下回る可能性がある場合は内蔵電圧検出回路のリセット機能を使用します。ただし78K0Rの内蔵電圧検出回路は消費電流が大きいため,RL78を使うか,外付けの電圧検出回路を使用する方が良いでしょう)
P137端子(RL78のみ) オープンにしないこと。
入力専用で、かつ内蔵プルアップ抵抗もありません(このピン位置は78K0RではFLMD0端子だった所ので、何か変な制約があってそうなったんでしょうね)。
その他入出力端子 出力電流スペックとして,絶対最大定格(瞬時に破壊が起きうる値)の他に,動作保証値(誤動作しないことを保証する値)が規定されていることに注意します。これは78K系特有のスペックなので,78K系(RL78含む)を初めて使う場合は特に注意します。
また,一般的な注意事項を「電気的特性」欄あるいは「端子機能」の等価回路図から読み取っておきます。
・入力レベル(ハイレベルが0.8EVddの端子と0.7EVddの端子がある)
・出力レベル(端子によってドライブ能力が異なる。特にアナログ兼用端子は低い)
・入出力回路形式の端子ごとの違い(5Vトレラント,シュミット,オープン・ドレインなど)

汎用系78K0R, RL78 ファミリの変遷2010/12/08 追加
K0R_TREND1.gif (11179 バイト)
78K0R/Kx3 → Kx3-Lの違い】 2010/12/08 追加
改良だけでなく,一部の人にとっては愕然とするような変更もあります。
@低電圧I/F可能な端子の変更
 KF3,KG3では,P43〜P45が異電位I/F対応可能(VDD=5V時に3.3V系とI/F可能)でしたが,KF3-L,KG3-Lでは不可になりました。ピン名称(機能)が同じなので,Kx3を使った経験のある回路屋さんは特に注意です。基板が上がった頃になってから,ファーム屋さんから「-L品のP4にはPIM・POMレジスタがないんですがぁ・・・」なんて言われて,基板を大変更するはめにならないとも限りません。しかし,まぁ,こうゆう落とし穴的変更は避けてもらいたいものですよね。逆にKx3-LからKx3に変更する場合はP10〜P12が異電位不可になるので要注意です。
Aその他の端子変更,機能削除
 D/A出力がなくなったとか,KF3のようにポートの端子位置が違うなど,「その変更はユーザにどんなメリットがあるのか」が疑問な変更があります。きっと値段が安くなるっていう理由だと思いますが,設計変更費の負担の方が大きくなる零細ユーザにとっては迷惑な話ですね。ピン互換・機能上方互換なら,-Lに変更するだけで外付け発振子が削除できて,低消費電力になるというのに・・。
Bフル機能I2Cの制御レジスタ変更
 まずレジスタ名称が全部変更になりました。大部分は中身は変わっていません。一部変更があり,レジスタ名称置換以外にもプログラム修正が必要です。きめ細かいタイミング調整が出来るようになって喜んでいるユーザの人もいるかもしれませんが,この手の変更は,「従来どおりでも動くし,細かい調整も可能になる」というように上位互換にすべきだと思うのですがねぇ。
 フル機能が必要でなければ移植の手間がかからないSAU(シリアル・アレイ・ユニット)の簡易I2Cを使った方が良いかもしれません(簡易の方はちょっとだけ制御が面倒ですが)。
C20MHz高速内蔵発振器の追加
 これは良いですね。若干精度が足り無い気がしなくはないですが,常温ならUART通信にも支障が出ない程度でしょうから問題ないでしょう。単に外付けの発振子が減るだけでなく,短周期でstop/runを繰り返すような用途では発振安定待ちがほとんどない内蔵発振が有利です(レスポンス,消費電流とも)。
Dスタンバイ電流が特に低くなった
 20MHZ動作電流も7.3mA→6.2mAと低くなっていますが(256KB品比較),STOPモード(RTCのみ動作)が1.1μAから0.37μAに低減されています。コイン電池で時計バックアップする場合にありがたいですね。
E32ビット除算(実行クロック数16)追加
 C言語でプログラム書くと,除算を結構気軽に記述してしまいがちです。そういう人にはありがたいですね。追加されたのは符号無し除算なので,符号付き除算時は若干オーバーヘッドが出ますが,従来のライブラリに比べればかなりの高速化です。ただし,乗算の方が高速なので,定数除算は精度が確保できるなら逆数乗算にすべきでしょう。
F外部バス削除
 KG3にあった外部バスはKG3-Lでは無くなっています。80バス形式のLCDコントローラを使っている人は憤慨しますかね?。USBホストとかイーサを敢えて78K0Rに付ける人いますかね?(リアルテックRTL8019をバス接続して10BASE-Tで使ってみるのも趣味としてはおもしろそうだけど・・) ちなみにドライバ・キットで使っている秋月LCDは68バス形式なんでポート制御するしかなく,バス機能は使ってないです。
SFR(周辺レジスタ)操作の注意】 2010/12/04追記
割り込みの中やRTOS(リアルタイムOS)のタスクでSFR(周辺レジスタ)を操作する場合は,干渉に十分注意しないと,”まれに変な動作する” という危険なプログラムになりかねません。特に次のようなよくあるケースでは,”全然関係が無い(と思い込んでいる)プログラムどうしが干渉”してしまい,原因究明・デバッグに非常に時間がかかることがあります。
 ・1つの入出力ポートをビットごとに別のプログラムが使用している。
 ・TAU,SAUのようなチャネル集合体を,チャネルごとに別のプログラムで使用している。
どちらも場合も 「SFR読み出し→更新→SFR書き込み」 の間に割り込みでSFR更新しても,割り込み終了後に元の値に戻されるというトラブルに見舞われます。例えばポート1(P10〜P17)の下4ビットにある変数(i=0〜15)の値を代入するには,
 ・C言語 P1= P1 & 0xf0 | i; (アセンブラでは, mov a, P1 / and a, #0f0H / or a, !_i / mov P1, a)
と書くと,P1参照後に割り込み内で上4ビットを操作しても,割り込みから戻るとすぐに元の値に戻されてしまいます。
このような場合,割り込まれる側(RTOSではタスクの優先順位の低い側)では,SFR操作中は割り込み禁止にする必要があります。

ところで,78K0Rでは下記のような操作は1命令で実行するので,途中で割り込みがかかることなく実行されます。つまり割り込み禁止にする必要が無いので,このような操作に慣れてしまって前記原則をついつい忘れてしまうことがあります。
 ・入出力ポートのビット・セット/クリア/定数との論理演算(AND,OR,XOR)
  例: P10 = 1;  P1 &= 0xf0;
 ・ビット名が定義されている(Cやアセンブラで青色表示される)SFR名のビット・セット/クリア。
  例: ADCS = 1;  ADCS = 0;
 ・ビット名が定義されてないバイトアクセス可能なSFRのビット・セット/クリア
  例: SET1  !1BCH.1 (アセンブラでのアドレス直値指定)
一方で,TAU,SAUのビット操作は1命令で操作出来ない場合が多く,出力レジスタ(TO,SO)など1バイトに複数チャネルのビットがまとまっているレジスタはトラブルの温床なので注意を要します。TOL0Lのビット・セット/クリアなどハードウエア的には1命令で操作できるSFRであっても,ビット名称が定義されてないためコンパイラが複数命令に展開してしまうこともあります。コンパイラを使っている場合,ROMサイズや速度に余裕がある場合は,とりあえず割り込み禁止にして操作するのが良いでしょう。
RL78 vs RX200 の消費電流比較(暫定値比較)2010/12/01追記
 消費電流だけだとRL78の方が良いようですが,最低動作電圧での電力で比較するとRX210の方が良いようです。RX210の値は,ニュースリリースの「0.28mA/MHz」,「50MHz時78DIPS」からの換算値です。RL78は11月22日時点掲載の暫定マニュアルver0.01の値です。RL78はローコスト,RX200は高性能,という売り分け方でしょうかね。
  RL78/G13 RX210 (換算値) 78K0R/KE3-L
20MHz時電流
([ ]内はDMIPS値)
3.6 mA [25.6 DMIPS]
9.7 mW (2.7 V)
5.6 mA [31.2 DMIPS]
9.1 mW (1.62 V)
5.3 mA [25(?) DMIPS]
14.3 mW (2.7 V)
41 DMIPS時電流
([ ]内はクロック周波数)
5.1 mA [32MHz]
13.8 mW (2.7 V)
7.4 mA [26.3MHz]
13.3 mW (1.8 V)
8.7 mA [32.8(?) MHz]
(換算値。動作不能)

16x16→32乗算器の注意点】 2010/11/27更新
2つ注意点があります。
(1)割り込みでも乗算器を使う場合は,割り込まれる側のプログラムでは乗算器を割り込み禁止状態で使用します。
   @PSW退避。1クロック・・・後でIEフラグを復帰するのに必要
   A割り込み禁止。4クロック・・・乗算回路を割り込みで使用されるのを防ぐ
   Bデータを乗算回路に転送。2クロック・・・オペランド2つ
   C乗算
   D結果を乗算回路から転送。2クロック・・・結果は32ビットなので2回転送。
   EPSW復帰。3クロック・・・乗算前の割り込み許可/禁止状態の復帰
  割れ込まれるプログラムが必ず割り込み許可状態であるという前提なら,上記PSW退避は不要ですが,
  EIに4クロックかかるので,実行時間としては同じです。スタックは1バイト減ります。

(2)符号付き変数の場合は絶対値化して乗算後,符号を戻します。
  乗算結果が必ず下16ビットに収まる場合はそのまま乗算して下16ビットだけ使えば良いですが,
  17ビット目以上の結果を使う場合は符号処理が必要です。a*bなら,
  @a^bのMSBを保存(サインビットのxor値を乗算結果符号として保存)
  Aa, bを絶対値化してから乗算器にデータ格納
  B乗算器から結果を取り出し,@で保存した符号がマイナスなら,乗算結果を負数に変換する。

  あるいは,a,bがsaddr領域に保存してあるなら,次のように後で補正する方が速く計算できます。
  @まずa, bをそのまま乗算器にデータ格納。
  A乗算結果下位16ビットは補正不要。上位16ビットはB,Cの補正を行う。
  Baが負なら,乗算結果上位16ビットからbを引く。axレジスタに上位16ビットを格納してあれば,
    mov1 CY, データa..7
    sknc
    subw ax, データb
  Cbが負なら,乗算結果上位16ビットからaを引く。

 なお,RL78は符号付き乗算ができるので,コントロール・レジスタを変更するだけで済みます。
78K0→78K0Rの違い】 2010/11/17追加
 ・基本的なレジスタ構成は互換。アドレス拡張のためのCS,ESレジスタが増えています。
 ・アセンブラ・ニモニックは上位互換(一部はマクロで互換性維持)ですが,マシン語は非互換です。
 ・同一クロック周波数での性能は6倍以上。分岐や一部の命令,__far領域アクセス命令を除き,ほとんどの命令を1クロックで実行できるようになった上に,高速化に役立つ有用な命令がかなり増えています。
 ・タイマ,シリアルは増強されましたが全く互換性のない別物になりました。フル機能IICは78K0R/Kx3ではほぼ互換,78K0R/Kx3-Lで一部互換性が損なわれています。
 ・RTCが追加になりました。ただし78K0でもRTC内蔵版が一部出てきています。
 ・非同期カウンタが無くなりました。
 ・一部(シリアル通信関係)のポートは,5V電源時に3.3V系とのI/Fが可能です(TTL入力/オープンドレイン出力の選択が可能)。
ハザード
 条件によってはパイプライン・ハザードによって1クロックのCPUウエイトが発生しますが,ハードウエアのユーザーズ・マニュアルには書かれていません。命令編のマニュアルに書かれています。まぁ,アセンブラでプログラムを書く人にしか関係ありませんけどね。アセンブラ使いなら命令編のマニュアルを読むでしょうから無用な気遣いでしたかね。でも,78K0のアセンブラ・ソースを何も考えずに移植すると,いたるところでハザードを起こす可能性があるので,処理速度にセンシティブなプログラムでは気をつけた方が良いでしょう。
CSIの連続受信DMAができない
 CSIの受信はダミー・データを書かないとスタートしません。連続受信の場合は,受信データを引き取ってからダミー書き込みしなければならない仕様なので,単純なDMA転送が出来ません。受信割り込み1回ごとにDMA起動することも考えられますが,1回のDMA転送が終わってからダミー書き込みする部分が面倒くさい感じです。私はCSI受信時のDMA使用は諦めました。
非同期カウンタが無い
 全製品をチェックしてないですが,Kx3,Kx3-LのようにTAU(タイマアレイユニット)しか持たない製品は,STOP実行中に外部クロックをカウント出来ません。STOP中にカウントしたい用途って,滅多に無いかもしれませんが,たまーにあるんですよ。その場合は非同期カウンタのある78K0を使うしかないですね。
ROMアクセスはRAMより遅い
 理由はマニュアルに書かれているとおり,パイプライン3段目のメモリアクセス・ステージでパイプライン停止が発生するからのようです。1バイト読み込みでも2バイト読み込みでもクロック数は一緒なので,もし連続1バイト読み込みする部分があったら,2バイト単位読み込みに変更するのが良いかも。
分岐はスキップより遅い
 分岐時にはパイプラインが切れるので,命令の読み直しのためどうしても2クロック余分にかかります。高速化したい場合はスキップ命令を活用すると良いでしょう。16bitの2の補数を絶対値化する例では,次のようになります。
・分岐命令を使うと6〜7クロック
  CLRW  AX
  SUBW  AX, !_WORK
  BF      A.7, $+6
  MOVW AX, !_WORK
・スキップ命令を使うと5クロック
  CLRW  AX
  SUBW  AX, !_WORK
  MOV1  CY, A.7
  SKNC
  MOVW AX, !_WORK
割り込みフラグの永久ロックは回避されたらしい
 うる覚えですが,78K0の時は次のような記述をすると当該割込み要因が発生してもフラグが立たずに永久ループした記憶があります。78K0Rでは立つようです(一部のフラグしか確認していません)。
  LOOP:  BF TMIF00, $LOOP
割り込みフラグ操作などの命令を実行すると,その次の任意の1命令でも割り込みがロックされるという仕様は78K0と同じなので,この点からすると永久ロックされるはずです。ロックしないのは,分岐によりパイプライン・フラッシュが発生し,内部的に2クロックのウェイトが入いるためだと思われます。
レジスタ構成(雑談)
 78K0Rのレジスタ構成は,とてもトラディッショナルです。基本となるA,B,C,D,E,H,Lレジスタは,1972年発表のインテル8008の時から踏襲されているので,実に40年におよぶ歴史を持っています。
 旧NECの最初のオリジナル8ビットマイコンμCOM-87ファミリでは,A〜Lに加えてVレジスタを持っていました。ショートアドレス空間の上位8bitをVレジスタに格納するようになっていました。ところが当時のマイコン(MCU)の内蔵RAMは256バイト以下がほとんどで,外部RAMを増設しない限りVレジスタは固定値で使われていました。μCOM-87の上位版のμCOM-87ADでは,さらに16ビット演算用EAレジスタが追加されました。
 その次に78Kのローマ数字シリーズ(78K/T〜W,78K/Y)が出てきて,いろいろなレジスタ構成が出てきました。8ビット・マイコンの78K/T,78K/UではXレジスタが追加され,AXで16ビット演算を行えるようになりました。またレジスタ・バンクも4バンクになりました。16ビット・マイコンの78K/VではレジスタがR0〜R15の16本に増え,その一部の代替名称としてX, A〜Lが割り当てられました。レジスタ・バンクも8と多くなっていました。78K/Wではさらに24ビット空間アクセス用にV,U,T,Wの4本のレジスタが追加されてました。さらに強化された78K/Yはバンク数16で,X, A〜L名称は無くなりました。32ビット演算もできるようになりました。もっとも78K/Yは資料が1件(UPD78600)公開されているのみで,ほとんど売れてなかったと思われます。
 その後78K0が出てきます。当初は78000〜78099番台の品番だったので,78.0nnK→78K0nnで78K0は品番と意味が一致していました。その後nnの桁が増えてnnnになったんで,今はそういう意味では780Kシリーズなんですよね。ローマ数字シリーズの16ビットの方は結局廃止され,一時期は16ビットは完全撤退して32ビットのV850でカバーすると言ってたようです。
 その後,やはりV850で16ビットをカバーするのは値段も消費電力もきつかったらしく,78K0をベースにした16ビット・マイコンとして78K0Rが出てきました。昔のローマ数字シリーズでレジスタ構成が乱立した反省からか,汎用レジスタの構成は78K0と完全互換となっています(メモリ空間拡張レジスタCS,ESは汎用レジスタとは別に拡張)。ま,最近はC言語開発が多いんで,そんなの気にならない人も多いようですが。それよりタイマやシリアルのレジスタ構成が一新され,アセンブラはもちろんC言語で開発していた人もプログラムを書き直しになった方が痛いかも。
【(雑談)H8系,M16C系が→】
 製品メニューの”その他ファミリ”に追いやられています。RL78の発表と同時期だったので,H8系,M16C系をRL78で置き換えるのかと思っちゃいましたが,RX200がちゃんと発表されたのでうがった見方でしたかね。

●フリー・ツールでの64K越えの技法

 以下は手作業の場合の手順です。自動化ツールAddHex_78K0R(紹介ページ)をベクター公開しました。楽をしたい方はそちらのマニュアルを参照して下さい。
 @64K内のプログラム本体に,64K以上をアクセスする記述をしてビルドします。
 A64K越えROMに配置するオブジェクトを作成します。
 B64K越えオブジェクトを64K内hexに追加し,それを書き込むかデバッガでダウンロードします。

【@本体記述(その1):64K越えROM領域のデータを参照する方法】

・アセンブラならESレジスタに上位アドレスを格納し,オペランドをES修飾すればよいです。
  例(15000Hの内容をAレジスタへ転送):
 MOV  ES, #1
  MOV  A, ES:!5000H

・C言語の場合は,CC78K0R特有の拡張機能である__directmapを使用して記述します。

  定義例
  __directmap __far int data = 0x15000;     /* 15000Hにint型変数を配置 */
  __directmap __far int data[100] = {0x15000}; /* 15000Hにint型配列を配置 */
   注:この場合,代入しているのはアドレスであり,実際に格納する値は,
     Aにおいて作成します。

  参照方法(通常の変数と同じ)
  i = data;
  i = data[ j ]

・互換性の観点で拡張機能を使いたくない場合は,ポインタによりアクセスします。

  定義例
  __far int* const data = 0x15000;    /* ミラー領域にポインタを配置(RAM節約時) */
  __far int* data = 0x15000;             /* RAMにポインタを配置(速度重視時) */

  参照方法(通常のポインタによる参照と同じ)
  i = *data;
  i = data[ j ];

・変更容易性の観点で配置アドレスを64K越えROM領域に記述したい場合は,
  ポインタを__directmapで配置します。

  定義例
  __directmap __far int* __far data = 0x11000;   /* 11000Hにint型変数へのポインタを配置 */
   注:この場合,11000Hに変数の配置アドレス(例えば15000H)を格納します。

  参照方法(通常のポインタによる参照と同じ)
  i = *data;
  i = data[ j ];

 

【@本体記述(その2):64K越えROM領域の関数を呼び出す方法】

・アセンブラならCALL命令,BR命令で直接20ビットアドレスを記述すればよいです。
 例: CALL  !!12000H

・C言語の場合,一番簡単なのは関数へのポインタを使用します。

  定義例(アドレス12000Hに関数 int funct(int c); を配置する例)
  int __far (*const funct)(int) = 0x12000;  /* ポインタはmirror領域に格納(RAM節約時) */
  int __far (*funct)(int) = 0x12000;      /* ポインタはRAM領域に格納(速度重視時) */

  呼び出し方法(普通の記述方法と同じ)
  i = funct( j );

・さらに変更容易性の観点でポインタの配置アドレスを64K以上のROM領域に記述したい場合は,
 ポインタを__directmapで配置します。

  定義例
  __directmap int __far (* __far funct)(int) = 0x11000; /* 関数の配置アドレスを11000Hに格納 */
   注:この場合,11000Hに関数の配置アドレス(例えば12000H)を格納します。

  呼び出し方法(普通の記述方法と同じ)
  i = funct( j );

・ポインタによる間接呼び出しでは速度が足りない場合は,ちょこっとアセンブラを使います。

  宣言例(普通の記述方法と同じ(関数を別ファイルに記述する形式))
  extern int __far funct(int c);

  呼び出し方法(普通の記述方法と同じ)
  i = funct( j );

  追加するアセンブラ・ソース・ファイル例(注:C言語の関数名の前には_をつけます)。
  public _funct
  _funct  equ  12000H
  end

 

【A64K越えオブジェクトの作成】

ここでは,64K越えROMに配置するヘキサ・ファイルの作り方を説明します。

(1)直接作成する方法
 次のような方法があります。
 ・バイナリ・エディタで直接作成する。
  ベクターにある「ROM化支援バイナリエディタ」なら直接ヘキサで出力できるようです。
 ・テキストで作成した後,テキストtoバイナリ変換し,さらにバイナリtoヘキサ変換する。

(2)CC78K0R,RA78K0Rの出力(.rel)から抜き出す方法
 .relはCOFF系形式のフォーマットです。ここからオブジェクト本体を抜き出してヘキサに変換します。
 抜き出し位置が分からない場合は,0x12,0x34,0x56,0x78,のような特異データを埋め込むと良いでしょう。
 結構手間がかかるので自動化ツール(AddHex_78K0R)を作りました。

(2−1)データの場合:
 C言語でのソース例
 __far long const data1 = 0x78563412;   /* 抜きだし位置を確認したい場合に入れる */
 __far unsigned char const data2[100] = {
    /* バイト単位記述 */
  };

(2−2)関数の場合:

・アセンブラの場合は,アブソリュートな出力になるようにプログラムを書けばよいです。
 セグメントの開始アドレスを指定すれば,ほとんど問題ないと思われます。
 例:
  aaa1 cseg at 12000H
  funct: mov  a, !data
           br      !!funct2
・・・・
  funct2: ret

  aaa2 dseg at 0ffc00H
  data: ds  1
  end

 アセンブル結果(.prn)のOBJECT欄を見て,頭にRが付いていると
 リロケータブルという意味なので, これが出力されているようでしたら修正します。

・C言語の場合は,ライブラリ関数の呼び出しがあるとリロケータブルとなってしまいます。
 明示的なライブラリは使うのを避ければ済みますが,乗除算や符号付きの型(int型など)
 の比較のようなランタイムライブラリの使用を避けるのは困難と思います。

 従ってC言語のみでアブソリュートにするのは困難なので,Cコンパイラで生成された
 アセンブラ・ソースの修正が必要になります(アセンブラ・ソースの出力はコンパイラ
 オプションで指定できます)。

 手順(1)Cソース作成例
#pragma section @@CODEL AAA1 at 12000H
int __far funct(int c);
#pragma section @@DATA AAA2 at 0FFC00H
int  data;
extern char moji[ ];
extern int    printf(const char *format, ... );

int __far funct(int c) {
  printf(moji, data);
  return ( data * c);
}

 手順(2)未解決シンボルの解決
  上記の例だと,アセンブラ出力(.asm)のなかに次の記述が出ます。
   EXTRN   _moji               →文字列リテラルの格納位置
   EXTRN   _printf             →ライブラリのprintf関数
    EXTRN    _@RTARG0  →Cコンパイラが使う変数領域
    EXTRN    @@iumul    →int型乗算のランタイムライブラリ

  この部分を次のような形式に書き換えます。
    _moji          EQU  2340H
    _printf        EQU  0DEC9H
    _@RTARG0 EQU  0FFED8H
    @@iumul     EQU  184H
  ここで,EQUの後ろの値は64K内の本体をビルドしたときに生成されるシンボル・ファイル(.sym)
  から読み取ります(下20ビット分を読み取り。ただしboolean変数は下3ビットがビット位置)。
  逆に言うと本体プログラムにこれらのシンボルが現れるように記述します。
  ライブラリ関数やランタイム関数,コンパイラ予約領域のシンボルを出現させる一番簡単な方法は,
  64K内にC言語ダミー関数もしくはアセンブラ・ソースを追加し,EXTRNの行を貼り付けてしまうことです。
    例:
       char const moji[ ] = "data=%d\n";
        void dummy (void)  {
            #asm
                   EXTRN   _printf             →ライブラリのprintf関数
                   EXTRN    _@RTARG0  →Cコンパイラが使う変数領域
                   EXTRN    @@iumul    →int型乗算のランタイムライブラリ
            #endasm
        }
  文字列をexternで定義しているのは,文字列リテラルがミラー領域(@@CNSTセクション)に置かれ
  るためです。ラージ・モデルでコンパイルすれば回避出来ますが非常に効率が悪いので,64K内
  本体で文字列リテラルを定義しておき,64K超からはポインタで指定する方がよいです。

 手順(3)修正したアセンブラ・ソースのアセンブル
  修正したソース(.asm)を必ず保存します(自動では保存されません)。
  その上で,Cソースをコンパイルします。そうすると日付の新しい.asmだけがアセンブルされます。
  逆に言うと,Cソースを修正してしまうと,またアセンブラ・ソースの修正が必要になります。

 

【B64K越えオブジェクトのhex追加】

(1)64K内本体をビルドして生成されたヘキサ・ファイルに64K超のヘキサ・ファイルを連結します。
 連結方法は,64K超のヘキサ・ファイルの最後の1行を削除して,
 それを64K内ヘキサの最後から1行手前に挿入します。

(2)書き込み
 でき上がったヘキサ・ファイルをQBプログラマーなどで直接マイコンに書き込むか,
 デバッガでダウンロードすれば動作します。

 


●78K0R COFF調査

 とりあえずヘキサ追加ツールを作るのに十分なだけ調査しました。#pragma sectionで絶対アドレス指定したオブジェクト・ファイル(*.rel)で,抜きだし対象となるセクション(@@CODEL, @@CNSTLをリネームしたセクション)の情報を主に調べています。その他の条件では変わる可能性があります。

  78K0R *.relファイル COFF
File_Header (20バイト)
  unsigned short FH.magic マジックナンバ
  unsigned short FH.sec_n セクション数
  unsigned long FH.time 日時
  unsigned long FH.sym_p シンボル・テーブル位置
  unsigned long FH.sym_n シンボル数
  unsigned short FH.opt_s オプショナル・ヘッダのサイズ
  unsigned short FH.flags フラグ
     
Option_Header (FH.opt_sバイト)
  char OH.xxxx[ ] (FH.opt_s - 20 * FH.sec_nバイト) -
  Section Address (20 * FH.sec_nバイト) -
    unsigned long OH.SA[ ].type ? (アブソリュートなら 0x10001のようです) -
    unsigned long OH.SA[ ].addr 配置アドレス -
    char OH.SA[ ].zzzz[12] ? -
     
Section_Header (52 * FH.sec_n バイト) (40 * FH.sec_n バイト)
  char SH[ ].name[8] セクション名
  unsigned long SH[ ].paddr →(?) 物理アドレス
  unsigned long SH[ ].vaddr →(?) 仮想アドレス
  unsigned long SH[ ].sec_s セクションのサイズ
  unsigned long SH[ ].row_s 生データのサイズ(たぶん) -
  unsigned long SH[ ].xxxx_p ?の位置 -
  unsigned long SH[ ].row_p 生データの位置
  unsigned long SH[ ].loc_p リロケーション情報の位置
  unsigned long SH[ ].line_p ライン番号情報の位置
  unsigned short SH[ ].yyyy ? -
  unsigned short SH[ ].loc_n リロケーション情報の個数
  unsigned short SH[ ].line_n ライン番号情報の個数
  unsigned long SH[ ].flags →(?) フラグ
  unsigned short SH[ ].zzzz ? -
     
Section_Data →(?) (Σ SH[n].sec_s バイト)
     
Relocation_Data (16 * Σ SH[n].loc_n バイト) (10 * Σ SH[n].loc_n バイト)
     
Linenumber_Data (8 * Σ SH[n].line_n バイト) (6 * Σ SH[n].line_n バイト)
  unsigned long LD[ ].addr アドレス/シンボル位置
  unsigned short LD[ ].line ライン番号
  unsigned short LD[ ].xxxx ? -
     
Symbol_Table (20 * FH.sym_n バイト) (18 * FH.sym_n バイト)
  char ST[ ].name[8] シンボル名
  unsigned long ST[ ].sym シンボル値
  unsigned short ST[ ].sec →(?) セクション番号
  unsigned short ST[ ].type →(?) シンボル・タイプ
  unsigned char ST[ ].class →(?) ストレージ・クラス
  unsigned char ST[ ].entry →(?) 追加エントリ数
  unsigned short ST[ ].xxxx ? -
     
Strings ストリング情報
     

 


●デバイス・ファイル調査

 とりあえずK0R(uPD78F1009-64)とRL78(R5F100LE)のデバイス・ファイル比較表(ヘッダ部分)を載せます。

開始位置 hex位置 長さ K0R:uPD78F1009-64 RL78:R5F100LE 推定コメント
0 0 1 0x1A 0x1A
1 1 35 Copyright (C) NEC Corporation 2009\0 Copyright(C) 2011 Renesas\0\0\0\0\0\0\0\0\0\0 ここと次の項を書き換えればRL78をPM+でビルド可能。ファイル名も変更(R5を消して,拡張子を78Kに変更)
36 24 4 0x0300000B 0x0300000C ここも↑
40 28 4 0x00000201 0x00000110 リビジョン
44 2C 4 0x999B1148 0x9A321148 デバイスごとのコードか?
48 30 4 0x0002996F 0x0002996F
52 34 16 uPD78F1009_64\0\0\0 R5F100LE\0\0\0\0\0\0\0\0 デバイス名
68 44 8 f100964\0 f100le\0\0 コンパイラで識別可能なデバイス名。例えば#ifdef __F100LE_ と記述。
アセンブラなら$PROCESSOR文ではF100LEで指定できるが,$_IFで識別できる名前は不詳(___F100LE_などいくつかのパターン試したがNGだった)。
76 4C 4 0x00000021 0x00000021
80 50 2 SN SN シンボル定義(1st SFR)
82 52 2 0x01A9 0x01BE シンボル数
84 54 8 0x000001DC 0x000001DC 定義開始位置(この位置から40バイト単位でSFR名とその内容が続いている)
92 5C 2 VN VN 割り込みベクタ定義
94 5E 2 0x002A 0x003B ベクタ数
96 60 8 0x00004444 0x0000478C 定義開始位置(この位置から24バイト単位でベクタ名とその内容が続いている)
104 68 2 VI VI  
106 6A 2 0x0 0x0  
108 6C 8 0x00004834 0x00004D14  
116 74 2 MI MI メモリ定義
118 76 2 0x000F 0x0011 メモリセクション数?
120 78 8 0x00004834 0x00004D14 定義開始位置(この位置から16バイト単位で開始アドレス, 終了アドレス, 属性?が続いている)
128 80 2 MC MC  
130 82 2 0x0 0x0  
132 84 8 0x00004924 0x00004E24  
140 8C 2 CG CG  
142 8E 2 0x0001 0x0001  
144 90 8 0x00004924 0x00004E24  
152 98 2 BS BS  
154 9A 2 0x0 0x0  
156 9C 8 0x00004974 0x00004E74  
164 A4 2 ES ES シンボル定義(2ndSFR)
166 A6 2 0x00B1 0x00F6 シンボル数
168 A8 8 0x00004974 0x00004E74 定義開始位置(この位置から40バイト単位でSFR名とその内容が続いている)
176 B0 2 XD XD  
178 B2 2 0x0017 0x0017  
180 B4 8 0x0000651C 0x000074E4  
188 BC 2 CT CT  
190 BE 2 0x0001 0x0001  
192 C0 8 0x00006630 0x000075F8  
200 C8 2 SS SS  
202 CA 2 0x0 0x0  
204 CC 8 0x00006690 0x00007658  
212 D4 2 IO IO  
214 D6 2 0x0 0x0  
216 D8 8 0x000066B4 0x000076A0  
224 E0 2 PT PT  
226 E2 2 0x0 0x0  
228 E4 8 0x000066B4 0x000076A0  
236 EC 2 MK MK  
238 EE 2 0x0 0x0  
240 F0 8 0x000066B4 0x000076A0  
248 F8 2 MT MT  
250 FA 2 0x0 0x0  
252 FC 8 0x000066B4 0x000076A0  
260 104 2 ID ID  
262 106 2 0x0 0x0  
264 108 8 0x000066B4 0x000076A0  
272 110 2 BI BI  
274 112 2 0x0 0x0  
276 114 8 0x000066B4 0x000076A0  
284 11C 2 SC SC  
286 11E 2 0x000C 0x001A  
288 120 8 0x000066B4 0x000076A0  
296 128 2 QB QB デバッガ定義か
298 12A 2 0x0004 0x0007 エントリ数?
300 12C 8 0x000067D4 0x00007910 スクリプトぽい定義のようだが?
308 134 2 EV EV  
310 136 2 0x0001 0x0001  
312 138 8 0x000069F4 0x00007DB4  
320 140 2 FL FL  
322 142 2 0x004E 0x004E  
324 144 8 0x000069FC 0x00007DBC  
332 14C 2 OD OD いかにもオンチップ・デバッグの略ぽいが?
334 14E 2 0x0013 0x000F 定義数?
336 150 8 0x00006C6C 0x0000802C 定義数で割ると8バイト単位の情報
344 158 2 EM EM  
346 15A 2 0x0003 0x0006  
348 15C 8 0x00006690 0x00007658  
356 164 2 LD LD  
358 166 2 0x0 0x0  
360 168 8 0x00006D04 0x000080A4  
368 170 2 PL PL  
370 172 2 0x0 0x0  
372 174 8 0x00006D04 0x000080A4  
380 17C 2 PI PI  
382 17E 2 0x0 0x0  
384 180 8 0x00006D04 0x000080A4  
392 188 2 SI SI  
394 18A 2 0x0 0x0  
396 18C 8 0x00006D04 0x000080A4  
404 194 2 CI CI  
406 196 2 0x0 0x0  
408 198 8 0x00006D04 0x000080A4  
416 1A0 2 SX SX  
418 1A2 2 0x0 0x0  
420 1A4 8 0x00006D04 0x000080A4  
428 1AC 2 MD MD  
430 1AE 2 0x0001 0x0001  
432 1B0 8 0x00006D04 0x000080A4  
440 1B8 2 PC PC  
442 1BA 2 0x0 0x0  
444 1BC 8 0x00006D04 0x000080A4  
452 1C4 2 PE PE  
454 1C6 2 0x0 0x0  
456 1C8 8 0x00006D04 0x000080A4  
464 1D0 2 PS PS  
466 1D2 2 0x0 0x0  
468 1D4 8 0x00006D04 0x000080A4  
476 1DC       定義の本体が以下続く(まずはシンボル定義から)

 


●資料室(マニュアル,ツールなどへのリンク,一般図書)

  〜〜〜 一般図書 〜〜〜

〜〜〜 デバイスのマニュアル類 〜〜〜
 マイコンのデータシートは,最近ではユーザーズ・マニュアルと一緒になっています(以前はデータ・シートとユーザーズ・マニュアルは分かれていましたが)。電気的特性を見たい方は,ユーザーズ・マニュアルの後ろの方を見てください。
 (注)下記のPDF表示は「PDFダウンロード画面へのリンク」の意味です。IE11以上でないと当該ページが出ません

  〜〜〜 ミドルウエア、サンプルソフト等のマニュアル 〜〜〜 2018/4/7 追加

  〜〜〜 ターゲット・ボードのマニュアル類 〜〜〜 2012/2/11 追加
 
   注:MINICUBE2用をE1で使用する場合は,別売QB-F14T16-01が必要。

  〜〜〜 ツールのマニュアル類4 (CS+ for CC環境) 〜〜〜 2017/3/25 追加

  〜〜〜 ツールのマニュアル類1 (PM+環境およびエミュレータ) 〜〜〜 2012/2/11 E1追加

  〜〜〜 ツールのマニュアル類2 (旧版CubeSuite環境) 〜〜〜 2012/1/22 下記はCubeSuite+ではありません

  〜〜〜 ツールのマニュアル類3 (CubeSuite+(プラス)環境) 〜〜〜 2014/1/14 V1.03〜2.01のリンク追加

 (注)下記のPDF表示は「PDFダウンロード画面へのリンク」の意味です。

  〜〜〜 関連ページへのリンク 〜〜〜

 


●デバイス・評価ボード 黒字のデータは情報が古いかも〜2012/11/10 更新

個人で購入可能なデバイスや評価ボード,トレーニング・キット,スタータ・キット,デバッガを調べてみました。

CQ出版
・「ディジタル・デザイン・テクノロジ No.8」(定価¥2,980)。78K0R/KC-L(44pin)とUSBブリッジが搭載されたマイコン基板が付いています。簡易書き込みに対応しているので,この基板だけでも動かせます。
秋月電子通商】 2015/10/7 更新
・RL78/G13 64pin(ROM 32KB 250円,64KB 290円,128KB 340円,256KB 400円)
・RL78マイコン搭載変換モジュール(RL78/G13 64pin 128KBを変換基板に搭載したもの 420円)
・E1 12,600円 E1エミュレータ
ASMISネットショップ
・QB-R5F100LE-TB 2,573円(消費税込) RL78/G13(64pin, ROM64K)。E1エミュレータ必要。
・QB-R5F100SL-TB 2,573円(消費税込) RL78/G13(128pin,ROM512K)。E1エミュレータ必要。
・QB-R5F104LE-TB 2,573円(消費税込) RL78/G14(64pin, ROM64K)。E1エミュレータ必要。
・QB-R5F107DE-TB 2,573円(消費税込) RL78/I1A(38pin, ROM64K)。E1エミュレータ必要。
・QB-78K0RKG3L-TB 2,468円(消費税込) 78K0R/KG3-L(ROM128K)。MINICUBE2用。
・QB-78K0RKE3L-TB 2,835円(消費税込) 78K0R/KE3-L(ROM64K)。MINICUBE2用。
・QB-78K0RKG3-TB 2,468円(消費税込) 78K0R/KG3(ROM256K)。MINICUBE2用。
・E1 12,600円 E1エミュレータ
・QB-F14T16-01 5,775円 MINICUBE2用をE1で使用するためのアダプタ。
テセラ】 2012/11/10 更新
・RL78/G14 Stickスターターキット(RL78G14-STICK) ¥5,250(消費税込) RL78/G14(64pin, ROM64K)。E1無しで開発可能。
・RL78/G13 Stickスターターキット(RL78G13-STICK) キャンペーン価格 ¥3,150(消費税込) RL78/G13(64pin, ROM64K)。E1無しで開発可能。(在庫限り)
北斗電子】 2011/8/13 調査時点
・HSB78G13-64B 6,825円(消費税込) RL78/G13(ROM各種)。
デジキー】 2012/11/10 更新
・78K0R/KG3-L(UPD78F1014)搭載ボード+MINICUBE2のセット(英語版) ¥11,652
・RL78/G12, 20pin, \137/1個(ROM8KB)〜\164/1個(ROM16KB)
・RL78/G13, 20pin, \242/1個(ROM16KB)〜\298/1個(ROM64KB)
・RL78/G13, 30pin, \252/1個(ROM16KB)〜\391/1個(ROM128KB)
・RL78/G13, 44pin(0.8pt), \264/1個(ROM16KB)〜\617/1個(ROM512KB)
・RL78/G13, 52pin(0.65pt), \310/1個(ROM32KB)〜\637/1個(ROM512KB)
・RL78/G13, 64pin(0.65pt), \352/1個(ROM32KB)〜\667/1個(ROM512KB)
RSコンポーネンツ】 2012/11/10 更新
・UPD78F1146 (78K0R/KE3, ROM256K) ¥768/1個
・UPD78F1156 (78K0R/KF3, ROM256K) ¥832〜891/1個
・UPD78F1166 (78K0R/KG3, ROM256K) ¥945/1個
・UPD78F1168 (78K0R/KG3, ROM512K) ¥1310〜1430/1個
・QB-MINI2 (MINICUBE2,オンチップ・デバッグ・ツール) ¥11,100/1個
マルツ電波
・QB-MINI2 (MINICUBE2,オンチップ・デバッグ・ツール) ¥9,800/1個
チップワンストップ
・UPD78F1146 (78K0R/KE3, ROM256K) ¥1,280/1個
・QB-78K0RKE3L-TB (78K0R/KE3-L搭載ボード) ¥4,020/1個
・TK-78K0R/KE3L (78K0R/KE3-L搭載,USB,7セグLED付きボード) ¥9,800/1個
・TK-78K0R/KG3 (78K0R/KG3搭載,USB,7セグLED付きボード) ¥9,800/1個
スペースアイ
・漢字表示デモセット2(SM05A2+SM05G2 ) ¥76,860
マイコン技研

 


以前の更新
2018/04/07 [資料室]音声ミドルウエア、データフラッシュライブラリのマニュアルへのリンク追加。
2018/02/12 [gcc(GNURL78): e2studio統合環境、GNURL78コンパイラ]を追加。
2018/02/12 [ハードウエア]"データフラッシュ"を追加。
2017/10/30 [Cコンパイラ]"他コンパイラとの比較(雑談)"を更新。
2017/08/15 [CC-RLコンパイラ]"CS+ for CA, CC78K0Rとの違い"を追加。
2017/07/02 [ハードウエア]"回路設計の手引き"にP137の処置追加。
2017/07/02 [資料室]RL78/G1F 追加。
2017/03/25 [資料室]CS+ for CC関連マニュアル 追加。
2017/03/25 [ツール総合]"開発ツールの種類とダウンロード場所"更新。
2016/10/30 [資料室]RL78/G1D 追加、その他リンク先全面修正(IE11以上必須)
2016/05/08 [資料室]RL78/I1E 追加。
2015/10/07 [デバイス・評価ボード]秋月電子通商更新。
2015/01/31 [資料室]RL78/Iシリーズ2品種追加。
2014/10/14 [資料室]RL78Gシリーズ3品種追加。
2014/05/09 [資料室]PCのシリアルポートを使用した書き込み回路例へのリンク追加。
2014/01/14 [PM+→CubeSuite+移行ガイド]Ver2に関して追記。
2014/01/14 [資料室]CubeSuite+V2.01までのマニュアル追記。
2014/01/12 [資料室]リンク修正(E1エミュレータRL78接続時の注意、秋月電子通商)
2013/10/02 [資料室]評価版ツールのプロダクトIDに関して追記。
2013/09/21 [ツール総合]”致命的障害”を追加
2013/04/18 [資料室]にRL78/G10のマニュアル追加
2012/12/03 [資料室]デバイスファイルのリンク先変更
2012/11/10 [デバイス・評価ボード] 秋月電子通商でのRL78/G13価格追加
2012/11/10 [資料室]にRL78/L13のマニュアル追加
2012/10/29 [資料室]にRL78/G1Cのマニュアル追加
2012/07/08 [C言語スタートアップ・ルーチン] を更新。
2012/07/08 [ソースの表示順序/リンク順序を変更する方法] を更新。
2012/05/13 [注意:デフォルトは「int拡張しない」] を更新。
2012/05/05 [PM+→CubeSuite+移行ガイド] オプションバイト,タブ桁数について追記。
2012/04/29 [PM+→CubeSuite+移行ガイド] ROM化オプションについて追記。
2012/04/29 [資料室]にRL78/G1Eのマニュアル追加
2012/04/02 リンク修正完了(ルネサス旧URL閉鎖対応)。
2012/04/01 [資料室]にRL78/G1A,RL78/L12,RFプログラマのマニュアル追加
2012/03/11 [資料室]にツールニュースへのリンクを追加
2012/03/04 [PM+→CubeSuite+移行ガイド] 日本語ログイン名の場合の対処可能性について追記。
2012/03/04 [ハードウエア]に"端子一覧(RL78/G13:44〜128pin)"を追加。
2012/02/11 [資料室]にターゲット・ボードのマニュアル追加
2012/02/11 [SFR定義場所],[PM+→CubeSuite+移行ガイド]を追加。
2012/01/25 リンク修正完了(ルネサス・ホームページ・リニューアル対応)。
2012/01/22 リンク修正(ルネサス・ホームページ・リニューアル対応)。
2012/01/08 [デバイス・ファイル調査]追加。
2012/01/08 [デバイス・評価ボード]一部更新。
2012/01/08 [ツール総合]"開発ツールの種類とダウンロード場所"を更新。
2011/12/07 [号外]"RL78プレゼントキャンペーン3次募集"を一時掲載
2011/12/04 [ツール総合]"RL78をPM+で開発する方法(挫折中)"を更新。
2011/11/27 [資料室] CubeSuite+ Ver1.01のマニュアルについて注記。
2011/11/20 [ツール総合]"RL78をPM+で開発する方法(研究中)"を更新。
2011/09/25 [資料室]78K0R/Hx3のマニュアルへのリンク追加。[デバイス・評価ボード]更新。
2011/08/13 [デバイス・評価ボード]更新。
・・・・略・・・・
2010/08/11 増築