ワンポイントアドバイス


目次

Hitech PICC Pro でのEEPROMアクセスについて
MPLAB IDEで古いWorkspaceや、別のパソコンで作ったWorkspaceを開くと一瞬起動して終了する問題
(2011/8/31)
Hitech PICC Proの__delay_msと__delay__usについて(2011/8/2)
HI-TECH C for the PIC10/12/16 v9.82をインストールした後にMPLABが起動不良になる問題と解決方法(2011/6/24)
HI-TECH C for the PIC10/12/16 v9.81以降で旧プロジェクトを使用する場合の互換設定(2011/1/17) よくある質問
MPLABのMemory Usage Gaugeの表示不具合(〜MPLAM IDE8.40)(2012/11/11)追記
注釈行に\(バックスラッシュ)を使うときは注意(2009/10/17)
PICC Proでソースプログラム内で半角カタカナを使用するとエラーになる(2009/11/12)
PICC ProでのEEPROM設定における注意点(2009/10/17)
アナログポートの有無を自動的に検出してビルドする方法(便利なプリプロセッサのdefined文)(2009/10/17)
PICC Pro9.60PL3以降をLiteモードで使用するときの__delay_msと__delay__us(2008/11/12)
MPLAB C30 v3.10 Studentをインストールするとライセンス切れになる現象の対処(2008/5/15)
PICkit 2を乾電池で動かす(2008/4/13)
AKI−PICプログラマー Ver.4のアプリケーションインストール(2005/2/5)
PIC12F675,PIC12F629の内部発振モードで使用するBG、OSCCALの説明(2004/5/29)
PIC移植のメモ(2003/12)

これ以外にも、エアーバリアブルブログのPICカテゴリもご参照ください

Hitech PICCは Microchip XC8コンパイラになりました。記事中のHitech PICCをXC8に読み替えてください。

※記事中、同一もしくは似た情報がある場合、最新の情報を参考にしてください。また、内容は独自調査ですのでご利用は自己責任にてお願いします。


Hitech PICC Pro でのEEPROMアクセスについて

1.EEIF (EEPROM write complete bit)をチェックしていない
 「EEIFビット」(書き込み完了判断)をチェックはしていませんが、書き込み前に「WRビット」(書き込み中判断)をチェックしているので、書いた直後にすかさず読みに行くケースでもなければ特に問題になりません。

2.マクロ定義ということで、コードサイズが大きくなる
_delayマクロと同様に、使えば使うほどプログラムが肥大します。

何度も使用する場合は、EEPROM_READとEEPROM_WRITEをそれぞれ、別の関数に置き換えると、プログラムサイズを節約できます。

検証記事はブログに掲載しています。

(2011/9/23)


MPLAB IDEで古いWorkspaceや、別のパソコンで作ったWorkspaceを開くと一瞬起動して終了する問題

現在最新のMPLAB IDEで、以前のバージョンで作成したワークスペース(*.mcp)を開いた時、MPLABが一瞬起動してから終了し、その後、MPLAB IDEを単独で開こうとしても、一瞬起動で開けなくなる事があります。また、同一バージョンでも別のパソコンで作ったWorkspaceフォルダを移し替えて使っても同様の現象が発生することがあります。原因は良く分かっていません。

更に、Configure→Settings→WorkspaceタブでReload last Workspace at startup (起動時に最後のワークスペースをロードする)にチェックが入っていると、不具合のあるプロジェクトファイルを毎回読むようになってしまい、ループしてしまいます。


この様な状態に陥ってしまった場合は、2つの解決方法があります。但し、ソースファイルやレジストリのバックアップは必ず取ってから行うようにしてください。レジストリエディタは、ある程度の操作知識が必要です。

*.mcpファイルをダブルクリックして開く事場合によく起きますので、MPLAB IDE単独で立ち上げ、File -> Open Workspaceでプロジェクトファイルを読み込みます。

(1)MPLAB IDEを単独で開いて、開けなかったら別のプロジェクトファイル(*.mcp)をダブルクリックして開く 

