PICのプリスケーラの値を読み出す

PIC12/16FのTMR0は、「タイマ本体に値をセットするとプリスケーラの値がクリアされる、プリスケーラ自体は値の読み出しも書き込みもできない」という致命的な欠点があります。
完全なバッドノウハウですけど、PICのプリスケーラの値を読み出す方法を見つけたので書いておきます。


その方法が書かれているのは、MicrochipのアプリケーションノートAN592です。といっても特別難しい話ではなく、パルス計測が終わった後に、プログラム的にカウントできるパルスを入力してオーバーフローするまでのパルス数からプリスケーラに残っていたカウントを逆算しようという話です。

pic_prescaler001


AN592で想定している状況はおそらく、直接計数方式の周波数カウンタです。
動作は、以下のような感じ。

① T0CKIのゲートを開いている間は、RA2をハイ・インピーダンス状態(ようするに入力)にしておき、Frequency Generatorからのパルスが通るようにしておく。
② ゲートオープン期間が終わったところで、RA2を出力にし、Frequency Generatorからの入力を遮断する。
③ RA2からパルスを出力して、TMR0のプリスケーラをインクリメントさせる。
④ TMR0がカウントアップするまで③を繰り返す。
⑤ 繰り返した③の回数からプリスケーラに入っていた値を逆算する。

【DAC内蔵も】PIC専用のスレPart20【出たよ】の673-676

673 名前:774ワット発電中さん[sage] 投稿日:2008/10/31(金) 20:20:49 ID:nWEjKo5A

何何? PICのプリスケーラにバグあるの?
初めて聞いた。

674 名前:774ワット発電中さん[sage] 投稿日:2008/10/31(金) 20:31:21 ID:BtOsLbTL
>>673
バグというより仕様だよ。
PICのプリスケーラは、クリア以外の書き込みや読み出しができないって
かなり有名な話だと思うけど。

675 名前:774ワット発電中さん[sage] 投稿日:2008/10/31(金) 20:40:28 ID:RuzZOMuZ
>>673
カウンタに値をセットするとプリスケーラがリセットされるって他のマイコンには無い仕様があったはず。
なので値をセットするたびにズレるので>>666に出てるように工夫しないといけない。

676 名前:774ワット発電中さん[] 投稿日:2008/10/31(金) 22:58:23 ID:/IkFVbZW
ここらへんを読むと、PICのカウンターの誤差の意味が良く分かる。

http://www5b.biglobe.ne.jp/~YASUSI/gallery/electronics/061029/061029.htm


---
参考文献
AN592
Souce code

tag: PIC 

C Compiler for PIC16F

---
2008年10月1日追記
この記事書いてから結構たちますが、今日ではHI-TECHのPICC-Liteがpic16f88や12f683に対応したので選択肢はほぼ一択でしょうか。
まぁ、自分はまだアセンブリ言語ですが・・・
---

今まで自分はPICの開発にmicrochip純正アセンブリ言語MPASMのみを使っていました。
PIC18Fやそれ以上のチップは純正のCコンパイラがあるのでそれを使うとすると、問題は14bitのPIC12/16Fシリーズのコンパイラを何にするかが問題になります。

PIC16Fに利用できるCコンパイラはたくさんあります。私が名前を聞いたことがあるものを列挙すると以下になります。

SDCC :無料
mikroC :無料版あり
PICC-Lite :無料版あり
ピカントC :\1,200~
WIZ-C :\11,550
CCS-C PCM :\24,900

・SDCC
SDCCは、オープンソースのCコンパイラ。なのでデバイスや容量に制限は無いようです。
この手のソフトの常として、分かりやすいGUIなインターフェースとかは期待できなさそう。
Windows以外の開発環境でも使えるみたい。

・mikroC
無料版はプログラムサイズが2Kワードまでという制限があるみたい。

・PICC-Lite
HI-TECH社のCコンパイラ。無料版のLiteは残念ながらPIC16F88やPIC12F683が使えません。
製品版は・・・高くて手が出せない。

