ページの先頭です
本文へジャンプする

本ウェブサイトでは、JavaScriptおよびスタイルシートを使用しております。
お客さまがご使用のブラウザではスタイルが未適応のため、本来とは異なった表示になっておりますが、 情報は問題なくご利用いただけます。


Worldwide > 日本English

割り込み


注意
uPD784214は廃止品です。
uPD78058は保守品です。

目次

FAQ-ID : 78int-nnnn

0101割り込みの動作の基本 [共通]
0102割り込みの優先度制御の注意点[78K0S、78K0、78K0R]
0103割り込み応答時間の変動を少なくするには[78K0、78K0S共通]
0001同じ割り込み要求を多重に受けてしまいます。[78K0]
0002多重割り込み処理方法 [78K0]
0003TM0フリーランによるリモコン受信時の割り込みモード設定 [78K0]
0004割り込み要求フラグ待ちをしていると割り込みがかからない [共通]
0005サブシステム・クロックで動作中に、他の割り込みが発生した場合 [共通]
0006サブシステム・クロックで HALT中における割り込み時のクロック [共通]
0007リセット直後に割り込み要求は受け付けられるか? [共通]
0008割り込み要求フラグ・レジスタ IF0Lのフラグを消さないようにするには? [共通]
0009割り込み要求フラグのクリアにより他の割り込みを受け付けなくなります。 [共通]
0010割り込み要求パルス幅は、規格より短くても有効となるか? [共通]
0011外部割り込みの処理はどのタイミングで実行されるのか? [78K4]
0012パワーオン時の処理に分岐させたい。(割り込み機能を初期状態に戻す) [78K4]
0013クロック同期式シリアルのマクロ・サービスで1バイトの受信をしたい [78K4]
0014マクロ・サービス中に割り込み要求は受け付けないのか? [78K4]
0015マクロ・サービス実行はメインのプログラムの動作に影響を及ぼさないか? [78K4]
0016C言語でマクロ・サービスを使用する方法は? [78K4]


割り込みの動作の基本 [共通]

FAQ-ID : 78int-0101最終更新日 : 2004/02

Q-1
割り込み処理について、どのような動作になり、どのような点に注意すればよいのか?
A-1
<はじめに>
割り込み処理の基本的な動作は大きく4つの部分に分けて考えることができます。

最初の部分は 割り込みの要因を発生させる部分で、 2つ目が割り込み要求フラグ、 3つ目の部分が割り込みの制御を行う割り込みコントローラ部、 最後が実際に割り込みを処理するCPU部です。 割り込みはこれら4つの部分を通って処理されます。

[割り込みの流れ](4Kbytes)


<割り込みの要因発生部>
割り込みの要因を発生させる部分としては、タイマ部やシリアル部、 外部信号のエッジ検出回路等 (個々のデバイスで要因は異なります) があります。
これらの部分では、タイマの一致やシリアル・データの受信完了など割り込み発生の条件が満足されると、 対応した割り込み要求フラグをセットします。

[割り込み受け付け第1段階](6Kbytes)

割り込みの第1段階は各周辺機能部において指定された条件が満足されることです。
タイマ部ではコンペア・レジスタとの一致等で、シリアル部では通信完了等で、 外部割り込みではエッジ検出により、各々対応した割り込み要求フラグをセットします。
また、プログラムにより割り込み要求フラグをセットすることもできます。



<割り込み要求フラグ>
このように、各割り込み要因は対応した割り込み要求フラグをセットするだけで、 割り込みの要因を発生させる部分と割り込みコントローラ部の動作は独立した動きになります。
この間を結ぶのが割り込み要求フラグです。

なお、各割り込み要因に対応した割り込み要求フラグは1つ(1ビット)しかありません。
従って、割り込みが受け付けられる前に同じ割り込み要求が複数回発生しても、 それは1回としか認識できませんので、注意が必要です。

また、割り込み要求フラグはプログラムによりセットしたりクリアしたりすることもできます。
この機能を使うと、UARTでの送信処理を、最初のデータを含めて、 全て割り込みで実行させることができます。
ただし、この場合には必ず、ビット操作命令を用いて、 1命令で割り込み要求フラグをセットする必要があります。

UART送信処理例

