ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2008年7月30日水曜日

R8C/TinyシリーズのリセットとIDコードチェック機能

R8C/Tinyシリーズのアセンブリ言語のサンプルプログラムを見るとリセットベクタのところに
.LWORD Start | 0FF000000h
という記述がある.リセットベクタにStartのアドレスを書いておけば,電源投入時(RESET)に,Start:の場所からプログラムが動き出す.だったら
.LWORD Start
だけでも動くはずだが,動かない.何故Startのアドレスと0FF000000hの論理和(|)なのか?ずっと疑問に思っていた.
R8Cのハードウェアマニュアルを読むと,「割り込み」の章で割り込みベクタの記述がある.各割り込みに対応した4バイトからなる割り込みベクタがある.割り込みが生じると,この割り込みベクタに書かれているアドレスに分岐する.
さらにこんな記述がある.「固定ベクタのベクタ番地(H)はIDコードチェック機能で使用します。詳細はフラッシュメモリ書き換え禁止機能を参照してください。」
ということでマニュアルの「フラッシュメモリ書き換え禁止機能」のところを読む.
すると7つの指定された固定ベクタの上位番地が,「ライタから送られてくるID コードとフラッシュメモリに書かれている7 バイトのID コードが一致するか判定する」ために使われているとのこと.Flash Starterで入力していたFFと,これらの値が一致しないとライタから送られてくるコマンドは受け付けないとのころ.なるほど.
そしてIDコードの格納番地の図にリセットベクタも書かれていて(注)となっている.
「(注)00FFFFh番地にはOFSレジスタが配置されています。OFSレジスタの詳細は「 OFSレジスタ」 を参照してください。」とのこと.
そして今度はOFSレジスタの項を読む.
OFS(オプション機能選択)レジスタとは,ROMコードプロテクトやウォッチドッグタイマなどの設定を行っている.そのアドレスが,0FFFFh番地つまりリセットベクタの上位番地だったのである.ややこしい共有はするな!と思いつつ納得.OFSレジスタは標準では全て1つまりFFの設定になっているので,OFSレジスタを変えずにリセットベクタの下位番地にStartのアドレスを書き込むためには,Startのアドレスと0FF000000hの論理和が必要だったわけである.ちなみに0FFFFh番地はアドレス空間の一番最後(おおとり)である.Flash StarterでFFを7回入力していた理由と,リセットベクタの0FF000000hの謎がやっととけた.