お断わり(2018年現在)

このコーナーは「当局にとってはじめてのPIC」と言う意味で、そのトタバタ顛末記です。
使用したPICもツール類も古く、これからPICを弄ってみようと考えている各局様にとって読む価値が無いと思います。
よろしければ、「PICキットコーナー」を閲覧して頂ければ幸いです。





↑今回の実験に使用した、信号源です
今度は、最初に作製したLEDを表示する実験基板に対して、データを送り表示させる実験です。
データを送るのは、別基板で作製する、周波数をカウントするPICです。
LED表示基板は3つの入力ピンしか余って無いので、シリアル転送とします。
よって、カウント基板のPICは多くのピン数は必要としません。
最初に買ってしまった、8ピンのPIC12F683を使用してみる事にしました。


参考文献
①「PIC16F活用研究」 後閑 哲也 著  技術評論社
②ホームページ「電子工作の実験室」 後閑 哲也 著
③PIC12F683データシート MICROCHIP
④2SK241データシート 東芝
⑤CMOSデバイス規格表'99 CQ出版社



PIC12F683の概要
プログラムエリア2Kステップ
RAM128バイト
EPROM256バイト
I/OPINは、全8ピンの内、最大6ピン
とその他の機能も合わせて、結構高機能です。

目的
このPIC12F683による周波数カウントの実験。
データをシリアル転送するプログラムの実験。
そして以前製作した7セグLED実験基板に、そのデータを表示させてみたい。



タイマー0を使ってみる。
外付けロジックでゲートを作り、I/O入力からパルスを取り込もうかとも思ったのですが、せっかくですので、文献①の”タイマ0の使い方”にも紹介されている、T0CKIピンを使用する方法を参考にしてみました。
PIC12F683では、5番ピン(GP2/AN2/T0CKI/INT/COUT/CCP1)となります。

今回も練習実験なので、クロックは10MHZのクリスタルですが、調整できません。。
実使用の周波数カウンタとするには、高精度高安定水晶発振としなければなりません。
また、PICのタイマー0の性能上1秒ゲートでのカウント可能周波数は2MHZ程度となるそうです。
内部プリスケーラ使用でカウント可能周波数は18MHZ程度まで可能だそうです。
まあ、その辺は実験で判明していくと思います。

↑ LED用部の記載がありません

追記③において回路を小変更しています。
カウント部回路の設計
などと、言うほどの物ではないですが、FETを使った単純なRFアンプとPIC本体だけです。
PICは8ピンの内、2ピンは電源、OSCは外部として10MHZモジュールを使用しCLKINへ入力、、カウンタ入力1ピン、残り4ピンを他との接続用入出力としました。
部品数およびPICのピン数が少ないので、穴あき基板で作製する事にします。

RFアンプ
とは言っても、受信機のRFアンプとは意味が違い、高速スイッチング的意味が強いです。
カウントピンはI/Oピン入力モードで使用しますので、RFアンプの負荷抵抗兼プルアップされたピン電圧を、アースに対してON-OFFするイメージです。
アンプ出力はPICのGP2(5ピン)に入力されます。
このピンは、CMOSレベルのシュミットトリガーと記載されています。
有信号時はその振幅でVIHとVILの両方の電位にならなければなりません。
実際は、どんな物なのか予備実験してみました。

残りのI/Oピンの内1つに、アースとの間にトグルスイッチを装着しました。
さらに残りの3つのピンで、表示用基板へのデータ転送を行う事を想定しました。
ゲートオープンLEDを付けたかったのですが、I/Oピンが余ってないので、TXラインからの信号をLEDにて反転発光させる事で、ごまかしました。





↑ブレッドボードでRFアンプ部分をセッティング




↑上波形がインバータ出力
  下波形がRF入力波形
この状態の時、オフセット電圧が2.3V位
RFアンプ予備実験
RFアンプ部分は、アナログとデジタルの接点部分ですし、きっちりと設計されたアンプでは無いので、ちょっとした気遣いで性能が結構変わりそうです。
とは言っても、回路も実験も簡単に済みそうなので、ブレッドボードにて、RFアンプとPICの代わりにCMOSインバータを使用して、予備実験をしてみました。
インバータはシュミットトリガタイプを使用したかったのですが、部品箱を探すのも面倒だし、存在するのかも不明なので、部品箱にてすぐ目に入った、普通のCMOS、TC4069UBPです。

