本実験では,マイコンチップM16C/62Aを使用する.このマイコンチップ用に提供されている開発環境を使用してプログラミングを行い,組込機器用のプログラムの基礎を学ぶ.開発環境にはC言語のコンパイラNC30が含まれている.NC30は,通常のANSI規格に対応したコンパイラである.C言語の一般的な説明は次を参照すること.
普通のC言語と同じだが,組込用のプログラムでは次の点に注意すること.
パソコン上でのプログラムと組込み用プログラムの違いのポイントは,次になる.
パソコン用:
このため,より具体的に説明すると
さらに,次のことを理解した方が望ましい.
NC30で,LCDボード上で動作するトグルスイッチを使った8ビットの足し算(春学期の実験課題と同じ)を書くと次のようになる.このプログラムではまず8個のトグルスイッチに適当な二進数を設定しスイッチ9(sw9)を押すとLEDにその内容が表示され,その次にまた適当な二進数を設定しなおしてスイッチ10(sw10)を押すと先ほどの値と足し算された結果がLEDに表示される.いわゆる電卓のような動作を行う(ただし8ビットの足し算しかできない).
#include "sfr62a.h" //ヘッダファイル読込 #define PORTIN 0x00 //定数の定義 #define PORTOUT 0xff #define LEDOFF 0xff #define SW9_MASK 0x04 #define SW10_MASK 0x08 void main( void ) { unsigned char val = 0; //変数の宣言 p7 = LEDOFF; //代入文 pd7 = PORTOUT; pd3 = PORTIN; pd8 = PORTIN; for( ; ; ) //繰り返し文, 無限ループ { while( p8 & SW9_MASK )//繰り返し文とビット演算 { } val = ~p3; //代入文とビット演算 p7 = ~val; //代入文とビット演算 while( p8 & SW10_MASK )//繰り返し文とビット演算 { } val += ~p3; //代入文とビット演算 p7 = ~val; //代入文 } }
1行目では,一般のプログラムで使われている「stdio.h」ではなく,ヘッダファイル「sfr62a.h」を読み込んでいる.これはあらかじめこちらで用意したM16c用のヘッダファイルで,このC言語のプログラムと同じ場所においておく.このヘッダファイルには,M16cの制御用レジスタなどが定義されている.
例えば,プログラム内で使用されている「p7」や「pd7」がそれである.次の形式で,ポートそのものとそのポートに対応する方向レジスタを参照できる.ヘッダファイルの中で定義されているため,プログラム内では宣言せずにいきなり代入している.そのほかのポートも同様に
pポート番号 //ポートの本体 pdポート番号 //方向レジスタ
という形式で利用できる.このプログラムで利用しているLCDボードのポートは
ポート番号 | 入出力装置 |
---|---|
3 | トグルスイッチ(8bit) |
7 | LED(8bit) |
8 | スイッチ9とスイッチ10 |
春学期で学んだとおり,入力装置の場合には対応する方向レジスタに0,出力装置の場合には1を設定しなければならない.
基本的に組込用のプログラムは終了せずに,無限にループさせることが前提である.組込み機器ではプログラムを終了すると機器を完全停止させる以外にないため,電源スイッチを切るまでは動作し続けさせた方がよい.
このため,このプログラムでは,同じ動作をひたすら繰り返している.まずスイッチ9を読み込んで,スイッチが押されるまで待つ.そしてスイッチが押されたら,トグルスイッチを読み込んで,変数varに記憶させる.そしてその値でLEDを点灯,今度はスイッチ10が押されるまで待つ.スイッチ10が押されたら先ほどのvarの値と新しくトグルスイッチの値を読み込んで足し算を行い,結果をLEDに表示している.