開けたら一旦このWorkspaceを閉じ、下のダイアログの赤枠Reload last workspace at startupチェックボックスを外しておきます。
(ループ回避)


そして、問題のあるプロジェクトを読み込んで、ビルドし直して見てください。読み込み途中で終了するなどの現象が起きた場合は、*.cや*.hなどのソースコード以外を全て消し、Project wizardで新しくプロジェクトを作り直します。

(2)レジストリエディタを利用する

上記方法で開けない場合は、レジストリを操作することになります。

win+Rでコマンド入力を出して、regeditを起動し、
HKEY_USERSをフォーカス 
→ crtl+Fで DefaultWorkspaceを検索
→ 文字列の編集で内容を消しOK MPLABを立上げます。
HKEY_USERSからMicrochipの間にはユニークな番号が入り、環境によって違いがあります。




この操作で、MPLAB IDEが不具合のあるプロジェクトを読みに行かない様になりますので、上記(1)と同様の対処を行います。

(2011/8/31)


Hitech PICC Proの__delay_msと__delay__usについて

Hitech PICC Pro9.60 PL3以降、マクロとして提供されているDelayは非常に便利でとても良く使うと思います。
Version 9.80以降は、その扱える時間に変更があります。
エラーメッセージには、
Error [1274] C:\picsrc\piccpro\lcd_bar_16f1827\main.c; 595. delay exceeds maximum limit of 50660096 cycles
__delay_ms(25231);

と表示され、50,660,096サイクルとなっていますが、実際の調査ではVer9.82の場合、50,462,464で計算が合うようです。

Hitec PICC Pro ver 9.82の最大限扱えるDelay時間

動作周波数 最大時間 __delay_ms(x) __delay_us(x)
20MHz 10,092,493us __delay_ms(10092); __delay_us(10092493);
16MHz 12,615,616us __delay_ms1(2615); __delay_us(12615616);
10MHz 20,184,986us __delay_ms(20184); __delay_us(20184986);
8MHz 25,231,232us __delay_ms(25231); __delay_us(25231232);
4MHz 50,462,464us __delay_ms(50462); __delay_us(50462464);
32.768Khz 6,159,968,750us __delay_ms(6159968); __delay_us(6159968750);



使用する前に、mainの先頭などで最初に周波数のセットを行う宣言をします。
例えば20MHz動作の場合、

#define MHz 000000
#define _XTAL_FREQ 20MHz
という風に定義します。

便利なマクロですが、その都度プログラムメモリーを消費します。よく使用する時間は、関数にして使用する方がプログラムメモリーの消費を抑える事ができます。(この事はeepromマクロにも同様です)

例 _delay_ms(100)を数十箇所使いたい場合は、

上記の関数を作成し、delay_10ms(10)を使う方が、プログラム容量を減らすことができます。extern宣言しておくと便利です。但し、ループ文の時間遅れが加算されますのでマイクロ秒などで使用する場合はその事を考慮して使用します。

(2011/8/2)
(2011/9/23追記)


HI-TECH C for the PIC10/12/16 v9.82をインストールした後にMPLABが起動不良になる問題と解決方法

MPLAB8.70上でプロジェクトを開いたまま終了させ、その後Hitech PICC 9.82をインストールすると、MPLABが一瞬ロゴが見えて、数秒後終了してしまう問題がある事を確認しました。対処方法は、一旦Hitech PICC9.82をアンインストール後、MPLABを開き(アンインストール後はMPLABが開けるはず)、Project→Close でプロジェクトを一旦終了させてから、Hitech PICC9.82をインストールする事で、MPLAB8.70が起動できる様になります。(2011/6/24)

アンインストールしなくても、上記「MPLAB IDEで古いWorkspaceを開くと一瞬起動して終了する問題」の方法でも解決出来る場合があります。


HI-TECH C for the PIC10/12/16 v9.81以降で旧プロジェクトを使用する場合の互換設定

9.81以降のバージョンでは、ヘッダーファイルの全面的な改訂に伴い、9.80以前で作成された旧プロジェクトをそのまま使用する事が出来ません。
症状としては、

