PIC の勘所(コツ)

みなさんが陥りがちな点をまとめました。治療にお役立てください。
症状だけでなく、レベルにあせてご覧いただけるようにしています。

難易度意味
初心者がほとんど陥る。若葉マーク
★★中堅者が陥る。
★★★ベテランが陥る。

できるだけ類似のものを並べました。

難易度
症状定期的に動作が不安定になる。
原因 ウォッチドックタイマーが有効になっており、時折割り込みが発生するため。
対処 ウォッチドックタイマーとはプログラムが暴走していないか定期的に 自己診断するための機能。
ウォッチドックタイマーはデフォルトで有効になっているので、無効にすること。
コンフィグレーションを書き忘れているか、設定誤り。

難易度
症状 RA4 が High 出力されない。
原因 RA4 の出力はオープンドレインのため。
対処 オープンドレインとは論理電圧の異なるインターフェースとしてや、 電流を吸い込むことで外部装置を作動させるための仕組み。
外部抵抗でプルアップすることでほとんど対処できる。
(プルアップとはポートを適切な抵抗で電源のプラス側に接続すること(電圧を吊り上げる)。 逆に抵抗を電源のグランドに接続することをプルダウンという。 プルアップ抵抗が小さすぎると電流が流れすぎてポートを壊したり、抵抗が大きすぎると ノイズの影響を受けやすい。通常は10Kから100Kの間を選択する。低消費電力を考えているなら、 プルアップ抵抗は高めに設定するか、そもそもプルアップしない設計をすること。 プルアップ抵抗の消費電力は馬鹿にならない。)
注意:最新PICのRA4は仕様変更されており、オープンドレインではない。 たとえば、16F818/819,87/88,630,684,688 のRA4はオープンドレインではない。

難易度
症状 1度しか書き込めない。
原因 ワンタイムのPICのため。
対処 ワンタイムとはその名のとおり、一度しか書き込めない。 量産用で、すでにプログラムが十分テスト済みであることを前提にしている。
何度も書き込みたいのであれば、消去可能なEPROMタイプ(JW)かFlashタイプ(F)のPICを選択すること。
(EPROMタイプはガラス窓があり専用紫外線を数十分照射することで消去される。 夏場であれば太陽に丸1日さらしても消去可能。 Flashタイプは電気的に短時間で消去できる。)

難易度
疑問Flashタイプの書き換え可能回数は?
答え 保証値は以下のとおり。
プログラム領域 1000回
データ用のEEPROM 100万回

難易度★★★
症状 EPROM タイプで紫外線消去してもプロテクトを解除できない。
原因 仕様。
対処 たとえEPROMタイプで紫外線消去可能であっても、プロテクトビットだけは紫外線を マスクされているため解除できない。これは不正防止のため。見る人がみれば、 ダイのプロテクトビット付近だけに紫外線を当て、プロテクト破りされてしまう。 EPROM は決してプロテクトしないように。

難易度★★
症状 リセットされない。
原因 外部電圧が MCLR に回り込んでいるため。
対処 電源投入以前に外部より入出力ポートへ電圧が加えられており、 それらが回り込んで MCLR 電圧が下がりきらないためリセットされない。 PIC は CMOS で作られているため消費電力が小さく、このような電流の 回り込みが発生する。 原因のポートをプルダウンすることでほとんど解決。

難易度
症状 規定以上の動作クロックで動作する。
原因 動作クロックはチップの設計、製造工程である程度決まるが、最終検査段階で選別されるため。
対処 たとえば 10MHz タイプも 20MHz タイプも中身は同じで検査の段階で選別されて 動作保証されるだけである。 10MHz のものは 20MHz では動作検査されていない、あるいは検査されていても はじかれただけで動くことがほとんど。
(歩留まりの関係で多少品質の悪いものは低い動作保証しかされないで出荷される。 これにより廃棄するチップが少なくて済む。低電圧電源タイプも同様。)
アマチュア的には許されるが、ビジネスでは必ず動作保証範囲を守ること。

難易度
症状 割り込みを使用すると動作が不安定。
原因 WレジスタとSTATUSレジスタを退避、復帰していないため。
対処 割り込み中では必ず、これらを退避、復帰させること。
16F87x ではさらに PCLATH, FSR も退避、復帰させること。 詳細はデータシート参照。

難易度
症状 BSF,BCF を使用すると期待したポート出力にならない。
原因 PIC のデータシートを読んでいないため。
対処 この現象はデータシートに解説されている。 BSF,BCF は内部的には入力を行ってから出力する。 そのため、出力端子にインピーダンスの低いものが接続されていると その入力結果が出力される。 MOV 命令を利用するか、出力バッファー回路を間に挟む。

難易度★★★
症状 MOV 命令を使用しても期待したポート出力にならない。
原因 出力に許容を超える容量負荷が接続されているため(ファンアウトが十分ではない)。
対処 2ポート以上を束にして使用するか、出力バッファー回路を間に挟む。

難易度
症状 最新のFlashタイプで書き込みが不安定。
原因 PGMピンがグランドにプルダウンされていないため。
対処 古いライタがPGMピンに対応していないときに起こる。

