• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:割り込み処理について)

割り込み処理について

このQ&Aのポイント
  • AVRマイコンの割り込み処理について質問させて頂きます。INT0割り込みが入ったら、割り込みルーチン中の他の割り込みを許可し、かつINT0の割り込みを禁止したいのですが、下記ソースで問題はありませんか?
  • INT0割り込みが終了して、メインルーチンに復帰した直後にINT0割り込みを許可したいのですが、下記ソース(1)で問題はありませんか(メインルーチンに復帰した直後に許可したいのですが、方法がわかりません)?
  • 初心者です。AVRマイコンの割り込み処理について質問させて頂きます。

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

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

初心者なら、マイコンのマニュアルを見てプログラムできるようになる練習をすることです。 URLに個別の割込みマスクとretiでの動作等書かれています。 ・SREG ($3F) : Status Register bit7-I : Global Interrupt Enable すべての割り込みを可能にするにはこのビットを1にする必要があります。割り込みがかかるとクリアされ、割り込みルーチンの終わりでRETI命令がかかると同時に再びセットされます。CEI,SEI命令でクリア,セットできます。 にあるように、基本的にはAVRの割込みモデルは多重割込みでない対応としているようです。 これを >割り込みルーチン中の他の割り込みを許可し ということなので、多重割込みの対応をしたいようですが、多重割込みについての問題点等 検討されているでしょうか。たとえば、多重割込みでは何重の多重割込みを想定して、それに必要なスタックサイズは検討されていますか? されているとして、以下のようになると思います。 ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止     ・SREG ($3F) : Status Register bit7-I : Global Interrupt Enableを1にする。      (これで割込み許可になる。もともと他の割込みは許可されているものと考えています。)      ・      ・このへんは他の割込みが許可状態。      ・      ・     ・SREG ($3F) : Status Register bit7-I : Global Interrupt Enableを0にする。    (int0割り込み要求フラグクリア) ・・・・(1) これは不要と思います。(理由)       (int0割り込み許可)         ・・・・(1)   } 理由: ・割り込みフラグは割り込みが起こったときにセットされ、割り込みハンドリング時に自動でクリアされます。割り込みをマスクしていた場合にはフラグは立ったままとなります。

