BASIC用プログラムソフト「BASCOM-AVR」を用いて、AVRマイコンの簡単なプログラムを作る勉強を始めました。うまく動作したものから順にレポートしていきたいと思いますが、なにぶんまったくの初心者なので、間違ったことを書くかもしれません。なお「BASCOM-AVR」(デモ版)のダウンロードとインストールに関しては別項「USBライターを用いたプログラミング」をご覧ください。プログラム作成後の操作についてもこのページに書いてあります。
最初に、別項「LED点滅テスト用回路」を使用して、ICのPA0(20番ピン)につながれたLED(LED0)が1秒間点灯、1秒間消灯、再び1秒間点灯したのち消灯するプログラムを作ってみました。プログラムを実行するとLEDは下の図のように点灯・消灯します。白丸が消灯、赤丸が点灯を表わしています。
時間 | LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | LED0 |
0 | ||||||||
1 | ||||||||
2 | ||||||||
3 |
ポートの出力を「1」または「0」にすることでLEDを点灯または消灯させるプログラムです。BASCOM-AVRがインストールされたパソコンで下記リンクをクリックしてファイルをダウンロードすると、BASCOM-AVR IDEが自動的に立ち上がって画面内にプログラムが表示されます。
プログラムファイル on_off1a.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta.0 = Output | ポートAの0番(PA0)を出力端子にする。 | |
4 | Porta.0 = 1 | PA0の出力を「1」にする。LED0点灯。 | |
5 | Wait 1 | 1秒間そのまま待つ。 | |
6 | Porta.0 = 0 | PA0の出力を「0」にする。LED0消灯。 | |
7 | Wait 1 | 1秒間そのまま待つ。 | |
8 | Porta.0 = 1 | PA0の出力を「1」にする。LED0再び点灯。 | |
9 | Wait 1 | 1秒間そのまま待つ。 | |
10 | Porta.0 = 0 | PA0の出力を「0」にする。LED0消灯。 | |
11 | End | 終わり。 |
プログラム1行目の「$regfile = "at26def.dat"」は使用するAVRマイコンICの種類を指定する記述です。今回はATtiny26Lを使うのでこのようになりますが、別のICを用いるときは違う記述になります。2行目の「$crystal = 1000000」はICのクロック周波数を1000000Hzすなわち1MHzに設定するためのものです。時間に関係する命令が出てきたとき、ICはこのクロック周波数をもとに時間を測ります。ATtiny26Lのクロック周波数は初期設定で1MHzになっています。
3行目の「Config Porta.0 = Output」はポートAの0番(PA0, ATtiny26Lの場合は20番ピン)を出力端子として設定する命令です。「Porta.0」の部分を「Porta.1」と書けばポートAの1番(PA1)が出力端子になります。「Porta」と「0」の間には「.」(ピリオド)が入ります。
4行目と8行目に出てくる「Porta.0 = 1」はPA0の出力を「1」にする命令です。出力が「1」とは、PA0端子が電源電圧と同じ電圧(+5V)になることを意味します。これはテスタでも確認できます。PA0〜GND間にはLED0が接続されていますので、PA0の電圧が5VになればLEDは点灯します。
5行目その他に出てくる「Wait 1」はそのまま1秒間何もしないという命令です。つまり直前の状態が1秒間そのまま保持されます。これによってLED0は1秒間点灯し続けます。「Wait 2」と書けば2秒間点灯します。他にミリ秒単位で待ち時間を設定する「Waitms」、マイクロ秒単位で待ち時間を設定する「Waitus」という命令もあります。「Wait 1」と「Waitms 1000」は同じ意味になります。
6行目の「Porta.0 = 0」は「Porta.0 = 1」の逆で、PA0の出力を「0」に、すなわち端子電圧を0Vにする命令です。これによってLED0は消灯します。次の行にまた「Wait 1」があるので消灯状態も1秒間継続します。8行目と9行目はLED0を再び1秒間点灯する命令です。最後にLEDを消灯して終わります。
BASCOM-AVR IDEの画面にプログラムを記述する際、アルファベットの大文字・小文字は関係ありません。全部小文字で入力しても単語の語頭だけ自動的に大文字に変換されます。また「=」(イコール)の前後には半角のスペースが入っていますが、これも自動的に挿入されます。
このプログラムは、始まったと思ったらすぐ(3秒で)終わってしまいます。再スタートさせるときはマイコン回路のリセットスイッチをチョンと押せばOKです。
次も同じ動作をさせるプログラムですが、出力端子を「1」あるいは「0」にするのに、「Set」「Reset」命令を使ってみました。
プログラムファイル on_off1b.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | PA0〜PA7の8本すべてを出力端子にする。 | |
4 | Set Porta.0 | PA0の出力を「1」にする。LED0点灯。 | |
5 | Waitms 500 | 0.5秒間そのまま待つ。 | |
6 | Reset Porta.0 | PA0の出力を「0」にする。LED0消灯。 | |
7 | Waitms 500 | 0.5秒間そのまま待つ。 | |
8 | Set Porta.0 | PA0の出力を「1」にする。LED0再び点灯。 | |
9 | Waitms 500 | 0.5秒間そのまま待つ。 | |
10 | Reset Porta.0 | PA0の出力を「0」にする。LED0消灯。 | |
11 | End | 終わり。 |
3行目の出力端子設定の記述はon_off1a.basと少し違います。ここではポートAの8本の端子すべてを出力に設定しています。これでも同じことです。なお、「Config Porta.0 = Output」と書いた場合、PA1〜PA7は出力でも入力でもない中途半端な状態になります。ICの端子をこのような状態で放っておくのは良くないと書いてある記事もあります。
4行目の「Set Porta.0」は「Porta.0 = 1」と同じ意味です。「Set 〜」は「〜」の部分を「1」にする命令です。これによってPA0につながれたLEDが点灯します。次行の「Waitms 500」は500ミリ秒(0.5秒)間待つ命令です。1秒間ではまどろっこしいので0.5秒にしました。
6行目の「Reset Porta.0」は「Porta.0 = 0」と同じ、PA0を「0」にする命令です。LED0は消灯します。
「Set」「Reset」命令を使って、ポートA全体の状態を8桁の2進数で表示するよう指定します。
プログラムファイル on_off1c.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Set Porta | ポートAの出力を「1」(00000001)にする。LED0点灯。 | |
5 | Waitms 500 | 0.5秒間そのまま。 | |
6 | Reset Porta | ポートAの出力を「0」(00000000)にする。LED0消灯。 | |
7 | Waitms 500 | 0.5秒間そのまま。 | |
8 | Set Porta | ポートAの出力を「1」(00000001)にする。LED0再び点灯。 | |
9 | Waitms 500 | 0.5秒間そのまま。 | |
10 | Reset Porta | ポートAの出力を「0」(00000000)にする。LED0消灯。 | |
11 | End | 終わり。 |
4行目は「Set Porta」です。「Set Porta.0」ではありません。これはポートAの8本の端子全体で「1」を出力させる命令です。PA7〜PA0を8桁の2進数(8ビット)とみなし、これら全体で「1」を表現する形になります。10進数の1を8桁の2進数で表わすと「00000001」ですので、最下位のPA0のみが「1」となり、LED0が点灯します。
6行目の「Reset Porta」はポートA全体を「0」にする命令です。10進数の0は8桁の2進数では「00000000」ですから、PA0は「0」となってLED0は消灯します。
上記のプログラムで点灯・消灯時間を変更しようと思うと、Wait命令の部分を3ヵ所とも書き換えなくてはなりません。待ち時間の数値を変数に置き換えると、1ヵ所書き換えるだけですみます。
プログラムファイル on_off1d.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Dim T As Word | 待ち時間設定用の変数「T」を定義する。 | |
5 | T = 500 | 変数Tの値を500にする。(待ち時間500mS) | |
6 | Set Porta | ポートAの出力を「1」にする。LED0点灯。 | |
7 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
8 | Reset Porta | ポートAの出力を「0」にする。LED0消灯。 | |
9 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
10 | Set Porta | ポートAの出力を「1」にする。LED0再び点灯。 | |
11 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
12 | Reset Porta | ポートAの出力を「0」にする。LED0消灯。 | |
13 | End | 終わり。 |
4行目で待ち時間を設定するための変数を定義します。ここでは「T」という名前にしました。変数は名前と型を定義します。書式は「Dim (名前) As (型)」となります。変数名はBASCOM-AVRのプログラムの中で命令語として使われるもの(「予約語」と言います)以外なら何でもOKです。予約語については、BASCOM-AVR IDEのツールバーから「Help」→「Index」→「BASCOM Language Fundamentals」→「Reserved Words」とたどっていくと一覧表が出ています。BASCOM-AVR IDEの画面でプログラム文を入力すると予約語は太字に変換されますので区別がつきます。入力の手間を考えると、なるべく短い語句が良いと思います。
変数の型というのは変数がその値としてとることのできる数値の範囲をいいます。BASCOM-AVRでは下記のような種類があります。SingleとDoubleは小数点が付いた数を扱うときに使うらしいのですが、よくわかりません。今回は待ち時間をミリ秒単位で設定したかったので「Word」にしました。「Long」が一番範囲が広いので、変数はすべてLongで定義すればよいと思うかもしれませんが、不必要に範囲の広い変数を使うと、その分ICのメモリーを無駄に消費するので良くないとのことです。
5行目の「T = 500」は、変数Tの値を500にするという意味です。つまり待ち時間を500ミリ秒(0.5秒)にします。Waitms命令のところは、数字を入れる代わりに「Waitms T」と書きます。時間を変更したい場合は「T = 500」の数字を変えるだけですみます。