予備実験回路
FET2石構成で、INV入力部の負荷抵抗は1KΩVR(実際は1.2KΩでした)にて調整
アンプ入力は高インピーダンスですが、シグナルジェネレータから200KHZを直接入力です。
FET2ドレインとインバータ出力をオシロで観測しながらの実験です。
電源は5V
初段のFET1の負荷抵抗は470オームで、無信号時ドレイン電圧は2.1Vで6.2mAのドレイン電流が流れている事になります。
Vgsは0Vなので、この電流値がこのFETのIdssと言う事になります。
負荷抵抗が小さいので電圧増幅度は低いです。
とは言え、ブレッドボードの適当な配線では、気を抜くとすぐ数十MHZ他で発振します。
FET2もVgsが0Vですので、無信号時はIdss状態です。
よって、PICへの入力はL→Hを想定した回路のつもりです。
このFET負荷抵抗であるVRが、1.2KΩ時はFET2のドレイン電圧は0.8Vなので、無信号時はL入力と見なされ、インバータ出力はHとなっています。
ある程度の入力があるとFET2のドレイン波形はすぐ飽和し、方形波に近くなります。
一応カウントしますが、総合的な感度は低めです。
VRの抵抗値を徐々に下げて、ドレイン電圧を上げていくと、無信号時ドレイン電圧(オフセット電圧)が、2.1V~2.3V前後にインバータ出力とのマッチング点(オシロ画像参照)がある様で、入力感度とパルス認識および出力波形の総合バランスが良いようです。
また、この回路では、無信号時ドレイン電圧は大きくても小さくても上手くないようです。
加えて、I/Oポートを出力モードにすると、大電流を吸い込む危険性があり、ゲートオフできなくなります。
結果、PICプログラムでは入力パルスのカウントは、立ち上がりエッジで良さそうです。
また、ドレイン電圧のオフセットはFETのIdssで変わりますし、適切なドレイン電圧の幅も割と狭いので、半固定VRの方が良さそうです。
オフセット電圧が2Vも取れるなら、FET2の代わりにトランジスタでも大丈夫そうです、と言うかその方が感度が高いかも知れません。
部品点数が少し増えますが・・・
実際、秋月のキット回路図集にある、PIC使用の周波数カウンタ回路もその様になっていますし、文献②の回路例も秋月とほぼ同じです。
まあ、個人趣味の実験ですから、今回はFET構成で行って見ます。

カウンタ基板実験回路

各ポートピンレイアウト
GP0 データ出力→表示基板のRA4に接続
GP1 TX制御信号出力→表示基板のRA3に接続
GP2/T0CKI RF信号入力←RFアンプ部
GP3 RX制御信号入力←表示基板のRA5に接続
GP4/CLKOUT スイッチ信号入力
GP5/CLKIN 外部クロック入力

RFアンプ
上記回路そのままです。

↑オシロはDC入力モード
0Vは画面中央線です。
綺麗な方形波を期待していたのですが・・・



カウント基板プログラム
count_test0.asm



表示基板プログラム
7seg_test02.asm
システムクロック発振器
トランジスタで水晶発振回路を組もうかとも思ったのですが、以前ヤフオクで安価に仕入れていた、この発振器がジャンク箱にいっぱい転がっていたので、これを使用してみました。
KINSEKI CXO-049 10MHZ
オシロ画像はDC入力で、垂直軸は2V/DIVです。
画面中央に、撮影時にどうしても画面中央に光が入り込みますが、実際は存在しません。
この発振出力波形は画像の様に、デジタルとアナログの中間の様な波形です。
また、波形のピークは、+4.5Vは良いのですが、-2V部分があります。
出力信号線にクリップ用ダイオードを挿入しようかと思ったのですが、データシートを見ると入力にダイオードが存在する様なので、そのまま直に接続としました。
調整は出来ませんが、さすがに発振精度は良く、安定しているようです。
送信プログラムイメージ

カウントバッファ準備OK

送信準備OKをLED基板に提示
TX線を1にセット
TX=1(GP1=1)
LED基板からのRX線での応答待機
IF RX(GP0)=1 THEN 送信開始

送信開始
DATA線(GP0)に送出
スタートビット GP2=0、100us幅
データビット(24ビット) GP2=X、各100us幅
ストップビット GP2=1、100us幅

終了

データ送信サブルーチン
参考文献②を参考にデータフォーマットを決め、1ビットは100us幅としています。
PICの動作速度を考えると十分の余裕で、50usでも大丈夫ではと思われます。
同文献ではRB1外部割込みを利用して、1本線でデータ転送していますが、今回は割込みを使用していないので、制御線を2本使用しました。
RX 表示基板からの受信可能信号
TX カウント基板からの送信可能信号
DATA カウント基板からのデータ信号
シリアル転送ですので、合計3本でデータ転送を行ないます。
このデータ送受信が確立しないとその後の実験が出来ません。

