• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

marumonのブログ一覧

2013年07月17日 イイね!

MicrochipのMDDFSが動いた件

スマホでヨットレースの開発も一段落、というか、とりあえず最低限だけど、動き出したので、久々にpicをいじりだした。ブログを読み返してみると、去年の11月頃やってたけど、スキーシーズンが始まって以来まったく放置状態だったのね。

もう何もかも忘れていて、bootloaderとか、usb接続とか、動いていたはずのコードもなぜか動かないし、どうしてこうもはまるんだろう。。。と、いつものお約束的な電子工作になっている。

とりあえずのメモとして

pic32mx250 220 とも pickit3 stand aloneモードでは書き込めない。サポートデバイスに無い。追加できそうだが、とりあえず、mplabxからなら書き込める。

HID bootloaderのwindows 側アプリは、アプリケーションライブラリについてくるアプリではなくアプリケーションAN1388のPIC32UBL.exeを使う。

こういう情報って、意外とネットで引っかからない。から、はまるとなかなか抜け出せない。昔動いていた、、、から、調べられないとますます抜け出せなくなる。

さらに、ブレッドボードの場所によって、picに書き込めたり、書き込めなかったりする。最初picが悪いのかとも思ったけど、何箇所か書き込む場所作って実験してみると、どうもブレッドボードが調子悪い感じ。しかし、、、感じとしか言いようが無い。100%ダメでもないので、怪しさ満点!

