PICとマイコンシステムの実際

■はじめに
 マイクロチップ社のPICマイコンは、製品としては10年以上前から存在していたが、電子工作
などで一般的に使われるようになったのはつい最近である。私は、トラ技の1995年12月号の
特集「ワンチップ・マイコンで行こう!」で知ったのが最初だった。

 なぜ、10年以上前から存在していたのを知っているかというと、たまたま分解掃除していた
MacintoshSE30のマウス内部にPICが入っていたのを見たから。「おおっ、PICじゃん!」ってね。

 もともとマイクロチップ社は、メモリ(EPROM、EEPROM)を作っていたようだが、個人的には、
PIC以前は全く知らなかった。マイクロチップの製品は見たこともなかった。最近になり、古い
PC−9801関係のジャンクを整理していたら、HDDの基板から、マイクロチップ社製のEPROM
を発見した。
 (次の写真、マイクロチップ社のロゴマークと、TAIWAN Microchipと書いてあるEPROM)


 最初は、とにかくPICを使ってみようと思った。フラッシュROMで何度も書き換え可能なのが気に
入った。日立のH8もそうだが、フラッシュROMによって使いやすくなり普及したと思う。以前は、
Z80に2764とか27256などのEPROMを組み合わせて使っていて、EPROMをイレーサーに
入れて消すのに20分ぐらいかかって不便だった。複数のEPROMを準備して、ローテーション
しながら使ってもいたが・・・。ROMエミュレータという手もあるが・・・。

 さっきのトラ技だけが、最初の頃は唯一の資料だった。次に、マイクロアプリケーションラボラトリー
から出た「PICインターフェースハンドブック」を知り、5000円だか6000円だか、高いと思ったが
購入した。結果的には、買ってよかった。初版、そして第3版を購入して、いまも愛用している。でも
あちこちに誤りがあって(その内容は後述する)、あれこれ書き込んだり、メモを貼り付けたりした。
 それと、秋月のPICプラチナキットに付属していた16F84の日本語データシートが役に立った。

 かつては、Z80にROMとRAM、I/Oをバス配線してマイコンを自作していたが、それでは
どうしても大がかりになった。安く容易に手に入るワンチップマイコンもそれまで知らなかったから
これは良い物があるなと思った。

 参考までに、Z80の自作マイコンの例を示します。これは1997年頃に作った物です。扱うデータ量
の関係で、PICが向かない用途に使っていたと思います。

 (左の写真)おもて側。8MHzの水晶発振器、74HC74、TMPZ84C00AP−6、2764、6264、
        74HC14、74HC138、74HC139、その他、コンデンサ、抵抗など。
        ヘッダーには、A0、IORD、IOWR、I/Oアドレスデコード、データバスが出ているので、
        別の基板に組んだI/O回路との接続が容易。
 (右の写真)うら側。
 基板は、秋月のBタイプ(AE−2)ユニバーサル基板で、寸法は95×72ミリです。
 上記の基板は、I/Oが外付けなのでこれだけでは使えません。


 [参考資料]上記の基板ではありませんが、似たようなZ80基板の回路図(PDF)があります。
         実際に作って動いたものですが、保証はしません。参考用です。ココ (160KB)


 (以下、画像が多くて重いですが、ゆっくり見てやって下さい)


■必要なもの、ライター
1.第一歩
 PIC16C84を秋月から買ったが、確かプラチナキットというのがあって、AN589(アプリケー
ションノート、マイクロチップ社の資料)にあるライタが作れるようになっていた。でも、実際は
うまくいかなかったのか、もう忘れたが、トラ技に載っていた、シリアルポート接続のライタを
作ってみた。

 次の写真は、当時の基板の残骸である。画鋲のプラケースに入れ、書き込み対象のPIC
には20ピンのICクリップで接続していた。クリスタルの4.9152という数字が、いかにも
シリアル通信をやっていそうな、ワケ有りの数字である。

 これ自体が動くためにもPICを書き込まなければならないのだが、どうやって書いたのやら、
忘れてしまってナゾだ。いや、まてよ、そういえば、これの前に、パラレルポート接続のライターも
作ったような気がする。ウン、確かにあったぞ。
 確か、コンパックのノートだとパラレルポートがうまく使えなくて、IBMのデスクトップのAPTIVAか
何かで試したらうまくいったんじゃなかっただろうか。

 上記のシリアル接続のライターですが、作者オリジナルのアセンブラで書いてあったのが
読みにくくて気に入らなかったのですが(をいをい)、真剣に読んでみたら、内容は大したもの
でした。16F84にUSARTは無いので、ソフト的に実現するわけですが、あまり手間をかけな
ければ送信か受信か、同時にはできないでしょう。送信なら送信にかかりっきりですもんね。
ところがこいつのプログラムは、送信と受信が同時にできるんですね。割り込みでうまくやって
います。勉強になりました。但し1200bpsでしたが・・・実用には十分でした。

 ちょっと前後しますが、この前、実家から発掘してきました。これがパラレルポート接続のライター
です。そういえば作ったっけ、と思い出しました。もともとACアダプタが直結されていたはずですが
役目を終えてから、部品取り用になり、ACアダプタだけ無くなっています。


 こいつの新たな人生として、PICの複製機とか、テスト機とか、ちょっと考えているところ。
せっかく書き込み回路とソケットが配線してあるんだから、これを活かさない手はないよね。


2.秋月さまさま
 最終的には、AKI−PICプログラマキットを買って組み立て、どうにか落ち着いた。
 次に示すのは、その現物の写真だが、妙なラクガキが気になるものの中身は比較的、丁寧に
作っている。キットを作っても、つい面倒くさくて基板むき出しのままで使ってしまうが、ちゃんと
ケースに組み込めば故障もしにくいし、丁寧に作っただけ愛着もわくと思う。

 右の写真は、ソケット部分だが、アルミケースの一部を切り抜いて、別の基板を取り付けて
ある。ケースの中央に角穴をあけるのは大事業(笑)だが、端に面した加工なら、こんな具合に、
端からハンドニブラーでかじっていけば比較的ラクなのだ。

 キットでは、メインボードにそのままソケットを実装するようになっていたが、このように配線を
延長して、2種類のソケットと、拡張端子(後の写真)を備えたことで、8ピン、18ピン、28ピンの
各デバイスに対応できるようになっている。

 できればレバーソケットは、交換が容易にできるように、レセプタクルを利用したい。黒いソケ
ットは、ARIES社だが、これはピンの形状が、丸ピンICソケットに装着できるようになっている。
緑色のTEXTOOLは、ピンの形状が丸ピンICソケットにささらない。これは専用のレセプタクルが
市販されている(しかしこの製作例では横着で、ソケットをそのままハンダ付けしているから、
偉そうな事は書けない)。

 しかしARIESのソケットは丸ピンソケットに装着できるようになっているとはいえ、レバー操作を
しているうちにソケットから浮いてくるかもしれない。耐久性を重視するなら、専用のレセプタクル
を使って、ネジ止めするのが当然と言えよう。こういう個人レベルの趣味の世界なら、レバー操作
をしているうちにソケットが浮いてはずれてしまっても、あっはずれちゃった、と押し込んでやれば
いいが・・・。

 TEXTOOLのソケットを単体で、レバーを動かしながらピンを見ると、動くのがわかると思う。
これをそのままハンダ付けで固定したら、針金を何度も曲げたら折れるのと同じように、そのうち
折れてしまうんじゃないかと気になる。だからレセプタクルを使った方が、ソケットのピンに負担が
かかりにくいと思う。

 (左の写真)LEDをここに付けたから、確認しやすい。10ピンのヘッダは、拡張用(ISP用の
ケーブルとか40ピンのソケットを接続するため)である。
 (右の写真)内部の配線は、ゴチャゴチャしているが、フタをして押し込んでしまえば問題な
い(笑)。レギュレータの放熱は必要ないようだが、気になるようならケースに取り付けてしまえ
ば良い(但し、フィンの絶縁には気配り必要)。


 ただ、15Vの電源が必要だった事が障害で、なかなか15Vなんてのは無い。DC−DCコン
バータがないか、トランスを買って、整流回路から自作しなければならないか、あるいは、
ジャンクで都合の良い電圧のスイッチング電源が手に入らないかと切望していた。

 最初の頃は、公称12V出力のACアダプタの、実測では少々高い電圧が出る奴を、ごまかし
て使っていたが、のちに秋月オリジナルのスイッチングACアダプタのラインナップで、15V品が
出てきたので非常に助かった。小さくて使いやすいし!

 余談だが、レバーソケットは時々、掃除をしてやると良い。接触不良でエラーが起きない
ようにしたい。その方法は、昔いた会社で、ROMライターのメンテナンスをやっていた人を
観察していたら、爪楊枝にアルコールを付けて、ソケットのバネをひとつずつこすっていた。
見ると、けっこう汚れがたまるものである。そして普段からホコリが入らないように気を付け
たい。


3.結局
 最近は、このライターはあまり使っていなくて、もっぱらPICSTART−PLUSを使っている。
最初からこれを買っておけば良かったのだが、あの頃はそこまで払う気になれなかった。
 秋月の宣伝をするわけじゃないけど、それと互換のライターが1万円ちょっとで買えるようだ。
(もっと早くから知っていれば良かった)


