H8マイコンでLチカに再挑戦
LEDを光らせることに成功したので、こちら今度は点滅させるプログラムを作ります。いわゆるLチカというやつですね。
パソコンのプログラムでは一番簡単な練習としてハローワールドがありますが、マイコンのプログラムでこれに対応するのがLチカです。
点滅させるためにタイマー割り込みを利用することにしました。
普通のLチカではループを用いると思うのですが、割り込みが入るのでプログラムとしては難しくなります。
コードは下記の通り
#include <stdio.h>
#include "D:\work\yh8\tomolib3664\3664f.h"
#include "D:\work\yh8\tomolib3664\tomo3664.h"
int i =1;
/*
H83664
マイコン
楽天 の動作試験
1秒ごとの割込みをしてLチカ
*/
int main(void)
{
//port8-0を出力にセットする
iniIo( '8' , 0 , 1 );
//タイマースタート
startTma(1);
//無限ループ
while(1){;}
return(0);
}
void interrupt timertsta(void)
{
unsigned char tmp;
//IRR1の6Bit目、IRRTA(TIMERA割り込み時に立つBit)をクリア
tmp = IRR1 ; tmp = tmp & ( ~0x40 ); IRR1 = tmp ;
if( i==1 ){
//port8-0出力をLにセット
setIo( '8' , 0 , 0 );
i=0;
}else{
//port8-0出力をHにセット
setIo( '8' , 0 , 1 );
i=1;
}
return;
}
意外と簡単ですね。
Main関数の中で、Port8を出力に設定し、
iniIo( '8' , 0 , 1 );
タイマーをスタートさせます。
startTma(1);
この後は無限ループに入ります。
while(1){;}
タイマーを設定したので一秒ごとに割り込みが入ります。
割り込みが入ると、無限ループから割り込み関数timertsta(void)の中に処理が移ります。
無限ループ内ではまずタイマー割り込みフラッグをクリアしています。
tmp = IRR1 ; tmp = tmp & ( ~0x40 ); IRR1 = tmp ;
これをクリアしないと、割り込み関数が終わったらまたすぐに割り込み関数に入ってしまいいます。なので必ずクリアする必要があります。
この後LEDに接続している出力端子がLであればH、HであればLに設定しています。
if( i==1 ){
//port8-0出力をLにセット
setIo( '8' , 0 , 0 );
i=0;
}else{
//port8-0出力をHにセット
setIo( '8' , 0 , 1 );
i=1;
}
割り込み関数が終わると再び処理は無限ループの中に持って行きます。
タイマー割り込み
H8-3694マイコンにはいくつかタイマー用意されています。タイマーAには秒単位で割り込みができるように、専用のクリスタルが取り付けてあります。
タイマーAを使うと簡単に時計ができるわけですね。
ライブラリに入っているスタートTMA関数の機能とコードは以下の通り。
機能 タイマーA割り込みのインターバルをセットし、インターバルごとの割り込みを開始させる。
引数 インターバルを指定。
1 ならば 1 Sec
2 ならば 0.5 Sec
3 ならば 0.25 Sec
4 ならば 0.03125 Sec
返り値 0正常終了。-1、異常
必ず割り込み先の処理を作っておくこと。
この関数で発生する割り込みのVectorAddは19番(H'0028-H'0029)。
char startTma( unsigned char inter )
{
unsigned char tmp;
switch( inter )
{
case 1: TMA = 0x08 ; break ; //1秒間隔で割り込み
case 2: TMA = 0x09 ; break ; //0.5秒間隔で割り込み
case 3: TMA = 0x0A ; break ; //0.25秒間隔で割り込み
case 4: TMA = 0x0B ; break ; //0.03125秒間隔で割り込み
default: return -1; break; //エラーで返る
}
//IRR1の6Bit目、IRRTA(TIMERA割り込み時に立つBit)をクリアしておく
tmp = IRR1 ;
tmp = (tmp & ( ~0x40 ));
IRR1 = tmp ;
/* IENR1.BIT.IENTA = 1 ; enable Timer A overflow interrupt */
//TIMERAの割り込みを許可する.
tmp = IENR1 ;
tmp = (tmp | 0x40) ;
IENR1 = tmp ;
return 0 ;
}
startTma()に1を渡すと、ちょうど1秒ごとの割込みをかけることが出来ます。
TMAは割り込み間隔を設定するための数値を入れるアドレス
IRR1は割り込み時にたつフラグを入れるアドレス
IENR1割り込みを許可するためのフラグを入れるアドレスです。
タイマーで割り込みが入ると、アイコンはアドレス19番に書かれているアドレスに書かれている命令を実行する仕組みになっています。
割り込みと割り込み関数の接続は、IDEの設定から行なっています。
最終更新日: 2020-09-29 10:16:56