BASCOM-AVRにはプログラムシミュレーターという機能があります。これを使えば、実際にマイコン回路を作らなくてもBASCOM-AVRの画面上でプログラムの動作を確かめることができるので便利です。もちろんAVRライターも必要ありません。パソコンにBASCOM-AVRをインストールするだけでOKです
BASCOM-AVR・デモ版のダウンロードとパソコンへのインストールに関しては、別項「USBライターを用いたプログラミング」を見てください。
まず、前に作ったLED1個を点滅させるプログラムをシミュレーションしてみました。プログラムは下記の通りです。AVRマイコンICはATtiny26Lを使用、ポートAの0番とGND間に接続したLEDを1秒毎に点滅させるものです。
BASCOM-AVR IDEを起動して上記のプログラムを書き、適当な名前で保存します。私は「test1.bas」という名前にしました。下にこのプログラムをダウンロードするためのリンクを張っておきます。BASCOM-AVRがインストールされているパソコンならば、下記のリンクをクリックしてダウンロードを実行するだけで、自動的にBASCOM-AVR IDEが立ち上がってこのプログラムが表示されるはずです。
プログラムを作成したらツールバーの「Program(プログラム)」から「Compile(コンパイル)」を選んでクリックし、プログラムを機械語に変換します。ここまでは実際にマイコンICを動かすときと同じです。
次に、同じくツールバーの「Program(プログラム)」から「Simulate(シミュレート)」を選んでクリックします。ツールバーの下のアイコンをクリックしても同じです。
すると、「AVR Simulator」というウィンドウが出ます。画面の下のほうには今作ったプログラムが表示されています。
AVR Simulatorのツールバーの操作は下記の通りです。当面必要なものだけ書きます。
まず、ツールバー中ほどの (Show hardware emulation)をクリックします。すると、下記の「Haredware simulation」の画面が出ます。画面の中に並んでいる赤い丸がLEDです。シミュレーションを開始するとこれらのLEDがプログラムの指示通りに点滅するので、プログラムが正しく書けているかどうか視覚的に確かめることができます。
ではさっそくシミュレーションしてみましょう。ツールバーの (Run program)をクリックします。これでシミュレーションが始まるかと思ったのですが、LEDが点滅しません。もうひとつ、 (Reflesh variables)もクリックしないとだめでした。これで画面の中の「PB0」のLEDが1秒毎に点滅を始めました。
AVR Simulatorの中のプログラムを表示している欄の左側に横向きの青い矢印が出ます。これは現在プログラムのどの行を実行しているかを示すものです。これを見ると「Set」命令と「Reset」命令がLEDの点滅と対応しているのがわかります。また、ツールバーの (Step into code)はプログラムを一行ずつ実行するツールです。これをクリックするたび、青い矢印が上から順に一行ずつ移動します。どの命令のとき何がおきるか、ひとつひとつ確認することができます。
プログラムシミュレーターの基本的な操作方法がわかったので、もうひとつ別のプログラムも試してみました。LCD・液晶ディスプレイに文字を表示するものです。最初に「COUNT 0」と表示され、数字の部分が1, 2, 3...と1秒毎に1ずつ増えていきます。
プログラムは下記の通りです。
1 | $regfile = "At26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Dim Number As Byte | バイト型変数「Number」を定義。 | |
4 | Config Lcd = 16 * 2 | 16字x2行表示のLCDを使用する。 | |
5 | Do | 無限ループの範囲ここから。 | |
6 | Cls | LCDの表示を消去する。 | |
7 | Lcd "COUNT " | LCDに「COUNT」と表示。 | |
8 | Lcd Number | LCDに変数Numberを表示。 | |
9 | Wait 1 | そのまま1秒間何もしない。 | |
10 | Number = Number + 1 | 変数Numberに1を加える。 | |
11 | Loop | 無限ループの範囲ここまで。 5行目へ戻る。 | |
12 | End | 終わり。 |
このプログラムの中身について簡単に説明します。3行目の「Dim Number As Byte」は「Number」という名前の変数を使うことを宣言するものです。変数の名前は、BASCOM-AVRのプログラム命令として使われる単語(予約語)以外なら何でもOKです。「As Byte」というのは、変数Numberが0〜255の整数であることを示します。256個つまり1バイト(2の8乗)分の数値を取れるのでバイト型変数とよばれます。
4行目の「Config Lcd = 16 * 2」は16文字x2行表示のLCDを使うことを宣言するものです。これを書かないと、途中(8文字目)で改行されて表示されました。5行目の「Do」はLED点滅プログラムにも出てきた無限ループです。11行目の「Loop」と対応していて、間に挟まれたプログラムを無限に繰り返す命令です。
6行目の「Cls」はLCDの表示を全部消す命令です。このプログラムは「Do〜Loop」で何回も繰り返し表示するので、その都度クリアしないと次々と文字が並んで表示されてしまいます。
7行目の「Lcd "COUNT "」はLCDに「COUNT 」という文字列を表示する命令です。「COUNT」の後ろに半角のスペースが入っていますが、これは「COUNT」とそれに続く数字の間を空けて見やすくするためです。次の「Lcd Number」もLCDに文字を表示する命令ですが、「Number」の部分には「" "」(引用符)が付いていません。これは「Number」という文字を表示するのではなく、変数Numberの中身を表示する命令です。初期値は「0」です。したがって最初はLCDに「COUNT 0」と表示されます。次行に「Wait 1」があるので、この状態が1秒間続きます。
10行目の「Number = Number + 1」は最初何のことかわかりませんでした。「=」を数学の等号と考えると誤解します。この「=」は右辺を左辺に代入するというような意味です。つまり、それまでの変数Numberに1を加えたものを新たに変数Numberとするということです。2行上の「Lcd Number」の時点でのNumberが0ならば、「Number = Number + 1」の左辺のNumberは1になります。次の「Loop」で「Do」に戻り、再びLCDに「COUNT 」と数字が表示されますが、このときは「COUNT 1」となります。このようにして1ずつカウントアップされていきます。
カウントされる数字は無限に増えるわけではありません。上に書いたように変数Numberの範囲は0〜255までなので、「COUNT 255」を表示すると、次は「COUNT 0」に戻って再び1, 2, 3...とカウントしていきます。
実は、上記のプログラムは少し簡略化してあります。今回はシミュレーターでちょっと遊んでみるのが目的なので、LCDの表示に差し支えない範囲で省略できるところは省略しました。実際にマイコンICとLCDを接続して実験するときは、もっと細かい設定が必要かもしれません。このプログラムのファイルへのリンクを下に張っておきます。ファイルの名前は「test2.bas」にしました。
BASCOM-AVR IDE 画面の表示は下記のようになります。「Save as(名前を付けて保存)」したあと「Compile(コンパイル)」して「Simulate(シミュレート)」すればOKです。
今回は先のLED点滅プログラムと違って、 (Show hardware emulation)、続いて (Run program)をクリックするだけでシミュレーションが始まりました。「Hardware simulation」ウィンドウの上のほうにある緑色の四角い領域がLCDです。ここに「COUNT 0」と表示された後、数字がひとつずつ増えていけば成功です。
(追記 : 2007年1月4日)
今回のプログラムでは関係ありませんが、同じ動作を決まった回数繰り返すプログラムをシミュレートすると、最後のサイクルだけ時間が異常に長く(数十秒)かかることがあります。この原因と対策は今のところ不明ですが、ただじっと待っているのもまどろっこしいので、ひとつの便法として、時間に関する命令を無視してシミュレートする方法を紹介します。
プログラムの1行目に「$sim」という記述を追加します。こうすると「Wait 1」など、時間に関する命令はすべて無視してプログラムが進みます。ただ、このままシミュレーションを実行するとプログラムの進行が速すぎて何が起こっているのかわかりませんので、ツールバーの (Step into code)をカチカチとクリックしながらプログラムを一行ずつ進めていきます。実際にマイコンICにプログラムを書き込んでテストする際は、「$sim」を削除してください。
(追記ここまで)