H83694マイコンでLED点灯
必要なものを買い揃えたのでこちら、次は試しに動かしてみます。
マイコンではHello Worldの代わりにLチカ(LEDを点滅させること)しますが、点滅させる前に、単純にLEDを光らせてみようと思います。
プログラム
これだけ書きましたほんの少しですね。
#include
#include "d:\work\yh8\tomolib3664\3664f.h"
int main(void)
{
iniIo( '8' , 0 , 1 );
setIo( '8' , 0 , 1 );
return(0);
}
mainの中が実行する内容です。
iniIo('8',0,1);
はIOポートの設定をしています
ポート8の0番を出力に設定してくださいという意味です。
setIo('8',0,1);
は出力に設定したポート8の0番をHにしてくださいという意味です。
この二つの関数はライブラリ「tomo3664」の中に入っています。
ライブラリの中を覗くと関数がどう書かれているかがわかります。
関数iniIoの機能と中身
関数の説明は以下の通り
機能 指定port、bitno番目の端子のioの入出力を指定する。
引数1 port=1文字'1'等で指定。
指定できる文字は 1,5,7,8 のみ。
引数2 bitno=0~7を指定。ただし、ない番号もあるので注意。ない番号を指定してもERRにならない。
引数3 io:1=出力0=入力に指定する。
返り値0=正常-1=異常
Port1 0-2,4-7bitが使用可能。3bitは読み込むと常に1
Port2 0-2 まであるが、SCI通信用に使うので使用しない
Port5 0-7 使用可能。但しBit6-7はI2C通信が優先して使用するので注意。
Port7 4-6 使用可能。
Port8 0-7 大電流IOPort。
PortB 0-7 入力Port。AD入力と兼用。AD入力の設定がされていない場合使用できる。
最初からIportなので、IO指定はない。
関数はこんな風に記述しています。
char iniIo(char port, unsigned char bitno, unsigned char io)
{
unsigned char tmp;
switch(port){
case '1' :
if(io==1){tmp = PCR1 ; tmp= tmp|(1<<bitno) ; PCR1 =tmp; } //bitno番目の端子を出力に設定
if(io==0){tmp = PCR1; tmp=tmp & (~(1<<bitno));PCR1=tmp;} //bitno番目の端子を入力に設定
break;
case '5' :
if(io==1){tmp = PCR5 ; tmp= tmp|(1<<bitno) ; PCR5 =tmp; } //bitno番目の端子を出力に設定
if(io==0){tmp = PCR5; tmp=tmp & (~(1<<bitno));PCR5=tmp;} //bitno番目の端子を入力に設定
break;
case '7' :
if(io==1){tmp = PCR7 ; tmp= tmp|(1<<bitno) ; PCR7 =tmp; } //bitno番目の端子を出力に設定
if(io==0){tmp = PCR7; tmp=tmp & (~(1<<bitno));PCR7=tmp;} //bitno番目の端子を入力に設定
break;
case '8' :
if(io==1){tmp = PCR8 ; tmp= tmp|(1<<bitno) ; PCR8 =tmp; } //bitno番目の端子を出力に設定
if(io==0){tmp = PCR8; tmp=tmp & (~(1<<bitno));PCR8=tmp;} //bitno番目の端子を入力に設定
break;
default: return -1; break;
}/*switch*/
return 0;
}
コードの中に出てくるPCR8などの変数は、「3664f.h」の中で定義されています
#definePCR8(*((unsignedchar*)0xFFEB))
と書かれてあって、アドレス0xFFEB番地をPCR8と読み替えています。
0xFFEBは16進数で、10進数では65499になります。
実世界で置き換えると「65515番地は田中さんのお宅」と置き換えるようなものです。
マイコン
楽天 では特定のアドレスをマイコン自身の設定に使っています。
アドレス65515番の0ビット目を1にセットすると、ポート8の0番端子が出力に設定されます。
関数setIoの機能と中身
この関数は出力にセットした端子の値をLにするかHにするか設定します。
関数の説明は以下の通り
機能 指定port、bitno番目の端子のl/hを指定する。Y_iniio()で出力に指定してから用いる。
引数1 port=1文字'1'等で指定。
指定できる文字は 1,5,7,8 のみ。
引数2 bitno=0~7 セットするBit番号。Portによってないものもあるので注意。
引数3 lh: 1=H 0=L に設定する。0,1以外を指定してもerr処理を行わない。
返値 0=正常 -1=異常
関数はこんな風に記述しています。
char setIo(char port, unsigned char bitno, unsigned char lh)
{
unsigned char tmp;
switch( port ){
case '1' :
if( lh==1 ){tmp = PDR1 ; tmp= tmp| (1<<bitno) ;PDR1 =tmp;}
if( lh==0 ){tmp = PDR1 ; tmp=tmp & (~(1<<bitno));PDR1 =tmp;}
break;
case '5' :
if( lh==1 ){tmp = PDR5 ; tmp= tmp| (1<<bitno) ;PDR5 =tmp;}
if( lh==0 ){tmp = PDR5 ; tmp=tmp & (~(1<<bitno));PDR5 =tmp;}
break;
case '7' :
if( lh==1 ){tmp = PDR7 ; tmp= tmp| (1<<bitno) ;PDR7 =tmp;}
if( lh==0 ){tmp = PDR7 ; tmp=tmp & (~(1<<bitno));PDR7 =tmp;}
break;
case '8' :
if( lh==1 ){tmp = PDR8 ; tmp= tmp| (1<<bitno) ;PDR8 =tmp;}
if( lh==0 ){tmp = PDR8 ; tmp=tmp & (~(1<<bitno));PDR8 =tmp;}
break;
default: return -1; break;
}/*switch*/
return 0;
}
PDR8は「3664f.h」の中で
#definePDR8(*((unsignedchar*)0xFFDB))
と定義されています。
PCR8は端子を出力にするか入力にするかの設定でしたが、
TDR8は出力に設定した端子の状態をLにするかHにするかの設定をしています。
LEDを光らせるための回路
回路について考えます。プログラムがうまく動いているかどうかは、そのままでは分かりません。
パソコンであればモニターに何か表示されるので動いているかどうか確認できますが、マイコンでは基本的な状態では出力装置が付いていないので、
ソフトウェアを書き込んでもうまく動いてるかどうかはそのままでは確認できないのです。
今回は秋月電子通商から購入したマイコンボードを使っているので、このボードをそのまま使います。
マイコンボードはマイコンと電源、マイコンとパソコンをつなぐだけではなく、LED等も実装されています。
ボードの回路は下の図です
ここからLEDの部分だけを取り出すと、下の図のような回路になっています。
P8ポートの0と1の端子がLEDに接続されています。スイッチを介して5ボルトと0ボルト(HとL)に接続されています。
元々動作確認用にこの部分の回路は付けられているようです。ジャンパースイッチが付いているので、不要な時はジャンパースイッチを抜いておきます。
下の写真では、P8-0のジャンパースイッチだけ付けています。
0と1の端子は出力にしてLHを切り替えればLEDを光らせることができます。0vに接続されているので、端子をHにすれば点灯、Lにすれば消灯します。
端子2は入力に設定しておいて、スイッチによって電圧LかHを検出することができます。端子2を誤って出力にしてしまうと、ショートしてしまうので、気をつける必要があります。
ジャンパースイッチは使わない時は外しておいた方がいいでしょう。
プログラムでは、P8ポートの0端子をセットしているので、0に繋がるジャンパースイッチをつなげておけば、LEDが光ってくれるはずです。
プログラムの書き込み
このあたりはIDEがやってくれるので、かなり簡単です。コンパイルした後、エラーがなければファイルをマイコンに送ります。
マイコンのジャンパースイッチを繋げると書き込みモードになるのでジャンパースイッチをつなぎます。
実行モード
書き込みモモー
パソコンとマイコンをRS232Cケーブルで接続し、マイコンの電源をオンにします。
この状態でIDEの送信ボタンを押せば書き込みが完了です。
プログラムの実行
マイコンの電源をいったん落として、書き込みモード用のジャンパースイッチを外します。
再度電源を入れなおすと、プログラムが動いてLEDが見事点灯します。
やりましたね!
最終更新日: 2020-09-24 14:00:07