「天文屋のためのマイコン入門」バンクとは
PIC16F88のレジスタは、実は512個あります。レジスタファイルの制限は128個でしたね。実に4倍もオーバーしています。そのからくりはバンクという概念にあります。
バンクを理解する方法として2通りの理解の仕方があります。初めにページという概念でバンクを理解してみましょう。バンクはページと思ってください。
何かの本である記述がある場所を指定するのに、何ページ目の何行目という言い方をします。バンクもこれと同じです。512個のレジスタは4つのレジスタファイルに分かれています。これをバンクといいます。つまりページです。そして各ページの行数に相当するのが番地というわけです。
すなわち、レジスタファイルは、4ページからなる本と考えればよいです。あるレジスタを指定するには、まずページ番号(バンク番号)を指定します。次に番地を指定します。
このようにレジスタを指定するのに2段階を要するので面倒であることは確かですが、これでたくさんのレジスタを扱うことができます。
ところで、番地は命令の中で指定するので良いとして(MOVFW 5のように)ページ番号はどこで指定するのでしょうか? 実はこれもレジスタに値を書き込むことによって指定します。この特別なレジスタをSTATUS(ステータス)レジスタといいます。
STATUSレジスタはレジスタファイルの中にあり、番地は3番地と決まっています。
さて、たとえば、2ページ目のレジスタファイルの5番地に値を書き込みたい場合は、まずスSTATUSレジスタにページ番号2を書き込み、さらに5番地のレジスタに目的の値を書き込みます。
STATUS ← 2ページ目
MOVWF 5
STATUSレジスタの値によって、MOVWF 5の指し示すレジスタがまったく違うものになることに注意してください。
STATUSレジスタが1ページ目を指定しているなら、それは1ページ目のレジスタファイルの5番地のことですが、2ページ目を指定しているなら、2ページ目のレジスタファイルの5番地ということです。番地が同じでもページが異なればまったく別のものになります。
STATUSレジスタにページ番号を書き込んだら、それは次に別のページ番号に書き換わるまで有効です。ですからページ番号が同じなら、いちいちレジスタアクセスの度にSTATUSレジスタの書き換えを行う必要はありません。またレジスタアクセスの直前にページ番号を書き込む必要もありません。
たとえば、0ページ目の12番地と13番地に値を書き込みたい場合は、
STATUS ← 0ページ目
MOVWF 12
STATUS ← 0ページ目
MOVWF 13
とする必要はなく、
STATUS ← 0ページ目
MOVWF 12
MOVWF 13
で良いわけです。
プログラマはあるレジスタにアクセスしたい場合は、常にSTATUSレジスタが今、何ページ目を指しているか意識する必要があります。これはけっこうな負担です。
このバンクという概念は大昔のマイコンによく採用された方法ですが、現在のマイコンは少ないです。PICの場合、システム規模が小さいため、このような方式をとらざるを得なかったのでしょう。ですから、PICマイコンは小さいから簡単だという単純な話にはならないです。むしろ難しい方の分類に入るかもしれません。(ただしハード的には簡単)
さて、STATUSレジスタにページ番号を指定する方法ですが、実はこれがやっかいです。次回、その方法を説明します。
| 固定リンク
コメント
いつも有益な情報に感謝しております。またこの赤道儀に期待して拝見しております。
質問ですが、次のような自動撮影ができたら嬉しく思いますが可能しょうか?
1.回転停止状態で設定された露光時間とインターバル、撮影枚数で連続撮影
2.任意の角度を高速で逆転
3.設定された時間、あるいは設定された時刻まで何もしない
4.恒星追尾・正転で設定された露光時間とインターバル、撮影枚数で連続撮影
お手数おかけしますがコメント頂けましたら幸いです。
投稿: betuzan | 2014年5月26日 (月) 11時55分
betuzanさん、こんにちは。
プログラム撮影ですが、使用者がスマフォ、またはパソコンで、コマンドを並べることにより赤道義にプリセットします。
いま、考えているコマンドは3つです。
1 インターバルシャッター
INTSHUT [exp],[int],[rep]
2 RA方向回転
RA [± rad]
3 DEC方向回転
DEC [± rad]
以上3つですが、いずれも恒星時追尾の状態です。
仰せの動作を実現するには以下のコマンドも必要です。
4 追尾停止、再開
5 PAUSE (一定時間何もしない)
どちらも、追加するのは何も問題ないので、追加したいと思います。
投稿: ほんまか | 2014年5月26日 (月) 12時50分
詳しいご説明、ありがとうございます。
さらに希望を言わせて頂きますと、回転速度(倍速)の変更ができたらと思います。
回転速度変更用のコマンドを新設するとか、回転速度を追尾再開コマンドのパラメータとするとか、あるいは他の方法でもかまいませんが、何とかならないでしょうか?
当方、「星の写っている風景」を撮っています。具体的に言うと、固定撮影と追尾撮影を合成して地上も星もずれない写真に仕上げます。固定撮影も追尾撮影も多いときには20枚以上の加算平均コンポジットをします。
東向き撮影なら苦労は少ないのですが、南向きや西向きの時は空部分に欠損を作らないために正転や逆転を行う必要があります。その回転角は最大でコンポジット枚数分の撮影時間以上が必要になりますから恒星追尾速度では実用になりません。
今は手動でこれをやっていますが、全自動で出来たらこんなに嬉しいことはありません。
ご面倒でなければメールアドレスのドメインから当方のWEBサイトにアクセスして、ブログとか見て頂けたらどのような写真かわかると思います。
自動モザイク撮影にも対応するとのことでしたが、その場合でも高速で回転できたほうがいいと思うのですが、いかがなものでしょうか。
投稿: betuzan | 2014年5月26日 (月) 21時48分
先の投稿をしてから気がついたのですが、RA [± rad]、DEC [± rad]の両コマンドは、恒星追尾中に割り込んで高速回転で動作するものでしょうか?
そうであれば私の望む動作は全て行えることになります。
投稿: betuzan | 2014年5月26日 (月) 21時57分
betuzanさん、そのとおりです。
RA [± rad]、DEC [± rad]
は、恒星時追尾中あるいはPAUSEコマンドで停止中に、割り込んで高速回転します。
回転速度はトルク次第ですが、32倍くらいはいけると思ってます。
ブログおよび写真を拝見させていただきました。あの風景と星の写真はすばらしいですね。だいたい、やりたいことはわかりました。
たぶん、できると思いますよ。
投稿: ほんまか | 2014年5月26日 (月) 23時12分
納得しました。
ますます期待が大きくなりました。
ありがとうございました。
投稿: betuzan | 2014年5月27日 (火) 12時25分