楽天市場
[無料でホームページを作成] [通報・削除依頼]

続番外 ATTINY13A用ブートローダー

番外編 その2
ATTINY13A用のブートローダーのRJMP命令について検討したところ、面白いことが判りました。

前のページでRJMPで許される相対アドレスは12ビット(-2048~+2047)であることを記述しましたが、ではリセットベクターであるアドレス0x0000で負の方向に相対ジャンプさせると何処へジャンプするのでしょうか?

答えはフラッシュメモリーとして許されているアドレスの最後方の部分。

すなわちATTINY13Aで0x0000でRJMP PC-0x10という命令を実行させると、アドレス0x01F0にジャンプします。RJMP PC-0x60という命令を実行させると、アドレス0x01A0にジャンプさせることが出来、ここはすなわちブートローダーの先頭アドレスです。

前のページで、ATTINY13A用のブートローダー構築の留意点の2番目として以下の記述をしました。

--------------------------------------------
2.ATTINY13Aリセット時にブートローダーへジャンプさせる必要があるが、割り込みベクターが0x0001に存在するため、ジャンプコードを記述する領域が0x0000の1ワードしか無い。(PIC10F322では4ワード)

上記2について補足しますと、 ATTINY13Aには相対ジャンプ(RJMP:1ワード記述)間接ジャンプ(IJMP:3ワード記述)の2種類のジャンプがあるのですが、先述の割り込みベクター位置との兼ね合いからIJMP命令を記述するためには先ずRJMP命令で割り込みベクター以外の場所にジャンプしてから改めてIJMP命令を実行するという、いわゆる2段ジャンプの記述が必要となります。 一方RJMPで許される相対アドレスは12ビット(-2048~+2047)である為(IJMPは全域可)プログラムフラッシュメモリのサイズがATTINY13Aよりも大きなATTINY25 ATTINY85 などではフラッシュメモリの最後部にブートローダーが配置できません。
--------------------------------------------

なんと、このからくりをうまく使えばATTINY45 よりもフラッシュメモリのサイズが大きなATTINY85などでもフラッシュメモリの最後部にブートローダーを配置できるではありませんか。

実際のプログラムでは、

.org 0x0000
RJMP PC-0x60

と記述すると、コンパイラがエラーを吐きますので、

.org 0x0000
.dw 0xCF9F ;RJMP PC-0x60

と記述してください。


ATTINY13A用のブートローダー(ファームウエア/ホスト)一式はこちらからダウンロードできます。

http://sourceforge.net/p/tinypicbootload/discussion/general/thread/08447e34/a11e/attachment/New%20avrasm2.zip
http://sourceforge.net/p/tinypicbootload/discussion/?source=navbar