PICのEEPROMのデータが壊れてしまう可能性とは?

このQ&Aのポイント
  • PICのEEPROMにデータを書き込んでいる際に、電源のON/OFFを繰り返すとデータが妙な値に書き換わることがあります。
  • この問題は製品の個体差があり、不具合の出ない個体も存在します。
  • 製品Aではアドレスaが書き換わってしまい、製品Bではアドレスbのデータが不正な値になることがあります。
回答を見る
  • ベストアンサー

PICのEEPROMのデータが壊れてしまうことが…

PICのEEPROMのデータが壊れてしまうことがあります PICのEEPROMにデータを書き込み、電源のON/OFFを繰り返しているとデータが妙な値に書き換わってしまうことがあります。 弊社の製品でこのような問題が発生していますが、製品の個体差がはっきりあり、不具合の出ない個体もあります。 製品Aではアドレスaが書き換わってしまうのに、製品Bではアドレスbのデータが電源ON/OFFで不正な値(決まった値)になってしまいます。 どのような原因が考えられるでしょうか。お詳しい方がおられましたら、アドバイスを頂けるとありがたいです。よろしくお願いします。

noname#230358
noname#230358

質問者が選んだベストアンサー

  • ベストアンサー
noname#230359
noname#230359
回答No.3

10中8、9はリセット回路がうまく行っていないと思います。 簡単なコンデンサに抵抗噛ませただけの回路の なんちゃってリセットとかで良くある話 リセット用ICなどを使うようにしましょう。 あとはリセット後にすぐEEPROMを書きに行くような 起動回数カウンタとかのアプリケーションを 何の工夫もなく書くとありがちかなあ。 PICのEEPROMが化けるのは何らかの原因で 間違えたタイミングでEEPROM書き込みルーチンを実行しているからです。 解析の基本はEEPROM書き込みルーチン内にデバッグコードを仕込むことです。   もしかすると茶色な動作の関係かも知れんし 追加情報がないとなんとも言えないような感じですね。  

noname#230358
質問者

お礼

tigers様 ご回答ありがとうございます。リセットで単純な抵抗+コンデンサだけで構成していましたが、リセットICを使用してうまくいっているという情報がありました。リセットが重要な可能性がありそうです。頂いた回答を参考にしたいと思います。ありがとうございました。

その他の回答 (5)

noname#230359
noname#230359
回答No.6

EEPROMのデータ化けは、単体のデバイスでは信号を追えたので、原因が分かった事は有るけれど、PICの様なワンチップCPUでは内部がのぞけないので、もっと詳細な情報が無いと誰も答えられない。

noname#230358
質問者

お礼

その辺の高周波 様 詳細な情報がないと誰も答えられない→ご指摘の通りです。確認した限りでは電源のオーバーシュートやアンダーシュートもなく、特にOFF時の不安定な電圧値での電源の残りなどもありませんでした。ただ、別の方から頂いたアドバイスでリセットを見直すと不具合が発生しなくなりましたので、そちらの観点から検証を進めていきたいと思います。ご回答ありがとうございました。

noname#230359
noname#230359
回答No.5

プログラムを書き込んで製品に組み込んだ後での話ですよね。 データ領域に不正に書き込まれると言うことでしょうか。 電源投入時の電圧の立ち上がりをオシロで確認して 順序やノイズをチェックしましたか? 非常に珍しい条件ですが データを書き込むポートが 電源投入時に条件が揃ってその時の状態に合わせた データを書き込んだりしていませんか? もし、データ領域なら起動後に一定のデータを書き込ますことで 避けることも出来るかも知れませんが そう言った使い方が出来る状況では無いんでしょうねきっと

noname#230358
質問者

お礼

plus 様 ご回答頂き、ありがとうございました。データ領域に起動後に一定のデータを書き込ますという手法もあるのですね。確認してみたいと思います。頂いた回答は参考にさせていただきます。ありがとうございました。

noname#230359
noname#230359
回答No.4

