FC2ブログ

SBDBTのテスト

今日は前から気になっていたUSBホストチップのSBDBTを試す.
BluetoothのSPPとUSBゲームパッドの両方のファームウェアで接続はOK.


データはいずれもUARTで取れるので特に問題もなくPIC32MZのマザーボードに組み込めるようになった.
ゲームパッドは市販のものが使えるのはとても便利.
スイッチやアナログジョイスティックを買って自作する手もあるが,いかんせん信頼性が乏しい.
市販品なら接触不良やら断線やらの問題が起きない.
スポンサーサイト



38番ピンの謎

今日はPWMアウトを試す.
例によってHarmonyの自動コード生成で余裕で出力まで行くと思いきや,出力が出ず,2,3時間はまる.
原因はなんと38ピンが腐っていた.
アプトプットコンペアのOC1出力を38ピンに設定した場合だけ波形が出ない.他のピンにマッピングすると出る.

この怪奇現象の原因はなんとUSBのコンフィグビットにあった.
デフォルトでDEVCFG3のFUBUIDIOビットの設定がONになっているのである.
このフラグがONだと38番ピンはUSBIDとしてUSBユニットが使用する設定になる.

これは気付かない.
なんでデフォルトでピン専有がONなのか,しかもペリフェラルマッピングでこのピンを別機能に設定してもエラーも警告も出ないとは.
Harmonyのこういうところが恐ろしい.

ADCを試す

今日も引き続きPIC32MZで遊ぶ.
AD変換を試してみる.PIC32MZ2048EHF064には24chものADCが付いているが,そのうち2CHをテストする.
設定するレジスタの数が歴代PICの中で1,2を争う多さだが,Harmonyのすごいところはほとんどデフォルトのままで
設定すべきはCHの何番を使うかぐらいなところ.
一からレジスタ直たたきやっていたら日が暮れそうな難解ADCもサクッと動作した.

Harmonyがレジスタ初期化をやってくれるのは本当にありがたい.

SPI,IIC,SDカード

今週末はPIC32MZの評価基板を少しずつ拡張する.
まずはSPI,IICの接続を確認する.これらはモニタLCDやカメラ,その他センサ・U/Iデバイスとの接続を前提にしている.
そんなに問題は出ずにあっさりつながった.

次にSDカードアクセスを試す.
SDカードはSPIモードで接続し,Microchipが提供するFAT32アプリ上でファイルアクセスする.
かなりはまったが,何とか読み書きできるようになった.


2GBのマイクロSDカードを挿して速度を計測した結果,
リード 300kbyte/sec
ライト 100kbyte/sec
となった.書き込みがやや遅いが,まぁ許容範囲内ではある.
前回のSH4AのMMCモードでの読み書きはファイルシステムがなかったのでバイナリの直接書き込みとなっていて可読性がなかった.
今回はファイル単位で管理でき,PCで作ったファイルを読み込ませたり,ログファイルをエクセルにペーストしたりできるようになったため,より汎用なデータ管理ができるようになった.

タイマ2の謎

Lチカに使っていたタイマ2の様子がおかしい.
オシロで波形を見てみると微妙に設定した時間よりも短くなっている.
タイマ1(16bit)では問題なし.なぜかタイマ2(32bit)でのみカウンタポーリングが短くなる現象が出る.

いろいろ試す中で,
while(DRV_TMR1_CounterValueGet()<375000){}

while(DRV_TMR1_CounterValueGet()<375000){wait_usec(10);}
のように書き換えるとショートしなくなった.
while文で単純にタイマカウンタを監視するループが冗長とみなされて勝手に短縮されてしまうのかな?
最適化レベルを変えると変化するようなのでコンパイラが何かしているらしいことはわかった.
そもそもポーリングなんか使うな,割り込みを使えということなのかもしれない.

USB-CDCの速度計測

今日は昨日の疑問を払しょくすべく,PC側の仮想COMソフトを自作して通信速度を計測する.
以下が結果.