4.ISP(ICSP)
 PICを基板に実装したまま、プログラムの書き込みをする事もできる。
 ISPという言い方のほうが個人的には慣れているが、マイクロチップのデータシートの記述に
よれば、ICSPのほうが正式である。

 次の写真は、PICライターのソケットに差し込んで、その書き込みに必要な信号を取り出す
ための自作のアダプターである。

 サ○ハ○ト等の市販品もあるようだが、材料が手元にあれば、サッと作るべし。この回路は
簡単だからあえて説明しない(配線を延長しているだけ)。ただ、8ピン、18ピン、28ピン、
40ピンなどデバイスによって、必要な信号のピン位置が違うから、それぞれに合わせて
作る事。延長ハーネスのほうだけ、共通のピンアサインにしておくと良いな。

 DIPなら、何度もソケットからはずしてライターで書けるけど(ピンがいたむからソケットを
1段はめておくと保護になる)、SOPや、QFPパッケージだったら、書き込みのたびにいちいち
はずせないから、ISPは必須である。DIPでも、いちいち抜き差ししなくて良いから便利である。
基板上がゴチャゴチャしていて、ソケットから抜くのが大変な場合もある。

 さて、ISPを可能にするには、それなりの回路にしておく必要がある。まず、回路例を示そ
う。

 VPP、CLOCK、DATA、GNDの4つが書き込みに必要な配線である。4ピンのコネクタを
基板上に設けておくとよい。

 私は初めてISPを試した時、何もわからなくて、ライターから上記4つの配線をひっぱってきて
ICクリップで、ターゲットボード上のPICにつないでみた。だが何度やってもうまくいかない。
それはなぜか。あとでわかったのだが、それぞれの書き込みに必要な信号が、既存の回路に
影響を受けていたためにうまく信号が伝わらず、読み出しや書き込みができなかったわけだ。

 たとえば上記の回路図で、4ピン(MCLR)に図のようなリセット回路ではなく、いきなり+5V
が接続されていたとする。ある使用条件下では、リセット回路を省略して、MCLRを+5Vに接続す
ることがある。
 そこへVPPを加えたらどうなるか。+5Vにつながっている他の回路、負荷にもVPP電圧が
加わってしまう。実際に流れる電流は少ないから、部品の破損は無いと思うが、負荷が重いために
その電圧が下がってしまうことは十分に考えられる。
 また、上図で4ピンにつながっている1KΩの抵抗が無く、そのまま10μFにつないであったら
どうか。VPPが加わった瞬間、10μFを充電するから、VPPの立ち上がりが遅れてしまうだろう。
規定のVPP電圧が、必要なタイミングで加わらないかもしれない。

 あるいは、13ピンや12ピンを入力として使っているとする。たとえばスイッチをつないでいて、
そのスイッチがONしてGNDにつながっていたら?そのピンに信号を入力しても、GNDに接続
されているから信号が変化しない。

 このように、周囲の回路との関係をよく考えなければ、ISPがうまくできない。

 上図では、12、13ピンから抵抗で、他の回路へと書いた。これらのピンが入力になっている
場合は、このように抵抗を直列に入れれば、外部回路の影響を受けにくい。入力の場合は、
インピーダンスが高いから、直列に入れる抵抗は1KΩでも10KΩでも問題ないと思う。
 出力として使っている場合は、直列に抵抗を入れると、そこで電圧降下して負荷に十分な
電圧がかからない。負荷にもよるが、直列抵抗は不要である。ただ、書き込みの信号変化に
よって、負荷がバタバタ動く事になるが、それで支障がないかを確認する事。また、重い負荷で
ない事。

 また、ISPをするときは、いったん電源を切ってからISPケーブルを接続し、電源を入れ、
書き込みが済んだら、電源を切って、ケーブルを抜いてから、再び電源を入れる事。できれば、
ISP中はリセットボタンを押しっぱなし(ON固定)にする。書き込みが終わった瞬間から、CPUが
走り出して、出力ピンの信号がライターへ逆流する可能性がある。


■製作例
 いままで色々作ってきたが、今回は、次のようなターゲットを例にして説明を進めていこうと
思う。

 これは、施設の利用時間と延長料金を計算するための専用電卓である。入った時間と出た
時間を入力すれば、1時間までは延長0円で、あとは10分ごとに、単価をかけ算して延長料金
を求めるもの。1分から切り上げで10分単位にしている(つまり、分に9を足して、10の位を
見ているわけだ)。単価は基板上のロータリ式ディップスイッチで設定する。

 いままでは、普通の電卓により手動計算をしていたが、時々、間違いがあったため、専用の
計算機がほしいと言われて作ってみた。(時間計算の電卓って、見かけないよね?)


1.仕様
 入力手段 キーボード(キー16個)
        ロータリ式BCDディップスイッチ 2桁
 出力手段 液晶(20桁×4行)
        LED1個
        ブザー(発音回路内蔵)1個


2.工作ノウハウ
 試作品は、さっきの写真のように、適当な板に固定すると取り扱いやすい。まだ試作の段階では、
あちこちオシロで当たったり、配線を変えたり、部品を付け替えたりする事がある。ヘタにケースに
入れるより、こうするほうが良い。

 マックエイトのパーツカタログを見ると、いろいろ便利なグッズがある。上の写真で、基板を
固定している白いプラスチック部品がわかるだろうか。昔のアルバムで、写真のカドを固定する
三角のシールのようなものがあったけど、それをナツカシく思い出す部品だ。

 液晶のカドを固定しているのがそれで、本来はネジ止め用なのだが、面倒くさいので両面
テープで固定した。どうせデバッグが済んでケースに入れるまでだから、これで良い。
 キーボードとメイン基板を固定しているのは、台座のようなもので、両面テープがついており
保護紙をはがして貼り付ける。突起を基板の穴に通せば固定される。これはマックエイトじゃ
なかったかもしれない。

 液晶画面の保護のため、アクリル板をやはり両面テープで貼り付けてある。このアクリル板は
今回わざわざ切り出したものではなく、切れっ端を何となく保存してあった中から見つけたもので
寸法がピッタリだ。前にも同じような事やったっけか?偶然の一致か?

 PICは16F877(通称バナナ?)を使う。その理由は、I/Oポートが多いからである。じつは、
私が40ピンのPICを使ったのはこれが初めてだった。

 このように寄せ集めの部品で、さっさとハードを作ってしまい、ソフトの開発を先に進めてもら
う。しかし今回は、私がソフトまでやる事になってしまった。ゼロから作り始めて完成まで1週間ほど
かかった。


 私はラッピングのほうが、修正が簡単なのでよく利用している。ラッピングソケットは高いが、
このように秋月などで安く買えるピンヘッダー(2列のもの)ならば安上がりである。ちなみに
リレー式電卓も、このやり方で全て作り上げた。

 基板のハンダ面で、端子をハンダ盛りでつないでいく(次の写真)。


 赤、青、黄色の配線は、ISPをあとから追加したもの。映画「エアフォース・ワン」で、飛行機の
燃料を放出しようと大統領が、衛星携帯電話で軍の担当者にアドバイスを受けながら、配電盤
の配線を切ってつなぎかえようとしていたシーンを思い出す。だが、かんじんなところで、電話の
電池が切れてしまった。迷った大統領は、「国旗の色は切れない」という、いかにもアメリカ
合衆国大統領らしい、アメリカ的ジョーク?というか、私個人的には名セリフ(笑)を言いながら
国旗の色じゃない配線を切って、接続し直し、燃料放出はうまくいった。

 電源の配線は、錫メッキ線によって行う。30センチぐらいに切って、ペンチでグーッと、ゆっくり
ひっぱって延ばすと、まっすぐになる。むかしは、板でサンドイッチしてゴロゴロ転がしたり、
微妙に曲げたりして、いかにまっすぐにするか苦労したもんだが、ひっぱれば良かったのだ。
 あとはアルコールなどの溶剤で汚れを拭くか、軽くサンドペーパーをかけてハンダメッキを
すれば使いやすい。面倒だけど、手間をかけた分、使いやすくなる。

 錫メッキではなく、ハンダメッキ線というのがあるらしい。ハンダメッキのほうが使いやすいとの
事だが見たことがない。

 電源の配線用としては、以前に銅箔テープを使った事もあるが、テープの糊だけで接着して
いるのは不安があった。ハンダであちこち固定したものだ。それに銅箔テープは高い。やはり
スズメッキ線が最適であろう。

 コネクタの圧着は、工具が無いと面倒だが、最低でもフラットケーブル用の工具は揃えて
おきたい。私はパソコンのパーツショップで、¥4,000ぐらいで買ったが、だいたいこのくらいで
しょう。万力よりはだいぶマシです。

 航空電子とか日圧のコネクタは、専用の圧着工具を本気で買うと何万円もします。仕方ないの
で、ラジペンの先でカシメて、被覆が溶けない程度の熱加減に注意して、ハンダを薄く流して
おきます。但し、こういうのは試作の時だけですよ。
 もっと細かく言えば、まず線の先端をむいて(このとき、被覆を取り去ってしまわないで
少し切り離した状態で、被覆の上からよじってやります。そうすると心線が汚れないし、よじり
やすい)、予備ハンダをします。端子のカシメ部分は、意外に短いですから、線の先端は短め
に切ります。端子には、被覆をかむ部分と、線の先端をかむ部分があります。先に、線の先端を
かむ部分に線を合わせ、ラジオペンチでかしめてやります。そこへ、ハンダを薄く流します。この時、
被覆が溶けないようにするのと、端子の先端の接点部分にまでハンダが流れていかないように
気を付けます。
 少し冷えたら、被覆をかむ部分をラジオペンチでかしめます。正式な圧着工具で処理した物の