・ピカントC
\1,200から製品版があるソースブーストのCコンパイラ。値段の割にはそこそこ良いという噂も。
私が購入するとすれば\3,800のスタンダードかな・・・。

・WIZ-C
C言語で作るPIC電子工作という本の中で取り上げられているコンパイラだということぐらいしか私は知りません。

・CCS-C PCM
日本PIC界の超有名人である後閑さんのサイトでも取り上げられているコンパイラ。

さて、どれを勉強しますか・・・
まず、PIC16F88とPIC12F683が使えないからPICC-Liteは除外。これらが使えれば多分これを選んでたのでしょうが。

つぎに、「作ったものをblogのネタとして公開する」ことを目標とするなら無料でないものは除外。
折角読んでもらっても、読者が気に入ったものをすぐに試せないようではよろしくありませんので。

とすると、残るのはSDCCとmikroCの2つ。さてどうしたものか。

A/Dコンバータ その2

5月17日修正
---
"C:\Program Files\LTC\SwCADIII\lib\sym\Misc\pic16adc.asy"
の内容が間違っていたので差し替えました。
---

前回のA/Dコンバータ その1では、LTspiceでPIC16内蔵A/Dコンバータの入力回路(サンプル&ホールド回路)のモデルを作りました。

PIC16F88のデータシートのアナログ入力モデル


前回作成したLTspiceモデル



これを元にサブサーキットとシンボルを作りました。

準備

以下はLTspiceがデフォルトのディレクトリ"C:\Program Files\LTC\SwCADIII"にインストールされているという前提で書きます。違う場所にインストールした人は適宜読み替えてください。

サブサーキットファイルに関しては、以下の引用部分の内容をメモ帳などで"C:\Program Files\LTC\SwCADIII\lib\sub\pic16adc.sub"という名前で保存します。

"C:\Program Files\LTC\SwCADIII\lib\sub\pic16adc.sub"
.SUBCKT PIC16ADC ADC CTRL HOLD VDD VSS
Cpin ADC VSS 5p
D1 VSS ADC D
D2 ADC VDD D
Ileackage ADC VSS 500nA
Ric N001 ADC 1k
S1 N001 N002 CTRL VSS SS
Chold HOLD VSS 120p
Rss HOLD N002 {17k-2k*Vs}
.model D D
.model SS SW(Vt=1V Vh=0V)
.ENDS

シンボルファイルは、"C:\Program Files\LTC\SwCADIII\lib\sym\Misc\pic16adc.asy"として保存します。

5月17日修正
---
冒頭でも書きましたが
"C:\Program Files\LTC\SwCADIII\lib\sym\Misc\pic16adc.asy"
の内容が間違っていたので差し替えました。
---

"C:\Program Files\LTC\SwCADIII\lib\sym\Misc\pic16adc.asy"
Version 4
SymbolType CELL
RECTANGLE Normal -160 -80 32 16
WINDOW 0 0 32 Left 0
SYMATTR Prefix X
SYMATTR Description pic16f88 ADC sample & hold circuit
SYMATTR SpiceLine Vs=5
SYMATTR Value pic16adc
SYMATTR ModelFile pic16adc.sub
PIN -160 -48 LEFT 8
PINATTR PinName ADC
PINATTR SpiceOrder 1
PIN -160 -16 LEFT 8
PINATTR PinName CTRL
PINATTR SpiceOrder 2
PIN 32 -32 RIGHT 8
PINATTR PinName HOLD
PINATTR SpiceOrder 3
PIN -48 -80 TOP 8
PINATTR PinName VDD
PINATTR SpiceOrder 4
PIN -48 16 BOTTOM 8
PINATTR PinName VSS
PINATTR SpiceOrder 5

これで"Misc"からpic16adcが使えるようになったと思います。使えなかったらコメント欄で教えてください。対処できないかもしれませんけど。

各端子の説明

