トップページ > SH-2基板

インターフェース誌 付録SH-2基板 奮闘記 by 浜本正樹

 間違いのご指摘、ご意見などがございましたら、「掲示板」へご遠慮なく書き込んで下さい。

2006年5月9日
 近所の本屋でSH-2(SH7144F)の乗った基板がおまけでついているという雑誌をみつけたので、思わず購入してしまった。
CQ出版のインターフェース 2006年6月号だ。
以前にトランジスタ技術にH8/Tinyとか、R8C/Tinyがおまけでついていたことがあったが、SH-2までが雑誌のおまけについてくるというのは驚きだ。

HEWとコンパイラの無償評価版までおまけでついている。
さっそくHEWをインストールし、LED点滅プログラムをコンパイルしてみた。
RS232Cのコネクタをつけて、FDTで書き込んでみたが、 うまく書き込めない。なぜだ・・・・。
インターフェース誌
本誌には、「うまく書き込めない場合は一度基板の電源を切り、20秒ほどしてから再度電源を入れて40秒程待ってから書き込みを試してみる」という記述があるので、イライラしながら待ってみてから再度書き込んでみたら、こんどは「Image successfully ・・・」が表示された。
ジャンパを切り替えて電源を投入すると、赤いLEDが点滅した。 うまく書き込めたようだ。

20秒とか、40秒とか、やたらと長いのはなんなんだろう。 SH-2が持っている問題なのだろうか?

2006年5月10日
 毎回フラッシュROMに書き込んで動かしてみるのではデバッグが大変だ。 せっかくJTAGのコネクタもつくようになっているので、JTAGのICEをつなげて動かしてみたい。
ちょうど知り合いが、使用しなくなったPARTNER-J (京都マイクロコンピュータ社製)を貸してくれるというので、挑戦してみることにした。

PARTNER-Jは、パソコンとプリンタケーブルで接続する旧タイプのデバッガで、京都マイクロコンピュータではもう販売していない。(USBで接続するPARTNER-Jetにおきかわっているようだ。)

ところが、SH-2付録基板の14pinのJTAG(H-UDI)のコネクタのピン配置がどうもPARTNER-J標準のコネクタのとは違うようだ。他メーカのICEのピン配置とも違っているらしい。
あちこちブログ掲示板などでこのことが指摘されている。
しかたがないので、ケーブルを手作りするしかないか。

2006年6月9日
 コネクタなどの部品がそろったので、JTAGのケーブルを手作りした。
PARTNER-J側の26ピンコネクタのピン配置はPARTNER-Jのマニュアルには銘記されていないので、純正のケーブルをテスターであたって調べた。

えびめもさんの解説にもあるように、PARTNER-J 26ピンのコネクタの24番ピンはRESET出力のようだ。 写真の1本だけクリップが出ている線がそれだ。これをリセットにつなげてやらないと、PARTNER-Jを起動するたびに「PARTNER ERROR」が表示される。
PARTNER-Jのマニュアルには、「SH7144はJTAGモードでデバッグする場合はDBGMD端子をHighに、そうでないときはLowにせよ」と書いてある。 ところが基板のDBGMD端子(33pin)の電圧を測ってみるとLowレベルではないようだ。 回路図を見ても抵抗でプルアップしてあるようだ。 JTAGでデバッグしないひとにとって、これで問題ないのだろうか?
FDTで最初に書き込みエラーとなったことも、これに関係するのだろうか?

写真の白い線で引き回してあるように、右上のジャンパをショートするとDBGMDがGNDに、オープンではHighになるようにした。

JP1をオープンにしてそのままデバッガを起動すると、ちゃんとデバッガが起動した。
内蔵RAMの読み書きはできるようだが、内蔵ROMは読めない。 なにかの初期設定が必要なようだ。SH7144のマニュアルを読んで調べてみないといけない。

2006年6月30日
 オークションでSRAMと74LV08のセットが出品されているのをみつけたので思わず入札してしまった。 こんなものまでオークションに出品されているとは驚きだ。 送料込みで2000円弱。

PARTNER-Jでデバッグするときは、モード1で内蔵ROMを無効にし、SRAMはCS0につなげたい。 ところがMD0端子はGNDに固定してあり、MD1端子もFWPとつながっていて、パターンを改造しようとしてもできそうもない。
あきらめて、モード2(内蔵ROM有効)で、SRAMはCS1のままで動かすことにした。

【後日記】 PARTNER-Jは、ブレークポイントをセットするときは、プログラムのその部分を書き換えるために、デバッグしたいプログラムはRAM上になければならないと思いこんでいたが、内蔵ROMのエリアでも問題なくブレークをセットして止めることができた。
おそらく、ブレークポイントをセットするごとに内蔵フラッシュROMを書き換えるのではないかと思われる。 わざわざSRAMをとりつける必要もなかったようだ。もっと早く試してみればよかった。