複数バイトのデータを送信する場合、 通常はメイン・プログラムが出力データの1バイト目をUARTに書き込むとともに、 2バイト目以降のデータの情報を割り込み処理プログラムに引き渡します。
割り込み処理プログラムはメイン・プログラムから渡された情報を元にして 2バイト目以降のデータをUARTに書き込みます。
このように1バイト目と2バイト目以降では処理が異なってきます。

[UART送信処理例1](4Kbytes)
[UART送信処理例2](3Kbytes)

メイン・プログラムは割り込み処理プログラムに送信データの情報を渡し、 割り込み要求フラグをセットするだけとなります。
実際のUARTへの書き込みは全て割り込み処理プログラムが処理しますので、 全体の処理が見やすくなります。



<割り込みコントローラ部>
割り込み要求フラグ以降が割り込みコントローラ部の動作となります。
割り込みコントローラ部では、割り込み要求フラグは先ず割り込みマスク・レジスタにより有効にする (マスクしない) か無効にする (マスクする) が決められます。

マスクして無効に設定された割り込み要求フラグは以降の動作で無視されます。
ただし、要求フラグ自体がクリアされる訳ではないので、 マスクを解除したらその段階で割り込み要求は有効になってしまいます。

マスクされなかった割り込み要求はスタンバイの制御回路に送られ、 スタンバイの解除に使用されます (78K4のマクロ・サービスの場合を除く)。

また、割り込み優先回路を介してCPUへの割り込み要求となります。
CPUが割り込みを受け付けると、対応した割り込み要求フラグはクリアされます。
CPUが割り込み禁止状態では、割り込みは単にスタンバイ解除に使用されます (スタンバイ状態でない場合には保留されるだけです)。

割り込み許可状態では、スタンバイ解除後、ベクタ割り込み処理を起動します。
なお、78K4のマクロ・サービスの場合にはCPUが割り込み禁止でも受け付けて、 マクロ・サービス処理を行います。

[割り込み要求フラグの使われ方](3Kbytes)

  割り込み要求フラグは以下の3つの使い方があります。
  • プログラムでポーリング (読み出し) を行い、割り込み要求元の処理が完了したかを確認します。 この使い方の場合には、割り込みマスクをセットしておき、CPUへの割り込みは発生させません。
  • スタンバイの解除に使用します。
    スタンバイ状態でマスクされていない割り込み要求フラグがセットされると、スタンバイが解除されます。 このとき、CPUが割り込み禁止状態であれば、スタンバイ解除後はベクタ処理をせず、 スタンバイ命令の後から実行を再開します (78K4でマクロ・サービスを実行する場合には、スタンバイは解除されません。)
  • CPUへのベクタ割り込み要求として使用します。 この場合には、割り込み優先回路で他の割り込み要求フラグの状態、 CPUが実行中の割り込みの状態がチェックされ、最も優先度が高ければCPUへの割り込み要求となります。

割り込み優先回路では同時に発生している他の割り込み要求と優先度を比較したり、 現在処理している割り込みとの優先度比較を行います。

このため、CPUが実行している割り込みの状態を監視し、 RETI命令が実行されるまでは割り込み処理中であると判断します。
また、78K4の場合や 78K0でも NMIの実行中には、 たとえCPUが EI命令を実行しても優先度の低い割り込みを受け付けないことになります。


<CPU部>
CPUが割り込み許可状態であれば、優先度がもっとも高い割り込み (これは割り込み制御回路で決定) を受け付け、PCや PSWの値をスタックに保存して、 割り込みベクタに分岐します。
このときに (該当する割り込み要求フラグはクリアされ)、CPUは割り込み禁止状態になります。

なお、CPUが割り込みを受け付けて、ベクタに分岐するタイミングは命令の実行状態により異なり、 いつも同じタイミングにはなりません。
割り込みを保留する命令や、特に割り込み禁止期間があると大きく変動します。
このため、細かなタイミングが問題になる場合には割り込み処理ではなく、 タイマの出力機能やリアルタイム出力機能等のハードウエア機能を使用するようにして下さい。

割り込み処理が完了したら、RETI命令で元の処理に戻ります。
このとき、PSWは割り込み受け付け前の値に書き戻されますので、 RETI命令の直前に EI命令は実行する必要はありません。

この情報はお役にたちましたか?


割り込みの優先度制御の注意点[78K0S、78K0、78K0R]

FAQ-ID : 78int-0102最終更新日 : 2007/12

