2018年11月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

Amazonウィジェット

  • お気に入り
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

« <続>C言語で作るシューティングゲーム | トップページ | ArduinoをRaspberryPiとSPIでつなぐ »

2018年10月28日 (日)

dsPIC DSPライブラリを試しに使ってみた。

久しぶりのPICネタ。
dsPIC33FJ32GP202というやつを秋月で手配した。

よく似た機種にdsPIC33FJ64GP802があるが、こちらのほうがRAMの容量が16kBあるしDMAもこっちしかついてないので100円高くてもこっちのほうがお買い得。(なんでこっちにしなかったんだか。)

まずは開発環境のバージョン詳細から。
・MPLAB: Product Version: MPLAB X IDE v3.65
・コンパイラ: xc16-gcc (v1.35)

※MPLABやらライブラリはバージョンが違うとコンパイルが通らなかったり操作が変わっていたりするのでメモしておくと、情報集めのときやトラブルの時役に立つ。



仕様書について。

出発点は日本語のリファレンスがあるのでそこから。

英語版はこちら


日本語の仕様書は内容が古いので、日本語で見たい場所を探してから、英語の対応部分を探すと早い。




コンパイル時に必要なファイルについての記述があるので、どのファイルかを見ると、

2.2が使い方。ビルドの方法。
http://ww1.microchip.com/downloads/en/devicedoc/51456b.pdf
"When compiling an application, dsp.h must be referenced (using #include) by all source files which call a function in the DSP Library or use its symbols or typedefs. When linking an application, libdsp-omf.a must be provided as an input to the linker (using the --library or -l linker switch) such that the functions used by the application may be linked into the application."

必要なファイルは2つあることがわかる。

dsp.h
D:\Program Files (x86)\Microchip\xc16\v1.33\support\generic\h\

もう一個のlibdsp-omf.aはよくわからなかった。




DSPモジュールにデータを入れるには、単なるdoubleやfloatは直接入れられなくて、
fractionalというこのライブラリでのみ使える特別な型を使って出し入れするのがポイントになっている。

日本語のマニュアルがあり、色々サンプルを探し回るよりは、これをじっくり読んだ方が速そうだ。
http://www.microchip.com/stellent/groups/devtools_sg/documents/devicedoc/jp019851.pdf



最初にDSPにトライしたときは、dsp.hをインクルードして、それらしいソースを貼り付けただけだった。コンパイラのバージョンもv1.33にしていた。

一番簡単そうなVectorAddから試そうとして、下記のソースをコンパイルした。
最初はあっさり通った。
(※しかしちょっとプロジェクトをいじるとそのあとエラーですすめなくなってしまったので、急いでいる人は飛ばして読んでください。)
#include <xc.h>
#include <libpic30.h>
#include <p33FJ32GP202.h>
#include "xc.h"
#include <dsp.h>

#define SIZE 16
fractcomplex dstV[SIZE];
fractcomplex vecA[SIZE];
fractcomplex vecB[SIZE];

int main(void) {
------------------------------------------
    PLLFBD = 41;                 // M = 43  7.37MHz x43/2/2
    CLKDIVbits.PLLPOST=0;        // N2 = 2          = 79.2275MHz
    CLKDIVbits.PLLPRE=0;         // N1 = 2
    while (OSCCONbits.LOCK!=1);  // 
    // --------------------------------------------------------------
    
    init_uart();
    VectorAdd(SIZE,dstV,vecA,vecB);
    return 0;
}

・・・・そこからちょっと寄り道したのがいけなかった。

jp019851.pdfを見ていると、ADCやSPIを使うためのライブラリが用意されている。 これらを使うとちょっとだけ簡単に設定できそうなのでついでに入れてみることにした。 dsPICのperipheral libraryを入れてみた。
https://www.microchip.com/mplab/compilers

XC16コンパイラのページに、コンパイラ本体とは別のところに
peripheral libraryをダウンロードできるようになっている。
https://www.microchip.com/forums/m917848.aspx

PIC24/dsPIC Peripheral Libraries v2.00 - Windows

インストーラでいつも通りドライブを変えて入れようとしたら、
そこにコンパイラはないというエラーが出て戻される。XC16\v1.31までバージョンの書いてあるディレクトリを指定すると行けた。

ためしに
#include <spi.h>
を付け加えてビルドしてみたら、ライブラリをインストールする前には出なかったエラーが出てきた。

エラーの内容は、
build/default/production/newmainXC16.o(.text+0x2c): In function `.L2':
: undefined reference to `_VectorAdd'

VectorAddが定義されていない?

なにがおこったのか

microchipの掲示板やstackoverflowなんかをいろいろ調べてみたが決定的な原因はよくわからなかった。




<コンパイルが通った>
やった対策としては、

・コンパイラを最新版(現時点v1.35)にした。
・プロパティのXC16(global)にあるoutput file formatをCOFFに変えた。

どちらかというと2つめが効いたと思う。COFFにしたときの画像。
Agc_coff

DSPライブラリのエラーが止んだので、
早速VectorAddなど単純なAPIを試すことにした。

fractionalの詳細については、
PICフォーラムに有効な情報あり。
https://www.microchip.com/forums/m171724.aspx


PDFにあった1.15形式というのは最初のビットが符号で、
後の15bitが値なので、-1.0~1.0であればMAX=7FFFが1.0を指すはず。

    uint16_t val[SIZE];
    vecA[0] = 0x7FFF;//1.0
    vecA[1] = 0x3FFF;//0.5
    vecA[2] = 0x1FFF;//0.25
    vecA[3] = 0x7FFF;//1.0
    
    vecB[0] = 0x0000;//0.0
    vecB[1] = 0x3FFF;//0.5
    vecB[2] = 0x1FFF;//0.25
    vecB[3] = 0xBFFF;//-0.5
    
    VectorAdd(SIZE,dstV,vecA,vecB);
    
    int j;
    for(j=0;j<4;j++){
        
        int fugo = 1;
        if(0x8000 & dstV[j]){fugo = -1;}
        
        val[j] = fugo * (dstV[j] & 0x7FFF);
    }

Fract2FloatというAPI関数を使うと、fractionalの値をfloatに変換してくれる。これを使ってDSPモジュールから結果を取り出すことができる。

DSPにデータを入れるときはFloat2Fractを使うのだが、ADCから信号入力する場合はADCの変換結果を直接fractionalで出すモードがあるのでそちらを使うほうが圧倒的に速い。

DSPモジュールのサンプルプログラムを見ていると、Float2Fractが一切出てこないのはそういう理由があるためだ。ADCで入れた信号をFFTするとか典型的な使い方であればサンプルプログラムを少し触るだけで動かすことができるだろう。

サンプルプログラムはコンパイラのインストールフォルダの下に入っている。
X:\Program Files (x86)\Microchip\xc16\v1.35\examples\dsPIC30F\CE001_ADC_DSP_lib_Filter


« <続>C言語で作るシューティングゲーム | トップページ | ArduinoをRaspberryPiとSPIでつなぐ »

PICマイコン」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/67321310

この記事へのトラックバック一覧です: dsPIC DSPライブラリを試しに使ってみた。:

« <続>C言語で作るシューティングゲーム | トップページ | ArduinoをRaspberryPiとSPIでつなぐ »