PICの外部割込みと状態割り込みの違いについて

このQ&Aのポイント
  • PICの外部割込みと状態割り込みの違いについて簡単にご説明します。
  • 外部割込みと状態割り込みの違いを理解しましょう。
  • PICの外部割込みと状態割り込みについての違いを解説します。
回答を見る
  • ベストアンサー

PICの外部割込みと状態割り込みの違いについて

初歩的な質問で申し訳ありません。 PICはRB0の「外部割込み」とRB4-7の「状態変化割り込み」がありますが、今まで明確に区別して使用していませんでした。 この2つの違いを簡単にご説明して頂けないでしょうか? よろしくお願いします。

noname#230358
noname#230358

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

  • ベストアンサー
noname#230359
noname#230359
回答No.1

古くからあるタイプのPICですと RB0の「外部割込み」とは立ち上がりか立ち下がりかの どちらかで割り込みが発生します。 設定はファイルレジスタのbitにて切り替えます。 一方、RB4-7の「状態変化割り込み」とは 文字通り状態が変化したときに発生しますので 立ち上がりと立ち下がりの両方で発生します。

noname#230358
質問者

お礼

ご回答ありがとうございます。 RB0は立ち上がりか立下がりのどちらかを設定する割り込み。 RB4-7は立ち上がりと立下がりの両方で発生する割り込みということなのですね。ありがとうございます。勉強になりました。

