マイコン:AKI H8/3048F
開発環境:GCC Developer Lite
マイコンとパソコンをRS-232Cケーブルでつないでいます。
ハイパーターミナルを使用して、マイコンを制御したいと考えております。
それで、パソコンのキーボードから入力があった時だけ、割り込みを実行したいです。
割り込みが無い場合は、パソコンでマイコンを制御することができたのですが、割り込みを追加したら、うまくいかなくなりました。
アセンブラを使用せずに、C言語だけでプログラムを完成させたいと思っています。
SCI1からの割り込み処理をするには、どの様にしたらよいのでしょうか?
どうか、お願いいたします。
No.3ベストアンサー
- 回答日時:
>void int_rxi1(void)
>{
> DI; /*ここで他のプログラムの割り込みを禁止*/
> /*割り込みで実行させたいプログラム*/
> EI; /*割り込み許可にしてプログラムを終了*/
>}
I.割込み処理ルーチンではDI,EIを行ってはいけません。
以下に示すように割込みの禁止はハードウェアがやってくれます。
割込み禁止解除は割込み処理が終了したとき実行されるRTE命令で
行われます。
------------ H8/3048ハードウェアマニュアル --------------------
4.1.2 例外処理の動作
例外処理は、各例外処理要因により起動されます。
トラップ命令および割り込み例外処理は、次のように動作します。
(1) プログラムカウンタ(PC)とコンディションコードレジスタ(CCR)をスタックに退避しま
す。
(2) CCRの割り込みマスクビットを1にセットします。
(3) 起動要因に対応するベクタアドレスを生成し、そのベクタアドレスの内容が示す番地からプ
ログラムの実行が開始されます。
【注】リセット例外処理の場合は上記(2)、(3)の動作を行います。
-------------------------------------------------------------------
II.割込み処理関数には#pragma interrupt を付けます。
#pragma interrupt
void int_rxi1(void)
{
}
なお、#pragma と関数宣言の間にコメントを入れてはいけません。
一種のおまじないです。
III. 割込み処理関数では少なくとも以下の2つを実行する。
(1)SCI1.RDRを適切な場所に保存
(2)SCI1.SCR.BIT.RDFをクリア
デバッガを使えるなら、割込み処理の入り口で止めて動作を
確認して下さい。
この回答への補足
細かく解説を交えながらご回答していただき、ありがとうございます。
これで自分でも割り込み処理を行えそうです。
ありがとうございました。
No.4
- 回答日時:
割り込みフラグの処理の問題だと思います。
過去に作ったプログラムを載せますので、参考にして下さい。
今動かして見たのですが、3048と3052とで仮想割り込みベクタのアドレスを変えているためか、直ぐには動かなかった。
でも過去に動いた筈だから、参考になると思います。
プログラムの内容は忘れましたが、割り込み処理で受信データをそのまま送信する、エコーバック処理だったと思います。
揃っていなくて見苦しいけれど、コピーしてタブを4にすれば綺麗に揃うかも知れません。
元は綺麗に揃っています。
/*********************************
*インクルード・ファイル*
*********************************/
#include<3048F.H>/**/
/*********************************
*グローバル(共通)変数*
*********************************/
volatile charSCI_BUFF[40];/*SCIの送受信バッファ*/
/*********************************
*main プログラム*
*********************************/
voidmain(void)
{EI();/* 割り込み許可*/
SCI1.SCR.BIT.RIE = 1;/* 受信割り込み許可*/
while(1){};/* 永久ループ*/
}
/*********************************
*割り込み処理*
*********************************/
#pragma interrupt(INT_ERI_1)/* 56SCI-1受信エラー*/
#pragma interrupt(INT_RXI_1)/* 57SCI-1受信*/
#pragma interrupt(INT_TXI_1)/* 58SCI-1送信*/
/*--------------------------------------------------------------*/
void INT_ERI_1(void)/* 56SCI-1受信エラー*/
{SCI1.SSR.BYTE &= 0xC7 ;}/* エラーフラグをリセット*/
/*--------------------------------------------------------------*/
void INT_RXI_1(void)/* 57SCI-1受信*/
{SCI1.SSR.BIT.RDRF = 0 ;/* 受信フラグリセット*/
SCI_BUFF[0] = SCI1.RDR ;/* 受信データをバッファに転送*/
SCI1.SCR.BIT.TIE = 1 ;/* 送信割り込み許可*/
}
/*--------------------------------------------------------------*/
void INT_TXI_1(void)/* 58SCI-1送信*/
{SCI1.TDR = SCI_BUFF[0] ;/* バッファから送信データに転送*/
SCI1.SSR.BIT.TDRE = 0 ;/* 送信開始*/
SCI1.SCR.BIT.TIE = 0 ;/* 送信割り込み禁止*/
}
/*-------------interrupt.C------------------------------------*/
No.2
- 回答日時:
No.1 です。
割込みがどんなものであるか分かっているようですから以下のページの
割込の項を読んで下さい。
http://wave.iobb.net/doc/h8/index.html#_Toc99442 …
分からない事があったら、再度質問して下さい。
この回答への補足
#include<3048.h>
#define EI asm("andc.b #0x3f,ccr")/*割り込み許可*/
#define DI asm("orc.b #0xc0,ccr")/*割り込み禁止*/
void int_rxi1(void)__attribute__((interrupt_handler));
main(){
/*何かしらのプログラム*/
SCI1.SCR.BIT.RIE = 1;
EI;
while(1){
/*基本は無限ループで割り込みがあった場合に抜けるループ*/
}
void int_rxi1(void)
{
DI; /*ここで他のプログラムの割り込みを禁止*/
/*割り込みで実行させたいプログラム*/
EI; /*割り込み許可にしてプログラムを終了*/
}
ここまでは分かったのですが、SCI1のパソコンからの入力信号で割り込みをするには、ここからどうすればよいでしょうか??
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 1つのタクトスイッチで複数の並列回路を閉じ、アースにつなげることができるスイッチはありますか。 2 2022/08/06 10:38
- IT・エンジニアリング アドレス空間(メモリマップ)について教えてください。 マイコンには必ずメモリマップが記載されています 3 2022/06/17 09:42
- ドライブ・ストレージ SSDを追加したら昔のHDDがおかしくなった 4 2023/03/23 13:25
- 郵便・宅配 クロネコヤマトについて、持ち込み発送を簡単に済ませるには?(集荷と比べて面倒) 3 2023/02/08 23:58
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(パソコン・スマホ・電化製品) LINUXPCに詳しい人に気楽に答えてほしい質問です。 2 2022/10/25 08:07
- 教育ソフト・学習ソフト vbsで分割した値をそれぞれの変数に 1 2022/10/17 19:52
- アプリ swiftでスマホアプリを開発した時の動作確認 1 2023/02/14 11:37
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Visual Basic(VBA) 1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読 4 2022/10/17 20:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6でSendKeyを利用したTab移動...
-
USJでの割り込み
-
マイコン C言語 割り込み処理...
-
電車乗車時、並んでいるのに割...
-
(H8マイコン)タイマ割込で変更...
-
CPU負荷率の安全な上限と計...
-
ゲームプログラマーは優秀なの?
-
【組込み】割り込み中のstatic...
-
H8マイコンでの割り込み(シリ...
-
C-Builder OnChangeをマスク
-
CPUの処理量を減らすコーデ...
-
PICでタイマー割込み(mikroC V...
-
電車で待機列の割り込みについ...
-
SH2 (SH7144)のソフトウェアス...
-
スーパーのレジで並んでいたら...
-
Protools8 Mbox...
-
Amazonfireタブレットにわから...
-
sleep関数の原理について
-
アセンブラのタイマー割り込み
-
ウォッチドッグタイマ(WDT)の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
このレジの並び方は間違ってま...
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
ショッピング
-
CPUの処理量を減らすコーデ...
-
一定時間操作がなかったら、と...
-
CPU負荷率の安全な上限と計...
-
pic 複数の割り込み関数 切り分...
-
Amazonfireタブレットにわから...
-
【組込み】割り込み中のstatic...
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
駅のトイレでナイチンに邪魔さ...
-
インバウンドで迷惑している人...
-
PICのSleepからの復帰に関して
-
PICでのプログラムによるチャタ...
-
実行した後、どうしてもフリー...
-
PICで内部タイマーを使わずカウ...
-
SH2のタイマ出力
-
割り込み中に例外異常
おすすめ情報