VDD:PICのVDD端子に相当します
VSS:PICのVSS端子に相当します
ADC:PICのアナログ入力端子に相当します
CTRL:PICから外部に出る端子ではありません。サンプル/ホールドを制御する端子で、HでサンプルLでホールドになります。しきい値は電源電圧にかかわらず1Vです。
HOLD:サンプル&ホールド回路に取り込まれた電圧を読み取るための端子です。PICから外部へは出ません。

使い方

今回のシンボルを使って、前回の例題を描き直してみました。






Vs=5VはVDD-VSS間の電圧です。回路図上のサンプル&ホールド回路の上で右クリックをして出てくるウインドウ上のSpiceLineの欄にVsを設定します。PICを3.3Vで動作させているのならVs=3.3Vと書きます。


これは、電源電圧に応じてサンプリングスイッチの寄生抵抗が変化するためです。

tag: LTspice A/Dコンバータ PIC 

A/Dコンバータ その1

PIC16F88やPIC12F683などA/Dコンバータが内蔵されたPICは便利です。
A/Dコンバータとは、簡単に言うと入力端子の電圧をマイコン内部にデジタルな数値として読み取る回路です。

PIC内蔵A/Dコンバータのハードウェア的な詳細は、fitDESIGN超初心者向けPICハードウェアマニュアル第7章 A/Dコンバータが分かりやすいです。
記のサイトではPIC16F87XのA/Dコンバータについて書かれていますが、PIC16F88やPIC12F683でも基本的な部分は同じです。(ハードウェア的にはPIC16F88の方がPIC16F87Xよりも柔軟な構成が取れるように改良がされていますが、その代わりレジスタ構成が変化しているため87X用のソースコードを流用するときには若干の変更が必要です。)

さて、fitDESIGNのサイトの7-4 入力回路
には、ハードウェア的に考慮しなければならない点として以下を挙げています。

A/Dコンバータの入力回路はその計測仕様や信号源側の条件によって様々な考慮をする必要があります。以下にその考慮すべき要件を列挙しました。

● 信号源の出力抵抗はPICの仕様を満たしているか?
      (PICの仕様: 許容信号源抵抗 10kΩ Max)
● 計測信号のノイズのレベルや周波数成分は? また計測したい最大周波数は?
● 計測信号はPICの仕様の入力電圧範囲を超える可能性があるか?

今回はこれらの一番目「信号源抵抗」について書きます。

結論から書くと、信号源抵抗に制約があるのはA/Dコンバータの入力インピーダンスが高くないからです。そのため、信号源の出力インピーダンスが高いと正確な電圧が計測できないことになります。どの程度入力インピーダンスが低いのかを考えるためには、PICのA/Dコンバータの内部回路(実際はA/Dコンバータではなく、その前段のサンプル&ホールド回路)を考える必要があります。

この図は、PIC16F88のデータシートにあるアナログ入力モデルです。



これを元に、LTspiceでモデルを作ります。



RicはPIC内部のアナログマルチプレクサのオン抵抗でしょうか。最悪値としてRic=1kと選びました。
Ileakageは±500nAの間でばらつきますが、さしあたって正の値を選びました。
Rssはサンプリングスイッチのオン抵抗です。電源電圧に応じて変化することがグラフから読み取れます。電源電圧とオン抵抗には以下の関係があります。
Rss=17k-2k*(VDD-VSS)
VDD=5V,VSS=0Vと考えてRss=7kとしました。

このモデルに対して、2.5Vのステップ入力を与えたときの応答を信号源抵抗の値を変えながら確認します。


上の回路図は、信号源抵抗Rs=10kのものです。

信号源抵抗Rs=1Ωのとき。


信号源の出力インピーダンスが非常に低い場合。計測対象の信号源の電圧V(VS)とPICの入力端子電圧V(ADC)は、ほぼ完全に一致。実際にPICに読み込まれるホールドコンデンサの電圧V(HOLD)も若干の遅延が見られますが、最終的な値はほぼ一致。

信号源抵抗Rs=1kのとき。


V(VS)に対してV(ADC)がわずかに遅延しているが、V(ADC),V(HOLD)ともに最終的な値はV(VS)とほぼ一致。

