2014年06月01日

AVR/PIC: 無料のGCBASICコンパイラ (発見編)2014,2017

AVR/PIC: 無料のGCBASICコンパイラ (発見編), 2014, 2017
(2017年初頭から、新版(v0.96版(2016-12-23版))に対応して変更中なので注意)

* 無料で使えるBasic言語コンパイラ: GCBASIC
ひょんなことから :D、
GCBASICというAVR/PIC用のBasicコンパイラを見つけました。
Great Cow Basic
http://gcbasic.sourceforge.net/
フォーラム
http://sourceforge.net/p/gcbasic/discussion/

* 対象マイコン:
PIC: PIC10F 〜 PIC18F
AVR: Tiny, mega

* 開発環境 IDEのインストール
このページの
https://sourceforge.net/projects/gcbasic/files/GCBasic%20-%20Complete%20IDE%20including%20GCGB/
「GCGB_Installer-xx.exe」というのをダウンロード/実行します。
執筆時点では「GCGB_Installer-96.exe」。
(http://gcbasic.sourceforge.net/download.html)
インストール時にオプションで多数のプログラマアプリを選択できる。
デフォルトでOFFなのでひとまず全部にチェックを入れておきます。
で、
インストールするとデスクトップ上に
(1) 「Great Cow BASIC」
(2) 「Great Cow Graphical BASIC」
と2つのアイコンができます。
このブログでは(1)「Great Cow BASIC」を対象とします。(Graphicalの方はここを参照)

以下「Great Cow BASIC」を「GCBASIC」と表記する。
GCBASIC(グラフィカルでない方(GCB@Syn))は、以下のプログラマ用のエディタをベースに作られているので、
結構本格的な開発環境となっています。
SynWrite Editor
http://www.uvviewsoft.com/synwrite/

* メニューの日本語化方法
GCBASIC v0.9.6ベースです。
メニューは日本語化可能です。(言語切り替えが必要)
(1) 「Options」-「Customize」-「Interface」-「Program Settings」の右ペインで
    「Language」-「英語(米国)」の右にある「More」をクリック、
    開いたページから「language.Jap.zip」を入手する。
(2) これを任意のフォルダに解凍し、出てきた「LANG」フォルダを
    GCBASICをインストールしたフォルダ(GCB@Syn)下の「SynWrite」フォルダの
    中にコピーした後、GCBASIC IDEを再起動します。
(3) 再度 (1) の手順をたどって行くと「Language」のところで日本語選択可能に
    なるので選択し、OKを押すと日本語メニューに切り替わります。

(^^)/

 syn-ide.png
以降はこの「GCB@Syn」IDEをベースにした記述とします。

* ここまでの感想
もう ぶっとんじゃった!! xD 
発見したばかりで詳細はこれからなんだけど、
個人的にはこれが無料で使えるなら合格です。
使えるわけだけど :D

こんなのあるなら、もっと早く教えて欲しかった xD 

* 言語仕様
http://gcbasic.sourceforge.net/help/
(1) 構造化制御文を採用。do, while, case, if else, 等々
    いわゆる「構造化Basic」
    Goto文もある。
    http://gcbasic.sourceforge.net/help/_flow_control.html
(2) 行番号不要。(1)のおかげ
(3) 変数名は2文字以上必要
(4) byte,word(16bit),long(32bit)型あり。string(サイズ指定可能)型あり
       http://gcbasic.sourceforge.net/help/_variables.html
(5) 配列は1次元のbyte型のみ
        http://gcbasic.sourceforge.net/help/_arrays.html
(6) ルックアップ・テーブルをサポート。(5)の制限を緩和する感じ
        http://gcbasic.sourceforge.net/help/_lookup_tables.html
        http://gcbasic.sourceforge.net/help/_readtable.html
(7) 関数(function)、サブルーチン(sub)定義可能
    引数の参照渡し、値渡しが可能。 後述。
    サブルーチン
    http://gcbasic.sourceforge.net/help/_subroutines.html
    関数
    http://gcbasic.sourceforge.net/help/_functions.html
(8) 各種周辺ライブラリあり ( UART, timer, pwm, i2c, spi ...)
(9) LCD, GLCDライブラリあり。その他もあり。
    GLCD
    http://gcbasic.sourceforge.net/help/_graphical_lcd.html
    LCD
    http://gcbasic.sourceforge.net/help/_liquid_crystal_display.html
(10) C言語風の論理演算子も使える
        http://gcbasic.sourceforge.net/help/_conditions.html
(11) 固定小数(3桁)の平方根、LOG関数あり。階乗関数あり。
        http://gcbasic.sourceforge.net/help/_maths.html
(12) 文字列操作関数あり。 asc, chr, hex, left, mid, str, trim, 等々
        http://gcbasic.sourceforge.net/help/_string_manipulation.html
(13) 割込みは非常に簡単に定義、使用できる。
        http://gcbasic.sourceforge.net/help/_interrupts.html
    PICマイコンも見た目は割込みテーブル風に使える。
    割込みフラグを気にする必要はない作りになっている。
(14) DDRレジスタやTRISレジスタの設定は不要。
    コンパイラが自動で方向を判断する。
    PORTB.5 = 1
    とだけ書けば、コンパイラが内部でTRISやLATレジスタを適切に使うコードを
    吐くのでちゃんと出力できる。スゴ。
    PORTx.yへの「書込み」は、LATx.yに自動でリダイレクトされる。
    この自動機能をOFFにすることもできるようだ。
        http://gcbasic.sourceforge.net/help/__option_nolatch.html
(15) #define文あり
       http://gcbasic.sourceforge.net/help/_constants.html
    #define LED1    PORTB.5
    LED1 = on
    の様に書ける。
(16) プリプロセッサ機能(Script)
        http://gcbasic.sourceforge.net/help/_scripts.html
    C言語風に if,ifdef等を使って複雑な定数計算ができる
(17) インライン化するためのmacro機能あり
        http://gcbasic.sourceforge.net/help/_macros.html
(18) Peek,Poke命令
   http://gcbasic.sourceforge.net/help/_peek.html
(19) 一行内の複文可能
    コロン:で区切って複文が可能。
    http://gcbasic.sourceforge.net/help/_miscellaneous.html
(20) 変数の使い方
    http://gcbasic.sourceforge.net/help/_variables_operations.html

注意ポイント:
(1) ローカル変数なし
    ちょっと残念だけど、我慢しよう。 :D
    ここだけ、原始的なBASICと同じ感じ。
    subやfunction内で変数定義してもグローバル変数となる。
    引数をローカル変数的に使うことで、ある程度緩和できると思う。
(2) 構造体なし
(3) print命令の出力はLCDに表示する。
        http://gcbasic.sourceforge.net/help/_liquid_crystal_display.html
    UART出力は「HSerPrint」を使う。
        http://gcbasic.sourceforge.net/help/_rs232_hardware.html
(4) 引数もグローバル変数
    これは、コンパイラが吐いたアセンブラを見たんだけど、
    「関数の引数」は全て「グローバル変数」にマップされます。(多分)
    従って、SRAMが不足したときは「引数の名前の種類」を減らした方が
    効率的と思われる。

    そもそも、スタックを使うようなコードは吐かれない。
    スタックフレームがない感じ。

Flash書込み系:
インストール時にオプションにちゃんとチェックを入れると
いろいろなものがインストールされて使えます。
(1) avrdude
(2) avrdudess
    以前は、 yuki-Labさんのavrdude-GUI v1.05
    http://yuki-lab.jp/hw/avrdude-GUI/
    でしたが、今はavrdudessに変更になっている様です。
(3) ワンクリックで「コンパイル+書込み」可能
(4) 好きなプログラマをメニューに登録、実行できる
    自分は「guidude」を登録した。
(5) ソースフォルダに「flashAVR.bat」があればそれをコンパイル後に自動実行可能
    ワンクリックで「コンパイル+書込み」できるので、
    結局これを使ってます。便利。(^^)/
まず、GCB@Syn\G+Stools\flashAVR.bat を自分のソースフォルダにコピーします。
 REM  Call AVRdude for Arduino programmer:
 "AVRdude\avrdude.exe" -c arduino -P COM7 -b 115200 -p AT%2 -U flash:w:%1:i
上を「flashAVR.bat」に追加、有効にした。元からある「USBasp」の行はREMしておく。 ボーレート115200は、Arduino DuemilanoveでOptiboot用の値。 その他: (1) Terminalソフト これどっかで見たことある。かなり高機能。 gcbasic-out.png 入力支援: (1) コード補完可能(内蔵関数のみ) 関数の引数型も表示する。 (2) スニペット登録可能 * サンプルコードの場所 インストールしたフォルダの以下にメチャメチャたくさんある。 GCB@Syn\GreatCowBasic\Demos 一部はここにある。 http://gcbasic.sourceforge.net/help/_example_programs.html * GCBASICの構成 (1) GCBASICコンパイラが単独のオープン・ソース・プロジェクトの様だ (2) それに、IDEプロジェクトが付加されている感じ。 (3) 全てオープンソースでGPLライセンス。 (4) GCBASICコンパイラ自身は、無料のBASICコンパイラを使って書かれている。 (5) GCBASICはコマンドラインから使用可能。 * AVR(Arduino)でLEDチカチカしてみた。 AVRボードはここのArduino Duemilanove互換ボードを使った。 http://mpu.seesaa.net/article/2119740.html LEDをチカチカしながら、UARTに文字列を表示するデモです。
' マイコン: ATMega328p, 16MHz
#chip mega328p,16

' For Arduino Duemilanove
#define LED1 portb.5
#define USART_BAUD_RATE 115200

' グローバル変数
bar = 0

' UART 表示サブルーチン
Sub PrintTest( count, msg as string)
    HSerPrint msg + " "
    HSerPrint count
    HSerPrintCRLF
End Sub

' メインルーチン main
Do
    LED1 = on
    Wait 500 ms
    LED1 = off
    Wait 500 ms
    PrintTest(bar, "Hardware UART print test")
    bar++
Loop
簡単! (^^)/ * コード効率 ここに他のコンパイラと比較した結果がある。 http://sourceforge.net/p/gcbasic/discussion/579125/thread/61284378/?limit=25#b328 業界最強と思われるSwordfish Basic とほぼ同じコード効率をたたき出している。 もう少し別のコードでも比較してみる。 * 言語仕様解説 CHIPINOというGCBASIC用に開発されたボードの使用説明書 PDFで220ページ 文法等の詳しい解説がある。 http://www.greatcowbasic.com/uploads/9/2/9/8/9298268/gcb_chipino_user_manual_v1.0_-_sample.pdf * 引数の値渡し、参照渡し 参照渡し: 以前はできなかった様だけど、今は大丈夫になっている様です。 普通に"変数を引数にする形"で関数(sub,function)を書けば、"参照渡し"になる。
sub add5s( param1 as word , ansParam as word )
    ansParam = param1 + 5
end sub
上の場合、param1は参照渡しにする必要はないので、値渡しのほうが良い。(後述) (1) 引数は全てグローバル変数として定義される (2) dim answer as word add5s( 1, answer ) ' add5s呼び出し後のanswerは6。 値渡し: 変数の前に「in」を付ける。 参照渡しが必要ない変数は明示的にinを付けたほうがコード削減になる。
sub add5s( in param1 as word , in param1 as word )
    dim tmp as word
    tmp = param1 + param2
    ....
end sub
参照渡しで受け取りのみの場合: 結果を引数で受け取るだけの場合、「out」を付けるとSRAMの節約になる。
sub myAdd( in p1 as word , in p2 as word, out ans as word )
    ans = p1 + p2
end sub
* PORT等のビット設定にはbit型を使う (調査中): 再度ドキュメントを確認する必要あり 1と0の定数そのまま使える。 PORTB.5 = 1 ' ok PORTB.5 = 0 ' ok dim state as byte state = 1 PORTB.5 = state ' NG dim state as bit state = 1 PORTB.5 = state ' ok * サブルーチンのオーバライド(Override)可能 同じ関数名で引数の型や数が違うものを定義可能。 使用時に自動判別される。 これは便利。 http://gcbasic.sourceforge.net/help/_subroutines.html * 引数の初期値付きサブルーチン・コール
 Sub ErrorBeep(Optional OutTone As Word = 440)
      Tone OutTone, 100
    End Sub
* 間接サブルーチンコール(IndCall) http://gcbasic.sourceforge.net/help/_indcall.html 引数なしのサブルーチンを間接的に呼び出すことが可能、 C言語の関数ポインタ風。 * Loop系 http://gcbasic.sourceforge.net/help/_flow_control.html ループを途中で脱出するときは、 「exit for」「exit do」が使える。 Doループの場合、C言語の「continue」に相当するものはないようだ。 * コンパイルサイズ比較(2) (調査中): 参照渡し、値渡しを考慮して書き直す必要がある。 自分でやってみた。 コードの参照元 http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.ManchesterCode http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison 上のものと微妙に違うけど、まぁ同じ。 :D GCBASIC ver.0.9 (11/5/2014) BASCOM-AVR ver.2.0.7.5 MikroBasic v6.0.0 avr-gcc v4.8.0 の4つを比較した。 以下は、GCBASICのコード。
' Manchester codec for Great Cow Basic ver.0.9.11
' Made by audin 2014/06
' Refered to
' http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison
' http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.ManchesterCode
'
' For ATMega328p

#chip mega328p, 16

dim Index as byte
dim bitResult as bit

Sub Led_blink( State As Byte )
    Do
        If State = 1 Then
            Portb.5 = 1
            Wait 500 ms
            Portb.5 = 0
            Wait 500 ms
        Else
            Portb.5 = 1
        End If
    Loop
End Sub

' encode ...
function Encode( pValue as byte) as word
    Encode = 0 ' 戻り値は不定なので、初期化が必要
    for Index = 0 to 7
        if pValue.0 = 0 then
            Encode.14 = 1
        else
            Encode.15 = 1
        end if
        if Index < 7 then
            Encode = Encode / 4
        end if
        pValue = pValue / 2
    next
end function

' decode...
function Decode( pEncodedValue as word, pDecodedValue as byte) as byte
    bitResult= 1
    for Index = 0 to 7
        if ( pEncodedValue & 0x03 ) = 0x01 then
            pDecodedValue.7 = 0
        else
            if ( pEncodedValue & 0x03 ) = 0x02 then
                pDecodedValue.7 = 1
            else
                bitResult = 0
                exit for
            end if
        end if
        pEncodedValue = pEncodedValue / 4
        if Index < 7 then
            pDecodedValue = pDecodedValue / 2
        end if
    next
    Decode = bitResult
end function


Dim Orgval As Byte
Dim Wencval As Word
Dim Res As Byte

' main routine
Do
   For Orgval = 0 To 255
      wEncval = Encode(orgval )
      Res = Decode(wEncval , pDecodedValue )
      If Orgval <> pDecodedValue Then
         Led_blink(1)
      End If
   Next
   Led_blink(0)
Loop
end 
他のBasicコンパイラ用のコードはここにまとめた。 https://bitbucket.org/dinau/storage/downloads/basic-compiler-avr-size-check-manchester.zip 結果: BASCOM-AVR: 888 Byte GCBASIC : 648 Byte mikroBasic: 498 Byte avr-gcc: 372 Byte となった。 但し、GCBASICは、Decode()関数内のビットチェックがうまく動かない風なので ANDチェックに置き換えてある。(調査中) 分った。 Help - Syntax - Conditionsにこうある。 http://gcbasic.sourceforge.net/help/_conditions.html
Presently there is no way to combine bit tests with other conditions - NOT, AND, OR and XOR will not work.
「ビットチェックを他の条件と結合できない」とある。orz 但し、 BASCOM-AVRも2変数演算までしかできないという制限があったりする。orz * 予約語一覧 GCB@Syn\SynWrite\HL\GreatCowBasic.acp このファイルに一覧がある。 予約語を変数名や関数名に使ってはいけない。 間違えて予約語を変数名等に使ってしまうと、 意味不明な挙動に陥る可能性がある。 Helpに一覧がないので実は重要なファイルだったりする。 v0.96で消滅した様だ。orz グラフィカル開発: Great Cow Graphical BASIC Great Cow Graphical BASIC というショートカットで起動する。 教育用に使われている例: 大学で使われていました。 PIC用の記述になっています。 http://naosite.lb.nagasaki-u.ac.jp/dspace/bitstream/10069/28573/1/PIC%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E5%AE%9F%E7%BF%92%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88_3e.pdf 日本語なので結構参考になるかも。 * バグ関連 <紙>さんLoG http://jn1inl.blog77.fc2.com/blog-entry-868.html 上の方のブログによると、4〜6年くらい前にいろいろバグがあったとある。 それから、時は流れた。。。 ものの そもそもフォーラムをざっと見た限り、GCBASICは最初PIC用のコンパイラだったものが 後でAVRも加わったという感じだ。 さらにフォーラムを見ると、AVRのバグ報告が多いと思う。 で、 自分もAVRのバグにさっそく遭遇してしまいました。orz 従って、 最初に使うならPICマイコンにした方が良いかも、と思います。 ただ、AVRをバリバリ使ってたくさんバグ報告をした方が、 未来のためにはなると思う。:D
posted by Copyright (C) audin All Rights Reserved. at 00:00| Comment(2) | TrackBack(0) | PIC関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんにちは
AVRでif文のネストはこちらで試したところ問題なくコンパイルできました
Windows10,
IDE/コンパイラは古いタイプのバージョン GCB_Installer-99.exe.
APPCRASH問題は
1. Windows UpdateでWindowsを最新にする
2. ウイルス対策ソフトを停止する
3. 上記と同じ古いIDEを使う
で様子を見てはどうでしょう

Posted by audin at 2023年07月10日 12:32
初めまして。GCBの愛好家です。日本にはGCBフォーラムがないので、GCBについて質問したくても出来ません。そこで、教えてほしいのですが、GCBはAVR問題なく使用出来るのでしょうか。PicではGCBコンパイラは問題ないようですが、AVRで使用しようすると、APPCRASHなるエラーが出て、Hexファイルができません。同じコードをPicデバイス用でコンパイするとOKです。環境はwin7 win10です。
win10ではAPPCRASHはでませんが、コンパイルは中断されます。
問題個所は、if文のネスティングです。if文の中にif文を書くとエラーがでます。例えば、
 if xxxxx then
if xxxx then
xxxxx
else
xxxxx
end if
else
xxxx
end if
Posted by SkySea at 2023年07月07日 05:21
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。