基礎編の最近のブログ記事

 基礎編は今回で第30回目(最終回)になりました.今回はH8マイコン・ボードのプッシュ・スイッチを使ってLEDを点灯/消灯させてみます.
 これまでプログラムの作成はmain 関数のみでしたが,ここではポートの初期設定,スイッチ入力やLEDを点灯させる機能を関数として記述してみましょう.プログラムを関数化すると,プログラム全体が簡潔になってわかりやすくなり,また部品として再利用できるためプログラムを作成する効率が上がります.さらに,他人が作った関数プログラムも共有財産として使用できるようになります.

 前回はPWMによるLEDの調光のしくみからH8/36064マイコンに内蔵されているタイマZモジュールの構造やレジスタの機能について解説しました.今回はタイマZモジュール機能を使ったLEDの明るさを変化させる簡単なC言語プログラムを作ってみましょう.H8初心者にとっては,実際にH8マイコンを使ってLEDの明るさを変化させてみることで,前回説明したモジュールを制御するレジスタなどの理解が深まると思います.

■タイマZによるPWMモードの動作
 タイマZによるPWMモードの動作例を図1に示します.LED2(橙) はFTIOB1端子に接続されています.端子の制御にはチャネル1用のタイマ・カウンタ(TCNT_1)を使用します.
(1) リセットした直後の最初のコンペアマッチが起こるまでのタイマ出力(FTIOB1端子出力)は'1'("H")です.TSTRレジスタのSTR1ビットを'1'に設定するとTCNT_1は0x0000からカウントアップを開始します.
(2) TCNT_1がGRB_1の設定値と一致(コンペアマッチB)のとき,FTIOB1端子出力が'0'("L")になります.
(3) TCNT_1がGRA_1の設定値と一致(コンペアマッチA)のとき,FTIOB1端子出力が'1'("H")になります.
(4) また,コンペアマッチAのときTCNT_1がクリアされ,再び0x0000からカウントアップを開始して(2)~(4)を繰り返します.図1に示すように,パルス幅WはGRB_1の設定値,パルス周期TはGRA_1の設定値で決まるPWM波形がFTIOB1端子から出力されます.

zu01.jpg
 <図1>タイマZによるPWMモードの動作例
 マイコンにはわりと正確な時間を刻んでいる時計のようなもの「タイマ・モジュール」があります.基礎編の第25回では,汎用的な8ビット・タイマである「タイマV」を使って圧電ブザーを鳴らしてみました.今回は本格的な16ビット・タイマである「タイマZ」を紹介します.そしてタイマZを使ってLEDの明るさを自由に変えられる調光にチャレンジしてみましょう.

■LEDの明るさを変える調光のしくみ
 基礎編の第9回で,モニタを使いながらLEDを点灯/消灯させる実験をしましたね.今回は38番ピン(P65/FTIOB1)に接続されているLED2(橙)の明るさを変化させてみましょう.図1に示すようにLEDのアノード側は+3.3Vの電源に接続され,カソード側は100Ωの抵抗を介してH8マイコンの入出力ポートに接続されています.このように接続すると,ポートに"L"('0')を出力するとLEDが点灯し,逆にポートを"H"('1')にするとLEDが消灯します.

p1.jpg
<写真1>LED2(橙)の点灯のようす
su1.jpg
<図1>LED2(橙)とH8マイコンとの接続

 ところで,H8マイコンのポートは"L"('0')と"H"('1')の二つの状態しか出力することができません.しかし,このL"('0')と"H"('1')の二つの状態をすばやく切り換えることで,人間の目にはLEDが連続して発光しているように見えるのです.
 つまり,図2に示すようにPWM(Pulse Width Modulation)と呼ばれる1周期に対するHighの時間比率(デューティ比)を変えた信号を使うことでLEDの明るさを変えることができます.LEDは"L"('0')出力で点灯するため,(a)のようにデューティ比を小さくすると点灯している割り合が大きくなり,LEDが明るく発光しているように見えます.逆に(b)のようにデューティ比を大きくすると消灯している割合が大きくなり,LEDが暗く発光しているように見えます.
