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) avrin All Rights Reserved. at 00:00| Comment(0) | TrackBack(0) | PIC関連 | このブログの読者になる | 更新情報をチェックする

2013年05月21日

PIC18F: SDCC Tips (2) 2013

SDCCの最新版v3.3.0がリリースされています。
http://sourceforge.net/projects/sdcc/files/sdcc-win32/3.3.0/
SDCCというのは、PIC18F用のC言語コンパイラを含んだ無料のツール。

SDCCの過去のバージョン全ての累計ダウンロード数は40万回程度。
1つの正式版の平均は3万回程度でしょうか。
さらにナイトリービルドを加えると相当数のユーザがいそうです。
ただし、そのなかでPICユーザがどれくらいいるかは不明。:D

以下、SDCCのPIC18Fコンパイラについての話。

* ソフトウエア・スタックは256バイト
関数の引数の保持やローカル変数を保持するソフトウエア・スタックのサイズは
256バイトである。(スモールモデルの場合)
ラージモデルを使えば制限はなくなるが、現在ラージモデルはデンジャラス扱い。
orz
従って、大きなローカル配列を使ったりするのは、ちょっとアレかも。
そういうのはグローバル配列にするのが無難。
posted by Copyright (C) avrin All Rights Reserved. at 20:50| Comment(0) | PIC関連 | このブログの読者になる | 更新情報をチェックする

2013年01月27日

SDCC Tips 2013

SDCC Tips 2013

* はじまり
* SDCCツール群
* バグや注意点
* MPLAB でSDCC。 使えない
* MPLABX で SDCC。 標準装備
* SDCC 最新バージョン
* SDCC / C18 / HI-TECH Cでソース・コードをある程度共通化する時のTIPS
* "Microchipのヘッダファイル、ライブラリ"とGPL問題
* SDCCコマンドライン・コンパイル・プロジェクト
* ダウンロード
    使い方:


* はじまり
Pinguinoプロジェクトで採用されているC言語コンパイラ、SDCC。
http://sdcc.sourceforge.net/

動作に不審な点があったので、まずはSDCCで簡単なプログラムをコンパイルしてみようと
試したところ、意外にハマってしまって大変でした。

以下は、SDCCをPIC18Fで使ってみた時に遭遇した問題点や、
コンパイル方法等をメモする。

* SDCCツール群
2013/01時点で取得できる最新のWindows用のインストーラ付バージョンを使用する。
SDCC:   v3.2.0 #8008 (Jul  6 2012) (MINGW32)
        http://sourceforge.net/projects/sdcc/files/sdcc-win32/ 
        後述の最新バージョンを使って下さい.。
gplink: gplink-1.0.0 #925 (Dec 23 2012)
    パッケージ名は「gputils-n.n.n.exe」。
        http://sourceforge.net/projects/gputils/files/gputils-win32/
上記2つの場所からインストーラ(*.exe)を取得、実行します。
後述の理由から、全てインストーラのデフォルト設定を選択します。
すなわち、
SDCC:
インストール先: C:\Program Files\SDCC
実行パス:       C:\Program Files\SDCC\bin (パスの自動設定を選択します)
gputils:
インストール先: C:\Program Files\gputils
実行パス:       C:\Program Files\gputils\bin

フォルダ名にスペースが入るのがイヤですが、我慢してここにインストールします。:D

