問題タブ [mplab]
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.
c - ADC dsPIC33 の問題
ADC を自分のデバイスで動作させるのに苦労しています。私は dsPIC33FJ128GP802 を使用しており、手動のサンプリングと変換でゆっくりと開始しようとしました。
私のコードは以下に掲載されています.ADCのすべてのレジスタを設定し、接続したセンサーから電圧を取得するために一度だけサンプリングを試みました。表示される値は約 0.7V ですが、取得しているのは -17408 (10111100 00000000) の領域です。これは -2000 あたりまで上がる可能性がありますが、そもそも値が負であってはなりません。
PICが使用しているのと同じレールを使用してセンサーに電力を供給し、コードで設定したように、センサーの出力をAN0(ピン2)に持っています。PIC は、標準の Vss と Vdd (ピン 8 と 13)、アナログ電源ピン AVdd と AVss (ピン 28 と 27)、および Vcap と Vss 間の 33uF コンデンサ (ピン 20 と 19) に電力を供給されます。ハードウェア的に他に何かする必要がありますか? AD1CHS0bits.CH0NA レジスタと少し混乱しています。グランドを VREFL に接続する必要があるかどうか、またはその場合に何をすべきかがわからないためです。
この問題を修正するために何をすべきかについての助けをいただければ幸いです。また、正しく受け取った値を変換する方法についてのヘルプは非常に役立ちます。
accelerometer - I2C サンプリング レート
dsPIC33f マイクロコントローラを使用して I2C スレーブ デバイスをサンプリングしようとすると問題が発生します。
PIC の内部 timer1 タイマーを使用して、定義されたサンプリング レートで「ティック」し、必要なデータを取得しています。残念ながら、結果が十分に速く得られていません。その理由はわかりません。私のスレーブ デバイスの 1 つは、最大出力データ レートが 3600Hz の ADXL345 加速度計です。これほど高い値は必要ありませんが、50Hz 付近ではうまくサンプリングできていないようです。
I2C は 400KHz の「高速モード」に設定されています。加速度計をサンプリングしたい絶対最大値は1KHzですが、これはやり過ぎですが、128Hzあたりにもっと興味があります。私が設定した加速度計のパラメータは次のとおりです。
- データ形式 (0x31) - セルフ テスト オフ、割り込み反転オフ、フル分解能オン、ジャスティファイ ビット オフ、レンジ ビット +/-16g。
- データレート (0x2C) - 低電力モードオフ (通常モード)、出力データレートモード 400Hz (400KHz I2C は 800Hz までしかサポートしないというデータシートを読んだので、400Hz で安全にプレイしています)。
- 電力制御 (0x2D) - 自動スリープ オフ、測定モード オン、スリープ ビット オフ、スリープ モード サンプリング レート 8Hz (ただし、使用されていないため、無視できます)。
- 割り込み (0x2E) - データレディ割り込みが有効、その他はすべてオフ。
指定されたサンプリング レートでサンプリングするために timer1 を使用しています。カウンターが 1 分に達した後にメッセージを出力するカウンターがあるため、サンプリング レートが十分に機能していることはわかっています。ストップウォッチを使って、それが正しいことを確認します。たとえば、100Hz のサンプリング レートでは、カウンターが 6,000 (100 * 60) までカウントされるのを待ってメッセージを表示します。そのメッセージが表示されたときにストップウォッチが 1 分である場合、少なくともある程度の精度でサンプリングしていることがわかります。
加速度計 (I2C 複数バイト読み取りモード、1 回の呼び出しで 6 バイトすべてを読み取る) からサンプリングしようとすると、十分な速度で実行されません。私のストップウォッチ法を使用すると、1 分かかるはずのジョブ (100Hz でのサンプリング) を実行するのに約 1 分 15 秒かかっているように見えます。つまり、I2C コマンドの処理速度が十分ではありません。サンプリング レートが高いほど、遅延が大きくなります。
I2C クロックと timer1 が同期されていないことに関係していると感じているため、加速度計データの呼び出しに不要な待機が含まれています。I2C の 400KHz クロックでは不十分だとは思いませんが、間違っていたら訂正してください。
I2C スレーブ デバイスからデータを正しく読み取るにはどうすればよいですか? また、十分に高いサンプリング レートで読み取りたいジャイロスコープと磁力計もあります。磁力計には 160 Hz の制限があるため、3 つのデバイスすべてで 128 Hz のサンプリング レートで問題ありません。3 つのデバイスすべてから一度に読み取ろうとすると、サンプリングが予想よりも遅くなることは明らかです。
また、4ピンから同時にアナログデータを収集します(ADC 10bit)。このコードは既に実装されており、期待どおりに動作するサンプリング レートで 1KHz でアナログ データを読み取ることができます。動作が遅いのは I2C デバイスだけです!
3600Hz (I2C の場合は最大 800Hz) で出力できる場合、100Hz でサンプリングしようとすると、加速度計は問題ないと思いますが、本当に苦労していて、他に何を試せばよいかわかりません。
乾杯!
c - 定数式が必要
コンパイルしません。エラーが表示されます (6 回):定数式が必要です
各変数は unsigned char として宣言されています。(const) にキャストしようとしましたが、うまくいきませんでした。
これは MPLAB X IDE、C 言語、Hi-Tech-PICC コンパイラ v9.65PL1 を使用したものです。
何が問題ですか?
以下のように変数を定義すると機能しますが、上記の変数を使用する必要があります。
serial-port - MPlab での RS232 通信
MPlab を使用して pic マイクロ コントローラーからデータを読み取ります。pic18F87J11を使用しています。読み取りたいデータは RS232 の DB9 のピン 3 にあり、私の RS232 は pic マイクロ コントローラに接続されています。誰でも私を助けたり、それを行うための簡単なサンプルコードを教えてもらえますか??
ありがとうございました、
c - -Wmissing-prototypes が使用されているときに、割り込みルーチンのプロトタイプがないという GCC 警告を抑制するにはどうすればよいですか?
MPLABX (Microchip 製品の IDE) と XC16 コンパイラ (GCC ベース) を使用して、C で組み込みコードを作成しています。
-Wmissing-prototypes
すべての関数のプロトタイプがあることを確認するために使用しています。私の問題は、多くの割り込みサービス ルーチンがあることです。これにより、コンパイラはこれらのプロトタイプの欠落についても文句を言います。
ISR 関数はユーザー ソフトウェアから直接呼び出されることはないため、コードのどこにもプロトタイプを配置したくありません。
割り込みサービス ルーチン (つまり、 でタグ付けされた関数)を除いて、欠落しているプロトタイプの警告を表示する方法はあります__attribute__((interrupt,auto_psv))
か?
bluetooth - RN-41 ブルートゥースと dsPIC
私がかなり簡単に進めたいと思っていたものにいくつかの問題があります。
RS232 経由で 115200 のボーレートで PIC から PC にデータを送信しています。最近 RN-41 Bluetooth モジュールを入手しましたが、モジュールに電力を供給して PIC TX を接続するだけで簡単に切り替えられることを期待していました ( max3232) を介して RN-41 の RX に接続すると、オンライン コミュニティが信じさせてくれました。
それに接続してコンピューターとペアリングできます。名前やボーレートなどのパラメーターを変更するために PUTTY/Realterm を使用することもできます。最後に、Bluetooth モジュールの RX と TX にリンクを接続して電源を入れると、PUTTY を使用して送信およびエコーすることでテキストを ping できるので、モジュールが壊れていないことを確信できます。
ただし、PIC から bluetooth モジュールにデータを送信し、realterm (有線接続で正常に動作していた) を使用して表示しようとすると、データが受信されますが、期待どおりではありません。ヘッダー値が 2 の 25 バイトのパケットを期待しています。約 12 ~ 15 バイトで、ヘッダーは -65 です。
最初の値 -65 は常に同じであり、他のデータは変更される可能性があり、これは実際にはボーレートの問題を示唆していますが、さまざまなボーレートを試しました (UART コード、Bluetooth パラメーター、および realterm で変更されました)。 、データはまったく変更されません。いつも間違っています。
私は何を逃したのですか?Bluetooth 構成で変更する必要があるものはありますか? また、パリティビット、ストップビットなどもすべて同じようにチェックしました。
c - MPLAB で複数のソース ファイルを使用して C プロジェクトをセットアップする
PIC18 デバイスの C プロジェクトに MPLAB IDE と XC8 コンパイラを使用しています。複数のソース ファイルを使用してプロジェクトをビルドしていますが、構造を作成する方法がわかりません。
プロジェクトでは、次のものがあります。
- メイン コードが配置されているファイル main.c。ここから、いくつかのファイルが含まれます。
- xc.h: チップ固有の変数などを定義する
- stdlib.h、stdio.h、plib.h、delays.h: コンパイラの関数用
- enc28j60.h: 定義とプロトタイプを含む自作ファイル
- enc28j60.h のプロトタイプの関数が入るファイル enc28j60.c
enc28j60.c は main.c の定義に依存しているため、スタンドアロン ファイルとしてコンパイルできません。
このプロジェクトのセットアップ方法についていくつか質問があります。
- MPLAB プロジェクトのソース ファイルに enc28j60.c を追加する必要がありますか? これを行うと、MPLAB はファイルをコンパイルしようとしますが、失敗します。これを行わないと、リンカーは enc28j60.c で定義され、enc28j60.h でプロトタイプ化されたシンボルを見つけることができません。
#include
enc28j60.c をどこかから取得する必要がありますか? そうでない場合、MPLAB はどのようにしてファイルの入手先を知るのでしょうか?- MPLAB プロジェクトのヘッダー ファイルに enc28j60.h を追加する必要がありますか?
#include
enc28j60.h をどこかから取得する必要がありますか? 現在、これを main.c で実行します。enc28j60.h を実行する (および s をスローしない) ために必要な定義の後#error
に行います。
pic - Cを使用してPIC16F877Aを使用して7セグメントを多重化
ここで質問したのは2回目です。前回は非常に役に立ちましたので、別の C プロジェクトで立ち往生しているので、再訪しようと思いました!
私は多かれ少なかれCで合計n00bですが、最小限の助けでこれを試みるのに十分なことを知っていることを付け加えます(今まで!)そして、私は誰かに私のためにこれをするように頼んでいません。正しい方向へのポインター (しゃれた意図はありません)。
このトピックについてかなりのグーグル検索を行いましたが、オンラインソースからコードをコピーして貼り付けないように最善を尽くしているので、このソースから学びたいので、自分でコードを開発しようとしています.
次にやろうとしていること: '877A の PORTD に接続された 2 つのコモン カソード 7 セグメント ディスプレイを備えた PIC 開発ボードを自作しました。RB0 と RB1 を 7 セグをオンにするトランジスタに接続し、簡単なコードですべてをテストしましたが、正常に動作するため、回路にまったく問題はありません。私は非常に基本的な 0 から 9 までカウントするプログラムを作成することができたので、多重化と 0 から 99 までのカウントを試してみることにしました。私はいくつかのコードを書き、それを以下に投稿しました。私が間違っていることを誰かに親切に指摘してもらいたいです。これまでのところ、単位の桁数は 0 ~ 9 ですが、10 の桁は 0 のままのようです。
何かを忘れているような気がしますが、何がわかりません。私はおそらくそれを少し複雑にしすぎています。
PICのADCへのサーミスタ分圧回路の入力を使用して温度センサーとして機能するプログラムを作成し(これは私の実際のプロジェクトです)、多重化されたディスプレイに値を表示しようとしています。は実際にはプロジェクトの一部ではありません (「2」と「5」、「25C」の場合は「C」などを交互に使用する 1 桁のみを使用することになっています) が、もう少し進めたいので、「改良版のためにこれを開発しようとしています。
とにかく、コードを貼り付けて、誰かが助けてくれることを願っています。
追加するのを忘れた場合は、お知らせください。助けてくれてありがとう!