【備忘録】dsPIC33FJ32MC202によるSDカードアクセス
とりあえず「ぷちFatFs」を使用。
FATファイルシステムのデータはリトルエンディアン、MPLAB C30もリトルエンディアン。
ChaNさんのHPにおいてあるpic24F用のサンプルブロジェクトを使用。
ピンアサインのみ調整して使用。
FATファイルシステムのデータはリトルエンディアン、MPLAB C30もリトルエンディアン。
ChaNさんのHPにおいてあるpic24F用のサンプルブロジェクトを使用。
ピンアサインのみ調整して使用。
【備忘録】今更ながらMPLAB IDEのworkspaceについて
【備忘録】dsPIC33FJ32MC202のUARTについて
備忘録
dsPICのDSP関数の能力の凄さについて。
浅草ギ研製のCMOS-EYEというカメラを用いて画像データをdsPIC内部に取り込もうとしていた際に起きた落とし穴について。
DSP関数を用いてマイコン内部で画像処理を行うプログラムを書いて、シミュレーターでテストしたところ処理速度が33倍になった。
おそろしや、DSP・・
CMOS-EYEを用いてシリアル通信経由で画像データを取得しようとしていたが、その画像データを用いて画像処理が行えなかった。
デバッグの結果、dsPIC側のRxのバッファがオーバーフローしていた。
よーーーくデータシートを見ていると• 4-deep FIFO Receive Data bufferという記述がある。
つまり、5個目以降のデータがオーバーフローしていた。
dsPICのDSP関数の能力の凄さについて。
浅草ギ研製のCMOS-EYEというカメラを用いて画像データをdsPIC内部に取り込もうとしていた際に起きた落とし穴について。
DSP関数を用いてマイコン内部で画像処理を行うプログラムを書いて、シミュレーターでテストしたところ処理速度が33倍になった。
おそろしや、DSP・・
CMOS-EYEを用いてシリアル通信経由で画像データを取得しようとしていたが、その画像データを用いて画像処理が行えなかった。
デバッグの結果、dsPIC側のRxのバッファがオーバーフローしていた。
よーーーくデータシートを見ていると• 4-deep FIFO Receive Data bufferという記述がある。
つまり、5個目以降のデータがオーバーフローしていた。
【備忘録】dsPIC33FJ32MC202のデータメモリ
備忘録
例えば配列として、
int I[300],T[300];
と宣言するとデータメモリ領域の0x800以降にI[0]のデータ領域が確保される。
このデータメモリの領域は2KByteで、main関数外部などでスタックが多く使われるとメモリエラーを起こしてmplab sim上でも誤作動を起こす。
int = 2KByteなので配列のバイト数合計が2KByteを超えるようであれば、もちろんだがエラーになる。
コメントアウトの有無でもたまに誤作動を起こすが原因不明。
MicroChipにより用意されているdsp関数において、乗算(VectorDotProductなど)は16bit×16bitの乗算結果がアキュムレーターという仮想レジスタ(スタック?)に保存される。
全ての計算が終了後、アキュムレーター内の値がビットシフトされ16bitの値として出力される。
この乗算がなかなかくせもので、基本的には浮動小数点の計算のみを想定しており、さらに何も考えずに使うと(-1.0〜1.0)同士の掛け算となる。
0x0000 = 0.0
0x0CCC = 0.1
0x7FFF = 1.0
0x8000 = -1.0
0xFFFF = ほぼ0に近いマイナス値
というような対応。
VectorDotProductなどに代入する値(配列)をビットシフトしておけば調整可。
アキュムレーターは40bitなのでそうそうオーバーフローしない。
例えば配列として、
int I[300],T[300];
と宣言するとデータメモリ領域の0x800以降にI[0]のデータ領域が確保される。
このデータメモリの領域は2KByteで、main関数外部などでスタックが多く使われるとメモリエラーを起こしてmplab sim上でも誤作動を起こす。
int = 2KByteなので配列のバイト数合計が2KByteを超えるようであれば、もちろんだがエラーになる。
コメントアウトの有無でもたまに誤作動を起こすが原因不明。
MicroChipにより用意されているdsp関数において、乗算(VectorDotProductなど)は16bit×16bitの乗算結果がアキュムレーターという仮想レジスタ(スタック?)に保存される。
全ての計算が終了後、アキュムレーター内の値がビットシフトされ16bitの値として出力される。
この乗算がなかなかくせもので、基本的には浮動小数点の計算のみを想定しており、さらに何も考えずに使うと(-1.0〜1.0)同士の掛け算となる。
0x0000 = 0.0
0x0CCC = 0.1
0x7FFF = 1.0
0x8000 = -1.0
0xFFFF = ほぼ0に近いマイナス値
というような対応。
VectorDotProductなどに代入する値(配列)をビットシフトしておけば調整可。
アキュムレーターは40bitなのでそうそうオーバーフローしない。





