« 2013年12月 | トップページ | 2014年2月 »

2014年1月

2014年1月18日 (土)

DS18B20

いろいろ忙しいのだけれど、とある用事で、ちょっと高精度の温度センサがほしくなる。
サーモカップル、とまではいらないんだけれど、長く引っ張るのでデジタル系がいいよなあ、ということで、秋月でも扱っているDS18B20+を試してみる。

今はマキシム扱いだけれど、ダラスセミコンダクタの頃から知ってはいる。
結構古いチップだ。使うのは初めてだけど。

140117

入手して、データシートを眺める。
せっかくなので、1-wire を使ってみようか。

------

双方向シグナル1本で、電源も含め、全部やってしまう規格。
プロセッサとの接続は、GNDとこの一本だけだ。

オープンドレインで駆動して、外部は4.7kでプルアップね。
電源電圧は3~5Vか。
いまどきからすると、ちょっと高めだね。

で、データのやり取りは、CPU側からの立下りエッジをもとに、一定時間後のバスの状態で、”0”、”1”を指定している。

1usecとかの、幅の狭いパルスを要求するようだ。
で、デバイス側のサンプリングは立下りエッジから、15usec後か。
プロセッサ側は30usecあたりで、サンプリングするようだ。

タイマー割り込みを使うか、時間待ちループで待つか微妙な時間帯だなあ....

まあ、とりあえず、ごりごりコーディング....

------

これって、バスがLの間は、デバイスは完全に無電源になるんだよなあ。

でもデバイスもバスをLに維持できてるってことは、このICパッケージの内部の電荷だけで、高々数十usecとはいえ、動作維持してるってことか。

各動作シーケンスの最初のリセットパルスは480usecとあるから、このくらいのOFF期間だとパワーオンリセットがかかるってことか?

いや、温度変換のデータは内部SRAMに保持できているから、480usecでは、コールドリセットがかかってるわけじゃないのか。ふーん。

さらに、どうしても保持しなきゃいけないデータは、EEPROMに入っていて、毎回起動時にSRAMにコピーされるようだ。
なんだか凝ってるなあ...(無駄に?)

------

温度変換をしている間、(ADCが動作している間)は、さすがにプルアップ抵抗経由の電源では動作できないようで、変換リクエストを出した後は、速やかにもっと低いインピーダンスでバスを電源側に引っ張る必要がある。
時間は10usec以内とある。せわしないなあ。

要求されるのは数mAなので、通常はCPUのGPIOをオープンドレインで使用して、しかるべきタイミングで、プッシュプルに切り替えれば十分用は足りる。

変換終了までは、電力供給を維持しなければならない。ふむふむ。

------

で、変換を開始して、しばらく待って読み込もうとすると、うまくいかない。
うーん...途中で、バスが落ちているようだが、これは...

制御用のタイミングが、どれも十数usecなんてオーダーなので、勝手な印象で、変換開始から数十msecくらい待って読み込みを開始していたんだけれど、どうも早すぎるようだ。
busy/readyフラグなんて物もないので、時間で決め打ちなのだけれど、ちょっと伸ばしてみても、状況は変わらない。

あらためてデータシートを読むと、驚愕の変換時間750msecとの記述がある。
1秒近く待つのか。ちょっと待ったくらいじゃ全然届いてない...

デフォルトの12ビット分解能だと750msec。
ビットを1つ減らすと、変換時間が半分になるようだ。

と、いうことは....こいつは積分型AD変換器なのか。

久しぶりに見たかも。
積分型なら、この長い変換時間も納得。
4096カウントで750msecだから、内部クロック5kHzくらい?

------

なんだかんだで、まあ動くようにはなった。
普通の温度計と見比べても、ほとんど同じ値を示すようだ。
MPL115の内蔵温度センサは、個体によっては3度くらいずれているが、こいつは温度計としても正しく使えそう。

微妙に早かったり、えらくゆっくりだったり、ちょっと普段付き合ってる人たちとは毛色が違うけど、これはこれで使えそう。

なかなか寄り道が多くて、本筋に戻ってないけど、まあ趣味なのでよし。

| | コメント (0) | トラックバック (0)

2014年1月11日 (土)

STM32F3のSPI

しばらく前にハマったところ。
STM32F373でSPI。

割といままでと変わりないなあ、と油断していたら、8ビット長以下の通信を設定すると、なにやら訳のわからないデータを吐き出す。
9ビット長以上のデータだと問題ない。
うーん?

------

色々試したのは、STの用意しているSPIサンプルコードではなく、自分で書いたコードだったのだが。

どうにも行き詰ったので、公式のサンプルコードを参照してみる
と、F3だけは、なんだかSPIアクセスのライブラリが2種類ある。
なんじゃこりゃ。