2006年7月14日
 SRAMは手に入ったが、不器用な私が自分で半田付けするのは勇気が要る。 うまくいかなくてパターンをはがしてしまうのは間違いない。

悩んだ末、プロ(長野市のロジックエンド)にお願いすることにした。
セブンイレブンで購入した「プリン」を手みやげに、お願いしたら、こころよくやってくれた。

とてもきれいにやってくれた。 すばらしい。 さすがだ。

SRAMを実装
2006年7月15日
 以前に内蔵ROMが正しくReadできなかったのは、PARTNER-Jの起動時の設定ファイル(jptSH.cfg)に設定の足りない点があったようだ。
FLASH MEMORY 00000000,0003ffff,INTERNAL
MAP 00000000,0003ffff,ROM
を追加することで、内蔵ROMにも起動時にプログラムを書き込んでくれる。
MAP 00400000,0047ffff,RAM
MAP ffff8000,ffffffff
とすることで、SRAMや内蔵RAM、内蔵I/Oにもアクセスできる。

また、SH7144Fは、モード2でリセットするとアドレスやデータバスがI/Oポートとして初期化されてしまうようだ。 これではSRAMのエリアにプログラムをダウンロードすることができない。
PFC.PACRL1.WORD = 0x1550;  //ポートAをRD,WRなどの機能に設定する
PFC.PBCR1.WORD = 0x000A;  //ポートBのA21,A20をアドレスに設定する
PFC.PBCR2.WORD = 0xA005;  //ポートBのA16〜A19をアドレスに設定する
PFC.PCCR.WORD = 0xFFFF;   //ポートCのA0〜A15をアドレスに設定する
PFC.PDCRL1.WORD = 0xFFFF;  //ポートDをデータバスに設定する
PFC.PDCRL2.WORD = 0x0000;  // 同上

上記の処理を、設定ファイル(jptSH.cfg)でプログラムをダウンロードする前に設定してやればよいようだ。 周辺I/Oレジスタの番地を調べて、下記のように設定を追加した。
INIT POW,ffff838c,1550
INIT POW,ffff8398,000a
INIT POW,ffff839a,a005
INIT POW,ffff839c,ffff
INIT POW,ffff83ac,ffff
INIT POW,ffff83ae,0000

init.mcrには下記のように設定を追加。
RESET
FW 400000,41ffff,ffff  ←これにより、プログラムがダウンロードされている部分がわかりやすい。
L C:¥○○¥△△.abs

HEWのリンカのセクションの設定を下記のように変更。
Address Section
0x00400800 PResetPRG
0x00401000 P
C
C$BSEC
C$DSEC
D

ベクターは0番地のままなので、それらは内蔵ROMに書き込まれる。 フラッシュROMに書き込むには時間がかかるが、ベクタだけなら2秒程度で書き込まれるようだ。 ベクタ以外のプログラムはSRAMにロードされるので、ブレークして再スタートするときにフラッシュROMに書き込まれることはない。

いざ、実行してみよう。
あれ? 動かない。 単純なLEDの点滅プログラムなんだけど。

調べてみると、スタックポインタ(R15)がセットされていないようだ。
RESET、Loadすると、R15はFFFFFFFFに初期化されるが、そのまま先へ進んでしまうようだ。
ためしに、Loadしたあと、R15を0に書き換えて動かすと、ちゃんと動作する。
resetprg.cには、
#pragma entry PowerON_Reset_PC
と記述してあるのに、コンパイル後のアセンブラのリストをみると、
R15(SP)へのセットがされていない。 SH2はリセットでPCとSPをベクターテーブルより持ってくるため、PowerON_Reset_PCの先頭ではSPにセットすることはしないようだ。

 #pragma asm
 MOV.L #0, SP
 #pragma endasm

と追加してみると、コンパイルエラーになってしまう。 #pragma asmは、このコンパイラでは許されていないようだ。 毎回R15を書き換えるのはとっても面倒だ。 どうしたらよかんべ。 なにかよい方法はないものか。

【後日記】 #pragma asmや#pragma inline_asmは、コンパイル出力を.srcに設定する必要があるようだ。 それだと、毎回すべてのモジュールを.srcファイルに落として、さらに.objにアセンブルされるので、なんかいやだなぁ。


2006年7月16日
 resetprg.cを、コンパイラの出力をアセンブリプログラム(*.src)にしてコンパイルし、出てきたresetprg.srcをresetprg.cの代わりにプロジェクトに追加した。

