目をとめて頂き、ありがとうございます。
さっそくですが、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点ですが、わかる方がいらっしゃいましたらよろしくお願いします。
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);
(この後は書込みの確認と表示のプログラム)
}
}
とでもすればよいでしょう。
再度ありがとうございます。
回答を見る前に、色々変更がありまして、今のところ関数として
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("ダメだよ");
的なことを入れたいのですが、提示して頂いたコードでそれが出来るということでしょうか?
何を割り込むとか、割り込みがいまいちわからなくて、理解できずにいます;もうしわけありません;
No.2
- 回答日時:
1)EEPROMの内蔵のものにはEEPROM書込み完了時に割り込みを発生できる機能が付いています。
その割り込みの処理で内容のチェックと表示を行うようにすれば良いと思います。2)この場合は入力にしておくのが無難だと思います。
コンフィギュレーションビットが優先されるはずですので問題は無いはずなのですが。
回答ありがとうございます。
1)enable_interrupts(INT_EEPROM);というものが割り込みと考えていいのでしょうか?
WRITE_EEPROM(0,val[0]);
WRITE_EEPROM(1,val[1]);
WRITE_EEPROM(2,val[2]);
とした場合、一回ずつで割り込みが発生するという考えでよいのでしょうか?出来れば、三回目が書き込み終わった後に「書き込んだよ」というフラグ?がほしいのですが・・・
2)入力にしておけば大丈夫なのですね。
コンフィギュ…?わからないので調べてみます。
まだまだ理解が足りないと痛感しました。もっと勉強します。
No.1
- 回答日時:
デバイスの型番・開発環境が不明ですので、詳細を調べることができません。
以下、PICを扱う場合での概要です。
1) C言語でもアセンブラと同様に「レジスタにアサインされたフラグを監視する」ことでポーリングによる処理の完了を知ることができます。
コンパイラ(ツールチェーン)が不明ですが、提供されている該当デバイスのヘッダファイルに、ビットフィールドの定義などが記載されている場合も多く、構造体のメンバ参照として簡易に記述が可能です。
2) PICのPINの多くは複数のモジュールによって共用されていることがほとんどです。PowerOnReset後のデフォルト設定からデジタル入出力として利用する為に、不要なモジュールの首を絞める必要が多くあります。特に引っかかりやすいのがA/D入力やPSPとの共用ピンあたりでしょうか。PICのデバイスは種類が多く、PIN名を書かれても型番が分からない限り何との共用PINか調べることができません。
OSC系のPINについてはアセンブラやC言語による機能のプログラミングではなく、コンフィギュレーションを設定する為の擬似命令や開発環境からの設定が必要なのではないでしょうか?
答えはすべてMicrochip提供のデータシートに書いてありますので、熟読するのが近道だと思います。
回答ありがとうございます。
1)について、ヘッダファイルを見てみたところ、割り込みに(enable/disable_interrupts();)といものがありました。
調べてみましたがが、使い方がいまいちわかりません;
2)picは「16f687」で、ccsc社のcコンパイラを使っています。
今までは16f877aで、PINは共用してなかったので戸惑いました。
データシートもみてみたのですが、翻訳してもさっぱりでした;
レジスタがどうのというのがよく理解できません;
>OSC系のPIN~
これも何のことやらです…
せっかく答えてくださったのに、理解が足らず申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- 日本語 用言の活用組織はいかにして生成したか:或る試論 1 2022/06/30 05:41
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- マウス・キーボード キーボード Oキーを押すとプルダウンメニューが出る 4 2022/09/08 14:48
- フリーソフト libreoffice drawのツールバーのチェックが外れてしまう 1 2022/10/04 22:02
- 物理学 xy平面上を運動する物体Aがある。この物体の時刻tにおける位置ベクトルra(t)がra(t)=p + 2 2022/05/22 14:00
- JavaScript Google reCAPTCHAについて 1 2023/02/22 14:37
- Visual Basic(VBA) vbaで条件付き書式を設定したときの適用範囲について 1 2023/07/17 23:14
- 物理学 物理学、剛体力学でわからないところがあります。 質量m長さlの細い剛体棒、一端をOを通るなめらかな水 5 2023/02/14 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pic 複数の割り込み関数 切り分...
-
PICでのプログラムによるチャタ...
-
Excelでタイマーの一時停止する...
-
raspberry pi の 割り込み原因...
-
スーパーのレジで並んでいたら...
-
一定時間操作がなかったら、と...
-
PICマイコン 割り込み実行時間...
-
プリントスクリーンの自動化
-
VB.net 割り込みの禁止
-
マイコン C言語 割り込み処理...
-
インバウンドで迷惑している人...
-
H8/3052F/IRQを使った割り込み
-
電車で待機列の割り込みについ...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
緯度、経度の 10進法と 60進法...
-
C言語で、メモリを解放しないで...
-
TCP/IP通信時のサーバーからの受信
-
バックグラウンドのプロセスの...
-
プログラミング ソースコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの処理量を減らすコーデ...
-
pic 複数の割り込み関数 切り分...
-
【組込み】割り込み中のstatic...
-
USJでの割り込み
-
CPU負荷率の安全な上限と計...
-
ウォッチドッグタイマ(WDT)の...
-
電車乗車時、並んでいるのに割...
-
USB機器からのデータ受信による...
-
一定時間操作がなかったら、と...
-
Amazonfireタブレットにわから...
-
マイコン C言語 割り込み処理...
-
PICマイコンでエンコーダパルス...
-
電車で待機列の割り込みについ...
-
駅のトイレでナイチンに邪魔さ...
-
実行した後、どうしてもフリー...
-
電車のドアの前での並び方
-
V.B.6 多重Call用スプール作成...
-
H8マイコンでの割り込み(シリ...
-
VB.net 割り込みの禁止
-
割り込みについて
おすすめ情報