Error [800] 〜 undefined symbol "LVPDIS"
Error [800] 〜 undefined symbol "BORDIS"

等と、表示されたりします。

解決は3つの方法があります。
下記1,2の方法は、対処法ですが、将来的にも使用するソースであれば下記3の新しいシンボルに書き直すのが良いと思います。
詳細はC:\Program Files\HI-TECH Software\PICC\9.82\docs (※9.82の場合)のReadmeファイルを参照してください。


1.従来ヘッダーを参照するようにする

一番早く動作させることができます。対処法的解決です。

Project -> Build Option ->Projectを選択後、CompilerタブのDefine macrosで

_LEGACY_HEADERS

を入れてAdd..をクリックする事でビルド時に
C:\Program Files\HI-TECH Software\PICC\9.82\include\legacy
(※9.82の場合)を参照するようになり、9.80以前のプロジェクトファイルがビルドできる様になります。

または、ソースコードの先頭に
#define _LEGACY_HEADERS
と記述してビルドしても同様の効果となります。ソースコードで管理できる為、こちらの方がお勧めです。

2.古いHitech PICCを入れる

こちらも対処法的解決ですが、コンパイルしたいソースコードにバージョンが明示してあれば、それにあったコンパイラでビルドできますので確実に動作させることが出来るでしょう。

ArchivesのページからHitech C archiveより、FTP経由でダウンロードできます
インストールし、コンパイラを切り替えて使用します。説明はこちらで行っております

2.ヘッダーファイルを参考にして新しいシンボルに書き直す

大きなコードサイズでは手直しに時間が掛かるのが難点ですが、今後も使用するのであれば、ソースコードを修正するのが最良の方法です。

新しいヘッダーとは、例えば、
C:\Program Files\HI-TECH Software\PICC\9.82\include\pic16f88.h (versionが9.82でPIC16F88の場合)

を見ると、従来のGODONEGO_nDONEと表記されています。
基本的に負論理にはnを付けるようになっています。
またEN,DISも_ON,_OFFなどに書き直されている部分が多数あります。

この方法は、これからのHITECH PICCのバージョン変更に対応できるのですが、修正箇所が多い場合は作業が大変になります。
ビルドして、エラーが起きたら、そのシンボルの新しいシンボルを書きなおして、エラーが無くなるまで続ければ、比較的早く書き換える事が可能です。

(2011/1/17)
(2011/9/22追記)


MPLABのMemory Usage Gaugeの表示不具合(〜MPLAM IDE8.40)

いつのバージョンからこうなったのかは分りませんが、MPLAB IDEのメニューからView→Memory Usage Gaugeの表示がおかしい事に気づきました。実は前からちょっと変だなと思いましたが、BBSのご指摘から調べる事にしました。この内容はブログでも同一内容で紹介しています。

まずはデバイスを適当に16F88にして、

void main(void){}
これだけのプログラムを書いてビルド


これは、普通ですね。

それでは次に、EEPROM領域に適当なデータ
__EEPROM_DATA(0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A);//00-07
をセットしてビルドします。


なんと、8バイトのEEPROMを書いたらこういう変化が。プログラムは8増え、データは16も増えました。
OUTPUTダイアログは、

Memory Summary:
Program space used 4h ( 4) of 1000h words ( 0.1%)
Data space used 0h ( 0) of 170h bytes ( 0.0%)
EEPROM space used 8h ( 8) of 100h bytes ( 3.1%)
Configuration bits used 0h ( 0) of 2h words ( 0.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)

特に問題無いようです。

次にEEPROM領域を全部データで埋めます。すると、


明らかに表示がおかしいですね。EEPROMを全部使うと256バイトですから、
プログラムは4+256=260
データは256x2=512
という事になります。
なお、OUTPUTダイアログは、

Memory Summary:
Program space used 4h ( 4) of 1000h words ( 0.1%)
Data space used 0h ( 0) of 170h bytes ( 0.0%)
EEPROM space used 100h ( 256) of 100h bytes (100.0%)
Configuration bits used 0h ( 0) of 2h words ( 0.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)