* バグや注意点
#pragma config 問題
(1) PIC18Fのconfig設定は、単一行にしか書けない。
これは、このバージョンのバグの様だ。(でも以前からあった風 :D )
複数行に書くと2行目以降の設定値は無言で無視されます。orz (注1)
#pragma config CP0=OFF,OSCS=ON,OSC=LP,BOR=ON
上の書き方はOK。 以下の書き方も実質1行なのでOK。
#pragma config  PLLDIV=2 ,\
CPUDIV  =    OSC1        ,\
OSC     =    INTOSCPLL   ,\
WDTEN   =    OFF         ,\
STVREN  =    ON
(2) PIC18Fのconfig設定は、「const修飾子」と同居できない このバージョンのSDCCのバグの様で、「#pragma config」を記述したファイルを コンパイルすると、余分の「codeセクション」が定義されていまい、(注1) 「const修飾子」を伴った定数、文字列等が同じファイル内にあると、 「codeセクションの多重定義」でコンパイルエラーになる。 orz gplink問題 gplink単独でリンク(最終的にHEXファイルを生成)すると、動作不良のHEXファイルが生成される。 これ今回、最も大きくハマリました。orz orz orz ソースコードの状況によって、動作したり、しなかったり、中途半端に動作したりという、 かなりイヤな状況に陥りました。 orz 回避策: リンクする時も「sdcc.exe」を使います。(sdcc.exeが内部でgplinkを呼び出す) そうすれば大丈夫でした。(注2) * MPLAB でSDCC。 使えない MPLAB用のSDCCプラグインがあるものの、MPLAB(v8.87)やgputilsが新しくなったので もう使えませんでした。 http://kanga.gerbilator.org/Microcontrollers/MicroChip-PIC/PIC%20from%20Sony%20stick/SDCC/ わざわざ、古い環境に戻す気になれないので放置します。 :D (2013/02) SDCCのコマンドライン・コンパイル方法やMPLAPXの設定から得たノウハウを元に、もう一度MPLABの 設定を見直したところ、うまくコンパイル可能になりました。 設定方法は、そのうちまた。 * MPLABX で SDCC。 標準装備 MPLABX v1.60では、SDCCプラグインが標準装備されています。(注9) ただし、アセンブラレベルのデバッグしかできないのと、デバッガはかなり使いにくい印象です。(現時点では) 「Tools」-「Plugins」-「Avaiable Plugins」画面で、SDCCにチェックを入れて 「Install」ボタンを押した後、MPLABXを再起動します。 「Tools」-「Options」-「Embedded」-「Build Tools」タブの「Toolchain」リストに SDCCがなければ、「Scan for Build Tools」を実行します。(リストに表示されるのに時間がかかる気がします) この時、上の方で書いた「SDCCとgputilsのデフォルト設定インストール」が、 「以前のMPLABX SDCCプラグイン」では必須でした。(最新版で必須かどうかは未確認です) IDEでの設定: 内容は何でもいいので、例えば「PIC18F26J50」のプロジェクトをMPLABX上で作ったとします。(注8) プロジェクトのプロパティ画面を開くと(注7)、右下の「Compiler Toolchain」に「SDCC Toolchain」が追加されているので、 選択して「Apply」ボタンを押します。 オプション設定: 画面左のCategories:で「sdcc」を選択、画面右下あたりの「Additional options」に「libc18f.lib」を追加します。 その他はデフォルト設定のままで良いです。すなわち、注目点として General -「Use non free libraries/header」:「--use-non-freeオプション」なので 必須。 PIC16 exclusive options - 「Stack-size」: Smallを選択。 を最低限選択します。(デフォルトで設定済み) 注意ポイント: コンパイラをSDCC以外に変更したままMPLABXを終了すると、変更を加えたSDCCオプションを忘れてしまうので、 再設定が必要です。(libc18f.lib等) * SDCC 最新バージョン ここから、毎日の最新バージョンが取得出来るようです。 http://sdcc.sourceforge.net/snap.php 試しに以下の最新版をインストールしてみたら、 sdcc-20130127-8398-setup.exe 上記、「#pragma config問題 (1),(2)」は見事に解決されていました。 もっと早く気づくべきでした。 orz orz あと付属マニュアルもかなり増補されている様です。 特に最初の方の「Compatibility with previous versions」は、SDCCの古いバージョン2.x系,3.X系との 差異が書かれているので必読。 * SDCC / C18 / HI-TECH Cでソース・コードをある程度共通化する時のTIPS これは、凝りだすときりがないのでほどほどにします。 :D ソースコード中で以下の定義済みマクロを使って状況を判別します。(注10) コンパイラを判別する: SDCC: __SDCC_pic16 PIC18F用コンパイラであることを判別できます。(__SDCC_pic14(PIC16F系用)もあります) SDCC v3.20以降では最初にアンダースコア2個付けるのが標準となりました。 C18: __18CXX C18コンパイラであることを判別できます。 XXのところはそのまま"XX"と書きます。 HI-TECH PICC18: __PICC18__ HI-TECHのPIC18F用Cコンパイラであることを判別できます。 PICの種類を判別する: 「PIC18F26J50」を例にします。 SDCC: __18f26j50 全部小文字です。他の書き方はマニュアルを参照してください。 C18 / HI-TECH PICC18: __18F26J50 全部大文字です。(オイ 大文字でも小文字でも、どちらかに統一してほしいです。 上記定義群を使って、「#ifdef文」や「#if defined()文」で判別します。 * "Microchipのヘッダファイル、ライブラリ"とGPL問題 SDCCにはMicrochipが提供している「マイコンごとのヘッダ・ファイルとライブラリ・ファイル」が含まれている。 これらのファイルがGPLに適合しないので(注4)、最近のSDCCでは「non-freeフォルダ」に分離されている。 Debian SqueezeではSDCC自体が排除されてしまっている。(apt-getで標準インストールできない)(注3) ざっと見た限りGPLの日本語FAQでは、以下の項目に関連すると思われます。 http://www.gnu.org/licenses/gpl-faq.ja.html#WhatDoesCompatMean http://www.gnu.org/licenses/gpl-faq.ja.html#TOCGPLIncompatibleAlone http://www.gnu.org/licenses/gpl-faq.ja.html#TOCMereAggregation 結局、SDCC自体は「non-free」に分離することで難を避けたものの、 問題はこれらのヘッダ・ファイル、ライブラリを利用するユーザ側に発生するとになります。 (この問題は根源的なもので、当初から発生する状況だった) 例をあげれば、純粋なGPLモジュール(例外事項なし)をどこからか持ってきて、 上記Mirochipのファイル群をインクルードして使った時点で、GPL違反となる。(再配布不可)(注6) 大丈夫なのは、上記Microchipのファイル群に対する例外条項付GPLのモジュールを使うか、 自分でスクラッチからコードを書いて例外条項付のGPLを付与した場合のみである。 このGPL問題は今回のSDCCに限らず、Microchipの提供するヘッダ・ファイル、ライブラリを 使用する場合に必ず発生するのである。(注5) 今回の調査により、PIC用のプログラムがGPLに絡むときは要注意であることが分りました。 * SDCCコマンドライン・コンパイル・プロジェクト MakefileとSConsを使ってビルド出来るサンプルプロジェクトを作りました。(注11) コンパイルするための雛形なので内容は、あまり意味がないです。 内容: タイマー割込みを基準に周期関数を登録して実行出来るようにしました。 Arduinoのタイマーイベント関数(MsTimer2)の様な感じになると思います。(詳細未確認) 周期関数は10個まで登録(create)できます。 登録した周期関数の「sleep」「resume」「delete」ができます。 PIC18F26J50/PIC18F2550/18F14K50、MPLAB、MPLABX、及びコマンドライン(make,SCons)からコンパイル実行できます。 コンパイラは、SDCC,C18,HI-TECH PICC18に対応しています。(#ifdef文で自動判別するようにしています) メイン関数は以下の様な感じです。 UART経由で周期関数の「sleep」「resume」「create」をするデモです。 UARTを「stdio.h」のprintf()関数に接続してあるので簡単なデバッグ用途に使えると思います。
/********************
 * main_loop
 ********************/
void main_loop(void)
{
    switch( getch() ){
        case 's':    /* スリープ とレジュームをトグル */
            event_state( led_id )    == RUN ? event_sleep( led_id ):   event_resume( led_id );
            event_state( print_id )  == RUN ? event_sleep( print_id ): event_resume( print_id );
            break;
        case 'd':    /* 周期関数の削除 */
            event_delete( led_id );
            break;
        case 'c':    /* 別周期の周期関数として再登録実行 */
             event_delete( led_id );
             led_id  = event_create( led_toggle , 100);
            break;
        default:
             break;
    }
}

/********************
 * main
 ********************/