参考URL:
http://ww2.tiki.ne.jp/~maro/AVR/programing/index.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 割り込み処理について

    割り込み処理について 初心者です。 AVRマイコンの割り込み処理について質問させて頂きます。 INT0割り込みルーチンの途中で、条件1により割り込み発生元(メインルーチン)に復帰させてたいのですが、下記のソースに何か問題はございますか? ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止          条件1         return;     処理1          条件2         return;     処理2 } よろしくお願い致します。

  • AVR ISR(ANALOG_COMP_vect

    AVRマイコンのISR(ANALOG_COMP_vect についての質問です。 このISR(ANALOG_COMP_vectはAVRに内蔵されているコンパレータの 入力電圧が基準電圧を上回ったときに実行される割り込みなのでしょうか。

  • 割り込みで並列処理

    ATmega168とWinAVRで割り込みのプログラミングをしています。 #include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER1_OVF_vect) { TCNT1 = 65500; PORTC ^= 0x02; } int main() { int i; DDRC = 0x07; PORTC ^= 0x01; TCCR1B = 0x00; TCNT1 = 65500; TIMSK1 = _BV(TOIE1); TCCR1B = 0x05; sei(); while (1) { PORTC ^= 0x04; for(i=0;i=500;i++){} } } 上記のプログラムを組んでみたのですが。while文に入ってfor文に少し入ってからISRの処理が始まるのですが。ISRの処理が終わってから又for文の処理に戻ろうとしません。なのでPORTC0x04の点滅が起こりません。PORTC0x04の点滅もしながらPORTC0x02の点滅もしたいのですがどうすれば良いのでしょうか?

  • AVRマイコンの割り込みについて

    AVRマイコンの割り込みについて 初心者です。 ・AVRマイコンの割り込みの優先順位ですが、割込みベクターのアドレスが小さい順に優先度が高いでよろしいでしょうか? ・優先低の割り込みルーチンを処理している時に、優先高の割り込みが入った場合、  (1)優先低の割り込みルーチン処理中断→優先高の割り込みルーチンの処理、完了→優先低の割り込みルーチン処理再開(中断ヶ所から)  (2)優先低の割り込みルーチン処理、完了→優先高の割り込みルーチンの処理、完了  (3)その他 (1)、(2)、(3)のどの処理が行われますか? ・優先高の割り込みルーチンを処理している時に、優先高の割り込みを禁止し、ルーチン内で優先低の割り込みが入った場合、優先高の割り込みルーチンから優先低の割り込みルーチンにとばすことは可能でしょうか? 以上、よろしくお願い致します。

  • 複数の割込み処理からアクセス可能なリングバッファ

    複数の割込み処理からのデータ追加(挿入)が可能なリングバッファを探しています。 例えば2本の不定期な割込みが発生し、それぞれの割込み処理ルーチンが一つのリングバッファにデータを挿入していくとします。 この時に挿入ポインタや挿入データをお互いに壊さないよう、排他制御されたリングバッファのソースをご存知でしたらお教え下さい。 言語はCまたはC++。 ライブラリなどを使わず、全てのコードを書くことが前提です。 CPUはなんでも構いません(割込禁止・許可などの命令は適宜置き換えます)。 よろしくお願いいたします。

  • 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関係サイトを探しても、割り込みでの遅れ時間については、ヒントがありませんでした。 相当な遅れは、あきらめるしかないのでしょうか? ご存知の方、アドバイスをお願い致します。

  • PIC18F2550の割り込み処理について

    PIC18F2550を使って、外部入力割り込みがちゃんと入るかどうかをチェックするため非常に簡単なサンプルコードを書いてみたのですが割り込みが発生しないのでどなたかご助力お願いします。(コンパイラ : MPLAB C18) とりあえずスイッチを押せばINT2ピンに5Vが入力され、割り込みでLEDを点滅させるという主旨で以下のコードを書きこんで動作させました。 #include <p18f2550.h> #include <delays.h> #include <portb.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; void isr(void); #pragma code isrcode = 0x0000008 void isr_direct(void) {_asm GOTO isr _endasm} #pragma code #pragma interrupt isr void isr(void) { //外部入力割り込みの処理はここに記述 INTCON3bits.INT2IF = 0; for(i=0; i<10; i++) { LATCbits.LATC1 = 1; Delay10KTCYx(255); LATCbits.LATC1 = 0; Delay10KTCYx(255); } } void main() { OSCCON = 0b01110000; //システムクロックを8MHZに設定 TRISA = 0b1111111; //ポートAをすべて入力に設定 TRISB = 0b11111111; //ポートBをすべて TRISC = 0; //ポートCをすべて出力に設定 //ポートRB2の外部割込みON, 立上がりエッジでON, Bポートの抵抗プルアップOFF OpenRB2INT(PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_OFF); RCONbits.IPEN = 0; //割り込み優先制御OFF INTCON3bits.INT2IE = 1; INTCONbits.GIE = 1; //全割り込み許可 while(1); } しかし、スイッチを押しても割り込み処理に移行せず無反応のままです。 スイッチを押した時にINT2ピンに5V入力があることはテスターで確認したので、ソースコードの方に問題があるかと思います。 よろしくお願いします。

  • 割り込み処理のシミュレート

    現在開発している組み込み系システムのシミュレートをVCで行いたいと考えています。 組み込み系のシステムは簡単に言うと、 普段はメインループでくるくる回っており、1ms毎にタイマ割り込みが発生し、変数の値を書き換え、メインループではその変数の変化によって何か処理を実行するというものです。 このようなシステムをVCでできるだけ同じようにシミュレートするため、マルチスレッドを用いようと考えているのですが、以下の性質を実現することは可能でしょうか? ・メインスレッド実行中はタイマ割り込みスレッドは割り込み可能。 ・タイマ割り込みスレッド実行中はメインスレッドは割り込んでこない。 ・メインスレッドで特定の区間タイマ割り込みスレッドの割り込みを禁止できる。 ・高速シミュレートを行いたいため、割り込みの禁止などはできるだけ低負荷で行いたい。(ミリ秒単位だとNG) ・複数の割り込みスレッドがある場合、各スレッドごとに割り込みレベルを設け、このレベル以下を割り込み禁止など行いたい。 スレッド以外の実現方法などあればそちらもご教授願いたいです。 よろしくお願いします。

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

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

  • 割り込みベクタに飛んだ場合必ず”OSIntEnter();”という関数は使わないといけない?

    今、H8S2368のために書かれたプログラムを見ているのですが、このプログラムではuC/OSというプログラムの関数である"OSIntEnter();"という関数が出てくることがわかりました。それで、OSIntEnter()関数というのが現在のソースプログラムの中でどのように使われているのかを、全ソースに対して検索をかけてみたところ、必ずと言っていいほど割り込みベクタのプログラムである下記のようなプログラムで使われていることがわかりました。 __interrupt(vect=22) void INT_IRQ6(void) { OSIntEnter(); OSSemPost(CmxInt); OSIntExit(); } たぶん、割り込みが発生して、その割り込みの種類の割り込みベクタに飛ぶときにこの”OSIntEnter()”というのを使わなければならないのだろうと推測しているのですが、 もし、割り込みベクタで”OSIntEnter()”を使わなかった場合、どのような問題がおきるのでしょうか?