問題タブ [pic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
1461 参照

c - 関数が 1 ~ 256 バイトを処理するためのベスト プラクティス

1 ~ 256 バイトを処理するように設計された関数がいくつかあり、組み込み C プラットフォームで実行されます。バイトを渡すと、int を渡すよりもはるかに高速でコンパクトになります (1 つの命令と 3 つの命令)。

  1. int を受け入れ、ゼロの場合は早期終了し、それ以外の場合はカウント値の LSB を unsigned char にコピーし、それを do {} while(--count); で使用します。ループ (256 のパラメーター値は 0 に変換されますが、256 回実行されます)
  2. unsigned char を受け入れ、ゼロの場合は早期終了し、256 バイトの特別なバージョンの関数を用意します (これらのケースは事前にわかります)。
  3. unsigned char を受け入れ、ゼロの場合は 256 回実行します。
  4. 上記のような関数を用意しますが、(0-255) および (256 のみ) として動作するラッパー関数を介して呼び出します。
  5. 上記のような関数を用意しますが、(0-255) および (256 のみ) として動作するラッパー マクロを介して呼び出します。

システムがビジー状態の場合、関数の内側のループはおそらくプロセッサ実行時間の 15% ~ 30% を占めると予想されます。小さいバイト数に使用されることもあれば、大きいバイト数に使用されることもあります。関数で使用されるメモリ チップにはトランザクションごとのオーバーヘッドがあり、メモリ アクセス関数にトランザクション開始/処理実行/トランザクション終了シーケンスを内部的に実行させることを好みます。

最も効率的なコードは、単純に unsigned char を受け入れ、パラメーター値 0 を 256 バイトを実行する要求と見なし、0 バイトを誤って読み取ろうとする試みを回避するために呼び出し元に依存することです。ちょっと危なそうですけどね。組み込みシステムでこのような問題に対処した人はいますか? 彼らはどのように扱われましたか?

編集 プラットフォームは PIC18Fxx (128K コード空間; 3.5K RAM) で、SPI フラッシュ チップに接続されています。256 バイトを読み取ると、PIC の読み取りバッファーがオーバーランする可能性があります。0 ではなく 256 バイトを書き込むと、フラッシュ チップのデータが破損します。ビジー状態をチェックしない場合、PIC の SPI ポートは 12 命令ごとに 1 バイトに制限されます。実行すると遅くなります。通常の書き込みトランザクションでは、受信するデータに加えて 4 バイトを送信する必要があります。読み取りには、「SPI ターンアラウンド」のために追加のバイトが必要です (SPI ポートにアクセスする最速の方法は、次のバイトを送信する直前に最後のバイトを読み取ることです)。

コンパイラは HiTech PICC-18std です。

私は一般的に、HiTech の PICC-16 コンパイラを気に入っています。HiTech は、PICC-18std 製品から、コンパイル時間がさらに遅い PICC-18pro ラインにエネルギーをそらしたようで、2 バイト ポインターではなく 3 バイトの「const」ポインターを使用する必要があるようです。メモリ割り当てに関する独自のアイデア。PICC-18pro をもっと調べたほうがいいかもしれませんが、PICC-18pro の評価版でプロジェクトをコンパイルしようとしたとき、うまくいかず、正確な理由がわかりませんでした。私の asm ルーチン - 私は PICC-18std を使い続けました。

ちなみに、PICC-18 が特に do {} while(--bytevar); を好むことを発見しました。特に嫌いなのは do {} while(--intvar); です。コンパイラが後者を生成するとき、コンパイラの「心」はどうなっているのだろうか?

コンパイラは、LFSR 命令 (2 ワードかかる) を使用するのではなく、MOVLW/MOVWF (4 ワードかかる) の組み合わせを使用して、変数へのポインターをロードします。次に、このポインターを使用してデクリメントと比較を行います。認めますが、do{}while(--wordvar); while(wordvar--); ほど優れたコードを生成することはできません。{} コードは、後者の形式が実際に生成するものよりも優れています。別のデクリメントと while テスト (たとえば while (--lpw,lpw)) を実行すると、適切なコードが生成されますが、少し見苦しく見えます。ポスト デクリメント演算子は、ダウン カウント ループに最適なコードを生成できます。

しかし、代わりに --lpw より悪いコードを生成します。最適なコードは、アップカウント ループ用です。

しかし、コンパイラはそれを生成しません。

編集 2 私が使用する可能性のある別のアプローチ: バイト数にグローバル 16 ビット変数を割り当て、終了前にカウンターが常にゼロになるように関数を記述します。次に、8 ビット値のみが必要な場合は、8 ビットをロードするだけで済みます。最高の効率を得るために微調整できるように、マクロを使用します。PIC では、0 であることがわかっている変数に対して |= を使用すると、= を使用するより遅くなることはなく、場合によっては高速になります。たとえば、intvar |= 15 または intvar |= 0x300 は 2 つの命令になります (どちらの場合も、結果の 1 バイトだけを処理する必要があり、他のバイトは無視できます)。intvar |= 4 (または任意の 2 の累乗) は 1 つの命令です。明らかに、他のプロセッサでは、intvar = 0x300 の方が intvar |= 0x300; よりも高速です。マクロを使用する場合は、必要に応じて微調整できます。

0 投票する
3 に答える
731 参照

c - ビット演算

私はこれを正しく理解していますか?

11111111 0 または 1 または 2 の 2 による算術左シフト

意味:

敬具、ソナイト

0 投票する
1 に答える
2686 参照

input - 入力および出力用の PIC ピンを構成する

PIC24FJ64GA002 MCU を使用するプロジェクトに取り組んでいます。1本のワイヤを使用してデータを送信し、受信モードに切り替えて同じピンでデータを受信するビットバングシリアル通信機能に取り組んでいます。別のピンは、常に別のボード (常に入力) によって制御されるクロッキングに使用されます。入力および出力として使用できるオープンコレクタ動作用にピンを構成する方法があるのだろうか、または読み取りから書き込みに移行するたびにピン構成を変更する必要があるのでしょうか?

0 投票する
2 に答える
867 参照

controller - ゲームコントローラーのプログラミング

コントローラーを使って水中ロボットを操作したいと考えています。複数のボタンを備えたジョイスティックを使用したいと考えています。私は写真をプログラムして、自分の回路基板を作りたいと思っています。私はコンピューターを使用していません。pic のプログラミングに関するヘルプはどこを参照すればよいですか?

ありがとう、

コーリー

0 投票する
4 に答える
5927 参照

algorithm - データをシリアルポートに送信する最良の方法は何ですか?

これはマイクロコントローラーに関連していますが、アルゴリズムとデータ型の問題であり、ハードウェアの問題ではないため、ここに投稿することを考えました。ハードウェアの知識がない人でも参加できるように問題を説明します:)

  1. マイクロコントローラーには、10ビットの分解能を持つアナログ-デジタルコンバーターがあります。(0から1023までの値を出力します)

  2. シリアルポートを使用してこの値をPCに送信する必要があります。

  3. ただし、一度に書き込むことができるのは8ビットのみです。(バイトを書き込む必要があります)。これはマイクロコントローラーの制限です。

  4. したがって、上記の場合、少なくとも2バイトを送信する必要があります。

  5. 私のPCアプリケーションは、プロットのために一連の数字を読み取るだけです。したがって、2つの連続したバイトをキャプチャし、数値を元に戻す必要があります。ただし、ここでは区切り文字も必要になります。ただし、区切り文字のASCII値は0〜255であるため、プロセスが混乱します。