ようにキレイにはできません。あくまでも試作・実験用です。


3.面倒なケース加工と、厄介なアルミパネル加工
 さぁ、ケースに組み込んで最終段階。
 だがアルミパネルの加工が非常に厄介。厚さ2ミリが難関!キーボードが付くから、薄い板には
変えたくない。ダイヤモンド円板カッターで切れないかと試みましたが、ほとんど徒労に終わって
しまった。だるくなって、リポビタンの空き瓶を試し斬り。うーん、ガラスは切れるのになあ!!


 なんだかPICとは全く関係ないが、アルミの加工は意地になってしまうな。エイクソ、エイクソ。

 諫早市の日大高校の横の道を、大村方面に向かって走ると、諫早と大村の境界に橋があって、
そこから右手を見ると、金属をレーザーで切断加工とか何とか書いてある工場がある。でも、こんな
個人レベルの品物を1個だけ頼むなんてできないだろうなあ。レーザーでスパスパー!いいなあ!!

 (左の写真)四角に切り抜きたい部分のフチに沿って、ドリルで穴をあけた。アニメか何かで、ドアに
マシンガンが打ち込まれて、人間の形にくりぬかれるというのを見た覚えがある。ルパンか。
 (右の写真)そのあと、円板カッターで穴同士をつないでいく。穴をあけずに、いきなり円板カッターで
切ろうとしても簡単にはいかない。面倒でも、あらかじめミシン目のように穴をあけておけば、ラクに切れ
る。なお、「コ」の字に3方向だけ切り込めばよい。あとは折り曲げて取る。これは私の手ではない。
作業を担当されたT氏に感謝!(私はちょっと手伝った程度)


 円板カッターの刃(砥石)は、気が付くと、割れてどこかに飛んでしまっている(笑)。回転する刃を
見ていると、急に色が薄くなって見える。アレッと思って止めたら、半分欠けているという具合。

 (左の写真)デコボコ、バリだらけなので、必死でヤスリをかけて仕上げた。このクソ暑いのに、アルミ
の粉が散らかるから外で作業した。ゴシゴシ、ギコギコ、ゴシゴシ、・・・・・・ああー、レーザーでスパ
スパーって切れたらなあ!!!!
 (右の写真)どうだ完成したぞ。ふっふっふ。保護シートをはがしたらピカピカ!!でもアルミのまま
だと安っぽいから、黒いプラスチックシートを貼り付けた。


 ※このあと、もうひとつ液晶を付けて欲しいとの要望があり、上の写真とはだいぶ違った様子にな
りました。ユーザの意見により、Cキーと=キーの位置も変わりました。
 9月9日に現場設置したので、写真を撮るヒマなし。現在、活躍中です。

 配線のハンダ付けがはずれないように、ホットボンドで固定したり、ホコリが入らないように、キー
ボードの裏側のスキマにスポンジをつめたりして、どうか故障しませんようにと祈りを込めましたが、
機械は壊れるものです。
 だから、いつ壊れてもいいように、これを導入する前の状態にすぐ戻れるようにするとか、代替機を
準備するとか・・・アルミの加工、もう1回やるの?(汗)


〜〜〜〜 後日記(2003/12/7) 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
 「ジグソー」を買いました。アルミの加工は何度でもやれそうですが(笑)

 こういう物があったとは・・・「オーディオクラフトマガジンNo.1」のおかげです。(73ページを
参照下さい) うっかりしていた・・・これがあればラクチン(かも)ね! (まだ使った事ないので)

 ちなみに「オーディオクラフトマガジン」には、・「高田継男先生」が、おそれ多くも、御写真
入りの記事で・・・御みずからラジオを組み立てられ、楽しそうな表情で「聞こえるカナ?」と
クリスタルイヤホンをお耳に御装着あそばされて、ループアンテナの前で、ダイアルをグリグリと
ひねられております。
 御写真より、御高齢とお察し致しましたが、人間いくつになっても、組み立てたものを初めて
動かす瞬間というものは、ドキドキワクワクで、子供のように表情にあらわれるものであります。

 高田先生の記事は、いまはなき「ラジオの製作」でおなじみでした。80年代でしたが・・・
「たけし君」が「高田OM」を訪ねて、いろんなアドバイスを聞いたり、電子工作を指導して頂くと
いう、対話形式の記事で、架空の話とは思いますが、リアリティを感じていました。自分の近所
にはそういう人がいなかったので、あこがれもありました。
 小学生の時、事務のおじさんの車にアンテナが付いているのを見て、おそるおそる、無線に
興味があるんですと話しかけてみた事はあります。

 もともとアマチュア無線とは、無線に興味を持ったラジオ少年が、近所のでっかいアンテナ
タワーを見て、おそるおそる訪ねてみたら良いOMさんで、手取り足取り指導してくださった、
という理想の世界だったようです。決して、携帯電話の代わりではありません。

 ただのでっかいタワーではなくて、しばらく眺めていたら、いきなりグルグルと動き始めて
ビックリ。遠くの敵だか味方だかわかりませんが、狙いをさだめてデムパを送り出すのです。
あれはローテータというのか、ボクも将来、あんなでっかいタワーを建てて、世界中の人と
交信したいなあと、あこがれたのでしょう。
 月面反射という方法もあるのか・・・なんだかロマンを感じるなあ、月に自分の電波が反射して、
遠くの人と交信できるなんてステキじゃないか、月というものが身近に感じられると、妄想を
抱いていましたねえ。



 左の写真: ジグソー用のブレードです。
         アルミをよく加工すると思うので、鉄工用のものを買っておきました。
 右の写真: 付属の六角レンチは、ここに収納できるので便利です。よく考えてあります。


 ※ちなみに、さっきの73ページの記事は高田先生ではありません。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


3.完成、そして
 (ソフトは別の項目に書くとして) さあできたぞ。
 できたぞ、と言っても、何を基準に「できた」と言えるのか。
 自分の気持ちが「できた」じゃ製品としては失格。
 とくにこの装置は、金額を扱うから、間違いは許されない。実際の店舗の伝票を借りて、責任者
立ち会い確認のもと、伝票をどんどん打ち込んでテストをしました。結果は、問題ナシ!

 これは組込前の液晶画面ですが、このような表示内容になっています。
 INは入場時刻、OUTは出場時刻、この2つを打ち込むと、下の2行が計算され表示されます。
 エンチョウとは、最初の1時間を引いた、10分単位(1分から切り上げ)の延長時間です。
 リョウキンとは、単価(右側のカッコ内)に延長時間をかけ算した金額です。90分ですから、
9×30=270円ということです。


 この現場では、伝票に入場時刻が印字されるタイムレコーダがあります。お客さんが、
出場する時に店員が時刻を見て伝票に出場時刻を書き、ここで入場時刻と出場時刻から
利用時間と延長料金を計算します。このときに今回のこの電卓を使うわけです。

 この電卓自体に、時計機能を組み込んでおけば、出場時刻を入力しなくて済むでしょう。
RTC、バックアップ用のキャパシタ、時計合わせのプログラム追加、・・・電波時計という手も
あるが・・・、ちょっと頑張ればできそうですね。でも現場に設置してあるから、ハードウェア
の改造は、夜の営業終了時間から朝の開始時間までの間か、不定期の店休日にやるしか
ない。

 入場時刻をバーコードで印字して、それを読みとらせれば、入場時刻を入力する手間も
省けるよなあ。(しかし時刻を入力する事がそんなに大変とは思えないし、液晶画面がお客
さんにも見えるようになっているから、間違いは指摘される)

 さらに、システムが全面的に変わるけど、お客さんにチップの入ったタグをつけてもらって、
これによって入場時刻と出場時刻を、非接触で管理するという方法も?しかし他の人と
すり替えられたら困るなあ。自分は丸一日過ごして料金がかかっていて、隣に今さっき入って
きた人が寝ている。タグをこっそり取り替えれば、延長料金無しでは!

 タグは人物が特定できないから、カメラで顔写真をとって、自動識別するという方法も?
いやこれは、データを保存していないと言っても肖像権か何か、問題あるかもしれないし、
大げさだよなあ。

 指紋認証は・・・ほんの数年前から、USBで接続するやつがあるけど、あれって、USB上
のデータを横取りしたらどうなんだろうね。結局、USBで送っているわけだから・・・暗号化は
しているのかなあ。

 指紋で個人を識別するとしたら、本人の指をつめて持ってくるとか、シリコンか何かで型を
とって樹脂成形するとか、本人を殺して死体をかついで、指紋認証に指を当てるとか!?
そういう裏技もありですかねえ。
 冒険野郎マクガイバーでは、手形での認証だったか、そのスキャナ部分に壁土を削った
粉を振りかけると、手の脂が残っている部分に粉が付着して、まんまと他人になりすまして
侵入できる、というのをやっていたな。これは実際にはうまくいかないとは思うけど??


 夢は果てしなく膨らむけど、そこまでやる必要も無いというのも現実。せいぜい、出場時刻を
入力しなくて済む程度までで良さそうです。店としては、他にやらねばならない事がたくさんあり
ますからね。

 プログラムを作っていて面白いのは、液晶やキーボードのドライバが完成して、計算に必要