全く問題ありません。
2012/11/11追記。MPLABの問題より、Hitech PICCの問題だった様で、XC8コンパイラになってから、この問題は解消されています。詳しくはブログで紹介しています


MPASMでも、すこし現象が違いますが、プログラムメモリーにeeprom領域が加算されるようです。



EEPROM領域をリマークした場合、プログラムメモリーは1ですが、



EEPROM領域に8バイトを定義したらプログラムメモリーが9になっていました。

メモリー使用状況は、このダイアログを見て確認するのが良いです。
マイクロチップフォーラムには気が向いたら質問してみたいと思います。

2009/10/17
2012/11/11


注釈行に\(バックスラッシュ)を使うときは注意

config設定の所で、後で分かるようにコメントを残していましたが、

#include <htc.h>
//see C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include\
__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);

これをビルドすると、下の行がコメント扱いになってしまい、__CONFIGが無かった事になります。
原因は、このコメントの最後の文字にあり、これが次の行にも掛かる事を示している事になり、__CONFIGが注釈扱いとなってしまいました。

#include <htc.h>
//see C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include
__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);

このように最後の部分の\マークを外せばokです。
これはまだ分かりやすいのですが、\に相当する全角コードだと、もっと厄介になります。
「\」はアスキーコードで0x5Cですが、それが含まれているコード、
例えば、

875C \
815C ―

こんな文字が注釈の終わりにあろうものなら、次の行は注釈行となるので、原因不明に思える振る舞いに遭遇するなど、デバッグで苦労することでしょう。これを避けるためには

という方法があります。

この情報はこちらから頂きました。ありがとうございました。

他のC言語でも5C問題として結構有名な事の様です。

2009/10/17更新


PICC Proでソースプログラム内で半角カタカナを使用するとエラーになる

HI-TECH C PRO for the PIC10/12/16 MCU family (Lite) V9.65PL1でソースプログラム内部で半角カタカナを使用すると、 illegal characterというエラーが出るようになります。回避方法は、
#includeの行の後に
#pragma jis

を入れるだけでエラー無くビルドが出来るようになります。

lcd_puts("ボタンヲオシテクダサイ");
※半角カタカナは文字化けの恐れがあるので、全角で表記しています。

とか直接書くことが出来るようになります。


もう一つの方法として、メッセージ定義ファイルを書き換える方法がありますが、ソースファイルの互換性を欠くため、お勧めではありません。この方法は、上記方法が出来る前の暫定対処方法として、hitechフォーラムで提案されたものです。参考までに掲載いたします。

C:\Program Files\HI-TECH Software\PICC\9.70\dat
(バージョンやインストール時の環境により、フォルダ位置が異なります)

にある、en_msgs.txt の部分の一部を修正すれば、コンパイラが通ります。

修正前
228 E illegal character (0x%X)

修正後
228 M illegal character (0x%X)

修正は、メッセージとして表示したかったのでMとしましたが、0(ゼロ)にすると表示もなくなります。修正前にオリジナルのen_msgs.txtのバックアップを取る方が無難です。

2009/10/15更新
2009/11/12更新


PICC ProでのEEPROM設定における注意点

EEPROMにデータをセットするとき

__EEPROM_DATA(data1,data2・・・data8);

を使いますが、このデーター部分に「0b〜」で始まる2進数表現は使えないという事が分かりました。
0b00001111,0b01011001,・・・・と書くとビルド時エラーになります。これを10進数か16進数で記述すれば問題はありません。
でも、LCDキャラクターフォントの定義などで、どうしても2進数表現で書きたい場合もありますよね。
その場合は、「00000000B」の様に書くと良いそうです。



__EEPROM_DATA(
00001111B,
00001011B,
00001101B,
00001110B,
00001001B,
00001100B,
00000011B,
00000110B
);

但し、最後のBは小文字のbは使えませんのでご注意ください。以上この情報はBBSより頂きました。ありがとう御座いました。

2009/10/17更新


アナログポートの有無を自動的に検出してビルドする方法(便利なプリプロセッサのdefined文)