マイクロコンピュータで複数の割り込みを使用する場合には割り込みの優先度の制御や多重割り込みの制御が必要になります。これらの制御を間違えると割り込みの優先度が逆転して、余分な割り込みを受け付けたり、受け付ける必要がある割り込みを受け付けなくなったりするといった問題が発生します。

(1)ディフォルト優先度
78K0などで扱う割り込みには割り込み要求の要因ごとにディフォルト優先度が設定されています。このディフォルト優先度は複数の割り込み要求が同時に発生した場合にどの割り込みを優先するかの判断に利用されるだけです。そのため、ディフォルト優先度は多重割り込みの制御には用いることはできません。
78K0Sではディフォルト優先度しかないので、78K0Sで考えてみます。ここで以下のような割り込みを扱います(左側ほどディフォルト優先度が高い)。

INTP0  >  INTP1  >  INTTMH1

INTP1INTTMH1ではより優先度の高い割り込みを処理できるように多重割り込みを許可するものとします。
ここで、INTP1INTTMH1が同時に発生したとすると、CPUは割り込み可能になると、ディフォルト優先度の高いINTP1を受け付けます(①)。この状態で、INTP0割り込みを受け付けるために割り込みを許可すると、保留されたINTTMH1が受け付けられてしまいます(②)。



このような動作を避けるには、INTP1割り込み処理の中で割り込みを許可する前に、割り込みを受け付けたくないINTTMH1をマスクします。また、INTP1割り込み処理の最後で割り込みを禁止して、INTTMH1のマスクを解除します。

注意
割り込みの説明の中で「同時」という言葉がよく使用されます。ところが、殆んどの場合に、厳密な意味で「全く同じ時間(タイミング)」を意味してはいません。ここで言っている「同時」はCPUが割り込みを受け付けるタイミングを意味しています。つまり、CPUが割り込み可能であれば、1命令の実行時間が「同時」の対象になりますが、CPUが割り込み禁止状態で動作している場合には、CPUが割り込みを受け付け可能になるまでの期間(数十~数百命令以上になることもある)が「同時」の対象になります。

(2)ソフトウエアによる優先度指定
78K0では2レベル、78K0Rでは4レベルの割り込み優先度(優先順位)の指定ができるようになっています。この優先度指定はディフォルト優先度と異なり、同時に発生した割り込みの優先度判定以外でも使用されます。
78K0Rを例にして説明します。78K0RではPSWレジスタの2ビットを用いて、4つの割り込みレベル(レベル0~3)をとり得ます。また、個々の割り込みの(優先)レベルもPRレジスタの2ビットを用いて4つのレベルのどれかに設定できます。これらの関係は以下の表のようになっています。割り込みを受け付けると、そのときのPSWの値はスタックにセーブされ、受け付けた割り込みの優先度レベルに対応した値がISP0、1ビットにセットされます。このISP0、1の値はRETI命令を実行する(または、PSWを書き換える)までは保持され、優先度の低い割り込みの受け付けを禁止します。



ここで注意する必要があるのは、割り込み優先度レベル0の割り込み処理中(CPUの割り込み優先度がレベル0)に割り込み許可にすると、同じ優先度レベル0の割り込みは受け付けてしまうことです。これは、最優先の割り込みを処理中には、それ以上の割り込みは処理する必要がないことから、「割り込み優先度レベル1の割り込み処理中には多重割り込みを許可し、割り込み優先度レベル0の割り込み処理中には多重割り込みを許可しない」ことでレベル0~3の割り込みの優先処理が可能です。

参考
V850では8レベルまでの割り込み優先度の制御が可能です。V850ではPSWではなく、8ビットのISPRレジスタ(リード・オンリーのレジスタ)により処理中の割り込み優先度を保持しています。割り込みを受け付けると、割り込み優先度に対応したビットをセットします。RETI命令の実行時にそのときにISPRレジスタのセットされたビットの中で最も優先度の高い割り込みに対応したビットをクリアします。この処理を行うことで、割り込み優先度を制御しています。

(3)割り込み優先度とレジスタ・バンク
78K0と78K0Rでは4組のレジスタ・バンクをもっています。これを利用することで割り込み処理を高速化することが可能です。レジスタ・バンクは多重で処理すべき割り込みの優先度に応じて設定してください。ただし、4組ではメイン処理を含めた5つのレベルには不足します。そこで、以下の例に示すように最低優先度の割り込みではレジスタ・バンクは使用しないで、使用するレジスタはプログラムでスタックにセーブします。

