R8CM/11A,R8CM/12A ライター

100円のマイコンと言えば、アトメルのAVRマイコン、ATtiny2313 が有名です、128バイトのデータメモリー、2キロバイトのプログラムメモリー、128バイトのEEPROM、最大20MHz動作(2.7V~5V)と、gccで開発出来て、非常にコストパフォーマンスに優れたマイコンです、ちょっとした制御ならこのデバイスで何とかなる為、非常に重宝してきました、ライターも非常に多くの書き込み機が存在し、手軽に買えるし、自作する事も出来ます。

最近、秋月電子通商で、ルネサスエレクトロニクスのR8C/M11A,R8C/M12Aがラインナップに追加されました、どちらも100円で、AVR が霞んでしまうほど素晴らしいスペックで、とても興味が湧きました~、それで早速2個づつ入手して、何か作ってみる事にしました。
※現状ではまだ情報が少ないようですね・・

まず、スペックですが、印象的に以下のような所が気に入りました。
・データメモリーが倍(2313では128バイトですが、256バイト使えます)
・フラッシュメモリーが2キロバイト(2313は128バイト)
・掛け算命令や積和演算命令を持っている
・14ピンと20ピン DIP タイプ(自作では、ちょっとした物を作る場合、非常に好都合)
・プログラムをシリアルインターフェースと簡単な回路だけで書き込める(ルネサスのFDTツールなど)
・gcc も使える(プログラム領域が2キロしか無い為、ルネサスの C も、実質制限無く使えると思います)
・2.7V~5.5Vで20MHz動作(1.8V~だと5MHz動作)
・書き換え回数10000回
・10ビットA/Dコンバーター内蔵
・豊富な機能(タイマー、割り込み、コンパレーターなどなど)
・内蔵発振機も使える
・省電力機能

今まで、ルネサス系で弱いと思っていた部分が殆ど改善されていて、ほぼスペック的には文句無しです、これなら、AVR(2313) で弱いと思っていた部分をカバー出来るのではと思います。

まず最初に用意するのは開発環境です、HEW 上、ルネサスの R8C 用コンパイラは、登録すればダウンロードでき、R8C 版はバイナリーサイズが 64K バイト以下なら、試用期間を過ぎても無償で使えるようです、自分は gcc が好きななので、KPIT の R8C 用 gcc ツールチェインをダウンロードしました(登録が必要)。

次にライターですが、シリアル入出力を接続して、モードピンを「L」にしてリセットすれば、専用アプリケーションで書き込みが出来るので、とても簡単です、参考回路はハードウェアーマニュアルに書いてあります。

とりあえず、FDT を使って認識するとこまで出来ました。

次はいよいよサンプルプログラム(多分 LED チカチカ)ですが、I/O 関係の定義ファイルが無い為、現在打ち込んでます(泣)
一応、どこかに誰かが作ってないか調べたけど無いようでした・・

SH7125 モニター改修などなど

・SH7125 関係、アーカイブにアセンブラソースが抜けていたので、再収集。
・SH7125 の Flash ROM 書き換え回数制限の問題で、RAM上でプログラムの動作確認を行う件、多少進展。

RAM 上にロードしたプログラムから、ROM 上の関数を呼ぶ場合に、ROM 上の実アドレスなどが必要なのだが、どのように解決するか、少し考えて、その仕組みを実装してみた。
リンク時に作成される「map」ファイルを sed(ストリームエディター)で加工して、シンボルとそれに対応するアドレスを取り出し、アセンブラソースコードを自動生成する。
※以前、会社勤めの時に HP の unix システムを使った事があるが・・、そこで sed の面白さと出会った、今まで随分お世話になっている、今でもそれは変わらず、テキストの加工、成形には重宝している、その為、ed や ex といった unix システムに標準であるラインエディターは今でも使えるし、emacs が使えない場合等に、使う事が多い。(逆に vi のキーバインドは知らないので使えない・・)

マップファイルには、アドレスとシンボルの対がリストされている。
0x00000000000025b0 sh7125_sci_getch

----- sed スクリプト start
/^$/d
/^ \./d
/0x/!d
/^ /!d
/[()]/d
/ _/d
/0x000000000/!d
s/0x000000000/0x0/
/vectors/d
/start/d
/main/d
/set_imask/d
/get_imask/d
s/^ *\(0x[0-9a-fA-F]*\) *\([a-zA-Z0-9_]*\)$/ .global _\2NNN_\2:NNN mov.w _\2_,r0NNN jmp @r0NNN nopNNN_\2_:NNN .word \1NNN/
/^ /d
s/NNN/\
/g
----- sed スクリプト end

↑の sed スクリプトで、以下のソースを生成。
※map ファイルで余分な行を除外してから成形して1行にまとめて、最後に改行を入れている。
※改行をマークする文字列として、「NNN」を使っているので、シンボルに「NNN」を含めると問題となる・・

.global _sh7125_sci_getch
_sh7125_sci_getch:
mov.w _sh7125_sci_getch_,r0
jmp @r0
nop
_sh7125_sci_getch_:
.word 0x000025b0

↑こんな感じに成形される~

ROM内の関数を呼ぶ場合には、このインターフェースクラスを通る事で、オーバーヘッドがあるが、まぁそれは利便性を考えると許容出来る範囲と思える。
RAM 上のプログラムでは、このアセンブラソースをアセンブルしてリンクする事で、そのままのシンボル名で呼び出せる。
※ROM 内関数のアドレスが32K(0x7fff)を超えたら、テーブルは32ビットで持つ必要があるので、このままでは不十分となる。
※関数にはRAM を使う必要もあるが、それは、0xffffbd00 から256バイトが使われている、自分のシステムで問題となるなら、リンカースクリプトを変更する必要がある。

このスクリプトなどソースコード一式は、ここに置いてある。