問題タブ [c18]

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 投票する
2 に答える
371 参照

memory - C18 の ORG Function アセンブリ ブロック

こんにちは、スタックオーバーフローです。

ブートローダーで pic 18f4550 を使用しています。

ブートローダーのため、メモリ内の指定されたアドレスでデコードを開始する必要があります。

この場合、中断がないため 0x1000 です。

これはこれまでの私のコードです(シンプル):

しかし!...

C:\Users\User\Documents\ProjectosPIC\testeled\main.c:13:エラー: 構文エラー

私はそれを修正する方法を知っていますか?これはコンパイラの問題ですか??

私は、mpasm およびその他の言語を備えたマイクロチップ C18 ツールスイートで mplab IDE を使用しています。

シンタックスエラーはなぜですか?

タイ

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

c - sprintf が奇妙なデータを出力している

構造体を EEPROM に読み書きする組み込みプロジェクトに取り組んでいます。sprintf を使用して、デバッグ情報を簡単に表示できるようにしています。

何らかの理由で、このコードには 2 つの問題があります。最初; sprintf は非常に奇妙な出力を出力しています。「addr++」を印刷すると、意味をなさないパターン「0、1、2、3、4、32、...」に従います。

上記の出力は次のとおりです: https://gist.github.com/3803316 about 出力は、アドレス値の %x で取得されたことに注意してください (したがって、addr は 16 進数です)。

出力で気付いたかもしれない 2 番目の問題は、i > len のときに停止しないことです。それは私が提供した出力よりもさらに続き、マイクロコントローラのウォッチドッグが再起動するまで停止しません。

編集: 関数の呼び出し

宣言:

競合状態ではないと思います。bf1 を使用する割り込みを無効にします。それでも、それが発生した場合、デバッグ文字列全体が破損し、確かに再現性が低くなります。

編集 addr の値はゼロから始まります。これは次の場所で確認できます: https://gist.github.com/3803411

編集 これが行うことになっていることは、ロケーション構造をバイトごとに EEPROM にコピーし、必要なときにそれを呼び出すことです。

閉鎖 だから、私はこの問題を決して解決しませんでした。プロジェクトは EEPROM から離れ、OS、コンパイラ、IDE を変更しました。この問題を再現する可能性は低いです。

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

c - RAM変数にROM変数へのポインタ?

Microchip C18 コンパイラを使用してプロジェクトを行っています。他のブロック (北東南西) を指すブロックと呼ばれる構造体があります。これらのブロックは私を地図にしてくれます。次に、すべてを評価するために使用するポインターがあります。

RAMを使用すると、次のようになります。

これにより、次のようなことができます。

問題は、プロジェクトで RAM が不足していて、ROM を使用する必要があることです。これまでのところ、次のとおりです。

私はいくつかのデバッグを行い、上記の部分が機能していることを確認できますが、位置ポインターを作成しようとすると、悲しみが生じます。私の質問は次のとおりです。

値を編​​集できるポインタに ROM 変数アドレスを保持するにはどうすればよいですか?

私が試すとき:

「警告 [2066] 代入で型修飾子が一致しません」というメッセージが表示されます

ROM 変数と RAM 変数は 2 つの異なるものだと認識していますが、どうすればよいかわかりません。

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

microcontroller - MPLAB で C18 を含む複数のソース ファイルを作成する方法は?

C++ などの多くの言語では、多くの異なるソース ファイルを使用するのが普通ですが、PIC マイクロコントローラー プログラムではそうではないように思われます。少なくとも、私が読んだチュートリアルや本ではそうではありません。 .

main.c ファイルで使用できる一連のルーチン、グローバル変数、および定義を含むソース (.c) ファイルを作成する方法を考えています。これは可能ですか?

アドバイスありがとうございます!

0 投票する
0 に答える
903 参照

embedded - PIC 18F87J50 USART 構成と ISR トラブル

PIC 18F87J50 を使用するプロジェクト、特に 2 つの USART チャネルとの調整で問題が発生しています。

主な問題は 2 つあります。