関連するQ&A

  • PIC16F1827の外部割込み

    PIC16F1827のRB0を 外部割込みとして入力の立上りで割込みを発生するように 設定します。 1.割込み禁止 2.プログラムAスタート 3.RB0に立上り入力あり 4.プログラムA終了 5.割込み許可 ・・・のような場合 5.以降に割込みが発生するでしょうか? ご教授お願いします。

  • PICの割り込みフラグについて

    PIC18F4550を使用して、RB0とRB1への入力の立ち上がり、立下りエッジを検出しようとしています。 素直に割り込み処理へ入れば実現できるのですが、他の処理との兼ね合いの問題もあり、出来れば割り込みを使用したくありません。 そこで思ったのですが、割り込みを禁止にしていても、各割り込みフラグは変化するのでしょうか? 回答よろしくお願いします。

  • PIC割り込み処理の速度について

    PIC割り込み処理の速度について 外部ピン変化割り込みを使う予定なのですが、 PIC割り込み周期は1MHz以上にできるのでしょうか? 現在使用する予定のPICは16F873Aです。(20MHzクロック)

  • PIC16F84AのRBポート変化割り込みの使い方

    PIC16F84AのRBポート変化割り込みを使いたいのですが、三つ質問があります。 1.割り込み処理に入ったときに、「BCF INTCON,RBIF」としてもRBIFフラグが立ったままで、「RETFIE」で割り込みから戻った直後にすぐにまた割り込み処理に入ってしまいます。(MPLABのシミュレーション上でStimulusControlerでPINを変化させて実験)これの原因は何なのでしょうか?RBIFフラグはどのようにして解除したらよいのでしょうか? 2.RBポートは内部でプルアップせずに、外に抵抗をつけてプルアップしようと考えているのですが、その場合でも正しくシミュレーションできるのでしょうか? 3.RBポート変化割り込みは、LからHになった場合と、HからLになった場合の両方に反応するのでしょうか? 以上三つの質問に回答お願いします。

  • picのポート変化割り込み

    ccs社のコンパイラとpic16f690を使用して機械の制御部を作成しています。 pic16f690に複数のボタンを接続しています。 ボタン毎に、個別に割り込みをかけてやるようなことはできないのでしょうか? #INT_RB void RB6_isr(){ B6ピンが押された時の処理 } #INT_RB void RB4_isr(){ B4ピンが押された時の処理 } 上記のようにコードを記述するとエラーがでてコンパイルできません。 #INT_RBを片方削除すると、コンパイルはできますが、削除した方の割り込みが発生しません。 どなたかわかる方いらっしゃいましたら、ご教授願います。

  • PIC12F675のRB割込みミス(?)

    PIC12F675を20MHzでポート変化割込みを使用しています。 A.割込みルーチン内では BTFSC 05.3とラストリードし、bit出力(オシロでのチェック用)をするのみ (ポート変化割込に使用しているbitへの入力は約500Hz) B.メインルーチン内では MOVWF 05という形で無限ループでGPIOに出力し続けるのみ。 (出力周期は約600KHz) オシロでみると、入力が変化しても割込みが発生しないミスがかなりあります。 ここでB.の出力にディレイを入れて出力周期を約1KHzに下げると割込みミスは減少します。 Q1. マニュアルによれば、ポート変化割込みはラストリードから入力が変化とき 発生するとあります。 ラストリードはA.の割り込みルーチン内でしかしていません。 したがってB.で出力しても(出力にBCF,BSFは使用していません) 割り込みの発生には関係ないはずですが 現実は出力周期が割り込みの発生に大きく関係しています。 どういう理由でしょうか? Q2. ここまで述べてくると PIC12F675では、ポート出力をしているときはポート変化割込み ミスがある???ということになってしまいます。 これは正しいのでしょうか? 入力の変化を見落とさないために、ソフトウェアプログラムではなく割り込みを使用しているのですが・・・。

  • PIC16F88 内部オシレータ使用による割り込み

    PIC16F88を内部オシレータで発振させて使用しています。 問題は、TIMER0割り込みが計算通りに動かないことです。 外部にオシレータを付けると計算通りのタイミングで割り込みが発生するのですが、内部オシレータ使用の場合は、その間隔よりもかなり長くなってしまいます。(0.01秒間隔で割り込みをかけるつもりが、3秒間隔ぐらいになってしまいます。) 何が原因なのでしょうか? 完全な答えでなくても色々試してみますので、何か気になる部分が御座いましたら、教えて下さい。

  • PIC18F2550の外部入力割込みについて

    PIC18F2550で外部入力割り込みがちゃんと入るかどうかをチェックするため非常に簡単なサンプルコードを書いてみたのですが、mainの処理を行うだけで割り込みが発生しないのでどなたかご助力お願いします。(コンパイラ : MPLAB C18) 以前ほぼ同様の質問を掲載しましたが、解決につながる回答が得られませんでした↓ 長い間解決出来ず困り果てているので、有益な回答をいただけると幸いです。 mainのwhileループではLEDを点滅させ、スイッチを押せばINT2ピンに0Vが入力され、割り込みでLEDを点灯し続けるという主旨で以下のコードを書きこんで動作させました。 #include <p18f2550.h> #include <delays.h> #pragma config FOSC = INTOSCIO_EC, FCMEN = ON, IESO = OFF #pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF #pragma config WDT = OFF, CCP2MX = OFF #pragma config PBADEN = ON, LPT1OSC = ON, MCLRE = OFF #pragma config STVREN = ON, LVP = OFF, XINST = OFF #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF #pragma config CPB = OFF, CPD = OFF, WRT0 = OFF, WRT1 = OFF #pragma config WRT2 = OFF, WRT3 = OFF, WRTC = OFF #pragma config WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF #pragma config EBTR3 = OFF, EBTRB = OFF int i; int j; void high_isr(void); // リセットベクタ #pragma code reset_vector=0x1000 extern void _startup(void); void remapped_reset(void) { _asm goto _startup _endasm } #pragma code high_vector = 0x000008 void interrupt_high_vector(void) {_asm GOTO high_isr _endasm} #pragma code #pragma interrupt high_isr void high_isr(void) { //外部入力割り込みの処理はここに記述 for(j=0; j<10; j++) { LATCbits.LATC1 = 1; Delay10KTCYx(255); } INTCON3bits.INT2IF = 0; } void main() { OSCCON = 0b01111100; //システムクロックを8MHZに設定 TRISA = 0b01111111; //ポートAをすべて入力に設定 TRISB = 0b11111111; //ポートBをすべて入力に設定 TRISC = 0b00000000; //ポートCをすべて出力に設定 RCON = 0b10000100; INTCON = 0b10010000; INTCON2 = 0b10000000; INTCON3 = 0b10011000; //INT2ピンの立下りエッジで割り込み処理に移行する     while(1) { LATCbits.LATC1 = 1; Delay10KTCYx(255); LATCbits.LATC1 = 0; Delay10KTCYx(255); } } スイッチ入力時に0VがINT2ピンに入力されていることは確認できたので、プログラムの方に問題があると思われます。 回答お待ちしております。

  • PICマイコン 割り込み実行時間 (遅延時間)

    PICマイコン 割り込みの実行時間について、教えてください。 PICマイコン初心者です。 いろんな方々のプログラム例を参照させてもらっています。 PIC18F1320 を使って、外部割り込みを試していますが、トリガー信号の立ち上が入るタイミングで、割り込み処理を行いますが、トリガー信号から、割り込み動作Hが立ち上がりのが、遅くて困っております。トリガー信号から、遅れが少なくなる方法を教えてください。下記に現在のプログラ C言語を示します。 ・ポートRB1の外部割込 立ち上がりトリガー。 ・ポートRB0、RB2の状態をbstatに入れてIF文で、出力RB6 Hを出力したい。 ・トリガー立ち上がりから、約2usecも遅れてRB6がHに。遅延を出来るだけ少なくしたい。 ・ if (bstat==0)時で約2usec、if (bstat==3)時で約4usecと差が出るのも、改善したい。 #pragma code high_vector=0x8 //高位レベル割り込み void high_interrupt (void){ _asm GOTO high_isr _endasm } #pragma code //デフォルトコードセクションに戻る #pragma interrupt high_isr //割り込み処理関数宣言 void high_isr (void){ INTCON3bits.INT1IE=0; //外部割込みINT1の禁止 // INTCONbits.PEIE=0; //低位割り込み禁止 INTCONbits.GIE=0; //全割り込み禁止 INTCON3bits.INT1IF=0; //INT1の割り込みフラグをリセット if (bstat==0){ LATBbits.LATB6=1; // Delay1TCY(); //wait Delay1TCY(); //wait Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait Delay1TCY(); //wait Delay1TCY(); //wait } else if(bstat==1){ LATBbits.LATB6=1; // Delay1TCY(); //wait Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait Delay1TCY(); //wait } else if(bstat==2){ LATBbits.LATB6=1; // Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait } else if(bstat==3){ LATBbits.LATB6=1; // Delay1TCY(); //wait LATBbits.LATB6=0; // Delay1TCY(); //wait } INTCON3bits.INT1IE=1; //外部割込みINT1の許可 // INTCONbits.PEIE=1; //低位割り込み許可 INTCONbits.GIE=1; //全割り込み許可 } // メインプログラム void main (void){ TRISB = 0b00000111; // RB0/1/2:input TRISA = 0xFF; // ALL A input // PORTB = 0; PORTA = 1; bstat= ((PORTBbits.RB0+0)+(PORTBbits.RB2*2));// RB0とRB2の状態を読み込み OpenRB1INT(PORTB_CHANGE_INT_ON & // ポートRB1の外部割込みオン RISING_EDGE_INT & //立上りエッジでオン PORTB_PULLUPS_OFF //Bポートの抵抗プルアップOFF ); RCONbits.IPEN=1; //割り込み優先順位制御ON(0:優先順位制御OFF) INTCON3bits.INT1IP=1; //INT1の割り込みを高順位割り込みにセット INTCON3bits.INT1IE=1; //INT1の割り込みを許可 INTCON2bits.INTEDG1=1; //立上がりエッジでオン // INTCONbits.PEIE=1; //低位割り込み許可 INTCONbits.GIE=1; //全割り込み許可 while (1) PIC関係サイトを探しても、割り込みでの遅れ時間については、ヒントがありませんでした。 相当な遅れは、あきらめるしかないのでしょうか? ご存知の方、アドバイスをお願い致します。

  • PICの割り込み機能

    現在電子工作をしており、それにPIC16F84Aを使っています。 正直アセンブリはよくわからないので、C言語でプログラムを作っています。 コンパイラはPICCLITEで、LEDの点灯・消灯に関するプログラムです。 機能としては ・RA0に入力があったときRB0につないであるLEDが消灯しているならLEDを点灯。 ・RA0に入力があったときRB0につないであるLEDが点灯しているならLEDを消灯。 ・RA1に入力があったときLEDが点灯しているなら5秒後にLEDを消灯。 というものを目指しています。 1つ目、2つ目の項目はif文で簡単に実現できましたが、割り込みがうまくいかず、 消えている状態でRA1に入力を入れたときなぜか5秒後に点灯してしまいます。 だからRB0の出力を逆にしてみたんですがうまくいかず・・・。 ハード的には、RB0には反対側から5Vをかけ、 RB0=0の時は点灯 RB0=1の時は消灯 としています。 またセラロックは10MHzのものを使用しています。 現在のプログラムとしては #include "pic.h" #define XTAL_FREQ 10MHZ #define MHZ*1000 void DelayUs(unsigned char cnt){ //時間待ち関数  unsigned char i;  i=(cnt)/(12MHZ/(XTAL_FREQ))|1;  while(--i!=0) continue; } void DelayMs(unsigned int cnt){ //時間待ち関数  unsigned char i;  do{   i=4;   do{    DelayUs(250);   }while(--i);  }while(--cnt); } int cnt,SW; //SWが0なら消灯 //SWが1なら点灯 void interrupt isr(void){ //割り込み関数  if(T0IF==1){   T0IF=0;   cnt--;  }  if(cnt==0){   RB0=1; //消灯   SW=0;   cnt=190;   T0IE=0;   GIE=0;  } } main() {  TRISA=0xFF; //入出力設定  TRISB=0x00;  PORTA=0x00;  PORTB=0x00;  SW=0;  OPTION=0x87; //プリスケーラの設定  TMR0=0x00;  T0IF=0;  T0IE=1;  cnt=190;  while(1){   if(RA0==1){    DelayMs(60); //チャタリング防止    if(RA0==1){     if(SW==0){      RB0=0;      SW=1;     }    else{     RB0=1;     SW=0;    }   }  }  if(RA1==1){   DelayMs(60); //チャタリング防止    if(RA1==1 && SW==1){     TMR0=0;     T0IF=0;     T0IE=1; //割り込み許可     GIE=1; //全体割り込み許可    }   }  } } インターネット上での割り込みのプログラムをいくつか見てみたのですが、 どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ というプログラムばかりでした。 僕のは基本的にRA0の入力によってLEDを点灯・消灯させつつ RA1の入力で割り込みを開始。 5秒後に消えたら割り込みを禁止する。 という仕様にしたいのですが・・・・・・。 1ヶ月ぐらいやってますがうまくいきません。 良ければご回答をお願いします。