2023.6.27
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第41回]



●新しいPICで泥沼に

この土曜日から昨日月曜日までの3日間はまた泥沼にはまってもがいておりました。
PICBASICコンパイラがらみでちょっと考えるところがあって先日入手した新しいPICを試してみたところ全くウンともスンとも言ってくれなくてそれで苦闘しておりました。
今だから言えることなのですがいくつもの異なる要因がからんでいて問題の解決をより困難なものにしていました。
それをひとつずつときほぐしていくのに3日もかかってしまいました。
最後に残った難題は超不可解でなんとも悩ましいものでした。
とにかくどこも間違っていないはずなのに、RS232C通信が全くできません。
TXもRXも全くだめ。
一体なんなのだ、こいつは。

うむむむ。これはきっと悪霊の仕業に違いない。
悪魔よ去れ。去れ。去ってくれえ。

万策つきてもう目もかすんでパソコン画面の文字が眼鏡を通してもまともに読めないというダウン寸前の状況で、それでも「いくらなんでもこんなばかなことはないだろう」と思い直して最後の力をふりしぼってDATASHEETをもう一度じっくり読んでみたところ。
やっと原因がわかりました。
とんでもないところに落とし穴が潜んでおりました。
DATASHEETの「そこ」に気が付いたときは
「ええー、そこかよ。なんてこったい」
思わず声が出てしまいました。
おいおい。Microchipさんよ。これはないだろうよ。
とにかくMicrochipという会社はいきあたりばったりというかシステムの設計に一貫性が全くありません。
極端なことをいうとPICごとに仕様が異なっていて混乱させられます。

本当は今回は前回の続きを書くつもりだったのですが、そういう事態になってしまったものですから予定変更です。
PICに詳しくないお方にはチンプンカンプンかと思います。
まま、がまんしてしばらくお付き合いください。
当記事は私自身の備忘録を兼ねておりますので忘れてしまわないうちに書き留めておきたいと思って書いております。
とにかく。
PICは一筋縄ではいかないなかなかに厄介なICなのです。

私が思わず「なんてこったい」と声に出してしまったDATASHEETの「そこ」のところを下にコピーして示します。
いつものようにざっと読み飛ばしておりましたので、こんなことが書いてあるなんて全く気が付きませんでした。
全体のレイアウトはほかのPICと同じなのでちらりと見ただけでパスしてしまっておりました。


[出典]Microchip TechnologyInc. PIC18(L)F2X/45K50 Datasheet(赤四角は筆者)

「それはないだろうよ」というのは赤で囲った部分です。
「それだけじゃあわからんぞお」
ですよねえ。
やっぱり説明しなくちゃいけませんでしょうねえ。

Note1:はAccess RAMのとんでもない例外についての記述です。
Access RAMについてはその上のほうにAccess Bankとして図示してあります。
RAMのBank0(000〜0FF)はGPR(General Purpose Register、汎用レジスタ)としてユーザーに開放されています。
そしてBank15(F00〜FFF)はSFR(Special Function Registers、特殊関数レジスタ)です。
それぞれをアクセスするには本来はバンク切り替えの手法を使うか絶対アドレスを指定することになるのですがAccess Bankを指定する(デフォルト)とアドレスの00〜5Fには000〜05Fが割り当てられ60〜FFにはF60〜FFFが割り当てられます。
たとえばPIC18F4550などではそれで全く問題がなかったのですが上記をよく見るとなんとSFRがF53〜F5Fにはみ出しているじゃありませんか。
そこのところを見落としていたために泥沼にはまってしまいました。
Note1:はそのSFRのF53〜F5Fは「Access Bankではアクセスできませんよ」という注記だったのでした。
しからばSFRのアドレスF53〜には何があるかといいますと。


[出典]Microchip TechnologyInc. PIC18(L)F2X/45K50 Datasheet(赤四角は筆者)

今回の泥沼の原因は赤で囲った部分です。
ANSELレジスタはI/Oとアナログ入出力を兼用している端子をデジタルとするかアナログにするかを選択するためのレジスタでPIC起動時のデフォルトではアナログが選択されています。
これじゃあまともにI/O機能が働かなくて当然だったのでした。
アナログが選択されていても見かけ上は普通のI/Oらしく働くためになおさら余計に奇怪に思えたのでした。

PIC18F45K50はPIC18F4550の後継機種ではないかと推測しているのですがPIC18F4550よりも機能が拡張されているようです。
そのために増えてしまったレジスタを割り当てるアドレスが足りなくなってしまったのでPIC18F4550ではF60〜に収まっていたSFRがF5Fよりも前のところまではみ出してしまったのでしょう。
それにしてもANSELはもとはもっと中のほうに配置してあったものなのにどうしてこんな困ったところにわざわざ移動してしまったのさ、とちょいと恨み節です。
もっともそのように書いたのは不正確でした。
正確に言いますと、PIC18F4550ではANSELは使っていなくてアナログかデジタルかの設定はADCON1でやっています。
ことほど左様にMicrochipさまは相当にちゃらんぽらんで行き当たりばったりのところがあるように見受けられます。
PIC18F45K50ではアナログかデジタルかの設定はANSELE〜ANSELAの5つのレジスタで行なうことにしたため、結果としてはみださざるを得なかったのでありましょう。
ちなみにPIC18F45K50でもADCON0〜ADCON2はPIC18F4550と同じアドレスに存在しています。
しかしPIC18F4550ではADCON1はアナログとデジタルの指定に使われているのですがPIC18F45K50では別の機能が割り当てられています。
うーん。
ちゃらんぽらんやなあ。

PICBASICコンパイラ[第41回]
2023.6.27upload

前へ
次へ
ホームページトップへ戻る