・メイン処理、レベル3の割り込み     :レジスタ・バンク0を使用
・レベル2の割り込み     :レジスタ・バンク1を使用
・レベル1の割り込み     :レジスタ・バンク2を使用
・レベル0の割り込み     :レジスタ・バンク3を使用

このような使い分けを行えるのは、同じ優先度の割り込みが多重で処理されることがないからです。

(4)多重割り込み
78K0Rでは多重割り込み処理を行うときには、単純に優先度の低い割り込み処理の中で割り込み許可にするだけです。
78K0の割り込み優先度の制御は2つのレベルだけです。優先度の高い割り込みを処理中に低い優先度の割り込みの受け付けを禁止できるだけなので、78K0Rのように簡単には実現できません。78K0では個々の割り込みのマスク機能を使って制御する必要があります。78K0で4レベルの(またはそれ以上の)優先度を使うための一例を以下に示します。

優先レベルISPの設定割り込み処理でのマスクの制御、他
レベル0(最優先)0(高優先)制御しない(割り込み禁止のまま)
レベル10(高優先)レベル1の分のマスクをセット/クリア
レベル21(低優先)PSWのISPビットをクリアする
レベル3(低優先)1(低優先)レベル3の分のマスクをセット/クリア

例えば、レベル1の割り込み処理では同じレベル1の優先度の割り込み(自分自身を含む)の割り込みマスクビットをセットしてから割り込み許可にし、自身の割り込み処理を行います。割り込み処理が完了したら、割り込み禁止にし、セットした割り込みマスクビットをクリアします。
レベル2の割り込み処理では、PSWのISPビットをクリアして割り込みを許可にし、自身の割り込み処理を継続します。処理が完了したら、RETIを実行します(RETI命令の実行によりPSWは元の値に復帰します)。
レベル3の割り込み処理では、同じレベル3の割り込みをマスクしてから割り込みを許可します(マスクする対象が異なるだけで、処理はレベル1と同じです)。

78K0Sでの多重割り込みの場合には、優先度は割り込みマスクで制御することになります。この場合に、どの割り込みのマスクをセットし、またクリアするかに注意が必要です。このため、多重割り込みを許す割り込み処理では、割り込み処理を開始した時点でのMK0及びMK1レジスタの値を読み出してスタックにセーブしてから書き換えます。その後割り込み許可にして自身の割り込み処理を行います。処理が完了したら、割り込みを禁止し、スタックからセーブしておいたMK0及びMK1の値を元に戻して、割り込みを完了します。

(2007/12)

この情報はお役にたちましたか?


割り込み応答時間の変動を少なくするには[78K0、78K0S共通]

FAQ-ID : 78int-0103最終更新日 : 2008/01

Q-1
マニュアルを見ると、割り込み応答時間には大きな幅があるようですが、バラツキの幅を小さくすることはできないでしょうか。
A-1
割り込みのチェック・タイミングは実行中の命令の最後で、要求がチェックされると、命令の実行後に受け付けます。従って、割り込み応答時間は実行中の命令の実行時間やその命令のどのタイミングで割り込みが要求されたかで変動します。(FAQの「最小割り込み間隔について」を参照してください。)
この変動幅を小さくするには、割り込みを待つ間に実行する命令について以下の注意が必要です。
  • できるだけ実行時間の短い命令だけにする
  • 割り込みに関係したSFR(特殊機能レジスタ)はアクセスしない
  • 割り込み許可/禁止の操作を行わない
この条件を満たす一番の例がHALT命令を実行して割り込み要求を待つというものです。HALT命令で割り込み要求を待つようにすると、変動の幅は78K0では1クロック/78K0Sでは2クロックで済みます。

(2008/01)

この情報はお役にたちましたか?

Q-2
処理状況に応じて、次の割り込み要求に対して、同じ割り込みでも異なる処理を実行する必要があります。そこで、フラグを準備し、割り込み処理の中でそのフラグを参照してプログラムを分岐させるようにしました。しかし、処理内容によって、分岐して処理を開始するまでの時間に差が出てしまいます。割り込みベクタの値をダイナミックに書き換えることはできないでしょうか。
A-2
割り込みベクタそのものを書き換えることはできません。しかしながら、以下のような処理で対応可能です。
ショート・ダイレクト領域に実際の処理部のアドレスを設定する変数を準備しておき、次の割り込みで処理する処理部のアドレスを前もって格納しておきます。その状態で、割り込みが受け付けられたら、その変数を読み出して、そのアドレスに分岐します。こうすると、割り込み受け付けから実際の処理までの時間はいつも同じとなります。
具体的には、以下のようにsaddr属性でDSEGを宣言して、2バイトの領域(ここでは、Intaddrとします)を確保します。
        DSEG    saddrp
