ブレッドボードラジオAVRマイコン入門

BASCOM-AVR データの保管と読み込み

1. データの保管と読み込み

 LEDの点灯パターンをあらかじめデータとして保存しておき、必要に応じてそれを呼び出して使うプログラムを試してみました。ここではLED0から順に1個ずつ点灯していく動作を「Pattern1」、点灯個数が1個ずつ増えていく動作を「Pattern2」とし、それぞれのデータを決まった場所に保存しておきます。はじめに「Pattern1」を読み込んで実行、続いて「Pattern2」を読み込んで実行します。マイコン回路は「LED点滅テスト用回路」を使用します。

 プログラムファイル data1a.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Dim N As Byte データナンバー用の変数「N」を定義する。
5 Dim Led As Byte LED出力用の変数「Led」を定義する。
6 Restore Pattern1 「Pattern1」のデータを呼び出す。
7 For N = 1 To 9 Forループの範囲ここから。
「Pattern1」の1番目から9番目のデータを順に読み込む。
8  Read Led : Porta = Led 読み込んだデータを変数Ledに代入。
変数Ledの値をポートAに出力。
9  Waitms 500 0.5秒間そのまま。
10 Next N Forループの範囲ここまで。
7行目に戻り、次のデータを読み込む。
11 Restore Pattern2 「Pattern2」のデータを呼び出す。
12 For N = 1 To 9 Forループの範囲ここから。
「Pattern2」の1番目から9番目のデータを順に読み込む。
13  Read Led : Porta = Led 読み込んだデータを変数Ledに代入。
変数Ledの値をポートAに出力。
14  Waitms 500 0.5秒間そのまま。
15 Next N Forループの範囲ここまで。
12行目に戻り、次のデータを読み込む。
16 End メインプログラム終わり。
17 Pattern1 : ラベル「Pattern1」。
18 Data 1, 2, 4, 8, 16, 32, 64, 128, 0 「Pattern1」内のデータ。
19 Pattern2 : ラベル「Pattern2」。
20 Data 1, 3, 7, 15, 31, 63, 127, 255, 0 「Pattern2」内のデータ。

 まず17行目以降の「データ保管庫」から説明します。17行目の「Pattern1 :」や19行目の「Pattern2 :」はひとまとまりのデータに名前を付けて他と区別するとともに、プログラム中での場所を特定するためのものです。これらはラベル(レーベル)と呼ばれます。ラベル名は予約語以外なら好きな名前を付けることができます。末尾の記号は「:」(コロン)です。ラベルの次の行に「Data」と記し、続いてデータの数値を「,」(カンマ)で区切って入力します。ここではLEDの点灯パターンを示す10進数の数字を入れました。これらの記述は「End」のあとに書く決まりになっています。

 6行目の「Restore Pattern1」はラベル「Pattern1」の場所に置かれたデータを呼び出す命令です。7〜10行目はFor 〜 Nextループです。「N = 1 to 9」となっているのは、「Pattern1」内の9個のデータを1番目から順に読み込むためです。8行目の「Read Led」で、まず「Pattern1」の中にある1番目のデータ「1」を変数Ledの値として読み込み(代入)を実行します。次に「Porta = Led」で、読み込んだ値をポートAの出力とします。「Led = 1」なので「Porta =1」となり、LED0が点灯します。8行目には2つの命令があるので、間を「:」(コロン)で区切ります。

 0.5秒後のForループ2回目では、「Pattern1」内の2番目のデータ「2」を変数Ledの値として読み込み、ポートAに出力します。「Porta = 2」となるのでLED2が点灯します。同様にして9番目のデータまで順に読み込んでポートAに出力します。これが終わると、ループを抜けて11行目「Pattern2」の呼び出しに移ります。

2. 変数の配列

 データの呼び出しに似た機能で変数の配列というのがあります。両者はどう使い分けるのかよくわかりませんが、とりあえず書き方の練習だけしました。動作は上のプログラムと同じです。

 プログラムファイル data1b.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Dim N As Byte Forループ用の変数「N」を定義する。
5 Dim Led1(9) As Byte LED出力用の変数「Led1」を定義する。
6 Dim Led2(9) As Byte LED出力用の変数「Led2」を定義する。
7 Led1(1) = 1 変数「Led1」の1番目は「1」。
8 Led1(2) = 2 変数「Led1」の2番目は「2」。
9 Led1(3) = 4 変数「Led1」の3番目は「4」。
10 Led1(4) = 8 変数「Led1」の4番目は「8」。
11 Led1(5) = 16 変数「Led1」の5番目は「16」。
12 Led1(6) = 32 変数「Led1」の6番目は「32」。
13 Led1(7) = 64 変数「Led1」の7番目は「64」。
14 Led1(8) = 128 変数「Led1」の8番目は「128」。
15 Led1(9) = 0 変数「Led1」の9番目は「0」。
16 Led2(1) = 1 変数「Led2」の1番目は「1」。
17 Led2(2) = 3 変数「Led2」の2番目は「3」。
18 Led2(3) = 7 変数「Led2」の3番目は「7」。
19 Led2(4) = 15 変数「Led2」の4番目は「15」。
20 Led2(5) = 31 変数「Led2」の5番目は「31」。
21 Led2(6) = 63 変数「Led2」の6番目は「63」。
22 Led2(7) = 127 変数「Led2」の7番目は「127」。
23 Led2(8) = 255 変数「Led2」の8番目は「255」。
24 Led2(9) = 0 変数「Led2」の9番目は「0」。
25 For N = 1 To 9 Forループの範囲ここから。
変数「Led1」の1番目から9番目の値を順に読み込む。
26  Porta = Led1(n) 変数「Led1」の値をポートAに出力。
27  Waitms 500 0.5秒間そのまま。
28 Next N Forループの範囲ここまで。
25行目に戻り、次の値を読み込む。
29 For N = 1 To 9 Forループの範囲ここから。
変数「Led2」の1番目から9番目の値を順に読み込む。
30  Porta = Led2(n) 変数「Led2」の値をポートAに出力。
31  Waitms 500 0.5秒間そのまま。
32 Next N Forループの範囲ここまで。
29行目に戻り、次の値を読み込む。
33 End 終わり。

 変数の配列というのは、データの配列と似ています。変数が取り得る値とその順番をあらかじめ決めておくものです。このプログラムでは「Led1」と「Led2」の2つの変数の配列があり、それぞれの値は下記のようになります。数値は前のプログラムの「Data」と同じです。

順番 1 2 3 4  5 6 7 8 9
Led1の値 1 2 4 8 163264128 0
Led2の値 1 3 715 3163127255 0

 5行目と6行目のところで変数が「Led1(9)」「Led2(9)」となっているのは、それぞれ9個の値を取るという意味です。7行目から24行目は、2つの変数の値を順番に列挙しています。25行目「For N = 1 To 9」は変数の1番目から9番目の値を順に読み込んでいく命令です。まず「Led1」の1番目の値「1」をポートAに出力し、0.5秒後に2番目の値「2」をポートAに出力します。9番目の値まで出力したらループを抜けて29行目に移り、今度は「Led2」の値を順に読み込んで出力します。