見出し画像

ATMEGAで学習しよう(プログラム記述編)

<はじめに>


プログラムはC 言語で記述しています。
特に難しい書き方はしていないつもりですので、理解に困るということは無いと思いますが、ビット操作についてはマイコンではよく使うので説明をしておきます。

A レジスタのB ビット目を1 にするには、A |= (1<<B) と書きます。
なお、A レジスタのB ビット目が1 であった場合にこの操作を行っても1 のままです。
(まれに特殊なレジスタで1 にする操作で0 になるものがあります。そういったものはレッスン中で説明します)

また、+でつなげることで、いくつものビットを1 にすることができます。
例えば、A |= ((1<<B)+(1<<C)+(1<<D)) と書けば、A レジスタのB、C、D ビット目を1 にします。
このとき、A レジスタの他のビットは影響を受けません。つまり1 なら1 のまま、0 なら0 のままです。

しかし、A = ((1<<B)+(1<<C)+(1<<D))と書くと、A レジスタのB、C、D ビット目を1 にするとともに、他のビットを0 にしてしまいます。
本書では基本的にレジスタ操作は|=を用いていますが、レジスタの他のビットを強制的に0 にしたい場合や0 にしても問題ない場合は、|=ではなく=を使っています。
なお、連結部分に+を用いていますが、ここをor 記号|を用いても構いません。

すなわち、A |= ((1<<B)+(1<<C)+(1<<D)) を A |= ((1<<B)|(1<<C)|(1<<D)) にすることや、A = ((1<<B)+(1<<C)+(1<<D)) を A = ((1<<B)|(1<<C)|(1<<D)) にすることは同じ動作となります。
主観になりますが、+にしたほうが見やすいので本書では+による連結を採用しています。

逆にA レジスタのB ビット目を0 にするには、
A &= ~(1<<B) と書きます。
なお、A レジスタのB ビット目が0 であった場合にこの操作を行っても0 のままです。

また、複数ビットをつなげることはできないので、複数のビットを0 にする場合は縦に並べて書いています。
A レジスタのB ビット目を反転(0 なら1、1 なら0)にするには、A ^= (1<<B) と書きます。

こちらも複数ビットをつなげることはできないので、複数のビットを反転する場合は縦に並べて書くことになります。
なお、反転することをトグルと呼んだりします。

また、レジスタ説明でアドレス、I/O アドレスと書いていますが、アセンブラでプログラミングする場合に必要となるもので、C 言語の場合は気にする必要はありません。

レジスタ例

プログラムの最初に、#include <avr/io.h> とすることで、プロジェクト作成時に指定したマイコンに応じたヘッダファイルを参照してくれます。
プログラムは、iom88.h で定義された名前を使って記述しています。
レジスタ例にあるCOM0A1やWGM01なども、そのファイルに定義されています。
Microchip Studoをインストールした後、下記にあります。

C:\Program Files\Microchip\xc8\v2.31\dfp\xc8\avr\include\avr\iom88.h
(V2.31 のところはパソコンによって変わる場合があります)

<プログラムの書式について>

人によってプログラムの書き方は異なるかとは思いますが、本レッスンでは下記の順番で統一しています。
・include
・各種定義(グローバル変数等)
・割込み処理
・関数
・メインルーチン(MAIN)

プログラムはメインルーチンから実行されるので、目で追う際はここを見てください。

ここから先は

0字
単体で有料公開している記事を集めていますので、まとめてご覧いただくとおトクです。

AVRマイコンプログラミング入門用として、レッスン形式にまとめました。 マイコンの機能の理解にも役立ちます。 対象とするマイコンはATme…

期間限定!PayPayで支払うと抽選でお得

この記事が気に入ったらチップで応援してみませんか?