C言語

マイコンの基本知識

制御系、組み込みのプログラムを作成するためには、マイコンの知識が必要になってきます。
今回は、RL78マイコンを学ぶ前に、マイコン全般の基本的な知識について学びます。

マイコンの基本的な構成

マイコンは、CPUの他にメモリや入出力装置をつなぐ周辺機能などによって構成されています。

CPU

CPUには、プログラムカウンタ、命令デコード、演算、CPU内部レジスタなどから構成されています。

  • プログラムカウンタ
    次に実行するプログラムの位置を示すアドレスが保存されているレジスタです。
  • 命令デコード
    メモリから読み込んだ命令を解読し、その結果に基づいて演算の実行準備を行います。
  • 演算(演算回路)
    演算するための回路です。算術演算、論理積、論理和などの論理演算を行います。
  • CPU内部レジスタ
    CPU内部に用意された一時的なデータを保存する場所です。演算する値や演算結果を保存する汎用レジスタや、命令を一時的に保存しておく命令レジスタなどのレジスタがあります。
    メモリのデータを一時的に汎用レジスタにコピーして、その汎用レジスタを使用して演算回路が演算を行います。
    このレジスタはハードウェアでCPUに直結しているため、メモリよりも高速にアクセスできます。

メモリ

メモリは大きく分けて、ROMとRAMがあります。

  • ROM
    書き込んだデータは消去できませんが、電源を切ってもデータが消えない読み出し専用のメモリです。
    主に、プログラムやプログラムの実行中に変化することがない定数などを保存します。
    また、ROMとして、フラッシュROMを搭載しているマイコンがあります。フラッシュROMは電源を切ってもデータは消えませんが、データを書き換えることができます。
  • RAM
    データの読み書きはできますが、電源を切るとデータが消えるメモリです。
    プログラムの変数などを保存します。

周辺機能

マイコンの周辺機能には、マイコンと外部の装置を入力したり出力したりするIOポート、そして、AD/DAコンバータタイマカウンタシリアル通信割り込みなどのさまざまな機能のハードウェア回路が内蔵されています。
マイコンは、この周辺機能のデータや設定値、ステータスなどを保存しておくレジスタが用意されています。これを制御レジスタといいます。
この制御レジスタは、マイコンにより名称や使用方法が異なります。また、同じメーカーのマイコンでも種類によっても異なります。
このC言語入門では、RL78/G14マイコンを使用しますが、ここで学んだことは、他のマイコンを使うときが来ても、必ず役に立つので安心してください。それは、マイコンの周辺機能は同じようなものであり、似ているところがあるからです。

よく使用する周辺機能の説明

これから、マイコンを使用してプログラミングを行っていくうえで、制御レジスタについて知っておく必要があります。
ここでは、制御レジスタの使い方を学ぶ前に、マイコンでよく使用されている代表的な周辺機能のI/Oポート、タイマ、リアルタイムクロック、ウォッチドッグ、A/Dコンバータ、シリアル通信、割り込みの機能について、簡単に概要を説明しようと思います。

IOポート

マイコンの周りには、銀色の線がたくさん付いているかと思います。これをピンと呼びます。
これらのピンの先には、スイッチや、センサー、モーター、LEDなど、様々な周辺装置とつながっています。
そして、このピンは、IOポートと呼ばれるマイコンの機能につながっています。
プログラムからIOポートの機能を使って、スイッチのON/OFFの情報を受け取ったり、LEDを点灯/消灯されたりします。

タイマ

キッチンタイマーと基本的には同じイメージでよいかと思います。タイマの時間をセットして、セットした時間が経過すると通知を出します。
通知が出されると、この後に説明する割り込み機能が働き、割り込みによって関数が呼び出されて、処理を行います。

マイコンによりますが、タイマのカウントは、マイコンのクロック(1秒間に何回発振するかを表す値)をもとにカウントする機能と、外部からの信号によりカウントする機能があります。
クロックの場合は、1カウントの時間は、クロック数に依存します。これは、クロック32MHzだったとした場合、1カウントは、31.25ナノ秒という非常に短い時間になってしまい、例えば、1秒間カウントしたいと思ったら、31,000,000をカウントしなければなりません。しかし、カウントのサイズが2バイトだった場合は、サイズオーバーのため、1秒間のタイマを作れないことになります。このため、大抵のマイコンには、分周してクロックを低くすることにより、長い時間でもカウントできるようにする機能が備わっています。

リアルタイムクロック(RTC)

