Trimble Thunderbolt GPS-DOから送られてきたパケットの中に、100MHz・1ppsのズレや、内部温度等の値を表す単精度浮動小数点が含まれている。それらの表示が問題になった。

浮動小数点といっても、整数部は絶対値1000以下の値を表示すればよい。温度やズレは100以下と限定しても全く問題ないので。しかし、小数部はなるべく精度よく表示したい。Trimble社自家製管理制御ソフトTboltmon.exeでは、温度について小数部1桁、精度のズレについては小数部2桁としか表示していないが、カッコよく見せるためにも、温度については2桁、精度については4桁を表示したい。

PIC用Cコンパイラには、無料のHi-Tech C Pro Lite modeを利用している。それが原因かどうかは分からないが、浮動小数点を使おうとするとコードサイズが一気に大幅増える。PIC16F88のような4KW容量ものではいつも苦労する。

Hi-Techの倍精度実数に24ビット表現と32ビット表現の2種類がある。24ビット表現では当然今回のケースにダメなので、32ビットでチャレンジしたがうまく行かなかった。

コードサイズのこともあり、うまく行かなかった理由をほとんど追求せず、整数だけでやってみることにした。つまり、浮動小数点を整数部と小数部とにわけて、それぞれをlong型整数で表そうとすることだ。とくに今回はパケットのデータを取り出して表示するだけなので、浮動小数点同士の演算が必要なく、整数表現は適当だと判断した。

さて、単精度浮動小数点として、IEEE 754形式が一般的。パケットにある浮動小数点も754形式で表されている。「ThunderBolt GDS Disciplined Clock User Guide Version 5.0」では
  754 IEEE Standard for binary Floating-Point Arithmetic. They are sent Most-significant byte first. Note that switching the byte order will be required in Intel-based machines.
  Single — Float (4 bytes) (3.4×10-38 to 1.7×1038) (24 bit precision)
と記述してある。

プログラムを書き、実際に検証した。パケットから浮動小数点を表す4バイトを取り出し、整数部と小数部に分けて表示した結果が、ソフトTboltmon.exeと同一表示になっているかどうかを確かめた。

以下はC言語ソースプログラム(漢字が入っているので、シフトJISコードで見てください)。バグがあってもトラブっても責任は負えないが。

main_c.txt

PICを取り入れることで、測定器作りにソフトの割合が大きくなった。とくに、いま取り込んでいるLCメータは、共振周波数からL、Cの値を計算で出すので、ハード(オペアンプ)でやると大変。二乗があったり、乗除算があったり。

説明は省略するが、3つの周波数から、浮遊容量と浮遊L成分を算出したうえ、測定対象のLCを算出という計算式。ただし、C0は基準コンデンサ、オリジナル回路では1000pFと指定されたもの。

手元に秋月電子のデジタルLメータキットでつくった測定器がある。位相発生回路や位相検波回路がそのキットに使われていて、デジタルといってもソフトが一切関わらなかった。回路全体が複雑なうえに、精度も2%とそれほど高くない。比べて、PIC利用のLCメータは共振周波数を測るだけの回路。ソフトの力を借りると、測定の考え方までが変わる一例だ。

でも、PICのプログラム容量が小さいことに泣かされた。PIC16F88やオペアンプ内蔵のPIC16F785を中心に使っていこうと考えていたが、LCメータのような極簡単な実数演算プログラムでも領域が足りないことを考えると、PIC18系に移行すべく気がした。価格的差はほとんどないし。

110904-5.png 110905.jpg 110906.jpg

前回のPIC16F88にはオペアンプが余計だったが、今回はオペアンプ内蔵のPIC16F785を利用してすっきりさせた。これ以上省けるパーツはLCDコントラスト調整用半可変抵抗ぐらいかも。

PIC16F785はプログラム領域が少ないが、独立したオペアンプが2つ内蔵されていて、販売価格がPIC16F88の約6割(秋月電子調べ)、コストパフォーマンスが良さそう。

今回、PIC16F785の20ピンのうち、1番ピンの電源、20番ピンのGND以外に、LCD表示用に必要最低限の6本、オペアンプ用の3本、周波数入力用1本、オペアンプからの入力1本、計13本を使った。

クロックに内蔵の8MHzを利用している。AMラジオの周波数表示には精度的&安定度的に十分だろう。AMラジオの周波数上限は約1.6MHzだが、内蔵クロックでも10MHzまでは安定的にいけそう。

さて、PIC16F88と違ったところだけをピックアップしておこう。

<A/D変換>
 回路図では配線が遠回りに書かれているが、オペアンプに最も近く、A/D変換としても使える15番ピン(AN5)を採用。
 ANSEL0 = 0x20 = 0b00100000
 ANSEL1 = 0

