トップページ > 電気・電子 > 2014年04月07日 > gsreOvni

書き込み順位&時間帯一覧

7 位/106 ID中時間01234567891011121314151617181920212223Total
書き込み数2200000000000000000000004



使用した名前一覧書き込んだスレッド一覧
774ワット発電中さん
初めてのPICスレ
初心者質問スレ その101

書き込みレス一覧

初めてのPICスレ
463 :774ワット発電中さん[]:2014/04/07(月) 00:05:28.91 ID:gsreOvni
PIC初めてです。教えてください。

C言語で、8bitの中の特定ビットが1か0か調べる方法は、
if( ( a & 0b10000000 ) != 0 ){ ... という記述しか無いでしょうか?
と言いますか、もっと高速に判断できる方法はないでしょうか?

というのは、SPIの部分を作っていて、シリアル出力をもっと早くしたいのです。
例えば8bitのMSBから順番にデータ線に乗せて、クロックを↑↓するのですが、
以下の用に書いています。

if( ( a & 0b10000000 ) != 0 ){ dat = 1; } else { dat = 0; }
a <<= 1;
同上を8回行い
clk = 1; clk = 0;
という感じに書いています。

a <<= 1; のシフトも、もっと速く動く記述方法はありますでしょうか?
初心者質問スレ その101
973 :774ワット発電中さん[]:2014/04/07(月) 00:36:04.89 ID:gsreOvni
>1815のベース側の抵抗値ってどうやってきめんの?
>何を基準に算出すんの?
簡単に説明するのは難しいけど、こんな感じ。
1) 負荷電流(流したいコレクタ電流)を決める。
2) トランジスタの増幅率(hFE)を調べる
3) 流したい電流÷増幅率=ベース電流を知る。
4) 入力電圧を決める。
5) ベース直列抵抗=(入力電圧-0.6V)÷ベース電流
という機械的な計算で求める。

ここで大事なことは、トランジスタの説明で、よくある「ベース電流×hFE=コレクタ電流」とか言うけど、
この意味は、ベース電流のhFE倍のコレクタ電流が「流れる」ではなくて「流せる」ということ。
コレクタ端子から電流が「無尽蔵にあふれ出す」訳じゃなくて、
コレクタ側の電池の力で流せる電流があってこそ、ということ。
つまり、いくらトランジスタが「ベース電流のhFE倍のコレクタ電流まで流せる」ように準備していても、
コレクタ側の電流が小さければ、そこまでしか流れませんよ、ということ。
例えば、電池(+)-----抵抗----LED-----電池(-)という回路で、10mAしか流れない回路に、
トランジスタを参加させてon/offするように、
電池(+)-----抵抗----LED----トラ(C) トラ(E)----電池(-)という回路にしても
最大は、やっぱり10mAしか流れません。

トランジスタは「ベース電流のhFE倍のコレクタ電流を流す」訳ではなく、
「そこまで流せるように、蛇口を開けていますよ」ということです。

このこのとは、見方を変えると、
10mA流れるLED回路に参加させても、トランジスタのベース電流を減らしていくと
8mAとか5mAとかに制限されますよ、ということです。
制限されます=制限できます、ということです。
初めてのPICスレ
468 :774ワット発電中さん[]:2014/04/07(月) 01:48:30.76 ID:gsreOvni
みなさん、ありがとうございます。

>>464
>あとdatをセットする時は
>dat=0;
>にするとちょっと速いかも。
ありがとうございます。そうですね。確率の高い方をセットすることにします。

>>465
>if(a & 0x80)
>clk = 1; // or clk(1);?
>else
>clk = 0; // or clk(0);?
>a <<= 1;
ありがとうございます。
でもその書き方だと、送信dataが1のときしかclkを打たないので、マズイと思います。

>>466
>SPIXCON使ったほうがいいんじゃね?
なるほど、ハードウェアにやってもらうのはいいですね。忘れていました、というか
使ったこと無いのでした。ありがとうございます。
おっと、待ってください。24bit連続させたいのですが、できましたっけ? 8bit専用とか。

考えているのは、
・forなどの繰り返しを使わない。(繰り返しと判定で、遅くなるから)
・if()より、= ( a & 0b10000000 )? 1 : 0;の方が速い(?)かも、なので、
dat = ( a & 0b10000000 )? 1 : 0; clk↑↓
dat = ( a & 0b01000000 )? 1 : 0; clk↑↓
dat = ( a & 0b00100000 )? 1 : 0; clk↑↓ と、全bitを繰り返す。これを3回やって24bit。
・a<<=1;など、シフトは予想外に遅い。
・clkの↑↓を、以下に速くやるかを考える。
  clk=1; clk=0; より、clk=~clk; clk=~clk;の方が速い?

MPLABでアセンブラ結果が見えれば、クロック数が数えられるのですが、.asmが生成されないようで。
さらにPICだと、水晶発振の1/4になってしまうので、マイコンを変えるのも手かもしれませんね。
SPI方式のシリアルD/Aコンバータの駆動です。

ありがとうございました。
初心者質問スレ その101
975 :774ワット発電中さん[]:2014/04/07(月) 01:53:04.94 ID:gsreOvni
そんなに退屈な読みにくい文章かなぁ? 割にササッと読めると思うけど。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。