zu2.jpg
<図2>PWM信号波形とLEDの点灯/消灯の関係

■H8/36064マイコンには5種類のタイマ・モジュールがある
 基礎編の第25回でも説明しましたが,表1に示すようにH8/36064マイコンには,タイマB1,タイマV,タイマZ,14ビットPWM,ウォッチ・ドッグ・タイマタイマの五つのタイマ・モジュールが内蔵されています.今回 LEDの調光には,本格的な16ビット・タイマである「タイマZ」を使います.

<表1>H8/36064マイコンのタイマ・モジュールの種類と特徴

hyo1.JPG 表1のタイマZの特徴として,「アウトプットコンペア」,「インプットキャプチャ」という機能があります.アウトプット・コンペアは,ある規則性をもった信号を出力してくれる機能です.一方,インプット・キャプチャはその反対の機能です.ある規則性をもつ信号の長さを計測してレジスタに格納するというものです.LEDの調光にはアウトプット・コンペアを使います.

■タイマZの内部構造
 タイマZの内部構成は図3のようになっています.FTIOA0~D0端子,FTIOA1~D1端子の合計8端子がタイマZの入出力端子です.LED2(橙)はFTIOB1端子に接続されています.
 カウンタの入力クロックは4種類の内部クロック(φ,φ/2,φ/4,φ/8)もしくは外部クロックから選択可能です.タイマZはチャネル0とチャネル1の2つのタイマをもって,それぞれ独立して動作させることができます.
zu3.jpg
<図3>タイマZの内部ブロック構造

 タイマZ関連のレジスタは大きく3分類され,
  • チャネル共通レジスタ:6種類
  • チャネル0用レジスタ:11種類
  • チャネル1用レジスタ:11種類
というように多くのレジスタがあります.

■チャネル共通の主なレジスタ
 チャネル共通のレジスタには,TSTR,TMDR,TPMR,TFCR,TOER,TOCRの6種類があります.ここではLEDの調光に必要なレジスタ(TSTR,TPMR,TOER)について紹介します.

●タイマ・スタート・レジスタ(TSTR)
 TSTRレジスタはタイマ・カウンタ(TCNT_0,TCNT_1)の動作/停止を制御します.TSTRレジスタのビット構成を図4に示します.STR1ビットはチャネル1用のタイマ・カウンタ(TCNT_1)を制御し,STR0ビットはチャネル0用のタイマ・カウンタ(TCNT_0)を制御します.LED2(橙)の制御にはチャネル1用のタイマ・カウンタ(TCNT_1)を使用します.

zu4.jpg
<図4>TSTRレジスタのビット構成

zu4.jpg

●タイマPWM モード・レジスタ(TPMR)
 TPMRレジスタは出力端子をPWM モードに設定します.TPMRレジスタのビット構成を図5に示します.LED2(橙)はFTIOB1端子に接続されているため,ここではPWMB1ビットでFTIOB1端子をPWM モードに設定します.
zu5.jpg
<図5>TPMRレジスタのビット構成

●タイマ・アウトプット・マスタ・イネーブル・レジスタ(TOER)
 TOERレジスタはタイマZの出力を許可/禁止します.TOERレジスタのビット構成を図6に示します.LED2(橙)はFTIOB1端子に接続されています.ここではEB1ビットでFTIOB1端子の出力を許可します.注意する点としてはリセット後の値(デフォルト)が'1'になっていることです.PWMモードとして動作させるためには,このビットを'0'に設定しなければなりません.

zu6.jpg
<図6>TOERレジスタのビット構成

■各チャネル用の主なレジスタ
 チャネル0用とチャネル1用のレジスタには,それぞれTCNT,GRA,GRB,GRC,GRD,TCR,TIORA,TIORC,TSR,TIER,POCRの11種類のレジスタがあります.ここではLEDの調光に必要なレジスタ(TCNT,GRA,GRB,TCR)について紹介します.

●タイマ・カウンタ(TCNT)
 TCNT は16 ビットのリード/ライト可能なレジスタで,各チャネルに1 本,計2 本あります.入力したクロックによりカウント動作します.