このスレッドに対する回答ではありませんが、気になったので以前のご質問     No.44263 このような機器にPSEマークは必要ですか? に対して書き込ませていただきます。   PSEとは、電気用品安全法及びそれに基づく表示を表します。 電気用品安全法の全貌は、かなり複雑なのでこの回答欄で正確に記述する ことは困難です。多少不正確であることをお含み頂いて、電気用品安全法 の対象になる品物を記述すれば次の通りです。 (1)次のURLの電気用品安全法施行規則に規定されている品物だけが対象 であって、その他の品物は規制を受けません。 http://law.e-gov.go.jp/cgi-bin/idxselect.cgi?IDX_OPT=1&H_NAME=%93%64%8b%43%97%70%95%69%88%c0%91%53%96%40&H_NAME_YOMI=%82%a0&H_NO_GENGO=H&H_NO_YEAR=&H_NO_TYPE=2&H_NO_NO=&H_FILE_NAME=S37F03801000084&H_RYAKU=1&H_CTG=1&H_YOMI_GUN=1&H_CTG_GUN=1 (2)大づかみに言えば、定格電圧が100V以上300V以下及び定格周波数が50Hz 又は60Hzのもので、交流電路に使用する電気機械器具が対象です。直流を 供給されて動作する電気機械器具は、僅かな例外を除き非対象です。 お問い合わせの製品は、電気用品安全法の対象ではなく、PSEマークを表示 する必要は無い・・・・表示してはいけない・・・・と思います。 電気用品安全法の行政窓口又は認証機関に問い合わせれば、同様の回答が ある筈ですので、(1)さんの回答に従えば、問題を起こさずに済むと思いま すが、少々不正確と思いましたのでこの場を借用させていただきました。

参考URL:
http://www.meti.go.jp/policy/consumer/seian/denan/ http://www.meti.go.jp/policy/consumer/seian/denan/tetsuduki_annai/gui
noname#230358
質問者

お礼

ohkawa 様 ご回答頂き、ありがとうございます。PSEの全貌は複雑ということですが、弊社でもベテラン数人に確認したところ、結構認識の違い等があり、おっしゃられたとおり、PSEの複雑さを実感しました。しっかり勉強してみようと思います。 頂いた回答はご参考にさせていただきます。ありがとうございました。

noname#230359
noname#230359
回答No.2

基本的な内容ですが、貴殿又は貴社のAC電源の電圧又は電流の変化は規定内値でしょうか? ある処でCADの仕事をしていた時に、小生のCADがタイマー設定での自動保存がスタートしました。 その瞬間に、同じコンセントからの電源を取っている隣人がCAD電源とLCD電源を2個リズムよく ポン!ポン!ポン!と落としたら、CADがエラー表示して落ちました。 多分、それと同じで、AC電源の電圧又は電流の変化が規定外値となったか、それ等によって ノイズが発生し悪さをしたかです。 多分、後者の方だと思いますから、費用をかけない場合は、PICのEEPROMにデータを 書き込み中には電源のON/OFFを繰り返さないようにするしかないでしょう。 費用をかける場合は、専用の電源ケーブルを通すですかね。

noname#230358
質問者

お礼

後(ご)の先(せん)、アフターユー 様 ご回答ありがとうございます。書き込み中には電源のON/OFFはしておらず、電圧等は特に問題なさそうでした。別に何か要因がありそうです。頂いた回答は参考にさせていただきます。ありがとうございました。

noname#230359
noname#230359
回答No.1

具体的なハード、ソフトがわからないと正確なことは言えませんが 書き込み途中で電源が落ちるというようなことはないでしょうか? 書き込んだ後、書き込み禁止にしていますか? もし、書き込み途中で電源が落ちるような場合、ハードで対策をとるか ソフトで電源が落ちていることをあらかじめポートで入力をして CPUの電源は処理が終わるまでの間、コンデンサなどで 保つようにするなどの方法があります。 そのほかにはデータの二重化、チェックサムによるデータ検証 で、どちらのデータが正解かを判断する方法もあります。

noname#230358
質問者

お礼

志国様 ご回答頂き、ありがとうございます。確認してみたところ電源電圧は書き込み中にキープできてはいました。別の要因の可能性があります。頂いた回答は参考にさせていただきます。ありがとうございました。