現在時刻を読み取ったり、特定の日時を設定したりすることができる機能です。
タイマと同じようにクロックを使用して時刻を刻みます。電源がOFFでも時刻機能は維持されます。

ウォッチドッグ

簡単に言うと、マイコンの暴走を監視するタイマです。
タイマと同じようなイメージですが、こちらは、タイマ時間が経過してしまうと、マイコンがリセットされます。
このため、定期的にウォッチドッグのタイマをクリアする必要があります。
使用方法は、例えば、10ms周期の処理があり、10ms毎に定期的な処理を行っている場合、ウォッチドッグのタイムアウト時間を20msとし、ウォッチドッグのタイマをクリアするのは10ms周期毎の処理の先頭で行うとします。
この場合、本来ならタイムアウトになることはないのですが、どこかの処理で無限ループとなってしまい、10ms毎に行うはずの処理が行えなくなります。すると、ウォッチドッグタイマのクリアが行えないため、20msを経過し、マイコンがリセットをかけるという流れになります。こうすることにより、おかしくなった動作をリセットし、最初からやり直してくれるという機能がウォッチドッグの役割となります。

A/Dコンバータ

アナログ信号をデジタルデータの値に変換するインターフェースがA/Dコンバータです。
マイコンは、0/1の2進数しか認識できません。例えば、5Vで動作しているマイコンなら、5Vか0Vのどちらかで処理されます。もし、1Vを読みたいと思っても0として認識するかもしれません。
そこで、5Vでも0Vでもない電圧をマイコンが認識できるように、A/Dコンバータが必要になってきます。
そして、A/Dコンバータには、分解能というものがあります。10ビットや12ビットなどがあります。例えば、分解能が10ビットで、基準電圧が5Vの場合は、0V~5Vの範囲を0~1023の範囲で表現できることになります。また、1LSB=0.0048828125Vとなります。また、入力電圧÷基準電圧×分解能となりますので、入力が1Vの場合、A/D変換した値は、204となります。

考え方はこのようになりますが、入力元の仕様に依存する場合もあります。

シリアル通信

マイコンと周辺装置とデータのやりとりをするのに、シリアル通信を使用します。シリアル通信は、1本の端子を使用して1ビット毎にデータを転送します。
シリアル通信で代表的なのが、UART通信、CAN通信、LIN通信、SPI通信、I2C通信などです。
これらの違いについて簡単に紹介します。

  • UART通信
    開始と終了の合図を決めておいて、その合図にしたがってデータを転送する方式です。
    開始の合図をスタートビット、終了の合図をストップビットとよび、その間にデータを挟んで通信します。
  • CAN通信
    フレームと呼ばれる単位で通信が行われ、データを必要とする端末からリモートフレームが送信され、そのデータを持つ端末からデータフレームを返すことで通信が成り立っています。
  • LIN通信
    CAN通信に似ていますが、CAN通信は、端末間に優劣がないマルチマスター方式なのに対し、LIN通信は、端末間に優劣のある1つのマスタとなっているシングルマスター方式です。
    CAN通信より通信速度は落ちますが安価なのが特徴です。
  • SPI通信
    クロックに同期させてデータの転送を行います。
    SPIでは、クロック、データ入力、データ出力、チップセレクトの4本の信号が必要になります。
    通信はマスターとスレーブに分けて、クロックはマスターから出力され、入出力はクロックに同期します。
  • I2C通信
    クロックに同期させてデータの転送を行います。
    I2Cでは、クロック、データ入出力の2本の信号が必要になります。
    こちらもマスターとスレーブに分けて、クロックはマスターから出力され、入出力はクロックに同期します。

割り込み

タイマ、シリアル通信など各ペリフェラルには割り込みイベントと呼ばれる機能が多数あり、ハードウェアによる割り込みが発生するたびに割り込みハンドラと呼ばれる処理内容を記載した機能ブロックが呼び出されて割り込み処理を実行します。
マイコンは、割り込み処理が呼び出されるようにするために、ベクタテーブルと呼ばれるものがあります。これは、割り込み処理の開始アドレスを登録したテーブルです。
割り込み要因が発生すると、その要因に該当するベクタテーブルに記載されているアドレスを参照しに行くことで、割り込み処理に分岐します。
割り込み処理が終わった後は、通常の処理に復帰する命令を実行し、通常の処理に復帰できるようになっています。

以上がマイコンの基本的な知識についてでした。
これから、マイコンを使ったプログラミングを行っていくときに、これらの周辺機能のレジスタ設定や、レジスタの値を参照したり、しながらマイコン機能を使って周辺装置とのやり取りを行っていきます。

-C言語