このQ&Aは役に立ちましたか?
picのポート変化割り込みを使用した機械の制御部について
2023/10/18 08:20
- pic16f690を使用して機械の制御部を作成しています。複数のボタンに個別な割り込みをかける方法を知りたいです。
- pic16f690の制御部作成において、複数のボタンにそれぞれ個別の割り込みをかけることができないか悩んでいます。
- pic16f690を使用した機械の制御部作成中に、複数のボタンの個別な割り込みができない問題に直面しています。
picのポート変化割り込み
2010/03/15 17:05
ccs社のコンパイラとpic16f690を使用して機械の制御部を作成しています。
pic16f690に複数のボタンを接続しています。
ボタン毎に、個別に割り込みをかけてやるようなことはできないのでしょうか?
#INT_RB
void RB6_isr(){
B6ピンが押された時の処理
}
#INT_RB
void RB4_isr(){
B4ピンが押された時の処理
}
上記のようにコードを記述するとエラーがでてコンパイルできません。
#INT_RBを片方削除すると、コンパイルはできますが、削除した方の割り込みが発生しません。
どなたかわかる方いらっしゃいましたら、ご教授願います。
質問者が選んだベストアンサー
http://sky.geocities.jp/home_iwamoto/picc_02.htm
■割り込み(インターラプト)を使ったプログラム
http://sky.geocities.jp/home_iwamoto/prgm/IRQ_PA3.c
リンク先を改造
// PA3 インタラプト
//
// PA3のボタンを押すとインタラプトが発生する。
// インタラプト回数をLEDで表示する。
#include<pic.h>
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
static unsigned char Display=1; // LED表示パターン
void interrupt isr(void){
unsigned int i;
if(RABIF) { // IOからのインタラプト
for(i=2000;i>0;i--); // チャタリング防止遅延(約20mS)
if(RA0==0){キー0の処理}
if(RA1==0){キー1の処理}
if(RA2==0){キー2の処理}
RABIF = 0; // インタラプトフラッグをクリア
}
}
void main(void){
TRISC = 0; // PortC すべて出力
PORTC = Display; // LED消灯
IOCA3 = 1; // PA3をON
RABIE = 1; // IOインタラプトをON
GIE = 1; // インタラプトをON
for(;;)
continue; // 無限ループ
}
ってかんじじゃないか
持ってないが
回答1の追記と同じ
このQ&Aは役に立ちましたか?
この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。
その他の回答 (2件中 1~2件目)
それは書き方は無理でしょう。
割り込み内で何の割り込みかを判断して分岐させます。
ただし、ICD2などは使用できません。
ハードが完成しているなら変更はできないのかもしれませんが
できればCPUの外で割り込みをまとめてINT端子に入れたほうが
良かったかもしれません。
まずPIC16F690は割り込みベクタが一つしかないことをご確認ください。
(データシートp25)
タイマー割り込みもINT割り込みもすべて004番地に飛んできます。
そこから何の割り込みかを調べてそれぞれの処理に分岐させます。
ハードについてですが割り込みさせたいものがいくつかあると
ロジックのANDをとってINT端子に入れて、それぞれの信号はポートに
入力させます。CPUは割り込みを受け付けるとそのポートを読みに行って
何の割り込みかをみつけるようにします。(自分のプログラムにて)
当然、ロジック論理、タイミングなどを考慮して回路設計しなければなりません。
お礼
2010/03/15 17:42
ご回答ありがとうございます。
書き忘れていたのですが、コンパイラのデバイスの設定?みたいなものに、
#define INT_RA0 0x010B08
#define INT_RA1 0x020B08
#define INT_RA2 0x040B08
#define INT_RA3 0x080B08
#define INT_RA4 0x100B08
#define INT_RA5 0x200B08
#define INT_RB4 0x1100B08
#define INT_RB5 0x1200B08
#define INT_RB6 0x1400B08
#define INT_RB7 0x1800B08
と、書いてあったので、ピン毎の割り込みが出来るかも...と思ったのですが。
>>割り込みをまとめてINT端子に入れたほうが
というのは具体的にどうすればいいのでしょうか?
質問ばかりで申し訳ありません。