void main( void )
{
    sys_init();
    setup();
    GIE_enable();
    PEIE_enable();

    led_id      = event_create( led_toggle , 500);   /* 500msecの周期関数を登録 */
    print_id    = event_create( print_task , 3000);  /* 3秒の周期関数を登録 */

    while(1){
        event_dispatch(); /* ディスパッチャの実行 */
        main_loop();
    }
}
* ダウンロード 準備中 使い方: (注1)生成されたアセンブラ・ファイルを見るとわかる。 (注2)サクッと書いてますが、かなり大変でした。(TT) (注3)Squeezeより後のDebianでは改善される模様。 (注4)使用はMicrochipのデバイスに限るという制限事項。 (注5)当然、BSDやMITライセンス系なら問題ない。 (注6)そのGPLモジュールの作者から許諾を取るという手もなくはないが...。 当然、再配布しなければ問題ない。 (注7)画面左上の「Projects」領域でプロジェクト名を選択、右クリックで「Propaties」を選択する。 (注8)MPLABからMPLABXに既存のプロジェクトをコンバートするのも簡単にできる。 (注9)MPLABX用のSDCCプラグインはこのページがオリジナルのようです。 https://sites.google.com/site/rmaalmeida/mplabx-sdcc-toolchain (注10)詳細はコンパイラのマニュアル参照。 (注11)MPLAB、MPLABXでもコンパイル可能な様にしました。 参考リンク: PIC18F: 超効率Cコンパイラ CPIK
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | PIC関連 | このブログの読者になる | 更新情報をチェックする

2012年01月26日

秋月にPIC18Fシリーズ新増量入荷 2012/01

秋月にPIC18Fシリーズ新増量入荷 2012/01
*PIC18Fが20種類以上増えた
http://akizukidenshi.com/catalog/c/cpic18f_dI_srd/
全部は見れてないけど、品種が増えた。