マイコン側からみて書き込みはMZが約1000kbyte/sec,MXが800kbyte/sec.
読み込みはMZが4000kbyte/sec,MXが800kbyte/sec
となった.
こうしてみるとPIIC32MXはリードライトとも安定して8Mbps程度とものすごく善戦している.
一方でPIC32MZは確かにUSB2.0の速度は出ているらしいが,転送データ量によりばらつきが大きく,同期制御としては扱いにくい.
もっとも,PCからロボットを直接同期制御するようなことは最初から考えていない.PCはあくまでリッチなGUIを持ったモニタ用なのだから.

PIC32MZのUSBと格闘する

今日も引き続きUSB-CDCを動かすためのデバッグ作業.
いくつかポイントがわかってきた.

USB初期化タスクの複数回実行が必要:
DRV_USBHS_Tasks()
USB_DEVICE_Tasks()
これらを3回程度実行しないとデバイスオープンに失敗する

リード/ライトに使うバッファの型が特殊:
uint8_t __attribute__((coherent)) __attribute__((aligned(16)))なる型を使わないと正常に送受信できない

ゴリゴリとデバッグを進め,なんとか動くようにはなってきた.
しかし,肝心の通信速度はPIC32MXと大差ないという結果に.
本当にUSB2.0で通信できているのだろうか?

PIC32MZ2048EFH064をいじり始める

今週末はPIC32MZ2048EFH064をテストする.
秋月のDIP化キットを使い,お手軽に蛇の目基板に部品を置いていく.




デバッガも奮発してICD4を購入した.コードサイズが大きくなっても転送速度が速いのが魅力だ.

Lチカ,UARTと何の問題もなく来て,USB-CDCをやろうとしたら動かない.
PIC32MXでは動いているコードも,サンプルコードもまったく動かない.
ICD4を使いデバッグするも原因がわからず.
USBデバイスをオープンするところでコケているようだが,配線その他見直してみてもミスは見つからず.
appData.deviceHandle = USB_DEVICE_Open( USB_DEVICE_INDEX_0, DRV_IO_INTENT_READWRITE );
という初期化関数の中でデバイスハンドラの取得ができていない.
何しろUSBの規格やら仕様やらを理解せずにコードを移植しているために,こうなると手が出ない.

PIC32MXのCDC通信速度計測

今日は先日のUSB-CDCクラスデバイスのプログラムを少し変えて,TeraTermで通信速度を測ってみた.
結果は受信100kbyte/sec,送信350kbyte/secとなった.
フルスピードのUSBが12Mbpsなのでもっと1000kbyte/secぐらい出るかと思われたが,想像していたより遅い結果となった.
現状のFTDIのUARTが3Mbpsで300kbyte/secぐらい出ているので,それと同等レベルのパフォーマンスということになる.

PCへの送信ではデータ数が少ないと急に速くなったり,毎回データレートが変わったりするという謎の挙動も見えている.
PC側アプリのデータバッファの容量とかによるのだろうか?

ひとまず深追いはやめて,これからは本命であるPIC32MZのほうへ移って行きたい.

PIC32MX250F128BとMPLAB Harmony

ここのところ体調すぐれずロボット作成から離れていたが,ここで少しでも復調させるべく軽作業を始めた.
机に置きっぱなしになっていたPIC32MX250F128Bの動作確認基板に火を入れ,MPLAB-X Harmonyをインストールする.




これまでレガシーペリフェラルライブラリを使っていたのをHarmonyに移植する.
Lチカ,UARTと順調に来て,USBのCDCクラスのサンプルプログラムが動作するところまでこぎつけた.
これまでUSBシリアルは別付けのFTDIのチップ等を使っていたが,これならPIC32で置き換えられそうだ.
プロフィール

もやね

Author:もやね
長野県在住の会社員(メカニカル・エンジニア).
ロボットは完全な趣味としてやってます.
E-mail:
mo_ya_ne[a]yahoo.co.jp
[a]⇒@

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
FC2カウンター
ブログ内検索
RSSフィード
リンク