ぷらこのきろく

メモとかテストとか備忘録とか

ASOOVU USBで遊んでみる(2-1)

その2-1:割り込みを使おうとして失敗する

タイマ機能というものがあるらしい。時間をカウントして一定時間経ったら教えてくれたり時間を計ったりできるらしい。
その機能で、時間がたったら割り込みがかかって教えてくれるものがあるっぽい。
というわけで、割り込みを使おうと思いたった。

XC8のマニュアルを読むと、

void interrupt hoge(void)

と書くと、hoge()は割り込み関数として登録されるらしい。
ASOOVU USBで使われるPIC18F2550は、割り込み関数が二つ(優先度高と優先度低)使えて、それぞれ

void interrupt low_priority hoge(void)
void interrupt high_priority heke(void)

で、優先度低と高が使えるらしい。と、PIC18F2550のデータシートとXC8のマニュアルに書いてあった。

というわけで、何もしない(単にreturnを返す)だけの割り込み関数だけ作って、動かそうとしてみた。
・・・動かない。今まで動いていたmain()の中身が実行されない。
いろいろ試してみた。3日ぐらいかけて。関数の中身を変えてみたり、割り込み許可をしないようにしてみたり、コンフィギュレーションビットを確認してみたり。
で、確認できたのは、割り込み関数を定義すると動かなくなって、定義をコメントアウトすると動くようになる。

なんでだろう・・・と、ASOOVU USBの販売元のサイトからサンプルプログラムをダウンロードして確認してみた。bootload.hに

#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x1008
...
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void)

とかかいてある。書いてあることは半分くらいしかよくわからないが、優先度高の割り込み関数が置いてあるアドレスが0x1008に再設定された、ということなのではないか。

mapファイル(プロジェクトのhexファイルが置いてあるディレクトリと同じ場所に、~.mapと書いてあるファイルがある)を確認する。
ちょっとしか意味はわからないが、このファイルには関数やグローバル変数などがどのアドレスに割り付けてあるかが書いてある。

サンプルプログラムのmapファイルの優先度高割り込み関数(だと思われるもの)は、確かに0x1008に割り付けられてる。
そして、自分が書いたプログラムのmapファイルを見ると、0x0008に割り付けられている。

ここで、データシートを見る。figure5-1にメモリのマップがある。やっぱり0x0008だよなぁ。。
でも、やってみるしかない。割り込み関数の割り付けを変えてみよう。。

MPLAB X IDEのプロジェクトを右クリックして、Propertiesを選択。
XC8 LinkerのカテゴリからAdditional optionsを選択。Extra Linker Optionsに

-L-preset_vec=1000h,intcode=1008h,intcodelo=1018h,powerup,init

と記述。
f:id:prizeout:20171225223504p:plain
あ、なんかmain()が動きだした。割り込み関数を使ってみよう、と、適当にタイマ0で割り込みを起こしてみたら、
ちゃんと割り込み関数を通った。
しかしなんで割り付けをデフォルトから変えないといけないのだろう。どこにその説明が書いてあるのだろう。
まあともかく、これで次はやっとタイマをまともに使える。
続く。