SDOTECK HOME

  • ご参考になりましたか?
    SDOTECKブログでは、みなさんからのフィードバックをお待ちしています。 説明が解らなかったり、もっと詳しく解説してほしいポイント・テーマがありましたら、お気軽にsudoteck@gmail.com までメールくださるか、記事にコメントして下さい。
  • -

RF PowerAMP なら

  • RF AMP DESIGN

HEX calc pro 1.00

  • HEX calc pro ver1.00
    エンジニア向けの16進と浮動小数点を混在して入力出来る計算機 。 Version 1.00 高機能な 16進電卓や科学計算電卓はありますが、いちいちモードを切り替えなければならず、最大の問題は16進数と小数点値を同時に使用出来ないことです。
    詳しい説明はここ
    iTunes ではここまで

ATT calc

  • ATT calc ver2.00
    iPhone 用 RF アッテネーター計算ソフトです。  RF開発エンジニアに必要な、 dBm - W 換算機能をはじめ、π型やT型の ATTを 設計する上で、必要な dB値から抵抗値を算出する機能と、 E24系列の抵抗値を 使用したときの減衰量(dB)と整合インピーダンス(Ω) が表示されますので、どの 抵抗値の組み合わせがよいか検討できます。  また、正確な値を必要とする場合に2個のE24系列抵抗を並列接続して理想の値を 求める計算機能も持っています。  操作はピッカーホイールを回すだけですので、実験中でも片手で簡単に操作 できます。

FIL Calc

  •  LPF 計算機
    RFエンジニア向けフィルター計算ソフト LPFやHPFの設計をするときに、いちいちパソコンを起動してフィルタを設計、結果をプリントアウトして、実験室に行ってネットワークアナライザで測定・実験、ちょっと修正したい時にまたパソコンの所にもどって、再計算...というのが結構面倒で、手軽にiPhone で計算できるといいいなと思って作りました。

iPhone APP

  • ATT calc ver2.00
    SDOTECK が開発した iPhone APP の紹介です。 NEWS---SWRproリリース

Amazon

  • AMAZON Books

RAKUTEN

  • RAKUTEN

mujic.jp

  • music.jp
    music.jp

サイト内検索には?

  • -------------------------------
    ◆下の検索機能でこのブログのすべての関連項目を検索出来ます。是非使ってみて下さい。
サイト内検索
ココログ最強検索 by 暴想

SCHEMATICS

BOSE

  • BOSE
    クワイアットコンフォート20
無料ブログはココログ

Google

  • Google

« シュミットトリガーのはなし | トップページ | パリのはなし »

2012年4月20日 (金)

ビットシフトのはなし

ビットシフトとは
 [Bit Shift ]で、デジタルデーターの1ビットずつを左右に動かせる、便利な命令です。
例えば 2進法では 10進法の4 は、00000100b と表します。 bは2進法表記のこと、16進表記では
0x04 とか書きます。これを例えば A という8ビットの変数に入れます。
A = 00000100b
ですね。
これをビットシフト演算子で右に1つシフトさせると
A = A >> 1 ;
と書きます。; はc言語の区切り記号です。
そうするとどうなるかというと
A = 00000010b = 0x02 = 2
になります。
1が右に1つズレていますね。

同様に
A = 00000100b ;
A = A << 1 ;
と書くと
A = 00001000b = 0x08 = 8
となります。
つまり、
右シフト >> は2分の1にすること
左シフト << は2倍にすることになります。
2進法だから当たり前ですが...
Led_driveport
ハード的には
なにが便利かというと、例えば右図のように1つの8ビットポートに繋がれた LEDをレベルに応じて点灯させる時など
(この図では、Portが Low で点灯する回路ですから、光らせたいビットを0にします。)

switch(level){
case 0 :
PortD = 11111111b; //レベル0
break;
case 1:
PortD = 11111110b; //レベル1
break;
....
....

などとやるよりも

unsigned char segdata ;
segdata = ( 0xff << level );
PortD = segdata ;

で、出来てしまいます。
シフトして右からは 0が入ってくるのでこのようなことが出来ます。

ソフト的には
 しかしながら、時々コンパイラによったり、CPUによったりして、時々困ったことが起きます。
今回も PIC で起こったことは...
LEDを光らせることで使ってましたが、以前はLowをセグメント出力して光らせていたのですが、今回仕様が変わって間にインバーターバッファが入ったので、光らせるビットを 1 にしなければなりません。

以前のソフトは

unsigned int BitData ;
unsigned char SegData ;

BitData =( 0xff00 << level );
SegData = BitData >> 8 ;

と int の上位8ビットを使ってポート出力時に 8ビットに変換していました。
ビット反転でも対応出来るし、初期値を 0xFF7F とすれば1個だけ点灯もできるし..と思って作ってました。

それで今回は

unsigned int BitData ;
unsigned char SegData ;

BitData =( 0x00ff << level );
SegData = BitData >> 8 ;

と単純にやっただけなのですが、結果は SegData はいつも 0x00 のまま。
level = 2 の時には
BitData = 0x00fc と下側8ビットの中でしかシフトしていません。
おかしいなーと思って、

unsigned int BitData ;
unsigned char SegData ;

BitData =( 0xff00 << level );
SegData = ~(BitData >> 8) ; //~ を使って単純にビットを反転

とりあえずこれでOKにしてしまいました。
しかしちょっと納得がいかないので追求しました。

unsigned int BitData ;
unsigned char SegData ;

BitData =( 0x0fff << Level ); //8ビット境界を越えて動くか実験
SegData = BitData >> 8 ;

level = 2 のとき
SegData = 00111111b といくではないですか?

どうやらコンパイラが初期値で変になっているようなので、

unsigned int BitData ;
unsigned char SegData ;

BitData = 0x0fff ; //初期値を入れてやる
BitData = BitData >> 4 ; //希望の値 0x00ffにする

BitData =( BitData << Level );
SegData = BitData >> 8 ;

これで動きました!
なんか追求するといろんな不具合がありそうで、チェックしないとけっこう大変ですね
こんなことでも、コンパイラにうまく思いを伝えないとやっぱ動かないんですね〜

« シュミットトリガーのはなし | トップページ | パリのはなし »

DIGITAL」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/556493/54518620

この記事へのトラックバック一覧です: ビットシフトのはなし:

« シュミットトリガーのはなし | トップページ | パリのはなし »