先日からPIC24F04KA200でアセンブラに嵌っています。。。一応の開発環境は整ったのでまずはLチカで感触を掴もうとプログラムを書いてみましたが案の定?うまくいきません。約1秒毎にLEDをON-OFFする基本的なLチカです。HEXファイルをPICに書き込んで動作させるとLEDは微妙な明るさで点灯します。見た感じ消灯はしていません。テスト回路は下の図のようになっています。LEDがつながっているRB8はオープンドレインに設定しています。
回路に不審な点は無さそうに見えますがRB8の波形を自作オシロで見たのが下の写真です。
約10msごとにON-OFFしています。微妙な明るさの理由はこれでしょう。周期としては20msで50Hzです。。。
1番ピンのMCLRはコンフィグの設定でI/Oポートに設定しているのにGNDに繋ぐとリセットしてしまうのでコンフィグが正しく書き込めていないものと推測しあれこれ調べたり試したりしましたがいい結果がでません。
そこでPICのコンフィグに何が書き込まれているかPICerFTで見てみました。
ほぼ設定どおりになっていますが意図したのと違う部分もあります。下の表はPIC24F04KA200のコンフィグのアドレスです。
FPOR(F8000C)はリセット関連の設定でPICの値は0x00F9=b11111001となっていてbit7=1です。これはMCLRが有効になっていてリセットピンになっている設定です。FPORレジスタの仕様を見てみると下の図のようになっています。
イマイチ分かりませんがMCLRを無効に出来ないみたいです。
Lチカが上手く行かない理由はMCLRを未接続の浮いた状態にしているから?で、MCLRを抵抗でプルアップしたらOKでした。。。
約1秒間隔でLEDがON-OFFするのを確認。Lチカ成功!成功した回路図は下(抵抗を追加しただけ)。
私が捜した限りではPIC24FのアセンブラによるLチカのサンプルは見つけられなかったので何かの参考にソースを載せておきます。うまくテキスト化できなかったので(見た目が崩れまくる)画像です。MPLABXの雛形を流用していますが作法というかソースの書き方が自己流なので変かもしれませんがとにかくこれで動きました。
簡単な説明を。コンフィグのところは"p24F04KA200.inc"を参考にしました。configはマクロのようです。
スタックは32個分確保したつもりです。
_wreg_initと__resetは雛形のものそのままです。
"initPORT"でLEDが繋がるピンの設定をしています。オープンドレインで出力の設定です。このピンはアナログ機能は無いのでデジタルがデフォルトだと思います。
"bclr PORTB,#RB8"は念のためのクリアです。無くても支障は無いと思います。
"bclr CLKDIV,#RCDIV0"はクロック分周レジスタの設定でRCDIV0はデフォルトが1なのでクリアします。1のままだとFRCが2分周されてベースのクロックが4MHzになってしまいFosc=16MHzとなります。クリアすることでFosc=32MHzとなります。
"Delay1s"ルーチンは約1秒の待ちです。約1秒は適当です。
こんなもんでしょうか。
久し振りのLチカに苦戦しましたが収穫もありました。MPLABXで16bitPICのアセンブラを使おうと昔のMPLABをインストールして
ASM30を入手しましたがその必要は無かったようです。現行のXC16をインストールすると下図のようにアセンブラも入っているようです。不確かですがC言語でソースを書いても結局アセンブラを通すことになるみたいです。
なのでASM30のツールチェーンは削除してXC16を使うことにしました。そうするとC言語でソースを書くものと判断されるのかコンフィグを分かりやすく設定できるツール(下図)でC用のソースをアウトプットされます。
こんな感じに。
これをアセンブラソースに貼り付けても当然機能しません。何かいい方法があるのかな?
色々調べて試してみても上手く行かなかった時に、アセンブラはやめてC言語で試してみようかと何度も思いました。今のところアセンブラにこだわる理由は無いので。しかしこのPIC24F04KA200の場合メモリがそれほど多い訳ではないのでC言語でプログラムを書くのは利巧でない気もしました。でもまぁ趣味でやる分には何の言語でやってもいいのですけどね。メモリが足りなければ多い品種に切り替えればいいだけですし。
今回はとりあえず動かせたからいいのですが、PIC24Fのアセンブラに関する情報をネットであまり見つけられなかったので(Cによる解説はたくさんありました)今後はC言語でのコーディングも検討しなければならなそうです。