• ベストアンサー

割り込み処理について

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

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

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

Cコンパイラがどれだけやってくれるかによると思います。 割込みハンドラから戻る場合はアセンブリ言語の命令でreti でなければ ならないですが、return文でretiになるかアセンブリリスト等で 確認すればよいと思います。

ron_nast
質問者

お礼

ご回答ありがとうございました。 参考にさせて頂きます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

・int0の割り込み許可処理の場所 ・割り込み要求フラグが立ったまま抜けたら即座に再度割り込みルーチンに入ってしまわないか という辺りを考慮した上で、後処理をきっちり行えば特に問題は起こらないと思いますが。

ron_nast
質問者

お礼

ご回答ありがとうございました。 参考にさせて頂きます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 割り込み処理について

    割り込み処理について 初心者です。 AVRマイコンの割り込み処理について質問させて頂きます。 INT0割り込みの割り込みが入ったら、割り込みルーチン中の他の割り込みを許可し、かつINT0の割り込みを禁止したいのですが、下記ソースで問題はありませんか? INT0割り込みが終了して、メインルーチンに復帰した直後にINT0割り込みを許可したいのですが、下記ソース(1)で問題はありませんか(メインルーチンに復帰した直後に許可したいのですが、方法がわかりません)? ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止      ・      ・      ・      ・    (int0割り込み要求フラグクリア) ・・・・(1)        (int0割り込み許可)         ・・・・(1)   } よろしくお願い致します。

  • 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の点滅もしたいのですがどうすれば良いのでしょうか?

  • 割り込み処理について

    割り込み処理について 初心者です。 割り込み処理について質問させて頂きます。 (1)割り込みルーチン中から別のルーチンに飛ばすことは可能でしょうか? (2)割り込みルーチンの途中で最後まで処理を終えずに、割り込み先に復帰させることは可能でしょうか? 割り込み {    処理1    a();           ・・・(1)    処理2    return;        ・・・(2)    処理3 } 以上、よろしくお願い致します。

  • 割り込み処理から引数を取得する方法

    AVRの割り込み処理なのですが、 ISR(割り込みベクタ) { 処理; } みたいに書きますよね? 例えば通信の完了とかで割り込みさせて、取得した値を他の関数内で使う時にグローバル関数を使う他ないのでしょうか? 関数みたいにreturnさせたり出来ないのかなと思いまして。 returnさせても呼び出す親がいないので取得方法がわからないなと。 出来ないなら出来ないでグローバルを使います。

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

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

  • ATmega88でマイコン動作がフリーズする。

    現在ATmega88マイコンを使っているのですが、パワーダウンモード機能で消費電流をおさえて、和入り込みINT1の入力の時だけウェークアップさせるようなプログラムを組んでいるのですが、この割り込みINT1を発生させても全く受け付けなくなる現象が発生しました(INT1のISRルーチンでLEDを点灯でウェークアップ動作を確認) 電源は3Vのリチウム電池を使用しています。 このような現象の対策として考えられることはありませんでしょうか? ご存じの方いらっしゃいましたら、ご教授の程よろしくお願い致します。

  • アトメルマイコンのSPI通信ISRルーチン書き方

    現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

  • アトメルマイコンでISRを追加すると出てくるエラー

    現在、アトメル社製のマイコンATxmega128A1Uでプログラミングを行なっています。 SPI通信でSPIFポートでの通信を行なっているコードで、受信のコードを割り込みルーチンのようなISRでのコードで受信データを配列に入れるようなコードにしたいと思っています。 そこで、 ISR(SPIF_INT_vect) { } https://github.com/KenjiMaehara/raspberryPiTCPClient/commit/89b4c85451febee0cd841acd531c34cac8112c60#diff-974068d932dfafd8f83f2ef729cab1a3 このような割り込みルーチンのSPIFベクタのコードを追加しましたが、次のようなエラーが発生します。 Error 2 Disabling relaxation: it will not work with multiple definitions 1 1 MainUnit Error 3 ld returned 1 exit status collect2.exe 0 0 MainUnit Error 1 multiple definition of `__vector_118' C:\Users\kmaeh_000\Documents\GitHub\raspberryPiTCPClient\testSpi161101\M1601A_20161205\MainUnit\Debug/.././event.c 87 1 MainUnit このエラーの回避方法をご教示いただきますよう、宜しくお願い致します。

  • AVRマイコン

    AVRマイコンで5分間だけある処理(例:LEDの点滅など)を繰り返し行い、処理が途中(例:LEDが点滅中)であっても5分たったらその処理を終了させたいのですが、どのようなプログラムを組めばよいのでしょうか。 ご回答よろしくお願い致します。