なサブルーチンが揃って、さあ、あとはこいつらを組み合わせてやるだけ!という段階じゃない
かなと思います。必要なサブルーチンが揃っているから、液晶への文字表示とかEEPROM
の読み書きとか、何でも簡単に書けるから、どんどん片づく。あれこれ余分な機能を付け加え
てみたくなったりするものです。

 逆に、プログラムを作り始めたばかりの、液晶やキーボードのドライバを作りながらテスト
している時はあまり面白くないな。うまく動かない時とか、とくに・・・(^_^;)
 何というか、面倒くさい部分でしょう。まだ、山のぼりを始めたばかりの状態というか・・・、
この先はずいぶん長い・・・この壁を乗り越えなきゃ、何もできやしない、とか何とか色々考え
たりします。まだハードウェアの問題が残っていたりするし・・・。

 EEPROMの読み書きルーチンなんか、本などからパクッてくればいいだろうけど、一応、
自分で内容を理解していないと不安だし、他のプログラムとの関係やら影響を確かめなけ
ればならない。
 自分で試してみて、ウン、ちゃんと動いている、という具合に、動作を確かめて、確信が
持てるようになって、はじめて次の段階に進めますね。

 画面表示やキー入力ができるようになれば、ICE無しでも結構デバッグしやすいもんです。
結果を確かめながらひとつずつ進んでいけます。


■ソフト関係
1.ソフトではなく石を売るのが石屋
 PIC用のアセンブラは、無償で手に入るのでありがたい。いまはMPASMだが、当時は、
MPALCを使っていた。
 秋月のAKI−PICプログラマを買ってからは、付属のPAをずっと使っていて、最近は、
ICE(ICEPIC2)を使う必要があり、MPASMに統一した。

 最初の頃は、まだパソコン通信の時代で、東京のアクセスポイントまで電話回線で接続し、
料金にビクビクしながら(東京までの電話代が高いから、無償とは言い難くなってくるが)、
リストをログに保存しておいて、よく見て選んでから、最小限のものをダウンロードしたものだ。

 トラ技の記事などでは、自作のアセンブラを使っている人がいた。ソースプログラムも、その
独自の書式で書かれているから、同じアセンブラをダウンロードして使わなければならない
のが不便だった。
 プログラムの流用や、学習を考えたら、そういう独自の書式のものは、努力は認めるが
遠慮してほしいと思う。


2.ナツカシのハンドアセンブル
 現在はアセンブラが簡単に手に入るが、インターネットやパソコン通信という手段がない頃は、
ハンドアセンブルという方法もあった。PICではなくZ80などでの話だが・・・。あくまでも余談
というか、参考程度に、その例を示しておこう。

 たとえばこれは、相棒の友人が10年以上前に作った、ポケコン用のテトリスの手書きソース
リストの一部である。3ミリ方眼紙のひとマスに1文字ずつ、几帳面に書いている。おそるべし、
「きっちりマン」だ。
 ←これは全て手書きです。

 拡大したもの。3ミリのひとマスに1文字だ・・・なんとマメな人でしょう。


 ここは、NEXT(次のブロック)のフォントを表示する部分でしょうか。


 でもまあ、昔は、FORTRANとかCOBOLといえば、コーディングシートでした。3ミリ方眼
じゃないけど、原稿用紙の細かいやつに、1マス1字でプログラムを書いていました。いまの
言語はフリーフォーマットですが、昔の言語は、ラベルが何桁目から、命令文は何桁目から
書き始めるなどの決まりがあったのです。たとえば、フォートラン専用のコーディングシートが
ありました。

 PICではハンドアセンブルをする必要はないが、以前、アセンブラ自体にバグがある
んじゃないかと疑った事があって、そのときにはハンドアセンブルをした(笑)。結局、
アセンブラにはバグは無くて、自分のミスだった。後述するが、有名なテーブルの問題で
意図しないところにジャンプするから、最初は何がなんだかわからなくて、いろいろあれこれ
調べまくり、そのひとつの調査として、オブジェクトコードのアドレス部分が異常なのでは
ないか、と思ったわけ。
 一時は、秋月のPAにバグがある!!と騒いだものだが・・・バグではなかった。


3.PICのプログラミング

3.1 アセンブラとメモリ
 PICには、Cよりアセンブラのほうが向いていると思う。メモリ(特にRAM)が少ないし、
そんなに大きいプログラムを作る事はないだろうから・・・。
 Cコンパイラは、いくつか買って少し試してみたが、やっぱりアセンブラのほうが向いている
と個人的には思っている。

 とにかくメモリが少ないし、スタックも少ない。あまりサブルーチンを細かく分けないほう
が良いと思う。ベタ詰めのほうが良い場合もある。
 そして、詳しくは別に書くが、16F877のROMが8Kもある!RAMが368バイトもある!!
などと単純に喜ばないほうが良いとだけ書いておきます。世の中そんなに甘くありません。

3.2 ICE
 仕事で、本格的にPICを使うならICE(インサーキットエミュレータ)は必須でしょう。

 私は、ICEが必要になるほど複雑なものは、PICで作った事がありません。もともと、ICEを
使わない開発方法に慣れているからかもしれませんが、ソフト屋からは「よくICE無しで作っ
ちゃうよなあ」と、あきれられています。あなたがずっと使っているから私が使えないのです。
もうICEを使わないデバッグに慣れてしまいましたので不要です(笑)。いつもプログラムを頭に
入れて、頭の中でシミュレーションしながら、問題箇所を絞り込んでいます。タイミングは直接、
オシロで波形を見ています。

 仕事場には、ICEPIC2があります。これは、数年前に購入したものです。

 ICEPIC1か2かはケースに書いてありません。上の写真を良く見ると、私がマジックで書いた
2が見えるでしょう。1か2かどっちを買ったのか忘れたからです。これは新しいドータボードを
買うとファームウェアが1と2の両方の石が付属しますから、どちらなのかハッキリしていなければ
なりません。自分で書いた注文書なんかを探したりして、やっと2だったかと思い出しました(笑)。

 IPIの方は、私がどこの何者かわかっちゃいますね。でも、宣伝するつもりはないし、高い
買い物でしたから、容赦なく、正直な感想を書かせて頂きます。ICEPIC2本体、SOP変換ソケ
ット、ドータボード各種(4〜5種類ぐらい)を買ったんだから上得意様でしょう(笑)。

 中を見ると、基板が2階建てになっていて、三ツ矢サイダーみたいなマークの付いたRAMが
並んでいたりします。ALLIANCEでしたっけ。

 ドータボードのコネクタのハンダ付けがイモで不安です。部品面ですから工程的に手作業に
なるのでしょう。コネクタの形に合わせたノズル付きの小型ハンダ漕でもできますけどね。
新しいドータボードが届いた時に見たら、明らかにハンダがはじいているのがあって、こりゃ
イカンだろうと、自分でやり直したぐらいです。

 ICEPIC2本体は¥159,000、ドータボードは各¥50,000でした。マイコン用のICEとして
は、安いほうです。H8用のICE(コンピューテックス)もありますが、これは70〜80万円でした。
だいたいそんなものです。ICEは、ずっと使うなら購入した方が良いですが、普通は、リースに
します。リースで、開発期間中だけ使います。とにかく高価なものです。

 ICEPIC2のマニュアルですが、英文の小さい本です。RF Solutions社のWebよりダウン
ロードも可能です。ココ
 日本語マニュアルは、パソコンのカラープリンタで印刷した、ワープロ打ちの数ページのものが
付属します。あまり細かい事は書いてありません。最初は、たったこれだけ?と思いました。
 ドータボードに付属するマニュアルも、英文で、たった1枚の両面に印刷してあるやつだけで
す。ジャンパー設定の方法がわかりにくくて不安です。おそらくこうだろう、という具合に、いち
かばちかです(ウソ、半分本当?)。

 ICEで意外な盲点(ソフト専業の人にとって)だったりするのは、クリスタルです。
 スピードを変えようとして、ターゲットボード上のクリスタルを交換したけど、何だか、思った
ほど速くならないなあ、変わってないような?という人がたまにいます。
 これはほとんどのICEに言えると思うのですが、クリスタルは、ターゲット基板上ではなく、
ドータボード上のものが有効になっています。プローブのフラットケーブルで延長した状態で
ターゲットボード上のクリスタルがまともに発振できるわけがありません。ハード屋にとっては
常識ですが、ソフト屋にとっては常識じゃないみたいで、説明してもよく分かってくれません。





(作成途中)


■ハマった事、つまづいた事

(1)16F877と、16F877Aの違い
 試作品を急いで作っていた時、16F877が足りないので追加手配してもらった。届いたのは
16F877Aで、Aの有無は、まあ同じだろうと思って書き込もうとしたら・・・MPLABのデバイスの
リストに無い!エーッ!!
 ダメもとで書いてみても良かったかもしれないが、ここで壊してしまったらどうにもならんので
PICSTART PLUSのファームと、MPLABを最新版にした。

 −−−PICSTART PLUSのバージョンアップ−−−
 PICSTART PLUSのファームは、17C44/JW(窓付き)なので、紫外線ランプで消して
新しいバージョンを書き込む事ができる。しかし、いま使っている物を消したら、動かなくなって
書き込めないぞ(笑)。
 だからもう1個買わねばならぬ。IPIでも、RSでも秋月でも売ってるでしょう。ワンタイムじゃな