マイクロチップのPICマイコンの仕様書は、アナログ入力の有無のみで共通化される事があります。

ADコンバータ無し ADコンバータあり
16F87 16F88
12F629 12F675

これをHitech PICC Proで書くとき、どちらのデバイスもデジタルポートとして扱う場合は、ADコンバータありの方のチップには
ANSEL = 0x00;
とmain.cのイニシャライズに表記しないとチップからデータが出力されず、ADコンバータ無しの方のチップにこれを書くと、ビルド時エラーになってしまいます。

今まで私は、チップを変える度にコメントアウトしていましたが、もっとスマートにする方法があり、C言語のプリプロセッサを活用すれば、これでチップによって自動的に判断してくれます。ソースファイルの初期設定ルーチンに追加します。

16F87と16F88の場合 12F629と12F675の場合
#if defined(_16F88)
ANSEL = 0x00; //Digitalポートで使用
#endif
#if defined(_12F675)
ANSEL = 0x00; //Digitalポートで使用
#endif


この#if defined()のプリプロセッサ文は便利で、異なるデバイスを共通のソースで表現したい時などに役に立ちます。

例 16F84,16F84A,16F628,16F628A,16F627,16F627A,16F648A,16F88を同じソースで管理する場合(timer0などの相違など、細かい部分は省いています)


2009/10/17更新


PICC Pro9.60PL3以降をLiteモードで使用するときの__delay_msと__delay__us(〜9.71)

※Hitech PICC Pro9.80以降は、扱える時間が改善されています。こちらを参照してください。

PICC Liteを使ってる人は、サンプルプログラムとして付属しているdelay.cとdelay.hを良く使っていたと思います。しかしPICC Proを Liteモードで使用すると、delayの時間が設定値より約3倍延びてしまいます。例えばDelayMs(100)と設定しても、実際は300ms位の遅れになります。

これは、PICC ProをLiteモードで使用するとき、フリー制限のために冗長コードが挿入される(もしくは最適化されない)ので、ソフトウェアタイマーのコード生成時に、待ち時間ループ部分が3倍大きくなる為、このような現象が起きます。対処としては、値を意図的に1/3に調整して設定する方法もありますが、PICC Proをアクティベーションした後はdelayの値は正常になるので、あまり好ましい方法ではありません。

そこでPICC Proには、正確な時間を生成できる2つの内部関数が用意されています。

__delay_ms(ミリ秒);
__delay_us(マイクロ秒);

中の部分の数字はunsigned longで指定できます。
使い方は、最初に周波数のセットを行う宣言をします。
例えば20MHz動作の場合、

#define MHz 000000
#define _XTAL_FREQ 20MHz
という風に定義します。

その代わりに時間上限の制約があります。生成されるサイクル数が197,120サイクルまでとなっているので、20MHZでは39.424msまでの設定,4MHzなら、197.120msまでが上限設定値になります。__delay_msの場合は1000で割って端数を切り捨てます。

最大取り扱い時間 = (1 ÷ 動作周波数Hz) x 4(サイクル) x 197120(最大取り扱いサイクル数)

動作周波数と設定できる最大値

動作周波数 最大時間 __delay_ms(x) __delay_us(x)
20MHz 39,424us __delay_ms(39); __delay_us(39424);
16MHz 49,280us __delay_ms(49); __delay_us(49280);
10MHz 78848us __delay_ms(78); __delay_us(78848);
8MHz 98560us __delay_ms(98); __delay_us(98560);
4MHz 197120us __delay_ms(197); __delay_us(197120);

※Hitech PICC Pro9.80以降は、扱える時間が改善されています。こちらを参照してください。

これ以上の大きいタイマーが必要な場合はループ処理などで対応します。
delayのサンプルプログラム

この関数は変数が使えませんので注意が必要です。

2008/11/12
2011/8/2追記


MPLAB C30 v3.10 Studentをインストールするとライセンス切れになる現象の対処