割込みを使用していないので、どちらかが待たなくてはいけないのですが、表示基板を待たせると表示が見難くなるので、送信側がTX_ON送出後、表示基板からの信号RXがONになるまで待つ事にしました。



表示基板のプログラム
今回は、「はじめてのPIC①②」からの使い回しと言うか、繰上げと言うか、今まで作成したプログラムを利用していますし、特に目新しいルーチンはありません。
それどころか余分なスイッチ入力ルーチン等が必要無いため、反ってコンパクトになりました。
データ受信ルーチンも送信ルーチンを変更するだけですので、面倒ではないです。
しかし、割込みを使用した方が、制御線の監視が必要なく、メインルーチンはLED表示をしていれば良く、割込みルーチンでデータ受信すれば良いので、その分もっとシンプルになると思います。
実際、文献②の製作例ではその様な構成になっています。
最初から実験基板では、外部割込みは使用するつもりは無かったので、表示用の実験基板は、外部割込みが使えるRBポートすべてをLEDに配分したため、カウンタ基板からの入力割込みが使えませんでした。
まずはプログラムを参照して下さい。

データ転送実験
カウント基板はすでに出来ているのですが、いきなり基板上で行なうと、ソフトのバグなのかハードのミスなのか判らなくなるので、ブレッドボードで実験しました。
ボード上にはX'TALとPIC12F683しか乗っていない、見た目は極めてシンプルな実験です。
ただ、データ線、制御線を、それぞれオシロで観察しています。
このためのソフトウエアは実験用仮メインルーチンで、プログラム中に用意した、既成のデータを転送すると言うもので、これにて送受信ルーチンのバグ取を行ないました。
デバッガを使用するよりは、オシロの波形を観察する方が、動作不良の原因予測が簡単です。
それを確認してから、カウント基板にPIC12F683を差込んで、動作確認を行なっています。
カウントプログラムイメージ

カウントバッファクリア
HEX0=0
HEX1=0
HEX2=0
TMR0=0

ゲートオープン
TRISIO(2)=1

タイマ0オーバフローチェック
IF T0IF=1 THEN HEX1=HEX1+1
IF HEX1=オーバフロー THEN HEX2=HEX2+1

ゲートクローズ
TRISIO(2)=0、GP2=0

パルスカウントサブルーチン
PIC12F683のGP2を入力ゲートとして使用しています。
このピンはタイマー0の外部クロック入力ともなっていますので、ゲートオン(すなわち
入力モードの時)の時間中に入力されるパルスをカウントする事になります。
ゲートオフにするには、GP2を出力モードにし、GP2=0としてみました。
ゲートオンはGP2を入力モードとします。
ゲートオンとオフの間隔を正確に設定時間にしなければなりません。
このルーチンは参考文献①②にプログラム例が記載されていますので、
それを素直に利用しています。
無論、そのままでは動作しませんので、PIC12F683用に変更しています。
それでもゲート時間の計算には疲れました・・・
ネットで素数一覧を発見したので、非常に助かりましたが。
詳細はソースファイルを参照して下さい、なるべくコメントを多くし、
使用レジスタのビットの意味等も簡単に記載しています。
もっとも、文献①②とデータシートを見ての、当局なりの解釈ですので、
間違いがある事は当然と思って頂きたく思います。
しかし・・・このデータシート・・・150ページ位あるのですよね。
PIC16F648Aも同様でしたが、プリンタで印刷するとファイルするのが大変です。
もちろん、英文のため詳細には読めないので、必要な所のみを
何となく「図を中心に見てる」程度です・・・

↑表示基板とはクリップで接続しただけです




↑16.7MHZのカウント値を撮影したつもりですが、何だか分かりませんですよね・・・
パルスカウントルーチンのデバッグ
この時点で、データ転送と表示が出来ているので、解り易いです。
まずは、ゲートタイムは1秒、プリスケーラ無しで、テストオシレータからRF信号を入力し、実験してみました。
で、一見いきなり動作しているように見えます。
RFアンプのVRを最良点に調整すると、2.1MHZまでカウントできました。(注1)
それ以上の周波数では、表示がおかしくなります。
ゲートタイム1秒、プリスケーラオンで16.7MHZまでカウントできました。
ピン数が足りずエラー表示が出来ないので、確認はしていませんが、24ビットデータの限界(オーバーフロー)が発生していると思われます。