●ジェネラル・レジスタA,B,C,D(GRA,GRB,GRC,GRD)

 GRA~GRDレジスタ は16 ビットのリード/ライト可能なレジスタで,各チャネルにそれぞれ4 本,計8 本あります.PWM動作などアウトプット・コンペア・レジスタとして使用しているときは,GRA~GRDレジスタとTCNTレジスタの値は常に比較されています.

●タイマ・コントロール・レジスタ(TCR)
 TCRレジスタはタイマ・カウンタ(TCNT)のカウンタ・クロックの選択やカウンタ・クリア要因の選択などを行います.TCRレジスタは各チャネルに1 本,計2 本のTCR があります.TCRレジスタのビット構成を図7に示します.ここではTPSC2~TPSC0ビットで内部クロックのφ/4を選択し,CCLR2~CCLR0ビットでTCNTをクリアするジェネラル・レジスタをGRAとして選択するようにします.

zu7.jpg
<図7>TCRレジスタのビット構成

 今回は,PWMによるLEDの調光のしくみからH8/36064マイコンに内蔵されているタイマZモジュールの構造やレジスタの機能について解説しました.
 次回は,LEDの明るさを変化させる簡単なC言語プログラムを作ってみましょう.H8初心者にとっては,実際にH8マイコンを使ってLEDの明るさを変化させてみることで,今回説明したレジスタの理解が深まると思います.それでは,がんばっていきましょう!

< Yoshihito Shimada >
 前回はA-D変換の基礎知識からH8/36064マイコンに内蔵されているA-D変換モジュールの構造やレジスタの機能について解説しました.今回はA -D変換モジュール機能を使って電圧を測定する簡単なC言語プログラムを作ってみましょう.電圧を測定する場合には,ちょっとした外付け回路を組みますが,ここではブレッドボードを使ってみたいと思います.ブレッドボードは部品のリード線を穴に挿入することで着脱可能な配線ができます.はんだ付けが不要 ですので,初心者でも安心して回路を組み立てて実験することができると思います.
 最後に,A-D変換とタイマ・モジュール機能を応用して,光センサに入射する光の強さによって圧電ブザーの音程が変わるプログラムも紹介したいと思います.

これだけは注意!A-D変換入力端子の電圧範囲
 A-D変換モジュール機能の動作を確認する前に,重要な注意事項があります.A-D変換入力端子の絶対最大定格は「-0.3~AVcc+0.3」で,アナログ電源AVccの電圧は+3.3Vです.したがって,A-D変換入力端子には絶対に負電圧や+3.3V以上の電圧を印加してはいけません.これだけは 必ず守ってください.万が一,印加した場合はH8マイコンが永久破壊をしてしまいます.
 H8マイコン・ボードの外付け電源端子には単三乾電池1.5V×4本(+6V)で駆動したり,USBバスパワー(+5V)で駆動したりしていますが,H8 マイコンには電源レギュレータICによって,+3.3Vに定電圧化されています.決して+5Vではありません.くれぐれも注意してください.

■ブレッドボードを使ってA-D変換モジュール機能の動作確認をしてみよう!

 写真1にA-D変換モジュール機能の動作確認のようすを示します.ちょっとした回路の動作確認をするには,写真1に示すようなブレッドボードが大変便利です.

p001.jpg
<写真1>A-D変換モジュール機能の動作確認のようす

●ブレッドボード上に回路を組み立てる
 写真2にブレッドボード上の回路の外観を示します.ビニール線や,部品のリード線をブレッドボードの穴に挿入して結線します.はんだ付けが不要で,部品の抜き差しで回路変更が容易なためとても重宝します


hyou002.JPG
<写真2>測定用ボード(ブレッドボード)の外観

●A-D変換モジュール機能の動作確認回路

 図1にA-D変換モジュール機能の動作確認を行った回路を示します.AN1コネクタの +3.3V端子(1番ピン),PB0端子(4番ピン),GND端子(3番ピン)を使用します.PB0端子には+3.3V端子とGND端子間にそれぞれ ショットキー・バリア・ダイオードD1とD2を接続しています.このダイオードは順方向電圧が0.3V以下であれば過電圧入力に対して端子が保護されます.VRはPB0端子に入力する電圧調整用の可変抵抗です.ここでは10kΩの半固定抵抗器を使いました.

