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

目をとめて頂き、ありがとうございます。
さっそくですが、PICのプログラムについてとPIN設定について解らないところがありましたので、質問させていただきます。

1)シリアル通信のプログラムです。
eeprom内蔵のPICを使っているのですが、eepromに書き込んだ後に(画面に)「無事に書きこみましたよ」的な表示をさせたいのですが、ちゃんと書き込まれたかどうかがわからなくて…
アセンブリでやると、レジスタのフラグ(?)をみて判断しているっぽいのですが、生憎とアセンブリはさっぱり分かりません。
c言語でもわかる方法はないものでしょうか?

2)PIN設定です。
RA5(OSC1)-->外付けで振動子つけてます
RA4(OSC2)-->RA5と同じです
RA3(MCLR/VPP)-->リセットICつけてます
RA2(I/O)-->input設定
RA1(I/O)-->input設定
RA0(I/O)-->output設定
という設定のPICで、RA0~2は普通にI/OとしてSET_TRISできるのですが、RA3~5をどうSETしたらいいのかが分かりません。
普通のI/Oとしては使わないけど、外付けで振動子とICがついているので普通にI/OでSETしていいのか…

以上2点ですが、わかる方がいらっしゃいましたらよろしくお願いします。

A 回答 (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);
(この後は書込みの確認と表示のプログラム)
}
}

とでもすればよいでしょう。
    • good
    • 0
この回答へのお礼

再度ありがとうございます。
回答を見る前に、色々変更がありまして、今のところ関数として

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("ダメだよ");
的なことを入れたいのですが、提示して頂いたコードでそれが出来るということでしょうか?
何を割り込むとか、割り込みがいまいちわからなくて、理解できずにいます;もうしわけありません;

お礼日時:2009/05/29 18:53

1)EEPROMの内蔵のものにはEEPROM書込み完了時に割り込みを発生できる機能が付いています。

その割り込みの処理で内容のチェックと表示を行うようにすれば良いと思います。

2)この場合は入力にしておくのが無難だと思います。
コンフィギュレーションビットが優先されるはずですので問題は無いはずなのですが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

1)enable_interrupts(INT_EEPROM);というものが割り込みと考えていいのでしょうか?
WRITE_EEPROM(0,val[0]);
WRITE_EEPROM(1,val[1]);
WRITE_EEPROM(2,val[2]);
とした場合、一回ずつで割り込みが発生するという考えでよいのでしょうか?出来れば、三回目が書き込み終わった後に「書き込んだよ」というフラグ?がほしいのですが・・・

2)入力にしておけば大丈夫なのですね。
コンフィギュ…?わからないので調べてみます。

まだまだ理解が足りないと痛感しました。もっと勉強します。

お礼日時:2009/05/28 19:57

デバイスの型番・開発環境が不明ですので、詳細を調べることができません。



以下、PICを扱う場合での概要です。
1) C言語でもアセンブラと同様に「レジスタにアサインされたフラグを監視する」ことでポーリングによる処理の完了を知ることができます。
コンパイラ(ツールチェーン)が不明ですが、提供されている該当デバイスのヘッダファイルに、ビットフィールドの定義などが記載されている場合も多く、構造体のメンバ参照として簡易に記述が可能です。

2) PICのPINの多くは複数のモジュールによって共用されていることがほとんどです。PowerOnReset後のデフォルト設定からデジタル入出力として利用する為に、不要なモジュールの首を絞める必要が多くあります。特に引っかかりやすいのがA/D入力やPSPとの共用ピンあたりでしょうか。PICのデバイスは種類が多く、PIN名を書かれても型番が分からない限り何との共用PINか調べることができません。

OSC系のPINについてはアセンブラやC言語による機能のプログラミングではなく、コンフィギュレーションを設定する為の擬似命令や開発環境からの設定が必要なのではないでしょうか?

答えはすべてMicrochip提供のデータシートに書いてありますので、熟読するのが近道だと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。


1)について、ヘッダファイルを見てみたところ、割り込みに(enable/disable_interrupts();)といものがありました。
調べてみましたがが、使い方がいまいちわかりません;

2)picは「16f687」で、ccsc社のcコンパイラを使っています。
今までは16f877aで、PINは共用してなかったので戸惑いました。

データシートもみてみたのですが、翻訳してもさっぱりでした;
レジスタがどうのというのがよく理解できません;

>OSC系のPIN~
これも何のことやらです…

せっかく答えてくださったのに、理解が足らず申し訳ありません。

お礼日時:2009/05/28 19:50

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