関連するQ&A

  • PIC EEPROM

    PICでLEDのデータをEEPROMに書き込んで電源を切ってもデータを保存させ、再度電源オンの時は電源を切る前のデータで点滅させたいのですが、EEPROMって書き込みと読み出しってありますよね?  この場合は、LEDデータの書き込みのみで大丈夫でしょうか?

  • PIC のデータEEPROMに書き込みができません

    お世話になります。 PICのデータEEPROMへの初歩的な書き込みができずに悩んでいます。 ご経験のある方、私の誤りについてご教示いただければありがたく思います。 PICについてはいくつかの種類でプログラムを書いていますがEEPROMのデータ領域は初めてです。 各種のサイトでは簡単らしいのですが・・・ 当方の試験作業は次のとおりです。 対象チップ PIC16F819 パソコン Windows-XP 書き込み装置 PIC-kit3 書き込みソフト MP-LAB IDE V8.83 プログラム言語 HI-TECH C V9.83 電源 Pic-Kit3から5Vで供給 確認方法 ・MP-LAB- View- EEPROM- のFillmemoryにより、EEPROMにすべてFFH/00Hのいずれもが書き込めることを確認の上、256バイトすべてにFFH ・下記プログラムを走らせる (実行後1秒後に1回書き込み(十進15番地に十進20の例)、以降ランプの点滅。ランプの状態でひとまずの動作の正常は確認) ・MP-LAB- View- EEPROM- により確認・・(全部FFHのまま(泣)) そのほか、チップを新品に交換したり、書き込み時間をEEIFで検査するアルゴリズムにしてみたり、いろいろやってみましたが、壁にぶつかっています。 よろしくお願いいたします。 #include<htc.h> #ifndef _XTAL_FREQ #define _XTAL_FREQ 4000000 #endif __CONFIG(CP_OFF & BOREN_OFF & MCLRE_OFF & PWRTE_ON & LVP_OFF & WDTE_OFF & FOSC_INTOSCIO & DEBUG_OFF & CPD_OFF); void main() { OPTION_REG = 0b00000000; // output pullup OSCCON = 0b01100100; // internal OSC 4MHz TRISA = 0b11111110; // GP-A input RA7=output ADCON1 = 0b10000111; // No AD all digital TRISB = 0b00000000; // GP-B output INTCON = 0b00000000; // no interrupt RB1 = 0;    //Green Lamp off RB3 = 0; //Red Lamp off while (WR = 1) { __delay_ms(1000); } EEADR = 15; EEDATA = 20; EEPGD = 0; GIE = 0; WREN = 1; EECON2 = 0x55; EECON2 = 0xaa; WR = 1;      RB1 = 1; // Green Lamp __delay_ms(100);      RB1 = 0;     GIE = 1;  WREN = 0; EWWW:; // IDLE Lamp Red RB3 = 1; __delay_ms(400); RB3 = 0; __delay_ms(500); goto EWWW; }

  • PICマイコン16F84AのEEPROMについて

    EEPROMっていうのは電源を切ってもデータを保存できるんですよね? PICマイコン16F84AのEEPROMの使い方を分かりやすく、丁寧に教えて下さい。初心者なので・・・。 参考になるHPを教えてくださっても結構です。

  • PIC16F1827のEEPROMへの書込み

    PCM V5.0(PIC用CCS社コンパイラ)を Mplab8.92に組込み、PICkit3を使ってプログラムしています。 PIC16F1827のEEPROMへの書込みがうまくいきません。 RAは入力ポートで固定してあります。 RBは出力ポートでLEDが接続してあります。 テストプログラムは一回のみの動作です。 実機で動作させると RAは固定してあるので当然(4)でLEDが点灯しますが、 実機からCPUを抜き取りMplab上でReadすると EEPROMのアドレス0,1,2は異なるデータであり 動作させるたびに違うデータが書込まれています。 しかし (1) a0=35h (2) a1=a6h (3) a2=93h と定数にすると EEPROMのアドレス0,1,2は正しいデータが 書込まれています。 Q1. a0,a1,a2をポート入力とする場合は CPU自体に何か設定する必要があるのでしょうか? それともプログラムに工夫が必要なのでしょうか? いままで使っていたPIC16F88では このようなことはなかったと思うのですが・・・。 ----- テストプログラム ----- a0 = RA; //(1) write_eeprom (0,a0); a1 = RA; //(2) write_eeprom (1,a1); a2 = RA; //(3) write_eeprom (2,a2); if (a0 == a1 && a1==a2) //(4) RB =255; else RB =0;

  • EEPROMについて

    PIC16F877とEEPROM(24LC256)を使って、LCDモジュール(SG12864A)に、文字、絵を表示したいのですが、EEPROMの使い方が全くわかりません。 EEPROMにデータを入れるにはどうすればよいのでしょうか?分かる方、教えてください!

  • EEPROMのデータ化けについて

    扱っている製品にてデータが変わっていることが発生しています。 原因が特定できていません。 原因を究明できるヒントを教えてください。 今現在考えられているのが 1.電源電圧(EEPROMへの)が低いため、不安定な波形になってしまいデータが変わる。 2.ノイズによりデータが変わる。 3.EEPROMから電荷が抜けてしまい、データが変わってしまう。 ハード・ソフトの調査が必要かと思い、波形はとる予定です。

  • MplabのRead_EEPROM

    Mplab8.92+PICkit3でPICのプログラムをしています。 ポート入力をPIC内蔵のEEPROMに書込むようなプログラムを作り ターゲットボード上で動作させた後、PICをボードから抜き取り Mplab上でReadしViewメニューのEEPROMで見ると ポートの入力とは異なる値になっています。 (ボードの入力はプルアップした上で固定してあります。) しかし、A社のプログラマーでReadすると ポート入力がEEPROMに正しく書込まれています。 (A社のプログラマーはサポートのデバイスが少ないので 現実的には使えないのですが。) 色々試してみると プログラムとして、「PIC内蔵EEPROMデータメモリに初期値として書込んだデータ」は 正しく、書込み、読取できましたが ボード上で動作しないと確定しないようなデータ (ポートの入力、カウント回数・・・等) は、正しく書込まれている (プログラムの動作から確認すると) けれどもMplab上のReadでは正しく表示されませんでした。 MplabのReadとはこういうものなのでしょうか? (私の推測ではMplabのRead-View-EEPROMはCPUを実機で 動作させることなくパソコン上でシュミレーションするための もののように思えてきたのですが・・・) それとも、何か設定すれば可能になるならば 教えてください。 私の場合Mplabを使う場合 シュミレーションとかは使いません。 コンパイルしてCPUに書込み(Program)するだけです。

  • AVRマイコンの内部EEPROMの値について

    AVRマイコンの内部EEPROMの値について AVRマイコンにて、デバイスシャットダウン時にあるデータを内部EEPROMに保存し、起動時にその前回保存したデータを読み込むという制御を考えています。 ここで質問ですが、初めてプログラムを焼いたデバイスに電源を投入した場合に、内部EEPROMに入っている値を読み込んだ場合、その値は不定値なのでしょうか? それとも決められた値なのでしょうか? ソースの対処はどのようにすればよろしいでしょうか? ご教授下さい。 よろしくお願い致します。

  • AVR studio6でeepromリードできない

    AVR studio6.1の環境をPCに入れてATmega88のプログラムを行っています。ATmega88に電源を投入直後に初期設定のために、あらかじめeeprom内に設定しているプリセット値を読み込むためにeeprom_read_byte関数を使用してデータを読み出したいと思っています。 テストとしてeepromの0x00番地のデータを読み出そうとしているのですが、データを読み出すことができず困っています。 volatile u8 test01; volatile u8 test02; volatile u8 test03; volatile u8 test04; volatile int addr; addr = 0x00; eeprom_busy_wait(); test01 = eeprom_read_byte(&addr); addr = 0x01; eeprom_busy_wait(); test02 = eeprom_read_byte(&addr); addr = 0x02; eeprom_busy_wait(); test03 = eeprom_read_byte(&addr); addr = 0x03; eeprom_busy_wait(); test04 = eeprom_read_byte(&addr); このようなプログラムを組んでAVR Studio6.1のシミュレーションモードで、eepromのアドレス0x00番地から順に0x00,0x01,0x02,0x03,0x04・・・・  このように設定してみたのですが、 実際にシミュレーションしてみるとeeprom_read_byteの戻り値に代入されたtest01,test02,test03,test04には0x00という値が代入されeeprom内からのデータの読み出しに失敗しているようです。 eepromデータの取り扱いに関するプログラムの書き方などご教示頂きますよう、お願い致します。

  • PICマイコンで変数値の保持

    PICマイコンで変数値の保持 PICマイコンでリセット時にリセット前の変数の値を1,2個保持して リセット後に用いたいのですが、なにかいい方法はありませんか? EEPROMは搭載してません。 また外部接続のパーツを増やさないのが望ましいです。 データ領域をうまく使う方法がありますかね? PIC24FJ32GA002です。 開発環境はMPLAB v8.35 C30コンパイラー です。 よろしくお願いします。