<オペアンプ>
 内蔵のオペアンプ1をボルテージフォロワとして利用。
 OPA1CON = 0x80 = 0b10000000
 OPA2CON = 0

<各ポートの入出力(計11本)>
 Aポートでは、入力 RA5(2番ピン、周波数入力)
        出力 RA1(18ピン、LCD-RSへ)
        出力 RA2(17ピン、LCD-Eへ)
 Bポートでは、出力 RB4(13ピン、LCD-RB7へ)
        出力 RB5(12ピン、LCD-RB6へ)
        出力 RB6(11ピン、LCD-RB4へ)
 Cポートでは、入力 RC1(15ピン、オペアンプ1出力からのA/D変換用)
        入力 RC6(8ピン、オペアンプ1のー側入力)
        入力 RC7(9ピン、オペアンプ1の+側入力)
        出力 RC2(14ピン、LCD-RB5へ)
        出力 RC3(7ピン、オペアンプ1の出力)

これら11本のうち、RA5, RC7, RC6, RC3はPIC側の都合で決めたが、残りは配線の都合で適当に決めた。

なお、SメータはLCDの2行目16文字幅をフル活用した。A/D変換値が100~200と仮定してある。

回路図

785-Freq.BMP

ソースプログラム

785-Freq.c(SJISコード、開発環境 mikroC PRO for PIC Liteモード無償版)。

HEX ファイル

785-Freq.hex

110828-4.jpg 110828-3.jpg 110829.jpg

学習メモ

A/D変換は10ビット。基準電圧はVDD, VSS, VREF-, VREF+からソフト的に選択可能。また、スリープモードでも稼働可能。

<関係レジスタ>
 ADRESH A/D変換値のハイレジスタ
 ADRESL A/D変換値のローレジスタ
 ADCON0 A/Dコントロールレジスタ0
 ADCON1 A/Dコントロールレジスタ1
 ANSEL アナログセレクトレジスタ

<ANSEL>
 bit 7 未使用
 bit 6-0 <ANS6:0> アナログ入力選択
  1 アナログI/O
  0 デジタルI/O

<ADCON0>
 bit 7-6 ADCS<<1:0> A/D変換クロック選択
  If ADCS2 == 0
   00 FOSC/2
   01 FOSC/8
   10 FOSC/32
   11 FRC
  If ADCS2 == 1
   00 FOSC/4
   01 FOSC/16
   10 FOSC/64
   11 FRC
 bit 5-3 CHS<2:0> アナログ入力チャネル選択
   000 チャネル0 (RA0)
   001 チャネル1 (RA1)
   010 チャネル2 (RA2)
   011 チャネル3 (RA3)
   100 チャネル4 (RA4)
   101 チャネル5 (RB6)
   110 チャネル6 (RB7)
 bit 2 GO/DONE A/D変換の状態
   If ADON == 1
    1 Readでは変換中、Writeでは変換開始
    0 完了
 bit 1 未使用
 bit 0 ADON A/Dオンビット
  1 A/D変換モジュール稼働中
  0 A/D変換モジュールシャットダウン

<ADCON1>
 bit 7 ADFM A/D変換値のフォーマット選択
  1 右寄せ
  0 左寄せ
 bit 6 ADCS2 A/Dクロック半分の選択
  1 システムクロックの半分をA/Dクロックとして使用
  0 半分ではなく、そのままのクロックを使用
 bit 5-4 VCFG<:1:0> A/D電圧基準値の選択
  00 VDD – VSS
  01 VDD – VREF-
  10 VREF+ – VSS
  11 VREF+ – VREF-
 bit 3-0 未使用

<A/D変換に必要なステップ>
 1. A/Dモジュールの設定
  アナログ/デジタル I/Oの設定(ANSEL)
  電圧基準値の設定(ADCON1)
  A/D入力チャネルの選択(ADCON0)
  A/Dクロックの設定(ADCON0)
  A/Dモジュールのスタート(ADCON0)
 2. 必要であれば、A/D割り込みを設定
  ADIF ビットをクリア
  ADIE ビットをセット
  PEIE ビットをセット
  GIE ビットをセット
 3. 準備待ち
 4. 変換開始
  GO/DONE ビット(ADCON0)をセット
 5. 以下のいずれかにより、A/D変換終了を待つ
  GO/DONE ビットがクリアされたかどうかを監視
  A/D割り込み
 6. A/D変換値 レジスタペア(ADRESH:ADRESL)の読み出し。必要であれば ADIF ビットをクリア
 7. 上記のステップ1か2に戻り、次のA/D変換を行う