信号源抵抗Rs=10kのとき。


V(adc),V(hold)ともにV(vs)から少し遅延。


また、定常状態に入ったときのV(vs)とV(hold)の差(すなわち誤差)は5mV程度。

信号源抵抗Rs=100kのとき。


遅延の量もかなり大きくなっているのが分かる。


さらに定常状態に入った後での誤差も50mV程度まで大きくなっている。

まとめると、信号源抵抗が大きくなることによって被る影響は以下の2点になります。
・サンプリングコンデンサへの充電時間が長くなる
・定常状態での誤差が大きくなる

とはいえ、これらの2点の原因は見てのとおりです。

サンプリングコンデンサへの充電時間が長くなる理由は、信号源抵抗RsとホールドコンデンサCholdがローパスフィルタを構成するからです。(経路上にある他の抵抗やコンデンサも寄与しますが、RsとCholdの影響が支配的です。)

一方、定常状態での誤差は、Ileakageによる信号源抵抗Rsの両端での電圧降下が原因です。Rs=10kのときはオームの法則V=R*Iより10k*500nA=5mVの誤差、Rs=100kのときは100k*500nA=50mVの誤差とシミュレーション結果に一致します。
fitDESIGNのA/Dコンバータの基礎の表から、5Vを10bitでA/D変換した際の1LSBは4.9mVに相当します。信号源抵抗Rsが10kのときの誤差は5mVであるので、まぁ、ちょっと1LSBを超えていますが、10bit精度のA/D変換を確保するためには信号源抵抗Rsが10k以内でなければならないというのはこういった理由からだと思います。

tag: LTspice PIC A/Dコンバータ 

MPASM文法の覚え方

ちょっとしたねたですが、PIC純正アセンブラMPASMの覚え方について。
一部の人には変態アセンブラと呼ばれているPIC16Fシリーズのアセンブラですが、私からすると逆に命令数が少なくて覚えやすいんじゃないかとも思うんですけどね・・・。
命令数を減らすために、他のマイコンから見ると変則的なアーキテクチャとなっている感は否めませんが・・・。と、前置きはこのぐらいにしておきましょう。

TRISxの方向
1 = Input
0 = Output
TRISA等の入力・出力の設定をするSFRのビットの設定ですが、1はInputの頭文字のIに形が似ているので入力。0はOutputの頭文字のOに形が似ているので出力と覚えれば覚えやすいでしょう。

RRFとRLF
これは簡単。
RRFがRotate Right f。
RLFがRotate Left f。
したがって、RRFが右回りでRLFが左回りになります。

BSFとBCF
これも簡単。
BSFがBit Set f。
BCFがBit Clear f。

BTFSSとBTFSC
BTFSSはBit Test f, Skip if Setからきていますが、BTFSSとBTFSCの区別と言ういみでは最後の二文字SSとSCの意味を覚えておけば十分でしょう。
BTFSSなら、Skip if Set
BTFSCなら、Skip if Clearとなります。

減算とキャリフラグ
SUBWFやSUBLWといった減算命令を実行した後、演算結果が正か負かの判定をキャリフラグを確認することによって行えますが、引き算と言う演算に対してキャリ(桁上がり)というのはしっくりこないので、演算結果が正のときにキャリがセットされるのかクリアされるのかわからなくなることがよくあります。
そこで、桁下がりを表すボローフラグと言うものを考えます。キャリフラグが桁上がりの発生したときにセットされるフラグであるのに対して、ボローフラグは桁下がりが発生したときにセットされます。
こう考えると、減算を行った結果答えが負になると言うことは桁下がりが発生していると言うことなので、ボローフラグがセットされます。
実を言うとボローフラグと言うのは、キャリフラグの反転に他なりません。
したがって、減算の結果が負になる場合はキャリフラグがクリアされ、正のときにキャリフラグがセットされます。