PIC18F26J50: 12MIPS,5V不可, EEPROMなし
	待望の260円
	FLASH 64kbyte , SRAM 3776byte USB機能付 2V〜3.6V。
	I2C/SPI/UART端子は5Vトレラント。
	http://akizukidenshi.com/catalog/g/gI-05396/
	このマイコンは今年中に「Pinguino(http://www.pinguino.cc/)」でサポートされる。
	これは買っておこう。 

PIC18F26k22: 16MIPS,3.3V/5V ok, EEPROM 1024byte
	220円
	FLASH 64kbyte , SRAM 3896byte USBなし
	http://akizukidenshi.com/catalog/g/gI-05398/

	USBが不要なら、このマイコンが最も注目株だろう。 3.3V〜5V両用で使える上、
	完全独立な I2Cx2, SPIx2, UARTx2, Timerx7 等周辺機能がてんこ盛りだ。


あッ! エラッタ見てないや。

air_variableさんのページで紹介されている、
http://airvariable.asablo.jp/blog/2012/01/27/6309699
必要な機能からPICを選択するツールが便利。
http://www.microchip.com/maps/microcontroller.aspx


*電源電圧とUSB機能
USB付で5Vと3.3V系で使えるのは「18F14k50」しかないという事実。(系列品種は省略)
PIC 3.3V 5.0V USBEEPROM etc
18F26J50 - - 28pin
18F2550 - 256b 28pin
18F14k50 256b 20pin
18F26k22 -1024b 28pin
「18F26J50」が「18F2550」の代替にならない事実。 orz そんなわけで、便利なので「18F14k50」は3つ持ってる。(^^)/  ただ、周辺機能は今一歩の感があるのも事実。 *新型16Fとの比較 *PIC24F (TT) PIC16/18が新シリーズ増量されたのに対してPIC24Fは、もう何年も放置状態。 (TT) せめて秋月は、USB付の「PIC24FJ64GB002」を250円で出すべき。(オイ 以下の話は、2011年末に一旦保留にしたけど、今回増えた秋月品で使えるかも。 *PIC18F Amicus18:無料のBasic言語 開発環境 http://www.myamicus.co.uk/content.php Basicコンパイラを使ったArduino風?、お気楽極楽開発環境らしい。 1,使用可能なPICがPIC18F25k20/PIC18F25k22の2種類に限られるものの、 (容量違いのPICは使えるはず) Basicコンパイラが無料で容量無制限で使える。結構フルセットの言語仕様風。 浮動小数ライブラリあり。 2,周辺I/Oライブラリもあるようだ。 3,USB未対応マイコンなので、RS232Cドライバ経由で使う。 探査ポイント:  1,Basicコンパイラは、秋月PICで使えるかどうか。  2,Basicコンパイラのコード効率? 探査結果:  1, 容量違いのPIC   今回の秋月の品種追加により、以下のPICが使える。(^^)/   PIC18F26k22 220円 FLASH 32kbyte, SRAM 1.5kbyte まで使える。   PIC18F23k22 160円 FLASH 8kbyte, SRAM 512byte めいっぱい使える。   PIC18F26k20 190円 FLASH 32kbyte, SRAM 1.5kbyte まで使える。   PIC18F23k20 150円 FLASH 8kbyte, SRAM 512byte めいっぱい使える。  http://www.myamicus.co.uk/showthread.php?239-Pic18f2550  容量違いのマルツで買える「18F24k20」も使える。 http://www.marutsu.co.jp/shohin_58642/ 2,  このProton Basicというのは、業界でもトップクラスのコード効率のようだ。  この無料バージョンの最適化制限についてはさらに探査が必要だ。 Amicusのコード効率:  コンパイラの最適化について調べてみた。と、言っても、コピペして  コンパイルしただけだけど。  このページの「Proton Basic」用のコードをコピペしてコンパイルします。  http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.ManchesterCode こうなります。 amicus-ide-1.gif  結果は、業界でもトップクラスのコード効率をたたき出していることがわかります。  http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.Comparison  このコンパイラが無料で使えるのは良い感じ。 サンプルコードは、 C:\Documents and Settings\[User]\Amicus\Samples にインストールされるので忘れがち。
posted by Copyright (C) avrin All Rights Reserved. at 21:50| Comment(0) | PIC関連 | このブログの読者になる | 更新情報をチェックする

2011年12月29日

PIC: 超効率コンパイラ jalv2 入門 2012, 2017 (1)

PIC: 超効率コンパイラ jalv2 入門 2012, 2017 (1)
* はじまり
* jalv2: 完全無料、制限なしのPIC用コンパイラ
* 注意ポイント
* Jalv2 ドキュメント・言語仕様 (2017/02追記)
* Jallib API仕様 (2017/02追記)

Jalv2の構文
* コメント
* 関数の定義
* CONFIG値の設定
* 割込みルーチン
* ブートローダと先頭アドレス
* インライン関数
* asm文/インライン・アセンブラ
* 複数行コメント
* Alias機能
* 変数の再定義、部分再定義、ビット定義
* 擬似変数
* case文
* 文字列
* 制御構造 (while/for/repeat)

* RAM BANKと配列について (2016/12追記)
* FlashサイズとSRAMを削減するコンパイルオプション (2016/12追記)


* インストール
* JALEdit:
* LEDチカチカ/PIC16f1827
* Pickit2 + pk2cmd.exe で書き込み
* USBブートローダ
* I2Cマスター/スレーブでLEDチカチカ(1)
* I2Cマスター/スレーブでLEDチカチカ(2)
* USB-CDCサンプルを試す
* LCDサンプルを試す(hd44780互換)
* 新型PIC対応
* jalv2の構文色分けに対応しているエディタ

* 最新バージョン
* Jalv2コンパイラについてのメモ
* Jallibついてのメモ

* はじまり
埋もれたままにしておくのは惜しい言語、Jal。

JALv2 Homepage
    http://www.casadeyork.com/jalv2/
jallib JAL V2 libraries
    ダウンロード
    http://justanotherlanguage.org/downloads
    ソースコード
    https://github.com/jallib/jallib
Jal言語メーリングリスト
    http://tech.groups.yahoo.com/group/jallist/
Jalライブラリ・メーリングリスト
    http://groups.google.com/group/jallib
チュートリアルサイト
    http://justanotherlanguage.org/
jaluino
    http://code.google.com/p/jaluino/

* jalv2: 完全無料、制限なしのPIC用コンパイラ
jalv2とは、一部Pascalの文法を取り入れたPIC用(10F,12F,16F,18F)の開発言語。
オープンソース(BSD, zlibライセンス)。

海外では3冊の書籍が発売されている。  英語 書籍のサポートページ 他国語
(同じ内容で英語、他国語、PaperBack版。この書籍用のライブラリはGPL)

言語としてはJal言語だけど、ここでは同じ意味で「jalv2」も使う。
また「jalv2」とは、現在のリリースの総称的な意味も含む事にする。
なぜなら、検索時に「jalv2」とした方が良いからである。(爆
使用コンパイラのバージョンは基本的に最新正式版を使用する。

Jal言語の特徴は、
1, Jal ≒( Pascal言語 + C言語 + Basic言語 + スクリプト言語 ) 風味÷ 5
    という感じ。(オイ
    Pascalのサブセットをベースに、Pascalの「嫌みなところ」を :D
    ある程度取り去って、現代風にアレンジした感じ。
    比較演算子等はC言語風なので違和感は少ないし、C言語へのコンバートも容易。
    とにかく、シンプルでイージーな言語。
    読み易さ、書きやすさへの配慮:
        例えば、数値表現として「_」アンダースコア区切りで書ける。
        4MHzは、4_000_000
        ビット値は、0b10_01_01_11 等。

        代入文は「:=」でなく、「=」でよい。  (^^)/
        「begin, end」はいらない。  (^^)/
        変数定義はC言語と同じ順。  (^^)/
        比較演算子やビットシフト、割り算もC言語と同じ記法、又は違和感が少ない記法  (^^)/

      従って、イージーなJal言語を学べばC言語への移行もスムースと思われる。
      また、Arduino系やBasic言語、C言語入門程度の知識があれば容易に理解可能と思われます。

2, 完全無料、制限なしのPIC開発言語としては製品版にも匹敵する、
    トップクラスのコード効率をたたき出す。
    と思われる。
    ここを参照
    PIC18F: 超効率Cコンパイラ CPIK

3, 対応PIC   (jallib 1.2.0)
    完全無料、制限なしでPIC10FからPIC18Fまでカバーするのは良い。
        http://avr.client.jp/jallib_full-1.2.0/lib/
    秋月で売っている「お値打ち感のあるPIC」や「入門用PIC」には、ほとんど対応している。

4, ライブラリ/サンプルが豊富
    ライブラリは「jallib」という別プロジェクトとして存在する。
        http://avr.client.jp/jallib_full-1.2.0/sample/
    全ては挙げないが、
    adc, pwm, can, eeprom, lcd, glcd, usb-cdc, spi, uart, sd-card, i2c(master/slave)など一式。
    PIC18F系は、Jal言語で書かれたUSBブートローダや、USB-CDCサンプルがある。

    これらのライブラリが「BSD/zlibライセンス」なところが良い。
    ライセンスに基づいてC言語にコンバートして使うことも可能。

    特に「18F14k50」、「18F2450(18F2550で使える)」のサンプルが多いのはうれしい。

  サンプル/ライブラリのライセンスが明確:
    MikroCなどの無料版には制限がある。気にいったら買えばいいんだけど(爆
    無料で使える商用版のライブラリやサンプルコードが多数ある場合でも、
    改変の有無を問わず、自由に再配布できないものや、ライセンスが不明確な場合が多い。
    その点、
    Jal言語+Jallib の場合、BSD/zlibライセンスの下で改変や再配布が自由に出来る
    メリットは大きいだろう。
5, コマンドライン・コンパイラはWindows,Mac,Linux上で動作可能。

* 注意ポイント
そうは言っても、ボランティアベースでぼちぼち維持されている物なので、
それなりの広い心は必要かと思います。
Jalのメーリングリストはもう12年も続いています。
不具合や不明な点はメーリングリストを参照、参加するのが吉かも。(英語だけど。 orz)

以下、Jal言語を使う時のポイントを記述する。詳細はマニュアルを参照。

* Jalv2 ドキュメント・言語仕様 (2017/02追記)
Jalv2 言語仕様書:
    PDF: http://avr.client.jp/jallib_full-1.2.0/compiler/jalv2.pdf
    TXT: http://avr.client.jp/jallib_full-1.2.0/compiler/jalv2.txt
Jalv2 コンパイル・オプション:
    PDF: http://avr.client.jp/jallib_full-1.2.0/compiler/jalv2opt.pdf
    TXT: http://avr.client.jp/jallib_full-1.2.0/compiler/jalv2opt.txt
Jalv2 pragmaディレクティブの仕様:
    PDF: http://avr.client.jp/jallib_full-1.2.0/compiler/jalv2pragma.pdf
    TXT: http://avr.client.jp/jallib_full-1.2.0/compiler/jalv2pragma.txt

* Jallib API仕様 (2017/02追記)
    各種ライブラリの説明と、サンプルコードにアクセスできる様にしておきました。
    http://avr.client.jp/jallib_full-1.2.0/doc/html/

* 大文字小文字の区別はありません
これは、Pascal言語やBasic言語と同じ。

* 変数の初期化
初期値なしのグローバル変数は、プログラム開始前の時点で"0"に初期化されません。
オプションで"0初期化可能"の様ですが、例外事項があったりと分かりにくいので、
自分の場合"0初期化"が必要な場合、プログラム内で明示的に行っています。

*コメント
「--」(マイナス2つ)又は、「;」(セミコロン)以降がコメントとなる。(行末まで)
「;」セミコロン以降がコメントであることを利用して、
このブログでは以下のような記述を使用する。
青文字がコメント。
-- この行はコメント
if( INTCON_TMR0IE & INTCON_TMR0IF ) then
    INTCON_TMR0IF = 0;  /* 要求フラグをクリア */
    TMR0 = 0xF0;        /* カウント値の再設定 */
end if
上のようにC言語風に見せかける事が出来る。 少なくとも「Pascal言語」には見えない。 従って、C言語への移行も、お気楽。 「;」は文の区切りではなくコメントの開始マーク。 言語規約上、1行中の複文は未対応である。 *関数の定義 procedureはC言語の「void関数」と同じ。(値を返さない関数) 変数の定義順がC言語と同じなので違和感が少ない。「begin, end 」も必要ない。 黄色は型を表す。「var ..」でローカル変数を定義する。
procedure proc_name( byte in foo, word in bar ) is
    var byte baz, zoo;       /* ローカル変数定義 /
    var dword bal;

    TRISIO_TRISIO0 = output; /* 出力に設定  */
    GPIO_GP0       = on;     /* Hを出力     */ 
    ...
end procedure
上で1行目の最後に「is」が必要。 戻り値が必要な関数はfunctionで以下のように定義する。 ちょっと変態チック (オイ
function func_name( byte in foo, word in bar ) return dword is
    var dword res;           /* 戻り値 */

    TRISIO_TRISIO0 = output; /* 出力に設定  */
    GPIO_GP0       = on;     /* Hを出力     */ 
    ...
    return res;
end function
上はdword型の値を返す。 型さえ合えば、戻り値は式でも変数でも可能。 関数の引数: 引数が「値渡し(in)」か「参照渡し(in out)」かを指定する。 「out」単独の使用は非推奨と書いてあるものの、ライブラリでは使用されている。。
procedure mulx( word in foo, word in out bar ) is
    bar = bar + foo * 5;
end procedure
上で、引数fooが「値渡し」、barが「参照渡し」。
var word a=3, b=2;
mulx( a, b );
変数bは17に書き換えられる。 各種の言語で上と等価な関数を書いてみると、
/* C++言語なら */
void mulx( uint16_t foo, uint16_t& bar ){
    bar = bar + foo * 5;
}

/* C言語なら */
void mulx( uint16_t foo, uint16_t *bar ){
    *bar = *bar + foo * 5;
}

(* Pascal言語なら *)
procedure mulx( foo: integer, var bar: integer )
begin
    bar := bar + foo * 5;
end
*CONFIG値の設定 sampleフォルダのソースコードを見れば一目瞭然。 http://avr.client.jp/jallib_full-1.2.0/sample/ 設定可能な項目と設定値はlibフォルダの「PIC名.jal」の中身を「CONFIG」で検索すれば分る。 http://avr.client.jp/jallib_full-1.2.0/lib/ サンプルのCONFIG記述が古く、コンパイルエラーになる場合は、 上記ファイル中(「PIC名.jal」)の記述を指定する。 *割込みルーチン procedure関数の先頭に「pramga interrupt」を書くだけ。 関数名は任意。
procedure isr_name() is
    pramga interrupt;    /* これは割込み関数 */
    if( INTCON_TMR0IE & INTCON_TMR0IF ) then
        INTCON_TMR0IF = 0;
       ...
    end if
end procedure
PIC18Fの場合、高優先度割込みだけがサポートされている。(0x0018番地) *複数の割込みルーチン定義 割込みルーチンはいくつでも定義することが可能。探査中。 割込みベクタは1つしかないけれど、数珠つなぎに呼び出される。
procedure isr_uart_receive() is
    pramga interrupt;    /* UART受信割込み */
    if( ... ) then
       ...
    end if
end procedure

procedure isr_uart_trans() is
    pramga interrupt;    /* UART 送信empty割込み */
    if( ... ) then
       ...
    end if
end procedure
"割込み処理の内容"単位で関数を管理したいときに使える。 各割込み関数は、割込みが発生すると順不同?で1回だけの呼び出しが保証される。 オーバーヘッドは未確認。 *ブートローダと先頭アドレス PIC18Fでユーザープログラムをブートローダ対応にしたい場合、 ユーザープログラムの「リセット時の開始先頭アドレス」をずらす必要がある。 プログラム中に記述する場合は
pragma bootloader loader18 0x1000
とする。この場合「0x1000分」プログラム全体が後方にずれる。 割込みアドレスは自動追従するので気にする必要はない。 コンパイルオプション: コンパイル時のオプションで指定する時は
-loader18 4096
の様に、オフセットアドレスを「10進数」で指定する。 このオプションよりも、pragma bootloader指定が優先される。 CONFIG値をHEXファイルに書かない設定: ブートローダ経由で書き込む場合、これもコンパイルオプションで指定しておく。
-no-fuse
*インライン関数 一度しか呼ばれない初期化関数や、サブルーチン・コールの時間的なオーバーヘッドを削減(注2)したい時に使える。 関数の先頭に「pramga inline」を書くだけ。
procedure init_foo() is
    pramga inline;
    INTCON_TMR0IF = 0;
    ...
end procedure
アセンブラの「sleep命令」をsleep()関数としてラップする方法は 以下、
procedure sleep() is
    pragma inline
    asm sleep
end procedure
上の関数呼び出しは、インライン化されて「sleep命令」1つになる。 *asm文/インライン・アセンブラ 1行だけ書くなら、関数内のどこでも asm sleep 等と書ける。 複数行書きたいなら、任意の場所で
assembler
    sleep
    clrw
    nop
    ...
end assembler
等とする。 アセンブラはあまり使いたくないので、詳細はマニュアル参照。 *複数行コメント 上で書いた1行コメントを繰り返すのが面倒な時に使えるものの、 これは、ちょっとダーティ。 if文で代用する。
if false then
    ここに、
    複数行のコメントを書く。
end if
if文の中身がコンパイルされないことを利用している。 *Alias機能 Alias(エイリアス)とは、変数等に別名を付ける機能。 C言語の「引数なしの#define文」の様な感じでしょうか。 例えば、デフォルトで「GP0端子」は「GPIO_GP0」と定義されている。 これを「GP0」でも参照できるようにするには、
alias GP0 is GPIO_GP0
と定義する。 「GP0端子」に1を設定する場合、
GPIO_GP0 = 1;             /* alias未使用 */

alias GP0 is GPIO_GP0;    /* aliasを定義 */
GP0 = 1;                  /* aliasで短く書ける */
変数、I/Oレジスタ、ビット定義、擬似変数などがAlias可能。 この機能は標準Pascalには無い機能なので非常に便利。 *変数の再定義、部分再定義、ビット定義 Aliasと違って定義済みの変数を「別の型、サイズ」に再定義出来る。 例、
var dword data;               /* dataは32bitの変数 */
var bit data_b29 at data:29;  /* dataの第29ビットをビット変数data_b29 として使う定義 */
var byte elm[4] at data;      /* dataを4つの8ビット型配列として使う定義 */
最後の使い方は、C言語のunionの様でおもしろい。 ライブラリでは、関数に「参照渡し」された引数を再定義して使っている例がある。 *擬似変数 この機能はちょっとユニーク。 任意の関数名に「ゲッター関数とセッター関数」(getter,setter)を定義して、 関数名を(プロパティ)変数のように使うことが出来る機能。 例えば、 eeprom_lastという「EEPROMの最終アドレスのデータを読み書きする擬似変数」を定義すると、 (定義自体はマニュアル参照)
var byte temp;
temp        = eeprom_last;      /* EEPROMから読み出す */
eeprom_last = temp + 1;         /* EEPROMへ書き込む   */
eeprom_last = eeprom_last + 1;  /* これも同じ */
の様に、EEPROMに対する読み書き処理が隠蔽されたまま、変数のように使うことが出来る。 また、擬似変数を「関数の引数に渡す」ことも可能。 これによりC言語の関数ポインタと同様の効果が得られる。 また、擬似変数は「引数」を取るように定義可能で、アドレスを引数として定義すれば、
eeprom_n( 0x04 ) = eeprom_n( 0x10 ) + 1;
の様な記述も可能。 「EEPROMの0x10番地」の内容を読み出して、 「 + 1」した値を「EEPROMの0x04番地」に書き込む。 擬似変数はライブラリ中で多用されている。 * case文 case文はこんな感じ。 C言語の「break」に相当するものはない。 「otherwise:」がC言語の「default:」に相当する。 処理が2行以上になるなら「block ... end block」で囲む。
; /* jalのcase文 */

const STATE_A = 0;
const STATE_B = 1;
const STATE_C = 2;
const STATE_D = 3;
function func_foo( byte in state ) return byte is
    var byte res = 0;
    case state of
        STATE_A: block    ; /* 2行以上なのでblock文で囲む */
            res = res + 3;
            res = res | 0x01;
            end block
        STATE_B:
            res = res + 5;
        STATE_C, STATE_D:
            res = res * 8;
        otherwise: block
            res = 0xFF;
            end block
    end case
    return res;
end function
上をC言語で書いてみると、
/* C言語のcase文 */

#define STATE_A 0
#define STATE_B 1
#define STATE_C 2
#define STATE_D 3
uint8_t func_foo( uint8_t state )
{
    uint8_t res = 0;
    switch( state )
        case STATE_A:
            res = res + 3;
            res = res | 0x01;
            break;
        case STATE_B:
            res = res + 5;
            break;
        case STATE_C:
        case STATE_D:
            res = res * 8;
            break;
        default:
            res = 0xFF;
            break;
    }
    return res;
}
* 文字列 jalv2にはC言語で言う「文字列」(ASCII-Z)という概念がありません。(ポインタもない) 文字列も単なるbyte型の配列と見なされます。
const byte str1[] = "01234"; 「'4'」の後に「\0」は存在しない。
ASCII-Zではないものの、上の様な文字列定数の初期化が可能です。 以下の様に文字列定数「"test1"」を関数の引数に出来ます。
disp_str( "test1" );
実際の使い方: disp_str()関数は架空の関数でしたが、例えば実際にLCD表示するときは、 disp_str()の代わりに、「print_string()関数」を使います。
lcd_cursor_position( 0, 0 );    /* LCDカーソルをhomeへ */
print_string( lcd, "message1");       /* 文字列を表示 */
*制御構造 (while/for/repeat) C言語で言うところの、「continue」に相当する命令はありません。 ループを抜ける「break」は、jalv2では「exit loop」を使います。 forループ: C言語のforループ、
/* C言語 */
int8_t  i;
int8_t dim[10];

for(  i = 0 ;  i < 10 ;  i++ ){
    dim[i] = 0;
}
と等価なjalv2の書式は、
-- jalv2
var byte i;
var byte dim[10];

for 10 using i loop
    dim[i] = 0;
end loop
となります。この場合、"i" は 0〜9の値をとります。 単に処理を10回繰り返すなら、
-- jalv2
for 10 loop
    処理;
    ...
end loop
と書ける。 * RAM BANKと配列について (2016/12追記) 配列は1次元配列のみ。 配列の最大添え字は、一つのRAMバンクサイズに制限されます。 PIC18FでもPIC16F1xxx系のEnhanced midrangeでも同様です。 orz 仮に80バイトのRAM BANKが4つあるマイコンの場合、最大配列は、 var byte dimx[80] と80バイトに制限されます。 ほかの3つのBANKに空きがあれば、dimy[80],dimz[80]と複数確保することは可能と 思われます。 word型なら同様にdimx[40]までとなります。 その他の変数定義のためBANKあたりの未使用RAMが80バイトを割り込んでいればコンパイルエラーに なるでしょう。 large_array: PIC18F PIC18Fマイコンの場合、1BANK 最大256バイトのところ「large_array」ライブラリを使うと、 byte型でdim[2048],word型でdim[1024],dword型でdim[512]までサポートされます。 * FlashサイズとSRAMを削減するコンパイルオプション (2016/12追記) -variable-reuseオプション: 過去のバージョンで「-variable-reuse」オプションにバグがあって非推奨でしたが、 現在(jalv24q5)は大丈夫そうです。従って「-no-variable-reuse」オプションは 指定しないほうが良いです。(デフォルトで -variable-reuseはONです) このオプションでSRAM使用量はかなり減る(状況にもよるが)ので 使う方向で試してみると良いと思います。:D -temp-reduce FLASHとSRAM使用量ががそれなりに削減されます。 現在このオプションをONにしてお試し中です。 -deadcode 指定しても効果がない様だ。 その他のオプション このほかのFLASH・SRAM削減オプションは結構デンジャラスな感じだったので 使っていません。(マイコンが正しく動作しなくなる等) *インストール (2016/12)現在の最新版 jallib v1.2.0を使います。 この版はjalコンパイラjalv24q5が添付されています。 (最新のコンパイラjalv24q6を使いたい場合は、 jallib-pack-bee-jalv24q6-日付.zipをダウンロードします。) ここから http://justanotherlanguage.org/downloads jallib_full-1.2.0.zipを取得して解凍します。 jallib_full_win_setup-1.2.0.exeでも良いでしょう。 以下はjallib_full-1.2.0.zipについての説明です。 *.zipを解凍したトップフォルダをjaldirと表記します。(VERSIONファイルがあるフォルダ) jaldirの部分は実際には「c:\jalsys\jallib_full-1.2.0」等、自分の好きなように解凍した フォルダ名に入れ替える必要があります。 *JALEdit:(注1) Jalv2の統合開発環境「JALEdit」は、メンテナンスされなくなったので 自分は今のところ、後述のコマンドライン・コンパイルしか使っていません。 JALEditも使えないことはないので、ひとまず説明だけは書いておきます。 jaldir\jaledit\jaledit.exe を実行します。 jaledit.png メニューから「Tools」-「Environment Options」-「General」で (1) Path of JAL Lib folder (multiple folders can be separated by semicolon) は、 jaldir\lib (2) Include Source Folder as first item in Library search Path に、 チェックを入れる。(チェックなしでも可) (3) Path to JALV2.exe に、 jaldir\compiler\jalv2.exe を指定する。 その他はデフォルトで。 次に、隣の「JAL」タブで「Optimizations」の (1) 「Disable reusing variable space」のチェックを外します (2) 「Enable temporary reduction」にチェックを入れます。 これらは、Flash、SRAM削減オプションです。 * Jaledit: コンパイルと書込み Jaleditのツールボタンを使ってコンパイルと書込みができます。 jalv2-compile-flash-write.png * LEDチカチカ / PIC16f1827 Jalv2でサポートしているPICには全て「LEDチカチカ」プログラムが付属しています。 JALEditメニューから「File」-「Open」で例えば「jaldir\sample」内の http://avr.client.jp/jallib_full-1.2.0/sample/ 「16f1827_blink_intosc.jal」を開きます。 http://avr.client.jp/jallib_full-1.2.0/sample/16f1827_blink_intosc.jal これは内蔵クロックINTOSCを使ったLED点滅サンプルです。 メニューの「Compile」でプログラムがコンパイルされます。 コンパイル結果のHEXファイルは、「jaldir\sample」フォルダの中に出来ます。 * Pickit3 + ipecmd.exe で書き込み 以下の内容を例えば「jalv2-pickit3.bat」という名前でどこかに保存します。 パス名(黄色の部分)はMPLABXをインストールしたフォルダを指定します。
"C:\Program Files\Microchip\MPLABX\v3.45\mplab_ipe\ipecmd.exe" %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
次にメニューから、「Tool」 - 「Enviromnent Options」 - 「Programmer」 タブ、 「Programmer Executable Path」で「jalv2-pickit3.bat」を指定します。 その下のエディットボックスに
 -TPPK3 -P%D -F%F -M -OL 
を入力してOKします。 *Pickit2 + pk2cmd.exe で書き込み pk2cmd.exeは、ここから、 PK2CMD v1.20をダウンロードしてセットアップします。 1、ダウンロードした「PK2CMD v1.20.zip」を「c:\pk2cmd」に解凍したとします。 「c:\pk2cmd\pk2cmd.exe」があることを確認します。 2、Windowsの環境変数「PATH」に実行パス「c:\pk2cmd」を追加します。 3、MS-DOSコマンドラインで「pk2cmd.exe」を実行してHELP画面が表示されるのを確認します。 次にメニューから、「Tool」 - 「Enviromnent Options」 - 「Programmer」 タブ、 「Programmer Executable Path」で「pk2cmd.exe」の場所を例えば、
c:\pk2cmd\pk2cmd.exe
に指定。 その下のエディットボックスに
-P -M -Y -R -F%F -H100
を入力します。 最後の「-H100」は書き込み終了後に100秒間画面を保持する命令です。 秒数は自由に設定しますが、これがないと正常に書けたかどうかの確認が難しくなります。 書き込み: 後は、メニューから「Compile」-「Program」でPICに書き込みが出来ます。 * コマンドライン・コンパイル方法 自分の場合はMakefileを作ってコマンドライン・コンパイルで使っています。 *I2Cマスター/スレーブでLEDチカチカ(1) jalv2は「I2Cのマスター/スレーブ」のライブラリ・サンプルがあるので実験してみた。 電源電圧は3.3V。 I2Cスレーブ・マイコン:PIC16F883、内蔵クロック8MHz(Fosc)で使用。 ハードウエアI2Cスレーブ・ライブラリを使う。 PIC16F877a用の「16f877a_i2c_hw_slave_echo.jal」を改造。 受け取った1バイトデータをコマンドに見立てる部分を追加しただけ。 動作: I2CマスターからLEDのon/offコマンドを受け取り、LEDをon/offする。(RC2ポート) FLASH使用量:280 word程度。 I2Cマスター・マイコン:PIC18F14k50、内蔵クロック32MHz(Fosc)で使用。 ソフトウエアI2Cマスタ・ライブラリを使う。 「18f14k50_i2c_sw_master_echo.jal」を改造。 送る1バイトデータにコマンドの意味を持たせただけ。 動作: I2CスレーブへLEDのon/offコマンドを1秒周期で送る。 FLASH使用量:830バイト程度。 結果: サクッと「I2Cマスター/スレーブでLEDチカチカ」できた。 (^^)/ (^^)/ 普通はマスター/スレーブ同時に作ると困難を極めるところが(爆、あっさり動作。 Jalのライブラリはかなり良くできてると思う。 I2CマスターのSCLクロック周波数を400khzに設定したが、実測78khzだった。 マスターマイコンのFoscが少し遅いのが影響しているにしても、ちょっと遅いが、 ソフトI2Cなのでよしとする。 3.3VでI2Cバス・プルアップ抵抗は10kΩ(手持ちを使っただけで値は未検証)。 2.2kΩだとI2C通信が不安定だった。 *I2Cマスター/スレーブでLEDチカチカ(2) PICでI2Cスレーブは初めてだったけど、あまりにもあっけなく動いてしまったので、 「queue01」ライブラリ(リングバッファ)も使って、 I2C-LCDの可変長引数コマンドの解析機能を追加してみた。 「case文」が大きくなるのでコードサイズを見るのだ。 *USB-CDCサンプルを試す サクッと動作OK. PIC18F2550でFLASH使用量 2872 byte *LCDサンプルを試す(hd44780互換) サクッと動作OK. PIC18F2550でFLASH使用量 1228byte *新型PIC対応 秋月で安く買える新型PIC、PIC16F1827等にも対応しています。 これらの新型PIC16Fは、PIC18Fが持つ機能も一部含むため「hybrid」と呼ばれる様です。 (Enhanced midrange) *jalv2の構文色分けに対応しているエディタ 以下のエディタが色分け表示に対応している。 1,Editra: http://editra.org/ http://editra.org/uploads/Win/editra.win32.0.6.89.exe (jaluinoのエディタ: 中身は「Editra」 http://code.google.com/p/jaluino/) 2,vim/gVim : http://vim-jp.org/ 対応内容が少し古いけど十分使える。 http://files.kaoriya.net/goto/vim73w32 エディタの背景を黒にする設定: Editra: この「my-black-base.ess」ファイルを 「C:\Documents and Settings\ユーザ名\Application Data\Editra\styles」に置く。 Edit - Preferences - General タブの「Locale Settings Lanhuage」で「Japanese」を選択して 再起動で日本語になる。 編集 - 環境設定 - ドキュメントの「文法ハイライト」タブ - カラースキームで 「my-black-base」を選択すると黒背景になる。 edtra-black.png gVim: この「my-black-base.vim」ファイルを $HOMEのvmfiles/colorsフォルダに置く。(Windowsの場合) $HOMEの_vimrcと_gvimrcに以下を追加して再起動。
" カラー設定: 黒背景
colorscheme my-black-base
gvim-black.png *最新バージョン 現在(2016/12)の正式版は「jal 2.4q5」。 既に 2.4q6がリリースされているので 2017年にはjallib版もリリースされると思う。 2.4q6版が使いたい場合、以下から http://justanotherlanguage.org/downloads jallib-pack-bee-jalv24q6-20161225.zip 等を使えば良い。 現在(2012/03)の正式版は「jal 2.4o」。 ベータ版扱いの次期バージョンは「jal 2.4p」。 http://www.casadeyork.com/jalv2/archive/beta/jalv24p-beta.zip http://www.casadeyork.com/jalv2/ 「jal 2.4p」はコード効率が更に10%程度改善されるらしいので少し探査。 10%も改善されたら完全無料系としては「業界ブッちぎり」の超効率となりそう。 (オントカヨ * Jalv2コンパイラについてのメモ (2017/03): jal 2.4q5: (1) 例えば、PIC16F18313の様にFLASHが2Kword(Page0)しかないマイコンでも movlp(ページ切り替え)命令が全体の10%程度も生成されている。orz この部分はコンパイラの作者にツッコミを入れようかどうか考え中。 * Jallibについてのメモ (2017/03):jallib 1.2.0: (1) sd_card.jal ライブラリの初期化は恐らくバグっていて、初期化中に無限ループに突入する。 orz ここに修正版をsd_card_local.jalとして含めた。 http://mpu.seesaa.net/artile/445037481.html#download 但し、バグ修正以外に自分用にコードサイズ削減のためテキトーに変えた部分があるので注意。 (注1)JALEditは、現在のところ更新されていないので、GUIのバグが残っている模様。 使いにくい場合は、コマンドライン・コンパイルの方が良いかも。 (注2)サブルーチンが複数回呼ばれる場合は、コードサイズとトレードオフ。 参考リンク: USB CDC / 18F2550 usb_serial http://tech.groups.yahoo.com/group/jallist/message/31590
posted by Copyright (C) avrin All Rights Reserved. at 00:28| Comment(39) | PIC関連 | このブログの読者になる | 更新情報をチェックする