Intaddr:
        DW      2               ;割り込み処理アドレス格納領域

次に、割り込み処理の先頭で以下のような処理を実行します。

INTxxx:
        PUSH    AX              ;AXレジスタの内容をスタックにセーブ
;
; 必要に応じて割り込みで使用する他のレジスタをスタックにセーブします。
;
        MOVW    AX,Intaddr      ;処理アドレスの読み出し
        BR      AX              ;処理アドレスへ分岐
これで、AX(及び他の)レジスタがスタックにセーブされた状態で実際の割り込み処理部へ分岐できます。この処理は実際に割り込みで処理する内容によらず一定となるので、要求を満足しています。

フラグを用いて、テーブル参照で実際に処理させたいアドレスを得て、そのアドレスに分岐する方法もあります。しかし、できるだけ割り込み発生からの遅れを小さく抑えるには、処理アドレスを前もって変数に設定しておく上記の方法が有利です。

(2008/01)

この情報はお役にたちましたか?


同じ割り込み要求を多重に受けてしまいます。[78K0]

FAQ-ID : 78int-0001最終更新日 : 2002/06

Q-1
優先順位が低い割り込み要因の処理ルーチンで、すぐに EIで割り込みを許可していますが、 同じ割り込み要求を多重に受けてしまいます。
A-1
単純に割り込みを許可すると、同じ割り込みも許可されてしまいます。 そのような場合には、自分自身の割り込み要求をマスクしてください。

この情報はお役にたちましたか?


多重割り込み処理方法 [78K0]

FAQ-ID : 78int-0002最終更新日 : 2002/05

Q-1
3レベル以上の多重割り込みを行うにはどのようにすればよいでしょうか?
A-1
 78K0の割り込みには2レベルの優先度を設定できます。 また、これとは別に既に定められたディフォールト優先度があり、 この2つにより各割り込みの優先度が決まります。
 同時に発生 (CPUが割り込み受け付け可能になった時点で発生) している割り込みは、 優先順位指定の高い方が受け付けられます。
優先順位指定が同じならディフォールト優先度の高い方が受け付けられます。
 この優先順位指定機能を使用することにより、2レベルまでの多重割り込みは簡単に実現できます。
 しかし、2レベル以上の多重割り込みを使用する場合には処理に注意が必要です。

 基本的には割り込みマスク機能を使用することになります。

 INTP0~INTP3 の4つの割り込み要因を使って説明します。
この4つを優先度が高い方から

 INTP2INTP3INTP0INTP1

として使用する場合を考えます。このとき、PPR0, PPR1 は 1 に設定し、PPR2, PPR3 は 0 に設定します。
 各割り込みで必要な処理は以下のようになります。また、処理フローを別紙に示します。

(1) INTP2 受け付け中の処理 [処理フロー(1)]
 この割り込みが最優先ですので、一切の割り込みを受け付ける必要はありません。
従って、この処理中には割り込みを禁止したままにします。

(2) INTP3 受け付け中の処理 [処理フロー(2)]
 この割り込みの処理中にも INTP2 は受け付ける必要があります。
また、INTP0, INTP1 は受け付けないようにする必要があります。

 INTP3 は高優先順位の割り込みに指定してあるので、その実行中は PSW の中の ISP フラグが 0 になり、 低優先順位の割り込みに指定してある INTP0, INTP1 は自動的に禁止されます。

 従って、単純に割り込みを許可すればよいように考えられます。 しかしながら、INTP3 割り込み処理中に INTP3 が再度入る可能性があるときには、 INTP3 も禁止する必要があります。

このためには割り込みマスク・フラグ PMK3 をセットしてから割り込みを許可する必要があります。
 また、割り込みから抜ける前に、割り込みを禁止し、PMK3をクリアします。

[多重割り込みフロー(1),(2)](4Kbytes)