110822.png

違うノートPCに繋ぎ、型番をマニュアルで指定してWriteしてみたら、うまくリカバリーができてほっとした。一度間違って書いてしまうと、なかなかその後認識してくれないみたい。強制書き込みモードがあってもいいと思うが。

それでも問題は続く。電源の立ち上げが不安定なのか、LCDは表示したりしなかったりして超わがままの状態。それを直さないと使い物にならないな。

PICのデータシートをダウンロードして研究しようとしたら、なんとページ数が数百にもなっていることに気づいた。ほかの電子部品のような取り扱いはいけないね。

110807-2.jpg

Dip Meterの回路が決まらない中、せめて8桁表示周波数カウンターでもつくろうとやっていたが、それもうまくいかなかった。最初の問題は発振子の使い方。参考にしたところと違ったものを使ったので、LCDは全く表示しない。数時間苦労して、やっとそれが原因だとわかった。

そこで、Configビットを修正して、コンパイルしたHEXファイルをPICに書き込んだらやっとLCDが表示した。しかし、ソフトにバグあり、周波数の表示はうまくできていなかった。

バグを直して、今度こそいけそうと喜んだら、PICに書き込む途中、PICkit2がエラーを報告してしまった。その後、Device not foundの連発で、認識してくれない。

デスクトップPCなら違うかも、と思ってノートから切り替えたら、今度はPICkit2までも認識してくれない。

うん、悪いことは次々起きるものだね。まるでFUKUSHIMAみたい。高さの都合で、ICソケットではなく、基板に直に半田付けしたので、PICを買いなおすのも簡単でない。PICkit2が壊れた可能性もあるし。

貴田電子のCW/SSBキット以降、どうもトラブルが多い。年取ったからかな。しばらくほかのことでもやってみるか。このうちうまくいくかも。

PICでPIGになったという愚痴でした。

110807.jpg

PIC使いとして有名なサイトに、多くの測定器がPICを使用して作られている。それをPICの可能性という観点から整理しておく。

1. A/D変換機能の活用
 多くのPICには10ビット、つまり分解能1024のA/D変換機能を持っていて、3桁表示のデジタル電圧計ならそのまま転用可能。アナログの入力電圧範囲は、ゼロから基準電圧までにしているPICが多い。基準電圧を5Vとした際の電圧変動は5/1024=約5mV。変換時間はクロック数にもよるが、数~数十usec程度。
 入力電圧が低い時にオペアンプ、高い時にアッテネーターを使って、最大入力電圧を基準電圧にレベルシフトする。
 作られる測定器は、直流電圧計、交流電圧計(変換速度から周波数上限はある)、電流計(直流or交流)、抵抗計等。電圧に変換可能なセンサを使えば、温度計、湿度計、照度計、距離計等多くが製作可能。

2. 周波数カウンター
 一定の時間に何回のパルスが入力されたかをカウントするやり方で、周波数カウンターをつくる。32ビットPICなら、論理的に最大4,294,967,296までがカウントが可能。従って、8桁表示周波数カウンターキットが秋月から発売されていた。
 ある値を引いたり、足したりすれば、例えば、ラジオのVXOから、元の受信周波数を表示することも簡単にできる。
 ストップウォッチ、タイマー、放射能計測器等に利用可能。

3. D/A変換
 PICにはD/A変換機能は内蔵されていないが、DAコンバータを外付けすることで利用可能。
 発振器等のファンクションジェネレータ、可変型定電圧電源等が製作可能。

4. PCとの通信機能
 USART内蔵のPICを利用すれば、シリアルモードでレベルコンバータ経由でPCと通信可能。さらに、市販のUSB-シリアル変換ケーブルを利用すれば、シリアルポートをサポートしないPCとも通信可能。
 データロガー等として利用可。
 ただ、PCの実働寿命は10年以内と短いし、インターフェースもよく変わるので、数十年も使いたい測定器をつくるなら、PCへの過度依存は慎むべくかもしれない。

5. データ補正機能
 RAM容量が少ないせいか、製作例はすくない。しかし、非直線性センサーからの入力データを修正したり、キャリブレーションしたり、応用範囲が広い。

FRMSの製作に必要なPIC用ファームウェアは恥ずかしながらDLしたものを利用させて頂いたが、プログラミングは自分の専門なので、当然のように、このうち自作になるだろう。

電子工作は10年以上やめた(やめていた間は金属カメラ等他の趣味に走ったが)ので、PIC等のマイコンのことが知っていたが、実際に使ったのは今回がはじめて。