1.) 目標のボーレートを設定できません:

Open1USART() および Open2USART() 関数を使用して、使用している 2 つの USART チャネルを初期化しています。両方を 14,400 ボーに設定したいと思います。これらの関数は 2 つの引数を取ります。1 つ目は USART を構成するためのビット フィールドです (非同期対同期モード、8 ビット対 9 ビットなど)。2 つ目は (システム クロック レートに応じて) USART のボー レートを構成する SPBRG 値です。

私は両方を次のように呼び出しています:Open1USART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW & USART_RX_INT_ON & USART_TX_INT_OFF, 346);

私のセットアップでは、SPBRG としての 346 は 14,400 ボーを与えるようです (1 ビットの幅が約 70us であることを O スコープで確認しました)。

問題は、これが USART 2 でしか機能しないことです。USART 1 では、同じ SPBRG 値で 57,600 のボーレートが得られます。さらに、SPBRG 値をいじってみると (実際のボーレートの影響を確認するためにスコープのタイミングを調べていると)、興味深いことがわかりました。

SPBRG の値を 0 から大きくすると、ボー レートが低下します。SPBRG を 87 にすると 57,600 ボーになり、173 -> 28,800 になりますが、約 255 でリセットされます。255 では、ボー レートは約 19,000 になります。しかし、256 では、信じられないほど高いボーレート (~1,000,000) を持っています。次に、SPBRG 番号をさらに上げると、ボー レートはさらに遅くなりますが、19,000 ボー マークを下回ることはなく、必要な 14,400 まで下がることもありません。

OK、SPBRG バイトをオーバーフローしていますね。しかし、USART 1 と 2 はまったく同じように構成されており、USART 2 で SPBRG 値 > 255 を使用できます。どちらも同じ BRGH 設定 (低) と BRG16 設定 (高) を持っています。また、この投稿 ( PIC18F2680 の UART 受信で割り込みがトリガーされていない) によると、TRISC6-7 は正しく設定することが重要なビットのようです。その投稿が示唆するようにこれらを設定しました(6低、7高)。

役立つ場合は、いくつかのコード スニペットを共有できます。

2.) 受信バイトごとに ISR がトリガーしない:

USART1 と 2 の両方で UART RX 割り込みをオンにしています。正しいボー レートで USART1 に話しかけていないので、周辺機器からの応答がありません。しかし、USART2 では 14,400 ボーで話しており、周辺機器は適切に応答しています (スコープで検証済み)。スコープを使用すると、受信すると予想される 16 バイトすべてを確認でき、タイミングは回線上で良好に見えます。ただし、このポートの RX 割り込みは、最初の 2 または 3 バイトに対してのみトリガーされます。周辺機器が何を応答しているかを知るには、8 バイトを連続して受信する必要があります... しかし、2 バイトまたは 3 バイトを超えることはありません。

したがって、割り込みはトリガーされますが、すべてのバイトではありません。

次の着信バイトの割り込みを見逃さないように、ISR をかなり短くしておく必要があることはわかっていますが、ISR をそのコア機能 (デバッグ出力の削除など) だけに分解しても、まだ表示されているだけです。最初の 3 バイト。スコープ上では、最初の 3 バイトと残りのバイトの間に違いはありません (少なくともビット タイミングでは)。最初の 3 バイトの値は、常に 0xFF です (これは予期されることです)。残りのバイトは異なる値ですが、それが私が見ることができる唯一の違いであり、ISR トリガーがない理由を実際には説明していません。上記の他の質問へのリンクは、確か​​にこの問題にも関連しているようです。しかし、ISR は常にトリガーしているわけではありません。

あなたが提供できる助けや洞察は大歓迎です。クライアントに再確認して、コードスニペットをさらに追加できるようにします.

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

c - ROM 文字列が正しく渡されないのはなぜですか?

関数に文字列を渡そうとしています。C18 の RAM/ROM 文字列について多くのことを読みましたが、私のコードは問題ないように見えますが、機能していません。私の機能は次のようなものです:

そして、私はこの方法でそれを使用します:

Proteus では、文字 'B' のみが渡されていることがわかります。ROM 文字列を RAM にコピーすると、単に混乱します (添付の図を参照)。printf() の出力は ATNAME のみで、文字列は出力されません。

私は C18 v4.40 と MPLABX v1.41 を使用しています。ご助力ありがとうございます。

ここに画像の説明を入力

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

c - PIC のビットバン シリアルが C のネストされたループで動作しなくなる

Stackoverflow、あなたは以前私を助けてくれました。またあなたの助けが必要だと思います。PIC18F2550 で GPIO を使用して自分のシリアル出力をビットバンしようとしています。これはいくつかのシフト レジスタ (3x74LS595) に接続され、最後のシフト レジスタは標準の HD44780 LCD に接続されます。これまでのところ、クロッキングとラッチは正しく機能しており、長い戦いの後、データも正しく吐き出されています (バレルシフトがうまくいかず、範囲外のデータを喜んで吐き出しますが、余談)。

私の問題は、LCD を使用するには、イネーブル ピンをデータ クロックとしてトグルする必要があることです。そのため、コードを保存するために、2 回実行してイネーブル フラグをトグルする別のループを単純にネストし、それ以外の場合は同じバイトを吐き出します。これにより、理論的には吐き出されるバイト数が 12 から 24 の 2 倍になるはずです。何らかの理由で、このループが追加されると機能しません。2バイトを吐き出して終了します。それがなければ、12 バイトすべてを正常に吐き出します (ただし、有効化が存在しないため、LCD は適切にセットアップされません)。

ネストされた有効化ループなしで動作している画像を次に示します。

担当者がいないためリンクされました

D0 はデータで、その下の D1/2 はそれぞれクロック/ロードです。

そして、ここに for ループがあります:

担当者がいないためリンクされました

左端のエッジは、ラインの初期リセットです。意味のあるコードがすべて完了したことを示す小さなブザーが鳴るので、これらの 2 バイトの後に完了したことがわかります。

コードダンプは次のとおりです。

上記のコードでは、トグルを無効にして、すべてのバイトが吐き出されるかどうかを確認しました。ないと思います。私はこれをすべてアセンブリで行うことを真剣に考えています。なぜなら、C では一見単純なもので多くの問題を抱えていたからです。このことの背景で何が起こっているのか、私にはコントロールできないように感じます。私は Pickit 3 を使用していますが、実際に何が起こっているのかをよく知りたい場合は、ICD2 を掘り下げる必要があるかもしれません。

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

c - C18: コンパイラは、関数呼び出しが返されないことを「認識」しますか?

C18 を搭載した PIC18 で 16 ステートの FSM を構築しています。私は、各状態を、他の状態にジャンプしてジャンプする独自の機能として持つことを検討しています。プログラムがどこに行くべきかを判断するために、各状態の最後に「state##();」の分岐ケースを書きたいと思いますが、コンパイラーがこれを期待する可能性が高いため、これはすぐに死ぬと思います永遠に分岐するのではなく、戻ること。私のマイクロコントローラーのスタックはすぐにいっぱいになり、最終的にはオーバーフローします。

C18 は、私の関数呼び出しが返されず、命令を CALL/BRANCH ではなく GOTO/JMP に置き換えることを知っているほど賢いですか? GOTO が C に存在することは知っていますが (読みやすさの理由から、通常は強くお勧めしません)、ここよりも GOTO を使用する適切な理由は思いつきません。_asm _endasm ブロックを使用して強制的に goto できることは承知していますが、必要がない場合は問題を回避できます。関数に行って戻ってこないようにするには、C でどのように言うのが最善でしょうか?

当然、すべての助けに感謝します

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

c - C18: 呼び出された関数はスキップされます

C18 コンパイラの使用に関する専門家が、私が間違っている点を指摘してくれれば、非常にありがたいです。慣れるために、単純な温度計プロジェクトを開始しました:- NTC サーミスタ --> 18F2520 --> HD44780。