(3) INTP0 受け付け中の処理 [処理フロー(3)]
 この割り込み処理中には INTP2, INTP3 だけを受け付ける必要があります。 また、自分自身及び INTP1 は受け付けないようにする必要があります。

 このためには、割り込みを許可する前に、PMK1の値を保存しておき、 PMK0, PMK1 をセットしておく必要があります。
 また、割り込みから抜ける前に、割り込みを禁止し、PMK0をクリアします。
また、前もって保存しておいたPKM1の状態を復帰させます。

(4) INTP1 受け付け中の処理 [処理フロー(4)]
 この割り込み処理中には自分自身以外 (INTP2, INTP3, INTP0) を受け付ける必要があるため、 割り込みを許可する前に PMK1 をセットする必要があります。
また、割り込みから抜ける前に、割り込みを禁止し、PMK1 をクリアします。

[多重割り込みフロー(3),(4)](5Kbytes)

この情報はお役にたちましたか?


TM0フリーランによるリモコン受信時の割り込みモード設定 [78K0]

FAQ-ID : 78int-0003

Q-1
uPD780053で、INTP0割り込みを使用して TM0フリーラン状態でリモコン受信を行い、 有効エッジの指定を随時変更する場合の、INTM0(外部割り込みモード・レジスタ0)の設定方法について。
ユーザーズ・マニュアル には、「INTP0有効エッジは TMC01-TMC03を 0に設定し、タイマを停止させたのちに設定してください。」 と記述していますが、 アプリケーション・ノート の「フリーランによるリモコン受信」では、 INTP0割り込み内で INTP0有効エッジの指定をタイマの動作を停止させずに行っています。
INTM0設定は、タイマを停止させずに行えるのでしょうか?
A-1
UMの記述は INTP0/TI00/P00端子を TI00として使用する場合のように、 この端子からの信号をタイマ0 で使用している場合を意識した注意事項です。
お問い合わせのように、タイマ0 は内部クロックによるフリーランの PWMモードで動作し、 TI00としては使用していない場合には、有効エッジを切り替えてもタイマ0 に影響は与えません。

この情報はお役にたちましたか?


割り込み要求フラグ待ちをしていると割り込みがかからない [共通]

FAQ-ID : 78int-0004

Q-1
UART送信中に8ビットの割り込み要求フラグが立っているにも関わらず、 8ビット・タイマの割り込みが発生しません。
理由とその対処方法を教えてください。
[プログラム]
    do{
    } while (STIF == 0);
A-1
STIFがセットされるのを待っているところの命令に問題があります。
この do~while文 は BF命令に置き換えられ、自分自身への分岐処理となります。
一方、割り込み要求フラグに対するアクセスが行われている時には、割り込み要求が保留されてしまいます。
つまり、この STIFがセットされるのを待っているところでは、 割り込み要求が保留されて受け付けられません。

do { } の中に何かダミーの命令を書いて、そこで割り込み要求を受け付けられるようにしてください。
例えば、プログラムの頭に
     #pragma NOP

  と書いて、

    do{
       NOP();
       NOP();
    } while (STIF == 0);
のように変更してみてください。

この情報はお役にたちましたか?


サブシステム・クロックで動作中に、他の割り込みが発生した場合 [共通]

FAQ-ID : 78int-0005

Q-1
uPD78058で、割り込みでHALT解除しサブシステム・クロックで動作している時に、他の割り込みが発生した場合、 後の割り込みが取れないということは基本的にはない、と考えてよいのでしょうか?
A-1
はい、そうです。
基本的に、お問い合わせの状況で割り込みが取れないようなことはありません。
表23-1 の右端に記載されたように動作しない機能はございますが、 それ以外の動作している機能の割り込み要求フラグがたたないことはありません。

参照資料:
ユーザーズ・マニュアル「uPD78058F, 78058FYサブシリーズ」

この情報はお役にたちましたか?


サブシステム・クロックで HALT中における割り込み時のクロック [共通]

FAQ-ID : 78int-0006最終更新日 : 2001/08

Q-1
サブシステム・クロック動作&メイン・システム・クロック停止状態で HALTモードに入れた後、 それをマスクされてない割り込みで解除した場合、ベクタ割り込み処理が行われますが、 そのベクタ割り込み処理は、そのままサブシステム・クロックで動作するのでしょうか?
A-1
はい、そのままサブシステム・クロックで動作します。
なお、HALTモードをマスクされていない割り込みで解除してもベクタ割り込み処理が行われるとはかぎりません。
CPUが DI状態であれば、単に HALTモードが解除されるだけで、ベクタ処理は行いません。

