ともさんのHP >ものつくり >電子工作 >H8マイコン >H8マイコンでLチカ

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

ともさんのHP >ものつくり >電子工作 >H8マイコン >H8マイコンでLチカ

広告
新着ページ

柿の落葉病・防除と対策  
柿の枝の剪定方法  
キャベツと白菜とブロッコリーを同時に育てる  
H8でLED点灯  
AKIH83694FをPCに接続  
H8マイコン  
小屋を立て直す  
情報カードのデータベース化  
雑草でグリーンカーテン  
ミシン机(テーブル)の自作  
USBカメラで天体写真撮影  

他のサイト

3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます