So-net無料ブログ作成
English Version

PIC24FJ64GAでGAME言語(その3) [PIC]

 PIC 用のBASICインタープリターとしては PICAXE や BASIC Stamp 等がありますが、これらがPC側で(ユーザフレンドリなGUIツールを使って)ソースを作成し、コンパイル(トランスレート)した中間コードをPICにダウンロードするのに対して、今回のPIC24FJ用GAME言語は PIC内にソースエディタ機能も有しておりスタンドアローン性が高いという特徴があります。

 反面、PIC 内でソースエディットするため(もちろんPC上でソースを作成しPICへ送信もできますが)、PIC 特有の大量のシンボルデータを持てずどちらかというとPIC 入門者向きではありません(PIC のマニュアルを調べながらソースを書く人向き)
 ユースケースとしては C言語やアセンブラでソフトを書けるが、タイミング的にシビアな使い方ではなく(0.01秒程度以上の精度)、その場で簡単に修正したい場合等ではないかと思います。(その他として電子工作好き、かつGAME言語に懐かしさを感じる少数の方々^^)

 このようなユースケースを想定して下記の機能を追加しました ^^
  1. フラッシュメモリへのセーブ/ロード
     GAME言語のインタープリッタは数KBでフラッシュメモリが大量に余っているのでメモリ上のソースをフラッシュメモリへセーブできるようにしました。
     使用可能なメモリ範囲は
      メモリ(RAM)  :0x1000 ~ 0x27ff
      フラッシュメモリ :0xa000 ~ 0xffff
    です。フラッシュメモリへの保存時は Page単位(512word、アドレス上は0x0400単位)で消去するので隣接したソースとオーバーラップしないように注意してください。
    • 例1
      ソースをフラッシュメモリ(0xa000)にセーブする。表示される数値は保存したサイズです。
      :¥> 250
    • 例2
      フラッシュメモリ(0xa000)のソースをロードする。
      :¥< 250
    • 例3
      ソースをフラッシュメモリ(0xb000)にセーブする
      :¥>$b000 250
    • 例4
      フラッシュメモリに保存されたソースを一覧表示する。フラッシュ上のアドレスとソースの最初の行の内容が表示されます。
      :¥¥
      +A000-A0FA
       ' LED sample(LATB.7 1:ON 0:OFF)
      +A800-A862
       ' sorce dump
      +B000-B3F7
       ' renumber for GAME in PIC24FJ64GA 2015/07/24 by skyriver
    • 例5
      フラッシュメモリ 0xb000に保存されたソースをメモリ 0x1800 にロードする
      :=$1800
      :¥<$b000 1015
    • 例6
      フラッシュメモリ上のソースの削除
      空のソースを上書きすることで削除できます。0xb000 から始まるソースを削除する場合は
      :&=0
      :¥>$b000 1

  2. 電源ONでソースの自動ロード
     電源投入(またはリセット)時にフラッシュメモリ 0xa000 に保存されたソースがある場合、自動的にメモリ(0x1000)にロードします。

  3. 電源ONで自動起動
     更に自動ロードしたソースを自動起動したい場合は下記のコマンドでフラッシュメモリに保存します。
     自動起動状態で保存されたソースはソース一覧でアドレスの左のマークが'#'になります。
    :¥] 250
    :¥¥
    #A000-A0FA
     ' LED sample(LATB.7 1:ON 0:OFF)
    +A800-A862
     ' sorce dump
    +B000-B3F7
     ' renumber for GAME in PIC24FJ64GA 2015/07/24 by skyriver

  4. タイマー管理専用変数の追加
     '¥'を変数(2byte長)として追加しました。'¥'がゼロ以外の場合、タイマー割り込み処理により、10ms(0.01秒)毎にデクリメントされます。
     純粋なwait関数を実装しようかとも思いましたが、wait 中に他の処理が出来なくなるのを回避するためにこのような仕様にしました。
     30ms周期で 10ms だけLEDを点灯する Lチカのサンプルが下記です。シンクロで波形確認するために早い周期にしていますので目で見てもLチカしませんw
     210行目の「""」は表示内容が無い print コマンドですが、キー入力センスは文字列表示時に実施されるのでコントロールCで中断できるようにするためのものです。
     特に自動起動の場合はコントロールCで中断できるようにループ内に "" を入れるようにしてください。
     シンクロで波形を確認してみたところ、ほぼ正確に30ms周期でジッタも1ms以下でした。
     因みに160と200行目の wait処理の行を削除した場合の周期は 327us だったので2回分のwaitのジッタはこの約2倍程度と推測されます(当然使い方に大きく依存します)。

    Lチカサンプル 波形
      1' LED sample(LATB.7 1:ON 0:OFF)
    100 W=$02c8 W(0)=W(0)&$ff7f
    110 BLAT=$02cc
    120 @
    130' LED ON
    140  BLAT:0)=BLAT:0)|$80
    150' wait 10ms
    160  ¥=1 @ @=(¥=0)
    170' LED OFF
    180  BLAT:0)=BLAT:0)&$7f
    190' wait 20ms
    200  ¥=2 @ @=(¥=0)
    210  ""
    220 @=(0)

  5. フラッシュメモリ上でのソース実行
     フラッシュメモリに保存されたソース一覧で表示されるソース開始アドレスにソース開始変数'='を設定することでフラッシュメモリ上でプログラムの実行が可能です。
     但し、ソース開始変数を変更しただけではソース終了ポインタ'&'が追従しないため、通常なら 「==」コマンドを実行して'&'をアップデートしますが、フラッシュメモリにソースがある場合、'&'もフラッシュメモリ上のアドレスになってしまうため、リナンバープログラムで使ったように '&'のアドレス以降を配列領域として使用することができないという制約が発生します。
     対策として'&'に対して値を設定できるようにしたのでフラッシュ上で動作させるプログラムで'&'以降を配列領域として使う場合は'&'をメモリ領域のアドレスに設定してください。
     例としてソース開始アドレスが0xa000以上(この場合符号付2byte変数としてはマイナス値)であればフラッシュ上での動作なので '&'を0x2000に設定したい場合は下記の記述で対応可能です。

    ;==<0 &=$2000

    ★2015/07/29 追記
     メモリを多く使用するため、フラッシュメモリ上のプログラムを自動起動したい場合には、0xa000の自動起動プログラムを下記のようにすれば(この例では0xb000のプログラムを自動起動)対応できます。

    10 =$b000 #=1


※その他
 teratermからのソースのコピペでダウンロードする場合、ソース行数が多くなると(100行程度以上?)流石に取りこぼしが発生する場合があります。このような場合はteratermのマクロを使って一行ずつ送信すればOKです。
★2015/07/29 追記
 teratermのsetupメニューの「Additional settings」での「Copy and Pasete」タグに「Paste delay per line」の設定がありましたのでこの値を大きくする(10msから20ms程度に変更)ことでも対処可能です。

マクロのサンプル(gsend.ttl)

; send GAME lang source to target timeout=1 filenamebox 'select game source' if result<>0 then fname = inputstr fileopen hd fname 0 filereadln hd str do while result=0 sendln str waitln '' filereadln hd str loop fileclose hd endif

 本記事内容に対応したGAME言語のHEXファイルは下記リンクからどうぞ
 (商用目的以外であれば自由に使用可能です)


★2015/08/17 追記
 Ver 0.02aにアップデート
 ・乱数seed設定機能復活、List from コマンド変更、フラッシュメモリ保存プログラム一覧で表示を1行化
★2015/09/21 追記
 Ver0.03 RA3が使用できるように config2 の値を修正(内部クロックを使用する設定です)
★2015/09/29 追記
 Ver0.04 奇数番地に配置されたword配列でMSBが1の場合、上位バイトがインクリメントされるバグ対処
★2015/11/22 追記
 Ver0.05 マシン語コール処理「>=」でAの変数値をW4レジスタに設定してコールするように変更。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(6) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 6