この情報はお役にたちましたか?

Q-2
このベクタ割り込みをメイン・クロックで動作させるためには、 ベクタ割り込みの最初に CPUクロックをメイン・クロックにするという命令を入れる必要があるのですか?
A-2
いいえ、単純にそれだけではダメです。
HALTモードが解除された後でメイン・クロックの発振を開始させ、 発振が安定してからメイン・クロックに切り替える必要があります。

この情報はお役にたちましたか?


リセット直後に割り込み要求は受け付けられるか? [共通]

FAQ-ID : 78int-0007

Q-1
リセット後にシステムが起動してから、ユーザ・プログラムを実行するまでの間に、 外部割り込み要求が発生した場合、それを受け付けることはできますか?
A-1
いいえ、受け付けません。
リセット後のレジスタは、割り込み要求なし、割り込み処理不許可の状態にイニシャライズされますので、 外部割り込み要求は受け付けられない状態になっています。
各製品のユーザーズ・マニュアルで、リセット入力後の状態をご覧ください。

この情報はお役にたちましたか?


割り込み要求フラグ・レジスタ IF0Lのフラグを消さないようにするには? [共通]

FAQ-ID : 78int-0008最終更新日 : 2004/02

Q-1
uPD78F0034Aで、IF0Lをソフトで書き込む際、 処理ビット以外のフラグを消さないようにするには、どのようにすればよいのでしょうか?
IF0Lに書き込む直前で PSWの IEを禁止にするだけで可能でしょうか?
A-1
残念ながら、PSWの操作では対応できません。
方法としてはビット操作命令 (clr1やset1) を用いて、 目的のビットだけを操作するようにしてください。
これにより IF0Lの他のビットに配置された割り込み要求フラグは影響を受けなくて済みます。

この情報はお役にたちましたか?


割り込み要求フラグのクリアにより他の割り込みを受け付けなくなります。 [共通]

FAQ-ID : 78int-0009最終更新日 : 2004/02

Q-1
C言語での開発において、IF0 &= 0xfe; というような記述で要求フラグをクリアしていたところ、 リード後からライトまでの間のタイミングで、同一レジスタの他ビットの要求フラグがセットされ、 その後ライト動作で再クリアされ割り込みを受け付けない事態が発生しました。
そこで、クリアをビット命令 __asm("clr1 IF0,0"); に置き換えたところ、 問題なく動作を受け付けるようになりましたが、これは単に確率の問題でしょうか?
ビット操作命令もリード・モディファイ・ライトになっているという記述が FAQにありましたので、 確率が減っただけでは無いと思われますが。
A-1
ビット操作命令を用いることで問題はなくなります。

この情報はお役にたちましたか?


割り込み要求パルス幅は、規格より短くても有効となるか? [共通]

FAQ-ID : 78int-0010

Q-1
データ・シートに割り込み要求パルス幅は MIN 10uS とありますが、 4uS のパルスでも受け付けています。
このようなことは、あり得るのでしょうか。
A-1
はい、あり得ます。
「10uS」はこれだけの幅があれば、確実に受け付けることを保証した値であり、 これ以下は受け付けないと保証した値ではありません。
デバイスによってはノイズ除去回路が内蔵されていて、 短いパルス状のノイズを除去できる場合がありますが、 そこで除去できない場合もありますので、 規格より短い割り込み要求パルスは使用しないようにしてください。

また、電圧に関しては、(Vddが 2.2V以上の時) 0.2Vdd以下であれば確実にロウ・レベルですので、 これ以下のノイズ・レベルは全く問題ありません。
これ以上の値についてはデバイスの製造上のばらつきがあり保証できません。

この情報はお役にたちましたか?


外部割り込みの処理はどのタイミングで実行されるのか? [78K4]

FAQ-ID : 78int-0011

Q-1
uPD784218Aで、内部クロックに同期しない外部割り込み要求が入った場合、 どのタイミングで処理を開始するのか?
A-1
プログラムの実行状態で異なり、どこと断定はできません。
まず、エッジ検出が行われますが、ここで最大 10uS程度は遅れると考えてください。
次に、割り込み要求フラグがセットされ、8クロックで優先順位等の判定が行われます (ユーザーズ・マニュアル 図23-43参照)。

