• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PIC・eepromとPIN設定について)

PIC・eepromとPIN設定について

このQ&Aのポイント
  • PICのプログラムについてとPIN設定についての質問です。
  • シリアル通信のプログラムで、eepromに書き込んだ後に書き込みの確認をする方法を知りたいです。
  • また、PICのPIN設定でRA3~5の設定方法が分からないです。外付けの振動子とリセットICがついているので、どうSETすればいいのか教えて欲しいです。

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

  • ベストアンサー
  • rnakamra
  • ベストアンサー率59% (761/1282)
回答No.3

#2のものです。 eepromへの書込みを同時に行うことは出来なかったと思います。 CCS-Cで3回書込みを行うと(割り込み無の場合) 1回書込み→終了までwait→1回書込み→終了までwait→1回書込み→終了までwait と振舞います。書込み終了までかなり長い時間がかかりますがその間書込みの終了まで何もしません。(終了チェックのループを延々と繰り返す) これはADCを使用する場合でも同様で、はっきり言って時間の無駄です。 割り込みを使わず、EEPROMへの書込みと他の作業を同時に進めたい場合はインラインアセンブラを使用するぐらいしか方法がありません。 そのため、時間の無駄を省くには割り込みを使い処理することになりますが、この場合でも同時に複数のアドレスへの書込みは出来ないので、割り込み時の処理で対処することになります。 今回の場合、先ず書き込み先のアドレスをグローバル変数に記録し、割り込みを有効にしてから書込みを行います。 address_eeprom=0; enable_interrupts(INT_EEPROM); enable_interrupts(global); write_eeprom(address_eeprom,val[address_eeprom]); 割り込み処理で #int_eeprom void int_ee(void) { switch(address_eeprom) { 0: 1:address_eeprom++; write_eeprom(address_eeprom,val[address_eeprom]); break; 2:disable_interrupts(int_eeprom); (この後は書込みの確認と表示のプログラム) } } とでもすればよいでしょう。

B_Alice_s
質問者

お礼

再度ありがとうございます。 回答を見る前に、色々変更がありまして、今のところ関数として int Write_ee(char c1,char c2,long i){ if(c1=='A'&&c2=='I'){ WRITE_EEPROM(0,i>>8&0xFF); //上位8ビット書き込み WRITE_EEPROM(1,i&0xFF); //下位8ビット書き込み }else if(c1=='B'&&c2=='I'){ WRITE_EEPROM(2,i>>8&0xFF); //上位8ビット書き込み WRITE_EEPROM(3,i&0xFF); //下位8ビット書き込み }else if(c1=='C'&&c2=='A'){ if(i<100) WRITE_EEPROM(4,i); }else if(c1=='D'&&c2=='R'){ if(i<20) WRITE_EEPROM(5,i); }else if(c1=='E'&&c2=='W'){ if(1<10) WRITE_EEPROM(6,i); }else return 10; return 1; } という形になっています。 このWRITE_EEPROM(add,val)の後それぞれに、 書き込みが okだったら...puts("書いたよ"); ダメだったら...puts("ダメだよ"); 的なことを入れたいのですが、提示して頂いたコードでそれが出来るということでしょうか? 何を割り込むとか、割り込みがいまいちわからなくて、理解できずにいます;もうしわけありません;

その他の回答 (2)

  • rnakamra
  • ベストアンサー率59% (761/1282)
回答No.2

1)EEPROMの内蔵のものにはEEPROM書込み完了時に割り込みを発生できる機能が付いています。その割り込みの処理で内容のチェックと表示を行うようにすれば良いと思います。 2)この場合は入力にしておくのが無難だと思います。 コンフィギュレーションビットが優先されるはずですので問題は無いはずなのですが。

B_Alice_s
質問者

お礼

回答ありがとうございます。 1)enable_interrupts(INT_EEPROM);というものが割り込みと考えていいのでしょうか? WRITE_EEPROM(0,val[0]); WRITE_EEPROM(1,val[1]); WRITE_EEPROM(2,val[2]); とした場合、一回ずつで割り込みが発生するという考えでよいのでしょうか?出来れば、三回目が書き込み終わった後に「書き込んだよ」というフラグ?がほしいのですが・・・ 2)入力にしておけば大丈夫なのですね。 コンフィギュ…?わからないので調べてみます。 まだまだ理解が足りないと痛感しました。もっと勉強します。

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

デバイスの型番・開発環境が不明ですので、詳細を調べることができません。 以下、PICを扱う場合での概要です。 1) C言語でもアセンブラと同様に「レジスタにアサインされたフラグを監視する」ことでポーリングによる処理の完了を知ることができます。 コンパイラ(ツールチェーン)が不明ですが、提供されている該当デバイスのヘッダファイルに、ビットフィールドの定義などが記載されている場合も多く、構造体のメンバ参照として簡易に記述が可能です。 2) PICのPINの多くは複数のモジュールによって共用されていることがほとんどです。PowerOnReset後のデフォルト設定からデジタル入出力として利用する為に、不要なモジュールの首を絞める必要が多くあります。特に引っかかりやすいのがA/D入力やPSPとの共用ピンあたりでしょうか。PICのデバイスは種類が多く、PIN名を書かれても型番が分からない限り何との共用PINか調べることができません。 OSC系のPINについてはアセンブラやC言語による機能のプログラミングではなく、コンフィギュレーションを設定する為の擬似命令や開発環境からの設定が必要なのではないでしょうか? 答えはすべてMicrochip提供のデータシートに書いてありますので、熟読するのが近道だと思います。

B_Alice_s
質問者

お礼

回答ありがとうございます。 1)について、ヘッダファイルを見てみたところ、割り込みに(enable/disable_interrupts();)といものがありました。 調べてみましたがが、使い方がいまいちわかりません; 2)picは「16f687」で、ccsc社のcコンパイラを使っています。 今までは16f877aで、PINは共用してなかったので戸惑いました。 データシートもみてみたのですが、翻訳してもさっぱりでした; レジスタがどうのというのがよく理解できません; >OSC系のPIN~ これも何のことやらです… せっかく答えてくださったのに、理解が足らず申し訳ありません。

関連するQ&A