SUBWFとSUBLWとADDLW
SUBWFはSubtract W from fの略です。したがって、実行する計算もf-Wです。
この流れでいくと、SUBLWもSubtract Literal from Wで、実行する計算もW-kであるべきです。
しかし実は、SUBLWはSubtract W from Literalで、実行する計算もk-Wです。
これには理由があります。というよりもSubtract Literal from Wは既に存在します。それはADDLWです。
そもそも2進数の減算と言うのは2の補数を加算するだけだと言うことを思い出していただければ、ADDLWのリテラルの部分に2の補数表現をした数を入れればよいことは簡単に理解できるでしょう。
MPASMではリテラルに負号をつけることで簡単に2の補数を表現することができます。例えばWから5を引くプログラムは

        ADDLW   -D'5'

となります。逆に5からWを引くプログラムは

        SUBLW   D'5'

になりますね。

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj状態密度常微分方程式モンテカルロ解析トランジスタodeDOSインターフェーススイッチング回路定電流PDS5022分散関係半導体シェルスクリプト乱数レベルシフトHP6632A温度解析ブレッドボード可変抵抗I2Cトランジスタ技術R6452A確率論バンド構造セミナーバンドギャップ反強磁性数値積分熱設計絶縁非線形方程式ソルバ偏微分方程式PWscfA/Dコンバータマフィンティン半径フォトカプラカオスISO-I2CGW近似LM358LEDシュミットトリガ三端子レギュレータ74HC4053アナログスイッチUSBサーボ数値微分直流動作点解析補間カレントミラーTL431PC817C発振回路FFT電子負荷VESTA開発環境量子力学単振り子bzqlty基本並進ベクトル2ちゃんねるチョッパアンプ標準ロジックパラメトリック解析アセンブラブラべ格子BSchQuantumESPRESSOイジング模型LDA状態方程式GGA仮想結晶近似VCA熱伝導SMPスイッチト・キャパシタキュリー温度Quantum_ESPRESSOスーパーリーグTLP621トレーナーバトルewidth最適化Maxima抵抗失敗談相対論コバルト繰り返し位相図六方最密充填構造ポケモンGOスピン軌道相互作用gfortranランダムウォークFETスレーターポーリング曲線cygwinQSGW不規則合金ラプラス方程式MCU条件分岐データロガーマントルUPS固有値問題格子比熱シュレディンガー方程式熱力学詰め回路ガイガー管QNAP井戸型ポテンシャルダイヤモンドOpenMPTLP521ハーフメタルLM555ubuntu平均場近似ブラウン運動フェルミ面NE555ZnOゼーベック係数TLP552xcrysdenCIF最小値最大値awkfsolveテスタ第一原理計算Ubuntu差し込みグラフFXA-7020ZR三角波過渡解析Writer509自動計測スーパーセル起電力トランスCK1026MAS830LフィルタPGAP-10MBEOPA2277ナイキスト線図ノコギリ波AACircuitEAGLE2SC1815PIC16F785LMC662CapSense負帰還安定性入出力固定スピンモーメントFSMTeX結晶磁気異方性全エネルギーc/a合金multiplotgnuplot非線型方程式ソルバL10構造正規分布等高線ジバニャン方程式初期値interp1fcc面心立方構造ウィグナーザイツ胞半金属デバイ模型磁気モーメント電荷密度重積分SIC不純物問題擬ポテンシャル状態図cif2cellPWgui二相共存ウルツ鉱構造edeltquantumESPRESSOフォノンリジッドバンド模型スワップ領域BaO岩塩構造ルチル構造ヒストグラム確率論マテリアルデザインフラクタルマンデルブロ集合キーボードRealforceクーロン散乱三次元疎行列縮退化学反応関数フィッティング最小二乗法Excel直流解析PCTS-110TS-112日本語パラメータ・モデル等価回路モデル文字列不規則局所モーメント陰解法熱拡散方程式HiLAPWCrank-Nicolson法連立一次方程式specx.fifort境界条件両対数グラフ片対数グラフGimp円周率ヒストグラムシンボル線種グラフの分割軸ラベル凡例トラックボール

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