
お世話になります。
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;
}
No.1ベストアンサー
- 回答日時:
<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 …
ありがとうございます。
ご示唆をもとに、今までほとんど使っていなかったdebugモードを使用し、現在のプログラムでもEEPROMへの書き込みは成功しており、MPLABでの確認がうまくいっていなかったことがわかりました。
プログラムとPICの機能ばかり確認していてMPLABのマニュアルを確認していなかった(あとで再度確認します)・・・(ついでに、EEPROMに書き込んだデータを再度読み出してランプの点滅間隔を変えるプログラムを書いて確認しました)
ありがとうございました。
No.2
- 回答日時:
こんばんは。
書き込み手順自体は、そんなにおかしくないように思いますので、あてずっぽう的な推理になりますが、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以上空いていますが、ここは極力短い方がいいと思います。
以上です。
つたないプログラム(おまけにいろいろなところを繰り返し書き換えてかなりめちゃめちゃになったものを投稿に当たって何とか整理したもの・・・)をこまかいところまでご確認いただき、ありがとうございました。
結局、A1のとおり、プログラムには致命的な誤りはなく当方でのMPLABの使用方法が間違っていたことがわかりました。
プログラムの側のご指摘については参考にさせていただきます。
特にpullupはどこで勘違いしたかちゃんと確認しないと・・・。
ご検討いただき、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
C言語で途中までしか、プログラ...
-
アクセス[ファイルを開かずに、...
-
独立した複数のプログラムを統...
-
.NetのBackgroundWorkerクラス...
-
家電製品の電力周波数を変える機械
-
if ( a & b == b )
-
アプリケーションが終了するま...
-
C言語プログラミングで、多項式...
-
C#で通信処理。応答がない場合...
-
実行時のコマンドプロンプトを...
-
マルチスレッドのスレッド数を...
-
PIC mainループについて
-
VBA:CSVファイルの読出し手法...
-
bmp → jpeg への変換
-
.sb3のファイルを.sb2に変換す...
-
常駐するアプリケーションを初...
-
スレッドがサスペンドされてい...
-
InvalidateRectがうまくいかない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
パソコンの演算速度について
-
RPG パラメーターについて
-
sendkeysにてALT+CTRL+INSERTを...
-
VBAで外部プログラムを非表示で...
-
C言語で途中までしか、プログラ...
-
並列計算をしたときのシステム...
-
VB上で実行中の無限ループの止め方
-
MACで動く実行ファイルをWindow...
-
vba GetAsyncKeyState関数について
-
C言語でフォルダを開く
-
システム資源とは?
-
アクセス[ファイルを開かずに、...
-
他の実行ファイルを実行するプ...
-
ExcelのVBAでX=0〜1の定積分を...
-
実行時エラー429
-
clock関数は正確じゃないの?
-
sleep()関数について
-
プログラムの再起動
おすすめ情報