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 [ハードウエア]”低電圧メインの落とし穴”を追加。
〜〜〜 補足 〜〜〜
- 【開発ツールの種類とダウンロード場所】 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をインストールしてみました。
- インストール
インストールの最初の画面に,事前にインストールすべきソフトが表示されるので,それに従ってください。
CubeSuite+のVer2ではMicrosoft .NET Framework 4 と 言語パック および Microsoft Visual
C++ 2010 SP1 のランタイムライブラリが必要になりました。Visual C++ Express 2010(リンク先から選択) をインストール済みなら、CubeSuite+がすぐにインストールできます。
CubeSuite+Ver1.0では,Visual C++ Express edition 2008 をインストール済みなら,下記は不要ですぐにCubeSuite+がインストールできます。
i)WindowsXP,Vistaの場合のみ:MS .NET Framework 3.5 SP1
ii)WindowsXP,Vistaの場合のみ:同上 日本語パック
iii)WindowsXP〜7:Visual C++2008 SP1 再頒布可能パック(x86)
なお,パソコンのログイン名が日本語だと上記iiiのところではじかれます。
もしかしたら Visual C++ Express edition 2008 ならインストール可能かもしれませんので,試す価値はありそうです。
- プロジェクト・ファイルの移行
CubeSuite+の「ファイルを開く」画面の右下にファイルタイプを指定するところがあります。ここでPM+用を指定すれば,旧プロジェクト・ファイル(*.prw,*.prj)を開けます。ただしPM+にあった品名変更機能は無いようなので(不詳),品名を変えたい場合は,先にテキスト・エディタ等で*.prj内のDevice=uPD78Fxxxx_yyの部分を書き換えておく必要があります。
・xxxx:品名下4桁です。
・yy :ピン数です。100ピンはA0,128ピンはC8,144ピンはE4です。
なお,デバッガの指定は再設定が必要です。
プロジェクトを開くと,端子配置ツールやコード生成ツールも開きますが,全て閉じて構いません。
- 操作上の差異
@デバッガの設定
「プロジェクトツリー」→「78K0Rシミュレータ」を右クリックし,「使用するデバッグ・ツール」からMINICUBE2エミュレータを選択します。
次に「プロジェクトツリー」→「78K0R MINICUBE2」を左クリックすると「プロパティ」が開きます。この中でクロックの設定や,ターゲット・ボードとの接続を設定します。特にデフォルトではターゲットとの接続が2線式になっているので,1線式に変更します。
なお,場合によっては,NIMICUBE2のファームウエア・アップデートが必要かもしれません。本ページ資料室のデバッガのダウンロード・ページからアップデート用ファイルを取得してください。
Aコンパイラ・オプション等の設定
「プロジェクトツリー」→「CA78K0R(ビルド・ツール」を左クリックすると「プロパティ」が開くので,ここで各種オプション設定を行います。タブでコンパイラやアセンブラ,リンカなどの設定画面が切り替わります。
移行点1:PM+プロジェクト・ファイルから読み込んだ場合,ユーザー・オプションバイトは反映されないので,リンクオプション・タグのユーザー・オプションバイト欄で指定します。
移行点2:PM+のCC78K0Rでは常にROM化ルーチンが組み込まれていましたが,CubeSuite+ではオプション指定になりました。「良く使うオプション(ROM化プロセッサ)」の「ROM化オブジェクト出力」を”はい”に設定します。設定しないと初期値付き変数の初期値をロードするプログラムが組み込まれません(デバッガで起動する場合は,デバッガが代わりにロードしてくれるので動きますが,デバッガを外して単体で動かすことが出来ません)。
また,デバッガを外してマイコン単体で動かす場合は,ビルドしたヘキサファイルをRFP(ルネサス・フラッシュ・プログラマ)で書き込みます。
Bソースの順序の変更,タブ桁数
順序を変更したい場合は「プロジェクトツリー」の中で,移動したいソースを左クリックで掴んで移動先で離します。ただしこれでは表示順序は変わりますが,リンク順序が変わりません。リンク順序を変えるには,「ビルドツール(右クリックメニュー)」→「リンク順を設定する」で変更します。
PM+ではタブは4桁がデフォルトでしたが,CubeSuite+では8桁になっています。4桁にするには「ツール」→「オプション」→「表示」のタブ桁数を変更します
Cヘルプの表示
プロジェクトを開く前は「ヘルプ」→「ヘルプ」で全てのデバイスのヘルプが出ます。
プロジェクトを開くと,その品種だけのヘルプになります。
なお,C言語の基本的な文法ヘルプは無くなりましたので,必要ならPM+用の資料(Cコンパイラ(CC78K0R Ver2.0)言語編 (PDF))を参照してください。バージョンが異なるだけで,CubeSuite+もCC78K0Rを呼び出しています。
- 【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(スタータキット)を使用)
- 【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使わなくても同じ。 |
- 【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]
- 【関数へのポインタ変数】 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の操作に使う。
- 【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 追加
-
- Cレジスタの内容をBレジスタへ1クロックで移動
SHLW BC, 8
- Aレジスタの内容を1クロックで符号付き16ビットに拡張してAXに格納
SARW AX, 8
- Aレジスタの内容を1クロックで符号無し16ビットに拡張してAXに格納
SHRW AX, 8
- 【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とのソース互換性のためにはやむを得ない措置なんでしょう。
- 【ボーレート設定の落とし穴】 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の2n分周,それ以外を選択した場合は32MHzの2n分周への変更が可能です。 |
最低動作電圧 |
従来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 追加
- 【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がちゃんと発表されたのでうがった見方でしたかね。
以下は手作業の場合の手順です。自動化ツール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プログラマーなどで直接マイコンに書き込むか,
デバッガでダウンロードすれば動作します。
とりあえずヘキサ追加ツールを作るのに十分なだけ調査しました。#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 |
|
|
|
定義の本体が以下続く(まずはシンボル定義から) |
〜〜〜 一般図書 〜〜〜
- 「ディジタル・デザイン・テクノロジ No.8」 CQ出版,¥2,980 2011/1/21 追加
〜〜〜 デバイスのマニュアル類 〜〜〜
マイコンのデータシートは,最近ではユーザーズ・マニュアルと一緒になっています(以前はデータ・シートとユーザーズ・マニュアルは分かれていましたが)。電気的特性を見たい方は,ユーザーズ・マニュアルの後ろの方を見てください。
(注)下記のPDF表示は「PDFダウンロード画面へのリンク」の意味です。IE11以上でないと当該ページが出ません。
- 78K0R/Kx3 ユーザーズ・マニュアル(78K0R/KE3
(PDF),78K0R/KF3
(PDF),78K0R/KG3
(PDF),78K0R/KH3
(PDF),78K0R/KJ3
(PDF) )
- 78K0R/Kx3-L ユーザーズ・マニュアル(78K0R/KC3-L,78K0R/KD3-L,78K0R/KE3-L,78K0R/KF3-L,78K0R/KG3-L)(PDF) 2011/4/2 更新
- 78K0R/Hx3 ユーザーズ・マニュアル(78K0R/HC3,78K0R/HE3,78K0R/HF3,78K0R/HG3)
(PDF) 2011/9/25 追加
- 78K0R/Kx3-L ユーザーズ・マニュアル[USB内蔵品](78K0R/KC3-L,78K0R/KE3-L)
(PDF)
- 78K0R/Ix3 ユーザーズ・マニュアル[インバータ制御](78K0R/IB3,78K0R/IC3,78K0R/ID3,78K0R/IE3)
(PDF) 2011/6/26 追加
- 78K0R/Lx3 ユーザーズ・マニュアル[LCDドライバ内蔵品](78K0R/LF3,78K0R/LG3,78K0R/LH3) (PDF) 2011/6/26 追加
- 78K0Rユーザーズ・マニュアル(78K0R 命令編)
(PDF) 2011/4/2 更新
- RL78/G1x パンフレット(RL78/G12,RL78/G13)
(PDF)
- RL78/G1x ユーザーズ・マニュアル(RL78/G10 (PDF),RL78/G12
(PDF),RL78/G13
(PDF),RL78/G14
(PDF) ,RL78/G1A (PDF) ,RL78/G1E (PDF),RL78/G1F (PDF)),RL78/G1G (PDF)),RL78/G1N,G1M (PDF直)) 2023/11/10 G1N追加
- RL78/G1x ユーザーズ・マニュアル[USBホスト/ファンクション内蔵品](RL78/G1C
(PDF)) 2012/10/29 追加
- RL78/G1x ユーザーズ・マニュアル[BLE(ブルートゥース・ロー・エナジー)内蔵品](RL78/G1D (PDF), RL78/G1Dモジュール (PDF)) 2016/10/23 追加
- RL78/G2x ユーザーズ・マニュアル(RL78/G22 (PDF直), RL78/G23 (PDF) (PDF直) 2023/11/10 追加・更新
- RL78/I1A ユーザーズ・マニュアル[インバータ制御](RL78/I1A (PDF),
(同正誤表PDF) ) 2011/6/20 更新
- RL78/I1B ユーザーズ・マニュアル[メータ用](RL78/I1B (PDF) ) 2015/1/31 更新
- RL78/I1D ユーザーズ・マニュアル[センサ応用](RL78/I1D (PDF) ) 2015/1/31 追加
- RL78/I1E ユーザーズ・マニュアル[高精度計測用](RL78/I1E (PDF) ) 2016/5/8 追加
- RL78/L1x ユーザーズ・マニュアル[LCDドライバ内蔵品](RL78/L12 (PDF),
RL78/L13 (PDF),RL78/L1A (PDF),RL78/L1C (PDF) ) 2018/9/19 L1A追加
- RL78 ユーザーズ・マニュアル(ソフトウエア編)
(PDF) 2011/6/20 更新
〜〜〜 ミドルウエア、サンプルソフト等のマニュアル 〜〜〜 2018/4/7 追加
- RL78 ファミリ 音声録音・再生システム(独自ADPCM コーデック) M3S-S2-Tiny: 導入ガイド (PDF)
- 【注意事項】 RL78ファミリ 音声録音・再生システム (独自ADPCMコーデック) M3S-S2-Tiny V.3.04 Release 00
(PDF)
- RL78ファミリ データ・フラッシュ・ライブラリ Type04 ユーザーズマニュアル (PDF)
- RL78ファミリ セルフプログラミングライブラリ セルフRAMリスト (PDF)
〜〜〜 ターゲット・ボードのマニュアル類 〜〜〜 2012/2/11 追加
注:MINICUBE2用をE1で使用する場合は,別売QB-F14T16-01が必要。
- QB-R5F100LE-TB RL78/G13(64KB,64pin,標準版) E1用
(PDF)
- QB-R5F100SL-TB RL78/G13(512KB,128pin,標準版) E1用
(PDF)
- QB-R5F104LE-TB RL78/G14(64KB,64pin,高機能版) E1用
(PDF)
- QB-R5F10ELE-TB RL78/G1A(64KB,64pin,アナログ拡張版) E1用
(PDF)
- QB-R5F107DE-TB RL78/I1A(64KB,38pin,照明/電源制御版) E1用
(PDF)
- QB-78K0RKG3-TB 78K0R/KG3(256KB,100pin,標準版) MINICUBE2用 (PDF)
,(入門)
,(実践)
- QB-78K0RKG3L-TB 78K0R/KG3-L(128KB,100pin,低消費電力版) MINICUBE2用 (PDF)
- QB-78K0RKE3L-TB 78K0R/KE3-L(64KB,64pin,低消費電力版) MINICUBE2用 (PDF)
- QB-78F1026-TB 78K0R/KE3-L(128KB,64pin,USB版) MINICUBE2用 (PDF)
- QB-78K0RIE3-TB 78K0R/IE3(64KB,64pin,インバータ制御版) MINICUBE2用 (PDF)
- QB-78K0RHG3-TB 78K0R/HG3(256KB,100pin,高機能版) MINICUBE2用 (PDF)
- QB-78K0RLH3-TB 78K0R/LH3(128KB,128pin,LCD版) MINICUBE2用 (PDF)
〜〜〜 ツールのマニュアル類4 (CS+ for CC環境) 〜〜〜 2017/3/25 追加
- 統合開発環境 CS+ V5.00.00 ご使用の前に(PDF)
- CS+ V5.00.00 統合開発環境 ユーザーズマニュアル アップデータ編[CS+ for CC](PDF)
- CS+ V3.00.00 統合開発環境 ユーザーズマニュアル インストーラ編[CS+ for CC](PDF)
- CS+ V5.00.00 統合開発環境 ユーザーズマニュアル プロジェクト操作編[CS+ for CC](PDF)
- CS+ V4.00.00 統合開発環境 ユーザーズマニュアル エディタ編[CS+ for CC](PDF)
- CC-RL コンパイラ ユーザーズマニュアル(PDF)
- CS+ 統合開発環境 ユーザーズマニュアル CC-RL ビルド・ツール操作編(PDF)
- CS+ V5.00.00 統合開発環境 ユーザーズマニュアル RL78 デバッグ・ツール編[CS+ for CC](PDF)
- CS+ V5.00.00 統合開発環境 ユーザーズマニュアル メッセージ編[CS+ for CC](PDF)
- CS+ V5.00.00 統合開発環境 ユーザーズマニュアル Pythonコンソール編[CS+ for CC](PDF)
- CS+ V3.02.00 統合開発環境 ユーザーズマニュアル 解析ツール編[CS+ for CC](PDF)
- E1/E20エミュレータ ユーザーズマニュアル(PDF)
- E1/E20エミュレータ, E2エミュレータLite ユーザーズマニュアル別冊 (RL78接続時の注意事項)(PDF)
- Renesas Flash Programmer V3.02 フラッシュ書き込みソフトウェア ユーザーズマニュアル(PDF)
〜〜〜 ツールのマニュアル類1 (PM+環境およびエミュレータ) 〜〜〜 2012/2/11 E1追加
- 統合開発環境(PM+ Ver6.3)ユーザーズ・マニュアル
(PDF)
- Cコンパイラ(CC78K0R Ver2.0)言語編
(PDF)
- Cコンパイラ(CC78K0R Ver2.0)操作編
(PDF)
- アセンブラ・パッケージ(RA78K0R Ver1.2)言語編
(PDF)
- アセンブラ・パッケージ(RA78K0R Ver1.2)操作編
(PDF)
- 統合デバッガ(ID78K0R-QB Ver3.61) 操作編
(PDF) 2011/1/21 更新
- MiniCube2(QB-MINI2)ユーザーズ・マニュアル
(PDF)
- QB-Programmer (MINICUBE2など用書き込みソフト)操作編 (PDF)
- RF-Programmer (E1, MINICUBE2など用書き込みソフト)ユーザーズ・マニュアル (PDF) 2012/4/1 追加
- E1エミュレータ ユーザーズ・マニュアル
(PDF)
- E1エミュレータ ユーザーズ・マニュアル別冊(RL78接続時の注意事項)
(PDF) 2014/1/12 リンク修正
- E1エミュレータ ユーザーズ・マニュアル別冊(78K0R接続時の注意事項)
(PDF)
〜〜〜 ツールのマニュアル類2 (旧版CubeSuite環境) 〜〜〜 2012/1/22 下記はCubeSuite+ではありません
- CubeSuite Ver.1.40 統合開発環境 ユーザーズマニュアル 起動編
(PDF)
- CubeSuite Ver.1.40 統合開発環境 ユーザーズマニュアル 解析編
(PDF)
- CubeSuite Ver.1.40 統合開発環境 ユーザーズマニュアル 書き込み編
(PDF)
- CubeSuite Ver.1.40 統合開発環境 ユーザーズマニュアル メッセージ編
(PDF)
- CubeSuite Ver.1.40 統合開発環境 ユーザーズマニュアル 78K0R 設計編
(PDF)
- CubeSuite Ver.1.40 統合開発環境 ユーザーズマニュアル 78K0R デバッグ編
(PDF)
- CubeSuite Ver. 1.00 統合開発環境 78K0R コーディング編
(PDF)
- CubeSuite Ver. 1.00 統合開発環境 78K0R ビルド編 (PDF)
〜〜〜 ツールのマニュアル類3 (CubeSuite+(プラス)環境) 〜〜〜 2014/1/14 V1.03〜2.01のリンク追加
(注)下記のPDF表示は「PDFダウンロード画面へのリンク」の意味です。
〜〜〜 関連ページへのリンク 〜〜〜
- 78K ラインナップのページ
- RL78 ラインナップのページ
- 開発ツールのページ(RL78,
78K0/K0R) 2016/10/30 更新
- PM+版フリーツール(78K0R用Cコンパイラ[CC78K0R],アセンブラ・リンカ・PM+[RA78K0R])のダウンロード・ページ 2016/10/30 更新
インストールに必要なプロダクトIDは以前はメールで配信されていましたが、現在は上記ページのRA78K0R_readme_j.txt, CC78K0R_readme_j.txtで公開されています
(RA78K0R:00001750E,CC78K0R:00001426D)。
- CS+版フリーツール、e2studioのダウンロード・ページ 2016/10/30 更新
- gcc(GNURL78)ダウンロードのためのGNU toolsページ 2018/2/12 追加
- デバッガ(MiniCube2関連ソフト) ID78K0R-QB 2016/10/30 更新
- デバイス・ファイルのダウンロード・ページ (
K0R/Kx3,
K0R/Kx3-L,
K0R/Kx3-L(USB),
K0R/Kx3-A,
K0R/Kx3-C,
K0R/Hx3,
K0R/Ix3,
K0R/Lx3,
K0R/Fx3,) 2016/10/30 更新
- パラメータ・ファイル(MiniCube2用)のダウンロード・ページ (
K0R/Kx3,
K0R/Kx3-L,
K0R/Kx3-L(USB),
K0R/Kx3-A,
K0R/Kx3-C,
K0R/Hx3,
K0R/Ix3,
K0R/Lx3,
K0R/Fx3,) 2016/10/30 更新
- PCのシリアルポートを使用した書き込み回路例(PDF) 2014/5/9 追加
- 簡易書き込み回路・ソフト(ダウンロード・ページ) 2012/1/25 更新
●デバイス・評価ボード 黒字のデータは情報が古いかも〜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 増築