断片的知識
断片的にもR8C/M12Aについて知り得たことをメモすることにします。不勉強で誤解があるかの知れません。
デバイスのID2015.08.13 2015.04.19 2015.04.08
includeファイルの場所 2015.04.12
電源スイッチとリセット 2015.04.24
ソフトウエア割り込みベクタ 2015.04.25
メモリ拡張 HEW 2015.05.03
RTC(DS3232) 1Hz 2015.06.25
システムクロックを内蔵20MHzにする 2015.07.14
システムクロック 18.432MHzに 32分周 取り出し 2015.07.16
システムクロック分周 ややこしいレジスタ 2015.07.18
デバイスのID:FlashStaで書き込みを行うとき、IDを求められる。新品のデバイスはIDがない。IDを一度書き込むと、同じIDを指定しないとプログラムを書けないだけでなく、消去することもできない。.motと同じフォルダに.idファイルがあればその値が使われる。通常はFFが7バイトのようであるが変更しないほうが良いのだろう。アマチュアには不要のものだ。要注意。
2015.04.19 IDの読み出しとリセットする方法が見つかりました。いずれもsenshuさんの掲示板からの情報です。
「ゆきの研究室」で作られた r8cprog-GUIにsenshuさんが改良を加えて r8cprog-150419.zipとして公開されています。この版から、ID不明のチップを、IDを含めて全消去できる機能が付けられました。
また、これに同梱されている r8cprog.exe を使って、
r8cprog -d R5F2M120 -P COM4 -s 9600 -V
を実行するとIDが読み出せます。(メーカーは「IDを忘れるとメーカーでも対応できない」と言いますが)
2015.08.13 メーカーのいうようにIDを忘れると変更不可となるケースがあるようです。
「OFSのコードプロテクトが有効になっていて、格納IDが不明な場合には、どんなに頑張っても消去も書き込みを何もできない状態となり、事実上、デバイスを捨てる事になると思います。」(hira_kuni_45さん)
オプション機能選択レジスタ(OFS)−−SFRではなくROMにある−−b3がROMコードプロテクトビット(ROMCP1)で、これをセット(0に)すると格納されたID以外は使えなくなる。OFSはデフォルトでffHである。
all FFで使うのが良いが、もしIDを設定したければ、
「プロジェクトタイプ に Application を使い、
sect30.incファイルの .id "#FFFFFFFFFFFFFF" を .id "#1234567890abcd"
のように変更して、mainプログラムでは何も書かない。
とします。
なお、IDをall FFに戻したければ、
r8cprog-GUIの ALeRASE を選んで、Chip Erase すれば工場出荷状態に戻せる
ことになります。
includeファイルの場所:includeファイル(.h .c)はpathが通っているディレクトリに置いても探してくれません。HEWにその置き場所を指定する必要があります。
HEWを開いて、メニュー「ビルド」→「RENESAS M16C STADARD Toolchain...」を開き、「オプション項目」に"インクルードファイル検索ディレクトリ"を選択して、追加ボタンを押して、「ディレクトリ(D)」の窓に希望のディレクトリを選びます。
電源スイッチとリセット:プログラムでリセット端子をIO端子に変更することができます。そのプログラムを書き込んだチップはリセットスイッチが意味をなしません。プログラムを書き込む時にリセットスイッチを押すことが無意味になっています。このときは、
電源を切り、MODEスイッチをプログラムに切り替えて、電源スイッチを入れ、すぐに書き込みを始める
という操作になります。実験回路では手元に電源スイッチがあると便利です。
[追記]電源スイッチとシリーズにノーマルオン(プッシュオフ)のマイクロスイッチを付けました。レバー付きで操作が軽く快適です。モード切り替え→SWプッシュ→書き込み→モード切り替え→SWプッシュ と操作しています。
ソフトウエア割り込みベクタ:webでいただいたプログラムの.motファイルは素直に動いたのですが、ソースファイルをビルドするとエラーはないのですがUARTの受付をしてくれません。散々悩んだ挙句、割り込みルーチンにベクタ番号を付け加えると正常になりました。赤文字の部分です。
#pragma INTERRUPT interrupt_uart0_recv(vect=18)
void interrupt_uart0_recv(void)
{}
主なベクタ番号は次のとおりです。
フラッシュレディ 1
コンパレータB1 4
コンパレータB3 5
タイマRC 7
キー入力 13
A/D変換 14
UART0送信 17
UART0受信 18
INT2 21
タイマRJ2 22
周期タイマ 23
タイマRB2 24
INT1 25
INT3 26
INT0 29
メモリ拡張 HEW
HEWを立ち上げて、「ビルド」メニューから「Renesas M16C Standard Toolchain」を開きます。次に、「リンカ」タブを開き、「セクション」を選びます。現れるリストの 3段中の2段目の 0x0000E000 を 0x00008000 に変更します。これはワークスペースを新規作成する時に毎回必要です。
すなわち、R8C/M12Aのメモリを拡張するときは
(開始アドレスを)
1.2kB RAMでは
0x0300に、
32kB ROMでは
0x8000に
変えることになります。
RTC(DS3232)1Hz-SQW
INT/SQWピンから1HzのSQWを取り出すにはコントロールレジスタの設定が必要です。
0Eh番地のcontrol registerに 0x00 を書きます。
0Eh EOSC BBSQW conv RS2 RS1 INTCN A2IE A1IE
osc_on, 電池バックアップ時信号 温度変換 sqw設定 sqw設定 アラームINT アラーム2 アラーム1
システムクロックを内蔵20MHzにする
/******** クロックを高速オンチップオシレータ(20MHz)に変更 ****************/
prc0 = 1; // プロテクト解除
hocoe = 1; // 高速オンチップオシレータ発信開始
{int i; for(i=0; i<50; i++ );} // 安定するまで少し待つ(約10ms)
hscksel = 1; // 高速オンチップオシレータのクロックに切換え
scksel = 1; // システム基準クロック 低速→高速切換え
prc0 = 0; // プロテクト保護
その2
//高速20MHzクロックに
prc0 = 1; /* unlock clock control registers */
xrcut = 1; /* purge XIN-XOUT feedback registor */
hocoe = 1; /* start high-speed on-die oscillator */
{int i; for(i=0; i<10; i++){} }
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 */
その3
prc0 = 1; //Protect off
xrcut = 1; //purge XIN-XOUT feedback register
//locodis = 0; //Low speed on-chip oscillator on
hocoe = 1; //High speed on chip OSC select
//exckcr = 0x02; //system clock --> P4_7
{int i; for(i=0; i<50; i++ );} // 安定するまで少し待つ(約10ms)
phisel = 0x00; //clock分周比選択(分周なし)
hscksel = 1; //High spped on chip OSC
scksel = 1; //System base clock select
locodis = 1; //stop low-speed on-die oscilator
//phisel=0x07; //0x00→0x07:無し→8分周
//phissel2=0; phissel1=1; phissel0=1; //011=8分周 000=無し
prc0 = 0; //Protect on
asm("nop");
システムクロック 18.432MHzに 32分周 取り出し
システムクロックを 18.432MHz に変更する。
20MHzの設定をしておいて、
システムクロックを 18.432MHz に変更する。
frv1=fr18s0;
frv2=fr18s1;
を設定する。
システムクロックを 32分周 する。(20MHz/32=625kHz)
20MHzの設定をしておいて、
prc0 = 1; // プロテクト解除 の状態で
phissel2=1; // 0 0 0 0 1 1
phissel1=0; // 0 0 1 1 0 0
phissel0=1; // 0 1 0 1 0 1
// 分周比 non 2 4 8 16 32
を設定する。
システムクロックを ポートに取り出す。
prc0 = 1; // プロテクト解除 の状態で
ckpt1=1;
ckpt0=0;
//exckcr = 0x02; //system clock --> P4_7 これでもよい
を設定する。ポートp4_7にシステムクロックが出される。
ただし、分周しても原発振(20MHz)のまま出てくる。
PHISELレジスタで分周したものはその結果が出る。phisselは反映しない、
システムクロック分周 ややこしいレジスタ
PHISSELn と PHISELn (共にビット名) 両方共クロック分周指定ですが、「システムクロック f」と
「システム基準クロック fBASE」の違いに注意が必要です。
発振器によるクロック(fBASE)はシステムクロックf選択レジスタ(PHISEL)によって分周されてシステムクロックfとなり、さらにシステムクロックf制御レジスタ(SCKCR)
によって分周され、cpuクロック fsになります。
第1段
システムクロックf選択レジスタ(PHISEL) bit名でなく、レジスタ名で指定するほうが便利です。
phisel=0x00 なし 0x01 2分周 0x02 3分周 0x03 4分周
0x04 5分周 0x05 6分周 0x06 7分周 0x07 8分周
(AD変換のクロックも分周される。分周比は同じでない)
第2段
システムクロックf制御レジスタ(SCKCR)
bit0 PHISSEL0 bit1 PHISSEL1 bit2 PHISSEL2 があり、
2〜0: 000 分周なし 001 2分周 010 4分周 011 8分周 100 16分周 101 32分周 です。
//これをコピーして使う
phisel=0x00; //0x01 0x02 0x03 0x04 0x05 0x06 0x07 8分周
phissel2=0; phissel1=0; phissel0=0; //000 001 010 011 100 101 32分周
工事中