Front Page 2016,01,01 掲載
PIC12F1822 備忘録
従前はPIC12F683を使っていたが、いろいろな工作に用い備蓄を使い切った。
そこでPIC12F683よりも新型のPIC12F1822を10個買った。
使い慣れた
PIC12F683か
ら、より新型の
PIC12F1822へ
切り替える際に得た知見を記録した。
PIC12F1822には、いろいろな優れた機能が追加されている。
特にAD変換部に基準電圧源を内蔵しているのは魅力的だ。そのうえ価格も廉い。
実際に使おうとすると色々な問題に直面した。以下はその記録です。
1、PICKIT2の問題
ピン数の多いPICの書き込みにはICD3でターゲット基板上に設けたコネクターを通じてICSP書き込みを使うが、
8ピンのPICには秋月電子通商の
AKI
-PIC2プログラマボードを使っている。
これはPICKit2互換で、MPLABで使うとPICKit2と認識される。
もちろんMicrochip社のサイトからダウンロードしたPickit2制御ソフトも使える。
そのうえ28ピンと40ピンのICソケットを備えている優れ物だ。
ところがPickit2ではPIC12F1822は書き込めない。
PIC12F1822をICソケットに差込みPickit2制御ソフトを起動しても認識されないのだ。
Webを調べたところ、
先達の記事に原
因はPickit2制御ソフトの
デバイス定義リストにPIC12F1822が登録されてない為と在った。
早速Microchip社のサイトからダウンロードしようとしたが、削除されたらしく見つからない。
そこで「PK2DeviceFile.dat」で検索したところ、
同じ問題
を解決した方の記事を発見した。
その記事に従って新しい「PK2DeviceFile.dat」を入手し入れ替えてPIC12F1822は認識された。
2、MPLABの問題
従前からPICの開発にはMPLAB IDE(v8.92)にCCS-Cを組み合わせて使っている。
ところがMPLABの画面でDeviceをPIC12F1288に設定すると、ProgrammerにPickit2を設定できない。
下のMPLABの部分図でPICkit 2の文字が薄くなっており使えない事を示している。
プログラムの編集やコンパイルは問題なく実行できHexファイルが作られるが、
ProgrammerをMPLABから操作できない。
この問題を解決できる知恵を求めてWebを探したが見つからなかった。
書き込むには、Pickit2制御ソフトを起動してCCS-Cが作ったHexファイルを読み込まねばならない。
何度も試行錯誤を繰り返すプログラム開発では甚だ億劫な作業だと思った。
ところが実際に書き込みを行ってみると、Pickit2制御ソフトには大変便利な機能が在ると判った。
それが操作画面の右下部にある『Auto Import Hex + Write Device』スイッチだ。
下図のように、このモードの際にはスイッチの枠内が青色に表示される。
PIC12F1822をソケットへ差込み、このスイッチを押しすとHexファイルを読み込む画面が現れる。
Hexファイルを指定すれば、以降は何もしなくとも書き込み、確認まで済ませてくれる。
凄いのは、その後だ。MPLABでプログラムを編集作業が終了した際に、
PIC12F1822をPickit2互換機のソケットに差込んだ後にBuildのボタンをクリックすると、
Pickit2制御ソフトがCCS-CによってHexファイルが更新されたことを検知して、
自動的にHexファイルを読み込み書き込み、確認まで行う。
つまりBuildの操作だけで
PIC12F1822の書き込みまで済ませてくれる。
この機能によってMPLABでProgrammerを操作する場合よりも、
一手間少ない操作で書き込みができる。これは便利だ。
3、CCS-Cの問題
PIC12F683用に書いたプログラムをPIC12F1822用に移植する作業を行った。
その中では以下の修正が必要だった。
なお確認用のソースファイルには、
Mach3
用PWM基本周波数変換アダプターの制御プログラムを使った。
AD変換やPWM出力などを使っており、この目的には好適と考えた。
3-1 アナログポートの指定方法
ソースファイルで、<12f683.h>を<12f1822>と書き換えて、
CCS-CでBuildした際にErrorと指摘されたのはアナログポートの指定だけだった。
PIC12F683では、
setup_ADC_ports( AN0_ANALOG ); で良かった。
これをCCS-CのDeviceファイルを参照して、
setup_ADC_ports( sAN0 ); へと書き換えた。
これによってBuildでのエラーは消えたが、動かなかった。
試行錯誤の末、以下の様に書いて正常に機能した。
setup_DAC(DAC_OFF);
setup_ADC_ports( sAN0 | VSS_VDD );
setup_ADC( ADC_CLOCK_DIV_32 );
set_adc_channel(0);
PIC12F1822では、多くの新しい機能が加わった為に、細かな指定が増えたようだ。
3-2 CPU動作速度の指定方法
CPUの動作速度指定を変えずに、そのまま下記の様な記述で通電した。
setup_oscillator(OSC_8MHZ);
その結果、動いたのだが、やたらに速い。
モニター用LEDの点灯周波数を、テスターを使って確認したら1Hzの筈が3.5Hzだった。
つまりCPUは指定した8MHzではなく28MHzで動いていたのだ。
CCCS-Cのバグを疑い、CCS-Cが作ったLSTファイルを解読した。
....................
setup_oscillator(OSC_8MHZ );
0074: MOVLW 70
0075: MOVLB 01
0076: MOVWF 19
上記でオシレータ制御レジスタ
OSCCONを
70に設定している。
16進の
70はを2進で表すと
01110000になる。
OSCCONのbit6~bit3が内部オシレータ周波数選択ビットで
1110は
8MHzで問題無い。
ところがbit1~bit0が
00だった。この部分はシステムクロッ
ク選択ビット
SCSだ。
内部オシレーターを指定するには
10でなければならない。
CSCが
00だと内蔵発振器を使わずに外部の周波数基準を使ってしまう。
たぶん外部のCR回路が指定され、
回路パターンの浮遊容量とインダクタンスで決まる周波数で発振したのだろう。
そこでソースファイルに周波数基準を内蔵オシレーターに指定する記述を加えた。
....................
setup_oscillator(OSC_8MHZ | OSC_INTRC );
0074: MOVLW 72
0075: MOVLB 01
0076: MOVWF 19
これによって
OSCCONは
72に変わり
SCSは
10に
設定された。
その結果、正常な速度で動くようになった。
3-3 CCS-CでのPort-A割込み
3Dプリンターの誘導加熱を制御するプログラムの改良を続けている。
その中で、Mach3から送られて来るA軸モータ駆動パルス信号をPICで受けなければならなかった。
パルス信号の幅は3uSなので、ソフトでのポーリングでは見落としてしまう。
その為に割込み処理が必要になった。
Mach3からのパルス信号はPICのRA5に繋がれている。
そこでCCS-Cで下記のように記述した。
enable_interrupts(int_RA);
これで構築したところ、Undefined identifier int_RAとのエラーが示された。
しかし、どこが間違いなのかサッパリ解らない。合っている筈だ。
そこでCCS-Cのバグを疑い、ヘッダーファイル (
12f1822.h
)の中身を点検した。
驚いた事に割込みを決める部分に
RAの定義が無かった。
その代わりかRBの定義が在ったが、
PIC12F1822にはBポートは無い。
そこで無い筈のBポートでは、どんなコードを作るのか試してみた。
enable_interrupts(int_RB);
これで構築し、LSTファイルを解読したところ
RBはAポートに割り付けられていた。
よって、そのように記述すれば問題は回避できる。
ところが、次の問題に当ってしまった。
RAの割り込みは、PIC12F683よりも進歩している。
信号の立上がりや降下などの割込み条件を各ビット毎に設定できる。
その為に細かな設定が必要だが、それに相当する表記方法が見つからない。
たぶん無いのだ。
そこで下記のソースリストのように各レジスターを直接に操作した。
これで
割り込みは成功し、押しボタンスイッチを押すたびにLEDが反
転した。
しかしスイッチにはチャタリング対策を施して無いので完全なトグル動作にはならない。
割込み処理部の最後でIOCFをリセットしている。
IOCFをリセットしないと次のパルスを受け付けない。
使ったCCS-Cは、かなり古いVersion 4だ。新しい物では、ここで指摘した問題は解消しているようだ。
4、その他の知見
PIC12F1822に習熟する作業を通じて得た雑多な情報を以下に列記した。
4-1 デューティーサイクルが測れるテスター
秋月電子通商で販売を始めたowon社製のテスター( DMM B35 )を買った。
このテスターはデューティーサイクルが測れるのでPICのPWMをデバグするのに便利だ。
秋月電子で扱っている品揃えの中でもデューティーが測れるテスターは少ない。
高級テスター並みの性能だが価格は5千円強なので御買い得だ。
ピン数の少ないPICでは、コンピューター内の変数をモニターするのが難しい。
変数をPWMのDutyに割り当てれば、ピン1本を占有するだけでモニターできる。
このテスターによって新たなデバグ手段を獲得した。
このテスターを購入した動機は、
Bluetoothで測定データーをアンドロイドのタブレットに送信できるからだ。
特に用途が決まっていた訳ではなく好奇心と物欲に負けた。
使って見ると良く出来たテスターでコスパは高い製品だ。
中国の技術もここまで来たかと感心した。
高機能のテスターは電源に複数種の電池や006pなどの値の張る電池を使う場合が多い。
B35は単三乾電池2本だけなので入手が容易で、懐にも優しい。
若干気になったのは、プローブのコネクターが一般的なテスターと較べて太い点だ。
一般的に高級テスターのプローブは、コネクターのサイズが統一されている。
プローブは消耗品だ。消耗した場合には、市販品を購入すれば使えるのだが、
B35の場合には難しいかもしれない。
下の写真は
AMAZON
で売られている金メッキされたプローブです。
金メッキなので低電圧での接触信頼性が高いと考えて買いました。¥630-でした。
FLUKEとMASTECHのテスターには問題なく使えますが、
OWONのB35には入りませんでした。
4-2 ASUSのタブレット
OWON B35テスターと組合わせて使う目的で
ASUSのタブ
レット( ZenPad S8.0 )も購入した。
早速owon社から観測用アプリをダウンロードして接続試験を行った。
同
社のサイトにはBluetooth 4.0 versionとBluetooth 2.0 version用が用意されていた。
先ずBluetooth 4.0用を試した。ZenPadにBluetoothとして認識されたが、
wown社の 観測用アプリがB35テスターを認識できず使えなかった。
ZenPad S8.0のBooltoothはV4.1なので動く筈だが。
次にBluetooth 2.0用を試した。これもZenPadにBluetoothとして認識され、
wown社の 観測用アプリもB35テスターを認識して動いた。
温度を測って見ると、測定値がタブレットに表示されグラフ表示も出来た。
ところがデーターの保存ができなかった。
観測用アプリ
の右下に在るメニュ呼出しスイッチが、押しても反応しない。
いろいろと試したが駄目だった。
B35に添付されていたUser Manualを良く読んだら、
観測用アプリはアンドロイドのv4.0迄しか対応しておらず
それ以降のバージョンでは幾つかの機能が動かないと書いてあった。
ZenPad S8.0にはアンドロイドv5.0が使われている。
正常に動かないのは、バージョンのせいかも知れない。
4-3 HUAWEIのタブレット 16,01,24
実施
ASUSのタブレットでOWON B35テスターのデーターを
記録しようと試行錯誤を繰り返したが成功しなかった。
原因はアンドロイドv5.Xにあると推定し、v4.Xのタブレットを探した。
AmazonでHUAWEI製の
MediaPad
7 Youth2/Champagne1Gモデルが
Andoroid4.3で良さそうだった。それに価格が\7,553-と廉かったので購入した。
早速OWON B35テスターとBluetoothで繋ぎ試したところ、正常に動いた。
使ったのはBluetooth 2.0 version 用のcom.owon.Multimeter.apk だ。
下の写真は自作した3Dプリンターのノズル内部に熱電対を挿入し温度を測定した様子だ。
この後、Excelで読めるCSV形式のファイルを作りメールに添付してパソコンへ送った。
OWON B35とHUAWEI MediaPad 7によって簡単で便利な信号記録手段を手に入れた。
ASUS Zenpad S8.0は、素晴らしいタブレットだ。
処理速度は速く、絵の美しさは秀逸だ。質感も素晴らしい。
インターネットの閲覧では動画も快適で、音も良い感じだ。
同等の性能の競合機種と較べるとコストパフォーマンスも優れている。
OWON B35との接続は上手く行かなかったが、買って良かったと思っている。
HUAWEI MediaPad 7 Youth2は驚異的なコスパだ。
何とASUS Zenpad S8.0の1/4の価格だが優れた性能だ。
IPS液晶ではないが、自分の眼には充分な美しさだ。
アプリもインターネットの閲覧も軽快に動き何の問題も無い。
OWON B35との組み合わせでデーター収集に使うには勿体無い性能だ。
これも良い買い物だった。
5、MPLAB ICD3によるソフト開発
PIC12F683と同様に2本のピンを介してのインサーキットシリアルプログラミングが使える。
それに加えて
PIC12F1822ではインサーキットデバッグ
(ICD)が出来るようになった。
上手く使えればプログラム開発の能率が大幅に向上する筈だ。
ちょうど3Dプリンターに使う誘導加熱回路の制御で浮動小数点演算が合わずに困ってしまった。
そこでICD3を使ってインサーキットデバッグを試した。
5-1 ICD3用アダプターの製作 16,02,11 実施
ブレッドボードを使った試作を行う際に、毎回ICD用の回路やコネクターを用意するのは面倒だ。
そこで、下図のような必要最小限のICD3用アダプターを作った。
基板はCNC3020を使って切削加工で作った。便利な物に馴れて横着になった。
簡単な回路なので蛇の目基板でも作れるが、基板を切ったり配線するのが面倒だ。
8ピンDIPのソケットが無かったのでICを直接に半田付けした。
これだけでICD3から電源を供給すればPIC12F1822が動く筈だ。
赤と黒の電線は、PICへ電源を供給する為だ。
理由は後述するが、これ無しでは
書き込みは出来るがデバッグは出来なかった。
5-2 プログラムの書込み 16,02,11 実施
プログラムの開発にはMPLAB IDE v8.92を使った。
Microchip社は機能が強化されたMPLAB X IDEを出しているが、
自分が使っているコンパイラ ( CCS-C 4 )とはリンクできない。仕方なく古いのを使っている。
MPLAB IDEの操作は以下のように行った。
先ずパソコンにICD3をUSBで繋ぎ、ICD3にターゲットを繋ぐ。
Projectのタブをクリックし、Project
wizerdを起動して名前や使用するチップ、コンパイラの所在等の
必要な設定を行い新しいプロジェクトを作った。
次に
ProgrammerのタブをクリックしMPLAB
ICD3を選んだ。これでプログラムモードが選ばれる。
するとターゲットは繋いであるが、下図のように”ターゲットを繋げ”とのメッセージが表示された。
これは、ICD3からターゲットへ電源が供給されない為に起こる。
そこで再度
Programmerのタブをクリックしプルダウンメ
ニューの最下部に在るSettingsを選び、
表示されるメニューからPowerのタブを選ぶと下図の様に電源スイッチのページが出たのでチェックを入れた。
この後、低電圧の素子に対する注意が表示されたのでOKをクリックすると
ターゲットが認識され下図のようなデバイスのIDを示すメッセージが表示された。
この後、
Build Allアイコンをクリックしてソースファイルを
コンパイルし、
Programアイコンをクリックして書き込みが成功した。
以上の操作で、自作したICD3用アダプターのIn-Circuit Serial Programmin機能を確認できた。
5-3 ICD3によるデバッグ 16,02,12 実施
MPLAB IDEをプログラムモードからデバッグモードへ切り替えるには、
DebuggerをクリックしてICD3を選べば済む。
そこで再度
Debuggerのタブをクリックしプルダウンメニューの
最下部に在るSettingsを選び、
表示されるメニューからPowerのタブを選ぶと電源スイッチのページが出たのでチェックを入れた。
この後、低電圧の素子に対する注意が表示されたのでOKをクリックするとプログラムモードと
同様にターゲットが認識された。
デバッグの動作を確認する為に最小限のプログラムを書いた。
下記のソースファイルのようにDebugを宣言した。
この後、
Build Allアイコンをクリックしてソースファイルを
コンパイルし、
Programアイコンをクリックして書き込みが成功した。
以上でデバッグの準備が完了した。
そこで
RUNアイコン( 右向き三角
)をクリックするとターゲットのプログラムが、
実行される筈なのだが、下記のようなエラーメッセージが表示された。
エラーメッセージの意味はデバイスの設定が不適切という事だ。
デバイスは正しく認識されている筈なので何が問題なのか、さっぱり判らない。
仕方なくソースファイルの
#Fusesのスイッチを片っ端から変えて
試したが、
解決できなかった。
若しやと思い、12F1822のVssとVdd間の電圧をテスターで測ったところ、何と0Vだった。
MPLABの電源供給スイッチはONなのにICD3から電源が供給されてない。
これでは動くはずは無い。エラーメッセージで指摘された意味とも違う。
そこでMPLABの電源供給スイッチをOFFにし,
単四乾電池を3本使って4.5Vを供給したが、ターゲットが認識されない。
そこで
Debugerタブをクリックしてメニューを出し、
下から2番目の
Reconnectをクリックしたところターゲットが
認識された。
これでデバッガーが動いた。エラーメッセージも出ない。
4MHzと16MHzで動かし、counterに割り付けられたメモリーが増えるのが確認できた。
ICD3の故障を疑い仕事場から、別のICD3を持って来て同じ事を試した。
しかし結果は全く同じでICD3の故障ではなかった。
以上の作業で得られた結論は、
PIC12F1822のデバッグを行う場合には、外部から電源を供給しなければ動か
ない。
原因がMPLAB v8.82に在るのか、ICD3なのか判らない。
このところ加齢によりミスが増えプログラム開発の能力が落ちている。
頻繁に使う8ピンのPICでICD3を使ったデバッグが出来るのは福音だ。
6、内蔵基準電圧源の評価 16,04,30実施
PIC12F1822はAD変換などの基準となる定電圧源を内蔵している。
マイクロチップ社では、これをFVR(Fixed Voltage Reference)と呼んでいる。
FVRを使えば回路が単純になり部品点数が減る。
そこでFVRを信用して良いのか、実力を評価すべく実験した。
その結果、実力は
カタログデータよりも高精度だと判った。
6-1 実験方法
実験用に回路を作るのが面倒だったので3Dプリンター用の気温測定回路を流用した。
気温の測定に使っている
LM35DZの
出力をデジタルマルチメータ(Mastec MS8218)で読んだ。
測定プログラムはCCS-Cで書き、測定値はICD3とMPLABを使い
AD変換器の出力を保持するファイルレジスターの値を読み、デジタルマルチメータと較べた。
CPUのクロックは16MHzに設定した。
setup_oscillator( OSC_INTRC | OSC_16MHZ | OSC_PLL_OFF );
VFRの設定は下記のように1.024Vを選んだ。
setup_vref(
VREF_ON | VREF_ADC_1v024 );
AD変換機の設定は下記のようにした。
setup_ADC_ports(
sAN3 | VSS_FVR );
setup_ADC(
ADC_CLOCK_DIV_32 );
set_adc_channel(3);
AD変換機の読み取りは下記のようにした。
volt = read_adc(
ADC_READ_ONLY );
set_adc_channel(3);
read_adc(
ADC_START_ONLY );
これを1msに1回の周期で実行し16回分の移動平均処理をしてノイズを排除した。
電源にはニッケル水素電池を4本直列にして約
4.8Vを供給した。
電圧の精度は低いが、リップルの少ない電源だ。
6-2 実験結果
手元にあった8個のPIC12F1822を測定した。結果は下表のようになった。
sample# |
PIC12F1822 |
MS8218 |
誤差 |
誤差 |
量子化誤差 |
|
〔mV〕 |
〔mV〕 |
〔%〕 |
〔% at F.S〕 |
範囲内? |
1 |
242 |
241.2 |
0.33 |
0.08 |
◎ |
2 |
244 |
242.8 |
0.49 |
0.12 |
|
3 |
245 |
245.4 |
-0.16 |
-0.04 |
◎ |
4 |
245 |
244.7 |
0.12 |
0.03 |
◎ |
5 |
246 |
246.2 |
-0.08 |
-0.02 |
◎ |
6 |
248 |
247.3 |
0.28 |
0.07 |
◎ |
7 |
247 |
247.2 |
-0.08 |
-0.02 |
◎ |
8 |
250 |
247.7 |
0.93 |
0.22 |
|
実験に使ったPIC12F1822の大部分は量子化誤差の範囲内で実質誤差ゼロだった。
量子化誤差の範囲に収まらなかったのは2個だけだった。
その2個も実用上無視できるほどの僅かな誤差だった。
VFRに1.024Vを選んだので、10bitのADCで読み取ると1bitが1mVに相当する。
温度測定に使ったLM35DZの出力は10mV/℃なので実験当日の室温が25℃付近だと判る。
6-3 評価
カタログデータでは、誤差は-8%~+6%の範囲で温度係数は-114ppmとなっている。
これは最悪の場合であって、
実験の結果は遥かに高精度だった。
ただしサンプルに用いた8個のチップは、同時に買った物で同一ロットの可能性が高い。
ロットが違うと結果も違う可能性がある。
温度測定に使ったLM35DZが敏感なのに驚いた。
LM35DZの真上10cm程度に手を10秒間程度かざすと、PIC12F1822の読み値が1だけ増えた。
手のひらが出す赤外線によって温度が上昇したらしい。
電圧測定に使ったデジタルマルチメーター Mastec MS8218は、
予めOWON B35 と測定値を比較し殆ど差が無いことを確認して実験した。