ライセンスマネージャ等の問題がありましたが、現在は修正版の3.10bが公開されています。
また、このバージョンになってから、dsPICとPIC24を別々のインストーラにして、名前もC30は通名となり、正式にはMPLAB C Compiler for PIC24 MCUs and dsPIC DSCsという名称に変わりました。

2008/5/15


PICkit 2を乾電池で動かす

PICkit2を新機能のProgrammer to go (スタンドアロン)で動かす場合、外部電源として、市販電池用携帯充電器を改造して使う方法を紹介します。

2008/4/13


AKI−PICプログラマー Ver.4のアプリケーションインストール

12F683に対応したベータ版が公開されています。所で、そのベータ版をインストールする時に古いファイルのチェックをしていて、そのファイルを書き換える旨の表示後、再起動をしてインストールする場合がありますが、一部のパソコンでは何度再起動しても同じメッセージの繰り返しでインストールがうまく行かないようです。(2件確認)
対処方法としては、セーフモードで立ち上げ、管理者権限(もしくはそのユーザ)でログオンしてからインストール後、再起動し通常の起動でインストールが可能となります。

また、古いアプリケーションを残したままインストールすると、12F683が選択できない場合があるので、必ず古いアプリケーションをアンインストールしてから、インストールを行った方が良いでしょう。

2005/2/5


PIC12F675,PIC12F629の内部発振モードで使用するBG、OSCCALの説明

これらのPICマイコンは、工場出荷時に、リセットの電圧と内蔵発振回路の精度を確保したデータがプログラムの最終番地に書き込まれております。

OSCCALはレジスタである為、プログラムエリアに予め書き込まれている部分から、データを拾ってきてプログラムで設定して初めて誤差を最小に抑えた発振となります。

OSCCALについて、現在のHitec PICC Lite Pro mode 9.70以降は、MPLABメニューからProject→Build Option→Projectで開くウィンドウ内のLinkerタブをクリックし、Runtime optionチェック項目中のCalibration oscillatorにチェックが入っていれば特別な設定の必要がありません。
また、この時 Alternate oscillator calibration valueに00〜FFの値(厳密には下位は0,4,8,C)を書き込むと校正データ格納部分にこの値を設定します。(しかし、PICkit2ではこのデータは無視されるようです)

チェックを外すと補正プログラムが省かれます。


詳細説明

BG(2007h,b13,12)(バンドギャップ値)は、パワーオンリセット動作のブラウンアウトリセット選択時の電圧しきい値(スレッショルドレベル)を4段階で定義しており、OSCCAL(90h 6bit left side)は内蔵オシレータ4MHzを校正しているデータです。
OSCCAL値は、ICの出荷時に書き込まれており、0〜80℃、2V〜5.5Vにおいて、周波数の変動を2%以内(3.92〜4.08MHz)に抑えています。BG値は、リセットレベルの動作点を設定する為のもので、2.025V〜2.175の範囲に収まるように2007hのビット13,12に書かれており4段階の調整値が書き込まれています。

これは、PICライタソフトがこの値を読み返し、その値をプログラム書き込み時に書き込みます。
OSCCAL(90h 6bit left side)で使用するデータについては、プログラムメモリー領域の最終アドレス03FFhに書き込まれています。
このデータはオペコード RETLW xxとして書き込まれているため、たとえば、キャリブレーションレジスターが7Chとすれば、ADDRESS 03FFhには347Ch(RETLW 7C)と書き込まれています。


標準設定のHitech PICCでは、以下のアセンブラを自動で挿入していますので意識する必要はありません。

bsf   STATUS,RP0   ;バンクを1ページにセットして、
call  h'3FF'     ;プログラムの最終番地へ飛んで、
movwf  OSCCAL    ;戻ってきた値をOSCCALへセットして、
bcf   STATUS,RP0   ;バンクを0へ戻す

この項目が無いHitech PICCのバージョンでは、mainルーチンの最初に
OSCCAL = _READ_OSCCAL_DATA();
を挿入します。

OSCCAL値の工場設定値を消してしまったら・・・・・