次に切替SWは無いのですが、ゲートタイム0.1秒にしてカウント動作させてみました。
プリスケーラオンでカウントしてみると18MHZまでカウントできましたが、それ以上は表示がおかしくなります。(注2)

まあ、概ね文献通りの周波数まで動作はしているようです。
あと、何か微妙に周波数カウンタとの値とズレがあります。
システムクロックは調整できないとは言え、周波数カウンタで確認すると、結構正確でした。
と言う事はプログラム中の時間調整が結構間違えているのかも・・・
また、周波数区切り点のドットが出ないのは、なんとも不憫です・・・(-_-;)
おまけにプリスケーラ使用時やゲートタイム変更の情報が、表示基板に対して連絡していないので、表示基板では判別できません。

今後はこれらの基本ルーチンを改良して行きたいと思いますが、それらについては追記として、あるいは応用編にて公表したいと思います。
今回は実験ですので、突っ込み所満載のプログラムで大変恐縮ですが、一旦区切りたいと思います。

まとめ
今回初めて使用してみたPIC12F683です。
とりあえず動作はしましたし、PIC16F648AとPIC12F683のI/OポートとTMR0の一部の使用方法、そして目的のルーチンの、それらの概ねの理解も出来き、良い勉強になりました。

参考文献でも解説が殆ど無いのですが、8ピンなのでシンプルで大丈夫だろうと思ったら、大間違いでした。
最初のPIC16F648Aは参考書の説明と基本的な所は殆ど同じで、問題なかったのですが、
12F683はレジスタの内部配列が16F648Aと結構違う事があるのと、少ないピン数で多彩な内部機能がある分、初期設定を行なうには、英文マニュアルを読まざるを得なくなり、思いの他初動開始に時間が掛かってしまいました。
年のせいだと言われれば、その通りと思いますが・・・
今回の一連の実験は、当局の技術的問題もあり、PIC16F648Aと12F683のほんの一部の初歩的な機能を使って見たに過ぎません。
しかし、たった100~200円で購入の小さなICで、まだまた当局が経験していない、多彩で高度な遊びが出来るんだと思うと、ただ驚くばかりです。
まさに浦島太郎の気分で、ワクワクが止まりません。(すでに少年モード突入!!)
しかし視点を変えると、標準的なロジックICは配線すれば動作するのに対して、ソフトウエアが必要なマイコンは、手間の掛かる部品と言えそうですね。
その手間を乗り越えてしまえば、すばらしい世界が広がりそうです。

ところで、この実験レベルのカウンタでは、今の所実用性がありません・・・

今回で、初歩的かつ基本的なルーチンが出来ましたので、これらを利用あるいは応用すれば、何か機器を作れそうです。
そうなると・・・・



追記 2011年12月03日
PIC12F683のマニュアル40ページの「Using Timer0 with an External Clock」を見ると、(詳細に読めないので、見るだけです・・・)20ns云々とあります。
参考文献①ではプリスケーラの能力限界が50nsで、20MHZが理論値と記載されており、それとはずいぶん違います。
と言う事はプリスケーラ自体は50MHZまでカウントできるのでは?と期待してしまいます。
今回の実験での、1/8プリスケーラと0.1秒でのカウント限界18MHZ(注2)は、良く考えるとTMR0での能力限界(440ns)でプリスケーラの能力限界では無いと解釈できます。
TMR0の能力限界は参考文献と実験とで、ほぼ一致しています。(注1)
と言う訳で、カウントルーチンを少し変更して、1/16プリスケーラと0.1秒にしてみると、計算値の36MHZまでカウントできました。
となれば1/32以上のプリスケーラ等では50MHZまで行くのでは、と期待してしまいます。

さて、プリスケーラ倍率を大きくすると、プリスケーラ内残カウントが無視できなくなりますし、プログラムでの残カウント読み出しも出来ません。
しかし、プリスケーラに外部からTMR0を監視しながらパルスを入力してやれば、プリスケーラ内残カウントをカウント可能です。
ならば、外部ゲートの設置と、パルス注入の設置をし、プログラムでコントロールすれば良い事になります。
そうと決まれば早速カウンタ基板の作り直しだ~
と言う訳で、「はじめてのPIC」シリーズはこれで終わりにするつもりでしたが、続きます・・・



追記②
表示実験基板のプログラム変更に伴い、この基板のプログラムも変更しました。
PIC16F688カウンタ実験基板の追加実験に使用しています。


↑ 変更された回路図
RA3とRA4の接続が変更になっています



