PIC10F322 ユーザIDを使ったデータ保持 その1
仕事でPIC10F322を使う事になったのでいろいろ機能を探っていたところ、どうやらユーザID(14ビット×4)であればEEPROM的な使い方が出来る事がわかったのでちょっとお試し。。。
元々PIC10FシリーズにはEEPROMが内蔵されておらず、カタログでも謳っていません。従って、電源オフ時のデータ保持は出来ないのですが、それを承知の上で PIC10F322を製品適用していました。
ところが、別の製品でも同じ基板が適用される事になったのですが、その製品の仕様をよくよく見てみると、電源スイッチがコンセント側でオンオフする様になっていて常時通電は不可。
電源オフでもデータ保管が必要であると言う事になりました。。。さて、どうするか。
と言う訳で、製品仕様の変更か別基板の採用を求めるつもりでもう一度PIC10F322のデータシートとにらめっこ。当然EEPROMの事は書かれていませんが、「フラッシュ プログラムメモリ制御」の項目がある事に気づきました。
よくよく見てみるとそこにはPIC24で見たような見たようなフラッシュを自己書き換えするプログラムの説明が長々と書かれています。PIC24でもデータ保持の為にフラッシュ領域をEEPROM代わりに使った事があり、いろいろ制約があって使いづらいものでした。PIC10F322でも同様で、やはり行単位での書き換えとなっていて、EEPROMの様な1バイト毎の扱いは不可、手軽にと言う訳には行かない様です。また、PIC10F322では領域を切り分けるためのレジスタがあり、512バイトしかないフラッシュの領域をたった2バイト分のデータ保持の為に分割する必要があり、それは余りに非効率。それならば、EEPROM搭載のマイコンに換えた方がマシです。また、目的のプログラムが入らない可能性があります。う~む。。。
と、半分諦めかけていたところ、データシートの続きに「ユーザID、デバイスID、コンフィグレーション ワードへのアクセス」という項目がある事に気付きました。
アドレス 動作 読み出しアクセス 書き込みアクセス
2000h-2003h ユーザID 可 可
2006h デバイスID/リビジョンID 不可 不可
2006h コンフィグレーションID 不可 不可
??ユーザIDって。。? 書き込みアクセスが可とある。。こ、これは!?
さらにユーザIDって何に使うのかデータシートを読み進めていたところ、特に何かに使われているというものではない様子。どうやらユーザIDはユーザが勝手に取り決めて良いコンフィグ見たいなものでプログラムの設定切り替え等に使って良い様です。
しかも、フラッシュの領域とは別に用意されていて、4バイト4ワード分のデータが電源を切っても保持可能、ちょっとした変数保持には十分です。
さっそく、試してみたところ、何の問題もなく読み書きできました。
(注1:後々問題が発生。イレースが必要なので詳細はその2を見て下さい。)
(注2:4バイト分とは14ビット×4の4ワードです。ご指摘を頂きました。)
レジスタ設定はこれだけ。
PMCON1bits.CFGS = 1;
ユーザIDに初期値を設定する場合は次の通り。
__IDLOC7(0,1,2,3);
※MPLABでの確認は、WINDOW → PIC Memory View → User ID Memoryでウインドウが開きます。
読み書きの関数は次の通り。以前作ったものと同じですが、上位アドレスを固定(0x20)にしています。
/*-----------------------------
void EEWrite(unsigned char adr, unsigned char data)
{
PMADRL = adr;
PMADRH = 0x20;
PMDAT = data;
PMCON1bits.WREN = 1;
di();//割り込み禁止
PMCON2 = 0x55;
PMCON2 = 0xAA;
PMCON1bits.WR = 1;
NOP();NOP();
do
{
PMCON1bits.WREN = 0;
} while (PMCON1bits.WR);
ei();//割り込み許可
}
unsigned int EERead(unsigned char adr)
{
PMADRL = adr;
PMADRH = 0x20;
di();//割り込み禁止
PMCON1bits.RD = 1;
NOP();NOP();
ei();//割り込み許可
return(PMDAT);
}
-----------------------------*/
~その2に続く。また、古風平凡さんのコメントもご参照下さい。~
元々PIC10FシリーズにはEEPROMが内蔵されておらず、カタログでも謳っていません。従って、電源オフ時のデータ保持は出来ないのですが、それを承知の上で PIC10F322を製品適用していました。
ところが、別の製品でも同じ基板が適用される事になったのですが、その製品の仕様をよくよく見てみると、電源スイッチがコンセント側でオンオフする様になっていて常時通電は不可。
電源オフでもデータ保管が必要であると言う事になりました。。。さて、どうするか。
と言う訳で、製品仕様の変更か別基板の採用を求めるつもりでもう一度PIC10F322のデータシートとにらめっこ。当然EEPROMの事は書かれていませんが、「フラッシュ プログラムメモリ制御」の項目がある事に気づきました。
よくよく見てみるとそこにはPIC24で見たような見たようなフラッシュを自己書き換えするプログラムの説明が長々と書かれています。PIC24でもデータ保持の為にフラッシュ領域をEEPROM代わりに使った事があり、いろいろ制約があって使いづらいものでした。PIC10F322でも同様で、やはり行単位での書き換えとなっていて、EEPROMの様な1バイト毎の扱いは不可、手軽にと言う訳には行かない様です。また、PIC10F322では領域を切り分けるためのレジスタがあり、512バイトしかないフラッシュの領域をたった2バイト分のデータ保持の為に分割する必要があり、それは余りに非効率。それならば、EEPROM搭載のマイコンに換えた方がマシです。また、目的のプログラムが入らない可能性があります。う~む。。。
と、半分諦めかけていたところ、データシートの続きに「ユーザID、デバイスID、コンフィグレーション ワードへのアクセス」という項目がある事に気付きました。
アドレス 動作 読み出しアクセス 書き込みアクセス
2000h-2003h ユーザID 可 可
2006h デバイスID/リビジョンID 不可 不可
2006h コンフィグレーションID 不可 不可
??ユーザIDって。。? 書き込みアクセスが可とある。。こ、これは!?
さらにユーザIDって何に使うのかデータシートを読み進めていたところ、特に何かに使われているというものではない様子。どうやらユーザIDはユーザが勝手に取り決めて良いコンフィグ見たいなものでプログラムの設定切り替え等に使って良い様です。
しかも、フラッシュの領域とは別に用意されていて、
さっそく、試してみたところ、何の問題もなく読み書きできました。
(注1:後々問題が発生。イレースが必要なので詳細はその2を見て下さい。)
(注2:4バイト分とは14ビット×4の4ワードです。ご指摘を頂きました。)
レジスタ設定はこれだけ。
PMCON1bits.CFGS = 1;
ユーザIDに初期値を設定する場合は次の通り。
__IDLOC7(0,1,2,3);
※MPLABでの確認は、WINDOW → PIC Memory View → User ID Memoryでウインドウが開きます。
読み書きの関数は次の通り。以前作ったものと同じですが、上位アドレスを固定(0x20)にしています。
/*-----------------------------
void EEWrite(unsigned char adr, unsigned char data)
{
PMADRL = adr;
PMADRH = 0x20;
PMDAT = data;
PMCON1bits.WREN = 1;
di();//割り込み禁止
PMCON2 = 0x55;
PMCON2 = 0xAA;
PMCON1bits.WR = 1;
NOP();NOP();
do
{
PMCON1bits.WREN = 0;
} while (PMCON1bits.WR);
ei();//割り込み許可
}
unsigned int EERead(unsigned char adr)
{
PMADRL = adr;
PMADRH = 0x20;
di();//割り込み禁止
PMCON1bits.RD = 1;
NOP();NOP();
ei();//割り込み許可
return(PMDAT);
}
-----------------------------*/
~その2に続く。また、古風平凡さんのコメントもご参照下さい。~
この記事へのコメント
データシートには、ユーザID 読込みサンプルしか
載っていませんので参考になりました。
ライトラッチを介さないで1ワードづつ書込む点が、
プログラムフラッシュへの書込みと違うので
試行錯誤しながらこの記事を見付けました。
今後、この記事を参考にされる方々のために気付いた点を
補足させて頂きます。
1.1度だけ書き込む場合は必要有りませんが
書き換える場合は、事前に消去する必要があります。
(データシート DS41585A-page 62 のサンプル参照)
2.「ユーザID(4バイト)」と記載されていますが、
正確には「4ワード(14bit×4)」で、
上位 6bit と、下位 8bit を使い分ければ
8個のデータの保管も可能です。
(上位は 6bit でも十分な用途に限られます)
3.「PMADRH = 0x20;」としていますが、
PMADRH は最下位の 1bitだけが有効なので
このままでも「0x20」の上位 7bitは無効なだけですが
「PMADRH = 0;」とします。
(データシート DS41585A-page 68 のサンプル参照)
4.初期値が必要なら、以下の記述で書込みできます。
(例) ORG 0x2000
DW 0x1234 ;Data1(6bit),Data2(8bit)
DW 0x3456 ;Data3(6bit),Data4(8bit)
DW 0x3FFF ;Dummy4(6bit),Dummy5(8bit)
DW 0x3FFF ;Dummy6(6bit),Dummy7(8bit)
以上です。 有難うございました。
書換え時の事前消去は次記事
https://cafe2p54.at.webry.info/201612/article_1.htmlに纏めてあるので、合わせてご利用下さい。(^_^;)