くて、高くても窓付きを買うことです。そして、買ってきた17C44に新しいファームを書き込んだら、
PICSTART PLUSの電源を抜いて分解してその新しい石に交換し、元通りに組み立てます。

 ファームウェアを書き込む時に、コンフィグレーションビットの設定はこれでいいのかな?と
心配になりましたが、ダメだったら消してまた書けばいいし、と思って試しました。結果的に
問題はなかったですね。hexファイルにコンフィグレーションビットの内容が含まれていました。
 あえて書けば、 オシレータXT、ウォッチドッグTMR、プロセッサモードMicrocontroller です。

 さらに、現在のMPLABをアンインストールして、新しいバージョンをインストールします。
MPLABは5.xx.xxと、6.xx.xx.は全く別物のような感じです。現在、5.xx.xxを使っている
のなら、慣れもあるでしょうから、5.xx.xx.の最新版にしたほうが良いでしょう。

 古いバージョンのファームは、消去する前に、念のため、読み出してファイルに保存しておいた
ほうが良いでしょう。新しいファームが正常に動作するのを確認したら、紫外線で消去して、次回の
バージョンアップに備えると良いと思います。そうしたらあわてなくて良いし・・・でも消去せずに
保存しておいて、バージョンアップの時に消去するようにしたほうがいいかなあ。いま使っているのが
壊れた時に使えるかもしれないし?


 PICSTART PLUSには窓付きの17C44が内蔵されていました。ワンタイムの
17C44を1個買って、これをファームウェアのバージョンアップ時の書き込み用と
して使うのはどうでしょう。つまり、窓付きのほうは何度も消して使うわけです。
窓付きの17C44を書き込むために、ワンタイムの17C44でPICSTART PLUS
を動かすわけです。
 うっかり、窓付きの17C44を1個買ってしまって、あとで考えたらもったいない
なあと思ったんです。

 ちなみに、秋月やIPIの広告に、バージョンアップ用17C44 ¥1,500などと
書いてあるのはワンタイム品です。窓付きはもっと高いです。

 それにしても、やたらにPICの品番が増えたなあ。Aのあるやつと無いやつもある。どれを
使って良いやらわけがわかりません。A無しは、今後もずっと供給されるのだろうか。すぐに
無くなるような物は製品に使えない。
 ユーザの要望に応えて、こんなふうに種類が増えたのだろうけれど・・・。
 上位互換とか、メモリが増えたとか書いてあるけど、実際に使ってみると、けっこうソフト
の修正が必要なんだよね。16F84の置き換えに16F628!!と言うので、確かに安い
し(置き換えを狙った戦略もあるのでしょう)、プログラムを移植したら大変だった。レジスタ
のアドレスも違うしなあ。メモリが増えたんだからアドレスの違いぐらいどうって事ないで
しょ、って開き直られればそれまでなんだが。

 Aの有無なんか、大した違いとは思っていなかった。TTLなんか、型名の最後にAが
付いてバージョンアップしました、というのがよくあったけど、プロセスの改良とかが理由で
機能的には変わらないから気にしないで差し替えていたし、それで問題なかった。
 ところがPICは、Aの有無でだいぶ違うようだ。16F877Aは、877にコンパレータ2個
内蔵の改良型と、秋月の広告に書いてあった。ポートの設定の見直しが必要になるのでは
ないかと思います。

 ライターの書き込み設定を16F877にしておいて、16F877Aに書き込みをすると動き
ません。書き込みアルゴリズムが違うのでしょう。
 自宅でデバッグの続きをしようとした時のことです。
 職場で、16F877Aを差して、ライターも16F877Aの設定で書き込みをして、ちゃんと
動いたプログラムでした。
 ところが自宅のライターは、16F877Aは対応できず16F877の設定だけです。これを
忘れて、ほとんど同じプログラム(動くはず)を書き込んだら動かなくて、アレー?ナンデ?
という事態になりました。
 すぐに気づいて、16F877に差し替え、ソースプログラムのヘッダー部分も16F877に
戻し、再度アセンブルして書き込みをしたら正常に動きました。


(2) PICインターフェースハンドブックのデバッグ
 本に書いてあった、と言ってそのままパクッてきて安心しているようではいけません。
間違いはどんな本にでもあるものです。
 PICインターフェースハンドブックは初版から買っています。高価な本ですが、ずいぶん
助けられました。思い切って買っておいて損はありません。しかし間違いが結構あるのも
事実です。ヒマができたら、全ページを校正して送ろうかと思っています。覚悟しろよ(笑)

・その1
 16ビットの減算サブルーチン


 これは、16ビットの減算サブルーチンですが、これを16ビットの比較に利用した時に
問題が起きました。
 (作成途中)


(3)12C508Aの出力ポート関係
 落とし穴が2つもあったぞ。やられたぁぁぁ〜〜〜!!!!!!
・その1
 GP2をTRISで出力に設定したのに、出力信号が出ない。LEDを接続しているが光らない。
 → GP2は特別で、TRISの出力設定に加え、OPTIONレジスタのビット5を0にしなければ
  出力されません。
   これは最初わからなくて困ったよ!データシートを良く読むと書いてありました。
・その2
 電源投入、ポートの入出力設定の直後、出力ポートがHになっている。いきなり出力が
 Hになっているのは困る。最初はLにならないのか?
 → 電源投入時のポート状態は不定です。初期化に、CLRF GPIOを追加する事。

 とにかく、データシートに書いてありますから、良く読むことです。ちょっぴり卑怯な感じ
もするけどね。かれこれの条件で保険が適用できない、なんで?・・・ほらここに書いて
あるでしょって、ちっちゃい字がビッシリ詰まっていて誰も読まないような保険の契約内容を
見たら確かに書いてあるね、という感じですか?(笑) こち亀の両さん保険とか・・・。

 それは大げさですが、実際には、注意書きがワクで囲ってあったり、網掛けになって目立た
せてあるので、気を付けて見て下さい。目立つようにしてあっても、案外、見落としているもん
です。私もトラブルがあってから、あわてて見直していました。
 何も無いときにそういう注意書きを見ても、何も感じるものがないんですね。


(4)変数の二重定義
 これは完全に自分のミス!初歩的!!マ〜ヌ〜ケ〜!!!!

 3連休をつぶして、自宅に閉じこもってプログラムを作っていた。一気に作り上げるぞ、という
意気込みで、はりきっていた。
 ある重要なサブルーチンのテストで、結果がLEDで見られるようにしていた。ところがLED
を見ていると、ある値で止まるはずなのに止まらない。チラチラ、チラチラしている。
 予定していた値にならないし、なんでこんなにバラつくのか?

 サブルーチンを穴があくほど見直して、おかしいなあ、これで動くはずなんだがと悩んでいた。
これで3連休の2日はつぶした。

 しかし、いつまでも同じところで止まっていても時間がもったいないから、とりあえず次の
処理部分に取りかかり、全体を通しての動作はできるようになった。さっきの問題点を除いて
は・・・。

 それから数日、別の部分で変数を追加するため、変数の定義部分を見ると、こんなふうに
なっていた。もともと過去に作ったプログラムをひっぱってきて、書き直して使っている。引き
続き使える変数は、そのまま残していた。TMPL1がそう。STATEは新しく追加したもの。


STATE  EQU  BASE+11H

(間に4行空き)


TMPL1  EQU  BASE+11H


 をい!
 なんだこりゃ。同じアドレスになってんじゃん・・・これじゃ結果がおかしくなって当然だよ・・・。
 新しく追加した変数が、過去のプログラムから残していた変数のアドレスに重なっていた。

 これはアセンブルでエラーが出ない。それに、プログラムの動きがおかしい時は、ふつう、
そのプログラム部分しか見ないもので、変数の定義部分はなかなか見ないものだ。
 たまには変数の定義部分も見直してみる事。過去のプログラムからひっぱってきた変数定義
は、歯抜け(アドレス飛び飛び)のままにしないで、きれいに並べておく事。


(5)16F628が書き込めない!
 IPIのライター(PDE−EX)で、デバイスのリストに16F628があるのに、書き込みをすると
エラーが出た。ファームもパソコン側のソフトも、最近バージョンアップ購入したばかりの最新版!
なぜ?

 買った時の箱をのぞいてみると、ナゾのソケットが付属していました。普通の丸ピンのICソケッ
トで、10ピンだけブッタ切られていました。どうも、書き込みの際に10ピンを浮かせなければ
ならないようです。しかし、いちいちこんな変なソケットを付けたりはずしたりするなんて
バカバカしいです。はっきり言って、やってられません!!

 そこで、こんな物を10分で作りました。

 材料は、ご覧の通りです。配線は5本だけ。データシートを見ながら配線したので、回路図は
描いていません。両面からハンダ付けする必要があるので、スルーホールのユニバーサル
基板を使います。
 レバーソケットの取り付けは、シングルICソケットを使わないと配線しにくいです。その上に
レバーソケットを装着すると良いでしょう。グラグラしないように、シングルICソケットの外側に
ホットボンドを流しておきました。
 レバーソケットには、デバイスの装着方向を示し、ズレ差しを防ぐため、左の写真のように
シールを貼ってあります。
 下のヘッダーは、18ピンのものがあったので使いましたが、できれば40ピンのほうが、
