2014年12月08日

LunaAVR: 無料のBASICコンパイラ LunaAVRのメモ 2014

AVR: 無料のBASICコンパイラ LunaAVRのメモ 2014

* 注意 (2015/10)
* はじまり
    コンパイルできないWindows:
    コンパイルできないLunaAVR
    症状:
* Windowsで使えるバージョン 2014/12
* 主要リンク
* ライセンス
* 対応AVR
* 開発環境
    IDE:
* 言語仕様
    概略:
    LEDチカチカ:
* IDEの起動
* Linux上でAVRに書き込む時のメモ
* コンパイル後にアセンブラリストをはき出す設定
* コンパイル後のサイズ情報を見る方法
* Terminal設定
* 問題点 :D
* 基本データ型の一覧
* お勧めなバージョンとそうでない。。。 (ry
* コード効率
    LunaAVR (1)
    LunaAVR (2) 改良版
    方法:
* 実行速度比較
* 条件コンパイル


* 注意 (2015/10)
(2015/10)追記
LunaAVRのWindows版の出来は,こちらで試した限り思わしくありません。
orz
コンパイルさえ出来ない状況が未だに続いていたりします。
orz

* はじまり
    AVR用の無料で使える強力そうなBASICコンパイラを見つけた。
    見つけたばかりで、まだアレだけど、
    言語仕様はかなり強力っぽい。
    オブジェクト指向のBASICコンパイラで、一部jalv2の様にPascal風味も入ってます。:D
* 重要:Windows上でコンパイル出来ない問題
    いきなりアレだけど、
    Windows版は自分のところでは、意味不明なコンパイルエラーが出て、
    使えませんでした。orz
    なので、Linux上で試しています。(WattOS-R8)
コンパイルできないWindows:
    Windows7(32bit)/Window8.1(64bit)
    Windows10 Technical Preview :D
コンパイルできないLunaAVR
    LunaAVR.r2.4
    LunaAVR.r1 build6835 (beta)
症状:
    コンパイルエラー。実際にはアセンブルエラーが出ている。
    コードに依存せず必ず出る。
    
    ' Filename: 0first.luna
    avr.device = atmega328p
    avr.clock  = 16000000
    avr.stack  = 32

    halt()
例えば非常にシンプルな上のコードをコンパイルすると、以下のエラーが出てどうしようもない のだった。orz lunaavr-windows-all-compile-error.png で、誰かWindows7/8.1上でコンパイル出来た人いる? と、聞いてみる。:D * Windowsで使えるバージョン 2014/12 上ではだめだったけど、2014/12/11 に新しいベータ版が出て、 それだとWindows上でコンパイルできました。 (^^)/ WindowsでOKなバージョン Version 2015.r1 build 7379 (beta) Version 2015.r1 build 7536 (beta) ダウンロード時の表示は、 LunaAVR 2015.r1 (beta) from 2014/12/11 要するに現在の最新ベータ版なら大丈夫ということです。 上記以外はダメでした。 (2015/10時点) ホッ! ダウンロード: http://avr.myluna.de/doku.php?id=en:download * 主要リンク LunaAVR: http://avr.myluna.de/doku.php ダウンロード: http://avr.myluna.de/doku.php?id=en:download スクリーンショット: http://avr.myluna.de/doku.php?id=en:screenshots フォーラム: http://forum.myluna.de/viewforum.php?f=1 * ライセンス 開発環境そのものはオープンソースではありませんが、ユーザは無料で使えます。 生成されたコードを商用利用してもOK。( 商用利用する場合、契約が必要なライブラリもあります。) * 対応AVR http://avr.myluna.de/doku.php?id=en:unterstuetzte_controller 8ビットのAVRはUSB付の物を含めほぼ全部使える感じ。 * 開発環境 IDE型で開発します。コマンドライン・コンパイルもできます。 Windows/Linux/Macで使えますが、Macはコマンドラインだけです。 IDE: lunaavr-ide.png mikroBasicやBASCOM-AVRを意識した大変結構な作りになっています。:D avrdudeとavrdude-guiっぽいものも搭載されていて、 Arduninoを持っていれば、そのまま書き込むことができます。 (自動でリセットもかかります。) Terminalアプリもついてます。 LCD用のフォントエディタなんかもあります。 きりがありません。xD * 言語仕様 概略: http://avr.myluna.de/doku.php?id=en:features 詳細はIDEのHelp-Language ReferenceでPDF参照できます。 LEDチカチカ: 以下は実際に、Arduino DuemilanoveコンパチブルボードでLEDチカチカさせつつ、 UARTに文字列を出力したコードです。 Arduino Duemilanove http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf
avr.device = atmega328p
avr.clock  = 16000000
avr.stack  = 32
uart.Baud = 9600
uart.send.enable

#define LED1 as portB.5   'LED1 is defined as label for portB.5
LED1.mode = output,low    'the port is configured as output and set to low
dim count as byte
do
  LED1 = 1                      'LED1 on
  waitms 500                    'wait for 500ms
  LED1 = 0                      'LED1 off
  waitms 500                    'wait for 500ms
  print "Count="; str( count )
  count++
loop 
普通っぽく書ける。 でも、 オブジェクト指向の構造化BASIC言語です。 この手の物としてはかなり強力な言語仕様だと思います。 やりたいことは、多分全部できるくらいの仕様を持っています。(^^)/ (1) C言語っぽい記述も一部使えます。 foo++ とか bar /= 3 とか 数値のシフトやローテートもできます。 (2) 各種基本内蔵ライブラリも揃ってます。 Timer,UART,PWM...... 以下は内蔵ライブラリ以外の追加ライブラリです。 http://avr.myluna.de/doku.php?id=en:libraries (3) 構造体もバリバリ使えます。ネストも可能。 (4) ローカル変数も使えます。 (5) 簡易的なマルチタスクは3種類サポートされています。 プリエンプティブ型 (TaskKernel) ノンプリエンプティブ型 (TaskMgr) Timerベース型 (TaskTimer) (6) ポインタ/関数ポインタも使えます。 (7) インライン・アセンブラも可能。 (8) 単精度の浮動小数も使えます。 (9) C言語と同様なマクロ定義もできます。 #define foo(bar,coo) as ( (bar) + 2 * (coo) ) の様な。 (10) #if #endif 等のプリプロセッサ・マクロも使えます。 きりがありません。xD ここにも書きましたが、BASCOM-AVR(試用版)は2変数演算までしかできないとか、 GCBASICはif文でビットチェックとそうでない評価式の連結ができない という制限がありましたが、 LunaAVRにはそういう制限はありません。 * IDEの起動 解凍したら、「LunaAVR.exe」をダブルクリックします。 * Linux上でAVRに書き込む時のメモ Arduino DuemilanoveはFTDIベースのUARTなので、 デバイス名は「/dev/ttyUSB0」となる。(dmesgで確認) そのままだとPermissionエラーがでるので、ルート権限で、
# chgrp 自分のログイン名 /dev/ttyUSB0 
とした。(udev変えた方がいいのかもしれないが) Settings - Uploader/Programmer - Uploaderタブ Windowsの場合、「/dev/ttyUSB0」を「Com3」等に変えれば良い。 lunaavr-settings-uploader-linux.png * コンパイル後にアセンブラリストをはき出す設定 Options - Compiler - Compilerタブで、 Optionsのところを 「-v -ohbrayzs -w1 "%file%" 」 とする。 ソースコードと同じ場所にリストファイルや中間ファイルが出る。 * コンパイル後のサイズ情報を見る方法 Project - Show Report Summary を選択する。 * Terminal設定 Tools - Open terminal で設定する。 * 問題点 :D (2) UART出力を内蔵ターミナルで表示する場合のボーレートは 「9600bps」以外は正しく表示できませんでした。 orz コンパイラの問題かターミナルの問題かは不明。 * 基本データ型の一覧 数値のカンマとピリオドが逆に表記されている。 lunaavr-data-types.png 以下の項目については保留とします。下記参照。 * お勧めなバージョンとそうでない。。。 (ry ハマリました。orz 現在の安定版は「2014r2.4」だけどこれはダメだ。orz コンパイラがどこかバグってる。 orz orz 同じテストコードはベータ版の「2015r1.build6835」のほうなら問題なく動く。 orz 気付くのに時間がかかった。orz ここまでの、結果、 少なくとも、 安定版「2014r2.4」はお勧めではない。 * 重要な記述順序 フォーラムの方からまた教えていただきました。 上記で不安定としていた状況はどうも書き方が悪かった可能性が高そうです。 今となっては思い出せないので、正しい書き方を記載しておきます。 メインルーチンは、必ず関数やサブルーチンより前に書くこと。 これを守らないと挙動不審になるそうです。 以下に簡単な正しい例を示します。
avr.device = atmega328p
avr.clock  = 16000000
avr.stack  = 32
uart.Baud = 9600
uart.send.enable

#define LED1 as portB.5   'LED1 is defined as label for portB.5
LED1.mode = output,low    'the port is configured as output and set to low
dim count as byte
' main routin
do
    led_on()
    waitms 500  'wait for 500ms
    led_off()
    waitms 500  'wait for 500ms
    print "Count="; str( count )
    count++
loop

' 関数、サブルーチン群は必ずメインルーチンの下に書く。
procedure led_on()
  LED1 = 1      'LED1 on
endproc

procedure led_off()
  LED1 = 0      'LED1 off
endproc 
* コード効率 オブジェクト指向のオーバーヘッドがあるので、ちょっと大きい感じ。 attiny系ではちょっとつらいかもしれない。 と、 思ったところ上記フォーラムに、このページのことを24時間以内に:D 書き込んだ人がいて、 http://forum.myluna.de/viewtopic.php?f=8&t=808 もっとコードサイズが小さくなるソースがアップされています。 さらに開発者も加わって、「アセンブラを使った追加モジュール10分で出来てアップした」 とか、 「こう書けばさらにコードは小さくなるし、速度もアップする」とか、 あっという間に料理されちゃいました。xD
Manchester codec コードサイズ 比較
コンパイラコンパイルサイズ補足
Arduino 1.0.6 / 有料1280 Byte
LunaAVR (1) (2015r1.build6835) / 無料1104 Byte
BASCOM-AVR (2.0.7.5) / 有料888 Byte試用版
GCBASIC AVR 25/05/2014/ 無料648 Byte
LunaAVR (2) (2015r1.build6835) / 無料514 ByteEncodings.module使用
mikroBasic AVR (6.0.0) / 有料498 Byte試用版
avr-gcc / 無料372 Byte
以下は実際に試したコード。 LunaAVR (1) 以下のコードはコードサイズも実行速度も効率が悪い書き方なんだけど、 他の全てのBASICコンパイラもほぼ同一の記述」をした訳だから、 癖みたいなのが出ていて興味深いと思います。
' Manchester codec for LunaAvr
' Made by audin 2014/12
' 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

avr.device = atmega328p
avr.clock  = 16000000
avr.stack  = 32

#define LED1 as portB.5   'LED1 is defined as label for portB.0
LED1.mode = output,low    'the port is configured as output and set to low

' Global defs
Dim Index As Byte
Dim bOrgval As Byte
Dim wEncval As Word
Dim bDecval As Byte
Dim bRes    As Byte

' main routine
Do
    For bOrgval = 0 To 255
        wEncval = Encode( bOrgval )
        bRes = Decode( wEncval , bDecval )
        If bOrgval <> bDecval Then
            Call Led_blink(1)
        End If
    Next
    Call Led_blink(0)
Loop

' 関数、サブルーチン群は必ずメインルーチンの下に書く。
procedure Led_blink( byval state As Byte )
    Do
        If state = 1 Then
            LED1 = 1
            Waitms 500
            LED1 = 0
            Waitms 500
        Else
            LED1 = 1
        End If
    Loop
Endproc

'Encode...
Function Encode( byval bValue As Byte) As Word
    dim  Encode as word
    Encode = 0
    For Index = 0 To 7
        If bValue.0 = 0 Then
            Encode.14 = 1
        Else
            Encode.15 = 1
        End If
        If Index < 7 Then
            Encode >>= 2
        End If
        bValue >>= 1
    Next
    return Encode
Endfunc

' Decode...
Function Decode( byval bEncodedValue As Word , byref pbDecodedValue As Byte) As Byte
    dim Decode as byte
    Decode = 1
    For Index = 0 To 7
        If bEncodedValue.1 = 0 And bEncodedValue.0 = 1 Then
            pbDecodedValue.7 = 0
        Elseif bEncodedValue.1 = 1 And bEncodedValue.0 = 0 Then
            pbDecodedValue.7 = 1
        Else
            Decode = 0
            break
        End If
        bEncodedValue >>= 2
        If Index < 7 Then
            pbDecodedValue >>= 1
        End If
    Next
    return Decode
Endfunc 
LunaAVR (2) 改良版 開発者の方が速攻で作ってアップしてくれたEncodings module(モジュール)を使ったバージョン。 コードサイズも実行速度最強になってます。 アセンブラで書かれたモジュール関数なので「avr-gcc」をも凌駕しちゃいました。(^^)/ 方法: このページに http://forum.myluna.de/viewtopic.php?f=8&t=808 アップされている「Encodings.module」というファイルを(要登録・ログイン) lunaavr-[version]/Library 内に上書きコピーすれば、以下のコードをコンパイル出来る。
' Manchester codec for LunaAvr with Encodings module
' Made by audin 2014/12
' Danke forum guys. 
'  Refered to
'  http://forum.myluna.de/viewtopic.php?f=8&t=808
'
' 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

avr.device = atmega328p
avr.clock  = 16000000
avr.stack  = 32
#library "Library/Encodings.module"

#define LED1 as portB.5   'LED1 is defined as label for portB.0
LED1.mode = output,low    'the port is configured as output and set to low

Dim bOrgval As Byte
Dim wEncval As Word
Dim bDecval As Byte
Dim bRes    As Byte

' main routine
Do
    For bOrgval = 0 To 255
        wEncval = ManchesterEncode( bOrgval )
        bRes    = ManchesterDecode( wEncval , bDecval )
        If bOrgval <> bDecval Then
            Call Led_blink(1)
        End If
    Next
    Call Led_blink(0)
Loop

' 関数、サブルーチン群は必ずメインルーチンの下に書く。
procedure Led_blink( byval state As Byte )
    Do
        If state = 1 Then
            LED1 = 1
            Waitms 500
            LED1 = 0
            Waitms 500
        Else
            LED1 = 1
        End If
    Loop
Endproc 
* 実行速度比較
Manchester codec 256 loop
コンパイラ実行速度補足
LunaAVR (2015r1.build6835)/無料4.9 msecEncodings.module 使用
Arduino 1.0.6 / 無料6.4 msec
avr-gcc / 無料=Arduino
mikroBasic AVR (6.0.0) / 有料11 msec試用版
BASCOM-AVR (2.0.7.5) / 有料32 msec試用版
LunaAVR (2015r1.build6835)/無料101 msec
GCBASIC AVR 25/05/2014/無料107 msectimer系がバグってる
orz
* 条件コンパイル
#define TEST as 0
...
#if TEST = 1
    ...
    Waitms 100
    foofunc()
    ...
#else
    ...
    Waitms 200
    barFunc()
    ...
#endif
の様に書ける。
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(4) | LunaAVR | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
申し訳ありませんが、このルナ&#183;コードは、正しい1320から500バイト、8ミリ秒(クラッシュ)間違っている:
http://forum.myluna.de/viewtopic.php?f=8&t=808
Posted by horst at 2014年12月09日 16:22
Hi horst,

Vielen Dank.
Beschreibung des Forums war sehr hilfreich.

情報ありがとう。
avrin
Posted by avrin at 2014年12月10日 23:28
hello avrin,

your luna code is wrong, because the main loop must placed at first! methods and classes must placed behind main loop. the compiler encodes the methodes and see it first. that is the reason why your native code took more time. it runs into the method code first. this fails.

best regards, horst :-)
Posted by horst at 2014年12月11日 14:27
Hello horst,

Thank you for the information of the correct coding order.
I've fixed its description of my blog.

avrin
Posted by avrin at 2014年12月11日 22:35
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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