PIC12F683実験基板(変更後)
対応プログラムソースファイル
50usecハンドシェイク版です。
現在の所これが最新版です。
TXラインは使用しません
以前の100usec版は使用できません。

count_test2_hs.asm



PIC16F648A実験用基板
上記カウンタ基板対応版です。
50usecハンドシェイク版です。
RA5=DATAに接続
RA4=RXに接続
となります。

7seg_test5.asm


追記③  2014年2月27日
基板の回路を少々変更しました。
PICの3ピンと4ピン部分をクイっと変更しただけですが・・・

変更箇所
スイッチ入力がGP4だったのを、GP3に変更しました。
RX入力がGP3だったのを、GP4に変更しました。
プログラムもそれに合わせ、小変更しています。

理由
当初、データ出力にGP0,GP1、GP3、スイッチにGP4を使用していました。
自由度の高いGP4をI/Oピンとして自由にさせたい。
あまり使い道の無いGP3をスイッチ入力とする方が汎用性が増すので。
今考えると、何でこんな使い方を・・・ (-_-メ)



PIC12F683実験用基板(変更後用)プログラムです。
I/Oピンの変更に対応しました。
TXラインはデータ送信には使用しません。
代わりに、このピンにLEDを装着する事を前提にプログラムしています。
LED発光は電流吸い込みとなります。
VDDから直列に抵抗を通し、LEDを接続すると発光します。
現在の動作はゲートオープン時に発光となります。



PIC16F648A実験用基板
これにに関してはハードウエア変更はありません。
ソフトウエアも以前に作成した50usecハンドシェイク版です。
一応このコーナーに乗せただけ・・・です。
PIC16F648AはPIC16F1xシリーズの出現で、存在意義がかすんでしましました。
当局でも、もう新規購入する事は無いと思われます。
在庫を使用するのみとなりそうです。
よって、この基板もあまり使い道が無くなって来ました

↑ PIC12F683実験用基板
DFR0090接続用に見易くしただけです。
前回追記からのハードの変更はありません。




↑ 実験基板と7セグモジュール
ずいぶんとシンプルになりました。
SSGから10MHZを入力しています。



PIC12F683実験用基板(変更後)
7セグモジュールDFR0090対応版

count_test3_dfr0090.asm

追記④ 8桁7セグモジュール DFR0090対応

PIC12F683実験用基板(変更後用)プログラムを一部書き換えました。
この実験基板上のPICで計測と表示のすべてを行います。
この基板とモジュールで、機能的には完結する事になります。

変更内容
7セグ表示基板へのシリアルデータ転送ルーチンを削除しました。
その代りに、標記モジュールへの制御ルーチンを入れました。
ピン数不足でエラー等の警告表示LEDを使用できなくなりました。
その代り、最下位桁の表示を‘E‘と表示するようにしました。

これが今回の「追記③」の2つ目の目的となります。
詳細については、「8桁7セグモジュールDFR0090をPICで使う」 をご参照ください。

画像は実際に、変更後のカウンタ実験基板と8桁7セグモジュールを接続したもの。
ちらつきも無く、明るくきれいに表示されます。
接続もシンプルで、CPU負荷も軽く、PIC12F683 10MHZでも余裕の動作です。
もう面倒な8桁7セグ表示基板を作らなくとも大丈夫です・・・

↑ PIC12F1822実験用基板
DFR0090接続用に見易くしただけです。
前回追記からのハードの変更はありません。




PIC12F1822実験用基板
7セグモジュールDFR0090対応版

pic12f1822_count_test01.asm
追記⑤ 2015年2月1日 PIC12F1822で、この実験基板を使う

PIC12F683とPIC12F1822はピン・アサインに互換性があります。
基板上のPICを交換するだけの、お手軽変更です。
詳細は左記ソースファイル・コメント欄をご参照ください。
できるだけ丁寧に記したつもりです。
もちろん、DFR0090モジュール対応版です。

プリスケーラ無では2MHZ強程度がカウント限界で、
X16プリスケーラで38MHZ程度まででした。
結局、PIC12F683と変わない結果となりました。
ソースファイルはX16プリスケーラONとなっています。
SWはゲートタイムの変更です。




PIC12F683実験用基板(変更後)
MAX2719モジュール対応版
アッセンブラソース

count_test4_max2719.asm

追記⑥ 2015年2月18日 Aitendo8桁7セグモジュールに対応

LEDは小さいですが、明るくて視認性は良いです。
これでも必要十分です。

この、しょうもない基板は結構実験に役立っていますけど・・・
ちょっと画像ソースとして恥ずかしい・・・
戻る  実験・製作の記録TOPへ戻る