_PowerON_Reset_PC: ; function: PowerON_Reset_PC
  ; frame size=0
  .STACK _PowerON_Reset_PC=0
  .LINE "D:\USR\ESPE\SH7144\test\test\resetprg.c",71
 MOV.L #0, SP ;←この行を追加
  MOV.L L12,R6 ; _INT_Vectors

これで、SPには0がセットされる。
あまり良い方法とは言えないが、resetprg.cを変更することはめったにないと思うので、よしとするか。 これでやっと毎回R15の値を変えてやる必要がなくなった。 (デバッガの画面のソースファイルでresetprg.cが表示されなくなってしまうのが悲しい。)

【後日記】 もとのresetprg.cが残っていれば、デバッガの画面にそれが表示されるようだ。
なにも表示されないよりはずっといい感じだ。

ところで、LEDの点滅の速度がやたらと遅い。
FDTで内蔵ROMに書き込んで動作させたときは1秒間に5回程度LEDが点滅したが、SRAMにプログラムをダウンロードして動かすと1回の点滅に5秒程度かかってしまう。
内蔵ROMは32bitバスだが、SRAMは16bitだからだろうか。

waitはリセット時には15waitになっているようなので、設定を変えてみた。
ついでに、将来内蔵ROMで動作させることを考慮して、hwsetup.cに以下の設定を追加しておいた。

  BSC.WCR1.BIT.W0 = 0; // CS0, CS4 no wait
  BSC.WCR1.BIT.W1 = 1; // CS1, CS5 1 wait

  // PA
  PFC.PACRL1.BIT.PA14MD = 1; // RD
  PFC.PACRL1.BIT.PA13MD = 1; // WRH
  PFC.PACRL1.BIT.PA12MD = 1; // WRL
  PFC.PACRL1.BIT.PA11MD = 1; // CS1
  PFC.PACRL1.BIT.PA10MD = 1; // CS0

  // PB
  PFC.PBCR1.BIT.PB9MD = 2; // A21
  PFC.PBCR1.BIT.PB8MD = 2; // A20
  PFC.PBCR2.BIT.PB7MD = 2; // A19
  PFC.PBCR2.BIT.PB6MD = 2; // A18
  PFC.PBCR2.BIT.PB1MD = 1; // A17
  PFC.PBCR2.BIT.PB0MD = 1; // A16

  // PC A0-A15
  PFC.PCCR.WORD = 0xFFFF;

  // PD D0-15
  PFC.PDCRL1.WORD = 0xFFFF;
  PFC.PDCRL2.WORD = 0x0000;

CS1を1waitにすることによって、LEDの点滅時間が5秒から約1.5秒へと速くなった。
それでも内蔵ROMでの動作に比べると、とても遅い。やはり16bitバスと32bitバスの違いか。


2006年7月31日

CQ出版では、SH-2基板特設ページというのを公開している。
そこには、14pinのJTAGコネクタのピン配置やDBGMDピン以外のことにも触れられている。

1.電源が発振することがある。 LDOの一次側のC8コンデンサに並列に47μF〜220μFのコンデンサを追加したほうがよいようだ。

2.RX1のプルアップ抵抗をカット。 掲示板で「RX1がVccでプルアップされている」と盛り上がっている。 最初、プルアップされていてなにが問題なのかピンと来ませんでしたが、TTL側ではなく、RS232C側のRxDラインがVccにプルアップされているようだ。 そりゃーまずいわな。 さっそく私の基板もパターンをカットした。

掲示板では、CQ出版社の対応などがいろいろと批判されているが、私はSH-2基板を付録に付けたというのは、絶賛されるべき企画だと思う。 私のようなソフト(ファーム)屋が、2万円も3万円もするCPUボードをおいそれと購入してみる気にはなれないが、雑誌に「おまけ」でついていると知って、おもわず購入してしまった。 「雑誌」の影響力は大きいと思う。


2010年10月19日

ひさしぶりに、この基板を使用して、プログラムをHEWで新規に作成して動かしてみた。
PARTNER-Jで起動しようとすると、「キーコードが合っていない」と表示され、起動できない。
「キーコード」ってなんだっけ? すっかり忘れてしまった。

いろいろと以前に作成したプログラムを調べてみると、
PARTNER-Jの起動時の設定ファイル(jptSH.cfg)に「KEY CODE」を設定し、
プログラムの20h〜23hに、同じキーコードを設定していた。
具体的には vecttbl.c のINTTBLの8番目にキーコードを埋め込んでいた。

ちなみに、jptSH.cfgの「KEY CODE」をffffffffに設定すると、キーコードが合っていなくても
PARTNER-Jは起動するが、フラッシュROMは毎回消去されるようだ。


トップページ > インターフェース誌付録SH-2基板
NORTi編
HOS編
W5300編


エスペランサ トップページへ ()