zu001.jpg
<図1>A-D変換モジュール機能の動作確認回路の構成

■A-D変換モジュールの各種レジスタの設定

 それでは,前回に登場したA-D変換モジュールの各種レジスタについて思い出してみましょう.表1に各種レジスタをまとめてみました.なるべく初期設定 で動作する初心者向けのC言語プログラムの作成をしていきます.
 A-D変換動作は単一モードでアナログ入力チャネルはデフォルトのAN0を選択します.つ まりA-D変換結果が格納されるレジスタはADDRAです.ここで設定するレジスタはADCSR で,A-D変換の開始を制御するADSTビットと,A-D変換の終了を示すADFフラグ・ビットになります.

<表1>各種レジスタと設定値

hyou001.JPG
(注1)赤字のレジスタおよびビットを設定する.それ以外は初期値のままで設定は省略可.

■A-D変換の動作確認用のプログラムを書いてみよう!

 A-D変換モジュール機能を使用してAN0端子に入力される電圧を測定します.A-D変換の動作確認用のプログラムを作成するということで,ワークスペース名には「AD_test_ver1」という名前をつけたいと思います.リスト1にC言語プログラムのソース・リストを示します.

<リスト1>A-D変換の動作確認用のプログラム(AD_test_ver1.c)のソース・リスト

#include "iodefine.h"                //(1) I/Oレジスタ定義ファイル

 

void main(void)

{                                     //(2) データを格納する変数

    volatile unsigned int *data = (unsigned int *)0xfa00;

 

    while(1){                         //(3) 単一モードの繰り返し

        AD.ADCSR.BIT.ADST = 1;        //(4) A-D変換開始

        while(AD.ADCSR.BIT.ADF == 0); //(5) A-D変換の終了を待つ

        *data = AD.ADDRA;             //(6) A-D変換データの格納

        *data = *data >> 6;           //(7) 6ビット右へシフト

        AD.ADCSR.BIT.ADF = 0;         //(8) フラグをクリア

   }

}
●プログラムの概要
 リスト1に示したコメント(1)~(8)の順にプログラムの流れを説明していきます.