難易度
症状 低電圧書き込み方式で書き込みができなくなる。
原因 これは低電圧書き込み方式の盲点。 誤ってConfigurationのLVPをOFFすると低電圧書き込みモードに入れなくなり、 書き込みができない。
対処 一度通常の High Voltage 書き込み方式で、チップ消去を行いConfigurationを クリアすること。最低限、通常書き込みできるライタを用意しておこう。

難易度
症状 16F87xA シリーズの書き込みができない。
原因 16F87x と 16F87xA で書き込み方法が異なるため。Aバージョンを甘くみてはいけない。
対処 16F87xA に対応したライタが必要。16F84 と 16F84A で大差はなかったが、 16F87x と 16F87xA は書き込み方法がまったく異なる。

難易度★★★
症状 16C84 の消費電流が規定以上になる。
原因 16C84 固有のチップバグ。
対処 特に低い動作クロックで顕著であり、回避策としてメインルーチンのできるだけ早い位置で次の命令を実行すること。
	CLRF	EEADR
16C84 はすでに市場から消えているが、保守在庫で使用する場合には注意。
さらに 500KHz 以下の水晶発振子で RA0 の状態をスイッチするとスプリアス(ノイズ)がでることがある。 回避策はない。詳しくは Errata シートを参照。

難易度★★★
症状 16F84 でSTATUSレジスタのPDビットが機能しないことがある。
原因 16F84 固有のチップバグ。
対処 20度C以下の場合に発生する。 回避策はない。

難易度★★★
症状 16F84 で EEDATA レジスタが不定になる。
原因 16F84 固有のチップバグ。
対処 EEPROM をリード直後に EECON1 を変更してはいけない。 間に NOP を入れるか、順序を変更すること。
	BSF	EECON1, RD
	NOP
	BCF	EECON1, WREN
	or
	BCF	EECON1, WREN
	BSF	EECON1, RD
	

難易度★★★
症状 16F84 で予期せず TMR0 が進むことがある。
原因 16F84 固有のチップバグ。
対処 WDT から TMR0 へ切り替えたときに発生する。 割り込みが有効でTMR0がオーバーフローすると割り込みも発生するので注意。 回避策は TMR0 を退避、復帰を行うこと。

難易度★★★
症状 16F87x(Rev.B3) の MSSP が SPI モードのとき SDI が出力されない。
原因 16F87x 固有のチップバグ。
対処 回避策はない。Rev.B4 で改善予定。

難易度
症状 サブルーチンをコールすると帰ってこない。
原因 サブルーチンのスタックは8しかないため。
対処 コールのネスト(階層)が深いと帰ってこれない。ネストを深くしないこと。

難易度★★
症状 16F87x の GOTO や CALL が期待通りに動作しない。
原因 ページをまたがっているため。
対処 ページをまたがった GOTO や CALL にはページ制御(PCLATH)が必要。 ページをまたがらないときには必要ない。
	MOVLW	10H	; memory page 2, pc high byte
	MOVWF	PCLATH	; <4:3>
	GOTO	FOO
	
	

難易度★★
症状 16F87x でページをまたがった RETURN 後、GOTO や CALL が期待通りに動作しない。
原因 RETURN では PCLATH が復帰されないため。
対処 ページをまたがっていても RETURN にはページ制御は必要ない。 ページも含めてスタックされているから、正しく RETURN する。 しかし, PCLATH が復帰されるわけではない。PCLATH はバッファーであり、 実際のアドレスと異なっていることに注意。 ページをまたがるプログラムでは常に PCLATH を意識すること。

難易度
症状 MOVF f,d 直後の条件分岐動作が不安定。
原因 移動命令の MOVF f,d の結果はZフラグに影響を与えるため。
対処 移動命令だからフラグに影響するはずがないとの思い込みがあるので注意。

難易度★★
症状 テーブル参照ルーチンが正しく動作しない。
原因 プログラムがページをまたいでいるため。
対処 ADDWF PCL,F はページをまたげない。 またいでいる場合には ORG でページをまたがないようにプログラムを配置する。
		ORG	100H
	TABLE
		ADDWF	PCL,F
		RETLW	LED0
		RETLW	LED1
		RETLW	LED2
		RETLW	LED3
		RETLW	LED4
		RETLW	LED5
		RETLW	LED6
		RETLW	LED7
		RETLW	LED8
		RETLW	LED9
	

難易度★★★
症状 16F87x で正しくA/D変換されない。(変換値が 3FFh になる)
原因 基準電圧Vrefが低いと正しく変換されない。
対処 規格上 Vref=(Vref+)-(Vref-) は最低 2.0V 必要。
つまり10bitでは最大分解能は 2.0V / 1024 = 1.953125mV となる。
狭い電圧範囲をA/D変換するときはアンプで増幅すること。
なお、Vdd=5Vの場合、(Vref+) も (Vdd - 2.5V) 以上でなければならないので 2.5V以上必要。
(参考)A/D変換の分解能 1LSB は Vref/1023 ではなく、Vref/1024 です。
詳しくは DS33023 の 23.12 Transfer Function の章をご覧ください。

(C)2002-2003 All rights reserved by Einstein. inserted by FC2 system