OSCCALの工場設定値はPickit2があれば、メニューのTools ->OSCCAL -> Regenerateで簡単に再設定する事が可能です。(2009/10/17補足)無い場合は、こういう方法で調整する事も可能です

バンドギャップの件

その他の補足:



発振回路が予め内蔵されている比較的古いデバイスは、校正値をプログラムの最終番地に書き込んでいる物があります。16F627や16F88などのデバイスも内蔵発振回路ですが、これらは出荷時に最初から規定値で校正されているので、このようなデータが存在しません。

コア 代表デバイス OSCCALデータ格納場所、動作 アセンブラ
14ビット
ワンタイム
12C671(3FFh)
12C672(7FFh)
プログラム・メモリの最終番地にretlw命令で入っている
list p=12c671
include p12c671.inc
__config _INTRC_OSC_CLKOUT
org h’000’
clrwdt
call h’3FF’ ;12C671の場合
movwf OSCCAL
....
12ビット
ワンタイム
12C50x、12CE51x、16C505など キャリブレーション・データはプログラム・メモリの最終番地にmovlw命令で入っている。

プログラム・メモリの最終番地を実行後、プログラムカウンタはロール・オーバーして0番地を実行する。
list p=12c508
include p12c508.inc
__config _IntRC_OSC
org h’000‘
clrwdt
movwf OSCCAL
....
14ビット
フラッシュ
12F629
12F675
OSCCAL(90h 6bit left side)で使用するデータについては、プログラムメモリー領域の最終アドレス03FFhに書き込まれている。
OSCCAL以外にもconfigration bitのバンドギャップレジスターも関係する。
bsf   STATUS,RP0
call  h'3FF'
movwf  OSCCAL
bcf   STATUS,RP0

※HITECH PIC Cなら、
OSCCAL = _READ_OSCCAL_DATA();
を入れる事で対応

2004/5/29 (5/26より追記)


PIC移植のメモ

わたしの覚書として書き溜めていたものですが、ご紹介いたします。
基本的には、ADコンバータやコンパレータの内蔵のデバイスは、それらが最初に選択されている為、デジタルポートとして使用するには、その設定を行う必要がある。
メインのオシレータ入出力(TIMER1の部分を除く)は、初期値として選択されている。
ポート兼用になっているものは、オシレータのモード等を変更する必要がある。
RA4は、オープンドレインになっているのが殆どだが、16F819はトーテムポールである。
ポートの入出力について、シュミットトリガーであったり、無かったりする。厳密にシュミットトリガ入力が必要な場合はよく確認する。
ポートは、デバイスによって、あるピンは入力のみ、もしくは出力のみの対応の場合がある。

16F84Aの上位互換として発売されている16F627や16F628は、アドレスの割り当てがずいぶんと違う。16F62xは、むしろ16F87xに非常に近いアドレスやアーキテクチャーである。
(ためしに16F628のアセンブラを16F87xで行って通した物を16F628に書いてみてうまくいっている)

16F628,12F629
デジタルで使用する場合は、以下の設定も最初に行う。
CMCON=0x07;

16F628A
内部発振回路の4MHzにもう一つ32.768KHzが加わっている。


12F675
デジタルで使用する場合は、以下の設定も最初に行う。
CMCON=0x07;
ANSEL=0;
アドレスは同じであるが、名称が変わる
TRISA→TRISIO
PORTA→GPIO

16F819
注意するレジスタ
OSCCON
ADCON1
RB3に容量性の物を接続すると、デバイスがうまく動作しない事がある。(低電圧書込モードピンの誤動作)エラッタを参照のこと。

2003.12


2011/8/31 目次追加
2011/6/24 HI-TECH C for the PIC10/12/16 v9.82をインストールした後にMPLABが起動不良になる問題と解決方法
2011/1/15 HI-TECH C for the PIC10/12/16 v9.81で旧プロジェクトを使用する場合の互換設定
2010/08/09 PIC12F675,PIC12F629の内部発振モードで使用するBG、OSCCALの説明修正
2009/10/17 内容改定

(C)2003-2011 air variable All Rights Reserved..


ホーム