グラグラしないでしょう。

 こういうソケット以外に、ライターの本体を改造して、スイッチを取り付け、10ピンを浮かすか
どうか選択できるようにする方法も考えられますね。


(6)12F675のキャリブレーションデータが消えた!
 これは、内部RC発振を使っているフラッシュROMのPICだったら、共通の問題かもしれません
が、私は12F675で経験しました。
 コードプロテクトされているPICに、書き込みを行うと、キャリブレーションデータが消えます(3FFh
番地のデータが3FFFhになる)。このPICは正常に動作しない事があります。

 たとえば、出荷した製品に搭載しているPICを、バージョンアップのため書き換えを行う際、この
問題が発生して、全て台無しになる可能性があります! 【重要】

 12F675の書き換え時に何か問題があるのでしょうか。16F84からフラッシュROMに慣れ
親しんできました。いつも、MPLABのPICSTART−PLUSで「Program」ボタンだけを押して
書き換えをしてきました。だから12F675でも、同じようにしたのです。

 窓付きPICでは、コードプロテクトをかけると、それ以後、紫外線消去しても使えなくなる、
という制限があるのは知っていました。でもフラッシュなら、プロテクトをかけてもそんな心配は
ありません。試作品をそのままテストで出荷する場合もあるので、普段からプロテクトONに
しておいたほうが便利でした。
 16F84ならそれで問題は起きなかったのです。ところが12F675で同じ事をやったら・・・
アレ?動かない??

 プロテクトをかけていてもキャリブレーションデータ(3FFh番地)は読めるのですが、読んで
みるとデータが3FFFhになっており、消えていました。アレ?アレ?何で??

 新品のPICを1個持ってきて、プロテクトONで書き込みを行うと最初の1回は良いのです
が・・・2回目からは動きません。なぜだろうと思いながら、何個も試してみました。フラッシュと
言ってるけど本当はワンタイムじゃないのか?と疑ったりもしました。さらに何個か試してみまし
た。ウーム・・・、ゴミを生産しているようだ・・・・・・これは何かある。なんなんだろう??

 英文のデータシート、プログラム仕様を隅々まで調べて、必死で「解読」(翻訳ではない)しま
した。英語というのは、文章の量に対して、内容が少ないような気がします。何行にも渡って
いるのに、訳したら大したことない意味だったりしました。英語というのは、単語を拾い読み
して、ザッとフィーリングをつかんで、つまり、ああ、だいたいこういう事を言いたいのだ、という
感触で読むものなのかもしれません。私は英語の勉強が足りませんから、本当にそうなのかは
わかりませんが・・・。

 今回の問題については、ハッキリ書いてある部分は見つけられませんでした。バラバラの
情報と、実験によって原因を明らかにしました。

 【原因】
 プロテクトがかかったPICに対して「Program」で書き込みを行う際、PICライターは
プロテクトビットをオフにします。PICはそれがオフになるとプログラムメモリもデータメモリも
全て消去する仕掛けになっているので、当然キャリブレーションデータも消えます。

 キャリブレーションデータはどこかにメモしておかない限り、消えてしまってはどうにもなりません。
できればパッケージにマーキングしておいてほしいですね。MPLABのライターのmodifyで
3FFFh番地にそのデータをセットしてprogramすれば修復できますから。
 メーカーとしては、そんな事に金をかけるより新しいPICを買ってほしいんでしょうねえ。

 【対策】
 対策というか、書き込み作業時のルールにしなければならないのですが、必ず「Erase」を
してから「Program」をして下さい。

 Eraseはプログラムメモリもデータメモリも全て消去するのですが、消去前に、自動的に
キャリブレーションデータを保存して、消去後に書き戻してくれますから結果的にキャリブレー
ションデータは保持される事になります。

 何で「program」でその操作をしてくれないんだろうなあ。
 アッ、hexファイルにキャリブレーションデータを含んでいる場合があるのか。しかし実際に
書き込みを行うPICのキャリブレーションデータを生かすのが普通でしょう。
 なんなんでしょうねえ!


 ちなみに「Erase」をする際、PICを抜いておいてもエラーはでません。チェックしてないん
ですね。一方的に信号を送りつけているだけです。アメリカの価値観を押しつけているようなも
のです??

 さてキャリブレーションデータが消えてしまって、数値を控えていなかったら、そのPICは捨てる
しかないと思いますが、クリスタルを外付けすれば使えます。ピンが減るし、用途が限定されます
が・・・もったいないですから。

 いやあ、毎度のことながら、PICは色々とトラップを仕掛けて、忙しい私たちをハマらせてくれま
すねえ〜(笑)。




■LEAP PSTART
 秋月で売っている、マイクロチップ社PICSTART PLUS互換のライターです。広告では
互換と書いてありますが、さてどうでしょう?中身は同じでしょうか?(どこで見たっけか、
マイクロチップ社にOEM供給していて中身は同じと書いてありましたが・・・)

 百聞は一見に如かずと言います。買ってバラしてみました。
 よく見ると(右上)、なぜか”PICSTART”とシルク印刷されています。


 PICSTART PLUSに似ているけど、ちょっと違いました。
 次の写真が、私が以前から使っているPICSTART PLUSの内部です。

 PICSTART PLUSは、ご覧のように、ほとんど面実装部品だけです。一方、
LEAP PSTARTは、DIP部品が目立っています。PICSTART PLUSには
電源スイッチがありませんでしたが、LEAP PSTARTには付いています。
まったく同一の基板ではありません。
 しかし、部品の形状が違うだけで、回路的にはほぼ同じようです。

 PICSTART PLUSとそのまま基板を入れ替えられるかもしれないと思ったけれど
電源スイッチの所がケースに当たるし、ソケットの位置が違います。

 左: LEAP PSTART    右: PICSTART PLUS


 以上より、LEAP PSTARTの基板がPICSTART PLUSのケースに入れられない事
から、完全互換とは言えません。回路は、部品の形状が違うだけで内容は同じようです。


 IPIのライター、PDE−EXも仕事場にありますが、専用のライターソフトに慣れて
いないし、英語で色々と余計なメッセージが出るのがとてもイヤです。気持ち悪いです。
 はっきり言って、PDE−EXよりもこのLEAP PSTARTのほうが安いし、PIC−
START PLUSと互換なのが有利です。
 PDE−EXを買う理由はありません。

 ところで秋月さん、PSTARTに付属していた取説入りのフロッピー、エラーが出て
読めなかったんですケド・・・面倒くさいのでそのままにしているんですが、取説が
無くても特に困っていないし・・・でも、よかったらメールでPDFを送って下さい!?

 おまけ。LEAP PSTARTのケース(上側)

 この同じケースで、EPROMライターがあるでしょう?いくつかの機種に使い回しが
できるように、最初から穴が空いてるんですねえ。左の透明窓は液晶表示用でしょう。


■こんな所にもPICが!
 EPSON Endeavor NT−1000の修理をしていたら、シールが貼ってあって型名が
見えないけど、形がどうもPICのSOPパッケージのようなのではがして調べてみた。

 左の写真、暗くてよく見えないが、PIC16C54があります。

 ついでに、右の写真は、今回の修理箇所です。液晶パネルのインバータまでの配線が、3本
切れていました。もともと長さに余裕がなかったのが、ちぎれたような感じに見えました。

 以前の修理箇所は、電源スイッチがショボくて折れたんでしたね。0002

 結局、このノートパソコンは、私のものになってしまいました。飼い主に見捨てられたみたいです。

 以前、ガキがラジカセを落として液晶がぶち壊れたVAIOから抜いておいたメモリと、別に取って
あった20GBのHDDを入れて、パワーアップ!復活!!しました。
 VAIO用のメモリが使えるのかどうか、バッファローのWebで調べた限りでは使えるという証拠は
見つかりませんでした。ダメもとで、煙が出る覚悟までして試したらOKでしたよ。へっへっへ。保証は
ありませんけど、連続運転して色々試した限り、問題ないようです。


■ちょっとした工夫
 ICEが無いとか、ICEはあるけど実機に石をさしてテストしないと都合が悪い場合があって、何度も
石を差したり抜いたりする事があります。何度も抜き差しするうちにピンが傷んできて、曲がったり
折れたりしますね。
 よく使う手ですが、丸ピンソケットをさして、このソケットごと扱うようにしてピンを保護すると良いでしょう。

 それから、PICの周囲に部品が混雑していたり、基板をケースに組み込んだ状態で石を抜き差しして
テストしたいが、工具が入りにくく、抜き差しがしにくい場合があります。

 このように、丸ピンソケットと、延長用のピンを組み合わせて、「ゲタ」を作ると便利です。
 ICEのプローブを接続するのにも、ちょうど良いです。

 左側は材料、上が丸ピンソケット、下が延長用のピン(プレシディップ製)ですが、手に入らなかった
ら、いろいろ工夫してみて下さい。似たような部品は売っています。丸ピンソケットを2段にして、間を
太めのメッキ線でつないでハンダ付けしても良いのでは?

 右側は完成品です。何個も作って、活躍しています。

 このゲタごと、指でつまんで軽く動かせば、ソケットから抜くのもカンタンです。


■キー入力と表示
 キーボードから数値を入力し表示する、というのは、よく使うプログラムです。

 要求仕様は・・・
 数字の入力桁数が固定されていて、たとえば2桁で、数字キーを押していくと常に最新の