チェーンをデバッグし、AN0 入力電圧を中間範囲 2.5V = 10000 オームに変換するコードを生成した後、TºC を LCD に表示するために必要なルーチンを含め、すべてがうまくいきました。

上記は基本的なものでしたが、TºC の新しい LCD 表示を毎秒生成するのにうまく機能しています。

次のステップは、もう少し洗練されることでした。

tcalc 関数の最初に、範囲外テストを入れました。私が最初に決めたように、アプリケーションは水温を測定するつもりでした. 次に、28000 より大きい Rntc は氷になります (上記の範囲外) 有効な値の反対側では、<1900 はほとんど蒸気になっています。エラー メッセージを表示するために呼び出していたルーチンが無視されていました。

Rntc を温度 TºC に変更する tcalc コードを次に示します。

呼び出されるルーチン「Rntc_out」は次のとおりです。

基本的に私の質問は、範囲外のRntcをテストするときです。コードが存在しないかのようにスキップされます。

PS Rntc モジュールのコードを Label として配置し、コードに移動すると、はい、範囲外のテストは無視されず、条件を処理できます。

もちろん、'goto' 策略には少し問題があります。範囲外の読み取り値は、数秒後にサーミスタを再度読み取る必要があることを意味します。tcalc への別の goto を意味します。自分自身を呼び出すことを意味します。C18はこれが気に入らないようです。

誰かが私のコードのエラーを少なくとも一般的に指摘してくれたら、とてもうれしいです。

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

microcontroller - Microchip 社の C18 でより大きなスタック サイズを使用するにはどうすればよいですか?

わかりました、私は長い間この問題を自分で解決しようとしてきましたが、単にあきらめました。もう我慢できなくなり、助けが必要になるまで、すべてのウェブを検索しました。

「C18 Compiler User's Guide」全体を読みましたが、C18 は 256 バイトを超えるサイズのスタックの使用をサポートしていると書かれています。しかし、彼らが要求したことはすべて実行し、リンカー スクリプトを変更し、マルチバンク スタック モデル コンパイラ オプション (-ls) を使用しましたが、スタックの最初のバンクがいっぱいになった後も、変数へのアクセスに問題があります。

関数を単純に再帰的に呼び出す単純なコードをデバッグしました。この関数には 5 つの float パラメーターと 5 つの float ローカル変数があり、各呼び出しでスタック内の約 42 バイトを使用します (パラメーター用に 5*4 + ローカル変数用に 5*4 + 古い SFR2 値を保存するための 2 バイト)。6 回目の呼び出しの後、スタック値は上書きされます。

Web を検索しているときに、大きな配列 (256 バイトを超える) を作成して使用する方法について具体的な指示を出している人がたくさんいるのを見つけました。手順の 1 つは、ポインターを使用して配列の要素にアクセスすることを推奨しています。私の問題は、この「ポインターを使用して異なるバンクの変数にアクセスする」に関連しているように感じますが、関数呼び出しでローカル変数をすべてポインターに変更する方法がわかりません。意味がありません。

正直に言うと、私は本当にばかげたことをしているだけだと思います (この問題について話し合っている人が誰もいなかったので)。私が見つけたスタックサイズの増加に関連するすべてのトピックは、静的変数の使用を提案しただけです。私はこの方法で問題を解決しましたが、C18 がより大きなスタックサイズをサポートする方法を知りたいです。

以下は、この問題を理解するために使用したテスト コードです。デバッグ中に、FSR1 レジスタが正しく更新され、次の関数パラメーターと変数を配置する必要がある次のバンクの次のアドレスを指すようになっていることに気付きました。しかし、ローカル変数が書き込まれると、それらはスタックの一番上に移動します (デバッグ モードで MPLABX IDE によって変数に指定されたアドレスであっても、アドレスの下位バイトのみがデータをスタックに移動すると見なされます。正しい)。このため、問題は、コンパイラが生成したコードがスタックを使用するために 16 ビット アドレスを使用していないことだと確信しています。それでも、私はそれを解決する方法がわかりません。

このトピックに関する議論は大歓迎です:)ありがとう!