ただ、いろいろやっているうちに、80年代のZ80や8080等のCPUのことを思い出した。所有した初のパソコン(当時ではマイコンと呼んでいた)PC-8001mkIIにもメモリが少なく、いまのPICと似ているところが多い。

効率性や信頼性を考えるとプログラミングにアセンブラ言語を使うのがいいだろう。汎用性や再利用性を考えるとC言語も悪い選択枝ではない。ほかの言語はマイコンチップには重すぎて実用性がないかもしれない。つまり、80年代までのプログラミング技術でOK。

測定の平均化、自動測定、自動校正、PCとの連携等にPICチップを活用すれば、精度が悪くても個人製作の測定器がより実用化になるのかもしれない。LEDの点滅よりも、この方向で応用してみたい。

今回のFRMSでも、出力周波数をスイープしながら、それぞれのレスポンスレベルを記録し、PCにデータを転送するためにPICを使ったので、大変実用的。いままでのやり方なら、それぞれの周波数を手動で設定し、レスポンスを紙にメモして、最後にグラフ化することで測定をやっていたが、500Hz~20MHzの帯域を考えると手動では時間が掛かりすぎることがわかる。

マイコンチップPICへソフト(ファームウェア)を書きこむのに、専用のツールが必要。たとえば、純製品で値段も安い PICkit2。

110722-2.jpg

以下では、製作する測定器 FRMS について説明する。なお、使用するマイコンチップは28ピンの PIC16F873A。

PIC16F873Aの概要
 ミッドレンジシリーズの1つ、14ビット幅命令
 プログラムメモリ 4KW
 データメモリ 192B
 EEPROM 128B
 I/Oポート A, B, C
 主な機能 タイマー、キャプチャー、コンパレータ、PWM、SSP、USART
 最大動作周波数 20MHz
 電源電圧 4.0~5.5v
 プログラムの書き換え回数が10万回
 販売価格 400円(秋月電子)

110723.jpg

<書き込みに関する全体の流れ>
 1. PICkit2専用アプリケーションのインストール
 2. FRMS用ファームウェアの取得
 3. PICkit2へのPICチップの接続
 4. ファームウェアの書き込み

では、順番通りに説明していく。

1. PICkit2専用アプリケーションのインストール
① PICkit2を作動させるのに必要なソフトをPCにインストールする。
 Microship社のサイトからアプリケーションソフトPICkit 2 Programmer(現時点の最新バージョン PICkit 2 V2.61 Install)をDLし解凍しインストールする。PCのOSはWindows7 32bit版でも64bit版でもOK。
② PICkit2を付属USBケーブルにてPCに接続。
③ インストールしたアプリケーションソフトを起動(ショートカットがデスクトップにあるので、それをダブルクリック)。
④ 問題なければ、「PICkit 2 found and connected.」 と表示される。

110722-3.png

2. FRMS用ファームウェアの取得
 FRMSの場合には、以下のサイトから、ファームウェア「PICファームウェア(Machine code file for PIC16F873)」をPCにDLする。
 FRMS用ファームウェア公開サイト http://www.jtw.zaq.ne.jp/tcl/ee/work/frms/index.htm
なお、ファイル名は dds_con.obj となっている。

3. PICkit2へのPICチップの接続
① チップ PIC16F873AをICソケットか、ブレッドボード等に挿し込む。
② ワイヤ5本を用意し、PICkit2のソケットにそれぞれ挿し込む(白色の三角形矢印が1番目印)。
  PICkit2 ソケット第1番 ⇔ PIC 第1ピン
           2番 ⇔    20ピン
           3番 ⇔    19ピン
           4番 ⇔    28ピン
           5番 ⇔    27ピン
なお、ソケットの6番目は使わない。
③ アプリケーションソフト PICkit2 Programmer のコマンド [Tool] – [Check Communication] を実行する。
④ 問題なければ、「Device: PIC16F873A」および「PIC Device Found.」と表示される。

I110722-4.jpg 110722-5.png

4. ファームウェアの書き込み
① 上記の2. で取得したファームウェア dds_con.obj をアプリケーションソフト PICkit2 Programmer のコマンド [File] – [Import HEX] を実行して指定する。
② 問題なければ、「Hex file sucessfully imported.」と表示される。
③ 「Write」ボタンをマウスでクリックし、書き込みを実行させる。すぐに終わるはず。
④ 問題なければ、「Programming Successful.」とグリーンで表示される。

110722-6.png 110722-7.png

これで、書きこみが成功したと思っていいだろう。アプリケーションソフトを閉じ、USBケーブルをPCから引き抜いて終了。

最後に、代表的なピン配置について、メモしておく。

110805-4.png