[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第36回]
●RETURNもありません
前回からの続きです。
なぜ動いてくれないのか、どこに原因があるのか、じっくり落ち着いて少しずつチェックをしていった結果、どうもPIC16F57がまともに動いていないらしいということがわかりました。
動いているには動いているのですが、なんだかおかしい。
それを追求するためには最終的には「ロジアナ」の出番だと思いましたが、とにかくもう一度PIC16F57のプログラムをじっくり見直してみることにしました。
そうしましたら。
今となってはどの時点で気が付いたのかははっきり記憶がないのですが、怪しげな警告メッセージが出ていることに気が付きました。
いえ。
ERRORではありません。
WARNING(警告)です。
今はプログラムを直してしまいましたから、下はメッセージの再現のためにサンプルを作ってビルドしてみたものです。
ErrorではなくてWarningなのでBUILDはSUCCEEDEDになっています。
Warning[227]のところを読んでみますと、「RETURN」を「RETLW 0」に置き換える、と書いてあります。
なんだ?そのおかしなメッセージは?
で。前回もお見せしましたInstruction Setを確認してみましたら、確かに「RETURN」はありません。
[出典]Microchip Technology Inc.PIC16F5X Data Sheet
うーん。
RETURNが強制的にRETLWに置き換えられてしまうのか。
つまりは、RETURNの代わりにRETLWを使えというご託宣です。
ま。
RETURNの代わりにRETLWを使っても困ることはそれほどないはずなので、こうすることで1つ命令を減らしているようです。
むむむ。
前回のメモリマップといい、今回のRETURNをRETLWで代用していることいい、PIC16F57はなんだか相当にちまちまとしたつくりになっているようです。
う?
メモリが小さい?
スタックは大丈夫か?
大丈夫ではありませんでした。
なんと。
問題はそこにありました。
下はPIC16F57のシステムメモリマップです。
[出典]Microchip Technology Inc.PIC16F5X Data Sheet
このマップを見ますと、CALL、RETLWに関係するスタックとしてStack Level 1、Stack Level 2がある、とあります。
はて?
Level 1、Level 2とはなんじゃいな?
下がその説明です。
[出典]Microchip Technology Inc.PIC16F5X Data Sheet
なんとPIC16F57にはたった2層のスタックしかありませんでした。
その仕組みは。
CALLが実行されると、まずStack Level 1の内容がStack Level 2にコピーされます。
そのあとCALL命令の次のアドレス(つまりサブルーチンの戻り先)がStack Level 1に入れられます。
これとは逆にRETLWが実行されると、Stack Level 1の値がプログラムカウンタに入り、その後Stack Level 2の内容がStack Level 1にコピーされます。
この説明によると、CALL−RETLWは2重に使うのが限度ということになります。
たとえばサブルーチン1の中にサブルーチン2があって、さらにその中にサブルーチン3があった場合、サブルーチン3のCALLが実行されると、最初のサブルーチン1をCALLしたときの戻り先情報はStack Level 2が上書きされることで消えてしまいます。
その結果サブルーチン1のRETLWの実行による戻り先はサブルーチン2の戻り先になってしまい、永久にメインプログラムに戻れなくなってしまいます。
そういうことだったのでした。
そんなこととは露知らず、当初のPIC16F57のプログラムではサブルーチンを3重に使ってしまっていました。
やっと原因がわかりましたから、プログラムを見直して、それほど複雑なプログラムではありませんでしたから、サブルーチンを使わないプログラムにしてしまいました。
その結果、やっと期待した通りの動作になりました。
ところがこれで終わりではありませんでした。
実はまだもうひとつ気が付いたおかしな動作がありました。
それについてはまた次回に書くことにいたします。
CPLD入門![第36回]
2019.4.20upload
前へ
次へ
ホームページトップへ戻る