プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
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;

}

A 回答 (2件)

<Read EEPROM> コマンドを実行していますか? pic_eeprom -> MPLAB


また出力されたアセンブルリストを確認してみては

http://sdr-de-bcl.blog.so-net.ne.jp/2010-03-27
http://sfukuda.at.webry.info/201112/article_10.h …

参考URL:http://www.robotsfx.com/robot/robohow/RoboHow106 …
    • good
    • 0
この回答へのお礼

ありがとうございます。
ご示唆をもとに、今までほとんど使っていなかったdebugモードを使用し、現在のプログラムでもEEPROMへの書き込みは成功しており、MPLABでの確認がうまくいっていなかったことがわかりました。
プログラムとPICの機能ばかり確認していてMPLABのマニュアルを確認していなかった(あとで再度確認します)・・・(ついでに、EEPROMに書き込んだデータを再度読み出してランプの点滅間隔を変えるプログラムを書いて確認しました)
ありがとうございました。

お礼日時:2013/01/29 22:39

こんばんは。


書き込み手順自体は、そんなにおかしくないように思いますので、あてずっぽう的な推理になりますが、2つ気になる点があります。

1. 18行目くらい

 while( WR = 1 ) {

これは何が起こるのか予想がつきませんが、恐らく意図したようには動かないでしょう。

2. 25~29行目くらい
WEN=1 ~ WR=1までのくだりは、アセンブラレベルで書けるインストラクションが決まっています(データシートで言う、"special five instruction")。
コンパイラがどんなコードを吐き出しているのか、確認されてはどうでしょう。
例えば、EECON2に値を書き込む際、バンク切り替えコードが挟まれていないかとか。

あと、関係ないところでさらに3点ほど気になる所があります。

3. 9行目くらい
コメントに"output pullup"とありますが、内蔵プルアップは入力ポートにしか効かなかったような気がします。

4. 33行目くらい
割り込みを使っておられないようなので、GIEに1を書く必要は無いかと思います。

5. 34行目くらい
テスト用コードだからだとは思いますが、WRENがセットされてからクリアされるまで100ms以上空いていますが、ここは極力短い方がいいと思います。

以上です。
    • good
    • 0
この回答へのお礼

つたないプログラム(おまけにいろいろなところを繰り返し書き換えてかなりめちゃめちゃになったものを投稿に当たって何とか整理したもの・・・)をこまかいところまでご確認いただき、ありがとうございました。
結局、A1のとおり、プログラムには致命的な誤りはなく当方でのMPLABの使用方法が間違っていたことがわかりました。
プログラムの側のご指摘については参考にさせていただきます。
特にpullupはどこで勘違いしたかちゃんと確認しないと・・・。
ご検討いただき、ありがとうございました。

お礼日時:2013/01/29 22:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!