« ハンダ付け二題(追記あり) | トップページ | IP電話でテレホンJJY »

2013年11月 9日 (土)

私の「はじめてのPIC」

GPS受信モジュールで遊んでいるうちにPICを使えば「新たな展開」が期待できることに気がつきました。そこで一念発起してPICの使い方を覚えようという気になりました。

PICがどんなものだか漠然とはわかっているのですが何から手を付けていいかわからないのでほよほよさんに教えていただくことにしました。ほよほよさんは

  検索すればわかるかと思いますけど・・・

と言いながらも親切に教えてくださったのですが、確かにググればPICに関する記事は山のようにあります。あるのはあるのですが読んでも(ハード的にもソフト的にも)最低限必要なものが何だかよくわかりません。またそのことがこれまで興味は持ちながらも手を出さなかった(出せなかった)理由でもあります。

そこでほんとうに最低限何か必要かというのを書いてみたいと思います。

なおこの記事を書くにあたってはほよほよさんからいろいろ教えていただきました。ここに記し感謝の意を表します。ありがとうございました m(._.)m

以下書いていることはほとんどぜんぶほよほよさんに教わった内容です (^^;;

下記記事のコメント欄参照
  「ほよほよさん - 星降る森 2日目ラスト
  「ほよほよさん - すばる

--------

0. はじめに

PIC10F222のデータシートを読んでアーキテクチャと命令セットのだいたいのところを勉強しておきます。
レジスタという言葉が多用されていますがレジスタ=メモリ、Wレジスタ=アキュムレータみたいなものだと思います。

1. お買い物

PICKit3
PIC10F222(初心者の練習用にいいらしいです)

以下は手元に在庫がありましたが....
ブレッドボード(とジャンパー)
単4電池三個と電池ケース
抵抗(10kΩくらい、プルアップ用)

作ったプログラムのテスト用に
(赤色)LEDと電流制限用抵抗(光ればいいので1kΩくらい)

2. 開発環境

MAPLAB IDEをインストール
私はMicrochip社のサイトからダウンロードしましたがPICKit3にも添付されています。

3. 下準備

PICKit3とPIC10F222を接続します。

  1. ==> GP3/MCLR/VPP(8) (プルアップします)
  2. ==> VDD(2)
  3. ==> VSS(7)
  4. ==> GP0/AN0/ICSPDAT(5)
  5. ==> GP1/AN1/ICSPCLK(4)
  6. ==> N/C

左側がPICKit3の端子の番号、右がPIC10F222のピンです(括弧の中はDIPのときのピン番号)

-----
その後いろいろやっていたら動作が不安定になってしまいました。どうやら電源にパスコンを入れ忘れていたのが原因のようです。そのあたりは適当に対応をお願いします。

(2013-11-12 13:25:01)
-----

ググるとPICKit3との接続にL型のコネクターを使っていらっしゃる方が多いようですがブレッドボード用のジャンパーを直接つなぎました。
このときPIC10F222には電源は不要です。MAPLAB IDEのProgrammer/Settings/POWERの設定でPICKit3から電源を供給できます。

View/Program Memoryの表示のいちばん最後(0x1FF)のアドレスの内容を読取ります。
16進3桁のうち下二桁がプログラミングのとき必要です(この数値は内部発振器の校正値です)

3. プログラミング

最初はぜったい確実に動きそうな簡単なものを作った方がいいと思います。私の場合はこんなものを作ることにしました。

  i. 入出力ポートを読み込む。
  ii. 読み込んだ内容を右に1bitシフトする。
  iii. シフトしたものを入出力ポートに書き込む
  iv. i.へ戻る

プログラムで書くとこれだけです。
LOOP	RRF	GPIO,1
GOTO LOOP

これをやるとGP3(入力専用)の値をGP2にコピーするという操作が無限に繰り返されます。
VDDとGP2の間にLEDを入れておけばGP3をGND(VSS)に落としたあいだLEDが点灯するはずです。

ただこれだけ書いても動きません。前後におまじないが必要です。

データシートの表5-2に「ピンをデジタルモードで使用可能にするための条件」というのがあります。GP0~GP3を入出力ピンとして使うためにはこの条件を満たす必要があります。
GP0/GP1 ANS0/ANS1ビットを“0”にする。
GP2   FOSC4ビットとT0CSビットを“0”にする。
GP3   MCLRビットを“0”にする。

またGPnは初期値では入力ピンになってしまうのでGP2は出力ピンにする必要があります。
さらに内部発振器用の校正値の設定も必要です。

それからPIC10F222には入力ピンをプルアップする機能があります。これをやっておけば部品数を減らせます。

そんなこんなで最初のおまじないはこうなります。
	LIST	P=pic10f222
#include <p10f222.inc>
__CONFIG _IOSCFS_4MHZ & _MCPU_ON & _WDT_OFF & _CP_OFF & _MCLRE_OFF
ORG H'0000'
MOVWF OSCCAL ;OSCCAL Set
MOVLW B'10010111' ;Option Register Set
OPTION
CLRF ADCON0 ;A/D Converter Off
MOVLW B'00001011' ;only GP2 out
TRIS GPIO

じつはこれほよほよさんの記事

  「SONY NEX インターバルタイマーを自作する(4)

にあるものをそのままパクらせていただきました。最初は誰かの真似をした方が確実ですから (^^;;
自分で何をすべきか考えるのはたいへんですがこういうお手本があればなぜそうするのかと考えればいいだけなので習得がはかどります。

今回はGP0とGP1は使いませんからほんとは
	CLRF	ADCON0

は要らないでしょう。

最初の命令が
	MOVWF	OSCCAL

になっているのは奇異に感じます。これは内部発振器用の校正値のセットです。プログラムの先頭でWレジスタには何が入っているんだろうと思うのですが、これはPIC10F222はリセットされたとき0x1FFから実行が始まるためそこで校正値をWレジスタに格納するわけです。
したがってプログラムの最後はこうなります(この件については下記の注を参照してください)
	ORG	H'1FF'
MOVLW 0x26
END

以上の二つの部分の間に実行部分2行を挟み込めばプログラムは完成です。
(“0x26”のところはもちろん“個体”によって違います)

------


最新(?)のMPLAB IDEだと内部発振器用の校正値は上記の方法ではなく

  Programmer/Settings/Calibration Memory

のところでで書き込むようです。

(2013-11-12 13:25:01)
------

これをビルドしてPIC10F222に書き込みます。

あとはPICKit3との接続をはずし、VDDとGP2の間にLED(と電流制限用抵抗)を入れて電源に接続します。GP3はプルアップされていますからGP2も“H”になってLEDは消えていますがGP3とGNDをショートすればGP2は“L”になってLEDが点灯しました。

次は「LEDピカピカ」ですね (^^)

※ GP2はプログラミングのときは無関係なのでLEDは接続しっぱなしでもかまいません。

« ハンダ付け二題(追記あり) | トップページ | IP電話でテレホンJJY »

編集用」カテゴリの記事

コメント

この記事へのコメントは終了しました。

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