問題タブ [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 - LCD ライブラリ - MPLAB X
Pic16F887 のこの LCD の例を理解しようとしています。 http://www.mikroe.com/chapters/view/17/chapter-4-examples/#c4v12
しかし、コンパイラは私にエラーを表示し続けます:
ソースコード (lcdp16.c)
誰が私に何が起こっているのか説明できますか? コンパイラがメソッドを認識できるように、カスタム LCD ライブラリを作成する必要がありますLcd_Init()
か? (Windows 7 / XC8 / MPLAB X)
c - C30 と MPLAB X を使用した switch ステートメントでの奇妙な動作
C30 と MPLAB X で奇妙な問題を実験しています。次のコードがあります。
モードが「L」文字に等しい場合、スイッチは「case 'L'」では入力されませんが、if 文で入力されます。しかし、この方法でコードを変更すると:
switch文にピッタリ入ります。他のケースは次のように定義されます。
C30 コンパイラ v3.31 と MPLAB X v1.41 を使用しています。あなたが私を助けてくれることを願っています。
ありがとうございました
編集:
答えとコメントによると、私はこの方法でコードを変更しました:
switch ステートメントの前に次のように記述します。
switch ステートメントは完全に機能しますが、関数 ReadUART1() を使用して UART から「L」を取得すると、unsigned int が返されます。
私のデバッガによると、unsigned int の 76 番に対応する 'L' が返されます。switch ステートメントは機能しませんが、モードはまだ 'L' です。関数と同じになるようにモードを unsigned int に変更しても機能しません。if() ステートメントを使用する必要があると思います。
embedded - PIC24 メモリ アクセスの読み取りまたは書き込みでのブレークポイント
私の環境...
- PIC24
- MPLab (V.8.80)
- ICD3
どのルーチンが読み取りを行っており、どのルーチンが実際に書き込みを行っているか、またそれがいつ発生するかを確認するために監視したいバイトがあります。
ブレークポイントしか設定できません
- バイトが書き込まれるとき、または
- それが読まれるとき
どちらのアクセスにもブレークポイントを設定できる方法を知っている人はいますか? つまり、何が書かれていて、何が読まれているのか、どの順序で、どの命令によって、どのルーチンで行われるのかを監視したいのです。
私が持っているのは、PICkit 3 とこの ICD-3 だけです。これは、2 つのチップがそれぞれの UART に接続された (最終的にはペリフェラル ピン選択を介して) いくつかのワイヤを介して通信するデュアル プロセッサ システムです。
私は本物の氷を使ったことも、触ったことも、見たこともありません。それは私がこれを行うことを可能にしますか?つまり、任意のバス メモリ アクセス。
これが MpLab が ICD-3 で今できることです
c - C18: コンパイラは、関数呼び出しが返されないことを「認識」しますか?
C18 を搭載した PIC18 で 16 ステートの FSM を構築しています。私は、各状態を、他の状態にジャンプしてジャンプする独自の機能として持つことを検討しています。プログラムがどこに行くべきかを判断するために、各状態の最後に「state##();」の分岐ケースを書きたいと思いますが、コンパイラーがこれを期待する可能性が高いため、これはすぐに死ぬと思います永遠に分岐するのではなく、戻ること。私のマイクロコントローラーのスタックはすぐにいっぱいになり、最終的にはオーバーフローします。
C18 は、私の関数呼び出しが返されず、命令を CALL/BRANCH ではなく GOTO/JMP に置き換えることを知っているほど賢いですか? GOTO が C に存在することは知っていますが (読みやすさの理由から、通常は強くお勧めしません)、ここよりも GOTO を使用する適切な理由は思いつきません。_asm _endasm ブロックを使用して強制的に goto できることは承知していますが、必要がない場合は問題を回避できます。関数に行って戻ってこないようにするには、C でどのように言うのが最善でしょうか?
当然、すべての助けに感謝します
c - extern struct を使用する場合の XC8 での競合する宣言
.c ファイルで定義された構造体である変数があります。
他のファイルで利用できるようにするために、次の.hファイルがあります。
これは、Microchip C18 コンパイラで機能しました。XC8 コンパイラは次のエラーを返します。
c - MpLab リンク エラー: セクションを割り当てられませんでした (C30 コンパイラ)
2 つのコードをまとめました (元々はThis Question Here で説明されていました)。
MpLab (Microchip MPLAB C30) からこのエラーが発生しました。
奇妙なことに、コンパイラのマニュアル (マイクロチップ社の出版物 DS51284F) でそのメッセージを探しましたが、そのメッセージの部分文字列であっても、何も見つかりませんでした。
1 語のallocateを探しても、3 回か 4 回しか見つかりませんでした。エラー メッセージが表示されることはありませんでした。
これら 2 つのコードをまとめる前に、Thing-XからThing-Yにデータを移動するために使用するメモリの「大きなチャンク」に使用するセグメントを 0x8000 に定義しました。
0x8000 で定義したデータ領域を 1 バイトに縮小しましたが、まだこのエラーが発生しています。
このメッセージは、Microchip のコンパイラ マニュアル DS51284F に記載されていません。これまでに誰かがこれを解決したことがありますか?
リンカーの別のマニュアルはありますか?
メモリマップを取得してメモリ領域がどこにあるかを確認する方法はありますか?
accelerometer - 複数のレジスタ/デバイスの i2c
i2c を使用して、PIC マイクロコントローラー (dsPIC33) からの ADXL345 加速度計からの正常な読み取りの実装を完了しました。これまでに達成したのは、デバイス ID (1 バイト) を正しく読み取ることだけです。
以前に ADXL345 を使用したことがある人なら、X、Y、または Z のいずれかの軸からデータを読み取るために、たとえば「DATAX0」と「DATAX1」の 2 バイトに分割されることを知っているでしょう。データシートには、「データの一貫性を確保するために、ADXL345 からデータを取得するためにマルチバイト読み取りを使用することをお勧めします」と具体的に記載されているため、軸ごとに 2 バイトをまとめて収集する必要があります。
私の質問は、i2c を使用して、軸ごとに 2 バイトが 2 つの異なるレジスタで表されている場合、どうすればよいですか?
上の画像は、i2c 伝送に必要なプロセスを示しています。加速度計から読み取るために、下の 2 つのグラフを見ており、上に貼り付けたデータシートの引用は、下のグラフ (複数バイト) を使用したことを示唆していますが、前述のように、2 つのバイトには 2 つの異なるレジスタがあります値 (DATAX0 と DATAX1 にそれぞれ 0x32 と 0x33)。
1 回のグラブで 1 つの軸からデータを取得するにはどうすればよいですか? これを行う唯一の方法は、1 つのレジスタ アドレスを使用して 1 バイトを読み取り、次に 2 番目のレジスタ アドレスを使用して再度読み取り、2 つを連結して 1 つの軸データを取得することです。
この質問は、同じ i2c バス上のさまざまなデバイスからデータを収集する場合にも当てはまります。これらのデバイスも異なるレジスタを持ちます。
乾杯!
c - これらのレジスタのような構造体のすべてのフィールドに対処する方法は?
マイクロコントローラをプログラムしたことがある場合は、特定のレジスタの選択ビットを操作したり、全体にバイトを書き込んだりすることに慣れているでしょう。たとえば、C を使用する PIC では、1 バイト全体を PORTA に書き込んですべてのビットを設定するか、単純に PORTAbits.RA# をアドレス指定して 1 つのビットを設定することができます。これらの構造体/共用体が定義されている方法を模倣しようとしているので、プログラムの変数で同じことを行うことができます。具体的には、マイクロコントローラがオンになったときに、自分で定義したレジスタを次のようなものでリセットできるようにしたい
対
等
明らかに、前者の方がエレガントで、行スペースを大幅に節約できます。マイクロコントローラーのヘッダー ファイルは、次のようになります。
...すべてのレジスタに対して、および複数バイトのレジスタは、Registerbits に構造体の共用体を使用します。私の初期化/宣言はヘッダーではなくメイン ソース ファイルにあるため、extern を削除し、私の近くに置きました。
...しかし、コンパイル時に、InReg と InRegbits はメモリ内の 2 つの別々の場所として定義されます。つまり、InReg に書き込んで InRegbits を変更することはできません。これが機能するように変更するにはどうすればよいですか?私がコピーしようとしているのは、特別なマイクロコントローラ レジスタであるため、機能するだけですか?
助けてくれてありがとう
embedded - 現在の PC 0x0 にソース コード行が見つかりませんでした
MPLAB X IDE の使用に問題があります。メインセクションを持つ main.c があります。
デバッグしようとすると、できません。ソースコード行が見つからなかったと表示されます。ソフトウェアをコンパイルし、MPLAB IDE で問題なくデバッグしました。MPLAB X に設定が欠けているか、その他の基本的な設定があるように感じます。
役に立つかどうかはわかりませんが、参考までに、デバッグ用に PICKit2、MPLAB X IDE v1.51、PIC16F876 uC を使用しています。
main.c のメイン コード:
デバッグしようとすると、デバッガー コンソールに次のように表示されます。
java - JRuby によって呼び出されたときに Java ライブラリの動作が異なる原因は何ですか?
私は Java の世界は初めてですが、Ruby には精通しています。サードパーティの jar ファイルと対話するプログラムを作成しようとしています。
ライブラリは、Java から呼び出された場合は正常に動作するように見えますが、JRuby で呼び出すと正しく動作しません。私は本当にJRubyを使いたいので、これは問題です。たとえば、以下の 2 つのプログラムはまったく同じことをしようとしますが、異なる出力を生成します。
この Java プログラムは正しく動作します。
以下の Java プログラムを Netbeans で開発し、F6 (メイン プロジェクトの実行) を押して実行しました。プロジェクトの Libraries フォルダは、「C:\Program Files (x86)\Microchip\MPLABX\mplab_ide\lib\nblibraries.properties」に設定されています。実行すると、「pins: 17」と出力されます。
この JRuby プログラムは正しく動作しません。
以下のJRubyプログラムを入力するだけで実行したところ、jruby bug_reproduce.rb
「pins: 0」と出力されました。Java プログラムのように「pins: 17」と表示されると思います。
詳細
約 80 個のサードパーティの jar ファイルがあります。それらはMPLAB Xの一部として Microchip によって提供され、マイクロコントローラ用のシミュレータを実装します。jar ファイルは MPLAB X に付属しており、MPLAB X SDKもダウンロードして使用方法を調べました。ライブラリの文書化されていない機能を多数使用していますが、代替手段がありません。
Windows 7 64 ビット SP1 を使用しています。次のJava関連のものをインストールし、「プログラムと機能」の下にリストしました。
- Java 7 アップデート 17
- Java 7 アップデート 17 (64 ビット)
- Java SE 開発キット 7 Update 17 (64 ビット)
- Java(TM) 6 Update 22 (64 ビット)
- Java(TM) 6 アップデート 29
- Java(TM) SE 開発キット 6 Update 22 (64 ビット)
- JRuby 1.7.3
- IntelliJ IDEA コミュニティ エディション 12.0.4
- NetBeans IDE 7.3
- MPLAB X IDE v1.70
System.getProperty("java.version")
両方のプログラムが Java 1.6.0_22 で実行されていることを確認していました。MPLAB X SDK の指示に従ったので、「最良の結果を得るには、コードが通信する IDE/MDBCore をビルドしたものとまったく同じ JDK を使用してください。MPLAB X v1.70 の場合、これは JDK 6u22 です。オラクルから。」この問題が発生した後、JDK 7u17 のみをインストールしましたが、違いはありませんでした。
例で特定された特定の問題に対する回避策を見つけることができましたが、開発を続けたところ、ライブラリの動作が異なるという別の問題に遭遇しました。これは、JRuby の使い方が根本的に間違っていると思います。
異なるクラス パスがこの問題を引き起こす可能性があると考えて、Java プログラムにそのクラス パスを出力させようとし、JRuby プログラムを編集してそのリスト内のファイルを正確に要求するようにしましたが、違いはありませんでした。
質問
- Java ではなく JRuby から呼び出された場合に、JAR ファイル内のコードの動作が異なる可能性があることを知っていますか?
- JRuby 1.7.3 が使用する JDK のバージョンは何ですか?それとも、その質問は理にかなっていますか?
更新:解決済み
実際に MPLAB X を入手し、私の問題を解決してくれた D3mon-1stVFW に感謝します! 核心的な詳細に興味がある人のために: ピンは PinSet.getPin(String) でアクセスされるときに遅延ロードされるため、ピンの数は 0 でした。ペリフェラルがピンをロードするため、通常はすべてのピンがロードされますが、JRuby ではペリフェラルが検出されませんでした。これは、周辺文書が見つからなかったためです。これは、PerDocumentLocator.findDocs() が空のリストを返したためです。PerDocumentLocatorcom.microchip.mplab.open.util.pathretrieval.PathRetrieval.getPath(com.microchip.mplab.libs.MPLABDocumentLocator.MPLABDocumentLocator.class))
は間違ったものを返していたため失敗しました。
PathRetrieval.getPath 内で起こっていることと似ている次のコードを考えてみましょう (Java で書かれていることを除いて)。
D3mon-1stVFW のヒントに従って、JAR ファイルを $CLASSPATH に追加すると、そのコードは次のように戻ります。
ファイル:C:/Program Files (x86)/Microchip/MPLABX/mplab_ide/mplablibs/modules/com-mi crochip-mplab-libs-MPLABDocumentLocator.jar!/com/microchip/mplab/libs/MPLABDocum entLocator/MPLABDocumentLocator.class
ただし、クラスパスに何かを追加しないと、そのコードは奇妙なことに次のように返されます。
ファイル:C:%5CProgram%20Files%20(x86)%5CMicrochip%5CMPLABX%5Cmplab_ide%5Cmplablibs% 5Cmodules%5Ccom-microchip-mplab-libs-MPLABDocumentLocator.jar!/com/microchip/mpl ab/libs/MPLABDocumentLocator/MPLABDocumentLocator.クラス"
%5C は実際にはバックスラッシュのコードです。PathRetrieval.getPath の Microchip コードは多くの文字列操作を行い、スラッシュが %5C で表されるケースを適切に処理しません。%5Cs が表示される理由についてさらに洞察を持っている人がいれば、知りたいと思いますが、私の問題は解決しました。
結論: Java のgetResource()がスラッシュの代わりに %5C を含む URL を返す場合があり、これは CLASSPATH の内容に影響されます。安全を確保したい場合は、次のように、要求する前に jar ファイルを $CLASSPATH に追加します。