ユーザーズ・マニュアルの「23.9 割り込み要求およびマクロ・サービスが一時的に保留される場合」 に記載された命令を実行中には、 受け付けが8クロック分の時間だけ保留されます。
割り込み要求が受け付けられると、動作状況(どこでプログラムが動作しているか、 スタックがどこにあるか等)に応じて、 表23-7 に示す時間かかって実際の割り込み処理ルーチンに分岐します。

この情報はお役にたちましたか?


パワーオン時の処理に分岐させたい。(割り込み機能を初期状態に戻す) [78K4]

FAQ-ID : 78int-0012最終更新日 : 2001/08

Q-1
ウォッチドッグ・タイマ割り込み処理から、パワーオン時の処理に分岐させると、 その後の割り込み要求を受け付けなくなってしまいます。
A-1
この対策としては ISPR が 0 になるまで RETI 命令を実行してください。
具体的な方法はユーザーズ・マニュアル「割り込み機能を初期状態に戻す方法」 にプログラム例が記載されておりますので、そちらを参照ください。

この情報はお役にたちましたか?


クロック同期式シリアルのマクロ・サービスで1バイトの受信をしたい [78K4]

FAQ-ID : 78int-0013

Q-1
uPD784038で、クロック同期式シリアル通信の受信にマクロ・サービスを使いたいのですが、 主な使用例にクロック同期式シリアルによるデータ転送の記述があります。
1バイトの受信を行いたいのですが MSCを 1にすればよいですか?
A-1
はい、そうです。MSCには転送したいデータ数をセットしてください。

この情報はお役にたちましたか?

Q-2
マクロ・サービスで取り込んだデータは、どのように取り出すのですか?
A-2
マクロ・サービスで受信したデータは、マクロ・サービス・バッファに格納されていますから、 プログラムによりそこから読み出してください。

この情報はお役にたちましたか?


マクロ・サービス中に割り込み要求は受け付けないのか? [78K4]

FAQ-ID : 78int-0014最終更新日 : 2004/02

Q-1
uPD784214で、マクロ・サービス実行中(スタート後、終了割り込み要求発生まで) は、 他の割り込み要求は受け付けられないのでしょうか?
A-1
いいえ、違います。
マクロ・サービス実行中には、割り込み要求は受け付けませんが、 終了割り込み要求が発生するまでということではありません。

マクロ・サービス処理のタイミング・チャートを示します。
マクロ・サービス中には実際にマクロ・サービスで転送を行っている期間 (A) と CPUが命令を実行している期間 (B) があります。
この内、期間(A) では割り込み要求を受け付けないという事であり、 期間(B) では割り込み要求受け付け可能であれば、 マクロ・サービス中であっても割り込みを受け付けます。

[マクロ・サービス処理のタイミング・チャート](5Kbytes)

この情報はお役にたちましたか?


マクロ・サービス実行はメインのプログラムの動作に影響を及ぼさないか? [78K4]

FAQ-ID : 78int-0015

Q-1
78K4のマクロ・サービス機能を使ってシリアルI/Oのデータ転送を行いますが、 このデータ転送中は、メインのプログラムの動作に影響を及ぼさないのでしょうか。
A-1
いいえ、マクロ・サービスはプログラムの実行を中断して実行します。
例えばタイプAでは 1回の転送を行うのに 24クロックの期間が必要で、この間は CPUのプログラム実行は停止します。 8MHzの発振子を使用すると、動作クロックは最大でこの半分の 4MHzとなります。
すると 1Mbpsでは 75%はプログラムが実行できないことになります。

この情報はお役にたちましたか?


C言語でマクロ・サービスを使用する方法は? [78K4]

FAQ-ID : 78int-0016

Q-1
C言語でのマクロ・サービスの記述方法を教えてください。
A-1
基本的にC言語ではマクロ・サービスはサポート致しておりません。
(プログラムの処理で間に合わないような場合にマクロ・サービスを使用する事になりますが、 C言語ではこのような時間的に問題がある場合には不向きです。アセンブラでの記述をお勧め致します。)

あえてやるとすると、マクロ・サービス・チャネルを構造体で定義して、それをsaddr1領域に配置し、 コントロール・ワードに関してはコンパイラではこれらのアドレスは予約されていないので、 これを定義していただく必要がございます。後は定義した変数に値を代入するだけです。

この情報はお役にたちましたか?























ページの終わりです
ページの先頭へ戻る