2桁が残り、もし頭に0を入れて入力、たとえば01と入力した場合は、0が取り除かれて(リー
ディング・ゼロサプレス)、10位がスペース、1位が1と、つまり「_1」(_はスペースの意味)と
表示される。
 最初から1桁だけ入力した場合は、10位のバッファは0のコード、1位のバッファは入力した
数字のコード、となる。
 コマンドキーを押すと、入力数値が確定し、どのコマンドキーが押されたのか、そのコードを
返す。たとえば電卓なら、コマンドキーは+、−、×、÷、=、AC、CE、などがあるわけです。

 この機能を実現せよ、となれば、なんだか難しそうです。画面表示位置を制御したり、何か
面倒くさそうな感じがします。

 時、分の入力では、12時間制か、24時間制かで、入力を受け付ける値の範囲が違います。
範囲チェックでエラーならば再入力を促しますが、それはDIGINルーチンでする仕事ではありま
せん。DIGINのあとに範囲チェックをして、エラーなら再びDIGINを呼び出して再入力させれば
良いわけです。

 入力しながら文字コードから10進数への変換もするんだろうか、などと考えてしまうかもしれ
ませんが、いっぺんにあれこれ片づけようとしないで、とりあえず10位と1位のバッファに数字
の文字コードが入って、Wレジにコマンドキーのコードが入ってくれればそれで良いのです。
あとは煮るなり焼くなり好きにしてくださいという感じです。

 最初は、キーボードの入力ルーチンで、文字コードを返すようにはしていませんでした。
しかし、このDIGINルーチンを作るには、文字コードのほうが処理上、便利なので、文字コー
ドを返すように変更しました。バッファに文字コードを入れれば、表示するのもそのまま送れば
良いですからね。
 文字コードから数字への変換はカンタンです。たとえばゼロなら、文字コードは30Hですが
ちょうど良い具合に30H〜39Hですから・・・頭の3をとってやれば数字になるでしょう。
これがもし16進数だったら、少し面倒です。Aが41Hです。引き算をしてやります。

 実際に完成したサブルーチンを下記しますが、最初から、いっぺんに記述したわけじゃなくて、
少しずつ付け加えていってこういう形になりました。ここが大切です。ローマは一日にして
成らず、という事です。そんな大げさでもないけど。

 もしこれがパソコンのキーボードだったら、もっと複雑になりそうです。数字は受け付けるが
数字以外は受け付けない。但し+、−、*、/、=、.、は受け付ける。ESCが押されたら
0にする。全角は受け付けない、あるいは、受け付けるが半角に自動変換する。

 単に数字の入力といっても、いろんな条件を考えたら大変ですね。これがユーザーインター
フェースの難しいところです。

 キークリック音をON/OFF切り替えできるようにしろとか、あれこれ要求も出てくるかもしれ
ませんが、現在のプログラムの機能への影響を確かめながら、ひとつずつ追加していくだけです。


;数値(2桁)入力
; キークリック音有り
; 指定の座標を数値入力エリアとして、2桁の数値入力を受け付ける。
; 1桁入力して、確定(コマンドキー入力)をすると、1桁の数値として
; バッファに格納される。
; 3桁以上入力すると、左シフトする。
; 数値入力エリア開始位置をL_XPOS,L_YPOSに指定してからCALLする事。
; L_XPOSは1以上18以下のこと。
; コマンドキー(時、分、=、C、入、出)入力時は、Wレジにそのキー
; コードを入れてリターンする。
DIGIN
    MOVLW  30H          ;バッファ初期化(00)
    MOVWF  INK10
    MOVWF  INK01
*10位の数字(文字コード)が入るのがINK10、1位の数字(文字コード)が入るのが
*INK01で、最初の状態は、ここで30Hを書いているのだから、00という事です。


    MOVLW  B'00000101'     ;ブリンクカーソルON
    CALL   LCDSET
*これはLCDのコマンドです。ブリンクカーソルというのは■が点滅するやつです。
*現在の入力位置を示すためです。


    CALL   LCDPOS        ;位置設定
*DIGINサブルーチンを呼ぶ前に、数値入力エリア開始位置を変数L_XPOS、L_YPOSに
*入れていました。その座標をここで設定します。これから表示するものはその座標から
*表示されます。


    MOVF   L_XPOS,W       ;表示のため10位位置を保存する。
    MOVWF  TMP2
*最初は、10位にカーソルを移動します。

DIGIN2
    MOVF   TMP2,W        ;バッファ表示する
    MOVWF  L_XPOS
    CALL   LCDPOS
*10位にカーソルを移動します。

    MOVF   INK10,W        ;10位が0ならゼロサプレス(スペース)
    XORLW  30H
    BTFSS  STATUS,Z
    GOTO   DIGIN4
    MOVLW  20H           ;10位ゼロサプレス表示
    CALL   LCD_DATW8
*スペースの文字コードを液晶に表示しています。これで10位が空白になります。

    GOTO  DIGIN5
DIGIN4
    MOVF   INK10,W         ;10位に0以外の表示
    CALL   LCD_DATW8
*ゼロ以外はゼロサプレスしませんから、そのまま液晶に表示します。

DIGIN5
    MOVF   INK01,W         ;1位の表示
    CALL   LCD_DATW8
*1位にはゼロサプレスはありません。ゼロの時は0と表示するわけです。

    INCF    L_XPOS,F        ;X座標+1(1位の入力位置を示す)
    CALL   LCDPOS         ;1位の入力位置
*1位の入力位置へカーソル移動します。

DIGIN3
    CALL   KEYSTAT        ;キー入力待ち
    BTFSC  STATUS,Z
    GOTO  DIGIN3
*キー入力を待ちます。
*キーから入力された文字コードはKBDBUFに入ります。


    CALL   KBDBUF         ;入力キー取得
    MOVWF  TMP1          ;入力キーコードはTMP1に保存
    CALL   BEEP0          ;キークリック音

    ;コマンドキーが入力されたら、そのキーコードをWレジに入れリターン
    MOVLW  3AH           ;3AH以上がコマンドキー
    SUBWF  TMP1,W
    BTFSS  STATUS,C
    GOTO  DIGIN1
*コマンドキーが押されたら、このまま下の命令を実行してリターンします。
*数字キーのときは、新しい入力を1位に、前の1位を10位に詰めるため
*DIGIN1へジャンプします。


    MOVLW  B'00000100'      ;カーソルOFF
    CALL   LCDSET
    MOVF   TMP1,W         ;キーコードを返す
    RETURN

DIGIN1
    ;数字が入力された時
    MOVF   INK01,W         ;1位を10位へシフト
    MOVWF  INK10
    MOVF   TMP1,W         ;最新の入力を1位へ
    MOVWF  INK01
*ここでは、1位の数字を10位へずらし、最新の入力数字を1位へ書き込みます。
*つまりバッファをシフトしているわけです。   10位←1位←最新
*たとえば、現在のバッファの10位、1位が、12だったとして、
* 12
*ここへ3が入力されると、シフトして、
* 23
*と、なりました。


    GOTO   DIGIN2


■ソフトウェアディレイ
 12C508はタイマー割り込みが使えないので、ソフト的にループさせて待ち時間を作る
事があります。
 幸い、内蔵クロックを使うと4MHzなので、4クロック=1命令サイクルですから1命令
あたり1μS(0.000 001秒)ですから計算がしやすいですね。
 ループが二重になっていると計算がややこしいですが、よく考えて整理したものが次
のリストです。実際に動作確認したものです。


;ソフトウェアディレイ
;
; 内側のループのサイクル数
; UCHI = 1+1+((TEMP2-1)*3+2))
; = 2+((TEMP2-1)*3+2)
; このサブルーチン全体のサイクル数
; ZENTAI = 1+1 + UCHI*((TEMP1-1)*3+2)) + 2
; = 4+UCHI*((TEMP1-1)*3+2))
;
; 全体のサイクル数と時間の計算<例>
; TEMP1=8, TEMP2=200として
; UCHI = 2 + (200-1)*3 + 2
; = 601
; ZENTAI = 2 + UCHI*TEMP1 + (TEMP1-1)*3 + 2
; = 4 + 4808 + 21 + 2
; = 4835
; TIME = 0.000001 * ZENTAI ※クリスタル4MHzとする
; = 0.004835 sec
; = 4.835 msec
;
WAIT
    MOVLW 8     ;1(CYCLE)
    MOVWF TEMP1  ;1(CYCLE)
WAIT1
    MOVLW 200   ;1(CYCLE)
    MOVWF TEMP2 ;1(CYCLE)
WAIT2
    DECFSZ TEMP2,F ;1(CYCLE) 最後のみ2(CYCLE)
    GOTO  WAIT2   ;2(CYCLE) 最後のみスキップ
    DECFSZ TEMP1,F ;1(CYCLE) 最後のみ2(CYCLE)
    GOTO  WAIT1   ;2(CYCLE) 最後のみスキップ
    RETLW  0     ;2(CYCLE)


■ICE無しでのデバッグ
 アマチュアではなかなかICEまで手が届かないものです。PICのICEは、ICEとしては
比較的安い方ですが、それでも結構な出費です。しかもICE本体だけじゃ使えなくて、
ターゲットのCPU用のドータボードもそれぞれ買わなければなりません。
 12C509のと、16F84のと、16F628のと、16F877のと、・・・という具合にそれぞれ