中華通販で買ったジャンパーワイヤに、通電してないものが混じってる。なんで信号ないのか、最初わからなかった。ロジアナの威力を思い知ったけど、ブレッドボードといい、ジャンパーワイヤといい、安物使うと苦労するって、ホントそうだと思う。(けどやめられません(笑)


そうこうしているうち、ロジアナを整備してMicrochipのMDDFSって、SDカードの読み書きのライブラリを動かそうとあれこれ。ネットで見てると、使っている人もいるので、基本的には動くかもしれないけど、どうせまた、バグバグで動かないんだろう、と調べてみたのだ。




自作のロジアナでグラフ(?)出るようにしてみた。レスポンスの1バイト目にゴミが入っていて、2バイト目のレスポンスを拾わないことが判明。2バイト目に0x01が返ってきても、プロトコル的にはありなんだけど、なぜがmicrochipのライブラリでは、1バイト目に返事が来ないとダメ、となっていた。

具体的には、

SD-SPI.c内の
MMC_RESPONSE SendMMCCmd(BYTE cmd, DWORD address)

の中で、コマンドを発行した後、レスポンスを取得するところで

timeout = NCR_TIMEOUT;
do
{
response.r1._byte = MDD_SDSPI_ReadMedia();
timeout--;
}while((response.r1._byte == MMC_FLOATING_BUS) && (timeout != 0));

と、1バイト目しか取得しないので、この後に

//add
while ( (cmd == GO_IDLE_STATE) && (response.r1._byte != 0x01) && (timeout != 0)) {
response.r1._byte = MDD_SDSPI_ReadMedia();
timeout--;
}
// add end

GO_IDLE_STATEのときだけ、2バイト目以降も見てやる、というworkaroundを入れてやると、とりあえず動いてます。

たぶん、microchipが使っているSDカードは、1バイト目にゴミが入らないちゃんとしたSDカードなんだろうけど、オレは2種類試して、両方ともごみ入ってた。こういうのって、なんでオレはきちんと、はまるんだろう???

Posted at 2013/07/17 19:54:50 | コメント(1) | トラックバック(0) | 電子工作 | 日記
2013年07月13日 イイね!

tacktickのwireless interfaceで得られるデータ

最近気がついたけど、ブログにデータ書いておくと、後で読み返せるんだねー。
自分メモの意味が少しわかったところで、オレも書いておこう

$IIRMC,023416,A,3439.276,N,13520.668,E,02.8,341,070713,07,E,A*04
$IIVHW,,,292,M,02.4,N,,*6B
$IIVLW,00848,N,003.3,N*57
$IIVWR,029,L,18.4,N,,,,*79
$IIDPT,013.2,-1.0,*40
$IIGLL,3439.276,N,13520.668,E,023416,A,A*51
$IIHDG,292,,,07,E*1C
$IIMTW,+27.5,C*38
$IIMWV,324,R,17.8,N,A*18
$IIMWV,327,T,16.1,N,A*15



RMC 時分秒(GMT) 緯度 経度 SOG COG 日月年
VHW heading speed
VLW total log, reset log ( Distance Traveled through the Water)
VWR Relative wind direction and speed
HDG heading, Variation
MTW Water temperature, Celcius
MWV Wind Speed and Angle R relative T true

得られるデータは上のとおり、これが1秒間隔。B&Gだと、バスのデータそのまま得られるから、1秒4回とかの更新だけど、まあいいか。

wind angleが変わっていて方位に変換されてる。
あと、VariationがEになってるけど、、、、7度はいいとして西だろ。
設定を見直さないと。


Posted at 2013/07/13 11:19:48 | コメント(0) | トラックバック(0) | 電子工作 | 日記
2013年07月06日 イイね!

tacktickのwireless interfaceの件

tacktickのwireless interfaceの件乗せてもらっている船が新しくなって、計器もB&Gからtacktickに変わったので、いろいろとまたお勉強をしているんだけど、やはり新しい船に変わったとき、乗り方も変わるわけで、そういうときこそ計器がちゃんと動いて欲しいのだが、これがまた見事にいい加減にしか動いていない。

しょうがないので、パソコンを繋げてログを取りたいと思ったけど、パソコン繋げるwireless interfaceという部品が無い。。。

無いなら買うかー、ということで調べてもらうと、なんと国内に在庫があるとのこと。えー、海外メーカーの計器のパーツの在庫あるの??じゃ買う買う、と取り寄せてもらって、今日早速船に付けに行ってきたのだ。

上架中は、バウハッチから船に入るんだけど、、、なんか見慣れないものが、、、冒頭の写真。なになに、、、GPS interfaceと書いてあるような。。。えーと、tacktickの場合、gpsはwireless interfaceに繋げるはずなんだけど、とふた開けてみると、やっぱり、wireless interfaceだった。

えーっ、注文して、取り寄せてもらって、キャッシュカードでお金下ろしてきて、、、で、船についてるだと!!

すみません、調査不足でした。。。返品をお願いしました。ご迷惑おかけして申し訳ない。でも、、あるものいらないし。。。

でもね、、、計器でwireless interfaceの信号無かったんですけど。。。だから、wireless interface無いと思ってたんですけど。。。おかしいな。。と調べました。




あのー、電源線たどると、先がどこにも繋がってないんですけど。。。そりゃ信号無いはずです。とほほ。。。






gpsのアンテナも船の後ろに無かったけどなー、とたどっていくとバウへ。(黒い線)



バウの航海灯の間に、GPSと書いてあります。うーん、確かにこの船の場合、結構後ろに人が乗るので、他の船のように後ろつけると、人間が邪魔をして信号を受信しにくい、ということはあります。バウにつければ、人間に邪魔されずに受信は出来ます。しかし、、、繰り返しますが、電源線を繋いでいないので、信号は受信できません!



動かない原因がわかったので、早速電源線をつなげようとすると、スイッチパネルは、開きません。裏からボルトナットで止めているようで、一人ではあけられません。
バッテリが無いので、倉庫から持ってきたら、ターミナルがついていないので、ケーブルにつなげられません。
繋がっていない電源線を繋げようと剥いてみると、真っ黒さびさびです。
インターフェースに持ってきたrs232cの線を繋げようとしたら、小さいマイナスでターミナル回さないといけないのですが、船の工具箱にそんな小さいマイナスありません。
風とおしの超悪い船内で、あーでもない、こーでもないと汗だくになりながら、なんとかしました。




パソコンにつなげてみると、ちゃんとデータ拾います。

良かった。苦労が報われる瞬間でした。

さて、gpsが繋がったところで、計器を改めてみると、やはりちゃんと緯度経度が出ます(^^)。でもマニュアルよく読んでないので、アレなんですが、、、ポジションしか出ません。cog,sog無いです。cog,sog無いから、tideとかcurrentとかも、無いです。緯度経度だけ見えても、レースに使いようが無いんですけど。。。

パソコン繋がないなら、電源線要らなかったのね。とほほ。



Posted at 2013/07/06 18:46:59 | コメント(0) | トラックバック(0) | 電子工作 | 日記
2012年11月10日 イイね!

PIC32MX ロジアナ動いた~

PIC32MX ロジアナ動いた~相変わらず、SDカードの読み書きがPIC32MXで出来ない。ChaNさんのFatfsだけど、pic24だとすんなり動くんだけど、PIC32に移植したら動かない。というか、最初の初期化で失敗する。単にクロックを送るだけなんだけど、SDカードから反応が返ってこない。

で、ロジアナいるなーってことで、作ってみたら動いた。めずらし(苦笑)

pickit2のロジアナでSPIを見ているところ


teratermに表示させると、0と1だけど、なんとなく、データが見えてこない?(笑)ほら、地球防衛本部で、紙テープが出てきて、それを読んで、大変なことになった、なんてアレを思い出してもらうと、いいかも(^^;;;下2ビットがデータで、ちゃんと見えてる。クロック1MHzでサンプリングのはずだけど、一応数えてみるとちゃんとクロック幅は16個=16usであってると思う。


で、本題の前にはまったことの覚え書き。

1.PIC32の割り込みは、トリガではなく、ステータスフラグの場合がある

前にも受信割り込みで動かねー。とやっていたが、今回ChaNさんのライブラリが送信割り込みも使っていたので、それをPIC32に持ってきたら、やっぱり動かない。どうしても、PIC24までのトリガ(というのでいいのだろうか? 送信バッファが空になったら送信割り込み、が起きるが、割り込みルーチン内で、そのフラグをクリアすると、割り込みはそれ以降再び空になるまで起きない)に慣れているせいで、送信割り込み内でフラグをクリアしただけでリターンすると、バッファが空なので、また割り込みが起きるPIC32には、まだまだ慣れない。ということで、ここで無限ループ。。。となる。


2.MICROCHIPのライブラリは、信用してはいけない

UART2PrintString ("init 1\n");

if (_TRISB5 == 1) {
UART2PrintString ("TRISB5 chenged\n");
}

SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN5 );

UART2PrintString ("init 2\n");

if (_TRISB5 == 1) {
UART2PrintString ("TRISB5 chenged\n");
}

OpenADC10( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 );
  UART2PrintString ("init 3\n");

if (_TRISB5 == 1) {
UART2PrintString ("TRISB5 chenged\n");
}

EnableADC10(); // Enable the ADC
UART2PrintString ("init end\n");

if (_TRISB5 == 1) {
UART2PrintString ("TRISB5 chenged\n");
}

さて、上記コード、なにやってるかわかりますよね。ADCの初期化をライブラリに任せると、ADCとは関係無いTRISまで、書き換えてくれるので、犯人捜しのコードです。

MPLABXだと、カーソル当てて右クリックで、定義に移動できるので、使う前に是非ソースをお読みになるか、ライブラリをまったくあてにしないで使わない、というのが正しい姿勢だと思います。

mPORTBSetPinsDigitalOut(BIT_5);
ConfigCNBPullups(CNB5_PULLUP_ENABLE);

上記2つのコードもそうです。同じような扱いのはずなんですが、違います。

mPORTBSetPinsDigitalOut(BIT_5);
ConfigCNBPullups(CNB5_PULLUP_ENABLE);

mPORTBSetPinsDigitalOut(BIT_6);
ConfigCNBPullups(CNB6_PULLUP_ENABLE);

なんて、ピンごとに初期化すると、うまくありません。何でかは、定義に移動して怒ってください。


3.Bootloaderは16bitコードを書けないかもしれない。

これはまだ、確証がないのですが、AN1388のbootloaderで16bitコード有効にしたアプリケーションを書き込もうとすると、verifyエラーが出ます。たぶん、32bitのアラインが崩れているところで引っかかるのでは、と思っていますが、Pcapplicationを改造しようとしたら、MFCだったかな、ライブラリが必要で、それは、VCexpressにはついてないので、コンパイルできない。というオチが待っていました。とほほ。
というわけで、あきらめて16bitやめたら、うまく使えています。


本題のロジアナコード

void usbsend(char * buf, int len) {
while (!USBUSARTIsTxTrfReady()) {
USBDeviceTasks();
CDCTxService();
}
putUSBUSART(buf, len);

}

void logiana() {
char buf[10];
int i, j, c;

UART2PrintString("\n\nlogiana start\n");
ANSELB = 0;
TRISB |= 0x00FF;
ANSELAbits.ANSA0 = 0;
ANSELAbits.ANSA1 = 0;

_LATA1 = 0;
_TRISA1 = 1;

_LATA0 = 1;
_TRISA0 = 0;

CNPUAbits.CNPUA0 = 1;

databufc = 0;
while (_RB0 == 1) {
if (_RA0 == 0) {
UART2PrintString("logiana aboat\n");
_LATA1 = 0;
return;
}
}
_LATA1 = 0;

//UART2PrintString ("logiana datain start\n");

while (1) {
while (!IFS0bits.T5IF);
IFS0bits.T5IF = 0;
databuf[databufc++] = PORTB;
if (databufc >= 1000) {
break;
}
}
UART2PrintString("logiana dataget\n");

for (i = 0; i < 1000; ++i) {
c = databuf[i];
for (j = 0; j < 8; ++j) {
if (c & 1)
buf[7 - j] = '1';
else
buf[7 - j] = '0';
c >>= 1;
}
buf[8] = '\n';
usbsend(buf, 9);
}
UART2PrintString("logiana send fin\n");

}

肝心の部分はこれだけです。大体わかりますよね、雰囲気。timer5を必要なタイミングでまわしておいてください。
何しろ40MHzで動いているのですから、この原始的タイマフラグチェック方式でも数MHzは余裕でしょう。MIPSってパイプラインがあるはずですので、分岐でどのぐらいペナルティがあるかわからないんですが、とりあえず1MHzでは動いているようです。

このテストでは、PIC32MX250F128Bを使っていますが、-O0でコードサイズ32K行きませんので、PIC32MX220F032Bでも使えそうです。バッファも1000バイトにしていますが、USBに取られるのはRAM500バイトぐらいなので、PIC32MX220F032Bでも7000サンプリングぐらいはいけそうです。
RB6等ピンが抜けているところがあるので、7000サンプリング7chか、3500サンプリング13chのロジアナが、220円のpicで出来る、、というわけ(^^)

まあ、実際には、picレギュレータ用のコンデンサが10円。電源3.3vレギュレータで100円。usbケーブル100均で100円。ポリスイッチ50円。ユニバーサル基盤にすると6,70円。220円で、安いってだまされると、ろくなもんじゃない。

ちなみに、完成品はというと、、、、
http://dx.com/p/logic-analyzer-w-dupont-lines-and-usb-cable-for-scm-black-148945
なんてのが$12足らずであります。めっちゃよさげで、安いし買おうかな、と思って調べたら、まんまピーコ品の模様。おまけに本家のファームとか焼いて、本家のアナライズソフト使うんだって。さすがに買うのは気が引ける(--;


Posted at 2012/11/10 14:17:21 | コメント(0) | トラックバック(0) | 電子工作 | 日記
2012年10月27日 イイね!

PIC32MX250B128B USB Bootloader動いた

ここ数日、毎度のことながら完膚なきまではまり込んでいるのが、SDカードの読み書き。結局microchipのライブラリは動かず!3日以上無駄にしてる。
こういうときは最後の頼みと、ChaNさんのライブラリ使ったら、あっさり読める。
なにそれ? ホントmicrochip純正のライブラリ類は、この前のサンプルといい、昔々のAD変換ライブラリの勝手にコンフィグといい、まともに動かない!っていうか、ハードもエラッタありまくりだし、特にひどいのは、PIC32MX1xx/2xxのAD変換のスピードの500kHz制限。チップのうたい文句に1MHzまでいけるって謳ってるのに、エラッタで動きません、とは不当表示で公正取引委員会に捕まるレベルと思うのだけどなー。

それに引き換え、ChaNさん凄すぎ。microchipの公式webサイトにも紹介されているし、そりゃ、ChaNさんのライブラリのほうが動くもんなー。

--------------------------------------------------------------------
それより、SDカードの読み書きをテストしてるうちに、pickitのロジアナがどうもうまく動いていないような気がするのだ。クロックを見ても、ちゃんとパルスを拾っていないみたい。せっかくだし、自作してみるかー、と思い立ったけど、、
ロジアナの開発では、当然SDカード担当のpicも同時開発になるので、pickit2差し替えるの面倒。となると、ロジアナはブートローダで、開発しよう。
なら、まずブートローダを試さないと。
と言う論法で、ブートローダのお勉強。

ブートローダ本体は、この前のUSBを内蔵FRCで何とかするコードを入れたら、割とあっさり動き出した。ついこの前、microchipのライブラリのバージョンが上がって、PIC32MX1xx/2xxもこうやれば動くよ、なんて説明がつくようになっていて、ちょっと親切かも、と思った。

しかし、それに乗せるアプリケーションの方は、ちょっとはまった。
Link Error: Could not allocate program memory
説明どおりにリンカスクリプト入れ替えても、エラーが出る(;_;)

/* User has to modify the LENGTH of kseg0_program_mem based on the Flash Size available in the chosen part number.*/
kseg0_program_mem (rx) : ORIGIN = (0x9D006000 + 0x1000 + 0x0 + 0x490), LENGTH = 0xB70

リンカスクリプトには、このように変更しろとはあるけど、どうやるの?もう、pic32になると、仮想メモリだ、バスマトリクスだと、だんだん手におえなくなってきているのに、リンカスクリプトもよくわかりませーん。


で、こういうときはひたすら眺めるに限る。


まず、コンパイラではメモリスペースは、0x20BF0となっている。


で、xc32のdefaultリンカスクリプト(らしきもの)では、、、、
うーん、なんとなく0x1F000+0x1000 = 0x20000だよな。
0x760+0x490は0xBF0

なんとなくあたりかも。つまり、0xBF0=3056となって、ブート領域の+3kのメモリサイズと思われ。0x20000が本体の128Kではないかと。

そうであるなら、本来0x20000あるけど、スタート位置がそれぞれのセクション分ずれているので、LENGTH = 0x18B70が正解ではないかと。。

まあ、ちょっと多めにしておいても、どうせメモリいっぱいになるようなプログラムは作らないだろうから、動いたしいいや。


Posted at 2012/10/27 17:25:29 | コメント(0) | トラックバック(0) | 電子工作 | 日記

プロフィール

「[車中泊6泊目]今日は寒かったー http://cvw.jp/b/1110950/39009397/
何シテル?   12/15 18:05
marumonです。よろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

<< 2025/8 >>

     12
3456789
10111213141516
17181920212223
24252627282930
31      

リンク・クリップ

友情パワーよ、ありがとう(^^) 
カテゴリ:その他(カテゴリ未設定)
2012/11/08 22:46:45
自作ハザードイルミ点滅 
カテゴリ:その他(カテゴリ未設定)
2012/04/17 19:25:27

愛車一覧

ホンダ フリードスパイク ホンダ フリードスパイク
主にスキー用。たまに、自転車運びます。

過去のブログ

2025年
01月02月03月04月05月06月
07月08月09月10月11月12月
2024年
01月02月03月04月05月06月
07月08月09月10月11月12月
2023年
01月02月03月04月05月06月
07月08月09月10月11月12月
2022年
01月02月03月04月05月06月
07月08月09月10月11月12月
2021年
01月02月03月04月05月06月
07月08月09月10月11月12月
2020年
01月02月03月04月05月06月
07月08月09月10月11月12月
2019年
01月02月03月04月05月06月
07月08月09月10月11月12月
2018年
01月02月03月04月05月06月
07月08月09月10月11月12月
2017年
01月02月03月04月05月06月
07月08月09月10月11月12月
2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2015年
01月02月03月04月05月06月
07月08月09月10月11月12月
2014年
01月02月03月04月05月06月
07月08月09月10月11月12月
2013年
01月02月03月04月05月06月
07月08月09月10月11月12月
2012年
01月02月03月04月05月06月
07月08月09月10月11月12月
2011年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation