改訂の履歴とファイルのダウンロード履歴以前の古い版はじめにバスコンピは「ヒダピオ」の「簡易プログラミング編」で「マイコン制御学習」を行うために「簡単なBASICのプログラムを機械語にコンパイルするソフトウェア」です。「もちろんインストール不要のソフトウェアとして」実装しました。今は、「ヒダピオ」に同梱されています。使い方アーカイブを展開すると「bascompi」フォルダが出てくるので、ヒダピオの「bin」フォルダに移動してください。「バスコンピ」ショートカットを作成するために、最初に1度だけ「mkshortcut.vbs」をダブルクリックしてください。コンパイルの仕方は簡単で、ソースプログラムの名前が「bascompi.bas」なら「バスコンピ」ショートカットをダブルクリックするだけです。それ以外の名前ならば、「バスコンピ」ショートカットにドラッグ&ドロップします。このときは生成するファイル名が「bascom.hex」になるので注意してください。出来たHEXファイルは「HAG_mini」でマイコンに書き込みます。ddrB=ヒダピオではプログラムの最初に必ず入出力の設定をします。portB=出力値,時間(ミリ秒)ポートBにデータを出力した後、指定した時間待ちます。Endプログラムの終了。プログラムの最後で必ず実行させるようにしてください。LoopDoからLoopの間を繰り返します。Doによって抜け出すことが出来ます。Loopから抜け出します。繰り返し回数ForからNextの間を指定された回数だけ繰り返します。(中級モード)変数jも使えます。条件が成立するときはIfからElseの間にある文を実行します。(上級モード)変数としてa,i,j,k,wt1,wt2が使えます。型は16ビット符号付整数型ですが、符号なし数として扱われることもあります。ポートBへの出力は8ビットしかないことから上位8ビットの処理は省略されることがあります。(上級モード)変数に値を代入する代入文として次の形式のものが使えます。a=0a=ia=a+1a=a-1a=255-aa=a*2a=2^aa=int(a/2)a=pinBa=portB(以下はj,kについても同様)i=0i=ai=i+1i=i-1i=255-ii=i*2i=2^ii=int(i/2)i=pinBi=portBポートBへの出力に変数が使えます。portB=a,300待ち時間の指定に変数が使えます。(上級モード)サブルーチンのラベルを指定します。(上級モード)サブルーチンから戻ります。(上級モード)サブルーチンに制御を移します。(LCDモード)画面に表示されている文字を全て消します。ClsLCDを使うときは最初の表示の前に必ず実行してください。(LCDモード)LCDに指定された文字列を表示します。文字列は""で括ります。(LCDモード)カーソルを非表示にします。(LCDモード)カーソルを表示するようにします。(LCDモード)LCDを非表示にします。(LCDモード)LCDを表示するようにします。カーソルは非表示にします。(LCDモード)上の行に表示します。(LCDモード)下の行に表示します。(LCDモード)表示されている文字列を左にずらします。(LCDモード)表示されている文字列を右にずらします。(LCDモード)表示位置を指定します。(LCDモード)指定された時間待ちます(ミリ秒単位)。(LCDモード)指定された字形を指定された文字番号で登録します。文字番号,データ1,データ2,データ3,データ4,データ5,データ6,データ7,データ8指定できる文字番号は0から7までです。(LCDモード)指定された文字番号に対応する文字をLCDに表示します。(LCDモード)指定された変数の値をLCDに表示します。(Soundモード)指定された周波数の音を指定された時間出力します。出力ポート,長さ,高さマイコンの動作周波数によって音の高さに指定する数値が変わります。その他の命令1ヒダピオの簡易プログラミングには出てきませんが電光掲示板(電子掲示板)や電子オルゴールの中で使っています。Dataプログラム中にデータを置きます。データ1,データ2,...Data文の前にはラベルを置いてください。ReadData文で置いたデータを変数に読み出します。変数Restoreデータを読み出す位置を指定します。ラベルRead文で最初のデータを読み込む前には必ずRestore文を実行してください。その他の命令2電子オルゴールを実現するためにBASCOM-AVRとの互換性を高める目的で追加された命令です。BASCOM-AVRとの完全な互換性を目指すものではありません。現在の電子オルゴールではこれらの命令は使われていません。a=Lookup(i,label)指定されたデータ行から、指定された位置の数値データを変数に読み出します。a="a"変数に文字(のコード)を代入します。Then変数と文字(のコード)を比較します。その他の命令3より一般的な応用が実現できるようにするために追加された命令です。PortD=ポートDにデータを出力します。a=Getadc(0)A/D変換された値を変数に読み出します。シンプルなA-DコンバータBASCOM-AVRモードバスコンピの文法ははヒダピオの簡易プログラミングで使用するBASIC言語に準拠しています。ヒダピオの簡易プログラミングで作成したプログラムをそのまま受理しAVRのアセンブリ言語へ翻訳します。ヒダピオが「コンパイラへ」ボタンによって出力するのははBASCOM-AVRの文法に変換されたソースプログラムです。電光掲示板や電子オルゴールではBASCOM-AVR用のプログラムを出力します。これは、もともとヒダピオシステムがBASCOM-AVRを前提としているからです。そこで、バスコンピはBASCOM-AVRのサブセットもコンパイルできるようにしてあります。ヒダピオとBASCOM-AVRではポートBの論理が逆になっています。ヒダピオシステムでは回路としては負論理ですが、中学生が対象ということもありヒダピオ上はLEDが'1'で点灯し、'0'で消灯するようなっています。ヒダピオのBASIC言語としてコンパイルするときとBASCOM-AVRとしてコンパイルするときではポートBに出力するデータが反転しているのです。バスコンピでは2つのモードを持っていてこれらを切り替えています。モードを切り替えるには2つの方法があり、ひとつはコンパイラに対するオプションで指示する方法です。ひとつは、プログラム中に以下の文があるとBASCOM-AVRモードに切り替わります。$REGFILE$CRYSTALCONFIGDIM$REGFILE*.datファイルは読まずに、CPUの判別に使用しています。値として"ATtiny2313.DAT"と"m168Pdef.dat"が有効ですが、現在はATtint2313のみの対応となっています。$CRYSTALクロックの値を読み取っています。値として1000000と12000000のみが有効です。PORTDは機能します。LCDは単にスキップします。それ以外はスキップします。DIM宣言された情報は記号表に登録されますが、バスコンピには型がありませんので利用されません。例外として、電光掲示板ではRead文で変数にByte型のデータを読むところがあり、そこで記号表を参照しています。小山先生の回路図を参考にして回路を組みます。メモ帳でBlink.bas(873)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。小山先生の回路図を参考にして回路を組みます。メモ帳でFade.bas(280)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。Fade.bas(280)は0.53以降のコンパイラでコンパイルすることができます。小山先生の回路図を参考にして回路を組みます。メモ帳でSw.bas(410)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。Sw.bas(410)は0.49以降のコンパイラでコンパイルすることができます。1小山先生の回路図を参考にして回路を組みます。メモ帳でPlaynote.bas(280)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。Playnote.bas(280)は0.54以降のコンパイラでコンパイルすることができます。g,R,0%カウントアップ小山先生の回路図を参考にして回路を組みます。メモ帳でCountup.bas(288)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。小山先生の回路図を参考にして回路を組みます。メモ帳でAdc.bas(292)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。(2011.10.13追記)マイコンの動作周波数が1MHzのときにはコンデンサの静電容量を0.1μFにしてください。サンプルプログラム(Adc.bas(292))にあった動作周波数の指定は不要のため削除しました。小山先生の回路図を参考にして回路を組みます。メモ帳でSignal.bas(349)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。Signal.bas(349)は0.55以降のコンパイラでコンパイルすることができるようにする予定でます。(Midi楽器の制御)小山先生の回路図を参考にして回路を組みます。メモ帳でMidi.bas(273)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。Midi.bas(273)は0.55以降のコンパイラでコンパイルすることができるようにする予定でます。拙作バスコンピができたのはインストールせずに使えるAVR用のBASICコンパイラが欲しいという要望に応えるためでした。実はBASCM-AVRにはbascomp.exeというコマンドラインからコンパイラを使うためのユーティリティが用意されています。Electronics社のページからダウンロードできますがDEMOバージョンにも付属していて、BASCOM-AVRのインストールディレクトリの中にあります。バージョン2.0.5.0まではソース中に$REGFILEや$CRYSTALだけでなく$BAUDまで書かなければいけなかったのですが、最新のバージョン2.0.7.1からは、これらを書かなくても良くなりました。Electronics\BASCOM-AVR」にインストールされます。ここから必要なファイルだけ取り出します。ATtiny2313用にコンパイルするために最低限必要なのは「BASC-AVR.DLL」、「bascomp.exe」、「ATtiny2313.DAT」、「LIB\mcs.lbx」、「LIB\Double_Trig.LBX」、「LIB\Double.LBX」、「LIB\FP_Trig.LBX」です。次のようなバッチファイルbascomp.bat(278)を作成します。作成したバッチコマンドのショートカットを作成します。コンパイル作成したショートカットにソースファイルをドラッグ&ドロップするとコンパイルできます。エラーメッセージは、*.errファイルに出力されます。「ものづくり」は基本です。今頃気づきましたが小山先生のページに「バスコンピ」の文字がありました。7/Vistaで動作しない場合があります。自己展開形式(.exe)のファイルとzipファイルの中身は全く同じものです。PortB.x=0の形式が直接使えるようにした。CALL命令を使用せずにサブルーチンを呼び出す書式も使用できるようにした。名前付き定数の2重定義チェックが間違っているのを直した。Data文中の定数式を加算以外も計算するようにした。ついでに再帰的に計算するようにした。循環参照は検出するようにしたつもり。別名を使用したときにa=a+1のパターンが認識できなかったのを直した。Waitms文で名前付き定数が使えるようにした。定数_XTALを設定するタイミングが間違っていたので直した。X=2^I、X=2^Jが処理されていなかったのを直した。Call文が正しく処理されていないのを直した。同梱する逆アセンブラを最新のものにした。シリアル通信の出力に対応した。$BAUD、Print文、Printbin文が使えるようにした。Call文でサブルーチンに引数を渡せるようにした。Sub文が使えるようにした。Dim文でString型の変数と1次元の配列が宣言できるようにした。SRAM上の領域も確保されるようにした。PortB.0=aのような書き方が出来るようにした。10進定数の代入が出来るようにした。代入文の右辺に16進定数と2進定数が使えるようにした。代入文の右辺で配列の要素が使えるようにした。Data文の中で定数同士の加算が出来るようになった。ソースコードからデバッグ用のメッセージ出力やコメントアウトした不要な行を削除した。Bits/Nbits関数が使えるようにした。If文でLong型変数と定数の比較が行なえるようにした。初期化ルーチンを生成するタイミングが間違っているのを直した。Long型変数のインクリメント/デクリメントができるようにした。If文で16進定数が使えるようにした。16ビットの乗算ができるようにした。Data文でカンマの前後に空白があると記号定数が認識できないのを直した。If文で変数名にアンダースコアが使えないのを直した。If文での変数と0との比較を高速化した。If文で定数値に%が付いていても良いようにした。宣言したLong型の変数に値を代入できるようにした。ついてはまだできない。定数_XTALを定義しプログラム中で動作クロック数($Crystalで指定した値)を読み出せるようにした。HIGHW関数によりLong型変数の上位16bitを取り出すことができるようにした。$Baudでボーレートを設定できるようにした。シリアル通信はまだできない。Enable/Disable文で個別の割り込みを許可/禁止できるようにした。文で割り込みベクタを設定できるようにした。割り込み文で指定したサブルーチンを割り込みルーチンとして認識しレジスタの退避と復帰を行うようにした。asmが使えるようにした。Portb文で変数の値を代入する場合のコードを改善した。I/Oレジスタへの代入及び値の参照ができるようになった。&Hxxによる16進定数が使えるようにした。TIMER0/COUNTER0/TIMER1/COUNTER1/WATCHDOG文により各デバイスを停止できるようにした。WATCHDOG文によりウォッチドッグタイマを起動できるようにした。引数なしのStop文によりプログラムの停止が行なえるようにした。End文との違いは割り込みの禁止を行わないことである。LCDに変数の値を表示できるようにした。負の数には対応していない。アセンブルエラーが出たときは空のhexファイルを生成するようにした。簡易プログラミングでSound文がコンパイルできなくなる間違いを直した。Interruptsで割り込みの許可と禁止が行えるようにした。ASM_TEXT/ASM_ENDでインラインアセンブラが使えるようにした。If文でa>0とa<0の処理が間違っていたのを直した。Portd.0の処理が間違っていたのを直した。If文で文字比較の処理が間違っていたのを直した。If文で名前付定数が使えるようにした。pinD.0が使えるようにした。Constが使えるようにした。Aliasが使えるようにした。Locate文で予約されていない変数を使ったときの処理が間違っていたので直した。BASCOM-AVRモードで余計な初期化コードが出力されないようにした。ATmega168(P)に対応させた。テストは一切行っていない。PortXで以下の形式が使えるようにした。アセンブリ言語のオペランドで定数を0b00000000のように常に8桁になるようにした。(7)の変更によりオペランドが0のときに間違っていたのが直った。$regfileが正しく認識され無い場合があったのを直した。For文でStepが使えるようになった(ただし指定できるのは-63〜-1、1〜63の定数のみ)。「m168def.inc」を添付した。ATtiny2313でa=getadc(0)によってA/D変換ができるようにした。シンプルなA-Dコンバータ(http://elm-chan.org/docs/avr/avradc_j.html)からコードを引用した。クロックが1MHzのときはあまりうまくは動かないようである。処理が間違っていたのを直した。間違っていたので直した。コードが間違っていたのを直した。バージョンナンバーと日付以外は特に変更無し。12MHzに対応した。電子オルゴールのプログラムでないときは「bascompi_orz.bas」を出力しないようにした。各音符(休符)の前に30msの待ち時間を入れた。7/Vistaで動作しなくなっていることが発覚したので対処をした。ラベルの処理に関して余計なメッセージが出ていたのを直した。PortDが処理されていなかったのを直した。#,bの処理がやっぱりなされていなかったのを直した。Sound文のランタイムルーチンでループのラベル位置が間違っていたのを直した。これにより、テンポが遅くなったり、音程が低くなるのが改善したと思われる。#,bの処理がなされていなかったのを直した。0.41の日付が間違っていた。何か良い管理法は無いものか。Sound文の引数でカンマの前後に空白があっても良くなった。ラベルの扱いが間違っていたのを直した。「-」を含むラベルも使えるようになった。判定法が甘く、Sound文を含むプログラムを全て誤認していたのをSound文を含みかつData文を含んでいて、そのデータが全て電子オルゴールの音符データであるときに「電子オルゴール」のプログラムと看做すことにした。ソースを少し弄ったが、特に機能的な変更はない。電子オルゴールの出力したプログラムをバスコンピのプログラム「bascompi_orz.bas」に変換するスクリプト「Orgel.awk」を作成した。上の「Orgel.awk」のために大幅に書き換えた。0.39の日付が間違っていた。Waitms文で変数が使えるようになった。CONFIG、$CRYSTALでもBASCOM-AVRモードになるようにした。8LED点滅回路http://hidapio.jp/m8led.htmにある、プログラム例の「ヒダピオ」、「BASCOM」の両方がコンパイルできるようになった。If文が壊れていたのを直した。乗算ルーチン、除算ルーチンのコメントがコメントになっていなかったのを直した。代入文の右辺にI、J、K、A以外の変数も使えるようになった。If文でI、J、K、A以外の変数も使えるようになった。Sound文で変数を使った場合のコード生成が間違っていたのを直した。入力ファイルの名前が「bascompi*.bas」とき出力ファイル名を「bascompi.asm」にするようにした。255」の記法を使えるようにした。Chr(0)chr関数と文字列定数をセミコロンで区切って並べられるようにした。セミコロンの前後に空白があっても良い。LCDdefchar文でカンマの前後に空白があっても良くなった。LCDdefchar文のコード生成が間違っていたのを直した。Locate文の引数でカンマの前後に空白があっても良くなった。BASCOM-AVRモードではNext文の変数を無視するようにした。Dim文でBASCOM-AVRモードになるようにした。For文で「=」の前後に空白があっても良くなった。LCD文で文字列定数の中にカナがあるとアセンブル時に警告がでるが実害はない。これらによって、AVRマイコンのプログラム(LCD編)http://hidapio.jp/program6.htmにあるサンプルがコンパイルできるようになった。If文が壊れています。&Hxx一旦、バッファに記録し、ラベルを見つけるかプログラムの最後に到達したときに2バイト単位で.db擬似命令を出力する。これにより本来バイトであるデータがワードになってしまいコードが膨らんでいたのを防ぐことができる。数行の連続したData文の後ろにラベル文を置く必要があることに注意する。aDim文で型情報を記録していたのを使うようにし、Read文で変数がByte型である場合は1バイトだけ読み出し変数の下位バイトに格納するようにした。これらにより、電子掲示板の全てのパターンがコンパイルできるようになった。bascompi038.zip(235)履歴以前の古い版exeファイルとzipファイルの中身は全く同じものです。上の方にあるもの程、新しい版です。Perl5.016003。