ライブラリを整理する

■先日入手したARMモジュールSTBee-mini。IDEもなく、エディタでコーディングして、GCCでコンパイルするだけの環境。SPIやUSARTのインターフェースまわりを使いたいのだけど、データシートだけでは今ひとつ解らない。おおまかな手順はわかるのだけど、適切なシーケンスが今ひとつ解らない。そこは手っ取り早くサンプルソースを探した。もちろん、探せば出てくるものだ。

 USARTでよく解らなかったのはIOピンのモード設定とペリフェラル選択、USARTのモード設定まわり。とりあえずDMA転送はせずに、単純な1文字送受信から。参考にしたのはWikimuraの「STM32でUSARTを使ってみる‎」。
 SPIについても資料の整備は進められているようでしたが、現時点では詳細がわからず、こちらはまた別途探すことになりました。

 USARTはPCとの通信用に必要で、SPIはセンサ類との通信に必要です。ターゲットにしているのは温度センサのLM74。このセンサはAVRで遊んでいた時も使っていて、どういうプログラムモジュールを用意する必要があるのかも解っている。とにかくまずはSPI。WikimuraにSPIモジュールを使う際の注意書きなどはあるけれどコードサンプルが無いので、なにやら茫漠としたまま他をあたる。
 探してみると組み込み系の開発会社である(株)テクノロードの掲示板にSPI.zipというSTマイクロからの提供ソースへのリンクがあることを見つけてどうにか。

 LM74はSPIのスレーブだけど、データソースなので、SPIマスタであるSTBee-Mini側ではダミーで0x0000を送信することでクロックだけ起こしてLM74からデータを貰います。CS(チップセレクタ)の制御はソフトウェアでSPIとは独立して制御しました。そして、これらのタイミング確認はオシロスコープで。前回掲示した画像がその時の波形。

LM74からのデータ受信はできたのですが、ここでさらに加工が必要。LM74は正負サイン付12ビットで、計13ビットのデータを16ビットデータに押し込んで返してくる。なので、受信した後、後ろ3ビットをカットして、それから2進バイナリを2進化10進(BCD)形式に変換する。
 2進からBCDへの変換は、引き算の塊になります。3桁BCDであれば、変換対象の数値から100を繰り返し引いて、次に10を繰り返し引いて、と各桁の値を出していく。意外とこのサンプルが見つからなかった。要領としては次のようになります。実装のやり方は他にもいろいろあると思います。

u32  basedec[7] = {1000000,
                   100000, 
                   10000, 
                   1000, 
                   100, 
                   10, 
                   1};
char bcd[8] ;
void bin2bcd(u32 *src){
  u8 n;
  u8 i;
  u32 wk;
  u32 cls;
  
  wk = *src;
  
  for(i=0;i<7;i++){
    bcd[i] = 9;
    cls = basedec[i];
    for(n=0;n<10;n++){
      if(wk >= cls) {
        wk -= cls;
      } else {
        bcd[i] = n;
        break;
      }
    }
  }
  bcd[7] = 0;
}

 LM74の受信データ加工ではあと1つ注意がいるのは、データが0.0625刻みだということです。なので、BCDに変換する前に0.0625倍しなければなりません。ただ、小数点を扱おうとすると、BCDでは難しくなり、浮動小数点ライブラリが必要になってくるので、単純に625倍しました。つまり、STM32内部ではLM74のデータを1000倍した値としてBCD化するわけです。小数点以下は失われますが、表示する時に適切な桁で小数点を表示すれば済む話です。
 従って、LM74のデータを8で割り、625倍します(負数の処理はまた別として)。面白かったのは1つの式の中で8で割り、625倍すると誤差が出たことです。コンパイラ内部で割って掛けるか、掛けてから割るかの違いだと思うのですが、数式ではx=625*y/8で、内部処理でどちらを先にしても変わってはならないのですが、そうはなっていません。たぶん、最適化の処理でx=y*(625/8)とされてしまい、丸め誤差が出たためではないかと推測しています。
 そのため、まずy=y/8としてから625倍したところ、適切に処理されるようになりました。このあたりのコンパイラのクセも、仕事ではちょっとやってられないところですが、ホビーということもあって、ちょっと面白いところです。

Copyright (C) 2008-2015 Satosh Saitou. All rights reserved.
戻る
日記::一覧展開
2016.06
2016.05
2015.12
2015.11
2015.08
2015.07
2015.06
2015.05
2015.04
2015.03
2015.02
2015.01
2014.12
2014.11
2014.10
ケース加工 (2014.10.11)
2014.09
RaspberryPi B+ (2014.09.06)
2014.08
2014.07
SDカード再び (2014.07.05)
2014.06
2014.05
2014.04
2014.03
2014.02
2014.01
2013.12
2013.11
2013.10
2013.09
ヒステリシス (2013.09.28)
2013.08
2013.07
2013.06
2013.05
2013.04
箱詰め終わる (2013.04.13)
2013.03
XBeeで接続する (2013.03.10)
2013.02
音と光 (2013.02.03)
2013.01
2012.12
外装に収める (2012.12.23)
2012.11
2012.10
MPL1151A1 (2012.10.07)
2012.09
2012.08
2012.07
2012.06
2012.05
DHT11 (2012.05.12)
2012.04
PHPでIPCを行う (2012.04.22)
DHCPを立てる (2012.04.14)
DNSを立てる (2012.04.08)
2012.03
IPv6を追加する (2012.03.17)
MTUを調整する (2012.03.11)
2012.02
2012.01
2011.12
2011.11
アサーション (2011.11.20)
XB24-BとXB24-ZB (2011.11.06)
2011.10
家電入れ替え (2011.10.23)
2011.09
湿度センサ (2011.09.25)
2011.08
2011.07
2011.06
2011.05
2011.04
2011.03
2011.02
2011.01
2010.12
PWMで赤外線 (2010.12.26)
2010.11
2010.10
2010.09
音を鳴らす (2010.09.12)
2010.08
2010.07
2010.06
2010.05
2010.04
2010.03
2010.02
2010.01
2009.12
2009.11
2009.10
2009.09
2009.08
2009.07
2009.06
2009.05
2009.03
2009.02
2009.01
2008.12
AVR HTTPサーバ (2008.12.20)
2008.11
2008.10
2008.09
2008.08
ICMP Echo応答 (2008.08.16)
MACフレーム (2008.08.03)
2008.07
2008.06
2008.05
SDカード再び (2008.05.11)
GPSロケーター (2008.05.04)
2008.04
2008.03
音が小さい (2008.03.30)
2008.02
1998.11
作成:2010.11.28
公開:2010.12.12

Valid XHTML 1.1

loading image reserved place