(1) I/Oレジスタ定義ファイル・・・main関数の前にI/Oレジスタ定義ファイルを取り込みます.これでA-D変換モジュールに関するレジスタやビット名が定義され,アドレスを記述する作業などを省略することができます.I/Oレジスタ定義ファイルについては基礎編の第21回に解説があります.
(2) データを格納する変数・・・RAM領域にA-D変換データを格納するポインタ変数を定義します.ここではA-Dデータ・レジスタ(ADDRA)の値 を,16ビットのデータとして受け取るためunsigned int型の変数とし,未使用のRAM領域(アドレスH'FA00)に格納します.
(3) 単一モードの繰り返し・・・単一A-D変換をwhile文で繰り返し実行することで,A-D変換を連続的にすることができます.
(4) A-D変換開始・・・ADSTビットはA-D変換の開始を制御するビットです. ADSTビットを'1'にセットするとA-D 変換を開始します.
(5) A-D変換の終了を待つ・・・ADFビットはA-D変換が終了すると'1'にセットされるフラグ・ビットです.while文を使ってADFビットが'1'になるまで待ちます.
(6) A-D変換データの格納・・・A-Dデータレジスタ(ADDRA)の値を,まず16ビットのデータとして受け取ってRAM領域(アドレスH'FA00)に格納します.
(7) 6ビット右へシフト・・・ここで「シフト演算子」と呼ばれるビット演算子を使ってデータを操作します.<< は左シフト,>> は右シフトさせるビット演算子です.この演算子は,たとえば下記のように使います.
    a = a << 1;    // 1 ビット左へシフト
    a = a >> 2;    // 2 ビット右へシフト
 10 ビットのA-D変換データはA-Dデータレジスタ(ADDRA)のビット15からビット6に格納されます.そのため,ここでは右シフトさせるビット演算子 >> を使って図2のように6ビット右にシフトさせています.
(8) フラグをクリア・・・ADFビットは(5)でA-D変換が終了して'1'にセットされています.次のA-D変換を実行するために'0'にクリアして戻しておきましょう.

zu002.jpg
<図2>右に6ビットシフトさせたときのビットのようす

■モニタを使ってA-D変換モジュール機能の動作確認をしてみよう!

 HEWでC言語プログラムを作成してビルドしたら,モニタプログラム専用通信ソフト[Hterm]を起動してロードモジュールファイル(AD_test_ver1.abs)をダウンロードします.

●ソース・リストを表示してブレークポイントを設定する
 それではモニタを使ってA-D変換モジュール機能の動作確認をしてみましょう.[表示]メニューから「AD_test_ver1.c」をクリックする と,図3に示すようなソース・リストが表示されます.プログラムは単一モードでA-D変換を繰り返し実行するため,「(6) A-D変換データの格納」の行にブレークポイントを設定しておくとよいでしょう.

zu003.jpg

<図3>Htermのソースウィンドウでブレークポイントを設定

●A-Dモジュール関連のレジスタを表示する

 [表示]メニューから[Peripheral]を選択すると,周辺機能を選択するウィンドウ(図4)が開きます.ここで調べたい周辺機能を選択すると, 関連したレジスタのビット構成とその値が表示されます.ここでは「A/D」を選択して[OK]ボタンをクリックしてみましょう.

zu004.jpg
<図4>周辺機能を選択するウィンドウ

 すると,図5に示すようなA-D変換モジュール機能に関するレジスタが表示されます.ここではADDRAレジスタの値に着目します.

zu005.jpg
<図5>Peripheralウィンドウに表示されたA-D変換モジュール機能の関連レジスタ

●メモリ内容を表示する

 [表示]-[Memory]を選択するとメモリ情報を指定するウィンドウ(図6)が開きます.ここではA-D変換データが格納されるアドレス「H'FA00」を指定し,表示個数は「1個」,サイズは「ワード」を選択しておきます.

zu006.jpg
<図6>メモリ情報の指定

●プログラムを実行してA-D変換する

 まずは,A-D入力端子をVCC(+3.3V)に接続します(H8マイコン・ボードAN1コネクタの1ピンと4ピンからの配線を接続します).それでは HtermのコンソールからGコマンドを実行してみましょう.すると,指定したブレークポイントで一時停止します.このとき図7に示すように,ADCSR レジスタの7ビット目であるADFビットが'1'に変化していると思います.
 つまり,この時点でA-D変換が終了していることを示しています.さて,ここ でPeripheralウィンドウに表示されたADDRAレジスタ値に着目してみましょう.値はFFC0になっています.

zu007.jpg
<図7>プログラム実行後のPeripheralウィンドウに表示されたA-D変換モジュール機能の関連レジスタ

●ステップ実行(Pstep)してRAMに格納されたデータを確かめる

 それでは[F11]キーを押して順次Pstepコマンドを実行していきましょう.ここでは図8に示すように,Memoryウィンドウに表示されたアドレ スH'FA00の値の変化に着目します.1回目のPstepコマンドの実行で値がFFC0になります.このときADDRAレジスタのA-D変換データが格納されたことがわかります.さらにPstepコマンドを実行すると値が03FFに変化します.これは6ビット右にシフトしたためです.

zu008.jpg
<図8>ステップ実行(Pstep)して格納されたデータをMemoryウィンドウで確認する

 データ採取の要領がわかったところで,外付け回路の可変抵抗器VRを回してA-D入力端子の電圧を変化させてみましょう.表2にA-D変換結果をまとめてみました.実験の値と理論値を比べてみると,概ね一致していることがわかります.理論値は次式より求まります.

  理論値(10進表示) = 1023 × Vin[V]/3.3[V]

<表2>A-D変換データの理論値と実測値

hyou0002.JPG (注2)( )内の数値は10進表示

■A-D変換を使って光センサで圧電ブザーの音程を変えてみよう!
 うまく電圧が計測できたでしょうか.さて,前々回ではタイマ・モジュール機能を使って圧電ブザーを鳴らしてみました.そこで光センサの出力電圧をA-D変換し,そのデータを用いてタイマVのTCORAレジスタの値を変更してみましょう.光センサに入射する光の強さによって圧電ブザーの音程が変わることがわかります.光を強くすると光センサの出力電圧が下がり,TCORAレジスタの値が小さくなって音程が上がります.逆に光を当てないと光センサの出力電圧 が上がり,TCORAレジスタの値が大きくなって音程が下がります.リスト2にC言語プログラムのソース・リストを示します.
 TCORAレジスタは8ビットですので256以上の数値は使用できません.A-D変換データは10ビットです.そこで,A-D変換データの上位8ビット分をTCORAレジスタへ代入することにします.ここでは右シフトさせるビット演算子 >> を使ってADDRAレジスタの値を8ビット右にシフトさせています

<リスト2>光センサで圧電ブザーの音程を変えるプログラム(AD_test_ver2.c)のソース・リスト

#include "iodefine.h"

 

void main(void)

{

    unsigned int data;

 

    TV.TCRV0.BIT.CCLR = 1; // コンペアマッチA でTCNTVクリア

    TV.TCSRV.BIT.OS = 3;   // コンペアマッチAでトグル出力

    TV.TCRV1.BIT.ICKS = 1; // TCNTV入力クロックの設定

    TV.TCRV0.BIT.CKS = 3;  // 内部クロックφ/128で動作開始

 

    while(1){                         // 単一モードの繰り返し

        AD.ADCSR.BIT.ADST = 1;        // A-D変換開始

        while(AD.ADCSR.BIT.ADF == 0); // A-D変換の終了を待つ

        data = AD.ADDRA;              // A-D変換データの格納

        data = data >> 8;             // 8ビット右へシフト

        TV.TCORA = (unsigned char)data; // 周期(音程)の設定

        AD.ADCSR.BIT.ADF = 0;         // フラグをクリア

   }

}
 A-D変換モジュール機能を使ってみた感想はいかがでしたか.次回は,H8マイコンのタイマZモジュール機能ついて解説します.出力パルス幅を可変することでLEDの明るさを可変する調光にも挑戦します.お楽しみに!

< Yoshihito Shimada >

 一般的にコンピュータは,「ON」か「OFF」か('1'か'0'か)の電気信号によるディジタル量を扱って情報を処理する機械です.自然界の物理量の ほとんどはアナログ量ですので,ディジタル量に変換する必要があります.アナログからディジタルへ変換するインターフェースがA-D変換器です.H8 /36064マイコンには10ビットのA-D変換モジュールが内蔵されています.
 さて,ここで「アナログ」と「ディジタル」という言葉が出てきました.身近な例でいうと,短針と長針で時間を表す従来式時計がアナログで,数字で表す時計がディジタルです.一般的には,「連続量をアナログ,離散量をディジタル」といっています.
 応用編で紹介しているビュートチェーサ(ライントレース・ロボット)にはQRB1134という光センサ(写真1)が搭載されています.光センサの出力電圧をH8/36064マイコンのA-D変換モジュールを使って測定すると光の強度がわかるしくみになっています.そこで今回はA-D変換の基礎知識から学んでいきましょう.

p01.jpg
<写真1>H8マイコン・ボードに接続する光センサQRB1134(フォト・リフレクタ)の外観



 前回はI/Oポートの出力レベルを"H"('1'),"L"('0')と単に変化させて圧電ブザーを鳴らしてみました.forループの回数を増減させる ことで出力レベルの時間を調整し,圧電ブザーの音程を変えることができました.しかし,この方法では正確な音程を出すことが難しいですよね.マイコンには わりと正確な時間を刻んでいる時計のようなもの「タイマ・モジュール」があります.このタイマ・モジュールを使うとforループを使うより正確な音程を出 力することができます.そこで,今回はタイマ・モジュールを使って圧電ブザーを鳴らしてみましょう.
 これまでH8マイコン・ボードにある二つのLEDを点灯/消灯させながら動作確認をしてきました.H8マイコンボードには圧電ブザー(写真1)も搭載されています.今回はLEDを点灯/消灯させる要領で簡易的に圧電ブザーを鳴らしてみましょう.
 
p1.jpg
<写真1>H8マイコン・ボード[VS-WRC003]の外観
 これまでC言語プログラムでH8マイコン・ボードのLEDを点灯/消灯させてきましたが,内部I/Oレジスタのアドレスをソース・リストに直接埋め込んで いました.たとえば,メイン・プログラムの中に「0xffe9」のような具体的な数値を埋め込むことはプログラム作成のミスを誘発しやすくなり,可読性や可搬性 の面であまり好ましくはありません.あとでプログラム・リストを読んだとき何が何だがわからなくなりますし,ほかのH8マイコンへプログラムを移植する際にも困難になります.
 H8マイコンは,内部I/Oレジスタに値を設定することによって各種機能を実現します.内部I/O レジスタは百種類以上もありますから,大規模なプログラムになれば大量のアドレスを扱わなければなりません.H8/36064マイコンを使っているかぎり, 内部I/O レジスタのアドレスは変わることはありません.そこで各種マイコンの内部I/Oレジスタを定義しているファイルがルネサステクノロジから提供されています.今回はI/Oレジスタ定義ファイルを活用してスマートなプログラム作りをしてみましょう.

まずは新規にプロジェクトワークスペースを作成する
 基礎編の第11回でLED点滅プログラムを作成しましたが,今回はI/Oレジスタ定義ファイルを活用してLEDを点滅させるプログラムを作成したいと思います.まずは新規にプロジェクトワークスペースを作成しましょう.プロジェクトワークスペースの作成方法の詳細については基礎編の第10回を見てください.
 新規プロジェクトワークスペースの入力画面で「ワークスペース名」を入力します.第11回で作成した「led_blink」と区別するため,今回は図1に示すように「led_blink_rev1」という名前で新たにプログラムを作成したいと思います.
 これまでいくつかプログラム例を示してきましたが,「*」の付いた変数「*pdr」が出てきています.これは「ポインタ変数」と呼ばれ,H8マイコンの C言語プログラムではアドレスを指定してデータをやりとりする重要な用途に使われます
 そこで,今回はこのポインタについて解説していきましょう.「ポイ ンタを知らずにC言語プログラミングを語れない」と言われるほどポインタの概念はとても重要です.ポインタからC言語がわからなくなったという話もよく耳 にします.初心者にとってポインタの概念を理解することは,一般的に鬼門と言われておりますが,頑張っていきしょう.イメージさえつかむことができれば,それほどポインタは難しいものではありませんよ.
 H8マイコンなどのハードウェアに近い分野のC言語プログラミングでは「volatile」というキーワードをよく見かけます.volatile 修飾子はパソコン上で動かすC言語プログラムを書く人だとあまり使わない(縁がない)かもしれません.しかし,H8マイコンなどのC言語プログラミングで は,volatile修飾子の使い方や存在意義を知らないと予期せぬ不具合に見舞われることがあります
 そこで今回は,volatile修飾子について解説します.H8マイコンの基礎編では試しながら学べるように例題プログラムを掲載していきます.実際にH8マイコンを動かしながら「習うより慣れろ」と いった軽い気持ちで頑張っていきましょう.

■HEWのコンパイラはプログラムを最適化して実行形式のファイルを作ってくれる
 HEWでビルドを実行すると,コンパイラと呼ばれるソフトウェアがC言語のソース・プログラムをH8マイコンが実行できる形式のファイル(ロード・モ ジュール)に変換してくれます.このとき,コンパイラはプログラムをできるだけコンパクトに最適化しようとします.つまり実行する命令が少なくなれば,そ れだけプログラムを格納するのに必要なメモリが節約でき,さらに実行する速さが向上するわけです.
 volatile 修飾子はコンパイラによる最適化を抑制するためのキーワードです.ではなぜ,この機能をわざわざ抑制しなければならないのでしょうか? 次に説明していくことにしましょう.





このアーカイブについて

このページには、過去に書かれたブログ記事のうち基礎編カテゴリに属しているものが含まれています。

前のカテゴリはローバー編です。

次のカテゴリは応用編です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

/*yahoo remove*/