データが8ビット以下とそれ以上で、別の関数が定義されている。
さっそく中身をあらためる。

なんと、データレジスタへのアクセス幅が替えてあるよ....

8ビット以下の場合は、データレジスタを8ビット幅でアクセスし、9ビット以上の場合は16ビット幅でアクセスしないと、うまく動かないようだ。

------

ヘッダーファイルには、ペリフェラルのデータレジスタは、unsigned shortで、定義されている。
8ビットデータ時に、この定義でそのまま使うと、なんだか変なデータ列が出て行ってしまう。
データのビット長はちゃんと指定していても、だ。

データレジスタのポインタを、unsigned char*にキャストした上でデータを書き込むと、うまく8ビットのデータが送受信されるようだ。
反則くさいやり方だが、公式ライブラリがそうやってるんだから、公式なやり方なんだろう。

データシートには、記載が無い......とは言い切れないような、微妙な記載があるにはあるような...

でもこれ、わかってないとちょっと気が付かないよ。

ヘッダーファイルに、16ビットで定義されていたら、それに従うよなあ。

そういや、昔のルネサスのH8とかのヘッダーファイルは、すべてのアクセス可能なサイズで定義されていたなあ。
structの中に、アクセス可能な全部の型で、union定義されていた。

------

F1,F2,F4のSPIペリフェラルは、それぞれはちょっとずつ仕様が違うけど、8ビットデータの送信のために、データレジスタに8ビットアクセスしないといけないのは、このF3だけだ。
また、F3内では、F373だけでなく、F372もF303も同じ動きをする。
F3の方が、F4よりも新しいシリーズってことなのかもしれない。

STM32のSPIは今後こうなっていくのかな。

しかし、まさかなあ...という感じ。

| | コメント (0) | トラックバック (0)

2014年1月 8日 (水)

モーター到着

発注したモーターが届く。
なんか、こんなに早く手に入るなんて、思ってもみなかったのだが。

140108

モーターは1個でも正規の梱包。
送料が全体の1/3なので、まあ当然か。

肝心のモーターは、実際に手に取ってみると、なるほど、こうなってるのね。
よくわからなかった構造も納得。

いけそうだ...

| | コメント (0) | トラックバック (0)

2014年1月 5日 (日)

初期値格納アドレスずれ

ふとしたことで、dataセクション用の初期化データの開始アドレスが、4バイト分ずれる理由に思い当たった。
世間では常識なんだろうけど、今頃気付く...

たぶんGCC4あたりのどこからか...まあちゃんと調べればわかると思うけど。
変数の初期値のアライメントが、4バイト境界から、8バイト境界へ変更されているようだ。

いまどき初期化される変数には、long longや、doubleもあるから、8バイト境界にそろえるのは理にかなってる、ような気もする。

今のGCCでは、textセクションが8バイト境界で終わらなかった場合、次の8バイト境界までスキップされて、dataセクションの初期値が始まっている。

                0x0001388c                __text_end__ = .
.data           0x10000000      0x930 load address 0x00013890

コードをわずかずつ変えてコンパイルして、textセクションのサイズを変えてみても、
必ず8バイト境界に置かれるようだ。

------

今まで使っていたスタートアップの中では、textセクションの最終番地の次の4バイト境界を開始アドレスとして、初期値のコピーを実行していた。

運がいい(悪い?)と、正しく動くが....

アライメントの指定を、8バイト境界に変更する。
たぶんこれで直ったはず...

------

リンカスクリプトと、スタートアップは、GCC3あたりから基本部分を使いまわしている。
当初は、問題なく動いていたのだが。ちゃんとメンテナンスしないといかんなあ。

あらためて、リスティングファイルをみる。

Cortex-M3はthumb2を使っていて、16ビットコードなのだけれど、textセクションは4バイト境界で終わるように、適時NOPが挿入されている。
アセンブラが内部で使う定数は32ビットなので、これで十分なのか。うーむ。

分かってしまえば何てことは無いのは、いつものことなのだが。

| | コメント (0) | トラックバック (0)

2014年1月 1日 (水)

モーター注文

マクソンのブラシレスDCモーター。
EC20 ホールIC付。

新年早々だけれど、ためしに、オンラインショップで、1個手配してみる。

思っているような使い方ができるといいんだけど。
スペックからすれば、使えるはず....

| | コメント (0) | トラックバック (0)

到着

あけましておめでとうございます。

------

関東は、相変わらずブレ無くいい天気。
日本全国津々浦々、冬は天気が悪いと相場は決まっているものだが、関東だけは別だ。
初日の出は関東に限るな。

20140101

高速道路料金の影響か、高速道路はすいている。下道はそこそこ。
朝から飲んで、ごろごろ。

| | コメント (0) | トラックバック (0)

« 2013年12月 | トップページ | 2014年2月 »