では、これを行う最も簡単な方法は何ですか?値を一連の文字として送信する必要がありますか?

要約すると、10ビット番号のシーケンスをシリアル経由で最速の方法で送信する必要があります。:)

0 投票する
2 に答える
2266 参照

usb - Pic toPIcおよびPCUSB方法は?

PIC18F4550が内部のEEPROMデータをUSB経由でPCに送信するアプリケーションを作成したいと思います。また、同じUSBコネクタを使用して、USB経由で別のPIC18F4550にデータをダウンロードしたいと思います。

この目的のためにccsサンプルコードのex_usb_serial.cを使用する方法。誰かが私に回路図とPC側で何をすべきかを教えてくれるなら。この点での早期の助けは高く評価されます。

よろしくダニ

0 投票する
3 に答える
1581 参照

c - データをすばやく送信するとPIC18Fがロックする

PIC18Fを使用していて、ハイパーターミナル経由でデータを送信しようとしています。0.5秒ごとに1つのキーを押して低速でデータを送信すると、データを受信して​​正しくエコーしますが、高速でキーを押し始めると、MCUがロックされます。何が原因かわからない。

ボーレートはPICとハイパーターミナルの両方で2400です。

これが受信ループです。sendDataは、「受信済み」と言って送信するデバッグコードです。それが凍結したことを私たちが知る方法です。

毎回同じ量のループでフリーズするわけではなく、データを入力する速度だけに依存します。

0 投票する
1 に答える
342 参照

controller - xboxコントローラーと写真を使用してモーターを制御するプログラムを作成する

xboxコントローラーと写真を使用してモーターをアクティブにするACコードプログラムの作成に関して、どこから始めればよいかについてのアドバイスを探しています。どこから始めればいいのか、誰かアドバイスはありますか?

ありがとうございました、

0 投票する
3 に答える
3480 参照

bit-manipulation - 単語内のビットを回転させる方法

dsPIC33F と GCC を使用しています。次のように、単語内のビットを左または右に 1 回回転させたい:

(明確でない場合、LSB は右回転の MSB の位置に移動し、その逆も同様です。)

私のプロセッサにはすでに右回転 (rrnc、rrc) 命令と左回転命令 (rlnc、rlc) があるので、コンパイラがこれを最適化してくれることを期待しています。そうでない場合は、インライン アセンブリを使用する必要があるかもしれません。

0 投票する
2 に答える
2385 参照

python - 3回読んだ後のpySerialフリーズ

写真をプログラミングしていて、データを送信しようとしているときにシリアルポートにデータを送信すると、プログラムがロックされると診断しました(テストすると、Pythonコードとハイパーターミナルの両方がクラッシュします)。ハイパーターミナルで動作し、ゆっくりと入力し(ストローク間で> .5秒)、キーボードをバッシングするとクラッシュしました。したがって、0.5秒より長いtime.sleepを導入しましたが、それでも機能していません。

これがテストコードです。

データ受信機能。以前は、charを受信するたびに「ok」が送信されていました(これにより、3回の反復後にフリーズすることがわかります)。それが問題の原因であるかどうかを確認するためにループの外に持ってきましたが、そうではありませんでした。このコードでは「ok」をまったく送信していません。