必要ですから、3つも買えばICE本体より高くなります。新しい石が出て、これ使いたい、
という時にまた出費になります。メーカーはモノが売れて嬉しいでしょうが、こっちは趣味で
使っているのですから、5万も10万も払えません。

 そこで、無ければ無いで、あれこれ工夫しながらデバッグしていく事になります。

 せめて、PICをソケットから抜いてライターで書いてまた差して動かす、というのは
やめて下さい。少し努力して、ICSPの配線をちゃんとして、実装したまま書き込みが
できるようにして下さい。これだけでもだいぶ効率が良くなります。

 そして、本当に動いているのか確かめる、見えないものを見えるようにする、ひとつずつ
確かめながら進んでいく、というのがポイントです。
 それにはどうしたら良いか?

 プログラムがうまく動かなくて、本当に入力を受け付けているのか不安になる事が
あるでしょう。PICは、I/OポートがA/Dと兼用になっているものがあり、その切り替え
設定をしていなかったり、間違っていると入力ができません。

T001
    BTFSC  PORTA,1
    BSF    PORTA,0
    BTFSS  PORTA,1
    BCF    PORTA,0
    GOTO  T001

 これはポートAのビット1の状態を、同ポートAのビット0に接続されたLEDに表示する
ものです。
 たとえばビット1に押しボタンスイッチがつながっていたとして、押すとLEDの状態が
変化するはずです。状態が変化する、というあいまいな言い方をしたのは、論理が
どっちになっているかは、回路しだいだからです。たとえば入力ポートを抵抗でプルアップ
して、押しボタンでGNDに落とすのなら負論理でしょう。LEDは、PICの出力ポートの
場合、吐き出しでも吸い込みでもどちらもドライブできますから、どちらの接続にして
いるかによっても、点灯の条件が違いますね。

 これで試してみて、ああ、ちゃんと入力されてる・・・それじゃ、今度はこのへんを
疑ってみよう、という具合に進む事ができるわけなんです。

 デバッグ用のボードには、LEDを付けるようにしてください。可能な限り・・・1個でも、
無いよりはマシです。
 プログラムのこのへんまでは走っているんだろうか?と確かめたい時、LEDの点灯
命令を埋め込んでおけば、確かめる事ができます。
 何ビット分もあれば、プログラムの処理のブロック毎に、0、1、2、・・・と数字が変わっ
ていくようにすれば、今、どのへんの処理を実行しているか(速すぎて見えないかも。
処理の内容にもよるけど、たとえば入力を確認しながら1ブロックずつ進んでいくような
プログラムだったら、見えますね)、最後にどこでコケたか、という時に参考になります。
 7セグが1桁しかないけど2桁表示したい、というのであれば、パッパッと切り替えて
表示すれば良いでしょう。

 何か入力を受け付けるたびに、LEDがトグル(点滅)するとか、処理中を示すために
点滅させるとか、色々と活用できるでしょう。

 製品でも、LEDが1個しかないけど、入力信号が動いたらLEDが点滅してわかるよう
にしたい、という要望があったりします。この場合、通常は「点灯」にします。通電表示、
すなわちPOWER LEDですね。そして、入力があった場合は、一瞬だけ「消灯」します。
これで、1個のLEDが、通電表示と入力確認を兼ねる事になります。何らかの確認手段が
あれば、手助けになるもんです。

 液晶があれば最高です。まずは、液晶表示がカンペキにできるようにしてから、デバッグ
にも活用します。そのためにはどうしたら良いか?いつでも液晶制御ルーチンが使える
ように整備しておく事です。

 デバッグはとにかく、見えないものを見ることです。ICEはレジスタの値や、実行中の
アドレスがわかるものですが、工夫しだいで、ICE無しでも頑張れるでしょう。

 ちなみに私は、MPLABのシミュレータは全く使った事がありません。「現物に聞く」
のが一番早いと思うので・・・(じつは最初の頃にシミュレータの使い方がわからずつまづ
いて、それっきりというのが事実(笑)。結局、シミュレータは無くても困らないというのも
事実(笑))。

 動く物をいち早く作り上げる、一刻も早く形のある物を見せる、現物にブチ当たる、これ
しかありません。


■どの石を使うのが一番いいのか
 PICを始めた頃から、種類が多くて選択に迷ったものです。
 もっとも、昔はフラッシュ(EEPROM)の品種が少なかったから、16C84(のちに
16F84)を選択したわけです。

 製品に使うなら、コストと入手性を重視します。入手性とは、納期です。何個とか何十個
なら、どこでも現金を払えば買えますが、500とか1000個だと、代理店経由で発注して
2〜3週間は待つことになります。
 これはと思う品番で、個別に代理店に問い合わせてみるしかありません。
 一般によく知られている、トラ技の製作記事に載っているような品番だと、比較的、手に
入りやすいと思います。

 面白いのは、16F84より高機能なのに16F84より安い16F628です。これは、
メーカーの戦略なのでしょうか。置き換えを狙っているのでしょうか。

 16F628というのは、16F84の上位互換であり、メモリ容量が増えているし、A/D
変換など機能が追加されています。
 ところが上位互換という言葉だけで納得してはいけなくて、現状の16F84のプログ
ラムはそのままでは動かず、なぜかというと、追加機能のポート設定を加えなければなり
ません。当たり前といえば当たり前ですが、データシートをよく読んで勉強せにゃーならん
ですなあ。

 それにしてもPICは品種が多いです。あらゆるニーズに応えようとしているのかもしれ
ませんが・・・管理する方も大変だし、使う方も大変じゃないかと?

 私は8ピンなら、12C508ですねえ。バンクをまたがるようなプログラムは面倒くさい
し、ロジックICでは複雑になりそうな低速ロジックを置き換えるとか、そのくらいですから。
フラッシュが出ないかと昔から待っていたのに、もう待ちくたびれて、つい最近出たようですが
ああ、そうですか、ぐらいで、買う気も起きません(笑)。

 18ピンなら16F84か16F628、そして40ピンの16F877を常備しています。



**********(以下、編集中)**********









キーマトリクス、ダイナミックスキャン、
チャタリング、キーコード(30H〜)
液晶の制御



ICEPIC2、ドータボード、あまり親切でないマニュアル

12C509の第一歩 実験ボード、LED点滅
16F84から16F628へ
16F84から16F877へ
上位互換とは
カタログ値はこういうものだ


メーリングリスト
他人にデバッグさせるな
想像力、推理力をはたらかせて自分で試行錯誤





 命令長は12とか14ですが、データは8ビットです。
 ROMもバンク切り替えです。だから、8Kワードもある!!と、カタログ値を見ただけ
で喜んでいると、あとで痛い目にあいます。

 バンクよりイヤラシイのが、テーブル参照です。プログラムで、RETLWというWレジに
値を入れて返す命令を並べてテーブルを実現するわけですが、PC(プログラムカウンタ)の
下位8ビットしか計算しないため、xFF番地をまたぐと、とんでもないところに飛びます。
私も一度ハマりました。なぜかリセットがかかったような状態になって、サンザン調べても
わからなかったですよコレは。

 必ずしも設計の良い石が標準になるとは限らないものです。かつての68対80の戦い
とか。

 ソフトの立場だけではどの石を使うか決められません。この石が嫌いだから使わないとは
言えないんですね。実際にZ80互換のワンチップは存在するけど高いし入手性が悪い、
フラッシュROMではない、という問題がありました。

 PICでは文字列の処理も面倒です。だいたいメモリを参照するというのが回りくどい
方式でして、私が最近やった方式は、液晶に表示するメッセージをEEPROMに書いて
おき、何番のメッセージというふうに呼び出すと、テーブルでEEPROMの先頭番地を
探して読み出してくるという奇妙なやり方です。でもこれがPICでは最も簡単そうな
やり方だと思いました。まあとにかく変なCPUです。



 しかし、バンク切り替えがクセモノです。こいつのせいで、ヘタをすればコード
サイズが増えるし、プログラムを作る時に頭が混乱しやすい。

 16F84はRAMが68バイトで、バンクは表と裏しかないから考えやすいです。でも、
RAMが足りないよなあ、何かないかなと、16F877とか16F628のカタログを見てみると
おおっ、16F628は16F84とピンコンパチで、機能が多いし、RAMが224バイトもある!!
と、確かにカタログを見ると非常に嬉しくなります。

 ところが、224バイトというのは、実際にプログラムを作り始めれば、イカサマじゃ
ねーかと思うようになります(笑)。バンクを切り替えて、「かき集めて」の224バイト
ですからたまりません。

 あちこちに、バンク切り替えの命令を埋め込むわけで、これでサイズが増えます。
割り込みの関係など考慮していくと、バンクをどう切り替えていくか、考えなければ
ならない事も増えます。

 16F877とか628はバンクが4つもあって、表と裏だけなら考えやすいけど4つですよ。
これはもう面倒くさいとしか言いようがありません。当たり前といえば当たり前ですが
ちょっと規模の大きいものは、PICのアセンブラでシコシコ作ろうなどと思わないほう
がいいのかもと、最近思うようになりました。

 PICが便利なのは、ロジックのICを組み合わせて作るにはちょっと大変な、複雑
なパルス列とか信号の処理でしょうね。ICを何個も並べるより、数10行のプログラム
で済むならメリットがあります。テスト信号発生器や検査ジグの用途が多く、便利です。






プログラミングテクニック
PIC秘伝の書
PICの使いにくい点
プログラム例とその考え方












戻る