R8C はじめに
3年の野暮用が終わって、また何かをしようと考えています。久しぶりに電子回路情報を見ると愛用していたattiny2313が出世していて驚きました。
R8C/M12Aの記事が目について、少し触ってみようかとなりました。値段が安いこと、DIPで扱い易いこと、特別な書き込み機が必要でないこと、それと手を加えれば隠しメモリが使えること、などがその理由です。
しかし、調べているうちにAVRのようには単純でなく、私のしたいオンボードプログラミングには問題があるらしいので早々に挫折するかも知れません。
なお、いろいろなデータを見ていますと私は数年遅れているようで、みなさんは5、6年前にこのデバイスを使っておられるようです。
1 環境の整備
2 Lチカ--初めの一歩 2015.04.08
3 Lチカその2 -- 少し進歩 2015.04.11
1 環境の整備 2015.04.08
必要なハードウエアについて:
正式には純正のライタを使うようですがアマチュアには1万数千円のものは使えません。やや不便なようですがUARTのTXDとRXDがあればデバイスの端子をスイッチで切り替えて書き込めることがわかりました。
しかし、RS232Cは電圧はともかく確か負論理だったと思います。USB-シリアルの変換器でも使えるとありましたが、これは正論理のはずです。そのところの解説はウエブではわからなかったのですが、RS232Cとの簡易変換器にトランジスタ1石を使うものが見つかりました。これなら負論理が正論理に変わるので。USB-シリアルの変換器で使えるだろうと判断しました。
手元には、FT232RL使用のもの、PIC18spx使用のもの、cp2102使用のもの(いずれも自作品)がありますので、そのうちの5V・3.3Vトレタントな、cp2102使用のものを使おうと考えました。もともとXPだったのですが、現在のWIN8.1でも認識されました(昔はドライバが無くて困ったものでしたが)。
ソフトウエアについて:
ウエブで調べていると、プログラムエディタ・コンパイラは
統合開発環境 High-performance Embedded Workshop V.4.09.01 フルアップデート、
【無償評価版】M16Cシリーズ, R8Cファミリ用Cコンパイラパッケージ M3T-NC30WA V.5.45 Release 01
を準備しました。
書き込みソフトについては、FDT4.09を使うと良いという記述と、これではうまく行かないから Flash Starter を使うことにしました。
なお、uartのTXD,RXDだけを使い、MODE端子の切り替えとリセット端子の使用による書き込みでは、UARTのTXDをR8CデバイスのRXD(15番端子)につないでいる報告と、プログラム時には14番端子につなぐ報告とがありますが、後者の14番端子が正解のようです。後述しますが、この書き込み方法では水晶が必要と書かれていたページが有りますが、水晶を付けないと書き込めないようでした(再度の確認が必要ですが)。
(2015.04.11) FDTとしばらくの間格闘して(?)、ようやく機能がわかってきました。プロジェクトごとに設定をせねばなりませんが、プロジェクトをうまくまとめると手間は少ないようです。速度も速いようです。まだ、小さなものしか扱っていませんが。
2 Lチカ--初めの一歩 2015.04.08
いくつかのサイトを見せていただき、ソースファイルもそのまま戴いて試行錯誤の末にどうにかLEDが点滅してくれました。
/***********************************************************************/
/* */
/* FILE :led2.c */
/* DATE :Tue, Apr 07, 2015 */
/* DESCRIPTION :main program file. */
/* CPU GROUP :M12A */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.19). */
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/***********************************************************************/
#include "sfr_r8m12a.h"
void main(void);
void main(void){
volatile int i, j;
// ポート1の1bit目を出力に設定
pd1_0 = 1;
while(1){
// ポート1の1bit目をHIGH
p1_0 = 1;
for(i = 0; i < 1000; i++){
for(j = 0; j < 3; j++);
}
// ポート1の1bit目をLOW
p1_0 = 0;
for(i = 0; i < 1000; i++){
for(j = 0; j < 3; j++);
}
}
}
最初は、水晶を付けないで書き込みを試みました。Flash Starterを起動して、COM番号を指定して、つながるとボーレート9600とウエイト40msの確認を求めてきます。OKを押してもそのボーレートではつながらないと返ってきます。何度か繰り返した後に10MHzの水晶をつけると次に進みました。
このソフトは入力を受け付けると画面が消えて、不安のうちに待っていると次が表示されます。なんとも気味の悪いソフトです。LOADボタンを押して待っては見るのですが時間がたっても画面は変わりません。隣のprogramを押すとOKの表示が出たのでライタを外してMODEを切り替えるとLEDが点滅しました。
成功!・・・なのですがなんだか騙されたみたいでスッキリしません。
水晶が必要だとすると、組み立ててからプログラムを作ってゆく私の方法が使えないのではないかと不安になります。完成したプログラムを多数かき込む方法なら書き込んでから実装すればよいのですから問題はないでしょうが。
なお、MODEの切り替えはresetの状態で、と書かれていますが、そうしないと(切り替えてからresetでは)どうなるのか、今はわかりません。 今はデメリットが多くて不安ですね。
3 Lチカその2 -- 少し進歩 2015.04.11
HEWとFDTにすこしずつ慣れてきました。
今回のもくろみは @内部クロックを125kHzの低速から20MHzの高速に変更すること、A時間かせぎをforループからdeley関数にもっていけないか調べること、にありました。どこに、どのような関数・手続きがあるのか全くわからないので、とにかくWEBを頼りにあたって探すことにしました。ルネサスのアプリケーションノートに少し説明があるのですが、コードが書かれていないので「ここで少し時間をまつ」と書かれても何のことだかわかりません。
色々と探して、下記のプログラムのようなコードを知りました。しかし、元はレジスタ名(?)などが大文字で書かれていましたが、私のHEWでは小文字でないとエラーになりました。インラインアセンブラも、 __asm_("nop") を asm("nop") としなければ通りませんでした。理由はわかりません。
もう一つのdelayは、クロックを高速にするとforループでは大きく回さねばならないので探したところです。下のプログラムのルーチンを頂戴しました。内容からクロックによって変わるのではないかと思い、125kHzの低速クロックで動かすと比例して長くなることがわかりました。それで名をdelay20.hと20をつけています。
/***********************************************************************/
/* */
/* FILE :led4.c */
/* DATE :Sat, Apr 11, 2015 */
/* DESCRIPTION :main program file. */
/* CPU GROUP :M12A */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.19). */
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/***********************************************************************/
#include "c:\R8C\lib\sfr_r8m12a.h" ← パスを書いておくと個々のフォルダに
#include "c:\R8C\lib\delay20.h" 置かなくてもよいようだ。
HEWのincludeファイルのディレクトリを設定
void main(void); すれば良いことがわかった。pathは不要。
void clock_int20mhz();
void main(void){
volatile int i, j;
// ポート1の1bit目,7ビット目を出力に設定
pd1_0 = 1;
pd1_7 = 1;
clock_int20mhz();
while(1){
// ポート1の1bit目をHIGH
p1_0 = 1;
p1_7 = 0;
delay_msec(1000); ← 1000ミリ秒=1秒 待つ
// ポート1の1bit目をLOW
p1_0 = 0;
p1_7 = 1;
delay_msec(1000);
}
}
void clock_int20mhz() ← 高速クロック20MHzに変更する手続き
{
prc0 = 1; /* unlock clock control registers */
xrcut = 1; /* purge XIN-XOUT feedback registor */
hocoe = 1; /* start high-speed on-die oscillator */
asm("nop");
asm("nop");
asm("nop");
asm("nop");
hscksel = 1; /* high-speed clock source is on-die oscillator */
scksel = 1; /* system clock is high-speed one */
locodis = 1; /* stop low-speed on-die oscillator */
prc0 = 0; /* protect clock control registers */
} ← プログラムのおわり
delay20.h
//********************************************************************************
extern void delay_1usec();
extern void delay_usec(int cnt);
extern void delay_1msec();
extern void delay_msec(int cnt);
//********************************************************************************
//www8.plala.or.jp/InHisTime/H8-005/voltmeter_v1_00.lzh ← ここから戴きました。
delay20.c
//********************************************************************************
#include "sfr_r8m12a.h"
#include "delay20.h"
//********************************************************************************
void delay_1usec()
{
msttrj = 0;
trj = 20;
tundf_trjcr = 0;
tstart_trjcr = 1;
while (tundf_trjcr != 1) {
}
tstart_trjcr = 0;
}
//********************************************************************************
void delay_usec(int cnt)
{
int i;
//
for(i = 0; i < cnt; i++) {
delay_1usec();
}
}
//********************************************************************************
void delay_1msec()
{
msttrj = 0;
trj = 20000;
tundf_trjcr = 0;
tstart_trjcr = 1;
while (tundf_trjcr != 1) {
}
tstart_trjcr = 0;
}
//********************************************************************************
void delay_msec(int cnt)
{
int i;
//
for(i = 0; i < cnt; i++) {
delay_1msec();
}
}
//********************************************************************************
HEWでコンパイルするとき、delay.cを「ファイルを追加」で取り込んでおき、「すべてをビルド」すると問題なく.motファイルが出来るようです。
書き込み操作をしやすいように、modeスイッチを別にして、また、ブレッドボードの汎用性を考えて4本脚のアダプター(RD、TD、MODE、GND)を作りました。
FDTでの書き込みでは、デバイスの接続を確認して、書き込みを行って、デバイスを切断する、という3ステップがよいように思います。
工事中